@openprd/cli 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/.openprd/benchmarks/index.md +15 -1
  2. package/.openprd/config.yaml +10 -0
  3. package/.openprd/design/README.md +47 -0
  4. package/.openprd/design/README_EN.md +25 -0
  5. package/.openprd/design/active/asset-spec.md +15 -0
  6. package/.openprd/design/active/direction-plan.md +7 -0
  7. package/.openprd/design/active/facts-sheet.md +13 -0
  8. package/.openprd/design/active/image-preflight.md +9 -0
  9. package/.openprd/design/active/selected-direction.md +11 -0
  10. package/.openprd/design/anti-slop.md +16 -0
  11. package/.openprd/design/assets/dark-mesh.svg +14 -0
  12. package/.openprd/design/assets/paper-grid.svg +14 -0
  13. package/.openprd/design/assets/surface-presets.md +21 -0
  14. package/.openprd/design/assets/workbench-grid.svg +16 -0
  15. package/.openprd/design/checklists/ui-quality-gate.md +22 -0
  16. package/.openprd/design/components/component-catalog.md +42 -0
  17. package/.openprd/design/layouts/layout-catalog.json +45 -0
  18. package/.openprd/design/lenses/frontend-lenses.md +31 -0
  19. package/.openprd/design/recipes/content-experience.md +26 -0
  20. package/.openprd/design/recipes/operational-tool.md +25 -0
  21. package/.openprd/design/recipes/product-launch.md +26 -0
  22. package/.openprd/design/templates/README.md +36 -0
  23. package/.openprd/design/templates/README_EN.md +31 -0
  24. package/.openprd/design/templates/content-home.html +415 -0
  25. package/.openprd/design/templates/ops-dashboard.html +340 -0
  26. package/.openprd/design/templates/product-launch.html +360 -0
  27. package/.openprd/design/themes/theme-catalog.json +77 -0
  28. package/.openprd/engagements/active/prd.md +111 -100
  29. package/.openprd/schema/prd.schema.yaml +10 -0
  30. package/.openprd/templates/base/intake.md +4 -0
  31. package/.openprd/templates/base/prd.md +16 -6
  32. package/AGENTS.md +10 -7
  33. package/README.md +26 -28
  34. package/README_EN.md +3 -3
  35. package/package.json +41 -2
  36. package/scripts/openprd-codex-isolated-worker.mjs +799 -0
  37. package/skills/openprd-benchmark-router/SKILL.md +4 -0
  38. package/skills/openprd-frontend-design/SKILL.md +161 -0
  39. package/skills/openprd-frontend-design/references/design-asset-contract.md +34 -0
  40. package/skills/openprd-frontend-design/references/direction-engine.md +46 -0
  41. package/skills/openprd-harness/SKILL.md +37 -20
  42. package/skills/openprd-learning-review/SKILL.md +2 -1
  43. package/skills/openprd-learning-review/references/style-packs/xianxia-cultivation.prompt.md +1 -1
  44. package/skills/openprd-quality/SKILL.md +5 -3
  45. package/skills/openprd-requirement-intake/SKILL.md +27 -5
  46. package/skills/openprd-requirement-intake/references/prd-template-lenses.md +6 -3
  47. package/skills/openprd-requirement-intake/references/routing-rubric.md +9 -5
  48. package/skills/openprd-requirement-intake/references/startup-validation-lens.md +23 -0
  49. package/skills/openprd-router/SKILL.md +13 -5
  50. package/skills/openprd-shared/SKILL.md +38 -25
  51. package/src/agent-integration.js +120 -69
  52. package/src/brainstorm-artifacts.js +1657 -0
  53. package/src/brainstorm-presentation.js +223 -0
  54. package/src/brainstorm.js +603 -0
  55. package/src/cli/args.js +51 -3
  56. package/src/cli/doctor-print.js +34 -8
  57. package/src/cli/print.js +6 -0
  58. package/src/cli/quality-print.js +70 -0
  59. package/src/cli/run-print.js +43 -1
  60. package/src/cli/shared-print.js +33 -2
  61. package/src/cli/workflow-print.js +21 -0
  62. package/src/codex-hook-runner-template.mjs +838 -58
  63. package/src/design-starter-support.js +462 -0
  64. package/src/design-starter.js +1207 -0
  65. package/src/knowledge.js +232 -20
  66. package/src/learning-review.js +3 -3
  67. package/src/loop.js +839 -101
  68. package/src/openprd.js +86 -1
  69. package/src/openspec/change-validate.js +1 -0
  70. package/src/prd-core.js +18 -0
  71. package/src/quality-learning.js +50 -6
  72. package/src/quality.js +2 -2
  73. package/src/run-harness.js +191 -29
  74. package/src/self-update.js +301 -4
  75. package/src/standards.js +46 -5
  76. package/src/visual-prepare.js +940 -0
  77. package/src/workspace-core.js +137 -0
  78. package/src/workspace-workflow.js +190 -7
  79. package/.openprd/benchmarks/evidence/milvus-io-ai-code-review-gets-better-when-models-debate-claude-vs-gemini-vs-code.md +0 -14
  80. package/.openprd/benchmarks/evidence/nolanlawson-com-using-ai-to-write-better-code-more-slowly.md +0 -14
  81. package/.openprd/discovery/config.json +0 -35
  82. package/.openprd/engagements/active/flows.md +0 -35
  83. package/.openprd/engagements/active/handoff.md +0 -16
  84. package/.openprd/engagements/active/review.html +0 -61
  85. package/.openprd/engagements/active/roles.md +0 -22
  86. package/.openprd/engagements/work-units/wu-20260524015648-6d33ded7.json +0 -23
  87. package/.openprd/engagements/work-units/wu-20260602113956-a99b5b88.json +0 -18
  88. package/.openprd/engagements/work-units/wu-20260602122244-78656aaf.json +0 -18
  89. package/.openprd/engagements/work-units/wu-20260602122442-e96489e2.json +0 -18
  90. package/.openprd/engagements/work-units/wu-20260602132835-695429e8.json +0 -18
  91. package/.openprd/exports/.gitkeep +0 -0
  92. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/candidate.json +0 -78
  93. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/diagnostic-report.json +0 -129
  94. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/root-cause-candidates.json +0 -41
  95. package/.openprd/knowledge/candidates/candidate-turn-1780116203372-5f266a79e968c758/timeline.json +0 -14
  96. package/.openprd/knowledge/drafts/openprd-experience-diagnostic-candidate-turn-1780116203372-5f266a79e968c758/SKILL.md +0 -49
  97. package/.openprd/knowledge/index.json +0 -47
  98. package/.openprd/reviews/v0001.html +0 -1322
  99. package/.openprd/reviews/v0002.html +0 -1150
  100. package/.openprd/reviews/v0003.html +0 -1150
  101. package/.openprd/reviews/v0004.html +0 -1150
  102. package/.openprd/reviews/v0005.html +0 -1150
  103. package/.openprd/sessions/.gitkeep +0 -0
  104. package/.openprd/state/changes.json +0 -27
  105. package/.openprd/state/current.json +0 -505
  106. package/.openprd/state/release-ledger.json +0 -387
  107. package/.openprd/state/version-index.json +0 -67
  108. package/.openprd/state/versions/.gitkeep +0 -0
  109. package/.openprd/state/versions/v0001.json +0 -121
  110. package/.openprd/state/versions/v0001.md +0 -161
  111. package/.openprd/state/versions/v0002.json +0 -264
  112. package/.openprd/state/versions/v0002.md +0 -183
  113. package/.openprd/state/versions/v0003.json +0 -269
  114. package/.openprd/state/versions/v0003.md +0 -188
  115. package/.openprd/state/versions/v0004.json +0 -274
  116. package/.openprd/state/versions/v0004.md +0 -193
  117. package/.openprd/state/versions/v0005.json +0 -299
  118. package/.openprd/state/versions/v0005.md +0 -189
  119. package/docs/assets/openprd-capability-overview-en.png +0 -0
  120. package/docs/assets/openprd-capability-overview-zh.png +0 -0
  121. package/docs/assets/openprd-learning-html.png +0 -0
  122. package/docs/assets/openprd-quality-html.png +0 -0
  123. package/docs/assets/openprd-requirement-routing-en.png +0 -0
  124. package/docs/assets/openprd-requirement-routing-en.svg +0 -102
  125. package/docs/assets/openprd-requirement-routing-zh-refined.png +0 -0
  126. package/docs/assets/openprd-requirement-routing-zh.png +0 -0
  127. package/docs/assets/openprd-requirement-routing-zh.svg +0 -102
  128. package/docs/assets/openprd-review-html.png +0 -0
  129. package/docs/assets/openprd-scenario-overview.png +0 -0
  130. package/docs/assets/openprd-scenario-overview.svg +0 -114
  131. package/docs/assets/openprd-self-evolving-mechanisms-en.png +0 -0
  132. package/docs/assets/openprd-self-evolving-mechanisms-zh.png +0 -0
  133. package/docs/assets/openprd-visual-compare-case-study-en.png +0 -0
  134. package/docs/assets/openprd-visual-compare-case-study-zh.png +0 -0
@@ -0,0 +1,340 @@
1
+ <!-- starter-defaults: lens=operational-density theme=tool-neutral layout=ops-density-grid -->
2
+ <!DOCTYPE html>
3
+ <html lang="zh-CN">
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>运营工作台模板</title>
8
+ <style>
9
+ :root {
10
+ --bg: #eef2f7;
11
+ --panel: #ffffff;
12
+ --panel-soft: #f8fafc;
13
+ --line: #d7e0ea;
14
+ --ink: #102131;
15
+ --muted: #566779;
16
+ --accent: #1967d2;
17
+ --accent-soft: rgba(25, 103, 210, 0.12);
18
+ --radius: 18px;
19
+ }
20
+
21
+ * { box-sizing: border-box; }
22
+ body {
23
+ margin: 0;
24
+ font-family: "Inter", "PingFang SC", sans-serif;
25
+ background: linear-gradient(180deg, #f6f8fb 0%, var(--bg) 100%);
26
+ color: var(--ink);
27
+ }
28
+
29
+ .page {
30
+ width: min(1280px, calc(100vw - 28px));
31
+ margin: 0 auto;
32
+ padding: 20px 0 32px;
33
+ }
34
+
35
+ .shell {
36
+ display: grid;
37
+ grid-template-columns: 260px minmax(0, 1fr);
38
+ gap: 16px;
39
+ }
40
+
41
+ .sidebar,
42
+ .topbar,
43
+ .panel {
44
+ border: 1px solid var(--line);
45
+ border-radius: var(--radius);
46
+ background: var(--panel);
47
+ }
48
+
49
+ .sidebar {
50
+ padding: 18px;
51
+ min-height: calc(100vh - 40px);
52
+ }
53
+
54
+ .brand {
55
+ font-size: 18px;
56
+ font-weight: 700;
57
+ }
58
+
59
+ .nav,
60
+ .stats,
61
+ .grid,
62
+ .subgrid {
63
+ display: grid;
64
+ gap: 12px;
65
+ }
66
+
67
+ .nav {
68
+ margin-top: 18px;
69
+ }
70
+
71
+ .nav-item,
72
+ .chip {
73
+ border-radius: 12px;
74
+ padding: 10px 12px;
75
+ }
76
+
77
+ .nav-item.active,
78
+ .chip {
79
+ background: var(--accent-soft);
80
+ color: var(--accent);
81
+ }
82
+
83
+ .main {
84
+ display: grid;
85
+ gap: 16px;
86
+ }
87
+
88
+ .topbar {
89
+ padding: 18px 20px;
90
+ display: flex;
91
+ justify-content: space-between;
92
+ align-items: center;
93
+ gap: 14px;
94
+ }
95
+
96
+ h1, h2, h3, p { margin: 0; }
97
+
98
+ .topbar p,
99
+ .panel p {
100
+ color: var(--muted);
101
+ line-height: 1.65;
102
+ }
103
+
104
+ .stats {
105
+ grid-template-columns: repeat(4, minmax(0, 1fr));
106
+ }
107
+
108
+ .panel {
109
+ padding: 18px;
110
+ }
111
+
112
+ .stat strong {
113
+ display: block;
114
+ margin-top: 10px;
115
+ font-size: 28px;
116
+ }
117
+
118
+ .grid {
119
+ grid-template-columns: 1.25fr 0.75fr;
120
+ }
121
+
122
+ .subgrid {
123
+ grid-template-columns: 0.9fr 1.1fr;
124
+ }
125
+
126
+ .list {
127
+ display: grid;
128
+ gap: 10px;
129
+ margin-top: 14px;
130
+ }
131
+
132
+ .row {
133
+ display: grid;
134
+ grid-template-columns: 1.2fr 0.7fr 0.6fr;
135
+ gap: 12px;
136
+ padding: 12px 14px;
137
+ border-radius: 14px;
138
+ background: var(--panel-soft);
139
+ }
140
+
141
+ .row strong,
142
+ .action strong,
143
+ .delta-row strong,
144
+ .topic-card strong {
145
+ display: block;
146
+ }
147
+
148
+ .row span,
149
+ .delta-row span {
150
+ color: var(--muted);
151
+ font-size: 13px;
152
+ }
153
+
154
+ .action-list {
155
+ margin-top: 14px;
156
+ display: grid;
157
+ gap: 10px;
158
+ }
159
+
160
+ .action {
161
+ padding: 12px 14px;
162
+ border-radius: 14px;
163
+ border: 1px solid var(--line);
164
+ }
165
+
166
+ .action p {
167
+ margin-top: 6px;
168
+ color: var(--muted);
169
+ line-height: 1.6;
170
+ }
171
+
172
+ .delta-list,
173
+ .topic-list {
174
+ display: grid;
175
+ gap: 10px;
176
+ margin-top: 14px;
177
+ }
178
+
179
+ .delta-row,
180
+ .topic-card {
181
+ padding: 14px;
182
+ border-radius: 14px;
183
+ background: var(--panel-soft);
184
+ }
185
+
186
+ .delta-row p,
187
+ .topic-card p {
188
+ margin-top: 6px;
189
+ }
190
+
191
+ @media (max-width: 980px) {
192
+ .shell,
193
+ .stats,
194
+ .grid,
195
+ .subgrid {
196
+ grid-template-columns: 1fr;
197
+ }
198
+
199
+ .sidebar {
200
+ min-height: auto;
201
+ }
202
+ }
203
+ </style>
204
+ </head>
205
+ <body>
206
+ <main class="page">
207
+ <div class="shell">
208
+ <aside class="sidebar">
209
+ <div class="brand">[工作台 / 系统名]</div>
210
+ <div class="nav">
211
+ <div class="nav-item active">[当前模块]</div>
212
+ <div class="nav-item">[模块二]</div>
213
+ <div class="nav-item">[模块三]</div>
214
+ <div class="nav-item">[模块四]</div>
215
+ </div>
216
+ </aside>
217
+
218
+ <section class="main">
219
+ <header class="topbar">
220
+ <div>
221
+ <span class="chip">运营工作台模板</span>
222
+ <h1 style="margin-top: 10px; font-size: 30px;">[本页标题]</h1>
223
+ <p style="margin-top: 8px;">[一句说明这页帮助用户每天更快做什么。]</p>
224
+ </div>
225
+ <div class="chip">[筛选 / 时间范围 / 当前状态]</div>
226
+ </header>
227
+
228
+ <section class="stats">
229
+ <article class="panel stat">
230
+ <span class="chip">[总览标签一]</span>
231
+ <strong>[指标一]</strong>
232
+ <p>[指标说明一]</p>
233
+ </article>
234
+ <article class="panel stat">
235
+ <span class="chip">[总览标签二]</span>
236
+ <strong>[指标二]</strong>
237
+ <p>[指标说明二]</p>
238
+ </article>
239
+ <article class="panel stat">
240
+ <span class="chip">[总览标签三]</span>
241
+ <strong>[指标三]</strong>
242
+ <p>[指标说明三]</p>
243
+ </article>
244
+ <article class="panel stat">
245
+ <span class="chip">[总览标签四]</span>
246
+ <strong>[指标四]</strong>
247
+ <p>[指标说明四]</p>
248
+ </article>
249
+ </section>
250
+
251
+ <section class="grid">
252
+ <article class="panel">
253
+ <h2>[主要列表 / 队列]</h2>
254
+ <p style="margin-top: 8px;">[把用户最常扫的对象放在左边。]</p>
255
+ <div class="list">
256
+ <div class="row">
257
+ <strong>[对象一]</strong>
258
+ <span>[状态一]</span>
259
+ <span>[动作一标签]</span>
260
+ </div>
261
+ <div class="row">
262
+ <strong>[对象二]</strong>
263
+ <span>[状态二]</span>
264
+ <span>[动作二标签]</span>
265
+ </div>
266
+ <div class="row">
267
+ <strong>[对象三]</strong>
268
+ <span>[状态三]</span>
269
+ <span>[动作三标签]</span>
270
+ </div>
271
+ </div>
272
+ </article>
273
+
274
+ <article class="panel">
275
+ <h2>[待处理动作]</h2>
276
+ <p style="margin-top: 8px;">[把判断和下一步放在同一视图里。]</p>
277
+ <div class="action-list">
278
+ <div class="action">
279
+ <strong>[动作一]</strong>
280
+ <p>[动作一说明]</p>
281
+ </div>
282
+ <div class="action">
283
+ <strong>[动作二]</strong>
284
+ <p>[动作二说明]</p>
285
+ </div>
286
+ <div class="action">
287
+ <strong>[动作三]</strong>
288
+ <p>[动作三说明]</p>
289
+ </div>
290
+ </div>
291
+ </article>
292
+ </section>
293
+
294
+ <section class="subgrid">
295
+ <article class="panel">
296
+ <h2>[最近订阅变化]</h2>
297
+ <p style="margin-top: 8px;">[用近 7 天的订阅变化帮用户判断哪类内容值得继续发。]</p>
298
+ <div class="delta-list">
299
+ <div class="delta-row">
300
+ <strong>[变化项一]</strong>
301
+ <span>[变化说明一]</span>
302
+ <p>[变化备注一]</p>
303
+ </div>
304
+ <div class="delta-row">
305
+ <strong>[变化项二]</strong>
306
+ <span>[变化说明二]</span>
307
+ <p>[变化备注二]</p>
308
+ </div>
309
+ <div class="delta-row">
310
+ <strong>[变化项三]</strong>
311
+ <span>[变化说明三]</span>
312
+ <p>[变化备注三]</p>
313
+ </div>
314
+ </div>
315
+ </article>
316
+
317
+ <article class="panel">
318
+ <h2>[选题状态]</h2>
319
+ <p style="margin-top: 8px;">[把待写、待发和待放弃的题目放到同一块,避免开新坑太轻松。]</p>
320
+ <div class="topic-list">
321
+ <div class="topic-card">
322
+ <strong>[选题一]</strong>
323
+ <p>[选题一说明]</p>
324
+ </div>
325
+ <div class="topic-card">
326
+ <strong>[选题二]</strong>
327
+ <p>[选题二说明]</p>
328
+ </div>
329
+ <div class="topic-card">
330
+ <strong>[选题三]</strong>
331
+ <p>[选题三说明]</p>
332
+ </div>
333
+ </div>
334
+ </article>
335
+ </section>
336
+ </section>
337
+ </div>
338
+ </main>
339
+ </body>
340
+ </html>
@@ -0,0 +1,360 @@
1
+ <!-- starter-defaults: lens=product-launch theme=deep-launch layout=product-spec-runway -->
2
+ <!DOCTYPE html>
3
+ <html lang="zh-CN">
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>产品发布页模板</title>
8
+ <style>
9
+ :root {
10
+ --bg: #0d1116;
11
+ --panel: rgba(16, 22, 30, 0.88);
12
+ --panel-soft: rgba(24, 30, 38, 0.74);
13
+ --line: rgba(255, 255, 255, 0.1);
14
+ --text: #f4f7fb;
15
+ --muted: rgba(244, 247, 251, 0.72);
16
+ --accent: #7ce0c3;
17
+ --accent-soft: rgba(124, 224, 195, 0.14);
18
+ --radius: 24px;
19
+ }
20
+
21
+ * { box-sizing: border-box; }
22
+ body {
23
+ margin: 0;
24
+ font-family: "Inter", "PingFang SC", sans-serif;
25
+ background:
26
+ radial-gradient(circle at top center, rgba(124, 224, 195, 0.16), transparent 28%),
27
+ linear-gradient(180deg, #091018 0%, var(--bg) 100%);
28
+ color: var(--text);
29
+ }
30
+
31
+ .page {
32
+ width: min(1180px, calc(100vw - 32px));
33
+ margin: 0 auto;
34
+ padding: 28px 0 56px;
35
+ }
36
+
37
+ .hero,
38
+ .section,
39
+ .cta {
40
+ border: 1px solid var(--line);
41
+ border-radius: var(--radius);
42
+ background: var(--panel);
43
+ }
44
+
45
+ .hero {
46
+ padding: 32px;
47
+ display: grid;
48
+ grid-template-columns: 1.15fr 0.85fr;
49
+ gap: 22px;
50
+ }
51
+
52
+ .eyebrow,
53
+ .chip {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ padding: 6px 12px;
57
+ border-radius: 999px;
58
+ background: var(--accent-soft);
59
+ color: var(--accent);
60
+ font-size: 13px;
61
+ }
62
+
63
+ h1, h2, h3, p { margin: 0; }
64
+
65
+ h1 {
66
+ margin-top: 18px;
67
+ font-size: clamp(40px, 6vw, 70px);
68
+ line-height: 0.96;
69
+ letter-spacing: 0;
70
+ }
71
+
72
+ .lede {
73
+ margin-top: 18px;
74
+ max-width: 50ch;
75
+ color: var(--muted);
76
+ line-height: 1.7;
77
+ }
78
+
79
+ .actions,
80
+ .metrics,
81
+ .feature-grid,
82
+ .proof-grid {
83
+ display: grid;
84
+ gap: 14px;
85
+ }
86
+
87
+ .actions {
88
+ margin-top: 24px;
89
+ grid-template-columns: repeat(2, minmax(0, 1fr));
90
+ }
91
+
92
+ .button,
93
+ .ghost {
94
+ min-height: 48px;
95
+ border-radius: 999px;
96
+ border: 1px solid var(--line);
97
+ display: inline-flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ text-decoration: none;
101
+ padding: 0 18px;
102
+ }
103
+
104
+ .button {
105
+ background: var(--text);
106
+ color: #081019;
107
+ }
108
+
109
+ .ghost {
110
+ color: var(--text);
111
+ }
112
+
113
+ .showcase {
114
+ padding: 22px;
115
+ border-radius: 22px;
116
+ min-height: 100%;
117
+ background:
118
+ linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.01)),
119
+ linear-gradient(135deg, rgba(124, 224, 195, 0.14), transparent 55%);
120
+ display: grid;
121
+ gap: 14px;
122
+ }
123
+
124
+ .showcase-box,
125
+ .metric,
126
+ .feature,
127
+ .proof {
128
+ border: 1px solid var(--line);
129
+ border-radius: 18px;
130
+ background: var(--panel-soft);
131
+ }
132
+
133
+ .showcase-box {
134
+ min-height: 280px;
135
+ color: var(--muted);
136
+ }
137
+
138
+ .showcase-copy,
139
+ .proof-copy {
140
+ color: var(--muted);
141
+ line-height: 1.7;
142
+ }
143
+
144
+ .showcase-media,
145
+ .proof-media {
146
+ overflow: hidden;
147
+ border-radius: 18px;
148
+ border: 1px solid var(--line);
149
+ background: rgba(255, 255, 255, 0.03);
150
+ }
151
+
152
+ .showcase-media {
153
+ min-height: 280px;
154
+ }
155
+
156
+ .proof-media {
157
+ aspect-ratio: 16 / 9;
158
+ margin-bottom: 14px;
159
+ }
160
+
161
+ .media-frame,
162
+ .media-fallback {
163
+ min-height: inherit;
164
+ height: 100%;
165
+ }
166
+
167
+ .media-frame {
168
+ display: grid;
169
+ }
170
+
171
+ .media-frame img {
172
+ width: 100%;
173
+ height: 100%;
174
+ display: block;
175
+ object-fit: cover;
176
+ }
177
+
178
+ .media-frame figcaption,
179
+ .media-fallback span {
180
+ padding: 12px 14px;
181
+ font-size: 13px;
182
+ color: var(--muted);
183
+ }
184
+
185
+ .media-frame figcaption {
186
+ border-top: 1px solid var(--line);
187
+ background: rgba(9, 16, 24, 0.72);
188
+ }
189
+
190
+ .media-fallback {
191
+ display: grid;
192
+ place-items: center;
193
+ background:
194
+ linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.02)),
195
+ linear-gradient(135deg, rgba(124, 224, 195, 0.14), transparent 55%);
196
+ }
197
+
198
+ .metrics {
199
+ margin-top: 18px;
200
+ grid-template-columns: repeat(3, minmax(0, 1fr));
201
+ }
202
+
203
+ .metric,
204
+ .feature,
205
+ .proof {
206
+ padding: 18px;
207
+ }
208
+
209
+ .metric strong {
210
+ display: block;
211
+ font-size: 28px;
212
+ margin-bottom: 6px;
213
+ }
214
+
215
+ .section {
216
+ margin-top: 20px;
217
+ padding: 24px;
218
+ }
219
+
220
+ .section-head {
221
+ display: flex;
222
+ justify-content: space-between;
223
+ align-items: end;
224
+ gap: 18px;
225
+ margin-bottom: 18px;
226
+ }
227
+
228
+ .section-head p,
229
+ .feature p,
230
+ .proof p {
231
+ color: var(--muted);
232
+ line-height: 1.7;
233
+ }
234
+
235
+ .feature-grid,
236
+ .proof-grid {
237
+ grid-template-columns: repeat(3, minmax(0, 1fr));
238
+ }
239
+
240
+ .cta {
241
+ margin-top: 20px;
242
+ padding: 24px;
243
+ display: flex;
244
+ justify-content: space-between;
245
+ align-items: center;
246
+ gap: 18px;
247
+ }
248
+
249
+ @media (max-width: 920px) {
250
+ .hero,
251
+ .metrics,
252
+ .feature-grid,
253
+ .proof-grid,
254
+ .cta {
255
+ display: grid;
256
+ grid-template-columns: 1fr;
257
+ }
258
+ }
259
+ </style>
260
+ </head>
261
+ <body>
262
+ <main class="page">
263
+ <section class="hero">
264
+ <div>
265
+ <span class="eyebrow">发布型首页模板</span>
266
+ <h1>[产品名 / 发布主题]</h1>
267
+ <p class="lede">[用一句直接的话讲清楚这次发布带来的变化、面向的人群,以及为什么现在值得点进去。]</p>
268
+ <div class="actions">
269
+ <a class="button" href="#">[主动作]</a>
270
+ <a class="ghost" href="#">[次动作]</a>
271
+ </div>
272
+ <div class="metrics">
273
+ <article class="metric">
274
+ <span class="chip">事实</span>
275
+ <strong>[版本 / 日期]</strong>
276
+ <p>[把核实过的事实放这里]</p>
277
+ </article>
278
+ <article class="metric">
279
+ <span class="chip">价值</span>
280
+ <strong>[核心收益]</strong>
281
+ <p>[一句可感知的提升]</p>
282
+ </article>
283
+ <article class="metric">
284
+ <span class="chip">范围</span>
285
+ <strong>[适用对象]</strong>
286
+ <p>[谁最该看这一页]</p>
287
+ </article>
288
+ </div>
289
+ </div>
290
+ <aside class="showcase">
291
+ <div>
292
+ <span class="chip">主视觉 / 产品图 / 关键界面</span>
293
+ <p class="showcase-copy" style="margin-top: 12px;">[用真实产品图、关键界面,或至少清楚的产品结构示意,不要只放情绪渐变]</p>
294
+ </div>
295
+ <div class="showcase-box showcase-media">[主视觉媒体]</div>
296
+ </aside>
297
+ </section>
298
+
299
+ <section class="section">
300
+ <div class="section-head">
301
+ <div>
302
+ <span class="chip">What changed</span>
303
+ <h2 style="margin-top: 10px;">[这次发布的 3 个重点]</h2>
304
+ </div>
305
+ <p>[适合把功能、能力、权益或体验升级拆成三个可扫描模块。]</p>
306
+ </div>
307
+ <div class="feature-grid">
308
+ <article class="feature">
309
+ <h3>[重点一]</h3>
310
+ <p>[一句说明它带来的变化]</p>
311
+ </article>
312
+ <article class="feature">
313
+ <h3>[重点二]</h3>
314
+ <p>[一句说明它带来的变化]</p>
315
+ </article>
316
+ <article class="feature">
317
+ <h3>[重点三]</h3>
318
+ <p>[一句说明它带来的变化]</p>
319
+ </article>
320
+ </div>
321
+ </section>
322
+
323
+ <section class="section">
324
+ <div class="section-head">
325
+ <div>
326
+ <span class="chip">Proof</span>
327
+ <h2 style="margin-top: 10px;">[用证据讲,不只用形容词讲]</h2>
328
+ </div>
329
+ <p>[这里放规格、案例、截图、兼容范围、交付方式或上线信息。]</p>
330
+ </div>
331
+ <div class="proof-grid">
332
+ <article class="proof">
333
+ <div class="proof-media">[证据媒体一]</div>
334
+ <h3>[证据块一]</h3>
335
+ <p>[数据 / 截图 / 规格 / 范围]</p>
336
+ </article>
337
+ <article class="proof">
338
+ <div class="proof-media">[证据媒体二]</div>
339
+ <h3>[证据块二]</h3>
340
+ <p>[数据 / 截图 / 规格 / 范围]</p>
341
+ </article>
342
+ <article class="proof">
343
+ <div class="proof-media">[证据媒体三]</div>
344
+ <h3>[证据块三]</h3>
345
+ <p>[数据 / 截图 / 规格 / 范围]</p>
346
+ </article>
347
+ </div>
348
+ </section>
349
+
350
+ <section class="cta">
351
+ <div>
352
+ <span class="chip">Next</span>
353
+ <h2 style="margin-top: 10px;">[收尾 CTA 标题]</h2>
354
+ <p style="margin-top: 8px; color: var(--muted);">[把发布信息、受众和动作收成一句清楚的人话。]</p>
355
+ </div>
356
+ <a class="button" href="#">[最终动作]</a>
357
+ </section>
358
+ </main>
359
+ </body>
360
+ </html>