diff --git a/.gitignore b/.gitignore index a97b2e3..26b2b3f 100644 --- a/.gitignore +++ b/.gitignore @@ -101,3 +101,4 @@ assets/image*.png # Preview files .preview .codegraph +serve.ts diff --git a/articles/model_comparisons/20260604/index.html b/articles/model_comparisons/20260604/index.html index 184b5ff..ca712ef 100644 --- a/articles/model_comparisons/20260604/index.html +++ b/articles/model_comparisons/20260604/index.html @@ -7,6 +7,7 @@ + diff --git a/index.html b/index.html index 3619292..16bfb3f 100644 --- a/index.html +++ b/index.html @@ -1,14 +1,16 @@ - + + Coding Plan 对比工具 - 国内29大主流AI平台套餐对比 智谱、Kimi、MiniMax、阿里百炼Qwen、小米Mimo、讯飞星火、阶跃星辰、无问芯穹、联通云、天翼云、移动云 - - - + + + + @@ -7636,8 +7639,8 @@

${title}

}); - + - + diff --git a/plan-usage.html b/plan-usage.html index c896991..a570b6c 100644 --- a/plan-usage.html +++ b/plan-usage.html @@ -6,6 +6,7 @@ + @@ -584,22 +585,24 @@ .segmented-control { display: inline-flex; + padding: 3px; + gap: 2px; border: 1px solid var(--border-color); - border-radius: var(--radius-md); - overflow: hidden; + border-radius: 999px; background: var(--bg-primary); } .segment-btn { - padding: 10px 16px; + padding: 8px 18px; border: none; + border-radius: 999px; background: transparent; font-size: 14px; font-weight: 600; font-family: inherit; cursor: pointer; color: var(--text-secondary); - transition: background 0.15s, color 0.15s; + transition: background 0.2s ease, color 0.2s ease, box-shadow 0.2s ease; } .segment-btn:hover:not(:disabled) { @@ -608,12 +611,13 @@ } .segment-btn + .segment-btn { - border-left: 1px solid var(--border-color); + border-left: none; } .segment-btn.active { - background: rgba(99, 102, 241, 0.12); - color: var(--accent-primary); + background: var(--accent-primary); + color: var(--bg-primary); + box-shadow: 0 4px 14px rgba(15, 118, 110, 0.28); } .segment-btn:disabled { @@ -1101,7 +1105,6 @@ .form-input, .form-textarea, .form-select-trigger, - .segmented-control, .secondary-btn, .pagination-btn { background: rgba(255, 255, 255, 0.72); @@ -1125,8 +1128,7 @@ } .multi-select-option:hover, - .single-select-option.selected, - .segment-btn.active { + .single-select-option.selected { background: rgba(15, 118, 110, 0.1); color: #154d77; } @@ -1202,6 +1204,7 @@ grid-template-columns: 1fr; } } + diff --git a/relay-detect.html b/relay-detect.html index 8921296..b5a5d62 100644 --- a/relay-detect.html +++ b/relay-detect.html @@ -1,14 +1,16 @@ - + + - - + + + - + diff --git a/relays.html b/relays.html index d4f20f5..d7e22de 100644 --- a/relays.html +++ b/relays.html @@ -1,11 +1,13 @@ - + + 中转站对比 - - + + + @@ -2693,6 +2696,6 @@

${escapeHtml(getRelayPageText('sections.detailDescriptionTitle'))}

}); - + diff --git a/scripts/shared.js b/scripts/shared.js index bf43690..8d16594 100644 --- a/scripts/shared.js +++ b/scripts/shared.js @@ -1,4 +1,4 @@ -/* ── codingplan 公共工具函数 ── */ +/* ── codingplan 公共工具函数 ── */ function escapeHtml(text) { if (text === null || text === undefined) return ''; @@ -160,6 +160,13 @@ function renderPageNav(target, options = {}) { +
+ + +
@@ -167,6 +174,49 @@ function renderPageNav(target, options = {}) { return true; } +// 深色模式设置 +(function () { + function initDarkMode() { + const toggle = document.getElementById('darkModeToggle'); + if (!toggle) return; + + const darkQuery = window.matchMedia('(prefers-color-scheme: dark)'); + const saved = localStorage.getItem('darkMode'); + + function applyDarkMode(on) { + // 同时设 body.classList 与 :root[data-theme], + // 兼容老 CSS (body.dark-mode) 与新 CSS (:root[data-theme=dark]) + document.body.classList.toggle('dark-mode', on); + document.documentElement.dataset.theme = on ? 'dark' : 'light'; + toggle.checked = on; + } + + if (saved !== null) { + applyDarkMode(saved === '1'); + } else { + applyDarkMode(darkQuery.matches); + } + + toggle.addEventListener('change', function () { + applyDarkMode(toggle.checked); + localStorage.setItem('darkMode', toggle.checked ? '1' : '0'); + }); + + darkQuery.addEventListener('change', function (e) { + if (localStorage.getItem('darkMode') === null) { + applyDarkMode(e.matches); + } + }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initDarkMode, { once: true }); + return; + } + + initDarkMode(); +})(); + // 超宽屏设置 (function () { function initUltraWideSettings() { diff --git a/styles/dark-mode.css b/styles/dark-mode.css new file mode 100644 index 0000000..25593ad --- /dev/null +++ b/styles/dark-mode.css @@ -0,0 +1,603 @@ +/* ── 统一暗色模式:覆盖所有页面的硬编码颜色 ── */ + +/* === 通用表格样式(覆盖所有页面含类名前缀的 tr/td/th) === */ +body.dark-mode th, +body.dark-mode .records-table th, +body.dark-mode .comparison-table thead th, +body.dark-mode .comparison-table th, +body.dark-mode .models-mini-table thead th { + background: rgba(12, 16, 24, 0.96); + color: rgba(248, 252, 255, 0.86); + border-bottom-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode td, +body.dark-mode .records-table td { + background: rgba(30, 33, 41, 0.88); + color: var(--text-primary); + border-bottom-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode tbody tr:nth-child(even) td, +body.dark-mode .records-table tbody tr:nth-child(even) td, +body.dark-mode .comparison-table tbody tr:nth-child(even) { + background: rgba(24, 27, 35, 0.85); +} + +body.dark-mode tbody tr:nth-child(odd) td, +body.dark-mode .records-table tbody tr:nth-child(odd) td, +body.dark-mode .comparison-table tbody tr:nth-child(odd) { + background: rgba(30, 33, 41, 0.88); +} + +body.dark-mode tbody tr:hover td, +body.dark-mode .records-table tbody tr:hover td, +body.dark-mode .comparison-table tbody tr:hover { + background: rgba(45, 212, 191, 0.06); +} + +body.dark-mode .records-table thead { + background: linear-gradient(180deg, rgba(20, 25, 35, 0.95), rgba(16, 22, 32, 0.95)); +} + +body.dark-mode .pinned-row td { + background: rgba(45, 212, 191, 0.04); +} + +/* === index.html 页面 === */ +body.dark-mode .table-wrapper { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode td.sticky-first, +body.dark-mode td.sticky-second { + background: linear-gradient(90deg, rgba(30, 33, 41, 0.96) 0%, rgba(30, 33, 41, 0.96) 86%, rgba(30, 33, 41, 0) 100%); +} + +body.dark-mode tbody tr:nth-child(even) td.sticky-first, +body.dark-mode tbody tr:nth-child(even) td.sticky-second { + background: linear-gradient(90deg, rgba(24, 27, 35, 0.96) 0%, rgba(24, 27, 35, 0.96) 86%, rgba(24, 27, 35, 0) 100%); +} + +body.dark-mode tbody tr:hover td.sticky-first, +body.dark-mode tbody tr:hover td.sticky-second { + background: linear-gradient(90deg, rgba(28, 38, 38, 0.96) 0%, rgba(28, 38, 38, 0.96) 86%, rgba(28, 38, 38, 0) 100%); + box-shadow: none; +} + +body.dark-mode .recommendation-card { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .recommendation-card:hover { + border-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode .recommendation-name-link:hover { + color: var(--accent-primary); +} + +body.dark-mode .rating-guide { + background: rgba(24, 27, 35, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .filter-btn, +body.dark-mode .reset-btn, +body.dark-mode .checkbox-label, +body.dark-mode .stats-bar { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode .filter-btn:hover, +body.dark-mode .checkbox-label:hover { + background: rgba(45, 212, 191, 0.08); + border-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode .filter-btn.active { + background: linear-gradient(135deg, rgba(45, 212, 191, 0.12), rgba(245, 158, 11, 0.12)); + border-color: rgba(45, 212, 191, 0.2); + color: var(--accent-primary); +} + +body.dark-mode .radio-label, +body.dark-mode .account-card, +body.dark-mode .contact-section { + background: rgba(30, 33, 41, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .radio-label:hover, +body.dark-mode .dropdown-btn.secondary:hover { + background: rgba(45, 212, 191, 0.08); + border-color: rgba(45, 212, 191, 0.18); +} + +body.dark-mode .dropdown-menu { + background: rgba(24, 27, 35, 0.96); +} + +body.dark-mode .checkbox-label:has(input:checked) { + background: rgba(45, 212, 191, 0.12); + border-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode .reset-btn:hover { + background: rgba(245, 158, 11, 0.08); + border-color: rgba(245, 158, 11, 0.2); + color: var(--accent-secondary); +} + +body.dark-mode .hero-summary-card--reading { + background: linear-gradient(165deg, rgba(45, 212, 191, 0.06), rgba(24, 27, 35, 0.85)); +} + +body.dark-mode .hero-summary-card--reading .hero-summary-kicker { + color: #2dd4bf; + background: rgba(45, 212, 191, 0.12); +} + +body.dark-mode .hero-summary-card--guide { + background: linear-gradient(165deg, rgba(245, 158, 11, 0.06), rgba(24, 27, 35, 0.85)); + border-color: rgba(245, 158, 11, 0.12); +} + +body.dark-mode .hero-summary-card--guide .hero-summary-kicker { + color: #f59e0b; + background: rgba(245, 158, 11, 0.12); +} + +body.dark-mode .preset-tag-chip { + background: linear-gradient(135deg, rgba(30, 33, 41, 0.92), rgba(30, 33, 41, 0.92)); + border-color: rgba(255, 255, 255, 0.08); + color: var(--text-secondary); +} + +body.dark-mode .preset-tag-chip:hover { + border-color: rgba(45, 212, 191, 0.28); + color: var(--text-primary); +} + +body.dark-mode .preset-tag-chip.active { + background: linear-gradient(135deg, #173753, #0f766e); + color: white; +} + +body.dark-mode .feedback-float-trigger { + background: rgba(24, 27, 35, 0.94); + border-color: rgba(255, 255, 255, 0.1); +} + +body.dark-mode .feedback-float-trigger:hover { + background: rgba(30, 33, 41, 0.96); + border-color: rgba(45, 212, 191, 0.28); +} + +body.dark-mode .feedback-float-trigger-icon { + background: rgba(45, 212, 191, 0.12); + color: #2dd4bf; +} + +body.dark-mode .feedback-float-panel { + background: rgba(24, 27, 35, 0.96); + border-color: rgba(255, 255, 255, 0.1); +} + +body.dark-mode .feedback-float-action-link { + background: rgba(30, 33, 41, 0.78); + border-color: rgba(255, 255, 255, 0.1); +} + +body.dark-mode .feedback-float-action-link:hover { + border-color: rgba(45, 212, 191, 0.24); + background: rgba(45, 212, 191, 0.08); +} + +body.dark-mode .feedback-float-feishu { + border-top-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode .section-title::after { + background: linear-gradient(90deg, rgba(255, 255, 255, 0.16), rgba(255, 255, 255, 0)); +} + +body.dark-mode .hero-summary-lede-media a { + border-color: rgba(255, 255, 255, 0.1); +} + +body.dark-mode .page-tab:hover { + background: rgba(45, 212, 191, 0.08); +} + +body.dark-mode .settings-btn:hover, +body.dark-mode .settings-btn.active { + background: rgba(30, 33, 41, 0.78); + border-color: rgba(255, 255, 255, 0.1); +} + +body.dark-mode .toggle-slider { + background: rgba(255, 255, 255, 0.2); +} + +body.dark-mode .toggle-switch input:checked + .toggle-slider { + background: var(--accent-primary); +} + +body.dark-mode .toggle-slider::before { + background: #e0e0e0; +} + + +/* === coding-agents.html 页面 === */ +body.dark-mode #agentsTable td:first-child, +body.dark-mode #plansTable td:first-child { + background: linear-gradient(90deg, rgba(30, 33, 41, 0.96) 0%, rgba(30, 33, 41, 0.96) 86%, rgba(30, 33, 41, 0) 100%); +} + +body.dark-mode #agentsTable tbody tr:nth-child(even) td:first-child, +body.dark-mode #plansTable tbody tr:nth-child(even) td:first-child { + background: linear-gradient(90deg, rgba(24, 27, 35, 0.96) 0%, rgba(24, 27, 35, 0.96) 86%, rgba(24, 27, 35, 0) 100%); +} + +body.dark-mode #agentsTable tbody tr:hover td:first-child, +body.dark-mode #plansTable tbody tr:hover td:first-child { + background: linear-gradient(90deg, rgba(28, 38, 38, 0.96) 0%, rgba(28, 38, 38, 0.96) 86%, rgba(28, 38, 38, 0) 100%); +} + +body.dark-mode .hero-shell { + background: linear-gradient(135deg, rgba(24, 27, 35, 0.96) 0%, rgba(20, 24, 32, 0.92) 56%, rgba(18, 28, 28, 0.92) 100%); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .hero-shell::before { + background: radial-gradient(circle, rgba(45, 212, 191, 0.12), rgba(45, 212, 191, 0)); +} + +body.dark-mode .hero-shell::after { + background: radial-gradient(circle, rgba(245, 158, 11, 0.1), rgba(245, 158, 11, 0)); +} + +body.dark-mode .hero-tag { + background: linear-gradient(135deg, #0a1628 0%, #0d5c56 100%); + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3); +} + +body.dark-mode .hero-trust { + background: rgba(45, 212, 191, 0.1); + border-color: rgba(45, 212, 191, 0.12); +} + +body.dark-mode .hero-coverage { + background: rgba(30, 33, 41, 0.66); +} + +body.dark-mode .hero-anchor { + background: linear-gradient(135deg, #173753, #0f766e); +} + +body.dark-mode .hero-anchor--secondary, +body.dark-mode .github-link { + background: rgba(30, 33, 41, 0.78); +} + +body.dark-mode .hero-point { + background: rgba(30, 33, 41, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .metric-card, +body.dark-mode .decision-card { + background: rgba(24, 27, 35, 0.76); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .metric-card--good { + background: linear-gradient(180deg, rgba(45, 212, 191, 0.08), rgba(24, 27, 35, 0.6)); +} + +body.dark-mode .metric-card--accent { + background: linear-gradient(180deg, rgba(45, 212, 191, 0.08), rgba(24, 27, 35, 0.6)); +} + +body.dark-mode .metric-card--warm { + background: linear-gradient(180deg, rgba(245, 158, 11, 0.08), rgba(24, 27, 35, 0.6)); +} + +body.dark-mode .metric-eyebrow { + background: rgba(45, 212, 191, 0.1); +} + +body.dark-mode .metric-value { + color: var(--text-primary); +} + +body.dark-mode .decision-step { + color: var(--accent-primary); + background: rgba(45, 212, 191, 0.08); +} + +body.dark-mode .table-hint { + background: rgba(30, 33, 41, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .pill { + background: rgba(255, 255, 255, 0.06); + border-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode .status-pill--yes, +body.dark-mode .status-pill--mainlandYes, +body.dark-mode .source-pill--official { + color: #2dd4bf; + background: rgba(45, 212, 191, 0.12); + border-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode .status-pill--no, +body.dark-mode .status-pill--mainlandNo { + color: #fca5a5; + background: rgba(225, 86, 109, 0.12); + border-color: rgba(225, 86, 109, 0.2); +} + +body.dark-mode .status-pill--partial, +body.dark-mode .status-pill--mainlandPartial, +body.dark-mode .source-pill--secondary { + color: #f59e0b; + background: rgba(245, 158, 11, 0.12); + border-color: rgba(245, 158, 11, 0.2); +} + +body.dark-mode .status-pill--unknown, +body.dark-mode .status-pill--na, +body.dark-mode .status-pill--mainlandUnknown, +body.dark-mode .source-pill--unknown { + background: rgba(138, 147, 163, 0.12); + border-color: rgba(138, 147, 163, 0.15); + color: var(--text-tertiary); +} + +body.dark-mode .source-link { + color: var(--accent-primary); +} + +body.dark-mode .source-disclosure { + border-top-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode .site-link { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .hero-steps li::before { + background: rgba(255, 255, 255, 0.12); +} + + +/* === plan-usage.html 页面 === */ +body.dark-mode .form-input, +body.dark-mode .form-textarea, +body.dark-mode .form-select-trigger { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); + color: var(--text-primary); +} + +body.dark-mode .form-input:focus, +body.dark-mode .form-textarea:focus, +body.dark-mode .form-select-trigger:focus, +body.dark-mode .multi-select.open .form-select-trigger { + border-color: rgba(45, 212, 191, 0.28); + box-shadow: 0 0 0 4px rgba(45, 212, 191, 0.08); +} + +body.dark-mode .form-input::placeholder, +body.dark-mode .form-textarea::placeholder { + color: var(--text-tertiary); +} + +body.dark-mode .field-help-trigger { + border-color: rgba(45, 212, 191, 0.25); + background: rgba(45, 212, 191, 0.08); +} + +body.dark-mode .field-help-trigger:hover, +body.dark-mode .field-help-trigger-wrap.is-open .field-help-trigger, +body.dark-mode .field-help-trigger:focus-visible { + background: rgba(45, 212, 191, 0.14); + border-color: rgba(45, 212, 191, 0.42); + color: var(--accent-primary); +} + +body.dark-mode .field-help-trigger:focus-visible { + outline-color: rgba(45, 212, 191, 0.25); +} + +body.dark-mode .field-help-popover, +body.dark-mode .multi-select-panel { + background: rgba(24, 27, 35, 0.96); +} + +body.dark-mode .field-help-image-wrap { + border-color: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.04); +} + +body.dark-mode .field-help-image-wrap.has-image:focus-visible { + outline-color: rgba(45, 212, 191, 0.55); +} + +body.dark-mode .field-help-lightbox-backdrop { + background: rgba(0, 0, 0, 0.85); +} + +body.dark-mode .field-help-lightbox-close { + background: rgba(30, 33, 41, 0.92); +} + +body.dark-mode .field-help-lightbox-close:hover { + background: rgba(40, 44, 52, 0.96); +} + +body.dark-mode .multi-select-option:hover, +body.dark-mode .single-select-option.selected { + background: rgba(45, 212, 191, 0.1); + color: var(--accent-primary); +} + +body.dark-mode .segment-btn.active { + box-shadow: 0 4px 14px rgba(45, 212, 191, 0.35); +} + +body.dark-mode .single-select-option.selected { + background: rgba(45, 212, 191, 0.1); +} + +body.dark-mode .submit-btn { + background: linear-gradient(135deg, #173753, #0f766e); + box-shadow: 0 12px 24px rgba(23, 55, 83, 0.18); +} + +body.dark-mode .submit-btn:hover { + background: linear-gradient(135deg, #0a1628, #0d5c56); +} + +body.dark-mode .secondary-btn, +body.dark-mode .pagination-btn { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); +} + +body.dark-mode .secondary-btn:hover, +body.dark-mode .pagination-btn:hover:not(:disabled) { + color: var(--accent-primary); + border-color: rgba(45, 212, 191, 0.2); + background: rgba(45, 212, 191, 0.08); +} + +body.dark-mode .estimate-pin-btn.is-pinned { + border-color: rgba(45, 212, 191, 0.28); + background: rgba(45, 212, 191, 0.1); +} + +body.dark-mode .estimate-pin-btn:focus-visible { + outline-color: rgba(45, 212, 191, 0.22); +} + +body.dark-mode .result-card.success { + border-color: rgba(16, 185, 129, 0.2); + background: linear-gradient(135deg, rgba(16, 185, 129, 0.06), rgba(16, 185, 129, 0.02)); +} + +body.dark-mode .result-card.error { + border-color: rgba(239, 68, 68, 0.2); + background: linear-gradient(135deg, rgba(239, 68, 68, 0.06), rgba(239, 68, 68, 0.02)); +} + +body.dark-mode .result-card.flash-success { + border-color: rgba(16, 185, 129, 0.5); + box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.12), var(--shadow-lg); +} + +body.dark-mode .toast { + background: rgba(30, 33, 41, 0.96); + border-color: rgba(16, 185, 129, 0.2); +} + +body.dark-mode .toast.success { + background: linear-gradient(135deg, rgba(16, 40, 35, 0.98), rgba(30, 33, 41, 0.98)); +} + +body.dark-mode .meta-pill { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); +} + + +/* === relays.html 页面 === */ +body.dark-mode .relay-card-header { + background: linear-gradient(135deg, rgba(45, 212, 191, 0.06), rgba(245, 158, 11, 0.04)); + border-bottom-color: rgba(255, 255, 255, 0.06); +} + +body.dark-mode .matrix-filter-reset { + background: var(--bg-secondary); +} + +body.dark-mode .matrix-filter-item input, +body.dark-mode .matrix-filter-item select, +body.dark-mode .matrix-multi-btn { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); + color: var(--text-primary); +} + +body.dark-mode .matrix-filter-item input::placeholder { + color: var(--text-tertiary); +} + +body.dark-mode .matrix-filter-item input:focus, +body.dark-mode .matrix-filter-item select:focus, +body.dark-mode .matrix-multi.open .matrix-multi-btn { + border-color: var(--accent-primary); + outline-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode .models-mini-table thead th { + color: var(--text-secondary); +} + +body.dark-mode .matrix-tag--type-ir, +body.dark-mode .matrix-tag--type-mixed, +body.dark-mode .protocol-tag, +body.dark-mode .model-price-label { + background: rgba(30, 33, 41, 0.6); +} + + +/* === relay-detect.html 页面 === */ +body.dark-mode .history-clear-btn { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.08); + color: var(--text-secondary); +} + +body.dark-mode .history-clear-btn:hover { + background: rgba(239, 68, 68, 0.08); + border-color: rgba(239, 68, 68, 0.24); +} + +body.dark-mode .result-card.success { + border-color: rgba(16, 185, 129, 0.2); +} + +body.dark-mode .result-card.warning { + border-color: rgba(245, 158, 11, 0.2); +} + +body.dark-mode .result-card.error { + border-color: rgba(239, 68, 68, 0.2); +} + +body.dark-mode .spinner { + border-color: rgba(255, 255, 255, 0.2); + border-top-color: var(--accent-primary); +} + + +/* === article 页面(通用列表/块引用) === */ +body.dark-mode .article-content blockquote { + background: rgba(45, 212, 191, 0.06); + border-left-color: rgba(45, 212, 191, 0.2); +} + +body.dark-mode code { + background: rgba(255, 255, 255, 0.08); + color: var(--text-primary); +} diff --git a/styles/main.css b/styles/main.css index 0a2bea9..c9b5f9e 100644 --- a/styles/main.css +++ b/styles/main.css @@ -1,3 +1,5 @@ + +/* NOTE: this stylesheet is the native-static template default and is NOT referenced by any page in this project. Kept intentionally to preserve the original template. */ /* ABOUTME: Main stylesheet for native-static template */ /* ABOUTME: Provides layout, typography, and theme styles without external dependencies */ diff --git a/styles/plan-usage.css b/styles/plan-usage.css index 9b25514..5310fbd 100644 --- a/styles/plan-usage.css +++ b/styles/plan-usage.css @@ -1,4 +1,4 @@ -.plan-usage-panel { +.plan-usage-panel { margin-bottom: 24px; padding: 24px 24px 22px; border: 1px solid rgba(255, 255, 255, 0.7); @@ -8,6 +8,11 @@ backdrop-filter: blur(8px); } +body.dark-mode .plan-usage-panel { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); +} + .plan-usage-panel[hidden] { display: none !important; } @@ -39,6 +44,11 @@ text-transform: uppercase; } +body.dark-mode .plan-usage-kicker { + color: #8dd0e6; + background: rgba(45, 212, 191, 0.1); +} + .plan-usage-title { margin: 12px 0 8px; font-size: clamp(24px, 3vw, 32px); @@ -54,6 +64,10 @@ max-width: 860px; } +body.dark-mode .plan-usage-description { + color: var(--text-secondary); +} + .plan-usage-meta { margin-top: 14px; display: flex; @@ -76,6 +90,11 @@ box-shadow: 0 10px 20px rgba(23, 32, 51, 0.05); } +body.dark-mode .plan-usage-chip { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.06); +} + .plan-usage-chip strong { color: var(--text-primary); font-weight: 800; @@ -107,6 +126,11 @@ box-shadow: 0 10px 20px rgba(23, 32, 51, 0.05); } +body.dark-mode .plan-usage-panel .segmented-control { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.1); +} + .plan-usage-panel .segment-btn { min-width: 82px; min-height: 42px; @@ -131,10 +155,14 @@ } .plan-usage-panel .segment-btn.active { - background: linear-gradient(135deg, #173753, #0f766e); + background: var(--grad-primary); color: #f7fffd; } +body.dark-mode .plan-usage-panel .segment-btn.active { + background: linear-gradient(135deg, #0a1628, #0d5c56); +} + .plan-usage-panel .segment-btn:disabled { opacity: 0.5; cursor: not-allowed; @@ -156,12 +184,23 @@ padding: 14px 18px; } +body.dark-mode .plan-usage-state { + background: rgba(30, 33, 41, 0.52); + border-color: rgba(255, 255, 255, 0.1); +} + .plan-usage-state.is-error { color: #9f1239; border-color: rgba(239, 68, 68, 0.2); background: rgba(255, 236, 236, 0.72); } +body.dark-mode .plan-usage-state.is-error { + color: #fca5a5; + border-color: rgba(239, 68, 68, 0.25); + background: rgba(50, 20, 20, 0.72); +} + .plan-usage-chart { margin-top: 18px; width: 100%; @@ -171,6 +210,11 @@ border: 1px solid rgba(23, 32, 51, 0.08); } +body.dark-mode .plan-usage-chart { + background: linear-gradient(180deg, rgba(24, 27, 35, 0.5), rgba(30, 33, 41, 0.7)); + border-color: rgba(255, 255, 255, 0.06); +} + .plan-usage-chart[hidden] { display: none; } @@ -195,6 +239,11 @@ min-width: 0; } +body.dark-mode .plan-usage-chart-block { + background: rgba(30, 33, 41, 0.28); + border-color: rgba(255, 255, 255, 0.06); +} + .plan-usage-chart-header { display: grid; gap: 8px; diff --git a/styles/shared.css b/styles/shared.css index 9833a3f..1386604 100644 --- a/styles/shared.css +++ b/styles/shared.css @@ -1,4 +1,4 @@ -/* ── 公共基础样式,index.html 和 tools.html 共用 ── */ +/* 鈹€鈹€ 鍏叡鍩虹鏍峰紡锛宨ndex.html 鍜?tools.html 鍏辩敤 鈹€鈹€ */ * { margin: 0; @@ -20,28 +20,99 @@ --accent-success: #10b981; --accent-warning: #f59e0b; --accent-error: #ef4444; - --shadow-sm: 0 6px 18px rgba(23, 32, 51, 0.06); - --shadow-md: 0 14px 36px rgba(23, 32, 51, 0.08); - --shadow-lg: 0 20px 48px rgba(23, 32, 51, 0.12); - --shadow-xl: 0 28px 64px rgba(23, 32, 51, 0.16); - --radius-sm: 6px; + --shadow-sm: 0 2px 6px rgba(23, 32, 51, 0.05); + --shadow-md: 0 6px 20px rgba(23, 32, 51, 0.07); + --shadow-lg: 0 12px 32px rgba(23, 32, 51, 0.10); + --shadow-xl: 0 20px 48px rgba(23, 32, 51, 0.12); + --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; + + + /* === focus / gradient / motion tokens (new) === */ + --focus-ring-color: rgba(99, 102, 241, 0.32); + --focus-ring-color-strong: rgba(99, 102, 241, 0.55); + --focus-ring-soft: rgba(99, 102, 241, 0.22); + --focus-ring: 0 0 0 3px var(--focus-ring-color); + --focus-ring-strong: 0 0 0 3px var(--focus-ring-color-strong); + --grad-primary: var(--grad-primary); + --grad-primary-soft: linear-gradient(135deg, rgba(28, 53, 82, 0.08), rgba(15, 118, 110, 0.08)); + --selection-bg: rgba(15, 118, 110, 0.4); + --row-hover-bg: rgba(15, 118, 110, 0.05); + color-scheme: light; + +} + +body.dark-mode { + --bg-primary: #111318; + --bg-secondary: rgba(24, 27, 35, 0.92); + --bg-tertiary: #1e2129; + --text-primary: #e4e6eb; + --text-secondary: #a0a4af; + --text-tertiary: #6b7080; + --border-color: rgba(255, 255, 255, 0.1); + --border-light: rgba(255, 255, 255, 0.06); + --accent-primary: #2dd4bf; + --accent-secondary: #f59e0b; + --shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.20); + --shadow-md: 0 6px 20px rgba(0, 0, 0, 0.25); + --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.30); + --shadow-xl: 0 20px 48px rgba(0, 0, 0, 0.35); + + + /* === dark mode focus / gradient / accent overrides (new) === */ + --accent-success: #34d399; + --accent-warning: #fbbf24; + --accent-error: #f87171; + --text-tertiary: #9aa0ad; + --focus-ring-color: rgba(45, 212, 191, 0.32); + --focus-ring-color-strong: rgba(45, 212, 191, 0.55); + --focus-ring-soft: rgba(45, 212, 191, 0.22); + --grad-primary: linear-gradient(135deg, #0a1628 0%, #0d5c56 100%); + --grad-primary-soft: linear-gradient(135deg, rgba(10, 22, 40, 0.4), rgba(13, 92, 86, 0.4)); + --selection-bg: rgba(45, 212, 191, 0.5); + --row-hover-bg: rgba(45, 212, 191, 0.06); + color-scheme: dark; + } body { + transition: background-color 0.3s ease, color 0.3s ease; min-height: 100vh; - font-family: "Avenir Next", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; - background: - radial-gradient(circle at top left, rgba(15, 118, 110, 0.12), transparent 26%), - radial-gradient(circle at top right, rgba(198, 107, 26, 0.14), transparent 24%), - linear-gradient(180deg, #f8f3eb 0%, #f4efe6 42%, #f7f2ea 100%); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; + background: var(--bg-primary); color: var(--text-primary); line-height: 1.4; - padding: 28px 34px 64px; - font-size: 14px; - overflow-x: hidden; + padding: 20px 24px 40px; + font-size: 15px; + overflow-x: clip; +} + +body.dark-mode { + background: var(--bg-primary); +} + + +::selection { + background: var(--selection-bg); + color: var(--text-primary); + text-shadow: none; +} + +:focus-visible { + outline: none; + box-shadow: var(--focus-ring); + border-radius: inherit; +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } } .container { @@ -57,24 +128,31 @@ body { margin: 34px 0; } -/* ── 页面导航 Tab(外层不裁切,设置面板挂在 cluster 上) ── */ +/* 鈹€鈹€ 椤甸潰瀵艰埅 Tab锛堝灞備笉瑁佸垏锛岃缃潰鏉挎寕鍦?cluster 涓婏級 鈹€鈹€ */ .page-nav-cluster { + transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease; display: flex; align-items: center; - gap: 10px; - margin-bottom: 24px; - padding: 12px 14px; - border: 1px solid rgba(255, 255, 255, 0.55); - border-radius: 999px; - background: rgba(255, 249, 241, 0.76); - backdrop-filter: blur(18px); - box-shadow: 0 10px 28px rgba(23, 32, 51, 0.08); + gap: 8px; + margin-bottom: 20px; + padding: 8px 10px; + border: 1px solid var(--border-color); + border-radius: 10px; + background: var(--bg-secondary); + backdrop-filter: blur(8px); + box-shadow: var(--shadow-sm); position: sticky; - top: 14px; + top: 10px; z-index: 40; overflow: visible; } +body.dark-mode .page-nav-cluster { + background: rgba(24, 27, 35, 0.88); + border-color: rgba(255, 255, 255, 0.08); + box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3); +} + .page-nav { display: flex; align-items: center; @@ -95,7 +173,7 @@ body { gap: 6px; padding: 11px 18px; border-radius: 999px; - font-size: 14px; + font-size: 15px; font-weight: 600; text-decoration: none; color: var(--text-secondary); @@ -112,24 +190,34 @@ body { .page-tab.active { color: #f8fffd; - background: linear-gradient(135deg, #1c3552 0%, #0f766e 100%); + background: var(--grad-primary); border-color: transparent; box-shadow: 0 12px 24px rgba(28, 53, 82, 0.18); } -/* ── Header ── */ +body.dark-mode .page-tab.active { + background: linear-gradient(135deg, #0a1628 0%, #0d5c56 100%); + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.3); +} + +/* 鈹€鈹€ Header 鈹€鈹€ */ .header { - margin-bottom: 28px; + margin-bottom: 24px; text-align: left; position: relative; - padding: 30px; - border: 1px solid rgba(255, 255, 255, 0.7); - border-radius: 32px; - background: linear-gradient(135deg, rgba(255, 252, 246, 0.96) 0%, rgba(255, 248, 238, 0.84) 56%, rgba(239, 246, 244, 0.92) 100%); - box-shadow: var(--shadow-lg); + padding: 28px 32px; + border: 1px solid var(--border-color); + border-radius: 16px; + background: var(--bg-secondary); + box-shadow: var(--shadow-sm); overflow: hidden; } +body.dark-mode .header { + background: linear-gradient(135deg, rgba(24, 27, 35, 0.96) 0%, rgba(20, 24, 32, 0.92) 56%, rgba(18, 28, 28, 0.92) 100%); + border-color: rgba(255, 255, 255, 0.06); +} + .header::before, .header::after { content: ''; @@ -146,6 +234,10 @@ body { background: radial-gradient(circle, rgba(15, 118, 110, 0.18), rgba(15, 118, 110, 0)); } +body.dark-mode .header::before { + background: radial-gradient(circle, rgba(45, 212, 191, 0.12), rgba(45, 212, 191, 0)); +} + .header::after { width: 320px; height: 320px; @@ -154,6 +246,10 @@ body { background: radial-gradient(circle, rgba(198, 107, 26, 0.16), rgba(198, 107, 26, 0)); } +body.dark-mode .header::after { + background: radial-gradient(circle, rgba(245, 158, 11, 0.1), rgba(245, 158, 11, 0)); +} + .header > * { position: relative; z-index: 1; @@ -168,7 +264,7 @@ body { gap: 6px; color: var(--text-primary); text-decoration: none; - font-size: 14px; + font-size: 15px; font-weight: 700; transition: all 0.2s; padding: 11px 18px; @@ -184,6 +280,11 @@ body { transform: translateY(-1px); } +body.dark-mode .github-link { + background: rgba(30, 33, 41, 0.88); + border-color: rgba(255, 255, 255, 0.1); +} + .header h1 { max-width: calc(100% - 140px); font-size: clamp(40px, 6vw, 68px); @@ -208,6 +309,11 @@ body { background: rgba(24, 52, 79, 0.08); } +body.dark-mode .update-date { + color: #8dd0e6; + background: rgba(45, 212, 191, 0.1); +} + .header .subtitle { width: 100%; max-width: 100%; @@ -218,6 +324,10 @@ body { line-height: 1.72; } +body.dark-mode .header .subtitle { + color: var(--text-secondary); +} + .header .models, .header-info { width: 100%; @@ -232,12 +342,18 @@ body { box-shadow: 0 10px 20px rgba(23, 32, 51, 0.05); } -/* ── 超宽屏模式 ── */ +body.dark-mode .header .models, +body.dark-mode .header-info { + background: rgba(30, 33, 41, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + +/* 鈹€鈹€ 瓒呭灞忔ā寮?鈹€鈹€ */ .ultra-wide .container { max-width: none !important; } -/* ── 设置按钮与面板 ── */ +/* 鈹€鈹€ 璁剧疆鎸夐挳涓庨潰鏉?鈹€鈹€ */ .settings-wrapper { margin-left: auto; position: relative; @@ -285,6 +401,10 @@ body { z-index: 2000; } +body.dark-mode .settings-panel { + background: rgba(24, 27, 35, 0.95); +} + .settings-panel-title { font-size: 11px; font-weight: 600; @@ -351,7 +471,7 @@ body { transform: translateX(16px); } -/* ── 底部说明 ── */ +/* 鈹€鈹€ 搴曢儴璇存槑 鈹€鈹€ */ .notes-section { margin-top: 30px; padding: 24px 28px; @@ -359,7 +479,11 @@ body { border: 1px solid rgba(255, 255, 255, 0.7); background: rgba(255, 251, 245, 0.84); box-shadow: var(--shadow-md); - backdrop-filter: blur(8px); +} + +body.dark-mode .notes-section { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); } .notes-section h3 { @@ -376,7 +500,7 @@ body { } .notes-section li { - font-size: 14px; + font-size: 15px; color: var(--text-secondary); padding: 8px 0; padding-left: 18px; @@ -385,13 +509,13 @@ body { } .notes-section li::before { - content: "•"; + content: "鈥?; position: absolute; left: 0; color: var(--accent-primary); } -/* ── 更新日志 ── */ +/* 鈹€鈹€ 鏇存柊鏃ュ織 鈹€鈹€ */ .updates-section { margin-top: 28px; padding: 24px 28px; @@ -399,7 +523,11 @@ body { border: 1px solid rgba(255, 255, 255, 0.7); background: rgba(255, 251, 245, 0.84); box-shadow: var(--shadow-md); - backdrop-filter: blur(8px); +} + +body.dark-mode .updates-section { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); } .updates-section h3 { @@ -441,7 +569,7 @@ body { } .update-items li { - font-size: 14px; + font-size: 15px; color: var(--text-secondary); padding: 4px 0; position: relative; @@ -463,28 +591,43 @@ body { } .hero-summary-card { - padding: 22px; - border-radius: 24px; - border: 1px solid rgba(23, 32, 51, 0.08); - background: rgba(255, 251, 245, 0.84); - box-shadow: var(--shadow-md); - backdrop-filter: blur(8px); + padding: 18px; + border-radius: 12px; + border: 1px solid var(--border-color); + background: var(--bg-secondary); + box-shadow: var(--shadow-sm); +} + +body.dark-mode .hero-summary-card { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); } .hero-summary-card--accent { background: linear-gradient(180deg, rgba(15, 118, 110, 0.09), rgba(255, 255, 255, 0.88)); } +body.dark-mode .hero-summary-card--accent { + background: linear-gradient(180deg, rgba(45, 212, 191, 0.08), rgba(24, 27, 35, 0.6)); +} + .hero-summary-card--warm { background: linear-gradient(180deg, rgba(198, 107, 26, 0.09), rgba(255, 255, 255, 0.88)); } +body.dark-mode .hero-summary-card--warm { + background: linear-gradient(180deg, rgba(245, 158, 11, 0.08), rgba(24, 27, 35, 0.6)); +} + .hero-summary-card--community { grid-column: span 2; - position: relative; - overflow: hidden; - border-color: rgba(15, 118, 110, 0.18); - background: linear-gradient(135deg, rgba(15, 118, 110, 0.12) 0%, rgba(255, 251, 245, 0.96) 48%, rgba(198, 107, 26, 0.1) 100%); + border-color: var(--border-color); + background: var(--bg-secondary); +} + +body.dark-mode .hero-summary-card--community { + background: linear-gradient(135deg, rgba(45, 212, 191, 0.08) 0%, rgba(24, 27, 35, 0.9) 48%, rgba(245, 158, 11, 0.06) 100%); + border-color: rgba(45, 212, 191, 0.15); } .hero-summary-card--community::after { @@ -515,7 +658,7 @@ body { .community-hub-status { color: #18344f; - font-size: 14px; + font-size: 15px; font-weight: 700; line-height: 1.7; } @@ -562,7 +705,7 @@ body { min-height: 42px; padding: 0 18px; border-radius: 999px; - font-size: 14px; + font-size: 15px; font-weight: 700; text-decoration: none; transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease, background 0.18s ease, color 0.18s ease; @@ -570,7 +713,7 @@ body { .community-hub-btn { color: #f8fffd; - background: linear-gradient(135deg, #1c3552 0%, #0f766e 100%); + background: var(--grad-primary); box-shadow: 0 12px 24px rgba(28, 53, 82, 0.16); } @@ -586,6 +729,11 @@ body { box-shadow: 0 10px 20px rgba(23, 32, 51, 0.06); } +body.dark-mode .community-hub-btn--secondary { + background: rgba(30, 33, 41, 0.82); + border-color: rgba(255, 255, 255, 0.1); +} + .community-hub-btn--secondary:hover { border-color: rgba(15, 118, 110, 0.24); } @@ -596,6 +744,12 @@ body { border: 1px solid rgba(24, 52, 79, 0.1); } +body.dark-mode .community-hub-badge { + color: var(--text-secondary); + background: rgba(45, 212, 191, 0.08); + border-color: rgba(45, 212, 191, 0.1); +} + .community-hub-footnote { font-size: 13px; color: var(--text-tertiary); @@ -615,6 +769,11 @@ body { box-shadow: 0 12px 22px rgba(23, 32, 51, 0.06); } +body.dark-mode .community-hub-qr { + background: rgba(30, 33, 41, 0.7); + border-color: rgba(255, 255, 255, 0.06); +} + .community-hub-qr img { display: block; width: 100%; @@ -640,7 +799,7 @@ body { color: var(--text-secondary); text-align: center; line-height: 1.7; - font-size: 14px; + font-size: 15px; font-weight: 600; } @@ -683,7 +842,7 @@ body { align-items: center; gap: 10px; margin-bottom: 16px; - font-size: 27px; + font-size: 22px; font-weight: 800; letter-spacing: -0.03em; color: var(--text-primary); @@ -699,9 +858,13 @@ body { .surface-panel { border-radius: 28px; border: 1px solid rgba(255, 255, 255, 0.7); - background: rgba(255, 251, 245, 0.84); - box-shadow: var(--shadow-md); - backdrop-filter: blur(8px); + background: var(--bg-secondary); + box-shadow: var(--shadow-sm); +} + +body.dark-mode .surface-panel { + background: rgba(24, 27, 35, 0.8); + border-color: rgba(255, 255, 255, 0.06); } .surface-panel--padded { @@ -719,12 +882,21 @@ body { box-shadow: 0 10px 20px rgba(23, 32, 51, 0.05); } +body.dark-mode .surface-control { + background: rgba(30, 33, 41, 0.72); + border-color: rgba(255, 255, 255, 0.06); +} + .surface-popover { background: rgba(255, 251, 245, 0.96); border-radius: 18px; box-shadow: var(--shadow-lg); } +body.dark-mode .surface-popover { + background: rgba(24, 27, 35, 0.96); +} + @media (max-width: 1200px) { body { padding: 24px 22px 56px; @@ -842,3 +1014,57 @@ body { padding-top: 0; } } + + +/* === light-mode table row hover (new) === */ +.comparison-table tbody tr:hover td, +.records-table tbody:hover tbody tr:hover td, +.records-table tbody tr:hover td { + background: var(--row-hover-bg); + transition: background 0.15s ease; +} + +/* === link legibility (new) === */ +a:not(.btn):not(.page-tab):not(.action-btn):not(.community-hub-btn):not(.recommendation-name-link):not(.header-link):not(.pagination-btn) { + text-decoration: underline; + text-decoration-color: rgba(15, 118, 110, 0.65); + text-decoration-thickness: 1.5px; + text-underline-offset: 3px; +} + +/* === print styles (new) === */ +@media print { + body { + background: #fff !important; + padding: 0 !important; + color: #000 !important; + } + .page-nav-cluster, .filter-bar, .pagination-row, + .field-help-popover, .result-card, .toast, + .settings-wrapper, .hero-summary, .updates-section, .notes-section, + .community-hub, .header > .github-link { + display: none !important; + } + .surface-panel, .plan-usage-panel, .table-wrapper, + .filter-dropdown, .dropdown-menu, .recommendation-card, + .surface-control, .surface-popover { + background: #fff !important; + box-shadow: none !important; + border: 1px solid #ccc !important; + backdrop-filter: none !important; + } + .comparison-table, .records-table, .models-mini-table { + box-shadow: none !important; + border: 1px solid #999 !important; + } + thead { display: table-header-group; } + tr { page-break-inside: avoid; } + h1, h2, h3 { page-break-after: avoid; } + a[href]::after { + content: " (" attr(href) ")"; + font-size: 11px; + color: #555; + } + a[href^="javascript:"]::after, + a[href^="#"]::after { content: ""; } +} \ No newline at end of file