paseo-req-kit 1.13.0-beta.1 → 1.13.0-beta.2

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 (114) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bin/bootstrap.d.mts +1 -0
  3. package/bin/bootstrap.mjs +31 -5
  4. package/bin/req.mjs +9 -0
  5. package/contracts/cli-json.md +2 -0
  6. package/docs/adr/0033-prototype-review-and-ui-check.md +28 -0
  7. package/docs/adr/README.md +1 -0
  8. package/docs/guide//344/275/277/347/224/250/350/200/205/346/214/207/345/215/227.md +8 -0
  9. package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +1 -1
  10. package/docs/guide//351/241/271/347/233/256/345/256/232/345/210/266/344/270/216/350/277/220/350/241/214/350/247/204/345/210/231.md +7 -1
  11. package/engine/prompts/03-design.md +5 -1
  12. package/engine/prompts/04b-design-revise.md +1 -1
  13. package/engine/prompts/browser-verify.md +2 -2
  14. package/engine/prompts/ui-check.md +15 -0
  15. package/engine/src/api.ts +17 -2
  16. package/engine/src/config-view.ts +1 -1
  17. package/engine/src/pipeline.ts +15 -7
  18. package/engine/src/review-assets/app.css +420 -0
  19. package/engine/src/review-assets/app.html +95 -0
  20. package/engine/src/review-assets/app.js +954 -0
  21. package/engine/src/review.ts +570 -0
  22. package/engine/src/ui-check-page.js +208 -0
  23. package/engine/src/ui-check.ts +366 -0
  24. package/package.json +1 -1
  25. package/paseo-plugin/client/data.ts +12 -1
  26. package/paseo-plugin/client/detail.tsx +3 -0
  27. package/paseo-plugin/client/inbox.tsx +2 -0
  28. package/paseo-plugin/client/review-link.tsx +29 -0
  29. package/paseo-plugin/index.server.ts +2 -1
  30. package/paseo-plugin/package.json +1 -1
  31. package/paseo-plugin/server/handlers.ts +7 -1
  32. package/paseo-plugin/shared/contracts.ts +9 -0
  33. package/site-dist/404.html +2 -2
  34. package/site-dist/assets/{app.C_2Vhmv-.js → app.DWPPPhFm.js} +1 -1
  35. package/site-dist/assets/changelog.md.CoelFFCL.js +1 -0
  36. package/site-dist/assets/chunks/@localSearchIndexroot.Hdq0-4L3.js +1 -0
  37. package/site-dist/assets/chunks/{VPLocalSearchBox.zPMXlb4V.js → VPLocalSearchBox.D3_9dRGY.js} +1 -1
  38. package/site-dist/assets/chunks/{theme.DRjHgCIR.js → theme.Bm8aLiLN.js} +2 -2
  39. package/site-dist/assets/{guide_getting-started.md.DjqrOQ_8.js → guide_getting-started.md.B4GJeoPz.js} +1 -1
  40. package/site-dist/assets/{guide_getting-started.md.DjqrOQ_8.lean.js → guide_getting-started.md.B4GJeoPz.lean.js} +1 -1
  41. package/site-dist/assets/guide_maintainer.md.RZIzyCTV.js +1 -0
  42. package/site-dist/assets/{guide_maintainer.md.C7Aav_lk.lean.js → guide_maintainer.md.RZIzyCTV.lean.js} +1 -1
  43. package/site-dist/assets/{guide_project.md.r2g5uU_4.js → guide_project.md.nGlTCo4D.js} +2 -2
  44. package/site-dist/assets/{guide_project.md.r2g5uU_4.lean.js → guide_project.md.nGlTCo4D.lean.js} +2 -2
  45. package/site-dist/assets/{guide_user.md.FpCmz9S0.js → guide_user.md.tiHFxIsQ.js} +1 -1
  46. package/site-dist/assets/guide_user.md.tiHFxIsQ.lean.js +1 -0
  47. package/site-dist/assets/reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.js +1 -0
  48. package/site-dist/assets/reference_adr_0033-prototype-review-and-ui-check.md.hFcQzmaa.lean.js +1 -0
  49. package/site-dist/assets/{reference_adr_index.md.DTVyIA6V.js → reference_adr_index.md.BYF-Ofor.js} +1 -1
  50. package/site-dist/assets/{reference_adr_index.md.DTVyIA6V.lean.js → reference_adr_index.md.BYF-Ofor.lean.js} +1 -1
  51. package/site-dist/assets/{reference_contracts_cli-json.md.gkER6rX7.js → reference_contracts_cli-json.md.N-v2HNUd.js} +1 -1
  52. package/site-dist/assets/{reference_contracts_cli-json.md.gkER6rX7.lean.js → reference_contracts_cli-json.md.N-v2HNUd.lean.js} +1 -1
  53. package/site-dist/changelog.html +5 -5
  54. package/site-dist/guide/getting-started.html +5 -5
  55. package/site-dist/guide/how-it-works.html +4 -4
  56. package/site-dist/guide/index.html +4 -4
  57. package/site-dist/guide/install.html +4 -4
  58. package/site-dist/guide/maintainer.html +5 -5
  59. package/site-dist/guide/phases.html +4 -4
  60. package/site-dist/guide/project.html +6 -6
  61. package/site-dist/guide/user.html +5 -5
  62. package/site-dist/hashmap.json +1 -1
  63. package/site-dist/index.html +4 -4
  64. package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +4 -4
  65. package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +4 -4
  66. package/site-dist/reference/adr/0003-script-engine-not-hub.html +4 -4
  67. package/site-dist/reference/adr/0004-result-files.html +4 -4
  68. package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +4 -4
  69. package/site-dist/reference/adr/0006-skill-install-targets.html +4 -4
  70. package/site-dist/reference/adr/0007-own-interview-skill.html +4 -4
  71. package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +4 -4
  72. package/site-dist/reference/adr/0009-versioned-install-layout.html +4 -4
  73. package/site-dist/reference/adr/0010-generated-feature-overview.html +4 -4
  74. package/site-dist/reference/adr/0011-resume-after-completion.html +4 -4
  75. package/site-dist/reference/adr/0012-review-panel.html +4 -4
  76. package/site-dist/reference/adr/0013-no-release-tooling.html +4 -4
  77. package/site-dist/reference/adr/0014-notifier-slot.html +4 -4
  78. package/site-dist/reference/adr/0015-incremental-continue.html +4 -4
  79. package/site-dist/reference/adr/0016-upgrade-from-tags.html +4 -4
  80. package/site-dist/reference/adr/0017-use-paseo-capabilities.html +4 -4
  81. package/site-dist/reference/adr/0018-own-worktree-option.html +4 -4
  82. package/site-dist/reference/adr/0019-parallel-orchestration.html +4 -4
  83. package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +4 -4
  84. package/site-dist/reference/adr/0021-npm-version-manager.html +4 -4
  85. package/site-dist/reference/adr/0022-develop-and-verify-phases.html +4 -4
  86. package/site-dist/reference/adr/0023-types-gate-slices.html +4 -4
  87. package/site-dist/reference/adr/0024-confirm-early-review-axes.html +4 -4
  88. package/site-dist/reference/adr/0025-joint-requirements.html +4 -4
  89. package/site-dist/reference/adr/0026-machine-records-and-api.html +4 -4
  90. package/site-dist/reference/adr/0027-paseo-plugin.html +4 -4
  91. package/site-dist/reference/adr/0028-external-integrations.html +4 -4
  92. package/site-dist/reference/adr/0029-requirements-from-cards.html +4 -4
  93. package/site-dist/reference/adr/0030-card-intake-process.html +4 -4
  94. package/site-dist/reference/adr/0031-fewer-interventions.html +4 -4
  95. package/site-dist/reference/adr/0032-npm-only-install.html +4 -4
  96. package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +30 -0
  97. package/site-dist/reference/adr/index.html +5 -5
  98. package/site-dist/reference/commands.html +4 -4
  99. package/site-dist/reference/config.html +4 -4
  100. package/site-dist/reference/contracts/cli-json.html +5 -5
  101. package/site-dist/reference/contracts/feature-files.html +4 -4
  102. package/site-dist/reference/contracts/index.html +4 -4
  103. package/site-dist/reference/contracts/notifier-event.html +4 -4
  104. package/site-dist/reference/contracts/result-file.html +4 -4
  105. package/site-dist/reference/contracts/spec.html +4 -4
  106. package/site-dist/reference/contracts/state.html +4 -4
  107. package/site-dist/reference/contracts/usage-record.html +4 -4
  108. package/site-dist/reference/contracts/verify.html +4 -4
  109. package/site-dist/reference/scope.html +4 -4
  110. package/site-dist/assets/changelog.md.VHiXRXap.js +0 -1
  111. package/site-dist/assets/chunks/@localSearchIndexroot.hC_y1UNZ.js +0 -1
  112. package/site-dist/assets/guide_maintainer.md.C7Aav_lk.js +0 -1
  113. package/site-dist/assets/guide_user.md.FpCmz9S0.lean.js +0 -1
  114. /package/site-dist/assets/{changelog.md.VHiXRXap.lean.js → changelog.md.CoelFFCL.lean.js} +0 -0
@@ -0,0 +1,420 @@
1
+ :root {
2
+ --bg: #f6f7f9;
3
+ --surface: #ffffff;
4
+ --surface-2: #f1f3f6;
5
+ --text: #1c2430;
6
+ --muted: #5d6b7c;
7
+ --border: #dfe3e9;
8
+ --accent: #2457d6;
9
+ --accent-text: #ffffff;
10
+ --accent-soft: #e8eefc;
11
+ --region: #d97706;
12
+ --pin: #e11d48;
13
+ --ok: #15803d;
14
+ --danger: #b91c1c;
15
+ --shadow: 0 8px 28px rgba(20, 30, 50, 0.16);
16
+ color-scheme: light;
17
+ }
18
+ @media (prefers-color-scheme: dark) {
19
+ :root {
20
+ --bg: #12161c;
21
+ --surface: #1a2029;
22
+ --surface-2: #222a35;
23
+ --text: #e6eaf0;
24
+ --muted: #9aa7b8;
25
+ --border: #2e3846;
26
+ --accent: #6f9bff;
27
+ --accent-text: #0d1420;
28
+ --accent-soft: #1f2c47;
29
+ --region: #f59e0b;
30
+ --pin: #fb7185;
31
+ --ok: #4ade80;
32
+ --danger: #f87171;
33
+ --shadow: 0 8px 28px rgba(0, 0, 0, 0.5);
34
+ color-scheme: dark;
35
+ }
36
+ }
37
+ * {
38
+ box-sizing: border-box;
39
+ }
40
+ [hidden] {
41
+ display: none !important;
42
+ }
43
+ html,
44
+ body {
45
+ margin: 0;
46
+ background: var(--bg);
47
+ color: var(--text);
48
+ font: 14px/1.55 system-ui, -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
49
+ }
50
+ button,
51
+ input,
52
+ textarea {
53
+ font: inherit;
54
+ color: inherit;
55
+ }
56
+ .top {
57
+ position: sticky;
58
+ top: 0;
59
+ z-index: 10;
60
+ background: var(--surface);
61
+ border-bottom: 1px solid var(--border);
62
+ padding: 12px 20px;
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ gap: 10px 24px;
66
+ align-items: center;
67
+ justify-content: space-between;
68
+ }
69
+ .heading {
70
+ display: flex;
71
+ align-items: baseline;
72
+ gap: 10px;
73
+ min-width: 0;
74
+ }
75
+ .eyebrow {
76
+ font-size: 12px;
77
+ font-weight: 600;
78
+ color: var(--accent);
79
+ white-space: nowrap;
80
+ }
81
+ h1 {
82
+ font-size: 17px;
83
+ margin: 0;
84
+ overflow: hidden;
85
+ text-overflow: ellipsis;
86
+ white-space: nowrap;
87
+ }
88
+ .pill {
89
+ font-size: 12px;
90
+ padding: 2px 10px;
91
+ border-radius: 999px;
92
+ background: var(--surface-2);
93
+ color: var(--muted);
94
+ white-space: nowrap;
95
+ }
96
+ .pill.wait {
97
+ background: var(--accent-soft);
98
+ color: var(--accent);
99
+ font-weight: 600;
100
+ }
101
+ .controls {
102
+ display: flex;
103
+ flex-wrap: wrap;
104
+ gap: 8px 16px;
105
+ align-items: center;
106
+ }
107
+ .group {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 6px;
111
+ }
112
+ .label {
113
+ color: var(--muted);
114
+ font-size: 12px;
115
+ }
116
+ .seg {
117
+ display: inline-flex;
118
+ border: 1px solid var(--border);
119
+ border-radius: 8px;
120
+ overflow: hidden;
121
+ flex-wrap: wrap;
122
+ }
123
+ .seg button {
124
+ border: 0;
125
+ background: transparent;
126
+ padding: 5px 11px;
127
+ cursor: pointer;
128
+ font-size: 13px;
129
+ }
130
+ .seg button + button {
131
+ border-left: 1px solid var(--border);
132
+ }
133
+ .seg button[aria-pressed="true"] {
134
+ background: var(--accent);
135
+ color: var(--accent-text);
136
+ }
137
+ .seg button:focus-visible,
138
+ .chips button:focus-visible,
139
+ .list button:focus-visible,
140
+ .actions button:focus-visible,
141
+ .pop button:focus-visible {
142
+ outline: 2px solid var(--accent);
143
+ outline-offset: 2px;
144
+ }
145
+ .check {
146
+ display: inline-flex;
147
+ gap: 6px;
148
+ align-items: center;
149
+ font-size: 13px;
150
+ cursor: pointer;
151
+ }
152
+ .layout {
153
+ display: grid;
154
+ grid-template-columns: minmax(0, 1fr) 360px;
155
+ gap: 16px;
156
+ padding: 16px 20px 32px;
157
+ align-items: start;
158
+ }
159
+ @media (max-width: 1000px) {
160
+ .layout {
161
+ grid-template-columns: 1fr;
162
+ }
163
+ }
164
+ .stage {
165
+ min-width: 0;
166
+ }
167
+ .hint {
168
+ margin: 0 0 8px;
169
+ color: var(--muted);
170
+ font-size: 13px;
171
+ }
172
+ .frame-wrap {
173
+ overflow: auto;
174
+ background: repeating-conic-gradient(var(--surface-2) 0% 25%, transparent 0% 50%) 50% / 16px 16px;
175
+ border: 1px solid var(--border);
176
+ border-radius: 10px;
177
+ padding: 12px;
178
+ max-height: calc(100vh - 150px);
179
+ }
180
+ .sizer {
181
+ position: relative;
182
+ margin: 0 auto;
183
+ overflow: hidden;
184
+ box-shadow: var(--shadow);
185
+ border-radius: 4px;
186
+ background: #fff;
187
+ }
188
+ iframe {
189
+ position: absolute;
190
+ left: 0;
191
+ top: 0;
192
+ display: block;
193
+ border: 0;
194
+ background: #fff;
195
+ transform-origin: 0 0;
196
+ }
197
+ .empty {
198
+ padding: 40px;
199
+ text-align: center;
200
+ color: var(--muted);
201
+ background: var(--surface);
202
+ border: 1px dashed var(--border);
203
+ border-radius: 10px;
204
+ }
205
+ .side {
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: 12px;
209
+ position: sticky;
210
+ top: 80px;
211
+ max-height: calc(100vh - 96px);
212
+ overflow: auto;
213
+ }
214
+ .card {
215
+ background: var(--surface);
216
+ border: 1px solid var(--border);
217
+ border-radius: 10px;
218
+ padding: 12px 14px;
219
+ }
220
+ .card h2,
221
+ .card summary {
222
+ font-size: 14px;
223
+ font-weight: 600;
224
+ margin: 0 0 8px;
225
+ }
226
+ .card summary {
227
+ cursor: pointer;
228
+ margin: 0;
229
+ }
230
+ details[open] summary {
231
+ margin-bottom: 6px;
232
+ }
233
+ .card ol {
234
+ margin: 0;
235
+ padding-left: 18px;
236
+ color: var(--muted);
237
+ }
238
+ .card ol li + li {
239
+ margin-top: 4px;
240
+ }
241
+ .count {
242
+ color: var(--muted);
243
+ font-weight: 400;
244
+ }
245
+ .list {
246
+ list-style: none;
247
+ margin: 0;
248
+ padding: 0;
249
+ display: flex;
250
+ flex-direction: column;
251
+ gap: 6px;
252
+ }
253
+ .list li {
254
+ border: 1px solid var(--border);
255
+ border-radius: 8px;
256
+ padding: 8px 10px;
257
+ background: var(--surface);
258
+ }
259
+ .list li.flash {
260
+ border-color: var(--accent);
261
+ background: var(--accent-soft);
262
+ }
263
+ .list .row {
264
+ display: flex;
265
+ gap: 8px;
266
+ align-items: flex-start;
267
+ }
268
+ .badge {
269
+ flex: none;
270
+ min-width: 22px;
271
+ height: 22px;
272
+ border-radius: 999px;
273
+ display: inline-flex;
274
+ align-items: center;
275
+ justify-content: center;
276
+ font-size: 12px;
277
+ font-weight: 700;
278
+ padding: 0 6px;
279
+ }
280
+ .badge.region {
281
+ background: var(--region);
282
+ color: #111;
283
+ }
284
+ .badge.pin {
285
+ background: var(--pin);
286
+ color: #fff;
287
+ }
288
+ .grow {
289
+ flex: 1;
290
+ min-width: 0;
291
+ }
292
+ .strong {
293
+ font-weight: 600;
294
+ }
295
+ .muted {
296
+ color: var(--muted);
297
+ }
298
+ .small {
299
+ font-size: 12px;
300
+ }
301
+ .linkish {
302
+ border: 0;
303
+ background: none;
304
+ color: var(--accent);
305
+ cursor: pointer;
306
+ padding: 0 2px;
307
+ font-size: 12px;
308
+ }
309
+ .linkish.danger {
310
+ color: var(--danger);
311
+ }
312
+ .field {
313
+ display: flex;
314
+ flex-direction: column;
315
+ gap: 4px;
316
+ margin-top: 8px;
317
+ }
318
+ .field span {
319
+ font-size: 12px;
320
+ color: var(--muted);
321
+ }
322
+ .field input,
323
+ .field textarea {
324
+ width: 100%;
325
+ border: 1px solid var(--border);
326
+ border-radius: 8px;
327
+ padding: 7px 9px;
328
+ background: var(--surface);
329
+ resize: vertical;
330
+ }
331
+ .field input:focus,
332
+ .field textarea:focus {
333
+ outline: 2px solid var(--accent);
334
+ outline-offset: 0;
335
+ border-color: transparent;
336
+ }
337
+ .actions {
338
+ display: flex;
339
+ flex-direction: column;
340
+ gap: 8px;
341
+ }
342
+ .actions p {
343
+ margin: 0;
344
+ }
345
+ button.primary,
346
+ button.secondary {
347
+ border-radius: 8px;
348
+ padding: 9px 14px;
349
+ cursor: pointer;
350
+ font-weight: 600;
351
+ }
352
+ button.primary {
353
+ background: var(--accent);
354
+ color: var(--accent-text);
355
+ border: 1px solid var(--accent);
356
+ }
357
+ button.secondary {
358
+ background: var(--surface);
359
+ border: 1px solid var(--border);
360
+ }
361
+ button:disabled {
362
+ opacity: 0.45;
363
+ cursor: not-allowed;
364
+ }
365
+ .result.ok {
366
+ color: var(--ok);
367
+ }
368
+ .result.err {
369
+ color: var(--danger);
370
+ }
371
+ .pop {
372
+ position: fixed;
373
+ z-index: 50;
374
+ width: 340px;
375
+ max-width: calc(100vw - 24px);
376
+ background: var(--surface);
377
+ border: 1px solid var(--border);
378
+ border-radius: 12px;
379
+ box-shadow: var(--shadow);
380
+ padding: 12px 14px;
381
+ }
382
+ .pop-title {
383
+ margin: 0;
384
+ font-weight: 600;
385
+ }
386
+ .pop-sub {
387
+ margin: 2px 0 8px;
388
+ font-size: 12px;
389
+ color: var(--muted);
390
+ }
391
+ .chips {
392
+ display: flex;
393
+ flex-wrap: wrap;
394
+ gap: 6px;
395
+ }
396
+ .chips button {
397
+ border: 1px solid var(--border);
398
+ background: var(--surface);
399
+ border-radius: 999px;
400
+ padding: 4px 11px;
401
+ cursor: pointer;
402
+ font-size: 13px;
403
+ }
404
+ .chips button[aria-checked="true"] {
405
+ background: var(--accent);
406
+ border-color: var(--accent);
407
+ color: var(--accent-text);
408
+ }
409
+ .pop-actions {
410
+ display: flex;
411
+ justify-content: flex-end;
412
+ gap: 8px;
413
+ margin-top: 10px;
414
+ }
415
+ .diff-list {
416
+ margin: 6px 0 0;
417
+ padding-left: 18px;
418
+ color: var(--muted);
419
+ font-size: 13px;
420
+ }
@@ -0,0 +1,95 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>原型审查 · req-kit</title>
7
+ <link rel="stylesheet" href="app.css" />
8
+ </head>
9
+ <body>
10
+ <header class="top">
11
+ <div class="heading">
12
+ <span class="eyebrow">原型审查</span>
13
+ <h1 id="title">正在打开…</h1>
14
+ <span id="status" class="pill" hidden></span>
15
+ </div>
16
+ <div class="controls">
17
+ <div class="group" id="filesGroup" hidden><span class="label">页面</span><div class="seg" id="files"></div></div>
18
+ <div class="group" id="statesGroup" hidden><span class="label">状态</span><div class="seg" id="states"></div></div>
19
+ <div class="group"><span class="label">宽度</span><div class="seg" id="widths"></div></div>
20
+ <div class="group"><span class="label">操作</span><div class="seg" id="modes"></div></div>
21
+ <label class="check"><input type="checkbox" id="showRegions" checked /> 标出要看的地方</label>
22
+ <label class="check" id="diffWrap" hidden><input type="checkbox" id="showDiff" /> 标出这一版改了哪里</label>
23
+ </div>
24
+ </header>
25
+
26
+ <main class="layout">
27
+ <section class="stage" aria-label="原型">
28
+ <p class="hint" id="hint"></p>
29
+ <div class="frame-wrap" id="frameWrap">
30
+ <div class="sizer" id="sizer"><iframe id="frame" title="界面原型"></iframe></div>
31
+ </div>
32
+ <p class="empty" id="empty" hidden></p>
33
+ </section>
34
+
35
+ <aside class="side">
36
+ <details class="card" id="guide" open>
37
+ <summary>怎么用</summary>
38
+ <ol>
39
+ <li>先看标出来的地方(①②③),它们是这次要改的,右边有对应的验收标准。</li>
40
+ <li>想改哪里,就<strong>点哪里</strong>:选一种改法,再用自己的话补一句,不用专业词汇。</li>
41
+ <li>想换文字,<strong>双击文字</strong>直接改成你想要的字。</li>
42
+ <li>都看完了,在最下面提交修改意见;没有要改的,就同意开始写代码。</li>
43
+ </ol>
44
+ </details>
45
+
46
+ <section class="card">
47
+ <h2>要看的地方</h2>
48
+ <ul class="list" id="regions"></ul>
49
+ </section>
50
+
51
+ <section class="card" id="changesCard" hidden>
52
+ <h2>这一版的变化</h2>
53
+ <div id="changes"></div>
54
+ </section>
55
+
56
+ <section class="card">
57
+ <h2>我的意见 <span class="count" id="count"></span></h2>
58
+ <ul class="list" id="comments"></ul>
59
+ <label class="field">
60
+ <span>总体意见(可以不写)</span>
61
+ <textarea id="general" rows="3" placeholder="例如:整体颜色太暗了,参考现在的订单列表页"></textarea>
62
+ </label>
63
+ <p class="muted small" id="saved"></p>
64
+ </section>
65
+
66
+ <section class="card actions" id="actions">
67
+ <p class="muted" id="actionNote"></p>
68
+ <button type="button" class="primary" id="submitChanges">提交修改意见</button>
69
+ <button type="button" class="secondary" id="approve">没有要改的,同意开始写代码</button>
70
+ <p id="result" class="result" role="status" aria-live="polite"></p>
71
+ </section>
72
+ </aside>
73
+ </main>
74
+
75
+ <div class="pop" id="pop" role="dialog" aria-modal="false" aria-labelledby="popTitle" hidden>
76
+ <p class="pop-title" id="popTitle"></p>
77
+ <p class="pop-sub" id="popSub"></p>
78
+ <div class="chips" id="kinds" role="radiogroup" aria-label="怎么改"></div>
79
+ <label class="field" id="newTextField" hidden>
80
+ <span id="newTextLabel">改成</span>
81
+ <input type="text" id="newText" />
82
+ </label>
83
+ <label class="field">
84
+ <span id="noteLabel">用你自己的话说说(可以不写)</span>
85
+ <textarea id="note" rows="2"></textarea>
86
+ </label>
87
+ <div class="pop-actions">
88
+ <button type="button" class="secondary" id="popCancel">取消</button>
89
+ <button type="button" class="primary" id="popOk">添加</button>
90
+ </div>
91
+ </div>
92
+
93
+ <script src="app.js"></script>
94
+ </body>
95
+ </html>