paseo-req-kit 1.14.0 → 1.15.0-beta.1

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 (88) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/docs/guide//347/273/264/346/212/244/350/200/205/346/214/207/345/215/227.md +2 -0
  3. package/engine/src/review-assets/app.css +153 -234
  4. package/engine/src/review-assets/app.html +44 -32
  5. package/engine/src/review-assets/app.js +11 -7
  6. package/engine/src/review-assets/check.css +11 -56
  7. package/engine/src/review-assets/check.html +48 -22
  8. package/engine/src/review-assets/check.js +169 -86
  9. package/engine/src/review-assets/code.css +15 -92
  10. package/engine/src/review-assets/code.html +41 -26
  11. package/engine/src/review-assets/code.js +196 -101
  12. package/engine/src/review-assets/rk-icons.js +98 -0
  13. package/engine/src/review-assets/rk-tokens.css +252 -0
  14. package/engine/src/review-assets/rk.css +252 -0
  15. package/engine/src/review.ts +6 -4
  16. package/package.json +1 -1
  17. package/paseo-plugin/package.json +1 -1
  18. package/site-dist/404.html +2 -2
  19. package/site-dist/assets/{app.VQ-QxRPH.js → app.D5s_yGHZ.js} +1 -1
  20. package/site-dist/assets/changelog.md.RJaBnmnw.js +1 -0
  21. package/site-dist/assets/chunks/@localSearchIndexroot.Dric-MbI.js +1 -0
  22. package/site-dist/assets/chunks/{VPLocalSearchBox.CT4Vlj76.js → VPLocalSearchBox.B4CyDsTr.js} +1 -1
  23. package/site-dist/assets/chunks/{theme.B_UmHHou.js → theme.CCocenmB.js} +2 -2
  24. package/site-dist/assets/{guide_getting-started.md.CZM53rO_.js → guide_getting-started.md.wFOkpMSx.js} +1 -1
  25. package/site-dist/assets/guide_maintainer.md.mFZprBj1.js +1 -0
  26. package/site-dist/assets/{guide_maintainer.md.C1v7EpSY.lean.js → guide_maintainer.md.mFZprBj1.lean.js} +1 -1
  27. package/site-dist/changelog.html +5 -5
  28. package/site-dist/guide/getting-started.html +5 -5
  29. package/site-dist/guide/how-it-works.html +4 -4
  30. package/site-dist/guide/index.html +4 -4
  31. package/site-dist/guide/install.html +4 -4
  32. package/site-dist/guide/maintainer.html +5 -5
  33. package/site-dist/guide/phases.html +4 -4
  34. package/site-dist/guide/project.html +4 -4
  35. package/site-dist/guide/user.html +4 -4
  36. package/site-dist/hashmap.json +1 -1
  37. package/site-dist/index.html +4 -4
  38. package/site-dist/reference/adr/0001-step-agents-under-origin-chat.html +4 -4
  39. package/site-dist/reference/adr/0002-no-directory-switch-in-chat.html +4 -4
  40. package/site-dist/reference/adr/0003-script-engine-not-hub.html +4 -4
  41. package/site-dist/reference/adr/0004-result-files.html +4 -4
  42. package/site-dist/reference/adr/0005-no-default-branch-local-commits-only.html +4 -4
  43. package/site-dist/reference/adr/0006-skill-install-targets.html +4 -4
  44. package/site-dist/reference/adr/0007-own-interview-skill.html +4 -4
  45. package/site-dist/reference/adr/0008-entries-do-not-call-entries.html +4 -4
  46. package/site-dist/reference/adr/0009-versioned-install-layout.html +4 -4
  47. package/site-dist/reference/adr/0010-generated-feature-overview.html +4 -4
  48. package/site-dist/reference/adr/0011-resume-after-completion.html +4 -4
  49. package/site-dist/reference/adr/0012-review-panel.html +4 -4
  50. package/site-dist/reference/adr/0013-no-release-tooling.html +4 -4
  51. package/site-dist/reference/adr/0014-notifier-slot.html +4 -4
  52. package/site-dist/reference/adr/0015-incremental-continue.html +4 -4
  53. package/site-dist/reference/adr/0016-upgrade-from-tags.html +4 -4
  54. package/site-dist/reference/adr/0017-use-paseo-capabilities.html +4 -4
  55. package/site-dist/reference/adr/0018-own-worktree-option.html +4 -4
  56. package/site-dist/reference/adr/0019-parallel-orchestration.html +4 -4
  57. package/site-dist/reference/adr/0020-scheduling-through-the-chat.html +4 -4
  58. package/site-dist/reference/adr/0021-npm-version-manager.html +4 -4
  59. package/site-dist/reference/adr/0022-develop-and-verify-phases.html +4 -4
  60. package/site-dist/reference/adr/0023-types-gate-slices.html +4 -4
  61. package/site-dist/reference/adr/0024-confirm-early-review-axes.html +4 -4
  62. package/site-dist/reference/adr/0025-joint-requirements.html +4 -4
  63. package/site-dist/reference/adr/0026-machine-records-and-api.html +4 -4
  64. package/site-dist/reference/adr/0027-paseo-plugin.html +4 -4
  65. package/site-dist/reference/adr/0028-external-integrations.html +4 -4
  66. package/site-dist/reference/adr/0029-requirements-from-cards.html +4 -4
  67. package/site-dist/reference/adr/0030-card-intake-process.html +4 -4
  68. package/site-dist/reference/adr/0031-fewer-interventions.html +4 -4
  69. package/site-dist/reference/adr/0032-npm-only-install.html +4 -4
  70. package/site-dist/reference/adr/0033-prototype-review-and-ui-check.html +4 -4
  71. package/site-dist/reference/adr/index.html +4 -4
  72. package/site-dist/reference/commands.html +4 -4
  73. package/site-dist/reference/config.html +4 -4
  74. package/site-dist/reference/contracts/cli-json.html +4 -4
  75. package/site-dist/reference/contracts/feature-files.html +4 -4
  76. package/site-dist/reference/contracts/index.html +4 -4
  77. package/site-dist/reference/contracts/notifier-event.html +4 -4
  78. package/site-dist/reference/contracts/result-file.html +4 -4
  79. package/site-dist/reference/contracts/spec.html +4 -4
  80. package/site-dist/reference/contracts/state.html +4 -4
  81. package/site-dist/reference/contracts/usage-record.html +4 -4
  82. package/site-dist/reference/contracts/verify.html +4 -4
  83. package/site-dist/reference/scope.html +4 -4
  84. package/site-dist/assets/changelog.md.CIKYJXpF.js +0 -1
  85. package/site-dist/assets/chunks/@localSearchIndexroot.h7oQE_np.js +0 -1
  86. package/site-dist/assets/guide_maintainer.md.C1v7EpSY.js +0 -1
  87. /package/site-dist/assets/{changelog.md.CIKYJXpF.lean.js → changelog.md.RJaBnmnw.lean.js} +0 -0
  88. /package/site-dist/assets/{guide_getting-started.md.CZM53rO_.lean.js → guide_getting-started.md.wFOkpMSx.lean.js} +0 -0
@@ -0,0 +1,252 @@
1
+ /* req-kit — generated from design/tokens.json by scripts/tokens-build.mjs. Do not edit. */
2
+ /* Dark is the default; light applies with data-theme="light", or the system setting when no data-theme is set. */
3
+ :root {
4
+ --rk-font-sans: Geist, "PingFang SC", "Noto Sans SC", "Microsoft YaHei", system-ui, sans-serif;
5
+ --rk-font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
6
+ --rk-type-display-xl: 800 56px/64px var(--rk-font-sans);
7
+ --rk-tracking-display-xl: -0.02em;
8
+ --rk-type-display: 700 40px/48px var(--rk-font-sans);
9
+ --rk-tracking-display: -0.01em;
10
+ --rk-type-metric: 700 40px/44px var(--rk-font-sans);
11
+ --rk-tracking-metric: -0.02em;
12
+ --rk-type-title-lg: 600 22px/30px var(--rk-font-sans);
13
+ --rk-type-title-md: 600 17px/26px var(--rk-font-sans);
14
+ --rk-type-title-sm: 600 14px/20px var(--rk-font-sans);
15
+ --rk-type-prose: 400 16px/28px var(--rk-font-sans);
16
+ --rk-type-body: 400 14px/22px var(--rk-font-sans);
17
+ --rk-type-body-sm: 400 13px/20px var(--rk-font-sans);
18
+ --rk-type-caption: 400 12px/18px var(--rk-font-sans);
19
+ --rk-type-eyebrow: 500 12px/16px var(--rk-font-mono);
20
+ --rk-tracking-eyebrow: 0.16em;
21
+ --rk-type-code: 400 13px/22px var(--rk-font-mono);
22
+ --rk-type-code-sm: 400 12px/18px var(--rk-font-mono);
23
+ --rk-type-poster-hero: 800 112px/116px var(--rk-font-sans);
24
+ --rk-tracking-poster-hero: -0.03em;
25
+ --rk-type-poster-headline: 700 64px/76px var(--rk-font-sans);
26
+ --rk-type-poster-lead: 500 32px/48px var(--rk-font-sans);
27
+ --rk-type-poster-metric: 800 168px/168px var(--rk-font-sans);
28
+ --rk-tracking-poster-metric: -0.04em;
29
+ --rk-type-poster-eyebrow: 500 22px/28px var(--rk-font-sans);
30
+ --rk-tracking-poster-eyebrow: 0.18em;
31
+ --rk-type-poster-caption: 400 22px/32px var(--rk-font-sans);
32
+ --rk-space-1: 4px;
33
+ --rk-space-2: 8px;
34
+ --rk-space-3: 12px;
35
+ --rk-space-4: 16px;
36
+ --rk-space-5: 20px;
37
+ --rk-space-6: 24px;
38
+ --rk-space-8: 32px;
39
+ --rk-space-12: 48px;
40
+ --rk-space-16: 64px;
41
+ --rk-space-24: 96px;
42
+ --rk-radius-sm: 6px;
43
+ --rk-radius-md: 10px;
44
+ --rk-radius-lg: 14px;
45
+ --rk-radius-xl: 20px;
46
+ --rk-radius-pill: 999px;
47
+ --rk-z-dropdown: 1000;
48
+ --rk-z-sticky: 1100;
49
+ --rk-z-modal: 1300;
50
+ --rk-z-popover: 1500;
51
+ --rk-canvas: #05070d;
52
+ --rk-canvas-grid: #1a2238;
53
+ --rk-surface-0: #080b14;
54
+ --rk-surface-1: #0b1020;
55
+ --rk-surface-2: #0f1526;
56
+ --rk-surface-3: #161e33;
57
+ --rk-overlay: #02040acc;
58
+ --rk-border-subtle: #161e33;
59
+ --rk-border-default: #1f2a44;
60
+ --rk-border-strong: #56698f;
61
+ --rk-text-primary: #f3f6fb;
62
+ --rk-text-secondary: #a3b0c6;
63
+ --rk-text-muted: #7c8aa3;
64
+ --rk-text-disabled: #3e4a63;
65
+ --rk-brand-500: #a8e01f;
66
+ --rk-brand-400: #bdeb4a;
67
+ --rk-brand-600: #8cc20f;
68
+ --rk-brand-300: #d9f59a;
69
+ --rk-brand-text: #c2ee55;
70
+ --rk-brand-tint: #a8e01f24;
71
+ --rk-brand-edge: #a8e01f;
72
+ --rk-on-brand: #0f1a02;
73
+ --rk-data: #22d3ee;
74
+ --rk-data-tint: #22d3ee1f;
75
+ --rk-ai: #a5b4fc;
76
+ --rk-ai-tint: #818cf81f;
77
+ --rk-focus-ring: #d9f59a;
78
+ --rk-status-running: #22d3ee;
79
+ --rk-status-success: #34d399;
80
+ --rk-status-failed: #fb7185;
81
+ --rk-on-danger: #1a0b02;
82
+ --rk-status-warning: #fbbf24;
83
+ --rk-status-skipped: #7c8aa3;
84
+ --rk-status-pending: #56698f;
85
+ --rk-success-tint: #34d3991f;
86
+ --rk-failed-tint: #fb71851f;
87
+ --rk-warning-tint: #fbbf241f;
88
+ --rk-diff-added: #34d399;
89
+ --rk-diff-modified: #fbbf24;
90
+ --rk-diff-removed: #fb7185;
91
+ --rk-aurora-brand: #a8e01f24;
92
+ --rk-aurora-data: #22d3ee1f;
93
+ --rk-aurora-ai: #818cf81a;
94
+ --rk-campaign-lime: #a8e01f;
95
+ --rk-campaign-lime-hi: #d9f59a;
96
+ --rk-on-campaign-lime: #0f1a02;
97
+ --rk-campaign-glacier: #22d3ee;
98
+ --rk-campaign-glacier-hi: #a5f3fc;
99
+ --rk-on-campaign-glacier: #04222a;
100
+ --rk-campaign-nebula: #a78bfa;
101
+ --rk-campaign-nebula-hi: #ddd6fe;
102
+ --rk-on-campaign-nebula: #150a33;
103
+ --rk-campaign-signal: #34d399;
104
+ --rk-campaign-signal-hi: #a7f3d0;
105
+ --rk-on-campaign-signal: #032016;
106
+ --rk-campaign-solar: #fbbf24;
107
+ --rk-campaign-solar-hi: #fde68a;
108
+ --rk-on-campaign-solar: #241800;
109
+ --rk-shadow-card: inset 0 1px 0 #ffffff0d, 0 1px 2px #00000080;
110
+ --rk-shadow-float: inset 0 1px 0 #ffffff0f, 0 12px 32px #000000a6;
111
+ --rk-shadow-dialog: inset 0 1px 0 #ffffff12, 0 32px 80px #000000cc;
112
+ --rk-glow-brand: 0 0 0 1px #a8e01f, 0 8px 28px #a8e01f4d;
113
+ --rk-glow-select: 0 0 0 3px #a8e01f40;
114
+ --rk-glow-run: 0 0 0 3px #22d3ee33;
115
+ color-scheme: dark;
116
+ }
117
+ @media (prefers-color-scheme: light) {
118
+ :root:not([data-theme="dark"]) {
119
+ --rk-canvas: #f4f6fa;
120
+ --rk-canvas-grid: #d7deea;
121
+ --rk-surface-0: #f8fafc;
122
+ --rk-surface-1: #ffffff;
123
+ --rk-surface-2: #ffffff;
124
+ --rk-surface-3: #eef2f7;
125
+ --rk-overlay: #0b102066;
126
+ --rk-border-subtle: #e8edf4;
127
+ --rk-border-default: #dce3ee;
128
+ --rk-border-strong: #7f8ca4;
129
+ --rk-text-primary: #0b1020;
130
+ --rk-text-secondary: #3d4a61;
131
+ --rk-text-muted: #5b6880;
132
+ --rk-text-disabled: #aab4c4;
133
+ --rk-brand-500: #a8e01f;
134
+ --rk-brand-400: #b3e536;
135
+ --rk-brand-600: #8cc20f;
136
+ --rk-brand-300: #d9f59a;
137
+ --rk-brand-text: #466f0f;
138
+ --rk-brand-tint: #a8e01f2e;
139
+ --rk-brand-edge: #65a30d;
140
+ --rk-on-brand: #0f1a02;
141
+ --rk-data: #0e7490;
142
+ --rk-data-tint: #0e749014;
143
+ --rk-ai: #4f46e5;
144
+ --rk-ai-tint: #4f46e514;
145
+ --rk-focus-ring: #466f0f;
146
+ --rk-status-running: #0e7490;
147
+ --rk-status-success: #047857;
148
+ --rk-status-failed: #be123c;
149
+ --rk-on-danger: #ffffff;
150
+ --rk-status-warning: #92400e;
151
+ --rk-status-skipped: #5b6880;
152
+ --rk-status-pending: #7f8ca4;
153
+ --rk-success-tint: #04785714;
154
+ --rk-failed-tint: #be123c14;
155
+ --rk-warning-tint: #92400e14;
156
+ --rk-diff-added: #047857;
157
+ --rk-diff-modified: #92400e;
158
+ --rk-diff-removed: #be123c;
159
+ --rk-aurora-brand: #a8e01f26;
160
+ --rk-aurora-data: #22d3ee14;
161
+ --rk-aurora-ai: #818cf814;
162
+ --rk-campaign-lime: #466f0f;
163
+ --rk-campaign-lime-hi: #466f0f;
164
+ --rk-on-campaign-lime: #ffffff;
165
+ --rk-campaign-glacier: #0e7490;
166
+ --rk-campaign-glacier-hi: #0e7490;
167
+ --rk-on-campaign-glacier: #ffffff;
168
+ --rk-campaign-nebula: #6d28d9;
169
+ --rk-campaign-nebula-hi: #6d28d9;
170
+ --rk-on-campaign-nebula: #ffffff;
171
+ --rk-campaign-signal: #047857;
172
+ --rk-campaign-signal-hi: #047857;
173
+ --rk-on-campaign-signal: #ffffff;
174
+ --rk-campaign-solar: #a16207;
175
+ --rk-campaign-solar-hi: #a16207;
176
+ --rk-on-campaign-solar: #ffffff;
177
+ --rk-shadow-card: inset 0 1px 0 #ffffff, 0 1px 2px #0b10200f, 0 4px 16px #0b10200a;
178
+ --rk-shadow-float: 0 12px 32px #0b10201f, 0 2px 6px #0b102014;
179
+ --rk-shadow-dialog: 0 32px 80px #0b102033;
180
+ --rk-glow-brand: 0 0 0 1px #a8e01f, 0 8px 28px #a8e01f4d;
181
+ --rk-glow-select: 0 0 0 3px #a8e01f40;
182
+ --rk-glow-run: 0 0 0 3px #0e749026;
183
+ color-scheme: light;
184
+ }
185
+ }
186
+ :root[data-theme="light"] {
187
+ --rk-canvas: #f4f6fa;
188
+ --rk-canvas-grid: #d7deea;
189
+ --rk-surface-0: #f8fafc;
190
+ --rk-surface-1: #ffffff;
191
+ --rk-surface-2: #ffffff;
192
+ --rk-surface-3: #eef2f7;
193
+ --rk-overlay: #0b102066;
194
+ --rk-border-subtle: #e8edf4;
195
+ --rk-border-default: #dce3ee;
196
+ --rk-border-strong: #7f8ca4;
197
+ --rk-text-primary: #0b1020;
198
+ --rk-text-secondary: #3d4a61;
199
+ --rk-text-muted: #5b6880;
200
+ --rk-text-disabled: #aab4c4;
201
+ --rk-brand-500: #a8e01f;
202
+ --rk-brand-400: #b3e536;
203
+ --rk-brand-600: #8cc20f;
204
+ --rk-brand-300: #d9f59a;
205
+ --rk-brand-text: #466f0f;
206
+ --rk-brand-tint: #a8e01f2e;
207
+ --rk-brand-edge: #65a30d;
208
+ --rk-on-brand: #0f1a02;
209
+ --rk-data: #0e7490;
210
+ --rk-data-tint: #0e749014;
211
+ --rk-ai: #4f46e5;
212
+ --rk-ai-tint: #4f46e514;
213
+ --rk-focus-ring: #466f0f;
214
+ --rk-status-running: #0e7490;
215
+ --rk-status-success: #047857;
216
+ --rk-status-failed: #be123c;
217
+ --rk-on-danger: #ffffff;
218
+ --rk-status-warning: #92400e;
219
+ --rk-status-skipped: #5b6880;
220
+ --rk-status-pending: #7f8ca4;
221
+ --rk-success-tint: #04785714;
222
+ --rk-failed-tint: #be123c14;
223
+ --rk-warning-tint: #92400e14;
224
+ --rk-diff-added: #047857;
225
+ --rk-diff-modified: #92400e;
226
+ --rk-diff-removed: #be123c;
227
+ --rk-aurora-brand: #a8e01f26;
228
+ --rk-aurora-data: #22d3ee14;
229
+ --rk-aurora-ai: #818cf814;
230
+ --rk-campaign-lime: #466f0f;
231
+ --rk-campaign-lime-hi: #466f0f;
232
+ --rk-on-campaign-lime: #ffffff;
233
+ --rk-campaign-glacier: #0e7490;
234
+ --rk-campaign-glacier-hi: #0e7490;
235
+ --rk-on-campaign-glacier: #ffffff;
236
+ --rk-campaign-nebula: #6d28d9;
237
+ --rk-campaign-nebula-hi: #6d28d9;
238
+ --rk-on-campaign-nebula: #ffffff;
239
+ --rk-campaign-signal: #047857;
240
+ --rk-campaign-signal-hi: #047857;
241
+ --rk-on-campaign-signal: #ffffff;
242
+ --rk-campaign-solar: #a16207;
243
+ --rk-campaign-solar-hi: #a16207;
244
+ --rk-on-campaign-solar: #ffffff;
245
+ --rk-shadow-card: inset 0 1px 0 #ffffff, 0 1px 2px #0b10200f, 0 4px 16px #0b10200a;
246
+ --rk-shadow-float: 0 12px 32px #0b10201f, 0 2px 6px #0b102014;
247
+ --rk-shadow-dialog: 0 32px 80px #0b102033;
248
+ --rk-glow-brand: 0 0 0 1px #a8e01f, 0 8px 28px #a8e01f4d;
249
+ --rk-glow-select: 0 0 0 3px #a8e01f40;
250
+ --rk-glow-run: 0 0 0 3px #0e749026;
251
+ color-scheme: light;
252
+ }
@@ -0,0 +1,252 @@
1
+ /* Copied from design/reference/components.css by scripts/tokens-build.mjs. Do not edit here. */
2
+ /* req-kit reference component styles (plain CSS, rk-* classes).
3
+ Every value is a --rk-* token from design/reference/tokens.css. This is the spec for the review pages,
4
+ the docs theme and the examples in design/examples/. Load tokens.css first. Fonts: pages that may reach
5
+ Google Fonts load Geist / Geist Mono / Noto Sans SC; otherwise the font stacks fall back to system faces. */
6
+ [hidden]{display:none!important}
7
+ body{margin:0;background:var(--rk-canvas);color:var(--rk-text-primary);font-family:var(--rk-font-sans);font-size:14px;line-height:22px;-webkit-font-smoothing:antialiased}
8
+ .rk-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rk-space-3)}
9
+ .rk-col{display:flex;flex-direction:column;gap:var(--rk-space-3)}
10
+ .rk-cap{font-size:12px;line-height:18px;color:var(--rk-text-muted)}
11
+ .rk-muted{color:var(--rk-text-secondary)}
12
+ .rk-mono{font-family:var(--rk-font-mono)}
13
+ .ic{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
14
+ .ic-sm{width:14px;height:14px}.ic-lg{width:18px;height:18px}.ic-xl{width:24px;height:24px}
15
+
16
+ /* atmosphere */
17
+ .rk-aurora{background:
18
+ radial-gradient(ellipse 85% 55% at 50% -10%,var(--rk-aurora-brand),transparent 70%),
19
+ radial-gradient(ellipse 60% 40% at 88% 20%,var(--rk-aurora-data),transparent 65%),
20
+ radial-gradient(ellipse 50% 35% at 10% 50%,var(--rk-aurora-ai),transparent 60%),
21
+ var(--rk-canvas)}
22
+ .rk-dots{background-color:var(--rk-canvas);background-image:radial-gradient(var(--rk-canvas-grid) 1px,transparent 1px);background-size:20px 20px}
23
+ .rk-grad{background:linear-gradient(90deg,var(--rk-brand-300),var(--rk-brand-500));-webkit-background-clip:text;background-clip:text;color:transparent}
24
+ .rk-light .rk-grad,[data-theme="light"] .rk-grad{background:none;color:var(--rk-brand-text)}
25
+ @media (prefers-color-scheme:light){:root:not([data-theme="dark"]) .rk-grad{background:none;color:var(--rk-brand-text)}}
26
+
27
+ /* brand */
28
+ .rk-brand{display:inline-flex;align-items:center;gap:10px;font:800 16px/1 var(--rk-font-sans);letter-spacing:-.02em;color:var(--rk-text-primary);white-space:nowrap}
29
+ .rk-brand i{font-style:normal;color:var(--rk-brand-edge)}
30
+ .rk-brand svg{width:22px;height:22px;flex:none}
31
+
32
+ /* text primitives */
33
+ .rk-eyebrow{font:500 12px/16px var(--rk-font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--rk-brand-text)}
34
+ .rk-eyebrow--muted{color:var(--rk-text-muted)}
35
+ .rk-code{display:inline-flex;align-items:center;max-width:100%;height:20px;padding:0 6px;border-radius:var(--rk-radius-sm);background:var(--rk-surface-3);border:1px solid var(--rk-border-default);font:12px/1 var(--rk-font-mono);color:var(--rk-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-sizing:border-box}
36
+ .rk-chip{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border-radius:var(--rk-radius-pill);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);font-size:13px;color:var(--rk-text-secondary)}
37
+ .rk-chip .ic{color:var(--rk-brand-text)}
38
+ .rk-version{display:inline-flex;align-items:center;gap:8px;height:28px;padding:0 12px 0 6px;border-radius:var(--rk-radius-pill);background:var(--rk-brand-tint);border:1px solid var(--rk-brand-edge);font:500 12px/1 var(--rk-font-mono);color:var(--rk-brand-text)}
39
+ .rk-version b{height:18px;padding:0 8px;border-radius:var(--rk-radius-pill);background:var(--rk-brand-500);color:var(--rk-on-brand);font-weight:600;line-height:18px}
40
+ .rk-kbd{font:500 11px/1 var(--rk-font-mono);padding:3px 6px;border-radius:var(--rk-radius-sm);border:1px solid var(--rk-border-default);background:var(--rk-surface-3);color:var(--rk-text-muted)}
41
+
42
+ /* Button */
43
+ .rk-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--rk-space-2);height:36px;padding:0 16px;border-radius:var(--rk-radius-md);border:1px solid var(--rk-border-default);background:var(--rk-surface-2);color:var(--rk-text-primary);font:600 14px/1 var(--rk-font-sans);cursor:pointer;box-shadow:var(--rk-shadow-card);transition:background .12s,border-color .12s,box-shadow .12s;text-decoration:none;white-space:nowrap}
44
+ .rk-btn:hover{border-color:var(--rk-border-strong);background:var(--rk-surface-3)}
45
+ .rk-btn:focus-visible{outline:2px solid var(--rk-focus-ring);outline-offset:2px}
46
+ .rk-btn--primary{background:var(--rk-brand-500);border-color:var(--rk-brand-edge);color:var(--rk-on-brand);box-shadow:0 0 0 3px var(--rk-brand-tint)}
47
+ .rk-btn--primary:hover{background:var(--rk-brand-400);border-color:var(--rk-brand-edge);color:var(--rk-on-brand)}
48
+ .rk-btn--primary:active{background:var(--rk-brand-600)}
49
+ .rk-btn--cta{box-shadow:var(--rk-glow-brand)}
50
+ .rk-btn--ghost{background:transparent;border-color:transparent;box-shadow:none;color:var(--rk-text-secondary)}
51
+ .rk-btn--ghost:hover{background:var(--rk-surface-3);color:var(--rk-text-primary);border-color:transparent}
52
+ .rk-btn--danger-outline{background:transparent;border-color:var(--rk-status-failed);color:var(--rk-status-failed);box-shadow:none}
53
+ .rk-btn--danger-outline:hover{background:var(--rk-failed-tint);border-color:var(--rk-status-failed)}
54
+ .rk-btn--sm{height:28px;padding:0 10px;font-size:12px}
55
+ .rk-btn--lg{height:44px;padding:0 20px;font-size:15px}
56
+ .rk-btn[disabled]{color:var(--rk-text-disabled);background:var(--rk-surface-2);border-color:var(--rk-border-subtle);box-shadow:none;cursor:not-allowed}
57
+ a:not(.rk-btn){color:var(--rk-brand-text)}
58
+
59
+ /* Badge: status is color + icon + word */
60
+ .rk-badge{display:inline-flex;align-items:center;gap:var(--rk-space-1);height:22px;padding:0 8px;border-radius:var(--rk-radius-sm);font:600 12px/1 var(--rk-font-sans);color:var(--fg);background:var(--bg);white-space:nowrap}
61
+ .rk-badge .ic{width:13px;height:13px}
62
+ .rk-badge--running{--fg:var(--rk-status-running);--bg:var(--rk-data-tint)}
63
+ .rk-badge--success{--fg:var(--rk-status-success);--bg:var(--rk-success-tint)}
64
+ .rk-badge--failed{--fg:var(--rk-status-failed);--bg:var(--rk-failed-tint)}
65
+ .rk-badge--warning{--fg:var(--rk-status-warning);--bg:var(--rk-warning-tint)}
66
+ .rk-badge--muted{--fg:var(--rk-text-muted);--bg:var(--rk-surface-3)}
67
+ .rk-badge--needs{--fg:var(--rk-brand-text);--bg:var(--rk-brand-tint)}
68
+ .rk-badge--ai{--fg:var(--rk-ai);--bg:var(--rk-ai-tint)}
69
+ .rk-badge--outline{--fg:var(--rk-text-secondary);--bg:transparent;box-shadow:inset 0 0 0 1px var(--rk-border-strong)}
70
+ .rk-spin{width:12px;height:12px;border-radius:50%;border:2px solid currentColor;border-right-color:transparent;animation:rk-spin .8s linear infinite;box-sizing:border-box}
71
+ @keyframes rk-spin{to{transform:rotate(360deg)}}
72
+
73
+ /* Step track: where a requirement is */
74
+ .rk-track{display:flex;align-items:flex-start;gap:0;list-style:none;margin:0;padding:0;overflow-x:auto}
75
+ .rk-track li{flex:1;min-width:84px;display:flex;flex-direction:column;align-items:center;gap:6px;position:relative;text-align:center}
76
+ .rk-track li::before{content:"";position:absolute;top:13px;left:-50%;right:50%;height:2px;background:var(--rk-border-default)}
77
+ .rk-track li:first-child::before{display:none}
78
+ .rk-track li.is-done::before,.rk-track li.is-now::before,.rk-track li.is-needs::before{background:var(--rk-status-success)}
79
+ .rk-track__dot{position:relative;z-index:1;width:28px;height:28px;border-radius:var(--rk-radius-pill);display:grid;place-items:center;background:var(--rk-surface-2);color:var(--rk-text-muted);box-shadow:inset 0 0 0 1.5px var(--rk-border-strong);font:600 12px/1 var(--rk-font-mono)}
80
+ .rk-track li.is-done .rk-track__dot{background:var(--rk-success-tint);color:var(--rk-status-success);box-shadow:inset 0 0 0 1.5px var(--rk-status-success)}
81
+ .rk-track li.is-now .rk-track__dot{background:var(--rk-data-tint);color:var(--rk-status-running);box-shadow:inset 0 0 0 1.5px var(--rk-status-running),var(--rk-glow-run)}
82
+ .rk-track li.is-needs .rk-track__dot{background:var(--rk-brand-500);color:var(--rk-on-brand);box-shadow:0 0 0 1px var(--rk-brand-edge),var(--rk-glow-select)}
83
+ .rk-track b{font-size:13px;line-height:18px;font-weight:600}
84
+ .rk-track span{font-size:12px;line-height:16px;color:var(--rk-text-muted)}
85
+ .rk-track li.is-needs b{color:var(--rk-brand-text)}
86
+
87
+ /* Cards */
88
+ .rk-card{position:relative;box-sizing:border-box;border-radius:var(--rk-radius-xl);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card);padding:var(--rk-space-6);display:flex;flex-direction:column;gap:var(--rk-space-3);min-width:0}
89
+ .rk-card--sm{border-radius:var(--rk-radius-lg);padding:var(--rk-space-4)}
90
+ .rk-card.is-key{border-color:var(--rk-brand-edge);box-shadow:var(--rk-glow-select),var(--rk-shadow-card)}
91
+ .rk-card h3{margin:0;font-size:22px;line-height:30px;font-weight:600;text-wrap:balance}
92
+ .rk-card p{margin:0;color:var(--rk-text-secondary)}
93
+ .rk-card__label{display:inline-flex;align-items:center;gap:6px;align-self:flex-start;height:24px;padding:0 10px;border-radius:var(--rk-radius-sm);background:var(--rk-brand-tint);color:var(--rk-brand-text);font:500 12px/1 var(--rk-font-mono)}
94
+ .rk-card__label--ai{background:var(--rk-ai-tint);color:var(--rk-ai)}
95
+ .rk-card__label--data{background:var(--rk-data-tint);color:var(--rk-data)}
96
+ .rk-bento{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--rk-space-4)}
97
+ .rk-span-4{grid-column:span 4}.rk-span-6{grid-column:span 6}.rk-span-8{grid-column:span 8}.rk-span-12{grid-column:span 12}.rk-span-3{grid-column:span 3}
98
+ @media (max-width:860px){.rk-bento{gap:var(--rk-space-3)}.rk-bento>*{grid-column:span 12}}
99
+ .rk-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:8px;color:var(--rk-text-secondary);font-size:13px;line-height:22px}
100
+ .rk-list li{display:flex;gap:8px;align-items:flex-start}
101
+ .rk-list li .ic{color:var(--rk-status-success);margin-top:3px}
102
+
103
+ .rk-stat{box-sizing:border-box;border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card);padding:var(--rk-space-6) var(--rk-space-4);display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;position:relative;overflow:hidden}
104
+ .rk-stat::before{content:"";position:absolute;left:20%;right:20%;top:0;height:1px;background:linear-gradient(90deg,transparent,var(--rk-brand-500),transparent)}
105
+ .rk-stat b{font-size:40px;line-height:44px;font-weight:700;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
106
+ .rk-stat strong{font-size:14px;line-height:20px;font-weight:600}
107
+ .rk-stat span{font-size:12px;line-height:18px;color:var(--rk-text-muted)}
108
+
109
+ .rk-section{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--rk-space-3);max-width:720px;margin:0 auto}
110
+ .rk-section h2{margin:0;font-size:40px;line-height:48px;font-weight:700;letter-spacing:-.01em;text-wrap:balance}
111
+ .rk-section p{margin:0;font-size:16px;line-height:28px;color:var(--rk-text-secondary);max-width:640px}
112
+
113
+ /* Terminal */
114
+ .rk-term{box-sizing:border-box;width:100%;max-width:600px;border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card);overflow:hidden;text-align:left}
115
+ .rk-term__tabs{display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--rk-border-subtle)}
116
+ .rk-term__tabs span{padding:6px 12px 8px;font:500 12px/1 var(--rk-font-mono);color:var(--rk-text-muted);border-bottom:2px solid transparent}
117
+ .rk-term__tabs span.is-on{color:var(--rk-text-primary);border-color:var(--rk-brand-500)}
118
+ .rk-term__body{display:flex;align-items:center;gap:var(--rk-space-3);padding:14px var(--rk-space-4);font:13px/22px var(--rk-font-mono)}
119
+ .rk-term__body i{font-style:normal;color:var(--rk-brand-text)}
120
+ .rk-term__body code{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:inherit}
121
+
122
+ /* Callout */
123
+ .rk-callout{display:grid;grid-template-columns:18px 1fr;gap:var(--rk-space-3);padding:14px var(--rk-space-4);border-radius:var(--rk-radius-lg);background:var(--bg);font-size:14px;line-height:24px}
124
+ .rk-callout .ic{color:var(--fg);margin-top:3px}
125
+ .rk-callout b{display:block;color:var(--fg)}
126
+ .rk-callout--tip{--fg:var(--rk-status-success);--bg:var(--rk-success-tint)}
127
+ .rk-callout--note{--fg:var(--rk-data);--bg:var(--rk-data-tint)}
128
+ .rk-callout--warn{--fg:var(--rk-status-warning);--bg:var(--rk-warning-tint)}
129
+ .rk-callout--danger{--fg:var(--rk-status-failed);--bg:var(--rk-failed-tint)}
130
+
131
+ /* Review page skeleton */
132
+ .rk-top{position:sticky;top:0;z-index:var(--rk-z-sticky);display:flex;align-items:center;gap:var(--rk-space-3);min-height:48px;padding:6px max(16px,env(safe-area-inset-right,0px)) 6px max(16px,env(safe-area-inset-left,0px));background:var(--rk-surface-0);border-bottom:1px solid var(--rk-border-default);flex-wrap:wrap;box-sizing:border-box}
133
+ .rk-top__sep{width:1px;height:18px;background:var(--rk-border-default)}
134
+ .rk-top__title{font-size:14px;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
135
+ .rk-top__spacer{flex:1}
136
+ .rk-banner{display:flex;align-items:center;gap:var(--rk-space-3);padding:10px var(--rk-space-4);border-radius:var(--rk-radius-lg);background:var(--bg,var(--rk-surface-2));color:var(--rk-text-primary);font-size:13px}
137
+ .rk-banner .ic{color:var(--fg)}
138
+ .rk-banner--ok{--fg:var(--rk-status-success);--bg:var(--rk-success-tint)}
139
+ .rk-banner--warn{--fg:var(--rk-status-warning);--bg:var(--rk-warning-tint)}
140
+ .rk-banner--run{--fg:var(--rk-status-running);--bg:var(--rk-data-tint)}
141
+ .rk-layout{display:grid;grid-template-columns:264px minmax(0,1fr);gap:var(--rk-space-6);max-width:1200px;margin:0 auto;padding:var(--rk-space-6) max(16px,env(safe-area-inset-right,0px)) 120px max(16px,env(safe-area-inset-left,0px));box-sizing:border-box}
142
+ .rk-side{position:sticky;top:64px;align-self:start;display:flex;flex-direction:column;gap:2px;padding:var(--rk-space-3);border-radius:var(--rk-radius-lg);background:var(--rk-surface-1);border:1px solid var(--rk-border-default);max-height:calc(100vh - 160px);overflow:auto}
143
+ .rk-side__group{font:500 11px/16px var(--rk-font-mono);letter-spacing:.14em;color:var(--rk-text-muted);padding:8px 10px 4px;text-transform:uppercase}
144
+ .rk-side a{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:var(--rk-radius-md);font-size:13px;line-height:20px;color:var(--rk-text-secondary);text-decoration:none;min-width:0}
145
+ .rk-side a span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
146
+ .rk-side a:hover{background:var(--rk-surface-3);color:var(--rk-text-primary)}
147
+ .rk-side a.is-on{background:var(--rk-brand-tint);color:var(--rk-brand-text);font-weight:600}
148
+ .rk-side a .n{font:12px/1 var(--rk-font-mono);color:var(--rk-text-muted)}
149
+ .rk-main{min-width:0;display:flex;flex-direction:column;gap:var(--rk-space-4)}
150
+ .rk-head{display:flex;flex-direction:column;gap:6px}
151
+ .rk-head h1{margin:0;font-size:22px;line-height:30px;font-weight:600;text-wrap:balance}
152
+ .rk-head p{margin:0;color:var(--rk-text-secondary);max-width:68ch}
153
+ .rk-decide{position:fixed;left:0;right:0;bottom:0;z-index:var(--rk-z-sticky);background:var(--rk-surface-1);border-top:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-float);padding:12px max(16px,env(safe-area-inset-right,0px)) calc(12px + env(safe-area-inset-bottom,0px)) max(16px,env(safe-area-inset-left,0px))}
154
+ .rk-decide__in{max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:var(--rk-space-4);flex-wrap:wrap}
155
+ .rk-decide__sum{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px}
156
+ .rk-decide__sum b{font-size:14px}
157
+ .rk-decide__acts{display:flex;gap:var(--rk-space-2);flex-wrap:wrap}
158
+ .rk-field{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--rk-text-secondary);font-weight:600}
159
+ .rk-input{box-sizing:border-box;height:36px;padding:0 var(--rk-space-3);border-radius:var(--rk-radius-md);border:1px solid var(--rk-border-default);background:var(--rk-surface-3);color:var(--rk-text-primary);font:14px var(--rk-font-sans);min-width:0}
160
+ .rk-input:hover{border-color:var(--rk-border-strong)}
161
+ .rk-input:focus{outline:none;border-color:var(--rk-brand-edge);box-shadow:0 0 0 3px var(--rk-brand-tint)}
162
+ textarea.rk-input{height:auto;padding:8px var(--rk-space-3);line-height:22px;resize:vertical}
163
+ @media (max-width:960px){.rk-layout{grid-template-columns:minmax(0,1fr);padding-bottom:200px}.rk-side{position:static;max-height:none;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;padding:6px}.rk-side__group{display:none}.rk-side a{flex:none;max-width:240px}.rk-side a span{flex:none}}
164
+ @media (max-width:640px){.rk-top__hide-sm{display:none}.rk-top .rk-code{order:5;flex-basis:100%;max-width:100%;justify-content:flex-start}.rk-top__title{flex:1}.rk-decide__in{gap:var(--rk-space-3)}.rk-decide .rk-field{flex:1 1 40%}.rk-decide .rk-field .rk-input{width:100%!important}.rk-decide__acts{flex:1 1 100%}.rk-decide__acts .rk-btn{flex:1}}
165
+
166
+ /* Finding: AI review comment / a person's comment */
167
+ .rk-finding{display:flex;flex-direction:column;gap:8px;padding:12px var(--rk-space-4);border-radius:var(--rk-radius-lg);border:1px solid var(--rk-border-default);background:var(--rk-surface-2);font-size:14px;line-height:22px}
168
+ .rk-finding--ai{background:var(--rk-ai-tint);border-color:color-mix(in srgb,var(--rk-ai) 30%,transparent)}
169
+ .rk-finding--you{border-color:var(--rk-brand-edge)}
170
+ .rk-finding__head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
171
+ .rk-finding__who{display:inline-flex;align-items:center;gap:6px;font-weight:600}
172
+ .rk-finding--ai .rk-finding__who{color:var(--rk-ai)}
173
+ .rk-finding--you .rk-finding__who{color:var(--rk-brand-text)}
174
+ .rk-finding__id{font:12px/1 var(--rk-font-mono);color:var(--rk-text-muted)}
175
+ .rk-finding__where{font:12px/1 var(--rk-font-mono);color:var(--rk-data)}
176
+ .rk-finding__body{color:var(--rk-text-primary)}
177
+ .rk-finding__fix{font-size:13px;color:var(--rk-text-secondary)}
178
+ .rk-finding__acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
179
+ .rk-seg{display:inline-flex;padding:2px;gap:2px;border-radius:var(--rk-radius-md);background:var(--rk-surface-3);border:1px solid var(--rk-border-default)}
180
+ .rk-seg button{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 12px;border:0;border-radius:8px;background:transparent;color:var(--rk-text-secondary);font:600 13px/1 var(--rk-font-sans);cursor:pointer}
181
+ .rk-seg button:hover{color:var(--rk-text-primary)}
182
+ .rk-seg button:focus-visible{outline:2px solid var(--rk-focus-ring);outline-offset:1px}
183
+ .rk-seg button[aria-pressed="true"]{background:var(--rk-surface-1);color:var(--rk-text-primary);box-shadow:var(--rk-shadow-card)}
184
+ .rk-seg button.is-fix[aria-pressed="true"]{background:var(--rk-failed-tint);color:var(--rk-status-failed)}
185
+ .rk-seg button.is-ok[aria-pressed="true"]{background:var(--rk-success-tint);color:var(--rk-status-success)}
186
+ .rk-seg button.is-pass[aria-pressed="true"]{background:var(--rk-success-tint);color:var(--rk-status-success)}
187
+
188
+ /* Diff block */
189
+ .rk-diff{border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);overflow:hidden}
190
+ .rk-diff__head{display:flex;align-items:center;gap:var(--rk-space-3);padding:8px var(--rk-space-4);background:var(--rk-surface-3);border-bottom:1px solid var(--rk-border-default);flex-wrap:wrap}
191
+ .rk-diff__path{font:600 12.5px/18px var(--rk-font-mono);min-width:0;word-break:break-all}
192
+ .rk-diff__n{font:12px/1 var(--rk-font-mono)}
193
+ .rk-diff__n .a{color:var(--rk-diff-added)}.rk-diff__n .r{color:var(--rk-diff-removed)}
194
+ .rk-diff__body{overflow-x:auto}
195
+ .rk-diff table{border-collapse:collapse;width:100%;font:12.5px/20px var(--rk-font-mono)}
196
+ .rk-diff td{padding:0 10px;vertical-align:top;white-space:pre}
197
+ .rk-diff td.n{width:1%;min-width:40px;text-align:right;color:var(--rk-text-muted);user-select:none;font-variant-numeric:tabular-nums}
198
+ .rk-diff tr.hunk td{background:var(--rk-surface-3);color:var(--rk-text-muted);padding:2px 10px}
199
+ .rk-diff tr.add td{background:var(--rk-success-tint)}
200
+ .rk-diff tr.del td{background:var(--rk-failed-tint)}
201
+ .rk-diff tr.add td.s::before{content:"+";color:var(--rk-diff-added);margin-right:8px}
202
+ .rk-diff tr.del td.s::before{content:"\2212";color:var(--rk-diff-removed);margin-right:8px}
203
+ .rk-diff tr.ctx td.s::before{content:" ";margin-right:8px}
204
+ .rk-diff tr.note td{white-space:normal;padding:8px 12px 10px 60px;background:var(--rk-surface-2)}
205
+
206
+ /* Checklist item (acceptance) */
207
+ .rk-check{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--rk-space-3) var(--rk-space-4);padding:var(--rk-space-4) var(--rk-space-6) var(--rk-space-4) var(--rk-space-4);border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card)}
208
+ .rk-check.is-fail{border-color:var(--rk-status-failed)}
209
+ .rk-check.is-pass{border-color:color-mix(in srgb,var(--rk-status-success) 55%,transparent)}
210
+ .rk-check__id{font:600 12px/24px var(--rk-font-mono);color:var(--rk-text-muted);min-width:44px}
211
+ .rk-check__main{display:flex;flex-direction:column;gap:10px;min-width:0}
212
+ .rk-check__title{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap;font-size:15px;line-height:24px;font-weight:600}
213
+ .rk-check dl{margin:0;display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px var(--rk-space-4);font-size:13px;line-height:22px}
214
+ .rk-check dt{color:var(--rk-text-muted)}
215
+ .rk-check dd{margin:0;min-width:0}
216
+ .rk-check__evidence{font-size:12px;line-height:18px;color:var(--rk-text-secondary);padding:8px 10px;border-radius:var(--rk-radius-md);background:var(--rk-surface-3)}
217
+
218
+ /* Prototype review */
219
+ .rk-proto{position:relative;border-radius:var(--rk-radius-xl);overflow:hidden;border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-card)}
220
+ .rk-proto__bar{display:flex;align-items:center;gap:var(--rk-space-3);padding:8px var(--rk-space-4);background:var(--rk-surface-1);border-bottom:1px solid var(--rk-border-default);font-size:12px;color:var(--rk-text-muted);flex-wrap:wrap}
221
+ .rk-proto__stage{padding:var(--rk-space-6);display:grid;place-items:center}
222
+ .rk-pick{position:relative;outline:2px solid var(--rk-brand-500);outline-offset:3px;border-radius:6px;box-shadow:0 0 0 9999px transparent}
223
+ .rk-pick::after{content:"";position:absolute;inset:-3px;border-radius:6px;background:var(--rk-brand-tint);pointer-events:none}
224
+ .rk-pin{position:absolute;width:24px;height:24px;border-radius:var(--rk-radius-pill);background:var(--rk-brand-500);color:var(--rk-on-brand);display:grid;place-items:center;font:700 12px/1 var(--rk-font-mono);box-shadow:var(--rk-shadow-float),0 0 0 2px var(--rk-canvas);z-index:2}
225
+
226
+ /* Inbox row (plugin) */
227
+ .rk-attn{display:flex;align-items:center;gap:var(--rk-space-4);padding:var(--rk-space-4);border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);flex-wrap:wrap}
228
+ .rk-attn__ic{width:36px;height:36px;border-radius:var(--rk-radius-md);display:grid;place-items:center;background:var(--rk-brand-tint);color:var(--rk-brand-text);flex:none}
229
+ .rk-attn__txt{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:2px}
230
+ .rk-attn__txt b{font-size:15px;line-height:22px}
231
+ .rk-attn__txt span{font-size:13px;color:var(--rk-text-secondary)}
232
+
233
+ /* Diff behaviour (review page script) */
234
+ .rk-diff.folded .rk-diff__body{display:none}
235
+ .rk-diff.folded .rk-diff__head{border-bottom:0}
236
+ .rk-diff__head>.ic:first-child{transition:transform .12s}
237
+ .rk-diff.folded .rk-diff__head>.ic:first-child{transform:rotate(-90deg)}
238
+ .rk-diff__head[role="button"]{cursor:pointer}
239
+ .rk-diff tr.line{cursor:pointer}
240
+ .rk-diff tr.line:hover td{box-shadow:inset 0 1px 0 var(--rk-border-strong),inset 0 -1px 0 var(--rk-border-strong)}
241
+ .rk-flash,.rk-flash td{background:var(--rk-brand-tint)!important}
242
+
243
+ /* Toast */
244
+ .rk-toast{position:fixed;left:50%;bottom:calc(96px + env(safe-area-inset-bottom,0px));transform:translateX(-50%);z-index:var(--rk-z-popover);max-width:min(640px,calc(100vw - 32px));box-sizing:border-box;display:flex;align-items:flex-start;gap:var(--rk-space-3);padding:12px var(--rk-space-4);border-radius:var(--rk-radius-lg);background:var(--rk-surface-2);border:1px solid var(--rk-border-default);box-shadow:var(--rk-shadow-float);font-size:14px;line-height:22px;white-space:pre-line}
245
+
246
+ /* Empty state */
247
+ .rk-empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--rk-space-3);padding:var(--rk-space-12) var(--rk-space-6)}
248
+ .rk-empty .ic{color:var(--rk-text-muted)}
249
+ .rk-empty h3{margin:0;font-size:17px;line-height:26px;font-weight:600}
250
+ .rk-empty p{margin:0;color:var(--rk-text-secondary);max-width:360px}
251
+
252
+ @media (prefers-reduced-motion:reduce){.rk-spin{animation:none}*{transition:none!important}}
@@ -21,6 +21,8 @@ import { appendEvent, readIndex, requirementRef } from "./records.js";
21
21
  import { readState, statePath } from "./state.js";
22
22
 
23
23
  const ASSETS = path.join(ENGINE_DIR, "src", "review-assets");
24
+ /** 1.15: the design system's tokens, component styles and icons, shared by the three pages (copies made by scripts/tokens-build.mjs). */
25
+ const SHARED_ASSETS = new Set(["rk-tokens.css", "rk.css", "rk-icons.js"]);
24
26
  const DEFAULT_PORT = 6781;
25
27
  const IDLE_EXIT_MS = 4 * 60 * 60_000;
26
28
  const MAX_BODY = 2_000_000;
@@ -251,7 +253,7 @@ function appCsp(): string {
251
253
  const local = !host || host === "127.0.0.1" || host === "localhost" || host === "::1";
252
254
  const custom = process.env.REQ_KIT_REVIEW_FRAME_ANCESTORS?.trim();
253
255
  // 'self' always: the page shows the prototype in a frame of its own.
254
- const ancestors = custom ? (custom.includes("'self'") || custom === "*" ? custom : `'self' ${custom}`) : local ? "'self' http://127.0.0.1:* http://localhost:* http://[::1]:*" : "*";
256
+ const ancestors = custom ? (custom.includes("'self'") || custom === "*" ? custom : `'self' ${custom}`) : local ? "'self' http://127.0.0.1:* http://localhost:*" : "*";
255
257
  return `default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors ${ancestors}`;
256
258
  }
257
259
  const APP_CSP = appCsp();
@@ -369,7 +371,7 @@ export function createReviewServer(opts: ReviewServerOptions): http.Server {
369
371
  }
370
372
  if (rest.startsWith("code/")) return handleCodeReview(req, res, rest.slice("code/".length), entry, featureAbs, full);
371
373
  if (rest === "") return sendFile(res, path.join(ASSETS, "app.html"));
372
- if (rest === "app.js" || rest === "app.css") return sendFile(res, path.join(ASSETS, rest));
374
+ if (rest === "app.js" || rest === "app.css" || SHARED_ASSETS.has(rest)) return sendFile(res, path.join(ASSETS, rest));
373
375
  if (rest.startsWith("proto/cur/")) return sendFile(res, inside(prototypeDir, rest.slice("proto/cur/".length)), PROTOTYPE_CSP);
374
376
  if (rest.startsWith("proto/v/")) {
375
377
  const [hash, ...file] = rest.slice("proto/v/".length).split("/");
@@ -441,7 +443,7 @@ export function createReviewServer(opts: ReviewServerOptions): http.Server {
441
443
  async function handleCodeReview(req: http.IncomingMessage, res: http.ServerResponse, rest: string, entry: { repo: string; featureDir: string }, featureAbs: string, full: boolean) {
442
444
  const draftFile = path.join(featureAbs, ".pipeline", "code-review", "draft.json");
443
445
  if (rest === "") return sendFile(res, path.join(ASSETS, "code.html"));
444
- if (rest === "code.js" || rest === "code.css") return sendFile(res, path.join(ASSETS, rest));
446
+ if (rest === "code.js" || rest === "code.css" || SHARED_ASSETS.has(rest)) return sendFile(res, path.join(ASSETS, rest));
445
447
  if (rest === "api/info" && req.method === "GET") {
446
448
  let draft: unknown = null;
447
449
  try {
@@ -498,7 +500,7 @@ export function createReviewServer(opts: ReviewServerOptions): http.Server {
498
500
  async function handleChecklist(req: http.IncomingMessage, res: http.ServerResponse, rest: string, entry: { repo: string; featureDir: string; key: string; project: string }, featureAbs: string, full: boolean) {
499
501
  const checkDir = path.join(featureAbs, ".pipeline", "check");
500
502
  if (rest === "") return sendFile(res, path.join(ASSETS, "check.html"));
501
- if (rest === "check.js" || rest === "check.css") return sendFile(res, path.join(ASSETS, rest));
503
+ if (rest === "check.js" || rest === "check.css" || SHARED_ASSETS.has(rest)) return sendFile(res, path.join(ASSETS, rest));
502
504
  if (rest === "api/info" && req.method === "GET") {
503
505
  const state = readState(statePath(entry.repo, entry.featureDir));
504
506
  let draft: unknown = { answers: [], reviewer: "" };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paseo-req-kit",
3
- "version": "1.14.0",
3
+ "version": "1.15.0-beta.1",
4
4
  "description": "req-kit: a requirement-development workflow for Paseo. /req aligns a requirement in chat; the engine runs design, implementation, review and verification as Paseo agents.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "req-kit-paseo-plugin",
3
- "version": "1.14.0",
3
+ "version": "1.15.0-beta.1",
4
4
  "private": true,
5
5
  "description": "The req-kit plugin for Paseo. Ships inside the paseo-req-kit package; installed with req plugin install.",
6
6
  "type": "module",