From eb2205458031f6e0633cf88dd1b7941b378525b1 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Thu, 21 May 2026 21:14:07 +0800 Subject: [PATCH] fix: add --surface-subtle token, restore info grouping, and apply theme-aware favorite color - Add --surface-subtle (oklch 3% opacity) to replace rgba(0,0,0,0.03) - Fix info items, creator-info, civitai-view, modal-send-btn, header-actions to use --surface-subtle instead of --surface-hover - Keep true hover states on --surface-hover - Use light #d4a017 / dark #ffc107 for --favorite-color based on theme - Replace hardcoded #ffc107 and #d4a017 with var(--favorite-color) --- static/css/base.css | 15 +++++ static/css/components/card.css | 22 ++++--- static/css/components/header.css | 23 +++++-- static/css/components/loading.css | 10 +-- .../css/components/lora-modal/lora-modal.css | 36 +++++------ static/css/components/lora-modal/showcase.css | 8 +-- static/css/components/lora-modal/tag.css | 8 +-- .../components/lora-modal/triggerwords.css | 6 +- static/css/components/lora-modal/versions.css | 2 +- static/css/components/menu.css | 4 +- static/css/components/modal/_base.css | 63 ++++++++++++------- static/css/components/modal/doctor-modal.css | 7 +-- static/css/components/modal/help-modal.css | 2 +- .../css/components/modal/settings-modal.css | 4 +- static/css/components/modal/support-modal.css | 2 +- static/css/components/modal/update-modal.css | 6 +- static/css/components/progress-panel.css | 14 ++++- static/css/components/recipe-modal.css | 18 +++--- static/css/components/search-filter.css | 4 +- .../css/components/shared/edit-metadata.css | 4 +- static/css/components/sidebar.css | 12 +++- static/css/components/toast.css | 25 ++++---- static/css/layout.css | 9 ++- static/css/style.css | 2 +- static/css/tokens/colors.css | 6 +- 25 files changed, 191 insertions(+), 121 deletions(-) diff --git a/static/css/base.css b/static/css/base.css index 79e21536..3656b7fd 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -124,6 +124,17 @@ body { display: none !important; } +:focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; +} + +button:focus:not(:focus-visible), +input:focus:not(:focus-visible), +select:focus:not(:focus-visible) { + outline: none; +} + @media (prefers-reduced-motion: reduce) { *, *::before, @@ -132,4 +143,8 @@ body { animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } + + html { + scroll-behavior: auto !important; + } } diff --git a/static/css/components/card.css b/static/css/components/card.css index 99a7ef76..b6301cc6 100644 --- a/static/css/components/card.css +++ b/static/css/components/card.css @@ -1,12 +1,12 @@ -/* 卡片网格布局 */ +/* Card grid layout */ .card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); /* Base size */ gap: 12px; /* Consistent gap for both row and column spacing */ row-gap: 20px; /* Increase vertical spacing between rows */ margin-top: var(--space-2); - padding-top: 4px; /* 添加顶部内边距,为悬停动画提供空间 */ - padding-bottom: 4px; /* 添加底部内边距,为悬停动画提供空间 */ + padding-top: 4px; + padding-bottom: 4px; width: 100%; /* Ensure it takes full width of container */ max-width: 1400px; /* Base container width */ margin-left: auto; @@ -360,15 +360,19 @@ align-self: flex-end; } -.card-actions i:hover { +.card-actions i:hover, +.card-actions i:focus-visible { opacity: 0.9; transform: scale(1.1); background-color: rgba(255, 255, 255, 0.1); + outline: 2px solid var(--lora-accent); + outline-offset: 2px; + border-radius: var(--border-radius-xs); } .favorite-active { - color: #d4a017 !important; - text-shadow: 0 0 5px rgba(212, 160, 23, 0.5); + color: var(--favorite-color) !important; + text-shadow: 0 0 5px var(--favorite-glow); } @media (max-width: 1200px) { @@ -404,9 +408,13 @@ text-shadow: none; } -.model-link a:hover { +.model-link a:hover, +.model-link a:focus-visible { opacity: 0.8; text-decoration: none; + outline: 2px solid var(--lora-accent); + outline-offset: 2px; + border-radius: var(--border-radius-xs); } /* Updated model name to fix text cutoff issues */ diff --git a/static/css/components/header.css b/static/css/components/header.css index b0b60378..3d9d503d 100644 --- a/static/css/components/header.css +++ b/static/css/components/header.css @@ -191,9 +191,11 @@ } .header-search .search-options-toggle:hover, -.header-search .search-filter-toggle:hover { - background: var(--lora-surface-hover, oklch(95% 0.02 256)); - color: var(--lora-accent); +.header-search .search-filter-toggle:hover, +.header-search .search-filter-toggle:focus-visible { + background: var(--lora-surface-hover, oklch(95% 0.02 256)); + color: var(--lora-accent); + outline: none; } .header-search .filter-badge { @@ -366,9 +368,18 @@ flex-shrink: 0; } -.hamburger-menu-btn:hover { - background: var(--lora-accent); - color: white; +.hamburger-menu-btn:hover, +.hamburger-menu-btn:focus-visible { + background: var(--lora-surface-hover, oklch(95% 0.02 256)); + color: var(--lora-accent); + outline: none; +} + +.hamburger-dropdown .dropdown-item:hover, +.hamburger-dropdown .dropdown-item:focus-visible { + background: var(--lora-surface-hover, oklch(95% 0.02 256)); + color: var(--lora-accent); + outline: none; } /* Hamburger dropdown menu */ diff --git a/static/css/components/loading.css b/static/css/components/loading.css index 5c898ec5..9e23bad7 100644 --- a/static/css/components/loading.css +++ b/static/css/components/loading.css @@ -18,7 +18,7 @@ border-radius: var(--border-radius-base); text-align: center; border: 1px solid var(--lora-border); - width: min(400px, 90vw); /* 固定最大宽度,但保持响应式 */ + width: min(400px, 90vw); } .loading-spinner { @@ -33,7 +33,7 @@ .loading-status { margin-bottom: 1rem; - color: var(--text-color); /* 使用主题文本颜色 */ + color: var(--text-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -42,11 +42,11 @@ } .progress-container { - width: 280px; /* 固定进度条宽度 */ - background-color: var(--lora-border); /* 使用主题边框颜色 */ + width: 280px; + background-color: var(--lora-border); border-radius: 4px; overflow: hidden; - margin: 0 auto; /* 居中显示 */ + margin: 0 auto; } .progress-bar { diff --git a/static/css/components/lora-modal/lora-modal.css b/static/css/components/lora-modal/lora-modal.css index b5e85cd1..60ff513f 100644 --- a/static/css/components/lora-modal/lora-modal.css +++ b/static/css/components/lora-modal/lora-modal.css @@ -105,14 +105,14 @@ .info-item { padding: var(--space-2); - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); } -/* 调整深色主题下的样式 */ +/* Dark theme info item styles */ [data-theme="dark"] .info-item { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } @@ -271,13 +271,13 @@ } } -/* 修改 back-to-top 按钮样式,使其固定在 modal 内部 */ +/* Back-to-top button pinned inside modal */ .modal-content .back-to-top { - position: sticky; /* 改用 sticky 定位 */ - float: right; /* 使用 float 确保按钮在右侧 */ - bottom: 20px; /* 距离底部的距离 */ - margin-right: 20px; /* 右侧间距 */ - margin-top: -56px; /* 负边距确保不占用额外空间 */ + position: sticky; + float: right; + bottom: 20px; + margin-right: 20px; + margin-top: -56px; width: 36px; height: 36px; border-radius: 50%; @@ -334,7 +334,7 @@ outline: none; } -/* 合并编辑按钮样式 */ +/* Consolidated edit button styles */ .edit-model-name-btn, .edit-file-name-btn, .edit-base-model-btn, @@ -369,7 +369,7 @@ .edit-base-model-btn:hover, .edit-model-description-btn:hover, .edit-version-name-btn:hover { - opacity: 0.8 !important; + opacity: 0.8; background: rgba(0, 0, 0, 0.05); } @@ -387,7 +387,7 @@ } .base-wrapper { - flex: 2; /* 分配更多空间给base model */ + flex: 2; /* Allocate more space to base model */ } /* Base model display and editing styles */ @@ -447,7 +447,7 @@ margin: 0; padding: var(--space-1); border-radius: var(--border-radius-xs); - font-size: 1.5em !important; + font-size: 1.5em; font-weight: 600; line-height: 1.2; color: var(--text-color); @@ -888,7 +888,7 @@ align-items: center; gap: 10px; padding: 2px 10px; - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); max-width: fit-content; @@ -899,7 +899,7 @@ [data-theme="dark"] .creator-info, [data-theme="dark"] .civitai-view, [data-theme="dark"] .modal-send-btn { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } @@ -958,7 +958,7 @@ align-items: center; gap: 6px; padding: 6px 12px; - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); color: var(--text-color); @@ -981,7 +981,7 @@ align-items: center; gap: 6px; padding: 6px 12px; - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); color: var(--text-color); @@ -992,7 +992,7 @@ } [data-theme="dark"] .modal-send-btn { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } diff --git a/static/css/components/lora-modal/showcase.css b/static/css/components/lora-modal/showcase.css index d540e5ae..7d199d0f 100644 --- a/static/css/components/lora-modal/showcase.css +++ b/static/css/components/lora-modal/showcase.css @@ -455,9 +455,9 @@ } .import-formats { - font-size: 0.8em !important; - opacity: 0.6 !important; - margin-top: var(--space-2) !important; + font-size: 0.8em; + opacity: 0.6; + margin-top: var(--space-2); } .select-files-btn { @@ -481,7 +481,7 @@ /* For dark theme */ [data-theme="dark"] .import-container { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); } /* Setup Guidance State - When example images path is not configured */ diff --git a/static/css/components/lora-modal/tag.css b/static/css/components/lora-modal/tag.css index 3794552d..1bae00bc 100644 --- a/static/css/components/lora-modal/tag.css +++ b/static/css/components/lora-modal/tag.css @@ -21,7 +21,7 @@ .model-tag-compact { /* Updated styles to match info-item appearance */ - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-xs); padding: 2px 8px; @@ -45,7 +45,7 @@ /* Adjust dark theme tag styles */ [data-theme="dark"] .model-tag-compact { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } @@ -101,7 +101,7 @@ .tooltip-tag { /* Updated styles to match info-item appearance */ - background: rgba(0, 0, 0, 0.03); + background: var(--surface-hover); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-xs); padding: 3px 8px; @@ -111,7 +111,7 @@ /* Adjust dark theme tooltip tag styles */ [data-theme="dark"] .tooltip-tag { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-hover); border: 1px solid var(--lora-border); } diff --git a/static/css/components/lora-modal/triggerwords.css b/static/css/components/lora-modal/triggerwords.css index 1c695b08..f6c39878 100644 --- a/static/css/components/lora-modal/triggerwords.css +++ b/static/css/components/lora-modal/triggerwords.css @@ -1,14 +1,14 @@ /* Update Trigger Words styles */ .info-item.trigger-words { padding: var(--space-2); - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); } -/* 调整 trigger words 样式 */ +/* Trigger words styles */ [data-theme="dark"] .info-item.trigger-words { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } diff --git a/static/css/components/lora-modal/versions.css b/static/css/components/lora-modal/versions.css index 9239218d..80a0b011 100644 --- a/static/css/components/lora-modal/versions.css +++ b/static/css/components/lora-modal/versions.css @@ -186,7 +186,7 @@ height: 88px; border-radius: var(--border-radius-xs); overflow: hidden; - background: rgba(0, 0, 0, 0.03); + background: var(--surface-hover); display: flex; align-items: center; justify-content: center; diff --git a/static/css/components/menu.css b/static/css/components/menu.css index 230bd1f6..437ec79c 100644 --- a/static/css/components/menu.css +++ b/static/css/components/menu.css @@ -21,9 +21,11 @@ background: var(--lora-surface); } -.context-menu-item:hover { +.context-menu-item:hover, +.context-menu-item:focus-visible { background-color: var(--lora-accent); color: var(--lora-text); + outline: none; } .context-menu-separator { diff --git a/static/css/components/modal/_base.css b/static/css/components/modal/_base.css index e8e80b8a..53c1a998 100644 --- a/static/css/components/modal/_base.css +++ b/static/css/components/modal/_base.css @@ -1,4 +1,4 @@ -/* modal 基础样式 */ +/* Modal base styles */ .modal { display: none; position: fixed; @@ -6,19 +6,19 @@ left: 0; width: 100%; height: calc(100% - var(--header-height, 48px)); /* Adjust height to exclude header */ - background: rgba(0, 0, 0, 0.2); /* 调整为更淡的半透明黑色 */ + background: rgba(0, 0, 0, 0.2); z-index: var(--z-modal); overflow: auto; /* Change from hidden to auto to allow scrolling */ } -/* 当模态窗口打开时,禁止body滚动 */ +/* Prevent body scroll when modal is open */ body.modal-open { position: fixed; width: 100%; - padding-right: var(--scrollbar-width, 0px); /* 补偿滚动条消失导致的页面偏移 */ + padding-right: var(--scrollbar-width, 0px); } -/* modal-content 样式 */ +/* Modal content styles */ .modal-content { position: relative; max-width: 800px; @@ -31,7 +31,7 @@ body.modal-open { border: 1px solid var(--lora-border); box-shadow: var(--shadow-md); overflow-y: auto; - overflow-x: hidden; /* 防止水平滚动条 */ + overflow-x: hidden; scrollbar-gutter: stable both-edges; /* Reserve space to prevent layout shift when scrollbar toggles */ } @@ -39,10 +39,10 @@ body.modal-open { min-height: 480px; } -/* 当 modal 打开时锁定 body */ +/* Lock body when modal is open */ body.modal-open { - overflow: hidden !important; /* 覆盖 base.css 中的 scroll */ - padding-right: var(--scrollbar-width, 8px); /* 使用滚动条宽度作为补偿 */ + overflow: hidden !important; + padding-right: var(--scrollbar-width, 8px); } @keyframes modalFadeIn { @@ -95,15 +95,20 @@ body.modal-open { color: white; } -.cancel-btn:hover { +.cancel-btn:hover, +.cancel-btn:focus-visible { background: var(--lora-border); } -.delete-btn:hover { +.delete-btn:hover, +.delete-btn:focus-visible { background: oklch(from var(--lora-error) l c h / 85%); } -.exclude-btn:hover, .confirm-btn:hover { +.exclude-btn:hover, +.exclude-btn:focus-visible, +.confirm-btn:hover, +.confirm-btn:focus-visible { background: oklch(from var(--lora-accent, #4f46e5) l c h / 85%); } @@ -127,23 +132,27 @@ body.modal-open { z-index: 10; } -.close:hover { +.close:hover, +.close:focus-visible { opacity: 1; + outline: 2px solid var(--lora-accent); + outline-offset: 2px; + border-radius: var(--border-radius-xs); } -/* 统一各个 section 的样式 */ +/* Unified section styles */ .support-section, .changelog-section, .update-info, .info-item, .path-preview { - background: var(--surface-hover); + background: var(--surface-subtle); border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); padding: var(--space-2); } -/* 深色主题统一样式 */ +/* Dark theme unified styles */ [data-theme="dark"] .modal-content { background: var(--lora-surface); border: 1px solid var(--lora-border); @@ -163,9 +172,11 @@ body.modal-open { font-size: 0.95em; } -.primary-btn:hover { +.primary-btn:hover, +.primary-btn:focus-visible { background-color: oklch(from var(--lora-accent) l c h / 85%); color: var(--lora-text); + outline: none; } /* Secondary button styles */ @@ -183,9 +194,11 @@ body.modal-open { font-size: 0.95em; } -.secondary-btn:hover { +.secondary-btn:hover, +.secondary-btn:focus-visible { background-color: var(--border-color); color: var(--text-color); + outline: none; } /* Disabled button styles */ @@ -246,14 +259,16 @@ button:disabled, font-size: 0.95em; } -.danger-btn:hover { +.danger-btn:hover, +.danger-btn:focus-visible { background-color: oklch(from var(--lora-error) l c h / 85%); color: white; + outline: none; } /* Metadata archive status styles */ .metadata-archive-status { - background: var(--surface-hover); + background: var(--surface-subtle); border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); padding: var(--space-2); @@ -299,7 +314,7 @@ button:disabled, } .backup-status { - background: var(--surface-hover); + background: var(--surface-subtle); border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); padding: var(--space-3); @@ -383,7 +398,7 @@ button:disabled, .backup-location-details { border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); - background: var(--surface-hover); + background: var(--surface-subtle); } .backup-location-details summary { @@ -414,7 +429,7 @@ button:disabled, max-width: 100%; padding: 6px 8px; border-radius: var(--border-radius-sm); - background: var(--surface-hover); + background: var(--surface-subtle); color: var(--text-color); overflow-wrap: anywhere; word-break: break-word; @@ -487,7 +502,7 @@ button:disabled, } #bulkDownloadMissingLorasModal .bulk-download-loras-preview { - background: var(--surface-hover); + background: var(--surface-subtle); border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); padding: var(--space-3); diff --git a/static/css/components/modal/doctor-modal.css b/static/css/components/modal/doctor-modal.css index 3ddc7915..ebbb3bbb 100644 --- a/static/css/components/modal/doctor-modal.css +++ b/static/css/components/modal/doctor-modal.css @@ -48,8 +48,7 @@ padding: var(--space-3); border-radius: var(--border-radius-sm); border: 1px solid var(--lora-border); - background: rgba(0, 0, 0, 0.03); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); } .doctor-kicker { @@ -128,7 +127,7 @@ .doctor-issue-card { border: 1px solid rgba(0, 0, 0, 0.1); - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border-radius: var(--border-radius-sm); padding: var(--space-3); box-shadow: none; @@ -242,7 +241,7 @@ [data-theme="dark"] .doctor-hero, [data-theme="dark"] .doctor-issue-card { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border-color: var(--lora-border); box-shadow: none; } diff --git a/static/css/components/modal/help-modal.css b/static/css/components/modal/help-modal.css index 6e0c4492..0343c16a 100644 --- a/static/css/components/modal/help-modal.css +++ b/static/css/components/modal/help-modal.css @@ -303,5 +303,5 @@ /* Dark theme adjustments */ [data-theme="dark"] .video-container { - background-color: rgba(255, 255, 255, 0.03); + background-color: var(--surface-hover); } \ No newline at end of file diff --git a/static/css/components/modal/settings-modal.css b/static/css/components/modal/settings-modal.css index 66fc53a6..0b30a5e2 100644 --- a/static/css/components/modal/settings-modal.css +++ b/static/css/components/modal/settings-modal.css @@ -927,7 +927,7 @@ input:checked + .toggle-slider:before { /* Path Template Settings Styles */ .template-preview { - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-xs); padding: var(--space-1); @@ -939,7 +939,7 @@ input:checked + .toggle-slider:before { } [data-theme="dark"] .template-preview { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } diff --git a/static/css/components/modal/support-modal.css b/static/css/components/modal/support-modal.css index f52e5106..e35412e1 100644 --- a/static/css/components/modal/support-modal.css +++ b/static/css/components/modal/support-modal.css @@ -258,7 +258,7 @@ color: white; /* Icon color changes to white on hover */ } -/* 增强hover状态的视觉反馈 */ +/* Enhanced hover visual feedback */ .social-link:hover, .update-link:hover, .folder-item:hover { diff --git a/static/css/components/modal/update-modal.css b/static/css/components/modal/update-modal.css index c71fe222..6dfe1276 100644 --- a/static/css/components/modal/update-modal.css +++ b/static/css/components/modal/update-modal.css @@ -171,7 +171,7 @@ /* Update progress styles */ .update-progress { - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); border-radius: var(--border-radius-sm); padding: var(--space-2); @@ -179,7 +179,7 @@ } [data-theme="dark"] .update-progress { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); } .progress-info { @@ -429,7 +429,7 @@ } [data-theme="dark"] .banner-history-item { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); } .banner-history-title { diff --git a/static/css/components/progress-panel.css b/static/css/components/progress-panel.css index 0dd8d4b9..2182ccea 100644 --- a/static/css/components/progress-panel.css +++ b/static/css/components/progress-panel.css @@ -67,9 +67,17 @@ position: relative; } -.icon-button:hover { - opacity: 1; - background: rgba(0, 0, 0, 0.05); +.icon-button:hover, +.icon-button:focus-visible { + background: var(--lora-surface-hover, oklch(95% 0.02 256)); + color: var(--lora-accent); + transform: scale(1.05); + outline: none; +} + +[data-theme="dark"] .icon-button:hover, +[data-theme="dark"] .icon-button:focus-visible { + background: oklch(35% 0.02 256 / 0.98); } [data-theme="dark"] .icon-button:hover { diff --git a/static/css/components/recipe-modal.css b/static/css/components/recipe-modal.css index 23be8846..518a0542 100644 --- a/static/css/components/recipe-modal.css +++ b/static/css/components/recipe-modal.css @@ -99,7 +99,7 @@ font-size: 0.9em; } -/* 删除不再需要的按钮样式 */ +/* Remove obsolete button styles */ .editor-actions { display: none; } @@ -144,7 +144,7 @@ } .recipe-tag-compact { - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-xs); padding: 2px 8px; @@ -154,7 +154,7 @@ } [data-theme="dark"] .recipe-tag-compact { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } @@ -203,7 +203,7 @@ } .tooltip-tag { - background: rgba(0, 0, 0, 0.03); + background: var(--surface-hover); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-xs); padding: 3px 8px; @@ -212,7 +212,7 @@ } [data-theme="dark"] .tooltip-tag { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-hover); border: 1px solid var(--lora-border); } @@ -251,7 +251,7 @@ align-items: center; gap: 6px; padding: 6px 12px; - background: rgba(0, 0, 0, 0.03); + background: var(--surface-subtle); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); color: var(--text-color); @@ -263,7 +263,7 @@ } [data-theme="dark"] .recipe-source-url-btn { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-subtle); border: 1px solid var(--lora-border); } @@ -1114,9 +1114,9 @@ color: #777; } -/* 标题输入框特定的样式 */ +/* Title input specific styles */ .title-input { - font-size: 1.2em !important; /* 调整为更合适的大小 */ + font-size: 1.2em; line-height: 1.2; font-weight: 500; } diff --git a/static/css/components/search-filter.css b/static/css/components/search-filter.css index beed5b74..5eec03b1 100644 --- a/static/css/components/search-filter.css +++ b/static/css/components/search-filter.css @@ -7,7 +7,7 @@ gap: 4px; } -/* 调整搜索框样式以匹配其他控件 */ +/* Match search input styles to other controls */ .search-container input { width: 100%; padding: 6px 35px 6px 12px; /* Reduced right padding */ @@ -35,7 +35,7 @@ line-height: 1; } -/* 修改清空按钮样式 */ +/* Clear button styles */ .search-clear { position: absolute; right: 105px; /* Adjusted further left to avoid overlapping */ diff --git a/static/css/components/shared/edit-metadata.css b/static/css/components/shared/edit-metadata.css index 4341e96d..d0674757 100644 --- a/static/css/components/shared/edit-metadata.css +++ b/static/css/components/shared/edit-metadata.css @@ -31,7 +31,7 @@ /* Edit Container */ .metadata-edit-container { padding: var(--space-2); - background: rgba(0, 0, 0, 0.03); + background: var(--surface-hover); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: var(--border-radius-sm); margin-top: var(--space-2); @@ -42,7 +42,7 @@ } [data-theme="dark"] .metadata-edit-container { - background: rgba(255, 255, 255, 0.03); + background: var(--surface-hover); border: 1px solid var(--lora-border); } diff --git a/static/css/components/sidebar.css b/static/css/components/sidebar.css index 801cb255..6b714d3f 100644 --- a/static/css/components/sidebar.css +++ b/static/css/components/sidebar.css @@ -707,19 +707,25 @@ color: var(--text-muted); } -.sidebar-create-folder-btn:hover { +.sidebar-create-folder-btn:hover, +.sidebar-create-folder-btn:focus-visible { background: var(--lora-surface); color: var(--text-color); + outline: none; } -.sidebar-create-folder-confirm:hover { +.sidebar-create-folder-confirm:hover, +.sidebar-create-folder-confirm:focus-visible { background: oklch(from var(--success-color) l c h / 0.15); color: var(--success-color); + outline: none; } -.sidebar-create-folder-cancel:hover { +.sidebar-create-folder-cancel:hover, +.sidebar-create-folder-cancel:focus-visible { background: oklch(from var(--error-color) l c h / 0.15); color: var(--error-color); + outline: none; } .sidebar-create-folder-hint { diff --git a/static/css/components/toast.css b/static/css/components/toast.css index f8b692f8..713ab1f3 100644 --- a/static/css/components/toast.css +++ b/static/css/components/toast.css @@ -15,18 +15,18 @@ /* Toast Notifications */ .toast { position: fixed; - top: 20px; /* 改为从顶部显示 */ - right: 20px; /* 改为右对齐 */ - left: auto; /* 移除左对齐 */ - transform: translateX(120%); /* 初始位置在屏幕右侧外 */ - min-width: 300px; /* 设置最小宽度 */ - max-width: 400px; /* 设置最大宽度 */ + top: 20px; + right: 20px; + left: auto; + transform: translateX(120%); + min-width: 300px; + max-width: 400px; background: var(--lora-surface); color: var(--text-color); padding: 12px 16px; border-radius: var(--border-radius-sm); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); - z-index: calc(var(--z-overlay) + 10); /* 让toast显示在最上层 */ + z-index: calc(var(--z-overlay) + 10); opacity: 0; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); @@ -36,11 +36,10 @@ } .toast.show { - transform: translateX(0); /* 显示时滑入到正确位置 */ + transform: translateX(0); opacity: 1; } -/* 添加图标容器 */ .toast::before { content: ''; width: 20px; @@ -51,7 +50,7 @@ background-size: contain; } -/* 不同类型的toast样式 */ +/* Toast type variants */ .toast-success { border-left: 4px solid oklch(65% 0.2 142); } @@ -76,15 +75,15 @@ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%232196f3'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z'/%3E%3C/svg%3E"); } -/* 多个toast堆叠显示 */ +/* Stacked toast spacing */ .toast + .toast { margin-top: 10px; } -/* 响应式调整 */ +/* Responsive adjustments */ @media (max-width: 768px) { .toast { - width: calc(100% - 40px); /* 左右各留20px间距 */ + width: calc(100% - 40px); max-width: none; right: 20px; } diff --git a/static/css/layout.css b/static/css/layout.css index ddee0919..d81e957e 100644 --- a/static/css/layout.css +++ b/static/css/layout.css @@ -83,11 +83,13 @@ box-shadow: var(--shadow-xs); } -.control-group button:hover { +.control-group button:hover, +.control-group button:focus-visible { border-color: var(--lora-accent); background: var(--bg-color); transform: translateY(-1px); box-shadow: var(--shadow-lg); + outline: none; } .control-group button:active { @@ -100,7 +102,8 @@ transition: opacity 0.2s ease; } -.control-group button:hover i { +.control-group button:hover i, +.control-group button:focus-visible i { opacity: 1; } @@ -131,7 +134,7 @@ .control-group button.favorite-filter i { margin-right: 4px; - color: #ffc107; + color: var(--favorite-color); } .control-group button.update-filter i { diff --git a/static/css/style.css b/static/css/style.css index 17370b2b..2e7b8e3f 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -54,7 +54,7 @@ text-align: center; } -/* 使用已有的loading-spinner样式 */ +/* Reuse existing loading-spinner styles */ .initialization-notice .loading-spinner { margin-bottom: var(--space-2); } diff --git a/static/css/tokens/colors.css b/static/css/tokens/colors.css index 1ee5077f..f50b5e95 100644 --- a/static/css/tokens/colors.css +++ b/static/css/tokens/colors.css @@ -61,6 +61,7 @@ --surface-base: #ffffff; --surface-elevated: oklch(97% 0 0 / 0.95); --surface-hover: oklch(95% 0.02 256); + --surface-subtle: oklch(0% 0 0 / 0.03); --border-base: #e0e0e0; --border-subtle: oklch(72% 0.03 256 / 0.45); @@ -74,7 +75,7 @@ --status-info-border: oklch(55% 0.12 195 / 0.3); --favorite-color: #d4a017; - --favorite-glow: oklch(75% 0.15 85 / 0.5); + --favorite-glow: oklch(65% 0.15 85 / 0.5); } [data-theme="dark"] { @@ -92,6 +93,7 @@ --surface-base: #2d2d2d; --surface-elevated: oklch(25% 0.02 256 / 0.98); --surface-hover: oklch(35% 0.02 256); + --surface-subtle: oklch(100% 0 0 / 0.03); --border-base: #404040; --border-subtle: oklch(90% 0.02 256 / 0.15); @@ -110,4 +112,6 @@ --color-error-bg: color-mix(in oklch, var(--color-error) 15%, transparent); --color-error-border: color-mix(in oklch, var(--color-error) 40%, transparent); + + --favorite-color: #ffc107; }