From c37759585cf06461c47d20a43b877dac539e4adf Mon Sep 17 00:00:00 2001 From: smail Date: Sat, 5 Sep 2026 21:28:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BE=E7=BD=AE=E4=B8=80?= =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E8=8F=9C=E5=8D=95=E5=B1=82=E6=AC=A1=E5=B9=B6?= =?UTF-8?q?=E5=9C=A8=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=89=8D=E5=BB=BA=E7=AB=8B=E6=A3=80=E6=9F=A5=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigSettings/ConfigSettings.css | 48 +----- .../ConfigSettings/ConfigSettings.vue | 21 +-- .../components/HomeHeader/HomeHeader.css | 162 ++++++++++++++++-- .../views/components/HomeHeader/HomeHeader.js | 20 ++- .../components/HomeHeader/HomeHeader.vue | 53 +++++- .../PluginSettings/PluginSettings.css | 37 +++- .../SecuritySettings/SecuritySettings.css | 48 +----- .../SecuritySettings/SecuritySettings.vue | 20 +-- .../SettingsSubmenu/SettingsSubmenu.css | 120 +++++++++++++ .../SettingsSubmenu/SettingsSubmenu.js | 16 ++ .../SettingsSubmenu/SettingsSubmenu.vue | 31 ++++ test/frontend/settings-menu.test.mjs | 106 ++++++++++++ 12 files changed, 539 insertions(+), 143 deletions(-) create mode 100644 frontend/src/views/components/SettingsSubmenu/SettingsSubmenu.css create mode 100644 frontend/src/views/components/SettingsSubmenu/SettingsSubmenu.js create mode 100644 frontend/src/views/components/SettingsSubmenu/SettingsSubmenu.vue create mode 100644 test/frontend/settings-menu.test.mjs diff --git a/frontend/src/views/components/ConfigSettings/ConfigSettings.css b/frontend/src/views/components/ConfigSettings/ConfigSettings.css index 1de0dba..42b4cba 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigSettings.css +++ b/frontend/src/views/components/ConfigSettings/ConfigSettings.css @@ -100,43 +100,11 @@ } .config-workspace { display: grid; - grid-template-columns: minmax(0, 1fr) 176px; + grid-template-columns: minmax(0, 1fr) 152px; grid-template-areas: "main submenu"; align-items: start; gap: 20px; } -.config-submenu { - grid-area: submenu; - position: sticky; - top: 0; - display: grid; - gap: 6px; - align-self: start; - padding: 8px; - border: 1px solid var(--pm-border-color); - border-radius: var(--pm-radius-lg); - background: var(--pm-bg-secondary); -} -.config-submenu-item { - width: 100%; - padding: 12px 14px; - color: var(--pm-text-secondary); - text-align: left; - font: inherit; - border: 0; - border-radius: var(--pm-radius-sm); - background: transparent; - cursor: pointer; - transition: color .2s ease, background-color .2s ease; -} -.config-submenu-item:hover, -.config-submenu-item.active { - color: var(--pm-primary-color); - background: var(--el-color-primary-light-9); -} -.config-submenu-item.active { - font-weight: 600; -} .config-main { grid-area: main; display: grid; @@ -293,7 +261,7 @@ .audit-item time { flex: none; } -@media (max-width: 640px) { +@container settings-content (max-width: 560px) { .status-panel, .editor-panel, .rollback-panel, @@ -320,18 +288,6 @@ "main"; gap: 16px; } - .config-submenu { - position: static; - display: flex; - gap: 6px; - overflow-x: auto; - padding: 6px; - } - .config-submenu-item { - flex: 0 0 auto; - width: auto; - white-space: nowrap; - } .selected-section-label { white-space: normal; } diff --git a/frontend/src/views/components/ConfigSettings/ConfigSettings.vue b/frontend/src/views/components/ConfigSettings/ConfigSettings.vue index 3c531b3..c0abf37 100644 --- a/frontend/src/views/components/ConfigSettings/ConfigSettings.vue +++ b/frontend/src/views/components/ConfigSettings/ConfigSettings.vue @@ -20,19 +20,13 @@
- +
@@ -285,6 +279,7 @@ diff --git a/frontend/src/views/components/PluginSettings/PluginSettings.css b/frontend/src/views/components/PluginSettings/PluginSettings.css index e040aca..5b5a068 100644 --- a/frontend/src/views/components/PluginSettings/PluginSettings.css +++ b/frontend/src/views/components/PluginSettings/PluginSettings.css @@ -29,14 +29,45 @@ overflow: hidden; } -.custom-tabs :deep(.el-tabs__header) { +.custom-tabs > :deep(.el-tabs__header) { margin-bottom: 0; background: var(--pm-bg-primary); - padding: 0 16px; + padding: 8px 12px; border-bottom: 1px solid var(--pm-border-color); } -.custom-tabs :deep(.el-tabs__content) { +.custom-tabs > :deep(.el-tabs__header .el-tabs__nav-wrap::after), +.custom-tabs > :deep(.el-tabs__header .el-tabs__active-bar) { + display: none; +} + +.custom-tabs > :deep(.el-tabs__header .el-tabs__item) { + height: 38px; + margin-right: 6px; + padding: 0 14px !important; + border-radius: 8px; + color: var(--pm-text-secondary); + font-size: 13px; +} + +.custom-tabs > :deep(.el-tabs__header .el-tabs__item:hover:not(.is-active)) { + color: var(--pm-text-primary); + background: var(--pm-bg-hover); +} + +.custom-tabs > :deep(.el-tabs__header .el-tabs__item.is-active) { + color: var(--settings-accent, var(--pm-primary-color)); + background: color-mix(in srgb, var(--pm-primary-color) 10%, var(--pm-bg-secondary)); + font-weight: 600; + box-shadow: inset 0 -2px var(--settings-accent, var(--pm-primary-color)); +} + +.custom-tabs > :deep(.el-tabs__header .el-tabs__item:focus-visible) { + outline: 2px solid var(--settings-accent, var(--pm-primary-color)); + outline-offset: -2px; +} + +.custom-tabs > :deep(.el-tabs__content) { height: 100%; } diff --git a/frontend/src/views/components/SecuritySettings/SecuritySettings.css b/frontend/src/views/components/SecuritySettings/SecuritySettings.css index af573c7..0b7d13a 100644 --- a/frontend/src/views/components/SecuritySettings/SecuritySettings.css +++ b/frontend/src/views/components/SecuritySettings/SecuritySettings.css @@ -1,44 +1,18 @@ .settings-card { padding: 0; } .security-workspace { display: grid; - grid-template-columns: minmax(0, 1fr) 176px; + grid-template-columns: minmax(0, 1fr) 152px; grid-template-areas: "main submenu"; align-items: start; gap: 20px; } -.security-submenu { - grid-area: submenu; - position: sticky; - top: 0; - display: grid; - gap: 6px; - padding: 8px; - border: 1px solid var(--pm-border-color); - border-radius: var(--pm-radius-lg); - background: var(--pm-bg-secondary); -} -.security-submenu-item { - width: 100%; - padding: 12px 14px; - color: var(--pm-text-secondary); - text-align: left; - font: inherit; - border: 0; - border-radius: var(--pm-radius-sm); - background: transparent; - cursor: pointer; - transition: color .2s ease, background-color .2s ease; -} -.security-submenu-item:hover, -.security-submenu-item.active { - color: var(--pm-primary-color); - background: var(--el-color-primary-light-9); -} -.security-submenu-item.active { font-weight: 600; } .security-main { grid-area: main; min-width: 0; } +.security-main > .settings-divider:first-child { + display: none; +} .settings-header { margin-bottom: 24px; } .settings-header h3 { font-size: 18px; font-weight: 600; color: var(--pm-text-primary); margin: 0 0 8px; } .settings-desc { font-size: 14px; color: var(--pm-text-secondary); margin: 0; } @@ -59,7 +33,7 @@ .credential-info span { color: var(--pm-text-secondary); font-size: 13px; } .credential-warning { width: 100%; color: #b45309 !important; font-size: 13px; } .credential-actions { display: flex; flex: none; gap: 8px; } -@media (max-width: 640px) { +@container settings-content (max-width: 560px) { .security-workspace { grid-template-columns: minmax(0, 1fr); grid-template-areas: @@ -67,18 +41,6 @@ "main"; gap: 16px; } - .security-submenu { - position: static; - display: flex; - gap: 6px; - overflow-x: auto; - padding: 6px; - } - .security-submenu-item { - flex: 0 0 auto; - width: auto; - white-space: nowrap; - } .security-key-header, .credential-item { flex-direction: column; align-items: stretch; } .credential-actions { width: 100%; } .credential-actions .el-button { flex: 1; } diff --git a/frontend/src/views/components/SecuritySettings/SecuritySettings.vue b/frontend/src/views/components/SecuritySettings/SecuritySettings.vue index 4e7cff2..4f5029d 100644 --- a/frontend/src/views/components/SecuritySettings/SecuritySettings.vue +++ b/frontend/src/views/components/SecuritySettings/SecuritySettings.vue @@ -1,19 +1,12 @@