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