diff --git a/i18n/default_de.json b/i18n/default_de.json index 391624d..b358daf 100644 --- a/i18n/default_de.json +++ b/i18n/default_de.json @@ -977,6 +977,11 @@ "All API tokens will be revoked immediately.": "Alle API-Tokens werden sofort widerrufen.", "API token default lifetime is invalid": "Standardlaufzeit für API-Tokens ist ungültig", "API token max lifetime is invalid": "Maximale Laufzeit für API-Tokens ist ungültig", + "nav.logs.mail": "E-Mail", + "nav.audit.api": "API", + "nav.audit.system": "System", + "nav.audit.imports": "Importe", + "nav.audit.user_lifecycle": "Benutzer-Lifecycle", "API audit": "API-Protokolle", "API audit logs": "API-Protokolle", "Request ID": "Request-ID", diff --git a/i18n/default_en.json b/i18n/default_en.json index 732ddd5..2881ffd 100644 --- a/i18n/default_en.json +++ b/i18n/default_en.json @@ -977,6 +977,11 @@ "All API tokens will be revoked immediately.": "All API tokens will be revoked immediately.", "API token default lifetime is invalid": "API token default lifetime is invalid", "API token max lifetime is invalid": "API token max lifetime is invalid", + "nav.logs.mail": "E-mail", + "nav.audit.api": "API", + "nav.audit.system": "System", + "nav.audit.imports": "Imports", + "nav.audit.user_lifecycle": "User lifecycle", "API audit": "API logs", "API audit logs": "API logs", "Request ID": "Request ID", diff --git a/modules/audit/module.php b/modules/audit/module.php index d852116..61d9fa6 100644 --- a/modules/audit/module.php +++ b/modules/audit/module.php @@ -50,7 +50,7 @@ return [ [ 'key' => 'audit-api-audit', 'group' => 'admin-logs', - 'label' => 'API audit', + 'label' => 'nav.audit.api', 'path' => 'audit/api-audit', 'permission' => 'audit.api.view', 'order' => 200, @@ -58,7 +58,7 @@ return [ [ 'key' => 'audit-system-audit', 'group' => 'admin-logs', - 'label' => 'System audit logs', + 'label' => 'nav.audit.system', 'path' => 'audit/system-audit', 'permission' => 'audit.system.view', 'order' => 210, @@ -66,7 +66,7 @@ return [ [ 'key' => 'audit-import-audit', 'group' => 'admin-logs', - 'label' => 'Import logs', + 'label' => 'nav.audit.imports', 'path' => 'audit/import-audit', 'permission' => 'audit.imports.view', 'order' => 220, @@ -74,7 +74,7 @@ return [ [ 'key' => 'audit-user-lifecycle-audit', 'group' => 'admin-logs', - 'label' => 'User lifecycle logs', + 'label' => 'nav.audit.user_lifecycle', 'path' => 'audit/user-lifecycle-audit', 'permission' => 'audit.user_lifecycle.view', 'order' => 230, diff --git a/web/css/layout/app-shell.css b/web/css/layout/app-shell.css index 56ecdfb..76c36b5 100644 --- a/web/css/layout/app-shell.css +++ b/web/css/layout/app-shell.css @@ -2141,10 +2141,11 @@ } details summary { - line-height: var(--leading-none); + line-height: var(--leading-tight); list-style-type: none; cursor: pointer; transition: color var(--app-transition); + vertical-align: middle; } details summary:not([role]) { diff --git a/web/css/layout/app-sidebar.css b/web/css/layout/app-sidebar.css index 5bc5e97..5bfa0d5 100644 --- a/web/css/layout/app-sidebar.css +++ b/web/css/layout/app-sidebar.css @@ -37,10 +37,42 @@ } .app-sidebar-group.app-sidebar-admin-group details summary i { - font-size: 10px; /* icon-font metric — intentional px */ + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 10px; + width: 1.45rem; + height: 1.45rem; + border-radius: 6px; + background: color-mix( + in srgb, + var(--app-nav-icon-color, var(--app-primary)) 15%, + transparent + ); + color: var(--app-nav-icon-color, var(--app-primary)); + margin-right: 0.1rem; position: relative; - top: -2px; - margin-right: 3px; + top: -1px; + } + + /* Per-group icon colors */ + .app-sidebar-admin-group [data-details-key="admin-organization"] { + --app-nav-icon-color: #2563eb; + } + .app-sidebar-admin-group [data-details-key="admin-roles-permissions"] { + --app-nav-icon-color: #7c3aed; + } + .app-sidebar-admin-group [data-details-key="admin-automation"] { + --app-nav-icon-color: #0891b2; + } + .app-sidebar-admin-group [data-details-key="admin-monitoring"] { + --app-nav-icon-color: #059669; + } + .app-sidebar-admin-group [data-details-key="admin-logs"] { + --app-nav-icon-color: #d97706; + } + .app-sidebar-admin-group [data-details-key="admin-system"] { + --app-nav-icon-color: #6b7280; } aside.app-sidebar li:has(> .app-empty-state) { @@ -191,9 +223,9 @@ .app-sidebar a:hover, .app-sidebar a.active, .app-sidebar .active > a { - color: var(--app-primary); + color: var(--app-nav-icon-color, var(--app-primary)); background: var(--app-sidebar-hover-bg); - border-left: var(--app-sidebar-border-width) solid var(--app-primary); + border-left: var(--app-sidebar-border-width) solid var(--app-nav-icon-color, var(--app-primary)); } aside.app-sidebar ul, @@ -230,10 +262,7 @@ margin: 0; } - .app-sidebar - .app-sidebar-group - details[open] - > summary:not([role]) { + .app-sidebar .app-sidebar-group details[open] > summary:not([role]) { margin-bottom: 7px; } @@ -256,6 +285,10 @@ max-width: var(--app-sidebar-summary-max-width); overflow: hidden; white-space: nowrap; + font-size: var(--text-base); + font-weight: var(--font-normal); + position: relative; + top: 2px; } .app-sidebar #aside-panel-admin > ul { @@ -265,10 +298,13 @@ } .app-sidebar #aside-panel-admin .app-sidebar-admin-group { - margin-bottom: 10px; width: 100%; } + .app-sidebar #aside-panel-admin .app-sidebar-admin-group:last-child { + margin-bottom: 0; + } + .app-sidebar #aside-panel-admin .app-sidebar-admin-group