Compare commits

...

10 Commits

Author SHA1 Message Date
Will Miao
451f74b874 fix(ui): return minWidth/minHeight from autocomplete text widget factory for proper node initial sizing 2026-06-09 15:21:45 +08:00
pixelpaws
a1d248baa6 Merge pull request #966 from willmiao/design-token-system-phase4
Design token system phase4
2026-06-09 14:37:02 +08:00
Will Miao
18577fa336 refactor(phase-4): standardize remaining transitions and box-shadows
- Replace all remaining 'transition: all' with specific token-based transitions
- Replace 80+ hardcoded box-shadow rgba values with semantic tokens
- Add new tokens: --shadow-side, --shadow-elevated, --shadow-dialog, --shadow-inset-top
- Update dark theme overrides for new shadow tokens
- 32 files changed, net +8 lines (more consistent, less duplication)
2026-06-09 14:27:53 +08:00
Will Miao
5797ce9408 feat(phase-4): visual polish — font stack, shadow system, transitions, micro-interactions
Phase 4: Visual Polish

4.1 Font Stack Upgrade:
- Add --font-display token for headings
- Replace all hardcoded font-family: monospace with var(--font-mono)
- Replace hardcoded 'Segoe UI' stack with var(--font-body)

4.2 Shadow Elevation System:
- Add --shadow-2xl, --shadow-card/dropdown/modal/toast/header/dark-lg tokens
- Replace hardcoded shadows in header, menu, banner, shared, recipe-modal,
  progress-panel, import-modal, alphabet-bar with semantic tokens
- Add dark theme shadow overrides with increased opacity

4.3 Transitions & Micro-interactions:
- Replace transition: all with specified properties (performance)
- Use --transition-fast/base/slow tokens instead of hardcoded 0.2s/0.3s
- Add :active scale feedback to modal buttons
- Enhance card hover with box-shadow + border-color lift

4.4 Dark Theme Refinement:
- Elevated shadow opacity for dark theme visibility

4.5 Density:
- Standardize container padding with --space-2 token

21 files changed
2026-06-09 14:07:36 +08:00
pixelpaws
826f06255a Merge pull request #964 from willmiao/design-token-system
Design token system phase1
2026-06-09 11:38:31 +08:00
Will Miao
84e16b5c5b refactor(css): remove hardcoded background/border from modal sections - use design tokens instead 2026-06-09 09:52:11 +08:00
Will Miao
eb22054580 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)
2026-06-09 09:27:11 +08:00
Will Miao
08afb05ece refactor: normalize components in Phase 2
- Unify button styles (padding, gap, border-radius, hover states) in _base.css
- Fix .secondary-btn syntax error (extra space in var())
- Remove duplicated .card-actions in card.css
- Replace hardcoded #f0f0f0 with --surface-hover token
- Replace #ffc107 with accessible #d4a017 for favorite stars
- Replace hardcoded rgba shadows with semantic --shadow-* tokens in layout.css
- Replace hardcoded rgba(0,0,0,0.03)/rgba(255,255,255,0.03) with --surface-hover
- Remove redundant [data-theme=dark] overrides by using theme-aware tokens
- Replace .dropdown-main hardcoded border with --border-color token
2026-06-09 09:26:28 +08:00
Will Miao
f51f125cf1 feat: introduce design token system foundation
- Add semantic OKLch color tokens with light/dark themes
- Add typography, spacing, effects, breakpoints, z-index tokens
- Refactor base.css with backward-compatible aliases
- Add prefers-reduced-motion support
- Add MIGRATION.md for Phase 2 component audit
2026-06-09 09:26:28 +08:00
Will Miao
24b2078f21 fix: batch URL download UI polish - hint text, label, and i18n (#936)
- Add .input-hint helper text below textarea guiding multi-URL input
- Update label to CivitAI URL(s): for batch-agnostic hint
- Add urlHint locale key across all 10 languages
- Remove unused url locale key
2026-06-09 07:57:33 +08:00
63 changed files with 969 additions and 526 deletions

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "Modell von URL herunterladen", "title": "Modell von URL herunterladen",
"titleWithType": "{type} von URL herunterladen", "titleWithType": "{type} von URL herunterladen",
"url": "Civitai URL",
"civitaiUrl": "Civitai URL:", "civitaiUrl": "Civitai URL:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "Geben Sie eine CivitAI- oder CivArchive-URL pro Zeile ein. Unterstützt mehrere URLs für den Batch-Download.",
"locationPreview": "Download-Speicherort Vorschau", "locationPreview": "Download-Speicherort Vorschau",
"useDefaultPath": "Standardpfad verwenden", "useDefaultPath": "Standardpfad verwenden",
"useDefaultPathTooltip": "Wenn aktiviert, werden Dateien automatisch mit konfigurierten Pfadvorlagen organisiert", "useDefaultPathTooltip": "Wenn aktiviert, werden Dateien automatisch mit konfigurierten Pfadvorlagen organisiert",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "Download Model from URL", "title": "Download Model from URL",
"titleWithType": "Download {type} from URL", "titleWithType": "Download {type} from URL",
"url": "Civitai URL", "civitaiUrl": "Civitai URL(s):",
"civitaiUrl": "Civitai URL:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "Enter one CivitAI or CivArchive URL per line. Supports multiple URLs for batch download.",
"locationPreview": "Download Location Preview", "locationPreview": "Download Location Preview",
"useDefaultPath": "Use Default Path", "useDefaultPath": "Use Default Path",
"useDefaultPathTooltip": "When enabled, files are automatically organized using configured path templates", "useDefaultPathTooltip": "When enabled, files are automatically organized using configured path templates",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "Descargar modelo desde URL", "title": "Descargar modelo desde URL",
"titleWithType": "Descargar {type} desde URL", "titleWithType": "Descargar {type} desde URL",
"url": "URL de Civitai",
"civitaiUrl": "URL de Civitai:", "civitaiUrl": "URL de Civitai:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "Ingrese una URL de CivitAI o CivArchive por línea. Admite múltiples URLs para descarga por lotes.",
"locationPreview": "Vista previa de ubicación de descarga", "locationPreview": "Vista previa de ubicación de descarga",
"useDefaultPath": "Usar ruta predeterminada", "useDefaultPath": "Usar ruta predeterminada",
"useDefaultPathTooltip": "Cuando está habilitado, los archivos se organizan automáticamente usando plantillas de rutas configuradas", "useDefaultPathTooltip": "Cuando está habilitado, los archivos se organizan automáticamente usando plantillas de rutas configuradas",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "Télécharger un modèle depuis une URL", "title": "Télécharger un modèle depuis une URL",
"titleWithType": "Télécharger {type} depuis une URL", "titleWithType": "Télécharger {type} depuis une URL",
"url": "URL Civitai",
"civitaiUrl": "URL Civitai :", "civitaiUrl": "URL Civitai :",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "Entrez une URL CivitAI ou CivArchive par ligne. Prend en charge plusieurs URLs pour le téléchargement par lot.",
"locationPreview": "Aperçu de l'emplacement de téléchargement", "locationPreview": "Aperçu de l'emplacement de téléchargement",
"useDefaultPath": "Utiliser le chemin par défaut", "useDefaultPath": "Utiliser le chemin par défaut",
"useDefaultPathTooltip": "Lorsque activé, les fichiers sont automatiquement organisés selon les modèles de chemin configurés", "useDefaultPathTooltip": "Lorsque activé, les fichiers sont automatiquement organisés selon les modèles de chemin configurés",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "הורד מודל מכתובת URL", "title": "הורד מודל מכתובת URL",
"titleWithType": "הורד {type} מכתובת URL", "titleWithType": "הורד {type} מכתובת URL",
"url": "כתובת URL של Civitai",
"civitaiUrl": "כתובת URL של Civitai:", "civitaiUrl": "כתובת URL של Civitai:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "יש להזין כתובת URL אחת של CivitAI או CivArchive בכל שורה. תומך במספר כתובות URL להורדה בבת אחת.",
"locationPreview": "תצוגה מקדימה של מיקום ההורדה", "locationPreview": "תצוגה מקדימה של מיקום ההורדה",
"useDefaultPath": "השתמש בנתיב ברירת מחדל", "useDefaultPath": "השתמש בנתיב ברירת מחדל",
"useDefaultPathTooltip": "כאשר מופעל, קבצים מאורגנים אוטומטית באמצעות תבניות נתיב מוגדרות", "useDefaultPathTooltip": "כאשר מופעל, קבצים מאורגנים אוטומטית באמצעות תבניות נתיב מוגדרות",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "URLからモデルをダウンロード", "title": "URLからモデルをダウンロード",
"titleWithType": "URLから{type}をダウンロード", "titleWithType": "URLから{type}をダウンロード",
"url": "Civitai URL",
"civitaiUrl": "Civitai URL", "civitaiUrl": "Civitai URL",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "1行に1つのCivitAIまたはCivArchive URLを入力してください。複数のURLを一括ダウンロードできます。",
"locationPreview": "ダウンロード場所プレビュー", "locationPreview": "ダウンロード場所プレビュー",
"useDefaultPath": "デフォルトパスを使用", "useDefaultPath": "デフォルトパスを使用",
"useDefaultPathTooltip": "有効にすると、設定されたパステンプレートを使用してファイルが自動的に整理されます", "useDefaultPathTooltip": "有効にすると、設定されたパステンプレートを使用してファイルが自動的に整理されます",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "URL에서 모델 다운로드", "title": "URL에서 모델 다운로드",
"titleWithType": "URL에서 {type} 다운로드", "titleWithType": "URL에서 {type} 다운로드",
"url": "Civitai URL",
"civitaiUrl": "Civitai URL:", "civitaiUrl": "Civitai URL:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "한 줄에 하나의 CivitAI 또는 CivArchive URL을 입력하세요. 여러 URL을 일괄 다운로드할 수 있습니다.",
"locationPreview": "다운로드 위치 미리보기", "locationPreview": "다운로드 위치 미리보기",
"useDefaultPath": "기본 경로 사용", "useDefaultPath": "기본 경로 사용",
"useDefaultPathTooltip": "활성화하면 구성된 경로 템플릿을 사용하여 파일이 자동으로 정리됩니다", "useDefaultPathTooltip": "활성화하면 구성된 경로 템플릿을 사용하여 파일이 자동으로 정리됩니다",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "Скачать модель по URL", "title": "Скачать модель по URL",
"titleWithType": "Скачать {type} по URL", "titleWithType": "Скачать {type} по URL",
"url": "Civitai URL",
"civitaiUrl": "Civitai URL:", "civitaiUrl": "Civitai URL:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "Введите один URL CivitAI или CivArchive в каждой строке. Поддерживается пакетная загрузка нескольких URL.",
"locationPreview": "Предпросмотр места загрузки", "locationPreview": "Предпросмотр места загрузки",
"useDefaultPath": "Использовать путь по умолчанию", "useDefaultPath": "Использовать путь по умолчанию",
"useDefaultPathTooltip": "При включении файлы автоматически организуются с использованием настроенных шаблонов путей", "useDefaultPathTooltip": "При включении файлы автоматически организуются с использованием настроенных шаблонов путей",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "从 URL 下载模型", "title": "从 URL 下载模型",
"titleWithType": "从 URL 下载 {type}", "titleWithType": "从 URL 下载 {type}",
"url": "Civitai URL",
"civitaiUrl": "Civitai URL:", "civitaiUrl": "Civitai URL:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "每行输入一个 CivitAI 或 CivArchive URL。支持批量下载多个 URL。",
"locationPreview": "下载位置预览", "locationPreview": "下载位置预览",
"useDefaultPath": "使用默认路径", "useDefaultPath": "使用默认路径",
"useDefaultPathTooltip": "启用后,文件将自动按配置的路径模板进行整理", "useDefaultPathTooltip": "启用后,文件将自动按配置的路径模板进行整理",

View File

@@ -1016,9 +1016,9 @@
"download": { "download": {
"title": "從網址下載模型", "title": "從網址下載模型",
"titleWithType": "從網址下載 {type}", "titleWithType": "從網址下載 {type}",
"url": "Civitai 網址",
"civitaiUrl": "Civitai 網址:", "civitaiUrl": "Civitai 網址:",
"placeholder": "https://civitai.com/models/...", "placeholder": "https://civitai.com/models/...",
"urlHint": "每行輸入一個 CivitAI 或 CivArchive URL。支援批量下載多個 URL。",
"locationPreview": "下載位置預覽", "locationPreview": "下載位置預覽",
"useDefaultPath": "使用預設路徑", "useDefaultPath": "使用預設路徑",
"useDefaultPathTooltip": "啟用後,檔案將依照設定的路徑範本自動整理", "useDefaultPathTooltip": "啟用後,檔案將依照設定的路徑範本自動整理",

View File

@@ -1,21 +1,20 @@
@import 'tokens/index.css';
html, html,
body { body {
margin: 0; margin: 0;
padding: 0; padding: 0;
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
/* Disable default scrolling */
} }
/* 针对Firefox */
* { * {
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: var(--border-color) transparent; scrollbar-color: var(--border-base) transparent;
} }
/* 针对Webkit browsers (Chrome, Safari等) */
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 8px; width: var(--scrollbar-width, 8px);
} }
::-webkit-scrollbar-track { ::-webkit-scrollbar-track {
@@ -24,116 +23,128 @@ body {
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
background-color: var(--border-color); background-color: var(--border-base);
border-radius: 4px; border-radius: var(--radius-xs);
} }
:root { :root {
--bg-color: #ffffff;
--text-color: #333333;
--text-muted: #6c757d;
--card-bg: #ffffff;
--border-color: #e0e0e0;
--header-height: 48px; --header-height: 48px;
/* Color Components */
--lora-accent-l: 68%;
--lora-accent-c: 0.28;
--lora-accent-h: 256;
--lora-warning-l: 75%;
--lora-warning-c: 0.25;
--lora-warning-h: 80;
--lora-success-l: 70%;
--lora-success-c: 0.2;
--lora-success-h: 140;
/* Composed Colors */
--lora-accent: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h));
--lora-surface: oklch(97% 0 0 / 0.95);
--lora-border: oklch(72% 0.03 256 / 0.45);
--lora-text: oklch(95% 0.02 256);
--lora-error: oklch(75% 0.32 29);
--lora-error-bg: color-mix(in oklch, var(--lora-error) 20%, transparent);
--lora-error-border: color-mix(in oklch, var(--lora-error) 50%, transparent);
--lora-warning: oklch(var(--lora-warning-l) var(--lora-warning-c) var(--lora-warning-h));
--lora-success: oklch(var(--lora-success-l) var(--lora-success-c) var(--lora-success-h));
--badge-update-bg: oklch(72% 0.2 220);
--badge-update-text: oklch(28% 0.03 220);
--badge-update-glow: oklch(72% 0.2 220 / 0.28);
--badge-skip-refresh-bg: oklch(82% 0.12 45);
--badge-skip-refresh-text: oklch(35% 0.02 45);
--badge-skip-refresh-glow: oklch(82% 0.12 45 / 0.15);
/* Spacing Scale */
--space-1: calc(8px * 1);
--space-2: calc(8px * 2);
--space-3: calc(8px * 3);
--space-4: calc(8px * 4);
/* Z-index Scale */
--z-base: 10;
--z-header: 100;
--z-modal: 1000;
--z-overlay: 2000;
/* Border Radius */
--border-radius-base: 12px;
--border-radius-md: 12px;
--border-radius-sm: 8px;
--border-radius-xs: 4px;
--scrollbar-width: 8px; --scrollbar-width: 8px;
/* 添加滚动条宽度变量 */
/* Shortcut styles */ --shortcut-bg: var(--color-accent-subtle);
--shortcut-bg: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.12); --shortcut-border: var(--color-accent-border);
--shortcut-border: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.25); --shortcut-text: var(--text-primary);
--shortcut-text: var(--text-color);
--lora-accent-transparent: var(--color-accent-transparent);
/* Legacy spacing aliases: 8px base grid to match existing component usage */
--space-1: 8px;
--space-2: 16px;
--space-3: 24px;
--space-4: 32px;
/* Legacy border-radius aliases to match existing component usage */
--border-radius-xs: 4px;
--border-radius-sm: 6px;
--border-radius-base: 8px;
--border-radius-md: 12px;
--border-radius-lg: 16px;
}
:root {
--bg-color: var(--bg-base);
--text-color: var(--text-primary);
--text-muted: var(--text-secondary);
--card-bg: var(--surface-base);
--border-color: var(--border-base);
--lora-accent: var(--color-accent);
--lora-surface: var(--bg-elevated);
--lora-border: var(--border-subtle);
--lora-text: var(--text-primary);
--lora-error: var(--color-error);
--lora-error-bg: var(--color-error-bg);
--lora-error-border: var(--color-error-border);
--lora-warning: var(--color-warning);
--lora-success: var(--color-success);
--badge-update-bg: var(--color-info-bg);
--badge-update-text: var(--color-info-text);
--badge-update-glow: var(--color-info-glow);
--badge-skip-refresh-bg: var(--color-skip-refresh-bg);
--badge-skip-refresh-text: var(--color-skip-refresh-text);
--badge-skip-refresh-glow: var(--color-skip-refresh-glow);
}
[data-theme="dark"] {
--bg-color: var(--bg-base);
--text-color: var(--text-primary);
--text-muted: var(--text-secondary);
--card-bg: var(--surface-base);
--border-color: var(--border-base);
--lora-accent: var(--color-accent);
--lora-surface: var(--bg-elevated);
--lora-border: var(--border-subtle);
--lora-text: var(--text-primary);
--lora-error: var(--color-error);
--lora-error-bg: var(--color-error-bg);
--lora-error-border: var(--color-error-border);
--lora-warning: var(--color-warning);
--lora-success: var(--color-success);
--badge-update-bg: var(--color-info-bg);
--badge-update-text: var(--color-info-text);
--badge-update-glow: var(--color-info-glow);
--badge-skip-refresh-bg: var(--color-skip-refresh-bg);
--badge-skip-refresh-text: var(--color-skip-refresh-text);
--badge-skip-refresh-glow: var(--color-skip-refresh-glow);
} }
html[data-theme="dark"] { html[data-theme="dark"] {
background-color: #1a1a1a !important; background-color: var(--bg-base) !important;
color-scheme: dark; color-scheme: dark;
} }
html[data-theme="light"] { html[data-theme="light"] {
background-color: #ffffff !important; background-color: var(--bg-base) !important;
color-scheme: light; color-scheme: light;
} }
[data-theme="dark"] {
--bg-color: #1a1a1a;
--text-color: #e0e0e0;
--text-muted: #a0a0a0;
--card-bg: #2d2d2d;
--border-color: #404040;
--lora-accent: oklch(68% 0.28 256);
--lora-surface: oklch(25% 0.02 256 / 0.98);
--lora-border: oklch(90% 0.02 256 / 0.15);
--lora-text: oklch(98% 0.02 256);
--lora-warning: oklch(75% 0.25 80);
/* Modified to be used with oklch() */
--lora-error-bg: color-mix(in oklch, var(--lora-error) 15%, transparent);
--lora-error-border: color-mix(in oklch, var(--lora-error) 40%, transparent);
--badge-update-bg: oklch(62% 0.18 220);
--badge-update-text: oklch(98% 0.02 240);
--badge-update-glow: oklch(62% 0.18 220 / 0.4);
--badge-skip-refresh-bg: oklch(82% 0.12 45);
--badge-skip-refresh-text: oklch(98% 0.02 45);
--badge-skip-refresh-glow: oklch(82% 0.12 45 / 0.15);
}
body { body {
font-family: 'Segoe UI', sans-serif; font-family: var(--font-body);
background: var(--bg-color); background: var(--bg-base);
color: var(--text-color); color: var(--text-primary);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding-top: 0; padding-top: 0;
/* Remove the padding-top */
} }
.hidden { .hidden {
display: none !important; 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,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
html {
scroll-behavior: auto !important;
}
}

View File

@@ -46,7 +46,7 @@
flex-direction: column; flex-direction: column;
gap: 6px; gap: 6px;
align-items: center; align-items: center;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-side);
max-height: 80vh; max-height: 80vh;
overflow-y: auto; overflow-y: auto;
scrollbar-width: thin; scrollbar-width: thin;
@@ -75,7 +75,7 @@
width: 20px; width: 20px;
height: 40px; height: 40px;
align-self: center; align-self: center;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-side);
} }
.toggle-alphabet-bar:hover { .toggle-alphabet-bar:hover {
@@ -99,7 +99,7 @@
min-width: 24px; min-width: 24px;
text-align: center; text-align: center;
font-size: 0.85em; font-size: 0.85em;
transition: all 0.2s ease; transition: var(--transition-base);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
} }
@@ -107,7 +107,7 @@
background: var(--lora-accent); background: var(--lora-accent);
color: white; color: white;
transform: scale(1.1); transform: scale(1.1);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
.letter-chip.active { .letter-chip.active {

View File

@@ -68,7 +68,7 @@
text-decoration: none; text-decoration: none;
font-size: 0.85em; font-size: 0.85em;
font-weight: 500; font-weight: 500;
transition: all 0.2s ease; transition: var(--transition-base);
white-space: nowrap; white-space: nowrap;
border: 1px solid transparent; border: 1px solid transparent;
} }
@@ -102,7 +102,7 @@
color: white; color: white;
border-color: var(--lora-accent); border-color: var(--lora-accent);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
/* Tertiary Action Button */ /* Tertiary Action Button */
@@ -133,7 +133,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all 0.2s ease; transition: var(--transition-base);
font-size: 0.8em; font-size: 0.8em;
} }

View File

@@ -76,7 +76,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all 0.2s; transition: var(--transition-base);
background: var(--bg-color); background: var(--bg-color);
} }
@@ -166,7 +166,7 @@
background: var(--card-bg); background: var(--card-bg);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: var(--transition-base);
} }
.back-btn:hover { .back-btn:hover {
@@ -237,7 +237,7 @@
padding: 8px 10px; padding: 8px 10px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: var(--transition-base);
border: 1px solid transparent; border: 1px solid transparent;
} }

View File

@@ -1,12 +1,12 @@
/* 卡片网格布局 */ /* Card grid layout */
.card-grid { .card-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); /* Base size */ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); /* Base size */
gap: 12px; /* Consistent gap for both row and column spacing */ gap: 12px; /* Consistent gap for both row and column spacing */
row-gap: 20px; /* Increase vertical spacing between rows */ row-gap: 20px; /* Increase vertical spacing between rows */
margin-top: var(--space-2); margin-top: var(--space-2);
padding-top: 4px; /* 添加顶部内边距,为悬停动画提供空间 */ padding-top: 4px;
padding-bottom: 4px; /* 添加底部内边距,为悬停动画提供空间 */ padding-bottom: 4px;
width: 100%; /* Ensure it takes full width of container */ width: 100%; /* Ensure it takes full width of container */
max-width: 1400px; /* Base container width */ max-width: 1400px; /* Base container width */
margin-left: auto; margin-left: auto;
@@ -19,7 +19,7 @@
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
backdrop-filter: blur(16px); backdrop-filter: blur(16px);
transition: transform 160ms ease-out; transition: transform var(--transition-fast) ease-out, box-shadow var(--transition-fast) ease-out, border-color var(--transition-fast) ease-out;
aspect-ratio: 896/1152; /* Preserve aspect ratio */ aspect-ratio: 896/1152; /* Preserve aspect ratio */
max-width: 260px; /* Base size */ max-width: 260px; /* Base size */
min-width: 200px; /* Prevent cards from becoming too narrow */ min-width: 200px; /* Prevent cards from becoming too narrow */
@@ -33,7 +33,8 @@
.model-card:hover { .model-card:hover {
transform: translateY(-2px); transform: translateY(-2px);
background: oklch(100% 0 0 / 0.6); box-shadow: var(--shadow-md);
border-color: var(--lora-accent);
} }
.model-card:focus-visible { .model-card:focus-visible {
@@ -353,21 +354,26 @@
} }
.card-actions { .card-actions {
flex-shrink: 0;
display: flex; display: flex;
gap: var(--space-1); /* Use gap instead of margin for spacing between icons */ gap: var(--space-1);
align-items: center; align-items: flex-end;
align-self: flex-end;
} }
.card-actions i:hover { .card-actions i:hover,
.card-actions i:focus-visible {
opacity: 0.9; opacity: 0.9;
transform: scale(1.1); transform: scale(1.1);
background-color: rgba(255, 255, 255, 0.1); background-color: rgba(255, 255, 255, 0.1);
outline: 2px solid var(--lora-accent);
outline-offset: 2px;
border-radius: var(--border-radius-xs);
} }
/* Style for active favorites */
.favorite-active { .favorite-active {
color: #ffc107 !important; /* Gold color for favorites */ color: var(--favorite-color) !important;
text-shadow: 0 0 5px rgba(255, 193, 7, 0.5); text-shadow: 0 0 5px var(--favorite-glow);
} }
@media (max-width: 1200px) { @media (max-width: 1200px) {
@@ -391,14 +397,6 @@
} }
} }
.card-actions {
flex-shrink: 0; /* Prevent actions from shrinking */
display: flex;
gap: var(--space-1);
align-items: flex-end; /* 将图标靠下对齐 */
align-self: flex-end; /* 将整个actions容器靠下对齐 */
}
.model-link { .model-link {
margin-top: var(--space-1); margin-top: var(--space-1);
} }
@@ -411,9 +409,13 @@
text-shadow: none; text-shadow: none;
} }
.model-link a:hover { .model-link a:hover,
.model-link a:focus-visible {
opacity: 0.8; opacity: 0.8;
text-decoration: none; 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 */ /* Updated model name to fix text cutoff issues */
@@ -438,7 +440,7 @@
.base-model { .base-model {
display: inline-block; display: inline-block;
background: #f0f0f0; background: var(--surface-hover, oklch(95% 0 0));
padding: 2px 6px; padding: 2px 6px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
margin-right: 6px; margin-right: 6px;

View File

@@ -11,8 +11,8 @@
border-bottom: 1px solid oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.4); /* Make bottom border stronger */ border-bottom: 1px solid oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.4); /* Make bottom border stronger */
z-index: var(--z-overlay); z-index: var(--z-overlay);
padding: 12px 0; padding: 12px 0;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2); /* Stronger shadow */ box-shadow: var(--shadow-lg); /* Stronger shadow */
transition: all 0.3s ease; transition: var(--transition-slow);
margin-bottom: 20px; margin-bottom: 20px;
} }
@@ -65,7 +65,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
gap: 6px; gap: 6px;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.duplicates-banner button.btn-exit-mode:hover { .duplicates-banner button.btn-exit-mode:hover {
@@ -86,16 +86,16 @@
background: var(--card-bg); background: var(--card-bg);
color: var(--text-color); color: var(--text-color);
font-size: 0.85em; font-size: 0.85em;
transition: all 0.2s ease; transition: var(--transition-base);
cursor: pointer; cursor: pointer;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-xs);
} }
.duplicates-banner button:hover { .duplicates-banner button:hover {
border-color: var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h); border-color: var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h);
background: var(--bg-color); background: var(--bg-color);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
} }
.duplicates-banner button.btn-exit { .duplicates-banner button.btn-exit {
@@ -122,7 +122,7 @@
padding: 16px; padding: 16px;
margin-bottom: 24px; margin-bottom: 24px;
background: var(--card-bg); background: var(--card-bg);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12); /* Add subtle shadow to groups */ box-shadow: var(--shadow-md); /* Add subtle shadow to groups */
/* Add responsive width settings to match banner */ /* Add responsive width settings to match banner */
max-width: 1400px; max-width: 1400px;
margin-left: auto; margin-left: auto;
@@ -173,9 +173,9 @@
background: var(--card-bg); background: var(--card-bg);
color: var(--text-color); color: var(--text-color);
font-size: 0.85em; font-size: 0.85em;
transition: all 0.2s ease; transition: var(--transition-base);
cursor: pointer; cursor: pointer;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-xs);
margin-left: 8px; margin-left: 8px;
} }
@@ -183,7 +183,7 @@
border-color: var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h); border-color: var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h);
background: var(--bg-color); background: var(--bg-color);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
} }
.card-group-container { .card-group-container {
@@ -230,20 +230,20 @@
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
z-index: 1; z-index: 1;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.group-toggle-btn:hover { .group-toggle-btn:hover {
border-color: var(--lora-accent-l) var(--lora-accent-c) var (--lora-accent-h); border-color: var(--lora-accent-l) var(--lora-accent-c) var (--lora-accent-h);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
} }
/* Duplicate card styling */ /* Duplicate card styling */
.model-card.duplicate { .model-card.duplicate {
position: relative; position: relative;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.model-card.duplicate:hover { .model-card.duplicate:hover {
@@ -257,7 +257,7 @@
.model-card.duplicate-selected { .model-card.duplicate-selected {
border: 2px solid oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h)); border: 2px solid oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h));
box-shadow: 0 0 8px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-md);
} }
.model-card .selector-checkbox { .model-card .selector-checkbox {
@@ -290,7 +290,7 @@
background-color: var(--card-bg); background-color: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 2px 10px rgba(0,0,0,0.2); box-shadow: var(--shadow-lg);
padding: 10px; padding: 10px;
z-index: 1000; z-index: 1000;
max-width: 350px; max-width: 350px;
@@ -432,7 +432,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
font-size: 0.85em; font-size: 0.85em;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.btn-verify-hashes:hover { .btn-verify-hashes:hover {
@@ -461,7 +461,7 @@
position: absolute; position: absolute;
top: -8px; /* Moved closer to button */ top: -8px; /* Moved closer to button */
right: -8px; /* Moved closer to button */ right: -8px; /* Moved closer to button */
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); /* Softer shadow */ box-shadow: var(--shadow-sm); /* Softer shadow */
transition: transform 0.2s ease, opacity 0.2s ease; transition: transform 0.2s ease, opacity 0.2s ease;
} }
@@ -493,7 +493,7 @@
cursor: help; cursor: help;
font-size: 16px; font-size: 16px;
margin-left: 8px; margin-left: 8px;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.help-icon:hover { .help-icon:hover {
@@ -511,7 +511,7 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: 12px 16px; padding: 12px 16px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-elevated);
z-index: var(--z-overlay); z-index: var(--z-overlay);
font-size: 0.9em; font-size: 0.9em;
margin-top: 10px; margin-top: 10px;
@@ -572,16 +572,16 @@
/* In dark mode, add additional distinction */ /* In dark mode, add additional distinction */
html[data-theme="dark"] .duplicates-banner { html[data-theme="dark"] .duplicates-banner {
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.4); /* Stronger shadow in dark mode */ box-shadow: var(--shadow-dark-lg); /* Stronger shadow in dark mode */
background-color: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.15); /* Slightly stronger background in dark mode */ background-color: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.15); /* Slightly stronger background in dark mode */
} }
html[data-theme="dark"] .duplicate-group { html[data-theme="dark"] .duplicate-group {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25); /* Stronger shadow in dark mode */ box-shadow: var(--shadow-lg); /* Stronger shadow in dark mode */
} }
html[data-theme="dark"] .help-tooltip { html[data-theme="dark"] .help-tooltip {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-elevated);
} }
/* Styles for disabled controls during duplicates mode */ /* Styles for disabled controls during duplicates mode */

View File

@@ -7,22 +7,22 @@
color: white; color: white;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 4px 10px; padding: 4px 10px;
transition: all 0.2s ease; transition: var(--transition-base);
border: 1px solid var(--lora-accent); border: 1px solid var(--lora-accent);
cursor: pointer; cursor: pointer;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
font-size: 0.85em; font-size: 0.85em;
} }
.control-group .filter-active:hover { .control-group .filter-active:hover {
opacity: 0.92; opacity: 0.92;
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
} }
.control-group .filter-active:active { .control-group .filter-active:active {
transform: translateY(0); transform: translateY(0);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.control-group .filter-active i.fa-filter { .control-group .filter-active i.fa-filter {
@@ -59,9 +59,9 @@
/* Animation for filter indicator */ /* Animation for filter indicator */
@keyframes filterPulse { @keyframes filterPulse {
0% { transform: scale(1); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } 0% { transform: scale(1); box-shadow: var(--shadow-sm); }
50% { transform: scale(1.03); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); } 50% { transform: scale(1.03); box-shadow: var(--shadow-lg); }
100% { transform: scale(1); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } 100% { transform: scale(1); box-shadow: var(--shadow-sm); }
} }
.filter-active.animate { .filter-active.animate {

View File

@@ -7,7 +7,7 @@
height: 48px; height: 48px;
/* Reduced height */ /* Reduced height */
width: 100%; width: 100%;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
/* Slightly stronger shadow */ /* Slightly stronger shadow */
} }
@@ -134,14 +134,14 @@
background: var(--input-bg, var(--card-bg)); background: var(--input-bg, var(--card-bg));
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm, 6px); border-radius: var(--border-radius-sm, 6px);
transition: all 0.2s ease; transition: border-color var(--transition-base), box-shadow var(--transition-base);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-header);
overflow: hidden; overflow: hidden;
} }
.header-search .search-container:focus-within { .header-search .search-container:focus-within {
border-color: var(--lora-accent); border-color: var(--lora-accent);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 0 0 1px var(--lora-accent); box-shadow: var(--shadow-header), 0 0 0 1px var(--lora-accent);
} }
.header-search input { .header-search input {
@@ -183,7 +183,7 @@
color: var(--text-muted); color: var(--text-muted);
cursor: pointer; cursor: pointer;
border-radius: var(--border-radius-xs, 4px); border-radius: var(--border-radius-xs, 4px);
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base);
} }
.header-search .search-options-toggle { .header-search .search-options-toggle {
@@ -191,9 +191,11 @@
} }
.header-search .search-options-toggle:hover, .header-search .search-options-toggle:hover,
.header-search .search-filter-toggle:hover { .header-search .search-filter-toggle:hover,
background: var(--lora-surface-hover, oklch(95% 0.02 256)); .header-search .search-filter-toggle:focus-visible {
color: var(--lora-accent); background: var(--lora-surface-hover, oklch(95% 0.02 256));
color: var(--lora-accent);
outline: none;
} }
.header-search .filter-badge { .header-search .filter-badge {
@@ -269,7 +271,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base), transform var(--transition-base);
position: relative; position: relative;
} }
@@ -341,7 +343,7 @@
background-color: var(--lora-error); background-color: var(--lora-error);
border-radius: 50%; border-radius: 50%;
border: 2px solid var(--card-bg); border: 2px solid var(--card-bg);
transition: all 0.2s ease; transition: opacity var(--transition-base);
pointer-events: none; pointer-events: none;
opacity: 0; opacity: 0;
} }
@@ -362,13 +364,22 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
} }
.hamburger-menu-btn:hover { .hamburger-menu-btn:hover,
background: var(--lora-accent); .hamburger-menu-btn:focus-visible {
color: white; 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 */ /* Hamburger dropdown menu */
@@ -381,7 +392,7 @@
background: var(--card-bg); background: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm, 6px); border-radius: var(--border-radius-sm, 6px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-toast);
padding: 0.5rem; padding: 0.5rem;
min-width: 160px; min-width: 160px;
z-index: var(--z-dropdown, 200); z-index: var(--z-dropdown, 200);
@@ -401,7 +412,7 @@
border-radius: var(--border-radius-xs, 4px); border-radius: var(--border-radius-xs, 4px);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base);
font-size: 0.9rem; font-size: 0.9rem;
white-space: nowrap; white-space: nowrap;
} }

View File

@@ -757,7 +757,7 @@
position: relative; position: relative;
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
overflow: hidden; overflow: hidden;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
transition: transform 0.2s ease; transition: transform 0.2s ease;
} }

View File

@@ -176,7 +176,7 @@
background: rgba(var(--lora-accent), 0.05); background: rgba(var(--lora-accent), 0.05);
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
padding: var(--space-2); padding: var(--space-2);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-sm);
} }
.tips-header { .tips-header {

View File

@@ -11,7 +11,7 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
color: var(--text-color); color: var(--text-color);
cursor: help; cursor: help;
transition: all 0.2s ease; transition: var(--transition-base);
margin-left: 8px; margin-left: 8px;
} }
@@ -19,7 +19,7 @@
background: var(--lora-accent); background: var(--lora-accent);
color: white; color: white;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
} }
.keyboard-nav-hint i { .keyboard-nav-hint i {
@@ -46,7 +46,7 @@
transform: translateY(-15%); /* Vertically center */ transform: translateY(-15%); /* Vertically center */
opacity: 0; opacity: 0;
transition: opacity 0.3s; transition: opacity 0.3s;
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-lg);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
font-size: 0.85em; font-size: 0.85em;
line-height: 1.4; line-height: 1.4;
@@ -92,5 +92,5 @@
border-radius: 3px; border-radius: 3px;
padding: 1px 5px; padding: 1px 5px;
font-size: 0.8em; font-size: 0.8em;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-xs);
} }

View File

@@ -18,7 +18,7 @@
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
text-align: center; text-align: center;
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
width: min(400px, 90vw); /* 固定最大宽度,但保持响应式 */ width: min(400px, 90vw);
} }
.loading-spinner { .loading-spinner {
@@ -33,7 +33,7 @@
.loading-status { .loading-status {
margin-bottom: 1rem; margin-bottom: 1rem;
color: var(--text-color); /* 使用主题文本颜色 */ color: var(--text-color);
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@@ -42,11 +42,11 @@
} }
.progress-container { .progress-container {
width: 280px; /* 固定进度条宽度 */ width: 280px;
background-color: var(--lora-border); /* 使用主题边框颜色 */ background-color: var(--lora-border);
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
margin: 0 auto; /* 居中显示 */ margin: 0 auto;
} }
.progress-bar { .progress-bar {

View File

@@ -62,7 +62,7 @@
} }
.model-description-content code { .model-description-content code {
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
background: rgba(0, 0, 0, 0.05); background: rgba(0, 0, 0, 0.05);
padding: 0.1em 0.3em; padding: 0.1em 0.3em;

View File

@@ -105,14 +105,14 @@
.info-item { .info-item {
padding: var(--space-2); 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
} }
/* 调整深色主题下的样式 */ /* Dark theme info item styles */
[data-theme="dark"] .info-item { [data-theme="dark"] .info-item {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -203,7 +203,7 @@
} }
.file-path { .file-path {
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
} }
@@ -271,13 +271,13 @@
} }
} }
/* 修改 back-to-top 按钮样式,使其固定在 modal 内部 */ /* Back-to-top button pinned inside modal */
.modal-content .back-to-top { .modal-content .back-to-top {
position: sticky; /* 改用 sticky 定位 */ position: sticky;
float: right; /* 使用 float 确保按钮在右侧 */ float: right;
bottom: 20px; /* 距离底部的距离 */ bottom: 20px;
margin-right: 20px; /* 右侧间距 */ margin-right: 20px;
margin-top: -56px; /* 负边距确保不占用额外空间 */ margin-top: -56px;
width: 36px; width: 36px;
height: 36px; height: 36px;
border-radius: 50%; border-radius: 50%;
@@ -291,7 +291,7 @@
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
transform: translateY(10px); transform: translateY(10px);
transition: all 0.3s ease; transition: opacity var(--transition-slow), visibility var(--transition-slow), transform var(--transition-slow);
z-index: 10; z-index: 10;
} }
@@ -334,7 +334,7 @@
outline: none; outline: none;
} }
/* 合并编辑按钮样式 */ /* Consolidated edit button styles */
.edit-model-name-btn, .edit-model-name-btn,
.edit-file-name-btn, .edit-file-name-btn,
.edit-base-model-btn, .edit-base-model-btn,
@@ -347,7 +347,7 @@
cursor: pointer; cursor: pointer;
padding: 2px 5px; padding: 2px 5px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: opacity var(--transition-base), background-color var(--transition-base);
margin-left: var(--space-1); margin-left: var(--space-1);
} }
@@ -369,7 +369,7 @@
.edit-base-model-btn:hover, .edit-base-model-btn:hover,
.edit-model-description-btn:hover, .edit-model-description-btn:hover,
.edit-version-name-btn:hover { .edit-version-name-btn:hover {
opacity: 0.8 !important; opacity: 0.8;
background: rgba(0, 0, 0, 0.05); background: rgba(0, 0, 0, 0.05);
} }
@@ -387,7 +387,7 @@
} }
.base-wrapper { .base-wrapper {
flex: 2; /* 分配更多空间给base model */ flex: 2; /* Allocate more space to base model */
} }
/* Base model display and editing styles */ /* Base model display and editing styles */
@@ -430,7 +430,7 @@
} }
.size-wrapper span { .size-wrapper span {
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
opacity: 0.9; opacity: 0.9;
} }
@@ -447,7 +447,7 @@
margin: 0; margin: 0;
padding: var(--space-1); padding: var(--space-1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
font-size: 1.5em !important; font-size: 1.5em;
font-weight: 600; font-weight: 600;
line-height: 1.2; line-height: 1.2;
color: var(--text-color); color: var(--text-color);
@@ -483,7 +483,7 @@
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-size: 0.95em; font-size: 0.95em;
transition: all 0.2s; transition: var(--transition-base);
opacity: 0.7; opacity: 0.7;
position: relative; position: relative;
} }
@@ -888,18 +888,18 @@
align-items: center; align-items: center;
gap: 10px; gap: 10px;
padding: 2px 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
max-width: fit-content; max-width: fit-content;
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: var(--transition-base);
} }
[data-theme="dark"] .creator-info, [data-theme="dark"] .creator-info,
[data-theme="dark"] .civitai-view, [data-theme="dark"] .civitai-view,
[data-theme="dark"] .modal-send-btn { [data-theme="dark"] .modal-send-btn {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -958,14 +958,14 @@
align-items: center; align-items: center;
gap: 6px; gap: 6px;
padding: 6px 12px; padding: 6px 12px;
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-weight: 500; font-weight: 500;
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s; transition: var(--transition-base);
} }
.civitai-view i { .civitai-view i {
@@ -981,18 +981,18 @@
align-items: center; align-items: center;
gap: 6px; gap: 6px;
padding: 6px 12px; padding: 6px 12px;
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-weight: 500; font-weight: 500;
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s; transition: var(--transition-base);
} }
[data-theme="dark"] .modal-send-btn { [data-theme="dark"] .modal-send-btn {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }

View File

@@ -28,7 +28,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: calc(var(--space-1) * 0.5) var(--space-1); padding: calc(var(--space-1) * 0.5) var(--space-1);
gap: var(--space-1); gap: var(--space-1);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.preset-tag span { .preset-tag span {
@@ -40,7 +40,7 @@
color: var(--text-color); color: var(--text-color);
opacity: 0.5; opacity: 0.5;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.preset-tag:hover { .preset-tag:hover {

View File

@@ -111,8 +111,8 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
padding: 0; padding: 0;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
@@ -120,7 +120,7 @@
.media-control-btn:hover { .media-control-btn:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-lg);
} }
.media-control-btn.set-preview-btn:hover { .media-control-btn.set-preview-btn:hover {
@@ -205,7 +205,7 @@
z-index: 5; z-index: 5;
max-height: 50%; /* Reduced to take less space */ max-height: 50%; /* Reduced to take less space */
overflow-y: auto; overflow-y: auto;
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-inset-top);
opacity: 0; opacity: 0;
pointer-events: none; pointer-events: none;
} }
@@ -220,7 +220,7 @@
/* Adjust to dark theme */ /* Adjust to dark theme */
[data-theme="dark"] .image-metadata-panel { [data-theme="dark"] .image-metadata-panel {
background: var(--card-bg); background: var(--card-bg);
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-inset-top);
} }
.metadata-content { .metadata-content {
@@ -297,7 +297,7 @@
.metadata-prompt { .metadata-prompt {
color: var(--text-color); color: var(--text-color);
font-family: monospace; font-family: var(--font-mono);
font-size: 0.85em; font-size: 0.85em;
white-space: pre-wrap; white-space: pre-wrap;
} }
@@ -312,7 +312,7 @@
opacity: 0.6; opacity: 0.6;
cursor: pointer; cursor: pointer;
padding: 3px; padding: 3px;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.copy-prompt-btn:hover { .copy-prompt-btn:hover {
@@ -409,7 +409,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-4); padding: var(--space-4);
text-align: center; text-align: center;
transition: all 0.3s ease; transition: var(--transition-slow);
background: var(--lora-surface); background: var(--lora-surface);
cursor: pointer; cursor: pointer;
} }
@@ -455,9 +455,9 @@
} }
.import-formats { .import-formats {
font-size: 0.8em !important; font-size: 0.8em;
opacity: 0.6 !important; opacity: 0.6;
margin-top: var(--space-2) !important; margin-top: var(--space-2);
} }
.select-files-btn { .select-files-btn {
@@ -471,7 +471,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
transition: all 0.2s; transition: var(--transition-base);
} }
.select-files-btn:hover { .select-files-btn:hover {
@@ -481,7 +481,7 @@
/* For dark theme */ /* For dark theme */
[data-theme="dark"] .import-container { [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 */ /* Setup Guidance State - When example images path is not configured */

View File

@@ -21,7 +21,7 @@
.model-tag-compact { .model-tag-compact {
/* Updated styles to match info-item appearance */ /* 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 2px 8px; padding: 2px 8px;
@@ -45,7 +45,7 @@
/* Adjust dark theme tag styles */ /* Adjust dark theme tag styles */
[data-theme="dark"] .model-tag-compact { [data-theme="dark"] .model-tag-compact {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -73,14 +73,14 @@
background: var(--card-bg); background: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-lg);
padding: 10px 14px; padding: 10px 14px;
max-width: 400px; max-width: 400px;
z-index: 10; z-index: 10;
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
transform: translateY(-4px); transform: translateY(-4px);
transition: all 0.2s ease; transition: var(--transition-base);
pointer-events: none; pointer-events: none;
} }
@@ -101,7 +101,7 @@
.tooltip-tag { .tooltip-tag {
/* Updated styles to match info-item appearance */ /* 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 3px 8px; padding: 3px 8px;
@@ -111,7 +111,7 @@
/* Adjust dark theme tooltip tag styles */ /* Adjust dark theme tooltip tag styles */
[data-theme="dark"] .tooltip-tag { [data-theme="dark"] .tooltip-tag {
background: rgba(255, 255, 255, 0.03); background: var(--surface-hover);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -130,7 +130,7 @@
cursor: pointer; cursor: pointer;
padding: 2px 5px; padding: 2px 5px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
margin-left: var(--space-1); margin-left: var(--space-1);
} }

View File

@@ -1,14 +1,14 @@
/* Update Trigger Words styles */ /* Update Trigger Words styles */
.info-item.trigger-words { .info-item.trigger-words {
padding: var(--space-2); 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
} }
/* 调整 trigger words 样式 */ /* Trigger words styles */
[data-theme="dark"] .info-item.trigger-words { [data-theme="dark"] .info-item.trigger-words {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -48,7 +48,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 4px 8px; padding: 4px 8px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
gap: 6px; gap: 6px;
position: relative; position: relative;
} }

View File

@@ -146,7 +146,7 @@
background: color-mix(in oklch, var(--card-bg) 92%, var(--bg-color) 8%); background: color-mix(in oklch, var(--card-bg) 92%, var(--bg-color) 8%);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); box-shadow: var(--shadow-xs);
transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease; transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
} }
@@ -156,7 +156,7 @@
.model-version-row:hover { .model-version-row:hover {
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-xl);
} }
.model-version-row.is-clickable { .model-version-row.is-clickable {
@@ -186,7 +186,7 @@
height: 88px; height: 88px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
overflow: hidden; overflow: hidden;
background: rgba(0, 0, 0, 0.03); background: var(--surface-hover);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@@ -61,7 +61,7 @@
max-height: 85vh; max-height: 85vh;
object-fit: contain; object-fit: contain;
border-radius: 4px; border-radius: 4px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4); box-shadow: var(--shadow-dark-lg);
} }
.media-viewer-video { .media-viewer-video {

View File

@@ -5,7 +5,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 4px 0; padding: 4px 0;
min-width: 180px; min-width: 180px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-dropdown);
z-index: 1000; z-index: 1000;
display: none; display: none;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
@@ -21,9 +21,11 @@
background: var(--lora-surface); background: var(--lora-surface);
} }
.context-menu-item:hover { .context-menu-item:hover,
.context-menu-item:focus-visible {
background-color: var(--lora-accent); background-color: var(--lora-accent);
color: var(--lora-text); color: var(--lora-text);
outline: none;
} }
.context-menu-separator { .context-menu-separator {
@@ -75,7 +77,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 0; padding: 0;
min-width: 200px; min-width: 200px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-dropdown);
z-index: 1001; z-index: 1001;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
} }
@@ -108,7 +110,7 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
padding: 16px; padding: 16px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-modal);
z-index: var(--z-modal); z-index: var(--z-modal);
width: 300px; width: 300px;
display: none; display: none;
@@ -162,7 +164,7 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.nsfw-level-btn:hover { .nsfw-level-btn:hover {
@@ -186,7 +188,7 @@
max-width: 350px; max-width: 350px;
max-height: 400px; max-height: 400px;
overflow-y: auto; overflow-y: auto;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-dropdown);
z-index: var(--z-overlay); z-index: var(--z-overlay);
display: none; display: none;
backdrop-filter: blur(10px); backdrop-filter: blur(10px);

View File

@@ -1,4 +1,4 @@
/* modal 基础样式 */ /* Modal base styles */
.modal { .modal {
display: none; display: none;
position: fixed; position: fixed;
@@ -6,19 +6,19 @@
left: 0; left: 0;
width: 100%; width: 100%;
height: calc(100% - var(--header-height, 48px)); /* Adjust height to exclude header */ 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); z-index: var(--z-modal);
overflow: auto; /* Change from hidden to auto to allow scrolling */ overflow: auto; /* Change from hidden to auto to allow scrolling */
} }
/* 当模态窗口打开时禁止body滚动 */ /* Prevent body scroll when modal is open */
body.modal-open { body.modal-open {
position: fixed; position: fixed;
width: 100%; width: 100%;
padding-right: var(--scrollbar-width, 0px); /* 补偿滚动条消失导致的页面偏移 */ padding-right: var(--scrollbar-width, 0px);
} }
/* modal-content 样式 */ /* Modal content styles */
.modal-content { .modal-content {
position: relative; position: relative;
max-width: 800px; max-width: 800px;
@@ -29,12 +29,9 @@ body.modal-open {
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
padding: var(--space-3); padding: var(--space-3);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
box-shadow: box-shadow: var(--shadow-md);
0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06),
0 10px 15px -3px rgba(0, 0, 0, 0.05);
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; /* 防止水平滚动条 */ overflow-x: hidden;
scrollbar-gutter: stable both-edges; /* Reserve space to prevent layout shift when scrollbar toggles */ scrollbar-gutter: stable both-edges; /* Reserve space to prevent layout shift when scrollbar toggles */
} }
@@ -42,10 +39,10 @@ body.modal-open {
min-height: 480px; min-height: 480px;
} }
/* 当 modal 打开时锁定 body */ /* Lock body when modal is open */
body.modal-open { body.modal-open {
overflow: hidden !important; /* 覆盖 base.css 中的 scroll */ overflow: hidden !important;
padding-right: var(--scrollbar-width, 8px); /* 使用滚动条宽度作为补偿 */ padding-right: var(--scrollbar-width, 8px);
} }
@keyframes modalFadeIn { @keyframes modalFadeIn {
@@ -67,12 +64,25 @@ body.modal-open {
} }
.cancel-btn, .delete-btn, .exclude-btn, .confirm-btn { .cancel-btn, .delete-btn, .exclude-btn, .confirm-btn {
padding: 8px var(--space-2); display: flex;
border-radius: 6px; align-items: center;
justify-content: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-2);
border-radius: var(--border-radius-sm);
border: none; border: none;
cursor: pointer; cursor: pointer;
font-weight: 500; font-weight: 500;
font-size: 0.95em;
min-width: 100px; min-width: 100px;
transition: background-color var(--transition-base), opacity var(--transition-base), transform var(--transition-fast);
}
.cancel-btn:active,
.delete-btn:active,
.exclude-btn:active,
.confirm-btn:active {
transform: scale(0.98);
} }
.cancel-btn { .cancel-btn {
@@ -92,16 +102,20 @@ body.modal-open {
color: white; color: white;
} }
.cancel-btn:hover { .cancel-btn:hover,
.cancel-btn:focus-visible {
background: var(--lora-border); background: var(--lora-border);
} }
.delete-btn:hover { .delete-btn:hover,
opacity: 0.9; .delete-btn:focus-visible {
background: oklch(from var(--lora-error) l c h / 85%);
} }
.exclude-btn:hover, .confirm-btn:hover { .exclude-btn:hover,
opacity: 0.9; .exclude-btn:focus-visible,
.confirm-btn:hover,
.confirm-btn:focus-visible {
background: oklch(from var(--lora-accent, #4f46e5) l c h / 85%); background: oklch(from var(--lora-accent, #4f46e5) l c h / 85%);
} }
@@ -121,47 +135,41 @@ body.modal-open {
font-size: 1.5em; font-size: 1.5em;
cursor: pointer; cursor: pointer;
opacity: 0.7; opacity: 0.7;
transition: opacity 0.2s; transition: opacity var(--transition-base);
z-index: 10; z-index: 10;
} }
.close:hover { .close:hover,
.close:focus-visible {
opacity: 1; opacity: 1;
outline: 2px solid var(--lora-accent);
outline-offset: 2px;
border-radius: var(--border-radius-xs);
} }
/* 统一各个 section 的样式 */ /* Unified section styles */
.support-section, .support-section,
.changelog-section, .changelog-section,
.update-info, .update-info,
.info-item, .info-item,
.path-preview { .path-preview {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-2); padding: var(--space-2);
} }
/* 深色主题统一样式 */ /* Dark theme unified styles */
[data-theme="dark"] .modal-content { [data-theme="dark"] .modal-content {
background: var(--lora-surface); background: var(--lora-surface);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
[data-theme="dark"] .support-section,
[data-theme="dark"] .changelog-section,
[data-theme="dark"] .update-info,
[data-theme="dark"] .info-item,
[data-theme="dark"] .path-preview,
[data-theme="dark"] #bulkDownloadMissingLorasModal .bulk-download-loras-preview {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--lora-border);
}
.primary-btn { .primary-btn {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
padding: 8px 16px; padding: var(--space-1) var(--space-2);
background-color: var(--lora-accent); background-color: var(--lora-accent);
color: var(--lora-text); color: var(--lora-text);
border: none; border: none;
@@ -171,9 +179,11 @@ body.modal-open {
font-size: 0.95em; 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%); background-color: oklch(from var(--lora-accent) l c h / 85%);
color: var(--lora-text); color: var(--lora-text);
outline: none;
} }
/* Secondary button styles */ /* Secondary button styles */
@@ -181,19 +191,21 @@ body.modal-open {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
padding: 8px 16px; padding: var(--space-1) var(--space-2);
background-color: var(--card-bg); background-color: var(--card-bg);
color: var (--text-color); color: var(--text-color);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: var(--transition-base);
font-size: 0.95em; font-size: 0.95em;
} }
.secondary-btn:hover { .secondary-btn:hover,
.secondary-btn:focus-visible {
background-color: var(--border-color); background-color: var(--border-color);
color: var(--text-color); color: var(--text-color);
outline: none;
} }
/* Disabled button styles */ /* Disabled button styles */
@@ -244,7 +256,7 @@ button:disabled,
display: flex; display: flex;
align-items: center; align-items: center;
gap: 8px; gap: 8px;
padding: 8px 16px; padding: var(--space-1) var(--space-2);
background-color: var(--lora-error); background-color: var(--lora-error);
color: white; color: white;
border: none; border: none;
@@ -254,25 +266,22 @@ button:disabled,
font-size: 0.95em; 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%); background-color: oklch(from var(--lora-error) l c h / 85%);
color: white; color: white;
outline: none;
} }
/* Metadata archive status styles */ /* Metadata archive status styles */
.metadata-archive-status { .metadata-archive-status {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-2); padding: var(--space-2);
margin-bottom: var(--space-2); margin-bottom: var(--space-2);
} }
[data-theme="dark"] .metadata-archive-status {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--lora-border);
}
.archive-status-item { .archive-status-item {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -312,17 +321,12 @@ button:disabled,
} }
.backup-status { .backup-status {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-3); padding: var(--space-3);
} }
[data-theme="dark"] .backup-status {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--lora-border);
}
.backup-summary-grid { .backup-summary-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
@@ -331,17 +335,12 @@ button:disabled,
} }
.backup-summary-card { .backup-summary-card {
background: rgba(255, 255, 255, 0.5); background: var(--lora-surface);
border: 1px solid rgba(0, 0, 0, 0.06); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-2); padding: var(--space-2);
} }
[data-theme="dark"] .backup-summary-card {
background: rgba(255, 255, 255, 0.02);
border-color: rgba(255, 255, 255, 0.05);
}
.backup-summary-label { .backup-summary-label {
color: var(--text-color); color: var(--text-color);
font-size: 0.85rem; font-size: 0.85rem;
@@ -404,14 +403,9 @@ button:disabled,
} }
.backup-location-details { .backup-location-details {
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
background: rgba(0, 0, 0, 0.02); background: var(--surface-subtle);
}
[data-theme="dark"] .backup-location-details {
border-color: var(--lora-border);
background: rgba(255, 255, 255, 0.02);
} }
.backup-location-details summary { .backup-location-details summary {
@@ -442,16 +436,12 @@ button:disabled,
max-width: 100%; max-width: 100%;
padding: 6px 8px; padding: 6px 8px;
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
background: rgba(0, 0, 0, 0.05); background: var(--surface-subtle);
color: var(--text-color); color: var(--text-color);
overflow-wrap: anywhere; overflow-wrap: anywhere;
word-break: break-word; word-break: break-word;
} }
[data-theme="dark"] .backup-location-path {
background: rgba(255, 255, 255, 0.05);
}
@media (max-width: 768px) { @media (max-width: 768px) {
.backup-status-row { .backup-status-row {
grid-template-columns: 1fr; grid-template-columns: 1fr;
@@ -519,8 +509,8 @@ button:disabled,
} }
#bulkDownloadMissingLorasModal .bulk-download-loras-preview { #bulkDownloadMissingLorasModal .bulk-download-loras-preview {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-3); padding: var(--space-3);
margin-bottom: var(--space-3); margin-bottom: var(--space-3);
@@ -578,7 +568,7 @@ button:disabled,
align-items: flex-start; align-items: flex-start;
gap: var(--space-2); gap: var(--space-2);
padding: var(--space-2); padding: var(--space-2);
background: rgba(59, 130, 246, 0.1); background: oklch(from var(--lora-accent) l c h / 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
font-size: 0.9em; font-size: 0.9em;
color: var(--text-color); color: var(--text-color);

View File

@@ -51,7 +51,7 @@
background: var(--lora-surface); background: var(--lora-surface);
padding: 2px 6px; padding: 2px 6px;
border-radius: 3px; border-radius: 3px;
font-family: monospace; font-family: var(--font-mono);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }

View File

@@ -48,8 +48,7 @@
padding: var(--space-3); padding: var(--space-3);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03);
} }
.doctor-kicker { .doctor-kicker {
@@ -128,7 +127,7 @@
.doctor-issue-card { .doctor-issue-card {
border: 1px solid rgba(0, 0, 0, 0.1); 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); border-radius: var(--border-radius-sm);
padding: var(--space-3); padding: var(--space-3);
box-shadow: none; box-shadow: none;
@@ -242,7 +241,7 @@
[data-theme="dark"] .doctor-hero, [data-theme="dark"] .doctor-hero,
[data-theme="dark"] .doctor-issue-card { [data-theme="dark"] .doctor-issue-card {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border-color: var(--lora-border); border-color: var(--lora-border);
box-shadow: none; box-shadow: none;
} }

View File

@@ -37,7 +37,7 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
background: var(--bg-color); background: var(--bg-color);
margin: 1px; margin: 1px;
position: relative; position: relative;
@@ -45,7 +45,7 @@
.version-item:hover { .version-item:hover {
border-color: var(--lora-accent); border-color: var(--lora-accent);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
z-index: 1; z-index: 1;
} }
@@ -156,7 +156,7 @@
background: var(--bg-color); background: var(--bg-color);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -225,7 +225,7 @@
padding: 4px 8px; padding: 4px 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
color: var(--text-color); color: var(--text-color);
opacity: 0.7; opacity: 0.7;
text-decoration: none; text-decoration: none;
@@ -272,7 +272,7 @@
padding: 4px 8px; padding: 4px 8px;
cursor: pointer; cursor: pointer;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
position: relative; position: relative;
} }
@@ -293,7 +293,7 @@
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
border-radius: 2px; border-radius: 2px;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.tree-expand-icon:hover { .tree-expand-icon:hover {
@@ -364,7 +364,7 @@
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-size: 0.8em; font-size: 0.8em;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.create-folder-form button.confirm { .create-folder-form button.confirm {
@@ -404,7 +404,7 @@
.path-display { .path-display {
padding: var(--space-1); padding: var(--space-1);
color: var(--text-color); color: var(--text-color);
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
line-height: 1.4; line-height: 1.4;
white-space: pre-wrap; white-space: pre-wrap;
@@ -453,7 +453,7 @@
right: 0; right: 0;
bottom: 0; bottom: 0;
background-color: var(--border-color); background-color: var(--border-color);
transition: all 0.3s ease; transition: var(--transition-slow);
border-radius: 18px; border-radius: 18px;
} }
@@ -465,9 +465,9 @@
left: 3px; left: 3px;
bottom: 3px; bottom: 3px;
background-color: white; background-color: white;
transition: all 0.3s ease; transition: var(--transition-slow);
border-radius: 50%; border-radius: 50%;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-xs);
} }
.inline-toggle-container .toggle-switch input:checked+.toggle-slider { .inline-toggle-container .toggle-switch input:checked+.toggle-slider {
@@ -516,7 +516,7 @@
font-size: inherit; font-size: inherit;
font-weight: 600; font-weight: 600;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
border: 1px solid oklch(var(--lora-accent) / 0.35); border: 1px solid oklch(var(--lora-accent) / 0.35);
user-select: none; user-select: none;
box-shadow: 0 1px 2px oklch(var(--lora-accent) / 0.1); box-shadow: 0 1px 2px oklch(var(--lora-accent) / 0.1);
@@ -577,13 +577,13 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
background: var(--bg-color); background: var(--bg-color);
} }
.file-option:hover { .file-option:hover {
border-color: var(--lora-accent); border-color: var(--lora-accent);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-sm);
} }
.file-option.selected { .file-option.selected {
@@ -678,12 +678,26 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
background: var(--bg-color); background: var(--bg-color);
color: var(--text-color); color: var(--text-color);
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
resize: vertical; resize: vertical;
line-height: 1.5; line-height: 1.5;
} }
.input-hint {
display: flex;
align-items: center;
gap: 6px;
color: var(--text-color);
opacity: 0.7;
font-size: 0.85em;
margin-top: 6px;
}
.input-hint i {
color: var(--lora-accent);
}
/* Batch Preview List */ /* Batch Preview List */
.batch-preview-list { .batch-preview-list {
max-height: 400px; max-height: 400px;

View File

@@ -20,12 +20,12 @@
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
background-color: var(--lora-surface); background-color: var(--lora-surface);
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: var(--transition-base);
} }
.example-option-btn:hover { .example-option-btn:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
border-color: var(--lora-accent); border-color: var(--lora-accent);
} }
@@ -68,5 +68,5 @@
/* Dark theme adjustments */ /* Dark theme adjustments */
[data-theme="dark"] .example-option-btn:hover { [data-theme="dark"] .example-option-btn:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); box-shadow: var(--shadow-elevated);
} }

View File

@@ -32,7 +32,7 @@
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-weight: 500; font-weight: 500;
transition: all 0.2s; transition: var(--transition-base);
opacity: 0.7; opacity: 0.7;
} }
@@ -150,7 +150,7 @@
margin-left: 8px; margin-left: 8px;
vertical-align: middle; vertical-align: middle;
animation: fadeIn 0.5s ease-in-out; animation: fadeIn 0.5s ease-in-out;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-sm);
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
@@ -164,7 +164,7 @@
/* Dark theme adjustments for new content badge */ /* Dark theme adjustments for new content badge */
[data-theme="dark"] .new-content-badge { [data-theme="dark"] .new-content-badge {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); box-shadow: var(--shadow-lg);
} }
/* Update video list styles */ /* Update video list styles */
@@ -210,7 +210,7 @@
margin-left: 10px; margin-left: 10px;
vertical-align: middle; vertical-align: middle;
animation: fadeIn 0.5s ease-in-out; animation: fadeIn 0.5s ease-in-out;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
.update-date-badge i { .update-date-badge i {
@@ -225,7 +225,7 @@
/* Dark theme adjustments */ /* Dark theme adjustments */
[data-theme="dark"] .update-date-badge { [data-theme="dark"] .update-date-badge {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-md);
} }
/* Privacy-friendly video embed styles */ /* Privacy-friendly video embed styles */
@@ -281,7 +281,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
font-weight: 500; font-weight: 500;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
background-color: var(--lora-accent); background-color: var(--lora-accent);
color: white; color: white;
text-decoration: none; text-decoration: none;
@@ -303,5 +303,5 @@
/* Dark theme adjustments */ /* Dark theme adjustments */
[data-theme="dark"] .video-container { [data-theme="dark"] .video-container {
background-color: rgba(255, 255, 255, 0.03); background-color: var(--surface-hover);
} }

View File

@@ -10,7 +10,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.settings-toggle:hover { .settings-toggle:hover {
@@ -81,7 +81,7 @@
font-weight: 500; font-weight: 500;
cursor: pointer; cursor: pointer;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
margin-bottom: 4px; margin-bottom: 4px;
} }
@@ -154,7 +154,7 @@
background-color: var(--lora-surface); background-color: var(--lora-surface);
color: var(--text-color); color: var(--text-color);
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.settings-search-input:focus { .settings-search-input:focus {
@@ -183,7 +183,7 @@
justify-content: center; justify-content: center;
font-size: 0.7em; font-size: 0.7em;
opacity: 0.6; opacity: 0.6;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.settings-search-clear:hover { .settings-search-clear:hover {
@@ -289,7 +289,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
text-decoration: none; text-decoration: none;
position: relative; position: relative;
} }
@@ -582,7 +582,7 @@
} }
.priority-tags-example code { .priority-tags-example code {
font-family: var(--code-font, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace); font-family: var(--font-mono);
background-color: rgba(var(--lora-accent-rgb, 79, 70, 229), 0.12); background-color: rgba(var(--lora-accent-rgb, 79, 70, 229), 0.12);
padding: 2px 6px; padding: 2px 6px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
@@ -614,7 +614,7 @@
border-bottom: 2px solid transparent; border-bottom: 2px solid transparent;
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
opacity: 0.7; opacity: 0.7;
} }
@@ -927,19 +927,19 @@ input:checked + .toggle-slider:before {
/* Path Template Settings Styles */ /* Path Template Settings Styles */
.template-preview { .template-preview {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: var(--space-1); padding: var(--space-1);
margin-top: 8px; margin-top: 8px;
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
color: var(--lora-accent); color: var(--lora-accent);
display: none; display: none;
} }
[data-theme="dark"] .template-preview { [data-theme="dark"] .template-preview {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -974,7 +974,7 @@ input:checked + .toggle-slider:before {
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
cursor: pointer; cursor: pointer;
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s; transition: var(--transition-base);
height: 32px; /* Match other control heights */ height: 32px; /* Match other control heights */
} }
@@ -1030,7 +1030,7 @@ input:checked + .toggle-slider:before {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all 0.2s; transition: var(--transition-base);
} }
.remove-mapping-btn:hover { .remove-mapping-btn:hover {
@@ -1146,7 +1146,7 @@ input:checked + .toggle-slider:before {
color: white; color: white;
padding: 2px 6px; padding: 2px 6px;
border-radius: 3px; border-radius: 3px;
font-family: monospace; font-family: var(--font-mono);
font-size: 1em; font-size: 1em;
font-weight: 500; font-weight: 500;
} }
@@ -1175,7 +1175,7 @@ input:checked + .toggle-slider:before {
background-color: var(--lora-surface); background-color: var(--lora-surface);
color: var(--text-color); color: var(--text-color);
font-size: 0.95em; font-size: 0.95em;
font-family: monospace; font-family: var(--font-mono);
height: 24px; height: 24px;
transition: border-color 0.2s; transition: border-color 0.2s;
} }
@@ -1277,7 +1277,7 @@ input:checked + .toggle-slider:before {
border-radius: 6px; border-radius: 6px;
font-size: 14px; font-size: 14px;
font-weight: normal; font-weight: normal;
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; font-family: var(--font-body);
white-space: normal; white-space: normal;
max-width: 220px; max-width: 220px;
width: max-content; width: max-content;
@@ -1287,7 +1287,7 @@ input:checked + .toggle-slider:before {
pointer-events: none; pointer-events: none;
z-index: 10000; z-index: 10000;
line-height: 1.4; line-height: 1.4;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-elevated);
text-transform: none; text-transform: none;
} }
@@ -1309,7 +1309,7 @@ input:checked + .toggle-slider:before {
/* Dark theme adjustments for tooltip - Fully opaque */ /* Dark theme adjustments for tooltip - Fully opaque */
[data-theme="dark"] .info-icon[data-tooltip]::after { [data-theme="dark"] .info-icon[data-tooltip]::after {
background: rgba(40, 40, 40, 0.95); background: rgba(40, 40, 40, 0.95);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5); box-shadow: var(--shadow-dark-lg);
} }
/* Extra Folder Paths - Single input layout */ /* Extra Folder Paths - Single input layout */
@@ -1361,7 +1361,7 @@ input:checked + .toggle-slider:before {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: all 0.2s; transition: var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
} }

View File

@@ -58,8 +58,6 @@
} }
.support-section { .support-section {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-2); padding: var(--space-2);
margin-bottom: var(--space-2); margin-bottom: var(--space-2);
@@ -102,7 +100,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
text-decoration: none; text-decoration: none;
color: var(--text-color); color: var(--text-color);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.social-link:hover { .social-link:hover {
@@ -122,14 +120,14 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
text-decoration: none; text-decoration: none;
font-weight: 500; font-weight: 500;
transition: all 0.2s ease; transition: var(--transition-base);
margin-top: var(--space-1); margin-top: var(--space-1);
} }
.kofi-button:hover { .kofi-button:hover {
background: #E04946; background: #E04946;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
/* Patreon button style */ /* Patreon button style */
@@ -144,14 +142,14 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
text-decoration: none; text-decoration: none;
font-weight: 500; font-weight: 500;
transition: all 0.2s ease; transition: var(--transition-base);
margin-top: var(--space-1); margin-top: var(--space-1);
} }
.patreon-button:hover { .patreon-button:hover {
background: #E04946; background: #E04946;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
/* QR Code section styles */ /* QR Code section styles */
@@ -191,7 +189,7 @@
max-width: 80%; max-width: 80%;
height: auto; height: auto;
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
aspect-ratio: 1/1; /* Ensure proper aspect ratio for the square QR code */ aspect-ratio: 1/1; /* Ensure proper aspect ratio for the square QR code */
} }
@@ -214,7 +212,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.support-toggle:hover { .support-toggle:hover {
@@ -258,12 +256,12 @@
color: white; /* Icon color changes to white on hover */ color: white; /* Icon color changes to white on hover */
} }
/* 增强hover状态的视觉反馈 */ /* Enhanced hover visual feedback */
.social-link:hover, .social-link:hover,
.update-link:hover, .update-link:hover,
.folder-item:hover { .folder-item:hover {
border-color: var(--lora-accent); border-color: var(--lora-accent);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
/* Supporters Section Styles */ /* Supporters Section Styles */
@@ -349,14 +347,14 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-left: 3px solid var(--lora-accent); border-left: 3px solid var(--lora-accent);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
transition: all 0.2s ease; transition: var(--transition-base);
cursor: default; cursor: default;
} }
.supporter-special-card:hover { .supporter-special-card:hover {
border-color: var(--lora-accent); border-color: var(--lora-accent);
border-left-color: var(--lora-accent); border-left-color: var(--lora-accent);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-header);
transform: translateX(4px); transform: translateX(4px);
} }
@@ -441,7 +439,7 @@
font-size: 0.95em; font-size: 0.95em;
color: var(--text-color); color: var(--text-color);
opacity: 0.85; opacity: 0.85;
transition: all 0.2s ease; transition: var(--transition-base);
white-space: nowrap; white-space: nowrap;
cursor: default; cursor: default;
} }

View File

@@ -123,7 +123,7 @@
} }
.version-number { .version-number {
font-family: monospace; font-family: var(--font-mono);
font-weight: 600; font-weight: 600;
} }
@@ -136,7 +136,7 @@
font-size: 0.85em; font-size: 0.85em;
opacity: 0.7; opacity: 0.7;
margin-top: 4px; margin-top: 4px;
font-family: monospace; font-family: var(--font-mono);
color: var(--text-color); color: var(--text-color);
} }
@@ -160,7 +160,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
text-decoration: none; text-decoration: none;
color: var(--text-color); color: var(--text-color);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.update-link:hover { .update-link:hover {
@@ -171,7 +171,7 @@
/* Update progress styles */ /* Update progress styles */
.update-progress { .update-progress {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-2); padding: var(--space-2);
@@ -179,7 +179,7 @@
} }
[data-theme="dark"] .update-progress { [data-theme="dark"] .update-progress {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
} }
.progress-info { .progress-info {
@@ -234,8 +234,6 @@
/* Changelog section */ /* Changelog section */
.changelog-section { .changelog-section {
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
padding: var(--space-3); padding: var(--space-3);
} }
@@ -334,7 +332,7 @@
background: rgba(0, 0, 0, 0.05); background: rgba(0, 0, 0, 0.05);
padding: 2px 4px; padding: 2px 4px;
border-radius: 3px; border-radius: 3px;
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
} }
@@ -429,7 +427,7 @@
} }
[data-theme="dark"] .banner-history-item { [data-theme="dark"] .banner-history-item {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
} }
.banner-history-title { .banner-history-title {

View File

@@ -7,7 +7,7 @@
background: var(--lora-surface); background: var(--lora-surface);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-toast);
z-index: calc(var(--z-modal) - 1); z-index: calc(var(--z-modal) - 1);
transition: transform 0.3s ease, opacity 0.3s ease; transition: transform 0.3s ease, opacity 0.3s ease;
opacity: 0; opacity: 0;
@@ -63,13 +63,21 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
opacity: 0.6; opacity: 0.6;
transition: all 0.2s; transition: var(--transition-base);
position: relative; position: relative;
} }
.icon-button:hover { .icon-button:hover,
opacity: 1; .icon-button:focus-visible {
background: rgba(0, 0, 0, 0.05); 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 { [data-theme="dark"] .icon-button:hover {

View File

@@ -55,7 +55,7 @@
padding: 4px 8px; padding: 4px 8px;
margin-left: 8px; margin-left: 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s; transition: var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -99,7 +99,7 @@
font-size: 0.9em; font-size: 0.9em;
} }
/* 删除不再需要的按钮样式 */ /* Remove obsolete button styles */
.editor-actions { .editor-actions {
display: none; display: none;
} }
@@ -144,7 +144,7 @@
} }
.recipe-tag-compact { .recipe-tag-compact {
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 2px 8px; padding: 2px 8px;
@@ -154,7 +154,7 @@
} }
[data-theme="dark"] .recipe-tag-compact { [data-theme="dark"] .recipe-tag-compact {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -176,14 +176,14 @@
background: var(--card-bg); background: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-dropdown);
padding: 10px 14px; padding: 10px 14px;
max-width: 400px; max-width: 400px;
z-index: 10; z-index: 10;
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
transform: translateY(-4px); transform: translateY(-4px);
transition: all 0.2s ease; transition: var(--transition-base);
pointer-events: none; pointer-events: none;
} }
@@ -203,7 +203,7 @@
} }
.tooltip-tag { .tooltip-tag {
background: rgba(0, 0, 0, 0.03); background: var(--surface-hover);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
padding: 3px 8px; padding: 3px 8px;
@@ -212,7 +212,7 @@
} }
[data-theme="dark"] .tooltip-tag { [data-theme="dark"] .tooltip-tag {
background: rgba(255, 255, 255, 0.03); background: var(--surface-hover);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -251,19 +251,19 @@
align-items: center; align-items: center;
gap: 6px; gap: 6px;
padding: 6px 12px; padding: 6px 12px;
background: rgba(0, 0, 0, 0.03); background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1); border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-weight: 500; font-weight: 500;
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s; transition: var(--transition-base);
white-space: nowrap; white-space: nowrap;
} }
[data-theme="dark"] .recipe-source-url-btn { [data-theme="dark"] .recipe-source-url-btn {
background: rgba(255, 255, 255, 0.03); background: var(--surface-subtle);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -428,7 +428,7 @@
font-size: 0.85em; font-size: 0.85em;
cursor: pointer; cursor: pointer;
border: none; border: none;
transition: all 0.2s; transition: var(--transition-base);
} }
.source-url-cancel-btn { .source-url-cancel-btn {
@@ -548,7 +548,7 @@
cursor: pointer; cursor: pointer;
padding: 4px 8px; padding: 4px 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s; transition: var(--transition-base);
} }
.copy-btn:hover, .copy-btn:hover,
@@ -705,7 +705,7 @@
cursor: pointer; cursor: pointer;
padding: 4px 8px; padding: 4px 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s; transition: var(--transition-base);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -725,7 +725,7 @@
cursor: pointer; cursor: pointer;
padding: 4px 8px; padding: 4px 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s; transition: var(--transition-base);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -797,7 +797,7 @@
.recipe-lora-item:hover { .recipe-lora-item:hover {
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-header);
border-color: var(--lora-accent); border-color: var(--lora-accent);
} }
@@ -995,7 +995,7 @@
padding: 8px 12px; padding: 8px 12px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-header);
z-index: var(--z-overlay); z-index: var(--z-overlay);
width: max-content; width: max-content;
max-width: 200px; max-width: 200px;
@@ -1049,7 +1049,7 @@
background: rgba(0, 0, 0, 0.1); background: rgba(0, 0, 0, 0.1);
padding: 2px 4px; padding: 2px 4px;
border-radius: 3px; border-radius: 3px;
font-family: monospace; font-family: var(--font-mono);
font-size: 0.9em; font-size: 0.9em;
} }
@@ -1086,7 +1086,7 @@
font-size: 0.85em; font-size: 0.85em;
cursor: pointer; cursor: pointer;
border: none; border: none;
transition: all 0.2s; transition: var(--transition-base);
} }
.reconnect-cancel-btn { .reconnect-cancel-btn {
@@ -1114,9 +1114,9 @@
color: #777; color: #777;
} }
/* 标题输入框特定的样式 */ /* Title input specific styles */
.title-input { .title-input {
font-size: 1.2em !important; /* 调整为更合适的大小 */ font-size: 1.2em;
line-height: 1.2; line-height: 1.2;
font-weight: 500; font-weight: 500;
} }
@@ -1251,7 +1251,7 @@
padding: 8px 12px; padding: 8px 12px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-header);
z-index: var(--z-overlay); z-index: var(--z-overlay);
width: max-content; width: max-content;
max-width: 200px; max-width: 200px;

View File

@@ -7,7 +7,7 @@
gap: 4px; gap: 4px;
} }
/* 调整搜索框样式以匹配其他控件 */ /* Match search input styles to other controls */
.search-container input { .search-container input {
width: 100%; width: 100%;
padding: 6px 35px 6px 12px; /* Reduced right padding */ padding: 6px 35px 6px 12px; /* Reduced right padding */
@@ -35,7 +35,7 @@
line-height: 1; line-height: 1;
} }
/* 修改清空按钮样式 */ /* Clear button styles */
.search-clear { .search-clear {
position: absolute; position: absolute;
right: 105px; /* Adjusted further left to avoid overlapping */ right: 105px; /* Adjusted further left to avoid overlapping */
@@ -71,7 +71,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base), border-color var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
} }
@@ -103,7 +103,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: background-color var(--transition-base), color var(--transition-base), border-color var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
position: relative; position: relative;
} }
@@ -149,7 +149,7 @@
background-color: var(--card-bg); background-color: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
z-index: var(--z-overlay); z-index: var(--z-overlay);
padding: 16px; padding: 16px;
transition: transform 0.3s ease, opacity 0.3s ease; transition: transform 0.3s ease, opacity 0.3s ease;
@@ -243,7 +243,7 @@
color: var(--text-color); color: var(--text-color);
font-size: 14px; font-size: 14px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
user-select: none; /* Prevent text selection */ user-select: none; /* Prevent text selection */
-webkit-user-select: none; /* For Safari */ -webkit-user-select: none; /* For Safari */
-moz-user-select: none; /* For Firefox */ -moz-user-select: none; /* For Firefox */
@@ -373,7 +373,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
flex-shrink: 0; flex-shrink: 0;
} }
@@ -402,7 +402,7 @@
background-color: var(--card-bg); background-color: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
z-index: var(--z-overlay); z-index: var(--z-overlay);
padding: 16px; padding: 16px;
transition: transform 0.3s ease, opacity 0.3s ease; transition: transform 0.3s ease, opacity 0.3s ease;
@@ -470,7 +470,7 @@
color: var(--text-color); color: var(--text-color);
font-size: 13px; /* Slightly smaller font size */ font-size: 13px; /* Slightly smaller font size */
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
user-select: none; user-select: none;
flex: 1; flex: 1;
text-align: center; text-align: center;
@@ -516,7 +516,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
background-color: var(--lora-surface); background-color: var(--lora-surface);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
transition: all 0.2s ease; transition: var(--transition-base);
cursor: pointer; cursor: pointer;
} }
@@ -574,7 +574,7 @@
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 11px; font-size: 11px;
transition: all 0.2s ease; transition: var(--transition-base);
margin-left: auto; margin-left: auto;
} }
@@ -599,7 +599,7 @@
font-size: 14px; font-size: 14px;
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
cursor: pointer; cursor: pointer;
transition: all 0.25s ease; transition: var(--transition-base);
} }
/* Enabled state - visual cue that button is actionable */ /* Enabled state - visual cue that button is actionable */
@@ -726,7 +726,7 @@
cursor: pointer; cursor: pointer;
color: var(--text-color); color: var(--text-color);
opacity: 0.7; opacity: 0.7;
transition: all 0.2s ease; transition: var(--transition-base);
font-weight: 500; font-weight: 500;
} }

View File

@@ -78,7 +78,7 @@
color: var(--text-color); color: var(--text-color);
white-space: normal; white-space: normal;
word-break: break-all; word-break: break-all;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-header);
z-index: 100; /* Higher z-index to ensure it's above other elements */ z-index: 100; /* Higher z-index to ensure it's above other elements */
min-width: 300px; min-width: 300px;
max-width: 300px; max-width: 300px;
@@ -107,7 +107,7 @@
color: var(--text-color); color: var(--text-color);
white-space: normal; white-space: normal;
word-break: break-all; word-break: break-all;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-header);
z-index: 100; /* Higher z-index to ensure it's above other elements */ z-index: 100; /* Higher z-index to ensure it's above other elements */
min-width: 200px; min-width: 200px;
max-width: 300px; max-width: 300px;

View File

@@ -10,7 +10,7 @@
cursor: pointer; cursor: pointer;
padding: 2px 5px; padding: 2px 5px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.metadata-edit-btn:hover { .metadata-edit-btn:hover {
@@ -31,7 +31,7 @@
/* Edit Container */ /* Edit Container */
.metadata-edit-container { .metadata-edit-container {
padding: var(--space-2); 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: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
margin-top: var(--space-2); margin-top: var(--space-2);
@@ -42,7 +42,7 @@
} }
[data-theme="dark"] .metadata-edit-container { [data-theme="dark"] .metadata-edit-container {
background: rgba(255, 255, 255, 0.03); background: var(--surface-hover);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);
} }
@@ -101,7 +101,7 @@
} }
.metadata-item-dragging { .metadata-item-dragging {
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.25); box-shadow: var(--shadow-dialog);
cursor: grabbing; cursor: grabbing;
opacity: 0.95; opacity: 0.95;
transition: none; transition: none;
@@ -178,7 +178,7 @@ body.metadata-drag-active * {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 4px; gap: 4px;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.metadata-edit-controls button:hover { .metadata-edit-controls button:hover {
@@ -257,7 +257,7 @@ body.metadata-drag-active * {
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
margin-top: 4px; margin-top: 4px;
z-index: 100; z-index: 100;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-elevated);
overflow: hidden; overflow: hidden;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -299,7 +299,7 @@ body.metadata-drag-active * {
justify-content: space-between; justify-content: space-between;
padding: 5px 10px; padding: 5px 10px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
background: var(--lora-surface); background: var(--lora-surface);
border: 1px solid var(--lora-border); border: 1px solid var(--lora-border);

View File

@@ -8,10 +8,10 @@
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
overflow: hidden; overflow: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); transition: var(--transition-slow);
flex-shrink: 0; flex-shrink: 0;
z-index: var(--z-overlay); z-index: var(--z-overlay);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-header);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
backdrop-filter: blur(8px); backdrop-filter: blur(8px);
@@ -83,7 +83,7 @@
flex-shrink: 0; flex-shrink: 0;
border-bottom: 1px solid var(--border-color); border-bottom: 1px solid var(--border-color);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.sidebar-header:hover { .sidebar-header:hover {
@@ -120,7 +120,7 @@
padding: 4px; padding: 4px;
border-radius: 4px; border-radius: 4px;
opacity: 0.6; opacity: 0.6;
transition: all 0.2s ease; transition: var(--transition-base);
width: 24px; width: 24px;
height: 24px; height: 24px;
display: flex; display: flex;
@@ -174,7 +174,7 @@
align-items: center; align-items: center;
padding: 8px 16px; padding: 8px 16px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
font-size: 0.85em; font-size: 0.85em;
border-left: 3px solid transparent; border-left: 3px solid transparent;
color: var(--text-color); color: var(--text-color);
@@ -298,7 +298,7 @@
padding: 4px 8px; padding: 4px 8px;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
color: var(--text-muted); color: var(--text-muted);
position: relative; position: relative;
} }
@@ -331,7 +331,7 @@
margin-left: 6px; margin-left: 6px;
color: inherit; color: inherit;
opacity: 0.6; opacity: 0.6;
transition: all 0.2s ease; transition: var(--transition-base);
pointer-events: none; pointer-events: none;
font-size: 0.9em; font-size: 0.9em;
} }
@@ -364,7 +364,7 @@
background: var(--bg-color); background: var(--bg-color);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
box-shadow: 0 3px 8px rgba(0,0,0,0.15); box-shadow: var(--shadow-lg);
z-index: calc(var(--z-overlay) + 20); z-index: calc(var(--z-overlay) + 20);
overflow-y: auto; overflow-y: auto;
max-height: 450px; max-height: 450px;
@@ -382,7 +382,7 @@
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.breadcrumb-dropdown-item:hover { .breadcrumb-dropdown-item:hover {
@@ -406,7 +406,7 @@
align-items: center; align-items: center;
padding: 8px 16px; padding: 8px 16px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
font-size: 0.85em; font-size: 0.85em;
border-left: 3px solid transparent; border-left: 3px solid transparent;
color: var(--text-color); color: var(--text-color);
@@ -614,7 +614,7 @@
background: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.08); background: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.08);
opacity: 0; opacity: 0;
transform: translateY(10px); transform: translateY(10px);
transition: all 0.2s ease; transition: var(--transition-base);
pointer-events: none; pointer-events: none;
z-index: 10; z-index: 10;
} }
@@ -649,7 +649,7 @@
background: var(--bg-color); background: var(--bg-color);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-lg);
z-index: 20; z-index: 20;
animation: slideUp 0.2s ease; animation: slideUp 0.2s ease;
} }
@@ -685,7 +685,7 @@
color: var(--text-color); color: var(--text-color);
font-size: 0.85em; font-size: 0.85em;
outline: none; outline: none;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.sidebar-create-folder-input:focus { .sidebar-create-folder-input:focus {
@@ -702,24 +702,30 @@
border: none; border: none;
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
background: transparent; background: transparent;
color: var(--text-muted); color: var(--text-muted);
} }
.sidebar-create-folder-btn:hover { .sidebar-create-folder-btn:hover,
.sidebar-create-folder-btn:focus-visible {
background: var(--lora-surface); background: var(--lora-surface);
color: var(--text-color); 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); background: oklch(from var(--success-color) l c h / 0.15);
color: var(--success-color); 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); background: oklch(from var(--error-color) l c h / 0.15);
color: var(--error-color); color: var(--error-color);
outline: none;
} }
.sidebar-create-folder-hint { .sidebar-create-folder-hint {

View File

@@ -17,13 +17,13 @@
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
padding: var(--space-2); padding: var(--space-2);
text-align: center; text-align: center;
transition: all 0.3s ease; transition: var(--transition-slow);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.metric-card:hover { .metric-card:hover {
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-elevated);
} }
.metric-card .metric-icon { .metric-card .metric-icon {
@@ -95,7 +95,7 @@
border: none; border: none;
padding: var(--space-2) var(--space-3); padding: var(--space-2) var(--space-3);
cursor: pointer; cursor: pointer;
transition: all 0.3s ease; transition: var(--transition-slow);
color: var(--text-color); color: var(--text-color);
border-bottom: 3px solid transparent; border-bottom: 3px solid transparent;
white-space: nowrap; white-space: nowrap;
@@ -208,7 +208,7 @@
background: var(--card-bg); background: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.model-item:hover { .model-item:hover {
@@ -270,7 +270,7 @@
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
font-size: 0.8rem; font-size: 0.8rem;
border: 1px solid oklch(var(--lora-accent) / 0.2); border: 1px solid oklch(var(--lora-accent) / 0.2);
transition: all 0.2s ease; transition: var(--transition-base);
cursor: pointer; cursor: pointer;
} }
@@ -349,12 +349,12 @@
padding: var(--space-2); padding: var(--space-2);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
transition: all 0.3s ease; transition: var(--transition-slow);
} }
.insight-card:hover { .insight-card:hover {
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-md);
} }
.insight-card.type-success { .insight-card.type-success {
@@ -428,7 +428,7 @@
background: var(--card-bg); background: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
transition: all 0.2s ease; transition: var(--transition-base);
} }
.recommendation-item:hover { .recommendation-item:hover {
@@ -534,9 +534,9 @@
} }
[data-theme="dark"] .metric-card { [data-theme="dark"] .metric-card {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-md);
} }
[data-theme="dark"] .metric-card:hover { [data-theme="dark"] .metric-card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); box-shadow: var(--shadow-dark-lg);
} }

View File

@@ -15,18 +15,18 @@
/* Toast Notifications */ /* Toast Notifications */
.toast { .toast {
position: fixed; position: fixed;
top: 20px; /* 改为从顶部显示 */ top: 20px;
right: 20px; /* 改为右对齐 */ right: 20px;
left: auto; /* 移除左对齐 */ left: auto;
transform: translateX(120%); /* 初始位置在屏幕右侧外 */ transform: translateX(120%);
min-width: 300px; /* 设置最小宽度 */ min-width: 300px;
max-width: 400px; /* 设置最大宽度 */ max-width: 400px;
background: var(--lora-surface); background: var(--lora-surface);
color: var(--text-color); color: var(--text-color);
padding: 12px 16px; padding: 12px 16px;
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2); box-shadow: var(--shadow-toast);
z-index: calc(var(--z-overlay) + 10); /* 让toast显示在最上层 */ z-index: calc(var(--z-overlay) + 10);
opacity: 0; opacity: 0;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
opacity 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 { .toast.show {
transform: translateX(0); /* 显示时滑入到正确位置 */ transform: translateX(0);
opacity: 1; opacity: 1;
} }
/* 添加图标容器 */
.toast::before { .toast::before {
content: ''; content: '';
width: 20px; width: 20px;
@@ -51,7 +50,7 @@
background-size: contain; background-size: contain;
} }
/* 不同类型的toast样式 */ /* Toast type variants */
.toast-success { .toast-success {
border-left: 4px solid oklch(65% 0.2 142); 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"); 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 { .toast + .toast {
margin-top: 10px; margin-top: 10px;
} }
/* 响应式调整 */ /* Responsive adjustments */
@media (max-width: 768px) { @media (max-width: 768px) {
.toast { .toast {
width: calc(100% - 40px); /* 左右各留20px间距 */ width: calc(100% - 40px);
max-width: none; max-width: none;
right: 20px; right: 20px;
} }

View File

@@ -10,7 +10,7 @@
.container { .container {
max-width: 1400px; max-width: 1400px;
margin: 0 auto; margin: 0 auto;
padding: 0 15px; padding: 0 var(--space-2);
position: relative; position: relative;
z-index: var(--z-base); z-index: var(--z-base);
} }
@@ -22,7 +22,7 @@
z-index: calc(var(--z-header) - 1); z-index: calc(var(--z-header) - 1);
background: var(--bg-color); background: var(--bg-color);
padding: var(--space-1) 0; padding: var(--space-1) 0;
box-shadow: 0 1px 3px rgba(0,0,0,0.05); box-shadow: var(--shadow-xs);
} }
/* Responsive container for larger screens */ /* Responsive container for larger screens */
@@ -78,21 +78,23 @@
background: var(--card-bg); background: var(--card-bg);
color: var(--text-color); color: var(--text-color);
font-size: 0.85em; font-size: 0.85em;
transition: all 0.2s ease; transition: var(--transition-base);
cursor: pointer; cursor: pointer;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-xs);
} }
.control-group button:hover { .control-group button:hover,
.control-group button:focus-visible {
border-color: var(--lora-accent); border-color: var(--lora-accent);
background: var(--bg-color); background: var(--bg-color);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-lg);
outline: none;
} }
.control-group button:active { .control-group button:active {
transform: translateY(0); transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-xs);
} }
.control-group button i { .control-group button i {
@@ -100,7 +102,8 @@
transition: opacity 0.2s ease; transition: opacity 0.2s ease;
} }
.control-group button:hover i { .control-group button:hover i,
.control-group button:focus-visible i {
opacity: 1; opacity: 1;
} }
@@ -131,7 +134,7 @@
.control-group button.favorite-filter i { .control-group button.favorite-filter i {
margin-right: 4px; margin-right: 4px;
color: #ffc107; color: var(--favorite-color);
} }
.control-group button.update-filter i { .control-group button.update-filter i {
@@ -183,7 +186,7 @@
color: var(--shortcut-text); color: var(--shortcut-text);
vertical-align: middle; vertical-align: middle;
opacity: 0.8; opacity: 0.8;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.control-group button:hover .shortcut-key { .control-group button:hover .shortcut-key {
@@ -219,8 +222,8 @@
background-position: right 6px center; background-position: right 6px center;
background-size: 14px; background-size: 14px;
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: var(--shadow-xs);
} }
/* Style for optgroups */ /* Style for optgroups */
@@ -252,7 +255,7 @@
border-color: var(--lora-accent); border-color: var(--lora-accent);
background-color: var(--bg-color); background-color: var(--bg-color);
transform: translateY(-1px); transform: translateY(-1px);
box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08); box-shadow: var(--shadow-lg);
} }
.control-group select:focus { .control-group select:focus {
@@ -292,9 +295,9 @@
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
transform: translateY(10px); transform: translateY(10px);
transition: all 0.3s ease; transition: var(--transition-slow);
z-index: var(--z-overlay); z-index: var(--z-overlay);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); box-shadow: var(--shadow-sm);
} }
.back-to-top.visible { .back-to-top.visible {
@@ -307,7 +310,7 @@
background: var(--lora-accent); background: var(--lora-accent);
color: white; color: white;
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); box-shadow: var(--shadow-md);
} }
/* Prevent text selection in control and header areas */ /* Prevent text selection in control and header areas */
@@ -336,7 +339,7 @@
.dropdown-main { .dropdown-main {
border-top-right-radius: 0; border-top-right-radius: 0;
border-bottom-right-radius: 0; border-bottom-right-radius: 0;
border-right: 1px solid rgba(0, 0, 0, 0.1); border-right: 1px solid var(--border-color);
} }
.dropdown-toggle { .dropdown-toggle {
@@ -364,7 +367,7 @@
background-color: var(--card-bg); background-color: var(--card-bg);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
border-radius: var(--border-radius-xs); border-radius: var(--border-radius-xs);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: var(--shadow-xl);
} }
.dropdown-group.active .dropdown-menu { .dropdown-group.active .dropdown-menu {

View File

@@ -24,7 +24,7 @@
border-radius: var(--border-radius-base); border-radius: var(--border-radius-base);
z-index: calc(var(--z-overlay) + 1); z-index: calc(var(--z-overlay) + 1);
pointer-events: none; pointer-events: none;
transition: all 0.3s ease; transition: var(--transition-slow);
/* Add glow effect */ /* Add glow effect */
box-shadow: box-shadow:
0 0 0 2px rgba(24, 144, 255, 0.3), 0 0 0 2px rgba(24, 144, 255, 0.3),
@@ -53,7 +53,7 @@
min-width: 320px; min-width: 320px;
max-width: 400px; max-width: 400px;
z-index: calc(var(--z-overlay) + 3); z-index: calc(var(--z-overlay) + 3);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); box-shadow: var(--shadow-2xl);
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
} }
@@ -98,7 +98,7 @@
color: var(--text-color); color: var(--text-color);
cursor: pointer; cursor: pointer;
font-size: 0.9em; font-size: 0.9em;
transition: all 0.2s ease; transition: var(--transition-base);
} }
.onboarding-btn:hover { .onboarding-btn:hover {
@@ -138,7 +138,7 @@
padding: var(--space-3); padding: var(--space-3);
min-width: 510px; min-width: 510px;
text-align: center; text-align: center;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); box-shadow: var(--shadow-dark-lg);
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
} }
@@ -167,7 +167,7 @@
border-radius: var(--border-radius-sm); border-radius: var(--border-radius-sm);
background: var(--card-bg); background: var(--card-bg);
cursor: pointer; cursor: pointer;
transition: all 0.2s ease; transition: var(--transition-base);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;

View File

@@ -54,7 +54,7 @@
text-align: center; text-align: center;
} }
/* 使用已有的loading-spinner样式 */ /* Reuse existing loading-spinner styles */
.initialization-notice .loading-spinner { .initialization-notice .loading-spinner {
margin-bottom: var(--space-2); margin-bottom: var(--space-2);
} }

View File

@@ -0,0 +1,142 @@
# Lora-Manager UI Token Migration Guide
## Overview
The design token system has been created in `static/css/tokens/`. `base.css` now imports the tokens and provides backward-compatible aliases for existing component CSS.
## Token Files
| File | Purpose |
|------|---------|
| `tokens/colors.css` | OKLch color primitives + semantic light/dark tokens |
| `tokens/typography.css` | Font stacks, type scale, weights, line heights |
| `tokens/spacing.css` | 4px-base grid with legacy aliases |
| `tokens/effects.css` | Border radius, shadows, transitions |
| `tokens/breakpoints.css` | Named breakpoint variables |
| `tokens/z-index.css` | Stacking context scale |
| `tokens/index.css` | Aggregator that imports all token files |
## Backward Compatibility
Old variable names in component CSS still work via aliases in `base.css`:
| Old Name | Maps To |
|----------|---------|
| `--bg-color` | `--bg-base` |
| `--text-color` | `--text-primary` |
| `--text-muted` | `--text-secondary` |
| `--card-bg` | `--surface-base` |
| `--border-color` | `--border-base` |
| `--lora-accent` | `--color-accent` |
| `--lora-surface` | `--bg-elevated` |
| `--lora-border` | `--border-subtle` |
| `--space-1` (8px) | `--space-1-legacy` |
| `--border-radius-base` | `--radius-lg` |
## Phase 2: Component Audit Checklist
Below are the hardcoded values found across component CSS that should be replaced with tokens.
### Critical Fixes (P0)
- [ ] **card.css line 441**: `.base-model { background: #f0f0f0; }` → use `--bg-hover` or new `--surface-variant`
- [ ] **card.css line 369**: `.favorite-active { color: #ffc107 !important; }` → use `--favorite-color` (already defined in tokens)
- [ ] **layout.css line 134**: `.control-group button.favorite-filter i { color: #ffc107; }` → use `--favorite-color`
- [ ] **header.css lines 233-250**: Hardcoded dark theme colors (`#3a3a3a`, `#888888`, `#555555`) → use `--bg-disabled`, `--text-secondary`, `--border-base`
### Spacing Normalization (P1)
Replace hard pixel values with token equivalents:
- [ ] `padding: 4px 10px``padding: var(--space-1) var(--space-3)`
- [ ] `gap: 6px``gap: var(--space-1-legacy)` or `gap: var(--space-2)`
- [ ] `gap: 8px``gap: var(--space-2)`
- [ ] `gap: 12px``gap: var(--space-3)`
- [ ] `padding: 15px``padding: var(--space-4)`
- [ ] `padding: 16px``padding: var(--space-4)`
- [ ] `margin-top: 2px``margin-top: var(--space-0-5)`
- [ ] `padding: 2px 6px``padding: var(--space-0-5) var(--space-2)`
- [ ] `border-radius: 50%``border-radius: var(--radius-full)`
### Shadow Standardization (P1)
Replace hardcoded shadows with token equivalents:
- [ ] `box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05)``box-shadow: var(--shadow-xs)`
- [ ] `box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05)``box-shadow: var(--shadow-sm)`
- [ ] `box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1)``box-shadow: var(--shadow-md)`
- [ ] `box-shadow: 0 3px 5px rgba(0, 0, 0, 0.08)``box-shadow: var(--shadow-lg)`
- [ ] `box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15)``box-shadow: var(--shadow-xl)`
- [ ] `box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08)` → combine or add new token
### Typography Normalization (P1)
Replace scattered font sizes with type scale:
- [ ] `font-size: 0.8em``font-size: var(--text-xs)`
- [ ] `font-size: 0.85em``font-size: var(--text-sm)`
- [ ] `font-size: 0.9em``font-size: var(--text-sm)`
- [ ] `font-size: 0.95em``font-size: var(--text-md)`
- [ ] `font-size: 1.1em``font-size: var(--text-lg)`
- [ ] `font-size: 11px``font-size: var(--text-xs)`
### Breakpoint Normalization (P2)
Replace magic numbers with named breakpoints:
- [ ] `@media (min-width: 2150px)``@media (min-width: var(--bp-ultrawide))`
- [ ] `@media (min-width: 3000px)``@media (min-width: var(--bp-4k))`
- [ ] `@media (max-width: 768px)``@media (max-width: var(--bp-mobile))`
- [ ] `@media (max-width: 1200px)``@media (max-width: var(--bp-desktop))`
### Z-Index Cleanup (P2)
Replace magic z-index values with tokens:
- [ ] `z-index: 2` / `z-index: 3` / `z-index: 4` in card.css → use `--z-base` + calc
- [ ] `z-index: 200` in header.css (hamburger dropdown) → use `--z-dropdown`
### Remaining Hardcoded Colors (P2)
- [ ] `rgba(0, 184, 122, 0.05)` and `#00B87A` in import-modal.css → use `--color-success`
- [ ] `rgba(255, 255, 255, 0.12)` in card.css (base-model-label background) → use token
- [ ] `rgba(255, 255, 255, 0.25)` in card.css (separator) → use `--border-inverse`
- [ ] `rgba(0, 0, 0, 0.5)` and `rgba(0, 0, 0, 0.7)` in card.css (toggle blur btn) → use `--bg-overlay` variants
- [ ] `rgba(46, 204, 113, 0.3)` and `rgba(231, 76, 60, 0.3)` in card.css → use success/error tokens
## New Tokens Added
The following tokens were added beyond the existing system:
| Token | Value | Use Case |
|-------|-------|----------|
| `--color-accent-hover` | oklch(58% 0.28 256) | Hover states for accent buttons |
| `--color-accent-subtle` | accent @ 12% opacity | Subtle accent backgrounds |
| `--color-accent-border` | accent @ 25% opacity | Accent borders |
| `--color-accent-transparent` | accent @ 60% opacity | Glow effects, pulse animations |
| `--bg-hover` | oklch(95% 0.02 256) / dark: oklch(35% 0.02 256) | Hover backgrounds |
| `--bg-disabled` | #f5f5f5 / dark: #3a3a3a | Disabled input backgrounds |
| `--bg-overlay` | oklch(0% 0 0 / 0.75) | Modal overlays, gradients |
| `--surface-hover` | oklch(95% 0.02 256) / dark: oklch(35% 0.02 256) | Card/panel hover |
| `--favorite-color` | #d4a017 | Accessible gold for favorites |
| `--shadow-focus` | 0 0 0 1px accent | Focus ring shadow |
| `--shadow-glow` | 0 2px 6px info-glow | Badge glow effects |
| `--transition-bounce` | 200ms cubic-bezier | Playful hover transitions |
## Migration Order Recommendation
1. **Start with colors**: Replace `#ffc107` and `#f0f0f0` (highest visual impact)
2. **Then spacing**: Unify padding/gap values (biggest consistency win)
3. **Then shadows**: Replace rgba shadows with tokens
4. **Then typography**: Standardize font sizes
5. **Finally breakpoints + z-index**: Lower priority but good for maintainability
## Testing Checklist
After each component file is migrated:
- [ ] Light theme renders correctly
- [ ] Dark theme renders correctly
- [ ] No visual regressions in card grid, header, modals
- [ ] Focus states still visible
- [ ] Hover transitions still work (unless prefers-reduced-motion)

View File

@@ -0,0 +1,8 @@
:root {
--bp-mobile: 768px;
--bp-tablet: 1024px;
--bp-desktop: 1400px;
--bp-wide: 1920px;
--bp-ultrawide: 2150px;
--bp-4k: 3000px;
}

View File

@@ -0,0 +1,117 @@
:root {
--color-accent-l: 68%;
--color-accent-c: 0.28;
--color-accent-h: 256;
--color-warning-l: 75%;
--color-warning-c: 0.25;
--color-warning-h: 80;
--color-success-l: 70%;
--color-success-c: 0.2;
--color-success-h: 140;
--color-error-l: 75%;
--color-error-c: 0.32;
--color-error-h: 29;
--color-info-l: 72%;
--color-info-c: 0.2;
--color-info-h: 220;
--color-neutral-h: 250;
}
:root {
--color-accent: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h));
--color-accent-hover: oklch(58% var(--color-accent-c) var(--color-accent-h));
--color-accent-subtle: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.12);
--color-accent-border: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.25);
--color-accent-transparent: oklch(var(--color-accent-l) var(--color-accent-c) var(--color-accent-h) / 0.6);
--color-warning: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h));
--color-warning-bg: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h) / 0.15);
--color-warning-border: oklch(var(--color-warning-l) var(--color-warning-c) var(--color-warning-h) / 0.3);
--color-success: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h));
--color-success-bg: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h) / 0.2);
--color-success-border: oklch(var(--color-success-l) var(--color-success-c) var(--color-success-h) / 0.3);
--color-error: oklch(var(--color-error-l) var(--color-error-c) var(--color-error-h));
--color-error-bg: color-mix(in oklch, var(--color-error) 20%, transparent);
--color-error-border: color-mix(in oklch, var(--color-error) 50%, transparent);
--color-info: oklch(var(--color-info-l) var(--color-info-c) var(--color-info-h));
--color-info-bg: oklch(72% 0.2 220);
--color-info-text: oklch(28% 0.03 220);
--color-info-glow: oklch(72% 0.2 220 / 0.28);
--color-skip-refresh-bg: oklch(82% 0.12 45);
--color-skip-refresh-text: oklch(35% 0.02 45);
--color-skip-refresh-glow: oklch(82% 0.12 45 / 0.15);
}
:root {
--bg-base: #ffffff;
--bg-elevated: oklch(97% 0 0 / 0.95);
--bg-overlay: oklch(0% 0 0 / 0.75);
--bg-hover: oklch(95% 0.02 256);
--bg-disabled: #f5f5f5;
--text-primary: #333333;
--text-secondary: #6c757d;
--text-inverse: #ffffff;
--text-muted-on-dark: rgba(255, 255, 255, 0.8);
--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);
--border-inverse: rgba(255, 255, 255, 0.25);
--status-success-text: oklch(75% 0.12 230);
--status-success-bg: oklch(55% 0.15 240 / 0.25);
--status-success-border: oklch(60% 0.18 250 / 0.3);
--status-info-text: oklch(78% 0.10 185);
--status-info-bg: oklch(50% 0.10 190 / 0.25);
--status-info-border: oklch(55% 0.12 195 / 0.3);
--favorite-color: #d4a017;
--favorite-glow: oklch(65% 0.15 85 / 0.5);
}
[data-theme="dark"] {
--bg-base: #1a1a1a;
--bg-elevated: oklch(25% 0.02 256 / 0.98);
--bg-overlay: oklch(0% 0 0 / 0.75);
--bg-hover: oklch(35% 0.02 256);
--bg-disabled: #3a3a3a;
--text-primary: #e0e0e0;
--text-secondary: #a0a0a0;
--text-inverse: #1a1a1a;
--text-muted-on-dark: rgba(255, 255, 255, 0.8);
--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);
--border-inverse: rgba(255, 255, 255, 0.25);
--status-success-text: oklch(75% 0.12 230);
--status-success-bg: oklch(55% 0.15 240 / 0.25);
--status-success-border: oklch(60% 0.18 250 / 0.3);
--status-info-text: oklch(78% 0.10 185);
--status-info-bg: oklch(50% 0.10 190 / 0.25);
--status-info-border: oklch(55% 0.12 195 / 0.3);
--color-info-bg: oklch(62% 0.18 220);
--color-info-text: oklch(98% 0.02 240);
--color-info-glow: oklch(62% 0.18 220 / 0.4);
--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;
}

View File

@@ -0,0 +1,57 @@
:root {
--radius-none: 0px;
--radius-xs: 4px;
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--radius-full: 9999px;
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.05);
--shadow-md: 0 2px 4px rgba(0, 0, 0, 0.1);
--shadow-lg: 0 3px 5px rgba(0, 0, 0, 0.08);
--shadow-xl: 0 4px 16px rgba(0, 0, 0, 0.15);
--shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.12);
--shadow-focus: 0 0 0 1px var(--color-accent);
--shadow-glow: 0 2px 6px var(--color-info-glow);
--shadow-card: var(--shadow-sm);
--shadow-dropdown: var(--shadow-md);
--shadow-modal: var(--shadow-lg);
--shadow-toast: var(--shadow-xl);
--shadow-header: 0 2px 8px rgba(0, 0, 0, 0.08);
--shadow-dark-lg: 0 4px 24px rgba(0, 0, 0, 0.4);
--shadow-side: 2px 0 8px rgba(0, 0, 0, 0.1);
--shadow-elevated: 0 4px 12px rgba(0, 0, 0, 0.15);
--shadow-dialog: 0 10px 24px rgba(0, 0, 0, 0.25);
--shadow-inset-top: 0 -2px 8px rgba(0, 0, 0, 0.1);
--transition-fast: 150ms ease;
--transition-base: 200ms ease;
--transition-slow: 300ms ease;
--transition-bounce: 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
--border-width-thin: 1px;
--border-width-thick: 2px;
}
[data-theme="dark"] {
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.25);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25);
--shadow-md: 0 2px 4px rgba(0, 0, 0, 0.35);
--shadow-lg: 0 3px 5px rgba(0, 0, 0, 0.3);
--shadow-xl: 0 4px 16px rgba(0, 0, 0, 0.45);
--shadow-2xl: 0 8px 32px rgba(0, 0, 0, 0.35);
--shadow-card: var(--shadow-sm);
--shadow-dropdown: var(--shadow-md);
--shadow-modal: var(--shadow-lg);
--shadow-toast: var(--shadow-xl);
--shadow-header: 0 2px 8px rgba(0, 0, 0, 0.3);
--shadow-dark-lg: 0 4px 24px rgba(0, 0, 0, 0.6);
--shadow-side: 2px 0 8px rgba(0, 0, 0, 0.3);
--shadow-elevated: 0 4px 12px rgba(0, 0, 0, 0.35);
--shadow-dialog: 0 10px 24px rgba(0, 0, 0, 0.45);
--shadow-inset-top: 0 -2px 8px rgba(0, 0, 0, 0.3);
}

View File

@@ -0,0 +1,6 @@
@import 'colors.css';
@import 'typography.css';
@import 'spacing.css';
@import 'effects.css';
@import 'breakpoints.css';
@import 'z-index.css';

View File

@@ -0,0 +1,19 @@
:root {
--space-0-5: 2px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-10: 40px;
--space-12: 48px;
--space-16: 64px;
--space-20: 80px;
--space-1-legacy: calc(8px * 1);
--space-2-legacy: calc(8px * 2);
--space-3-legacy: calc(8px * 3);
--space-4-legacy: calc(8px * 4);
}

View File

@@ -0,0 +1,23 @@
:root {
--font-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', system-ui, sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, Menlo, monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-md: 0.95rem;
--text-lg: 1.1rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 2rem;
--leading-tight: 1.2;
--leading-normal: 1.4;
--leading-relaxed: 1.5;
--weight-normal: 400;
--weight-medium: 500;
--weight-semibold: 600;
--weight-bold: 700;
}

View File

@@ -0,0 +1,11 @@
:root {
--z-base: 10;
--z-sticky: 50;
--z-header: 100;
--z-dropdown: 200;
--z-modal-backdrop: 500;
--z-modal: 1000;
--z-overlay: 2000;
--z-toast: 3000;
--z-tooltip: 4000;
}

View File

@@ -9,9 +9,13 @@
<!-- Step 1: URL Input --> <!-- Step 1: URL Input -->
<div class="download-step" id="urlStep"> <div class="download-step" id="urlStep">
<div class="input-group"> <div class="input-group">
<label for="modelUrl" id="modelUrlLabel">{{ t('modals.download.url') }}:</label> <label for="modelUrl" id="modelUrlLabel">{{ t('modals.download.civitaiUrl') }}</label>
<textarea id="modelUrl" rows="5" placeholder="{{ t('modals.download.placeholder') }}"></textarea> <textarea id="modelUrl" rows="5" placeholder="{{ t('modals.download.placeholder') }}"></textarea>
<div class="error-message" id="urlError"></div> <div class="error-message" id="urlError"></div>
<div class="input-hint">
<i class="fas fa-info-circle"></i>
<span>{{ t('modals.download.urlHint') }}</span>
</div>
</div> </div>
<div class="modal-actions"> <div class="modal-actions">
<button class="primary-btn" id="nextFromUrl">{{ t('common.actions.next') }}</button> <button class="primary-btn" id="nextFromUrl">{{ t('common.actions.next') }}</button>

View File

@@ -25,6 +25,11 @@ const JSON_DISPLAY_WIDGET_MIN_WIDTH = 300
const JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200 const JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200
const AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60 const AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60
const AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100 const AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100
// Per-modelType min size hints for node initial sizing.
// These are returned from the factory so ComfyUI's _initialMinSize mechanism
// gives the node a sensible default width (and height for prompt/embeddings).
const AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400
const AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300
const AUTOCOMPLETE_METADATA_VERSION = 1 const AUTOCOMPLETE_METADATA_VERSION = 1
const LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids' const LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'
@@ -754,7 +759,13 @@ function createAutocompleteTextWidgetFactory(
vueApps.delete(appKey) vueApps.delete(appKey)
}) })
return { widget } // Return minWidth/minHeight hints so ComfyUI's _initialMinSize mechanism
// sets a sensible initial node width (and height for prompt/embeddings).
// loras modelType retains its existing height constraints (getMaxHeight: 100).
const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT
const minHeight = modelType === 'loras' ? undefined : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT
return { widget, minWidth, minHeight }
} }
app.registerExtension({ app.registerExtension({

View File

@@ -15323,6 +15323,8 @@ const JSON_DISPLAY_WIDGET_MIN_WIDTH = 300;
const JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200; const JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200;
const AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60; const AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60;
const AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100; const AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100;
const AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400;
const AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300;
const AUTOCOMPLETE_METADATA_VERSION = 1; const AUTOCOMPLETE_METADATA_VERSION = 1;
const LORA_MANAGER_WIDGET_IDS_PROPERTY = "__lm_widget_ids"; const LORA_MANAGER_WIDGET_IDS_PROPERTY = "__lm_widget_ids";
function forwardMiddleMouseToCanvas(container) { function forwardMiddleMouseToCanvas(container) {
@@ -15886,7 +15888,9 @@ function createAutocompleteTextWidgetFactory(node, widgetName, modelType, inputO
widget.onRemove = createVueWidgetCleanup(vueApp, () => { widget.onRemove = createVueWidgetCleanup(vueApp, () => {
vueApps.delete(appKey); vueApps.delete(appKey);
}); });
return { widget }; const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT;
const minHeight = modelType === "loras" ? void 0 : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT;
return { widget, minWidth, minHeight };
} }
app$1.registerExtension({ app$1.registerExtension({
name: "LoraManager.VueWidgets", name: "LoraManager.VueWidgets",

File diff suppressed because one or more lines are too long