一、④段整套同步(用户选候选 A)
- 新增 `references/stage-proto-doc/assets/产品文档模板.html`(16 KB/247 行,从备份拷、转 LF)。
- ④段 SKILL.md 换成备份 15:28 那版,并按模板口径改齐:
· 「产品文档框架」从「四块+一附录」改成**六节** —— 页面结构/功能清单/使用场景/操作流程/
跨页与界面状态/待确认与偏离;与模板同构,⛔ 不从空白页重写结构。
· 编号从 R/S/F 改成 **P 页面/S 场景/F 功能/J 二级功能**,各自唯一、按展示顺序通排。
· 保留旧版有价值的要求:每项功能补齐 做什么/入口在哪/输入边界/异常与恢复;重点功能三处标红;
横向流程图每步写清页面/功能/操作/完成判据。
· 完成标准「七节」→「六节」,自查清单同步换掉「需求」那批条目,补模板与配图两条。
· 路径 `designs/<项目>/` → `docs/pm/<项目>/ui/`(2 处)。
· 补回本机那条「每份产出文档开头都要有一张图」的引用(指向主 skill,段内不复述)。
- 主 skill 同步:四段结构表④行、④段沿革、画图小节(④段画页面结构图 + 用户路径)。
二、open-design 移到技能根(用户选候选 A)
- `git mv product-planning/references/stage-delivery/assets/open-design → open-design/`(4178 文件)。
- `.gitignore` 白名单加 `!/open-design/` —— 否则移出去就不再纳入版本控制。
- 引用改 11 处:路径形态 `assets/open-design/...` → `<技能根>/open-design/...`;
「随段携带的自带件」改称「同根技能」;「路径怎么找」那条改成自带件(段内相对路径)与
同根技能(`<技能根>/<技能名>/`)两类分开写。
- open-design 自己的 ATTRIBUTION.md 两处同步(它现在与 oil-ui-pro 同层)。
- 副作用(有益):命名闸门读数由 2063 降到 225 —— 此前它把 open-design 里 919 个第三方 md
当成规则一起扫了;现在只扫本包 23 个 md。已确认④段的 H1 与 4a/4b/4c 子步仍在检查范围内。
三、验收
- check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27。
- 活文件里 `assets/open-design` 残留 0;工作区 CRLF 文件 0。
93 lines
6.1 KiB
HTML
93 lines
6.1 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Tomato — focus screen</title>
|
|
<style>
|
|
:root {
|
|
--bg: #fafaf9; --fg: #1c1b1a; --muted: #6b6964; --border: #e6e4e0;
|
|
--accent: #c96442; --surface: #ffffff;
|
|
}
|
|
* { box-sizing: border-box; }
|
|
body { margin: 0; min-height: 100vh; background: var(--bg); display: flex; align-items: center; justify-content: center; padding: 32px; font: 14px/1.5 -apple-system, system-ui, sans-serif; color: var(--fg); }
|
|
.frame { width: 390px; height: 844px; background: black; border-radius: 56px; padding: 12px; box-shadow: 0 20px 60px rgba(0,0,0,0.18); position: relative; }
|
|
.frame::before { content: ''; position: absolute; top: 22px; left: 50%; transform: translateX(-50%); width: 124px; height: 36px; background: black; border-radius: 999px; z-index: 5; }
|
|
.screen { width: 100%; height: 100%; background: var(--bg); border-radius: 44px; overflow: hidden; display: flex; flex-direction: column; }
|
|
.status { padding: 14px 24px 6px; display: flex; justify-content: space-between; align-items: center; font-size: 14px; font-weight: 600; }
|
|
.status .right { display: flex; gap: 6px; align-items: center; }
|
|
.header { padding: 56px 24px 24px; }
|
|
.header .greeting { color: var(--muted); font-size: 14px; margin: 0 0 4px; }
|
|
.header h1 { margin: 0; font-size: 22px; letter-spacing: -0.01em; }
|
|
.timer-card { margin: 12px 24px; background: var(--accent); color: white; border-radius: 24px; padding: 28px 24px; text-align: center; }
|
|
.timer-card .label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; opacity: 0.85; margin: 0 0 4px; }
|
|
.timer-card .countdown { font-size: 64px; line-height: 1; letter-spacing: -0.03em; font-weight: 600; margin: 6px 0 18px; font-variant-numeric: tabular-nums; }
|
|
.timer-card .progress { height: 6px; background: rgba(255,255,255,0.25); border-radius: 999px; overflow: hidden; margin-bottom: 16px; }
|
|
.timer-card .progress > span { display: block; width: 38%; height: 100%; background: white; }
|
|
.timer-card .actions { display: flex; gap: 10px; justify-content: center; }
|
|
.timer-card button { font: inherit; cursor: pointer; padding: 10px 22px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.4); background: rgba(255,255,255,0.12); color: white; font-weight: 500; }
|
|
.timer-card button.primary { background: white; color: var(--accent); border-color: white; }
|
|
.section { padding: 18px 24px 0; }
|
|
.section .label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); margin: 0 0 10px; }
|
|
.stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
|
|
.stat { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; padding: 12px; }
|
|
.stat .v { font-size: 22px; letter-spacing: -0.01em; line-height: 1; margin-bottom: 4px; }
|
|
.stat .l { font-size: 11px; color: var(--muted); }
|
|
.tasks { padding: 18px 24px 8px; }
|
|
.task { display: flex; align-items: center; gap: 12px; padding: 14px 0; border-top: 1px solid var(--border); }
|
|
.task:first-child { border-top: none; }
|
|
.check { width: 20px; height: 20px; border: 1.5px solid var(--border); border-radius: 50%; flex-shrink: 0; }
|
|
.task.done .check { background: var(--accent); border-color: var(--accent); }
|
|
.task.done .check::after { content: '✓'; color: white; font-size: 13px; display: block; text-align: center; line-height: 18px; }
|
|
.task .body { flex: 1; }
|
|
.task .title { font-size: 14.5px; line-height: 1.3; }
|
|
.task.done .title { color: var(--muted); text-decoration: line-through; }
|
|
.task .meta { font-size: 11px; color: var(--muted); margin-top: 2px; }
|
|
.tabbar { margin-top: auto; display: grid; grid-template-columns: repeat(4, 1fr); padding: 10px 16px 28px; border-top: 1px solid var(--border); background: var(--surface); }
|
|
.tab { text-align: center; color: var(--muted); font-size: 11px; padding: 6px 0; }
|
|
.tab.active { color: var(--accent); font-weight: 500; }
|
|
.tab .icon { font-size: 18px; line-height: 1; margin-bottom: 4px; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="frame" data-od-id="frame">
|
|
<div class="screen">
|
|
<div class="status"><span>9:41</span><span class="right">·· 5G · 100%</span></div>
|
|
<div class="header" data-od-id="header">
|
|
<p class="greeting">Tuesday · April 22</p>
|
|
<h1>Two pomodoros to lunch.</h1>
|
|
</div>
|
|
<div class="timer-card" data-od-id="timer">
|
|
<p class="label">Focus session</p>
|
|
<div class="countdown">15:42</div>
|
|
<div class="progress"><span></span></div>
|
|
<div class="actions">
|
|
<button>Skip</button>
|
|
<button class="primary">Pause</button>
|
|
</div>
|
|
</div>
|
|
<div class="section" data-od-id="stats">
|
|
<p class="label">Today</p>
|
|
<div class="stats">
|
|
<div class="stat"><div class="v">3</div><div class="l">Sessions</div></div>
|
|
<div class="stat"><div class="v">75m</div><div class="l">Focused</div></div>
|
|
<div class="stat"><div class="v">2</div><div class="l">Tasks done</div></div>
|
|
</div>
|
|
</div>
|
|
<div class="tasks" data-od-id="tasks">
|
|
<p class="section label" style="padding: 0;">Up next</p>
|
|
<div class="task done"><div class="check"></div><div class="body"><div class="title">Review Q2 OKRs</div><div class="meta">25m · completed</div></div></div>
|
|
<div class="task"><div class="check"></div><div class="body"><div class="title">Draft sync-engine post</div><div class="meta">2 sessions estimated</div></div></div>
|
|
<div class="task"><div class="check"></div><div class="body"><div class="title">1:1 prep with Mira</div><div class="meta">1 session</div></div></div>
|
|
</div>
|
|
<nav class="tabbar" data-od-id="tabbar">
|
|
<div class="tab active"><div class="icon">⏱</div>Focus</div>
|
|
<div class="tab"><div class="icon">✓</div>Tasks</div>
|
|
<div class="tab"><div class="icon">📊</div>Stats</div>
|
|
<div class="tab"><div class="icon">⚙</div>Settings</div>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|