Spaces:
Running
Running
| /* 深色模式樣式表 - CSS 變數定義和主題支援 */ | |
| :root { | |
| /* 亮色主題變數(預設) */ | |
| --primary-color: #1f77b4; | |
| --secondary-color: #ff7f0e; | |
| --accent-color: #2ca02c; | |
| --bg-color: #ffffff; | |
| --surface-color: #f8f9fa; | |
| --text-color: #212529; | |
| --text-secondary-color: #6c757d; | |
| --border-color: #dee2e6; | |
| --hover-color: #e9ecef; | |
| --success-color: #28a745; | |
| --warning-color: #ffc107; | |
| --error-color: #dc3545; | |
| /* 過渡設定 */ | |
| --transition-duration: 0.3s; | |
| } | |
| /* 深色主題變數 */ | |
| [data-theme="dark"] { | |
| --primary-color: #4a9eff; | |
| --secondary-color: #ffb366; | |
| --accent-color: #66dd88; | |
| --bg-color: #1a1a1a; | |
| --surface-color: #2d2d2d; | |
| --text-color: #e8e8e8; | |
| --text-secondary-color: #a0a0a0; | |
| --border-color: #404040; | |
| --hover-color: #383838; | |
| --success-color: #4ade80; | |
| --warning-color: #facc15; | |
| --error-color: #ef4444; | |
| } | |
| /* 基礎樣式應用 */ | |
| body { | |
| background-color: var(--bg-color); | |
| color: var(--text-color); | |
| transition: background-color var(--transition-duration), color var(--transition-duration); | |
| } | |
| /* 容器和卡片 */ | |
| .container, | |
| .card, | |
| .panel { | |
| background-color: var(--surface-color); | |
| border-color: var(--border-color); | |
| color: var(--text-color); | |
| } | |
| /* 按鈕樣式 */ | |
| button, | |
| .btn { | |
| background-color: var(--primary-color); | |
| color: var(--bg-color); | |
| border: none; | |
| border-radius: 4px; | |
| padding: 8px 16px; | |
| cursor: pointer; | |
| transition: background-color var(--transition-duration), | |
| transform var(--transition-duration); | |
| } | |
| button:hover, | |
| .btn:hover { | |
| background-color: var(--accent-color); | |
| transform: translateY(-2px); | |
| } | |
| button:focus, | |
| .btn:focus { | |
| outline: 2px solid var(--accent-color); | |
| outline-offset: 2px; | |
| } | |
| /* 主題切換按鈕特定樣式 */ | |
| .theme-toggle-btn { | |
| background-color: var(--surface-color); | |
| color: var(--text-color); | |
| border: 1px solid var(--border-color); | |
| padding: 8px 12px; | |
| border-radius: 4px; | |
| cursor: pointer; | |
| font-size: 14px; | |
| transition: all var(--transition-duration); | |
| } | |
| .theme-toggle-btn:hover { | |
| background-color: var(--hover-color); | |
| border-color: var(--accent-color); | |
| } | |
| .theme-toggle-btn:focus { | |
| outline: 2px solid var(--accent-color); | |
| outline-offset: 2px; | |
| } | |
| /* 輸入欄位樣式 */ | |
| input, | |
| textarea, | |
| select { | |
| background-color: var(--surface-color); | |
| color: var(--text-color); | |
| border: 1px solid var(--border-color); | |
| padding: 8px 12px; | |
| border-radius: 4px; | |
| transition: border-color var(--transition-duration); | |
| } | |
| input:focus, | |
| textarea:focus, | |
| select:focus { | |
| outline: none; | |
| border-color: var(--accent-color); | |
| box-shadow: 0 0 4px var(--accent-color); | |
| } | |
| /* 標籤和文字 */ | |
| label { | |
| color: var(--text-color); | |
| } | |
| a { | |
| color: var(--primary-color); | |
| text-decoration: none; | |
| } | |
| a:hover { | |
| color: var(--accent-color); | |
| text-decoration: underline; | |
| } | |
| /* 表格樣式 */ | |
| table { | |
| background-color: var(--surface-color); | |
| border-collapse: collapse; | |
| } | |
| th { | |
| background-color: var(--hover-color); | |
| color: var(--text-color); | |
| border-bottom: 2px solid var(--border-color); | |
| } | |
| td { | |
| border-bottom: 1px solid var(--border-color); | |
| padding: 12px; | |
| color: var(--text-color); | |
| } | |
| tr:hover { | |
| background-color: var(--hover-color); | |
| } | |
| /* 狀態顏色 */ | |
| .success { | |
| color: var(--success-color); | |
| } | |
| .warning { | |
| color: var(--warning-color); | |
| } | |
| .error { | |
| color: var(--error-color); | |
| } | |
| /* Gradio 特定樣式 */ | |
| .gradio-container { | |
| background-color: var(--bg-color) ; | |
| } | |
| .gradio-textbox, | |
| .gradio-number, | |
| .gradio-slider { | |
| background-color: var(--surface-color) ; | |
| color: var(--text-color) ; | |
| border-color: var(--border-color) ; | |
| } | |
| .gradio-button { | |
| background-color: var(--primary-color) ; | |
| color: var(--bg-color) ; | |
| border: none ; | |
| } | |
| .gradio-button:hover { | |
| background-color: var(--accent-color) ; | |
| } | |
| /* 禁用狀態 */ | |
| button:disabled, | |
| input:disabled, | |
| select:disabled { | |
| opacity: 0.5; | |
| cursor: not-allowed; | |
| } | |
| /* 無障礙 - 焦點可視化 */ | |
| :focus-visible { | |
| outline: 2px solid var(--accent-color); | |
| outline-offset: 2px; | |
| } | |
| /* 平滑過渡 */ | |
| * { | |
| transition: background-color var(--transition-duration), | |
| color var(--transition-duration), | |
| border-color var(--transition-duration); | |
| } | |
| /* 尊重系統深色模式偏好 */ | |
| @media (prefers-color-scheme: dark) { | |
| :root:not([data-theme="light"]) { | |
| --primary-color: #4a9eff; | |
| --secondary-color: #ffb366; | |
| --accent-color: #66dd88; | |
| --bg-color: #1a1a1a; | |
| --surface-color: #2d2d2d; | |
| --text-color: #e8e8e8; | |
| --text-secondary-color: #a0a0a0; | |
| --border-color: #404040; | |
| --hover-color: #383838; | |
| --success-color: #4ade80; | |
| --warning-color: #facc15; | |
| --error-color: #ef4444; | |
| } | |
| } | |