Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion HANDOFF.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
# WanMi HANDOFF

## 最新进度(2026-07-18 · Dark Vault 改版 + 国内访问卡顿修复)
## 最新进度(2026-07-20 · Elegant Green Gold 雅致绿金主题)

- 全站由浅色暖金升级为「雅致绿金」:墨绿 `#133429` 为品牌主色(主按钮/激活态/链接/侧栏/登录场景),暖白 `#f6f5f0`/`#fefdfa` 为底,香槟金 `#c89848` 降级为精品与重点资产专用(≤2% 面积)。`tokens.css` 全量重写并**移除暗色 `prefers-color-scheme` 媒体块**(按要求固定单一浅色)。
- 前台:搜索按钮/分页当前页/视图切换器改墨绿实心白字;「访问域名」由金字金边改为绿字绿边次按钮;精品卡身份改由金细边 + 顶部 44×2px 短金线 + 浅金底「★精选」徽章表达(正文保持深色);到期状态改三级(≤30 天警告、≤7 天与已过期危险,文案「已过期」);速览弹窗白面板 + 深绿遮罩,QR/价值维度低饱和底保留。
- 精品详情页:大标题由亮金改深色,访问按钮改实心墨绿,kicker 改中文「★ 精品域名」金棕字;Worker SSR 模板同步删掉遗留的 FEATURED DOMAIN ASSET / DISCOVER MORE 英文 kicker(上一轮只删了客户端侧)。
- 后台:登录页重做为深墨绿场景 + 左右分栏白卡(左品牌介绍区深绿 + 金点缀、右白表单,手机自动单栏);侧栏深墨绿渐变(从 `--brand` color-mix 派生,accent 覆盖时整体跟随),active 为白 10% 底 + 左侧 3px 香槟金短条 + 金图标;概览统计卡白卡 + 顶部语义细线(总数墨绿/展示绿/隐藏灰/精品金)+ 语义数值色;表头米白 `--background-soft`、行悬停 `--surface-hover`。admin.css 的黑金基础层与浅色覆盖层合并为单层。
- 概览 PV/UV 图修复既有 bug:UV 线原用 `var(--ink)`(浅色主题下=白色,白卡上不可见),改香槟金 `--gold-deep` 作第二数据线。
- accent_color 机制重做:新增 `src/client/lib/accent-color.ts`,历史默认色(含黑金 `#d8b638`、暖金 `#c4a242` 等 5 个)视为「未定制」清除覆盖;真自定义色整套派生 brand/strong/hover/bg/bg-strong/border/ring,配 5 项单测。新增迁移 `0022_elegant_green_accent.sql` 把历史默认值归一为 `#133429`(沿 0014 惯例,不动真自定义色)。**远程执行该迁移会把生产 accent_color 从 `#c4a242` 更新为 `#133429`,属主题配套变更。**
- 品牌资产同步:`favicon.svg` 墨绿底白菱金芯;`manifest.webmanifest` theme_color `#133429`;`index.html` theme-color `#f6f5f0`;精品 OG 图由黑底金字改墨绿底金字。
- CSS 清理:删除 hero-*、header-discover、premium-corner、copy-button、group-tabs、section-kicker、mobile-stats、domain-featured-dot、keyword-pill/domain-keywords、copy-filter-link、contact-modal/contact-list/qr-code、domain-list-head、catalogue-intro、row-details、integration-details、bulk-keywords、status-list、highlighted 等确认死类(TSX 全量交叉验证,含动态拼接 `density-${…}`/`badge-…` 检查后保留活类);棕色系历史阴影(rgba(64,42,20) 等 6 处)与纯黑阴影全部换绿倾向令牌;`--cream-*`、`--glow-gold`、`--gold-muted`、`--premium-fg`、`--ink`、`--foreground` 等死令牌删除;`--fg-3` 补定义(原引用 8 处但从未定义)。app.css 2110→1936 行,前台 CSS 产物 100.63→90.00KB(gzip 17.68→15.85)。
- 已知限制:管理员在站点设置输入过浅的自定义强调色仍可能破坏主按钮白字对比度(schema 仅校验 hex 格式);`--gold-bg`/`--gold-soft`/`--brand-secondary` 等主题 API 令牌暂无 CSS 引用,保留作设计系统接口。
- 生产数据核验(经 Cloudflare MCP 只读查询)发现两处生产侧问题并已随本轮修复:① `site_settings.site_name` 仍是历史品牌 `DOMAIN HUNTER`(copyright 同),新增 `0023_unify_brand_names.sql` 精确匹配修正为 `WanMi` / `© WanMi · 玩米`;② 生产 `/logo.svg`(藏蓝橙点图形)不在 git 中——是上次部署时构建机上未跟踪的本地文件被打进产物,下次从 git 构建部署必然 404 导致页首 Logo 死链,已新增绿金品牌 `public/logo.svg`(与 favicon 同构)补位。
- 部署前备份:本地 wrangler OAuth 过期无法跑 `pnpm db:backup`,改经 Cloudflare MCP 完成增量逻辑备份 `backups/wanmi-20260720-mcp-pre-green-gold.sql`——以 7-17 全量备份为基线,全表 `updated_at` 核验后仅 3 行变更(mx.ooo、site_settings、notification_settings),两份文件合并即完整现状;敏感表(sessions/密码哈希/渠道密文)本次部署零触碰,由 D1 Time Travel 30 天兜底。

## 前序进度(2026-07-18 · Dark Vault 改版 + 国内访问卡顿修复)

### 性能(「访问很卡」根因与修复)
- 根因一(主因):`index.html` 仍有 Google Fonts 的 Noto Sans SC `<link rel="stylesheet">` 外链。渲染阻塞资源在大陆不可达时要等 TCP 超时才放行渲染,国内用户白屏可达 20 秒以上。已彻底移除(含两个 preconnect),中文走系统字体栈;CSP 同步收紧不再放行 `fonts.googleapis.com`/`fonts.gstatic.com`(集成测试断言已反转)。
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
- D1:`wanmi-db`(绑定 `DB`)
- R2:`wanmi-assets`(绑定 `UPLOADS`)
- Cron:每天 `01:00 UTC`,即 `Asia/Shanghai 09:00`
- 当前设计基线:单一浅色暖金主题(2026-07-17,由黑金改版);域名简介为纯手动维护(AI 生成已于同日移除
- 当前设计基线:Elegant Green Gold 雅致绿金主题(2026-07-20,由浅色暖金改版)——墨绿为主、暖白为底、香槟金点缀;域名简介为纯手动维护(AI 生成已于 2026-07-17 移除

权威业务源为 `data/source/WanMi.csv`:859 条有效唯一记录。生产库还保留 3 条历史人工域名,因此线上合计 862 条;本次迁移与发布不得覆盖或归档这 3 条记录。

Expand All @@ -26,10 +26,11 @@

## 设计系统

- 仅提供单一黑金主题,不提供明暗主题切换,也不读取系统配色偏好。
- 仅提供单一浅色「雅致绿金」主题,不提供明暗主题切换,也不读取系统配色偏好。
- 根目录 `tokens.css` 是唯一设计令牌源;组件与运行时样式只引用 CSS 变量,不硬编码色值。
- 背景使用纯黑 OLED `#000000`,表面依次使用 `#151515`、`#1a1a1a`、`#1e1e1e`,唯一强调色为香槟金 `#d8b638`。
- 主、次、三级文字依次使用 `#f5f5f7`、`#a1a1a6`、`#6e6e73`。
- 暖白背景 `#f6f5f0`、奶油白卡片 `#fefdfa`,品牌主色为深墨绿 `#133429`(hover `#1e6b59`),香槟金 `#c89848` 仅表达精品与重点资产(占比 ≤2%),浅底金色小字一律 `--gold-text #79551f`。
- 主、次、三级文字依次使用 `#1f2a24`、`#5d675f`、`#7e877f`;卡片阴影统一为绿倾向低透明度令牌,禁止纯黑阴影。
- 站点设置 `accent_color` 由 `applyAccentColor` 整套派生(主色/hover/bg/border/ring 同步),历史默认值视为未定制。
- 保留 `prefers-reduced-motion` 与 `prefers-reduced-transparency` 退化;完整规范见 [`design.md`](design.md)。

## 公开站点
Expand Down
12 changes: 6 additions & 6 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="theme-color" content="#0a1211" />
<meta name="wanmi-build" content="domain-hunter-2026-07-19-v3" />
<meta name="description" content="DOMAIN HUNTER 精选域名资产展示" />
<meta property="og:title" content="DOMAIN HUNTER" />
<meta name="theme-color" content="#f6f5f0" />
<meta name="wanmi-build" content="elegant-green-gold-2026-07-20-v4" />
<meta name="description" content="玩米 域名展示与管理系统" />
<meta property="og:title" content="玩米" />
<meta property="og:description" content="精选域名展示与安全管理" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://wanmi.org/" />
<meta property="og:image" content="https://wanmi.org/api/public/og/wanmi.org" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="DOMAIN HUNTER" />
<meta name="twitter:title" content="玩米" />
<meta name="twitter:description" content="精选域名展示与安全管理" />
<meta name="twitter:image" content="https://wanmi.org/api/public/og/wanmi.org" />
<link rel="canonical" href="https://wanmi.org/" />
Expand All @@ -21,7 +21,7 @@
<!-- 全部字体自托管:Google Fonts 在中国大陆不可达,任何外链 stylesheet 都会阻塞渲染
直到连接超时(国内用户白屏 20 秒以上)。中文依赖系统字体栈(PingFang SC / 微软雅黑)。 -->
<link rel="preload" href="/fonts/manrope-latin-400-800.woff2" as="font" type="font/woff2" crossorigin />
<title>DOMAIN HUNTER</title>
<title>玩米 · 域名展示</title>
</head>
<body>
<div id="root"></div>
Expand Down
5 changes: 5 additions & 0 deletions migrations/0022_elegant_green_accent.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- 雅致绿金主题:将历史各轮默认强调色(珊瑚橙/黑金/暖金)归一为墨绿品牌色。
-- 仅匹配历史默认值,不覆盖管理员真正自定义的主题色(与 0014 同一惯例)。
UPDATE site_settings
SET accent_color = '#133429', updated_at = CURRENT_TIMESTAMP
WHERE accent_color IN ('#f97316', '#e85d2a', '#d8b638', '#b89530', '#c4a242');
10 changes: 10 additions & 0 deletions migrations/0023_unify_brand_names.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- 品牌统一:中文产品名「玩米」、英文产品名「WanMi」。
-- 生产 site_settings 仍残留历史品牌 DOMAIN HUNTER(前台 title/页首/页脚可见),
-- 仅精确匹配历史品牌值,不覆盖管理员设置的其他内容。
UPDATE site_settings
SET site_name = 'WanMi', updated_at = CURRENT_TIMESTAMP
WHERE site_name IN ('DOMAIN HUNTER', 'DomainHunter', 'domain hunter');

UPDATE site_settings
SET copyright_text = '© WanMi · 玩米', updated_at = CURRENT_TIMESTAMP
WHERE copyright_text IN ('@ DOMAIN HUNTER', '© DOMAIN HUNTER', '@DOMAIN HUNTER');
18 changes: 18 additions & 0 deletions migrations/0025_elegant_green_brand_final.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
-- 雅致绿金主题的最终品牌与主题色收敛。
-- 背景:0023_domain_hunter_branding / 0024_footer_brand_text(darwin 线)与
-- 0022_elegant_green_accent / 0023_unify_brand_names(win32 线)在两台机器上的
-- 应用顺序不同:远程按提交时序(DOMAIN HUNTER 线先、绿金线后)已收敛为绿金;
-- 本地合并后 0023_domain_hunter / 0024_footer 会晚于绿金迁移执行、把品牌改回
-- DOMAIN HUNTER + 黑金。本迁移排在所有品牌迁移之后,保证两端最终态一致。
-- 幂等:条件匹配历史品牌/历史默认色,不覆盖管理员自定义内容。
UPDATE site_settings
SET site_name = 'WanMi', updated_at = CURRENT_TIMESTAMP
WHERE site_name IN ('DOMAIN HUNTER', 'DomainHunter', 'domain hunter');

UPDATE site_settings
SET copyright_text = '© WanMi · 玩米', updated_at = CURRENT_TIMESTAMP
WHERE copyright_text IN ('@ DOMAIN HUNTER', '© DOMAIN HUNTER', '@DOMAIN HUNTER', '@2026');

UPDATE site_settings
SET accent_color = '#133429', updated_at = CURRENT_TIMESTAMP
WHERE accent_color IN ('#f97316', '#e85d2a', '#d8b638', '#b89530', '#c4a242', '#d4b252', '#2fbf9a', '#5a3e2b');
10 changes: 4 additions & 6 deletions public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 4 additions & 6 deletions public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions public/manifest.webmanifest
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"name": "DOMAIN HUNTER",
"short_name": "DOMAIN HUNTER",
"description": "DOMAIN HUNTER 精选域名资产展示",
"name": "玩米",
"short_name": "玩米",
"description": "玩米域名展示与管理系统",
"lang": "zh-CN",
"start_url": "/",
"display": "standalone",
"background_color": "#f7f7f5",
"theme_color": "#b89530",
"background_color": "#f6f5f0",
"theme_color": "#133429",
"icons": [
{
"src": "/favicon.svg",
Expand Down
2 changes: 1 addition & 1 deletion src/client/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { FeaturedDomainPage } from "./pages/public/FeaturedDomainPage";
const AdminApp = lazy(() => import("./pages/admin/AdminApp").then((module) => ({ default: module.AdminApp })));

function RouteLoading() {
return <div className="app-loading"><img className="brand-mark-img" src="/logo.svg" alt="" /><p>正在打开 DOMAIN HUNTER…</p></div>;
return <div className="app-loading"><img className="brand-mark-img" src="/logo.svg" alt="" /><p>正在打开玩米…</p></div>;
}

export function App() {
Expand Down
58 changes: 58 additions & 0 deletions src/client/lib/accent-color.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/* 站点设置 accent_color 的运行时应用。
雅致绿金主题的默认品牌色链在 tokens.css / app.css 中静态调校(观感最优);
管理员自定义颜色时必须整套派生 strong/hover/bg/border/ring,
只覆盖一个 --brand 会出现「按钮新色、分页/聚焦环仍是旧色」的割裂。 */

/** 当前主题的默认品牌色(tokens.css --brand-primary)。 */
export const THEME_BRAND_HEX = "#133429";

/* 历史各轮主题的默认 accent(珊瑚橙 → 黑金 → 暖金 → teal → 皮革棕 → 雅致绿金)。
命中即视为「管理员未定制」,走 CSS 静态令牌;仅真正的自定义色才做动态派生。 */
const HISTORICAL_DEFAULT_ACCENTS = new Set([
"#f97316",
"#e85d2a",
"#d8b638",
"#b89530",
"#c4a242",
"#d4b252",
"#2fbf9a",
"#5a3e2b",
THEME_BRAND_HEX,
]);

const ACCENT_PROPERTIES = [
"--brand",
"--brand-strong",
"--brand-hover",
"--brand-primary-light",
"--brand-primary-deep",
"--brand-bg",
"--brand-bg-strong",
"--brand-border",
"--brand-ring",
] as const;

function isValidHex(value: string): boolean {
return /^#[0-9a-f]{6}$/i.test(value);
}

/** 应用(或清除)管理员自定义强调色;派生规则与 tokens.css 的绿金默认链保持同一透明度节奏。 */
export function applyAccentColor(accent: string | null | undefined): void {
const root = document.documentElement.style;
const normalized = accent?.trim().toLowerCase() ?? "";

if (!isValidHex(normalized) || HISTORICAL_DEFAULT_ACCENTS.has(normalized)) {
for (const property of ACCENT_PROPERTIES) root.removeProperty(property);
return;
}

root.setProperty("--brand", normalized);
root.setProperty("--brand-strong", `color-mix(in oklab, ${normalized} 90%, #04120d)`);
root.setProperty("--brand-hover", `color-mix(in oklab, ${normalized} 72%, #ffffff)`);
root.setProperty("--brand-primary-light", `color-mix(in oklab, ${normalized} 72%, #ffffff)`);
root.setProperty("--brand-primary-deep", `color-mix(in oklab, ${normalized} 78%, #04120d)`);
root.setProperty("--brand-bg", `color-mix(in oklab, ${normalized} 8%, transparent)`);
root.setProperty("--brand-bg-strong", `color-mix(in oklab, ${normalized} 14%, transparent)`);
root.setProperty("--brand-border", `color-mix(in oklab, ${normalized} 26%, transparent)`);
root.setProperty("--brand-ring", `color-mix(in oklab, ${normalized} 20%, transparent)`);
}
Loading