@pat-lewczuk/cezar 0.1.0 → 0.1.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 (57) hide show
  1. package/dist/config.d.ts +62 -0
  2. package/dist/config.js +49 -0
  3. package/dist/config.js.map +1 -0
  4. package/dist/core/agent-runner.d.ts +13 -0
  5. package/dist/core/claude-cli-runner.js +23 -2
  6. package/dist/core/claude-cli-runner.js.map +1 -1
  7. package/dist/git-worktree.d.ts +56 -0
  8. package/dist/git-worktree.js +143 -0
  9. package/dist/git-worktree.js.map +1 -0
  10. package/dist/handoff.d.ts +42 -0
  11. package/dist/handoff.js +120 -0
  12. package/dist/handoff.js.map +1 -0
  13. package/dist/index.js +27 -6
  14. package/dist/index.js.map +1 -1
  15. package/dist/planner.d.ts +17 -0
  16. package/dist/planner.js +244 -0
  17. package/dist/planner.js.map +1 -0
  18. package/dist/runs/store.d.ts +40 -13
  19. package/dist/runs/store.js +33 -3
  20. package/dist/runs/store.js.map +1 -1
  21. package/dist/server/git.d.ts +5 -0
  22. package/dist/server/git.js +38 -0
  23. package/dist/server/git.js.map +1 -1
  24. package/dist/server/github.d.ts +29 -0
  25. package/dist/server/github.js +140 -0
  26. package/dist/server/github.js.map +1 -0
  27. package/dist/server/launch-key.d.ts +7 -0
  28. package/dist/server/launch-key.js +33 -0
  29. package/dist/server/launch-key.js.map +1 -0
  30. package/dist/server/pr.d.ts +22 -0
  31. package/dist/server/pr.js +98 -0
  32. package/dist/server/pr.js.map +1 -0
  33. package/dist/server/server.js +537 -19
  34. package/dist/server/server.js.map +1 -1
  35. package/dist/skills-remote.d.ts +35 -0
  36. package/dist/skills-remote.js +266 -0
  37. package/dist/skills-remote.js.map +1 -0
  38. package/dist/skills.d.ts +20 -6
  39. package/dist/skills.js +77 -12
  40. package/dist/skills.js.map +1 -1
  41. package/dist/todos.d.ts +60 -0
  42. package/dist/todos.js +166 -0
  43. package/dist/todos.js.map +1 -0
  44. package/dist/workflows/load.js +8 -10
  45. package/dist/workflows/load.js.map +1 -1
  46. package/dist/workflows/run.d.ts +62 -3
  47. package/dist/workflows/run.js +351 -45
  48. package/dist/workflows/run.js.map +1 -1
  49. package/dist/workflows/types.d.ts +96 -26
  50. package/dist/workflows/types.js +73 -2
  51. package/dist/workflows/types.js.map +1 -1
  52. package/package.json +1 -1
  53. package/scripts/mock-claude.mjs +118 -0
  54. package/web/app.js +2821 -154
  55. package/web/index.html +82 -23
  56. package/web/open-mercato.svg +11 -0
  57. package/web/style.css +1652 -222
package/web/style.css CHANGED
@@ -1,317 +1,1747 @@
1
+ /* cez cockpit v2 — design tokens + layout. Dark is the default theme; light
2
+ overrides live under [data-theme="light"]. No build step, no libraries. */
3
+
1
4
  :root {
2
- --bg: #0d1117;
3
- --bg-panel: #161b22;
4
- --bg-raised: #1c2330;
5
- --border: #2a3240;
6
- --text: #dce3ec;
7
- --text-dim: #8b96a5;
8
- --accent: #4f8ef7;
9
- --green: #3fb950;
10
- --red: #f85149;
11
- --yellow: #d29922;
12
- --purple: #bc8cff;
13
- --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
14
- }
15
-
16
- * { box-sizing: border-box; }
5
+ --bg: #111116;
6
+ --panel: #16161c;
7
+ --panel2: #20202a;
8
+ --card: #17171e;
9
+ --line: rgba(235, 232, 255, 0.075);
10
+ --line2: rgba(235, 232, 255, 0.15);
11
+ --text: #e9e7f2;
12
+ --text2: #a3a1b2;
13
+ --text3: #66646f;
14
+ --btn: #e9e7f2;
15
+ --btn-text: #16161c;
16
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35);
17
+ --accent: oklch(0.72 0.14 295);
18
+ --green: oklch(0.72 0.12 155);
19
+ --amber: oklch(0.78 0.12 78);
20
+ --red: oklch(0.68 0.17 25);
21
+ --accent-soft: color-mix(in oklab, var(--accent) 9%, var(--bg));
22
+ --accent-line: color-mix(in oklab, var(--accent) 32%, transparent);
23
+ --serif: "Source Serif 4", Georgia, serif;
24
+ --sans: "Instrument Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
25
+ --mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
26
+ }
27
+
28
+ :root[data-theme="light"] {
29
+ --bg: #faf9f6;
30
+ --panel: #f2f0eb;
31
+ --panel2: #e9e6df;
32
+ --card: #ffffff;
33
+ --line: rgba(40, 35, 20, 0.09);
34
+ --line2: rgba(40, 35, 20, 0.17);
35
+ --text: #22211c;
36
+ --text2: #6d685c;
37
+ --text3: #a39e90;
38
+ --btn: #22211c;
39
+ --btn-text: #faf9f6;
40
+ --shadow-sm: 0 1px 2px rgba(30, 25, 10, 0.05);
41
+ --accent: oklch(0.54 0.18 295);
42
+ --green: oklch(0.55 0.12 152);
43
+ --amber: oklch(0.62 0.12 75);
44
+ --red: oklch(0.55 0.19 27);
45
+ }
46
+
47
+ /* ---- base ---- */
48
+
49
+ * { box-sizing: border-box; scrollbar-width: thin; scrollbar-color: rgba(128, 127, 140, 0.3) transparent; }
50
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
51
+ ::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background: transparent; }
52
+ ::-webkit-scrollbar-thumb {
53
+ background: rgba(128, 127, 140, 0.28);
54
+ border-radius: 99px;
55
+ border: 2px solid transparent;
56
+ background-clip: padding-box;
57
+ }
58
+ ::-webkit-scrollbar-thumb:hover { background: rgba(128, 127, 140, 0.5); background-clip: padding-box; }
17
59
 
18
60
  body {
19
61
  margin: 0;
20
62
  height: 100vh;
21
63
  display: flex;
22
- flex-direction: column;
23
64
  background: var(--bg);
24
65
  color: var(--text);
25
- font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
66
+ font-family: var(--sans);
67
+ font-size: 14px;
68
+ line-height: 1.5;
26
69
  }
70
+ textarea, input, select, button { font-family: inherit; font-size: inherit; color: inherit; }
71
+ textarea::placeholder, input::placeholder { color: var(--text3); }
72
+ a { color: var(--accent); text-decoration: none; }
73
+ a:hover { text-decoration: underline; }
74
+ summary { list-style: none; }
75
+ summary::-webkit-details-marker { display: none; }
76
+ .mono { font-family: var(--mono); }
77
+ .dim { color: var(--text3); }
78
+ @keyframes cz-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
27
79
 
28
- /* ---- header ---- */
29
- header {
30
- display: flex;
80
+ /* ---- shared buttons ---- */
81
+
82
+ .btn-dark {
83
+ display: inline-flex;
31
84
  align-items: center;
32
- gap: 12px;
33
- padding: 10px 16px;
34
- border-bottom: 1px solid var(--border);
35
- background: var(--bg-panel);
85
+ gap: 6px;
86
+ height: 29px;
87
+ padding: 0 15px;
88
+ border: none;
89
+ border-radius: 99px;
90
+ background: var(--btn);
91
+ color: var(--btn-text);
92
+ font-size: 12.5px;
93
+ font-weight: 600;
94
+ cursor: pointer;
95
+ white-space: nowrap;
36
96
  }
37
- .brand { font-weight: 700; font-size: 15px; }
38
- .chip {
39
- font-size: 12px;
40
- padding: 2px 10px;
41
- border: 1px solid var(--border);
42
- border-radius: 999px;
43
- color: var(--text-dim);
44
- font-family: var(--mono);
97
+ .btn-dark:hover { opacity: 0.88; }
98
+ .btn-dark:disabled { opacity: 0.45; cursor: default; }
99
+ .btn-dark .kbd { font-family: var(--mono); font-size: 10px; opacity: 0.6; }
100
+
101
+ .btn-ghost {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: 6px;
105
+ height: 29px;
106
+ padding: 0 14px;
107
+ border: 1px solid var(--line2);
108
+ border-radius: 99px;
109
+ background: transparent;
110
+ color: var(--text);
111
+ font-size: 12.5px;
112
+ font-weight: 500;
113
+ cursor: pointer;
114
+ white-space: nowrap;
45
115
  }
46
- .chip.ok { color: var(--green); border-color: color-mix(in srgb, var(--green) 40%, transparent); }
47
- .chip.bad { color: var(--red); border-color: color-mix(in srgb, var(--red) 40%, transparent); }
48
- #env-chips { display: flex; gap: 6px; }
49
- nav#tabs { margin-left: auto; display: flex; gap: 4px; }
50
- nav#tabs button {
51
- background: none;
52
- border: 1px solid transparent;
53
- color: var(--text-dim);
54
- padding: 5px 14px;
116
+ .btn-ghost:hover { border-color: var(--text3); }
117
+ .btn-ghost:disabled { opacity: 0.45; cursor: default; }
118
+
119
+ .btn-text {
120
+ border: none;
121
+ background: transparent;
122
+ color: var(--text2);
123
+ font-size: 12.5px;
124
+ font-weight: 500;
125
+ cursor: pointer;
126
+ padding: 5px 9px;
55
127
  border-radius: 8px;
128
+ white-space: nowrap;
129
+ }
130
+ .btn-text:hover { background: var(--panel2); color: var(--text); }
131
+ .btn-text .bi, .btn-dark .bi {
132
+ width: 12px;
133
+ height: 12px;
134
+ margin-right: 6px;
135
+ vertical-align: -1.5px;
136
+ fill: none;
137
+ stroke: currentColor;
138
+ stroke-width: 1.8;
139
+ stroke-linecap: round;
140
+ stroke-linejoin: round;
141
+ }
142
+ .btn-text .bi-fill, .btn-dark .bi-fill { fill: currentColor; stroke: none; width: 11px; height: 11px; }
143
+ .btn-text.danger { color: var(--red); }
144
+ .btn-text:disabled { opacity: 0.45; cursor: default; }
145
+
146
+ .chip-toggle {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ height: 27px;
150
+ padding: 0 12px;
151
+ border-radius: 99px;
152
+ font-size: 12px;
153
+ font-weight: 500;
56
154
  cursor: pointer;
57
- font-size: 13px;
155
+ border: 1px solid var(--line2);
156
+ color: var(--text2);
157
+ background: transparent;
158
+ }
159
+ .chip-toggle:hover { border-color: var(--text3); }
160
+ .chip-toggle.on {
161
+ border-color: var(--accent-line);
162
+ color: var(--accent);
163
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
58
164
  }
59
- nav#tabs button:hover { color: var(--text); }
60
- nav#tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
61
165
 
62
- /* ---- layout ---- */
63
- main { flex: 1; min-height: 0; display: flex; }
64
- .view { flex: 1; min-height: 0; display: flex; }
65
- .view[hidden] { display: none; }
66
- #view-repo, #view-skills { flex-direction: column; overflow-y: auto; padding: 20px; gap: 16px; }
166
+ .error-text { color: var(--red); font-size: 12px; }
167
+
168
+ /* hover tooltips [data-tip] on any element; .tip-right anchors to the right
169
+ edge (for controls near the sidebar's edge) */
170
+ [data-tip] { position: relative; }
171
+ [data-tip]::after {
172
+ content: attr(data-tip);
173
+ position: absolute;
174
+ top: calc(100% + 8px);
175
+ left: 0;
176
+ z-index: 50;
177
+ width: max-content;
178
+ max-width: 215px;
179
+ padding: 7px 11px;
180
+ border: 1px solid var(--line2);
181
+ border-radius: 9px;
182
+ background: var(--panel2);
183
+ color: var(--text);
184
+ font-size: 11px;
185
+ font-weight: 400;
186
+ font-family: var(--sans);
187
+ line-height: 1.5;
188
+ text-align: left;
189
+ white-space: normal;
190
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3);
191
+ opacity: 0;
192
+ visibility: hidden;
193
+ transition: opacity 0.12s ease 0.25s, visibility 0s linear 0.37s;
194
+ pointer-events: none;
195
+ }
196
+ [data-tip]:hover::after { opacity: 1; visibility: visible; transition-delay: 0.25s, 0.25s; }
197
+ [data-tip].tip-right::after { left: auto; right: 0; }
198
+
199
+ /* status pill — detail header + step cards */
200
+ .pill {
201
+ display: inline-flex;
202
+ align-items: center;
203
+ gap: 6px;
204
+ font-size: 11px;
205
+ font-weight: 600;
206
+ padding: 3px 11px;
207
+ border-radius: 99px;
208
+ color: var(--text2);
209
+ background: var(--panel2);
210
+ white-space: nowrap;
211
+ }
212
+ .pill .pulse-dot {
213
+ width: 6px; height: 6px; border-radius: 50%;
214
+ background: currentColor;
215
+ animation: cz-pulse 1.5s ease-in-out infinite;
216
+ }
217
+ .pill.waiting, .pill.review { color: var(--amber); background: color-mix(in oklab, var(--amber) 13%, transparent); }
218
+ .pill.running { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
219
+ .pill.done { color: var(--green); background: color-mix(in oklab, var(--green) 12%, transparent); }
220
+ .pill.failed { color: var(--red); background: color-mix(in oklab, var(--red) 12%, transparent); }
221
+
222
+ /* run-list / variant dots */
223
+ .dot { width: 7px; height: 7px; border-radius: 50%; flex: none; background: var(--text3); }
224
+ .dot.waiting, .dot.review { background: var(--amber); animation: cz-pulse 1.5s ease-in-out infinite; }
225
+ .dot.running { background: var(--accent); animation: cz-pulse 1.5s ease-in-out infinite; }
226
+ .dot.done { background: var(--green); }
227
+ .dot.failed { background: var(--red); }
228
+
229
+ /* ---- sidebar ---- */
67
230
 
68
231
  #sidebar {
69
- width: 340px;
70
- min-width: 340px;
71
- border-right: 1px solid var(--border);
232
+ width: 288px;
233
+ min-width: 288px;
72
234
  display: flex;
73
235
  flex-direction: column;
74
236
  min-height: 0;
237
+ background: var(--panel);
238
+ border-right: 1px solid var(--line);
75
239
  }
76
240
 
77
- /* ---- new task form ---- */
78
- #new-task { padding: 12px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; }
79
- #new-task textarea, #new-task input, #new-task select {
241
+ #brand { display: flex; align-items: center; gap: 9px; padding: 18px 18px 14px; }
242
+ #brand .brand-name {
243
+ font-family: var(--serif);
244
+ font-weight: 600;
245
+ font-size: 16.5px;
246
+ letter-spacing: -0.01em;
247
+ }
248
+ #repo-chip {
249
+ margin-left: auto;
250
+ font-size: 10.5px;
251
+ color: var(--text3);
252
+ overflow: hidden;
253
+ text-overflow: ellipsis;
254
+ white-space: nowrap;
255
+ max-width: 130px;
256
+ }
257
+
258
+ /* new task composer */
259
+ #new-task-wrap { padding: 0 14px 14px; }
260
+ #new-task {
261
+ border: 1px solid var(--line2);
262
+ border-radius: 12px;
263
+ background: var(--bg);
264
+ padding: 11px 12px 9px;
265
+ box-shadow: var(--shadow-sm);
266
+ display: flex;
267
+ flex-direction: column;
268
+ gap: 7px;
269
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
270
+ }
271
+ #new-task:focus-within {
272
+ border-color: var(--accent-line);
273
+ box-shadow: 0 4px 18px color-mix(in oklab, var(--accent) 10%, transparent), var(--shadow-sm);
274
+ }
275
+ #new-task textarea {
80
276
  width: 100%;
277
+ border: none;
278
+ background: transparent;
279
+ font-size: 13px;
280
+ line-height: 1.55;
281
+ resize: none;
282
+ height: 40px;
283
+ outline: none;
284
+ padding: 0;
285
+ overflow-y: auto;
286
+ transition: height 0.2s cubic-bezier(0.3, 0.7, 0.4, 1);
287
+ }
288
+ #task-thumbs { display: flex; gap: 7px; flex-wrap: wrap; }
289
+ #task-thumbs[hidden] { display: none; }
290
+ #task-thumbs .thumb { cursor: pointer; }
291
+ #task-thumbs img { height: 38px; border-radius: 7px; border: 1px solid var(--line2); display: block; }
292
+ #task-thumbs .thumb:hover img { border-color: var(--red); opacity: 0.7; }
293
+ #new-task .row { display: flex; gap: 7px; align-items: center; }
294
+
295
+ /* pill dropdowns — "≡ fix-and-verify ⌄" / "⊞ auto ⌄" */
296
+ .pill-select { position: relative; min-width: 0; }
297
+ #src-pill { flex: 0 1 auto; min-width: 0; }
298
+ #model-pill { flex: 0 1 auto; min-width: 0; }
299
+ .pill-btn {
300
+ display: inline-flex;
301
+ align-items: center;
302
+ gap: 6px;
303
+ max-width: 100%;
304
+ height: 26px;
305
+ padding: 0 9px 0 10px;
306
+ border: 1px solid var(--line);
307
+ border-radius: 99px;
308
+ background: var(--panel);
309
+ color: var(--text2);
310
+ font-family: var(--mono);
311
+ font-size: 11px;
312
+ cursor: pointer;
313
+ }
314
+ .pill-btn:hover { border-color: var(--line2); color: var(--text); }
315
+ .pill-btn .pl { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
316
+ .pill-btn svg.pic {
317
+ width: 11px; height: 11px; flex: none;
318
+ fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
319
+ opacity: 0.8;
320
+ }
321
+ .pill-btn svg.chev { width: 8px; height: 8px; flex: none; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; opacity: 0.6; }
322
+ .pill-select.open .pill-btn { border-color: var(--accent-line); color: var(--text); }
323
+
324
+ .pill-menu {
325
+ position: absolute;
326
+ top: calc(100% + 6px);
327
+ left: 0;
328
+ z-index: 30;
329
+ min-width: 230px;
330
+ max-width: 256px;
331
+ max-height: 320px;
332
+ overflow-y: auto;
333
+ background: var(--panel2);
334
+ border: 1px solid var(--line2);
335
+ border-radius: 13px;
336
+ box-shadow: 0 12px 34px rgba(0, 0, 0, 0.35);
337
+ padding: 5px;
338
+ }
339
+ .pill-menu[hidden] { display: none; }
340
+ .pill-menu .menu-search {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 7px;
344
+ margin: 3px 3px 7px;
345
+ padding: 6px 10px;
346
+ border: 1px solid var(--line);
347
+ border-radius: 9px;
81
348
  background: var(--bg);
82
- border: 1px solid var(--border);
83
- border-radius: 8px;
349
+ }
350
+ .pill-menu .menu-search svg {
351
+ width: 12px; height: 12px; flex: none;
352
+ fill: none; stroke: var(--text3); stroke-width: 2; stroke-linecap: round;
353
+ }
354
+ .pill-menu .menu-search input {
355
+ flex: 1;
356
+ min-width: 0;
357
+ border: none;
358
+ background: transparent;
359
+ font-size: 12.5px;
84
360
  color: var(--text);
85
- padding: 8px 10px;
86
- font: inherit;
87
- resize: vertical;
361
+ outline: none;
362
+ padding: 0;
88
363
  }
89
- #new-task .row { display: flex; gap: 8px; }
90
- #new-task .row select { flex: 1.4; min-width: 0; }
91
- #new-task .row input { flex: 1; min-width: 0; }
92
- button.primary {
93
- background: var(--accent);
364
+ .pill-menu .menu-tabs {
365
+ display: flex;
366
+ margin: 0 3px 7px;
367
+ padding: 3px;
368
+ border-radius: 99px;
369
+ background: var(--bg);
370
+ }
371
+ .pill-menu .menu-tabs button {
372
+ flex: 1;
94
373
  border: none;
95
- color: #fff;
374
+ border-radius: 99px;
375
+ background: transparent;
376
+ color: var(--text3);
377
+ font-size: 11.5px;
96
378
  font-weight: 600;
97
- padding: 8px;
98
- border-radius: 8px;
379
+ padding: 4px 0;
99
380
  cursor: pointer;
100
381
  }
101
- button.primary:hover { filter: brightness(1.1); }
102
- button.primary:disabled { opacity: .5; cursor: default; }
103
- .error-text { color: var(--red); font-size: 12px; }
382
+ .pill-menu .menu-tabs button:hover { color: var(--text2); }
383
+ .pill-menu .menu-tabs button.active { background: var(--panel2); color: var(--text); box-shadow: var(--shadow-sm); }
384
+ .pill-menu .menu-empty { padding: 10px 12px; font-size: 12px; color: var(--text3); line-height: 1.5; }
385
+ .pill-menu .menu-group {
386
+ padding: 8px 10px 3px;
387
+ font-size: 9.5px;
388
+ font-weight: 600;
389
+ letter-spacing: 0.09em;
390
+ text-transform: uppercase;
391
+ color: var(--text3);
392
+ }
393
+ .pill-menu .menu-item { padding: 7px 10px; border-radius: 9px; cursor: pointer; }
394
+ .pill-menu .menu-item:hover { background: color-mix(in oklab, var(--text) 7%, transparent); }
395
+ .pill-menu .mi-title { display: flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; color: var(--text); }
396
+ .pill-menu .mi-title .chk { width: 12px; flex: none; color: var(--accent); font-size: 11px; }
397
+ .pill-menu .mi-title .mi-ic {
398
+ width: 11px;
399
+ height: 11px;
400
+ flex: none;
401
+ fill: none;
402
+ stroke: var(--accent);
403
+ stroke-width: 1.8;
404
+ stroke-linejoin: round;
405
+ opacity: 0.9;
406
+ }
407
+ .pill-menu .mi-desc {
408
+ margin: 2px 0 0 19px;
409
+ font-size: 11px;
410
+ line-height: 1.45;
411
+ color: var(--text3);
412
+ display: -webkit-box;
413
+ -webkit-line-clamp: 2;
414
+ -webkit-box-orient: vertical;
415
+ overflow: hidden;
416
+ }
417
+ .pill-menu .menu-item.on { background: color-mix(in oklab, var(--accent) 9%, transparent); }
104
418
 
105
- /* ---- run list ---- */
106
- #run-list { flex: 1; overflow-y: auto; }
107
- .run-item {
108
- padding: 10px 12px;
109
- border-bottom: 1px solid var(--border);
419
+ #new-task .actions { margin-top: 2px; gap: 6px; }
420
+ .icon-btn {
421
+ width: 27px;
422
+ height: 27px;
423
+ flex: none;
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: center;
427
+ border: 1px solid var(--line);
428
+ border-radius: 99px;
429
+ background: transparent;
430
+ color: var(--text3);
431
+ cursor: pointer;
432
+ }
433
+ .icon-btn:hover { border-color: var(--line2); color: var(--text); }
434
+ #plan-btn {
435
+ display: inline-flex;
436
+ align-items: center;
437
+ gap: 6px;
438
+ height: 27px;
439
+ padding: 0 11px;
440
+ border: 1px solid var(--line);
441
+ border-radius: 99px;
442
+ background: transparent;
443
+ color: var(--text2);
444
+ font-size: 11.5px;
445
+ font-weight: 500;
446
+ cursor: pointer;
447
+ }
448
+ #plan-btn svg { fill: none; stroke: currentColor; }
449
+ #plan-btn:hover { border-color: var(--line2); color: var(--text); }
450
+ #plan-btn:disabled { opacity: 0.45; cursor: default; }
451
+ #run-btn {
452
+ margin-left: auto;
453
+ width: 32px;
454
+ height: 32px;
455
+ flex: none;
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: center;
459
+ border: none;
460
+ border-radius: 99px;
461
+ background: var(--btn);
462
+ color: var(--btn-text);
110
463
  cursor: pointer;
464
+ }
465
+ #run-btn:hover { opacity: 0.88; }
466
+ #run-btn:disabled { opacity: 0.45; cursor: default; }
467
+
468
+ /* plan overlay (spec 008; moved from the sidebar to the main window) */
469
+ #plan-overlay {
470
+ position: fixed;
471
+ inset: 0;
472
+ z-index: 60;
473
+ background: color-mix(in oklab, var(--bg) 55%, transparent);
474
+ backdrop-filter: blur(3px);
475
+ display: flex;
476
+ align-items: flex-start;
477
+ justify-content: center;
478
+ padding: 9vh 24px 24px;
479
+ }
480
+ #plan-overlay[hidden] { display: none; }
481
+ #plan-panel {
482
+ width: min(640px, 94vw);
483
+ max-height: 78vh;
484
+ overflow-y: auto;
485
+ border: 1px solid var(--line2);
486
+ border-radius: 16px;
487
+ background: var(--card);
488
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.35);
489
+ padding: 18px 20px;
111
490
  display: flex;
112
491
  flex-direction: column;
113
- gap: 3px;
492
+ gap: 10px;
114
493
  }
115
- .run-item:hover { background: var(--bg-panel); }
116
- .run-item.selected { background: var(--bg-raised); box-shadow: inset 3px 0 0 var(--accent); }
117
- .run-item .title { font-weight: 550; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
118
- .run-item .meta { display: flex; gap: 8px; align-items: center; font-size: 12px; color: var(--text-dim); }
119
-
120
- /* ---- badges ---- */
121
- .badge {
494
+ .plan-head { display: flex; align-items: flex-start; gap: 10px; }
495
+ .plan-head > div:first-child { flex: 1; }
496
+ .plan-task {
497
+ font-family: var(--serif);
498
+ font-size: 17px;
499
+ font-weight: 500;
500
+ letter-spacing: -0.01em;
501
+ line-height: 1.35;
502
+ }
503
+ .plan-close {
504
+ width: 26px;
505
+ height: 26px;
506
+ flex: none;
507
+ display: inline-flex;
508
+ align-items: center;
509
+ justify-content: center;
510
+ border: none;
511
+ border-radius: 99px;
512
+ background: transparent;
513
+ color: var(--text3);
514
+ cursor: pointer;
515
+ font-size: 16px;
516
+ }
517
+ .plan-close:hover { color: var(--text); background: var(--panel2); }
518
+ .plan-note { font-size: 12px; color: var(--amber); }
519
+ .plan-rationale { font-size: 12.5px; color: var(--text2); line-height: 1.55; max-width: 64ch; }
520
+ .plan-steps { display: flex; flex-direction: column; gap: 7px; }
521
+ .plan-step {
522
+ display: flex;
523
+ align-items: flex-start;
524
+ gap: 10px;
525
+ border: 1px solid var(--line);
526
+ border-radius: 11px;
527
+ padding: 10px 12px;
528
+ background: var(--bg);
529
+ font-size: 13px;
530
+ cursor: grab;
531
+ }
532
+ .plan-step.drag-over { border-color: var(--accent); }
533
+ .plan-step .grip { cursor: grab; color: var(--text3); user-select: none; margin-top: 1px; }
534
+ .plan-step .num { color: var(--text3); font-family: var(--mono); font-size: 10.5px; margin-top: 3px; }
535
+ .plan-step-main { flex: 1; min-width: 0; }
536
+ .plan-step .row1 { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
537
+ .plan-step .name { font-weight: 600; }
538
+ .plan-step .hint {
539
+ margin-top: 3px;
540
+ font-family: var(--mono);
122
541
  font-size: 11px;
542
+ line-height: 1.55;
543
+ color: var(--text3);
544
+ display: -webkit-box;
545
+ -webkit-line-clamp: 3;
546
+ -webkit-box-orient: vertical;
547
+ overflow: hidden;
548
+ }
549
+ .plan-badge {
550
+ font-size: 9px;
551
+ font-weight: 600;
552
+ text-transform: uppercase;
553
+ letter-spacing: 0.06em;
554
+ padding: 1px 7px;
555
+ border-radius: 99px;
556
+ border: 1px solid var(--line2);
557
+ color: var(--text3);
558
+ white-space: nowrap;
559
+ }
560
+ .plan-badge.skill { color: var(--accent); border-color: var(--accent-line); }
561
+ .plan-step .plan-remove {
562
+ background: none;
563
+ border: none;
564
+ color: var(--text3);
565
+ cursor: pointer;
566
+ padding: 0 2px;
567
+ font-size: 13px;
568
+ margin-top: 1px;
569
+ }
570
+ .plan-step .plan-remove:hover { color: var(--red); }
571
+ .plan-actions { display: flex; gap: 8px; margin-top: 2px; }
572
+ .plan-actions .btn-dark, .plan-actions .btn-ghost { flex: 1; justify-content: center; height: 30px; font-size: 12.5px; }
573
+ #plan-btn.busy svg { animation: cz-pulse 1.2s ease-in-out infinite; }
574
+
575
+ /* nav */
576
+ #tabs { display: flex; flex-direction: column; gap: 1px; padding: 0 8px 10px; }
577
+ #tabs button {
578
+ display: flex;
579
+ align-items: center;
580
+ text-align: left;
581
+ width: 100%;
582
+ padding: 7px 11px;
583
+ border: none;
584
+ border-radius: 9px;
585
+ font-size: 13.5px;
586
+ font-weight: 500;
587
+ cursor: pointer;
588
+ background: transparent;
589
+ color: var(--text2);
590
+ }
591
+ #tabs button:hover { color: var(--text); }
592
+ #tabs button.active { background: var(--panel2); color: var(--text); }
593
+ #tabs svg {
594
+ width: 14px; height: 14px;
595
+ margin-right: 9px;
596
+ flex: none;
597
+ opacity: 0.85;
598
+ fill: none;
599
+ stroke: currentColor;
600
+ stroke-width: 1.8;
601
+ stroke-linecap: round;
602
+ stroke-linejoin: round;
603
+ }
604
+ #tabs .count-badge {
605
+ margin-left: auto;
606
+ font-family: var(--mono);
607
+ font-size: 10.5px;
608
+ color: var(--amber);
609
+ font-weight: 600;
610
+ }
611
+ #tabs .count-badge[hidden] { display: none; }
612
+
613
+ /* run list */
614
+ #run-list-wrap { flex: 1; min-height: 0; display: flex; flex-direction: column; }
615
+ #list-tabs { display: flex; gap: 4px; align-items: center; padding: 4px 14px 0; }
616
+ #list-tabs button {
617
+ background: none;
618
+ border: none;
619
+ color: var(--text3);
620
+ padding: 3px 8px;
621
+ border-radius: 99px;
622
+ cursor: pointer;
623
+ font-size: 10.5px;
624
+ font-weight: 600;
625
+ letter-spacing: 0.05em;
626
+ text-transform: uppercase;
627
+ }
628
+ #list-tabs button:hover { color: var(--text2); }
629
+ #list-tabs button.active { color: var(--text); background: var(--panel2); }
630
+ #list-tabs .dot { display: inline-block; width: 6px; height: 6px; margin-left: 3px; background: var(--amber); animation: cz-pulse 1.5s ease-in-out infinite; }
631
+
632
+ #run-list { flex: 1; overflow-y: auto; padding: 2px 8px 12px; }
633
+ .group-label {
634
+ padding: 14px 10px 5px;
635
+ font-size: 10.5px;
636
+ font-weight: 600;
637
+ letter-spacing: 0.09em;
638
+ text-transform: uppercase;
639
+ color: var(--text3);
640
+ }
641
+ .run-item {
642
+ display: flex;
643
+ align-items: center;
644
+ gap: 10px;
645
+ padding: 7px 11px;
646
+ border-radius: 9px;
647
+ cursor: pointer;
648
+ margin: 1px 0;
649
+ }
650
+ .run-item:hover { background: var(--panel2); }
651
+ .run-item.selected { background: var(--panel2); }
652
+ .run-item .title {
653
+ flex: 1;
654
+ min-width: 0;
655
+ font-size: 13px;
656
+ overflow: hidden;
657
+ text-overflow: ellipsis;
658
+ white-space: nowrap;
659
+ }
660
+ .run-item .time { font-family: var(--mono); font-size: 9.5px; color: var(--text3); flex: none; }
661
+ .run-item.variant-row { padding-left: 26px; }
662
+ .run-item.group-item .dots { display: flex; gap: 4px; flex: none; }
663
+ .compare-btn {
664
+ border: 1px solid var(--line2);
665
+ background: transparent;
666
+ color: var(--text2);
667
+ border-radius: 99px;
668
+ padding: 1px 9px;
669
+ cursor: pointer;
670
+ font-size: 10.5px;
671
+ flex: none;
672
+ }
673
+ .compare-btn:hover { border-color: var(--accent-line); color: var(--accent); }
674
+
675
+ /* footer */
676
+ #side-foot {
677
+ border-top: 1px solid var(--line);
678
+ padding: 11px 16px;
679
+ display: flex;
680
+ align-items: center;
681
+ gap: 12px;
682
+ }
683
+ #env-chips { display: flex; gap: 12px; min-width: 0; }
684
+ .env-chip {
685
+ display: flex;
686
+ align-items: center;
687
+ gap: 5px;
688
+ font-family: var(--mono);
689
+ font-size: 10px;
690
+ color: var(--text3);
691
+ white-space: nowrap;
692
+ }
693
+ .env-chip .led { width: 5px; height: 5px; border-radius: 50%; background: var(--green); flex: none; }
694
+ .env-chip.bad .led { background: var(--red); }
695
+ #theme-toggle {
696
+ margin-left: auto;
697
+ border: none;
698
+ background: transparent;
699
+ color: var(--text3);
700
+ font-family: var(--mono);
701
+ font-size: 10px;
702
+ letter-spacing: 0.08em;
703
+ cursor: pointer;
704
+ padding: 3px 0;
705
+ }
706
+ #theme-toggle:hover { color: var(--text2); }
707
+
708
+ /* ---- main ---- */
709
+
710
+ main { flex: 1; min-width: 0; display: flex; min-height: 0; background: var(--bg); }
711
+ .view { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
712
+ .view[hidden] { display: none; }
713
+ .scroll-view { overflow-y: auto; }
714
+ .page { max-width: 760px; margin: 0 auto; padding: 34px 40px; width: 100%; }
715
+ .page h1, .page-title {
716
+ margin: 0 0 4px;
717
+ font-family: var(--serif);
718
+ font-size: 27px;
719
+ font-weight: 500;
720
+ letter-spacing: -0.015em;
721
+ }
722
+ .page .lead { margin: 0 0 22px; font-size: 13.5px; color: var(--text2); }
723
+ .section-label {
724
+ font-size: 10.5px;
123
725
  font-weight: 600;
124
- padding: 1px 8px;
125
- border-radius: 999px;
726
+ letter-spacing: 0.09em;
126
727
  text-transform: uppercase;
127
- letter-spacing: .3px;
728
+ color: var(--text3);
729
+ margin: 26px 0 9px;
128
730
  }
129
- .badge.queued { background: color-mix(in srgb, var(--yellow) 18%, transparent); color: var(--yellow); }
130
- .badge.running { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); animation: pulse 1.6s ease-in-out infinite; }
131
- .badge.done { background: color-mix(in srgb, var(--green) 15%, transparent); color: var(--green); }
132
- .badge.failed { background: color-mix(in srgb, var(--red) 15%, transparent); color: var(--red); }
133
- .badge.cancelled, .badge.skipped, .badge.pending { background: var(--bg-raised); color: var(--text-dim); }
134
- @keyframes pulse { 50% { opacity: .55; } }
135
731
 
136
732
  /* ---- run detail ---- */
733
+
137
734
  #detail { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 0; }
138
- #detail .empty { margin: auto; color: var(--text-dim); }
139
- .detail-header {
140
- padding: 12px 16px;
141
- border-bottom: 1px solid var(--border);
735
+ #detail .empty { margin: auto; color: var(--text3); font-size: 13.5px; }
736
+
737
+ .detail-head { flex: none; padding: 26px 40px 0; max-width: 860px; width: 100%; margin: 0 auto; }
738
+ .detail-head .meta-line {
142
739
  display: flex;
143
740
  align-items: center;
144
741
  gap: 10px;
742
+ font-family: var(--mono);
743
+ font-size: 10.5px;
744
+ color: var(--text3);
145
745
  flex-wrap: wrap;
146
746
  }
147
- .detail-header h2 { margin: 0; font-size: 15px; flex: 1; min-width: 200px; }
148
- .detail-header .sub { width: 100%; font-size: 12px; color: var(--text-dim); font-family: var(--mono); }
149
- .detail-header button {
150
- background: var(--bg-raised);
151
- border: 1px solid var(--border);
152
- color: var(--text);
153
- border-radius: 8px;
154
- padding: 4px 12px;
155
- cursor: pointer;
156
- font-size: 12px;
747
+ .detail-head .meta-line a { color: var(--accent); }
748
+ .detail-head .title-row { display: flex; align-items: baseline; gap: 14px; margin-top: 8px; flex-wrap: wrap; }
749
+ .detail-head h1 {
750
+ margin: 0;
751
+ font-family: var(--serif);
752
+ font-size: 27px;
753
+ font-weight: 500;
754
+ letter-spacing: -0.015em;
755
+ flex: 1;
756
+ min-width: 240px;
757
+ line-height: 1.25;
157
758
  }
158
- .detail-header button:hover { border-color: var(--text-dim); }
159
- .detail-header button.danger:hover { border-color: var(--red); color: var(--red); }
160
-
161
- .steps-rail {
759
+ .detail-head .head-bar {
162
760
  display: flex;
163
- gap: 8px;
164
- padding: 10px 16px;
165
- border-bottom: 1px solid var(--border);
166
- overflow-x: auto;
761
+ align-items: center;
762
+ gap: 4px;
763
+ margin-top: 12px;
764
+ padding-bottom: 14px;
765
+ border-bottom: 1px solid var(--line);
167
766
  flex-wrap: wrap;
168
767
  }
169
- .step-card {
170
- border: 1px solid var(--border);
768
+ .detail-head .steps-line { font-family: var(--mono); font-size: 11px; color: var(--text2); }
769
+ .detail-head .head-bar .spacer { flex: 1; }
770
+ .detail-head .run-error { font-size: 12px; color: var(--red); margin-top: 6px; }
771
+ .detail-head .resume-hint { font-family: var(--mono); font-size: 10.5px; color: var(--text3); margin-top: 6px; }
772
+ .detail-head .btn-dark { height: 27px; padding: 0 13px; font-size: 12px; }
773
+
774
+ /* slide-down panels: review gate / diff / notes */
775
+ .detail-panel {
776
+ flex: none;
777
+ max-height: 50%;
778
+ overflow: auto;
779
+ border-bottom: 1px solid var(--line);
780
+ background: var(--panel);
781
+ padding: 14px 40px;
782
+ }
783
+ .detail-panel[hidden] { display: none; }
784
+ .detail-panel > .inner { max-width: 780px; margin: 0 auto; }
785
+ .detail-panel pre {
786
+ margin: 0;
787
+ font-family: var(--mono);
788
+ font-size: 11.5px;
789
+ line-height: 1.6;
790
+ white-space: pre-wrap;
791
+ word-break: break-word;
792
+ }
793
+ .panel-label {
794
+ font-size: 10.5px;
795
+ font-weight: 600;
796
+ letter-spacing: 0.09em;
797
+ text-transform: uppercase;
798
+ color: var(--text3);
799
+ margin-bottom: 9px;
800
+ }
801
+
802
+ /* rendered markdown (handoff notes) */
803
+ .md { font-size: 13px; line-height: 1.65; color: var(--text); max-width: 72ch; }
804
+ .md h1, .md h2, .md h3, .md h4 { font-family: var(--serif); font-weight: 600; letter-spacing: -0.01em; margin: 18px 0 6px; }
805
+ .md h1 { font-size: 17px; }
806
+ .md h2 { font-size: 15px; }
807
+ .md h3, .md h4 { font-size: 13.5px; }
808
+ .md h1:first-child, .md h2:first-child { margin-top: 0; }
809
+ .md p { margin: 6px 0; }
810
+ .md ul, .md ol { margin: 6px 0; padding-left: 22px; }
811
+ .md li { margin: 3px 0; }
812
+ .md code {
813
+ font-family: var(--mono);
814
+ font-size: 11.5px;
815
+ background: var(--panel2);
816
+ border-radius: 5px;
817
+ padding: 1px 6px;
818
+ word-break: break-all;
819
+ }
820
+ .md pre {
821
+ margin: 8px 0;
822
+ padding: 11px 14px;
823
+ background: var(--card);
824
+ border: 1px solid var(--line);
171
825
  border-radius: 10px;
172
- padding: 6px 12px;
173
- background: var(--bg-panel);
826
+ overflow-x: auto;
827
+ }
828
+ .md pre code { background: transparent; padding: 0; word-break: normal; font-size: 11.5px; line-height: 1.6; }
829
+ .md hr { border: none; border-top: 1px solid var(--line); margin: 14px 0; }
830
+ .md strong { font-weight: 600; }
831
+ .md blockquote {
832
+ margin: 8px 0;
833
+ padding: 3px 14px;
834
+ border-left: 3px solid var(--line2);
835
+ color: var(--text2);
836
+ }
837
+ .md li.task { list-style: none; margin-left: -18px; }
838
+ .md li.task .cb { margin-right: 7px; color: var(--text2); }
839
+
840
+ #review-panel { background: var(--accent-soft); border-bottom: 1px solid var(--accent-line); }
841
+ #review-panel .panel-label { color: var(--accent); }
842
+ #review-notes {
843
+ width: 100%;
844
+ background: var(--card);
845
+ border: 1px solid var(--line2);
846
+ border-radius: 10px;
847
+ padding: 8px 12px;
848
+ font-size: 13px;
849
+ resize: vertical;
850
+ outline: none;
851
+ margin-top: 10px;
852
+ }
853
+ .review-buttons { display: flex; gap: 8px; margin-top: 10px; }
854
+
855
+ /* transcript */
856
+ .log-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
857
+ #log { flex: 1; overflow-y: auto; overflow-x: hidden; }
858
+ #log .log-inner { max-width: 860px; margin: 0 auto; padding: 18px 40px 28px; }
859
+
860
+ .ev { min-width: 0; }
861
+ .ev.step { display: flex; align-items: center; gap: 12px; margin: 22px 0 10px; }
862
+ .ev.step .step-label {
863
+ font-size: 10.5px;
864
+ font-weight: 600;
865
+ letter-spacing: 0.1em;
866
+ text-transform: uppercase;
867
+ color: var(--text3);
868
+ white-space: nowrap;
869
+ }
870
+ .ev.step .rule { flex: 1; height: 1px; background: var(--line); }
871
+
872
+ .ev.text {
873
+ color: var(--text);
874
+ font-size: 14px;
875
+ line-height: 1.7;
876
+ margin: 9px 0;
877
+ max-width: 66ch;
878
+ word-break: break-word;
879
+ }
880
+ .ev.text.md p:first-child { margin-top: 0; }
881
+ .ev.text.md p:last-child { margin-bottom: 0; }
882
+
883
+ .ev.tool, .ev.result summary {
884
+ display: inline-flex;
885
+ align-items: center;
886
+ gap: 7px;
887
+ margin: 2px 8px 2px 0;
888
+ padding: 3px 9px 3px 8px;
889
+ border: 1px solid var(--line);
890
+ border-radius: 8px;
891
+ background: var(--card);
892
+ font-size: 11.5px;
893
+ color: var(--text2);
894
+ max-width: 100%;
895
+ }
896
+ .ev.tool .ok { color: var(--green); font-size: 10px; }
897
+ .ev.tool .arg, .ev.tool code {
898
+ font-family: var(--mono);
899
+ font-size: 10.5px;
900
+ color: var(--text);
901
+ background: var(--panel2);
902
+ border-radius: 5px;
903
+ padding: 1px 6px;
904
+ overflow: hidden;
905
+ text-overflow: ellipsis;
906
+ white-space: nowrap;
907
+ max-width: 46ch;
908
+ }
909
+ .ev.result { margin: 4px 0; }
910
+ .ev.result summary { cursor: pointer; }
911
+ .ev.result summary:hover { border-color: var(--line2); }
912
+ .ev.result summary .lead-in { color: var(--text3); font-size: 10px; }
913
+ .ev.result summary .head {
914
+ overflow: hidden;
915
+ text-overflow: ellipsis;
916
+ white-space: nowrap;
917
+ max-width: 60ch;
918
+ }
919
+ .ev.result summary .show { font-family: var(--mono); font-size: 10px; color: var(--text3); }
920
+ .ev.result pre, .ev.tool-detail pre {
921
+ margin: 7px 0 4px;
922
+ padding: 12px 15px;
923
+ background: var(--card);
924
+ border: 1px solid var(--line);
925
+ border-radius: 11px;
926
+ color: var(--text2);
927
+ overflow-x: auto;
928
+ line-height: 1.55;
929
+ font-family: var(--mono);
930
+ font-size: 11.5px;
931
+ }
932
+ .ev.result.error summary { color: var(--red); }
933
+
934
+ .ev.check {
935
+ margin: 10px 0;
936
+ border: 1px solid var(--line);
937
+ border-radius: 12px;
938
+ background: var(--card);
939
+ overflow: hidden;
940
+ box-shadow: var(--shadow-sm);
941
+ }
942
+ .ev.check .check-head {
174
943
  display: flex;
175
944
  align-items: center;
176
- gap: 8px;
177
- font-size: 12px;
945
+ gap: 10px;
946
+ padding: 8px 14px;
947
+ border-bottom: 1px solid var(--line);
948
+ }
949
+ .ev.check .check-head .lbl {
950
+ font-size: 10.5px;
951
+ font-weight: 600;
952
+ letter-spacing: 0.08em;
953
+ text-transform: uppercase;
954
+ color: var(--text3);
955
+ }
956
+ .ev.check .check-head code { font-family: var(--mono); font-size: 11.5px; color: var(--text); }
957
+ .ev.check .check-pill {
958
+ margin-left: auto;
959
+ font-size: 10.5px;
960
+ font-weight: 600;
961
+ padding: 2px 10px;
962
+ border-radius: 99px;
963
+ }
964
+ .ev.check .check-pill.pass { color: var(--green); background: color-mix(in oklab, var(--green) 12%, transparent); }
965
+ .ev.check .check-pill.fail { color: var(--red); background: color-mix(in oklab, var(--red) 12%, transparent); }
966
+ .ev.check pre {
967
+ margin: 0;
968
+ padding: 10px 15px;
969
+ font-family: var(--mono);
970
+ font-size: 11.5px;
971
+ color: var(--text2);
972
+ overflow-x: auto;
973
+ line-height: 1.6;
974
+ max-height: 260px;
975
+ }
976
+
977
+ .ev.user { display: flex; justify-content: flex-end; margin: 12px 0; }
978
+ .ev.user .bubble {
979
+ max-width: 75%;
980
+ padding: 10px 15px;
981
+ border-radius: 15px;
982
+ background: var(--panel2);
983
+ font-size: 13.5px;
984
+ line-height: 1.6;
985
+ white-space: pre-wrap;
986
+ word-break: break-word;
987
+ }
988
+
989
+ .ev.image-ev { margin: 11px 0; }
990
+ .img-card {
991
+ display: inline-block;
992
+ border: 1px solid var(--line2);
993
+ border-radius: 13px;
994
+ overflow: hidden;
995
+ cursor: zoom-in;
996
+ background: var(--card);
997
+ box-shadow: var(--shadow-sm);
998
+ max-width: 420px;
999
+ }
1000
+ .img-card:hover { border-color: var(--text3); }
1001
+ .img-card img { display: block; width: 100%; height: auto; }
1002
+ .img-card .img-foot { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-top: 1px solid var(--line); }
1003
+ .img-card .nm {
1004
+ font-family: var(--mono);
1005
+ font-size: 10.5px;
1006
+ color: var(--text2);
1007
+ overflow: hidden;
1008
+ text-overflow: ellipsis;
178
1009
  white-space: nowrap;
179
1010
  }
180
- .step-card .name { font-weight: 600; }
181
- .step-card .tok { color: var(--text-dim); font-family: var(--mono); }
182
-
183
- /* ---- event log ---- */
184
- #log { flex: 1; overflow-y: auto; padding: 12px 16px 40px; font-family: var(--mono); font-size: 12.5px; }
185
- .ev { margin: 2px 0; white-space: pre-wrap; word-break: break-word; }
186
- .ev.text { color: var(--text); margin: 6px 0; }
187
- .ev.tool-call { color: var(--purple); }
188
- .ev.tool-result { color: var(--text-dim); }
189
- .ev.tool-result.error { color: var(--red); }
190
- .ev.note, .ev.lifecycle { color: var(--text-dim); font-style: italic; }
191
- .ev.error { color: var(--red); }
192
- .ev.step-start {
193
- margin: 14px 0 6px;
194
- color: var(--accent);
195
- font-weight: 700;
196
- border-top: 1px solid var(--border);
197
- padding-top: 10px;
1011
+ .img-card .zm { font-family: var(--mono); font-size: 10px; color: var(--text3); margin-left: auto; white-space: nowrap; }
1012
+
1013
+ #lightbox {
1014
+ position: fixed;
1015
+ inset: 0;
1016
+ background: rgba(10, 10, 14, 0.78);
1017
+ backdrop-filter: blur(6px);
1018
+ display: flex;
1019
+ align-items: center;
1020
+ justify-content: center;
1021
+ z-index: 99;
1022
+ cursor: zoom-out;
198
1023
  }
199
- .ev.check-output { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; color: var(--text-dim); }
200
- .ev details { display: inline-block; max-width: 100%; }
201
- .ev summary { cursor: pointer; }
202
- .ev details pre { margin: 4px 0 0; padding: 8px 10px; background: var(--bg-panel); border-radius: 8px; overflow-x: auto; }
1024
+ #lightbox .lb-inner { display: flex; flex-direction: column; gap: 11px; align-items: center; }
1025
+ #lightbox img { max-width: 84vw; max-height: 80vh; border-radius: 12px; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5); }
1026
+ #lightbox .lb-name { font-family: var(--mono); font-size: 11px; color: rgba(255, 255, 255, 0.72); }
1027
+
1028
+ .ev.note { font-family: var(--mono); font-size: 11px; color: var(--text3); margin: 5px 0; }
1029
+ .ev.err { font-size: 13px; color: var(--red); margin: 8px 0; white-space: pre-wrap; }
203
1030
 
204
1031
  #jump-bottom {
205
1032
  position: absolute;
206
- right: 24px;
207
- bottom: 20px;
208
- background: var(--bg-raised);
209
- border: 1px solid var(--border);
210
- color: var(--text);
211
- border-radius: 999px;
212
- padding: 6px 14px;
1033
+ right: 28px;
1034
+ bottom: 16px;
1035
+ border: 1px solid var(--line2);
1036
+ background: var(--panel);
1037
+ color: var(--text2);
1038
+ border-radius: 99px;
1039
+ padding: 5px 14px;
213
1040
  cursor: pointer;
214
- font-size: 12px;
215
- box-shadow: 0 4px 14px rgb(0 0 0 / .4);
1041
+ font-size: 11.5px;
1042
+ box-shadow: var(--shadow-sm);
216
1043
  }
217
- .log-wrap { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; }
1044
+ #jump-bottom:hover { color: var(--text); }
218
1045
 
219
- /* ---- repo & skills views ---- */
220
- .panel { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; }
221
- .panel h3 { margin: 0 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: .5px; color: var(--text-dim); }
222
- .panel pre { margin: 0; overflow-x: auto; font-family: var(--mono); font-size: 12.5px; }
223
- .panel table { width: 100%; border-collapse: collapse; font-size: 13px; }
224
- .panel td { padding: 4px 8px 4px 0; border-bottom: 1px solid var(--border); vertical-align: top; }
225
- .panel td.mono, .mono { font-family: var(--mono); }
226
- .dim { color: var(--text-dim); }
227
- .skill-card { margin-bottom: 12px; }
228
- .skill-card .path { font-size: 11px; }
229
- .skill-card pre { max-height: 320px; overflow: auto; margin-top: 8px; }
230
-
231
- /* ---- live session (spec 002) ---- */
232
- .badge.waiting { background: color-mix(in srgb, var(--yellow) 22%, transparent); color: var(--yellow); animation: pulse 1.6s ease-in-out infinite; }
233
-
234
- #msg-form { border-top: 1px solid var(--border); padding: 10px 16px; background: var(--bg-panel); }
235
- #msg-form.disabled { opacity: .55; }
236
- .msg-row { display: flex; gap: 8px; align-items: flex-end; }
1046
+ /* composer */
1047
+ .composer-wrap { flex: none; padding: 0 40px 22px; max-width: 860px; width: 100%; margin: 0 auto; }
1048
+ #waiting-note {
1049
+ display: flex;
1050
+ align-items: center;
1051
+ gap: 7px;
1052
+ font-size: 11.5px;
1053
+ color: var(--amber);
1054
+ margin: 0 4px 8px;
1055
+ }
1056
+ #waiting-note[hidden] { display: none; }
1057
+ #waiting-note .pulse-dot {
1058
+ width: 6px; height: 6px; border-radius: 50%;
1059
+ background: var(--amber);
1060
+ animation: cz-pulse 1.5s ease-in-out infinite;
1061
+ }
1062
+ #msg-form {
1063
+ display: flex;
1064
+ flex-direction: column;
1065
+ gap: 6px;
1066
+ padding: 10px 10px 10px 16px;
1067
+ border: 1px solid var(--line2);
1068
+ border-radius: 16px;
1069
+ background: var(--card);
1070
+ box-shadow: var(--shadow-sm);
1071
+ }
1072
+ #msg-form.disabled { opacity: 0.5; }
1073
+ #msg-form.disabled #msg-text, #msg-form.disabled button { pointer-events: none; }
1074
+ .msg-row { display: flex; gap: 6px; align-items: flex-end; }
237
1075
  #msg-text {
238
1076
  flex: 1;
239
- background: var(--bg);
240
- border: 1px solid var(--border);
241
- border-radius: 10px;
242
- color: var(--text);
243
- padding: 8px 12px;
244
- font: inherit;
1077
+ border: none;
1078
+ background: transparent;
1079
+ font-size: 13.5px;
1080
+ line-height: 1.55;
245
1081
  resize: none;
1082
+ outline: none;
1083
+ padding: 4px 2px;
246
1084
  max-height: 140px;
247
1085
  }
248
- #msg-send { width: 44px; }
249
- #msg-attach {
250
- background: var(--bg-raised);
251
- border: 1px solid var(--border);
252
- color: var(--text);
253
- border-radius: 10px;
254
- padding: 8px 10px;
1086
+ #msg-attach, #msg-send {
1087
+ width: 32px;
1088
+ height: 32px;
1089
+ flex: none;
1090
+ display: flex;
1091
+ align-items: center;
1092
+ justify-content: center;
1093
+ border: none;
1094
+ border-radius: 99px;
255
1095
  cursor: pointer;
256
1096
  }
257
- #msg-attach:hover { border-color: var(--text-dim); }
258
- #msg-thumbs { display: flex; gap: 8px; padding-bottom: 8px; }
259
- #msg-thumbs .thumb { position: relative; cursor: pointer; }
260
- #msg-thumbs img { height: 48px; border-radius: 8px; border: 1px solid var(--border); display: block; }
261
- #msg-thumbs .thumb:hover img { border-color: var(--red); opacity: .7; }
262
-
263
- .ev.user-message { color: var(--green); font-weight: 600; margin: 8px 0; }
1097
+ #msg-attach { background: transparent; color: var(--text3); }
1098
+ #msg-attach:hover { color: var(--text2); }
1099
+ #msg-send { background: var(--btn); color: var(--btn-text); }
1100
+ #msg-send:hover { opacity: 0.88; }
1101
+ #msg-thumbs { display: flex; gap: 8px; }
1102
+ #msg-thumbs[hidden] { display: none; }
1103
+ #msg-thumbs .thumb { cursor: pointer; }
1104
+ #msg-thumbs img { height: 44px; border-radius: 8px; border: 1px solid var(--line2); display: block; }
1105
+ #msg-thumbs .thumb:hover img { border-color: var(--red); opacity: 0.7; }
264
1106
 
265
1107
  #toast {
266
1108
  position: fixed;
267
1109
  bottom: 18px;
268
1110
  left: 50%;
269
1111
  transform: translateX(-50%);
270
- background: var(--bg-raised);
271
- border: 1px solid var(--border);
1112
+ background: var(--panel2);
1113
+ border: 1px solid var(--line2);
272
1114
  color: var(--text);
273
1115
  padding: 8px 18px;
274
- border-radius: 999px;
1116
+ border-radius: 99px;
275
1117
  font-size: 13px;
276
- box-shadow: 0 6px 20px rgb(0 0 0 / .5);
1118
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35);
277
1119
  z-index: 10;
1120
+ max-width: 80vw;
278
1121
  }
279
1122
 
280
- /* ---- task list upgrades (spec 004) ---- */
281
- #list-tabs {
1123
+ /* ---- inbox ---- */
1124
+
1125
+ .todo-card {
282
1126
  display: flex;
283
- gap: 4px;
284
1127
  align-items: center;
285
- padding: 8px 12px;
286
- border-bottom: 1px solid var(--border);
1128
+ gap: 16px;
1129
+ padding: 16px 0;
1130
+ border-bottom: 1px solid var(--line);
287
1131
  }
288
- #list-tabs button {
1132
+ .todo-card .todo-main { flex: 1; min-width: 0; }
1133
+ .todo-card .summary { font-size: 14px; font-weight: 500; }
1134
+ .todo-card .meta {
1135
+ display: flex;
1136
+ gap: 12px;
1137
+ margin-top: 5px;
1138
+ font-family: var(--mono);
1139
+ font-size: 10.5px;
1140
+ color: var(--text3);
1141
+ flex-wrap: wrap;
1142
+ }
1143
+ .todo-card .meta .gone { text-decoration: line-through; }
1144
+
1145
+ /* ---- split views (GitHub / Skills) ---- */
1146
+
1147
+ /* The list column grows with the viewport — 352px was cramped on wide
1148
+ screens (feedback 2026-07-11). */
1149
+ .split { flex: 1; min-height: 0; display: grid; grid-template-columns: clamp(340px, 27vw, 560px) minmax(0, 1fr); }
1150
+ .split-list { border-right: 1px solid var(--line); display: flex; flex-direction: column; min-height: 0; }
1151
+ .split-list .split-head { padding: 24px 18px 0; }
1152
+ .split-list .head-row { display: flex; align-items: baseline; gap: 10px; }
1153
+ .split-list h1 {
1154
+ margin: 0;
1155
+ font-family: var(--serif);
1156
+ font-size: 21px;
1157
+ font-weight: 500;
1158
+ letter-spacing: -0.015em;
1159
+ }
1160
+ .split-list .head-note {
1161
+ margin-left: auto;
1162
+ display: flex;
1163
+ align-items: center;
1164
+ gap: 5px;
1165
+ font-family: var(--mono);
1166
+ font-size: 10px;
1167
+ color: var(--text3);
1168
+ white-space: nowrap;
1169
+ }
1170
+ .split-list .sub-tabs { display: flex; gap: 4px; margin: 13px 0 10px; }
1171
+ .split-list .sub-tabs button {
1172
+ display: inline-flex;
1173
+ align-items: center;
1174
+ height: 28px;
1175
+ padding: 0 13px;
1176
+ border: none;
1177
+ border-radius: 99px;
1178
+ font-size: 12.5px;
1179
+ font-weight: 500;
1180
+ cursor: pointer;
1181
+ background: transparent;
1182
+ color: var(--text3);
1183
+ }
1184
+ .split-list .sub-tabs button.active { background: var(--panel2); color: var(--text); }
1185
+ .split-rows { flex: 1; overflow-y: auto; padding: 0 10px 14px; }
1186
+ .split-detail { overflow-y: auto; min-width: 0; }
1187
+ .split-detail .inner { max-width: 840px; padding: 30px 38px 44px; }
1188
+ .split-detail h1 {
1189
+ margin: 0;
1190
+ font-family: var(--serif);
1191
+ font-size: 25px;
1192
+ font-weight: 500;
1193
+ letter-spacing: -0.015em;
1194
+ line-height: 1.25;
1195
+ }
1196
+ .split-detail .empty { padding: 40px; color: var(--text3); font-size: 13px; }
1197
+
1198
+ .filter-input {
1199
+ width: calc(100% - 36px);
1200
+ margin: 14px 18px 8px;
1201
+ padding: 7px 13px;
1202
+ border: 1px solid var(--line);
1203
+ border-radius: 99px;
1204
+ background: var(--panel2);
1205
+ font-size: 12.5px;
1206
+ outline: none;
1207
+ }
1208
+
1209
+ /* GitHub rows + detail */
1210
+ .gh-row { padding: 9px 11px; border-radius: 10px; cursor: pointer; margin: 1px 0; }
1211
+ .gh-row:hover, .gh-row.selected { background: var(--panel2); }
1212
+ .gh-row .row1 { display: flex; align-items: center; gap: 9px; }
1213
+ .gh-row .row1 svg { width: 13px; height: 13px; flex: none; fill: none; stroke-width: 1.8; }
1214
+ .gh-row .row1 .t {
1215
+ flex: 1;
1216
+ min-width: 0;
1217
+ font-size: 13px;
1218
+ font-weight: 500;
1219
+ overflow: hidden;
1220
+ text-overflow: ellipsis;
1221
+ white-space: nowrap;
1222
+ }
1223
+ .gh-row .row2 {
1224
+ display: flex;
1225
+ gap: 10px;
1226
+ margin: 4px 0 0 22px;
1227
+ font-family: var(--mono);
1228
+ font-size: 10px;
1229
+ color: var(--text3);
1230
+ }
1231
+ .gh-row .row2 .queued-flag { color: var(--accent); }
1232
+
1233
+ .gh-label {
1234
+ font-size: 10px;
1235
+ font-weight: 600;
1236
+ letter-spacing: 0.06em;
1237
+ text-transform: uppercase;
1238
+ padding: 2px 9px;
1239
+ border-radius: 99px;
1240
+ background: var(--panel2);
1241
+ color: var(--text2);
1242
+ }
1243
+ .gh-checks { font-family: var(--mono); font-size: 11px; margin-left: 4px; }
1244
+ .gh-checks.passing { color: var(--green); }
1245
+ .gh-checks.failing { color: var(--red); }
1246
+ .gh-checks.pending { color: var(--amber); }
1247
+ .gh-body {
1248
+ margin-top: 16px;
1249
+ padding-bottom: 22px;
1250
+ border-bottom: 1px solid var(--line);
1251
+ font-size: 14px;
1252
+ line-height: 1.7;
1253
+ max-width: 68ch;
1254
+ word-break: break-word;
1255
+ }
1256
+ .gh-hand { margin-top: 24px; }
1257
+ .gh-hand .hand-label {
1258
+ display: flex;
1259
+ align-items: center;
1260
+ gap: 7px;
1261
+ font-size: 10.5px;
1262
+ font-weight: 600;
1263
+ letter-spacing: 0.09em;
1264
+ text-transform: uppercase;
1265
+ color: var(--text3);
1266
+ }
1267
+ .gh-hand .hand-label svg { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linejoin: round; }
1268
+ .gh-hand .hand-row { display: flex; align-items: flex-start; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
1269
+ .gh-hand .hand-row .k { font-size: 12px; color: var(--text3); width: 72px; flex: none; padding-top: 6px; }
1270
+ .gh-hand .hand-row .chips { display: flex; gap: 7px; flex-wrap: wrap; flex: 1; }
1271
+ .gh-hand .go-row { display: flex; align-items: center; gap: 12px; margin-top: 18px; }
1272
+ .gh-hand .queued-ok { display: flex; align-items: center; gap: 5px; font-size: 12px; color: var(--green); }
1273
+ .gh-unavailable { padding: 40px; color: var(--text3); font-size: 13px; max-width: 46ch; line-height: 1.7; }
1274
+
1275
+ /* Skills rows + detail */
1276
+ .skill-row { padding: 10px 12px; border-radius: 10px; cursor: pointer; margin: 1px 0; }
1277
+ .skill-row:hover, .skill-row.selected { background: var(--panel2); }
1278
+ .skill-row .row1 { display: flex; align-items: center; gap: 9px; }
1279
+ .skill-row .row1 svg { width: 13px; height: 13px; flex: none; fill: none; stroke: var(--text3); stroke-width: 1.8; stroke-linejoin: round; }
1280
+ .skill-row .name { font-family: var(--mono); font-size: 12.5px; font-weight: 600; }
1281
+ .skill-row .desc {
1282
+ font-size: 12px;
1283
+ color: var(--text3);
1284
+ margin: 4px 0 0 22px;
1285
+ line-height: 1.5;
1286
+ overflow: hidden;
1287
+ text-overflow: ellipsis;
1288
+ white-space: nowrap;
1289
+ }
1290
+ .skill-tag {
1291
+ font-size: 9.5px;
1292
+ font-weight: 600;
1293
+ text-transform: uppercase;
1294
+ letter-spacing: 0.08em;
1295
+ padding: 2px 8px;
1296
+ border-radius: 99px;
1297
+ color: var(--text3);
1298
+ background: var(--panel2);
1299
+ }
1300
+ .skill-tag.team { color: var(--accent); background: color-mix(in oklab, var(--accent) 12%, transparent); }
1301
+ .skill-tag.agents { color: var(--green); background: color-mix(in oklab, var(--green) 11%, transparent); }
1302
+ .skill-tag.global { color: var(--amber); background: color-mix(in oklab, var(--amber) 12%, transparent); }
1303
+ .skill-detail .title-row { display: flex; align-items: center; gap: 11px; flex-wrap: wrap; }
1304
+ .skill-detail .path-line { font-family: var(--mono); font-size: 11px; color: var(--text3); margin-top: 9px; word-break: break-all; }
1305
+ .skill-detail .desc { color: var(--text2); font-size: 14px; line-height: 1.65; margin-top: 12px; max-width: 60ch; }
1306
+ .skill-detail .used-row {
1307
+ display: flex;
1308
+ align-items: center;
1309
+ gap: 9px;
1310
+ padding: 8px 0;
1311
+ border-bottom: 1px solid var(--line);
1312
+ font-family: var(--mono);
1313
+ font-size: 12px;
1314
+ color: var(--text2);
1315
+ }
1316
+ .skill-detail .used-row svg { width: 12px; height: 12px; fill: none; stroke: var(--text3); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
1317
+ .skill-detail .content-head { display: flex; align-items: center; gap: 8px; margin: 26px 0 9px; }
1318
+ .skill-detail .content-head .section-label { margin: 0; }
1319
+ .skill-detail .content-head .spacer { flex: 1; }
1320
+ .skill-detail pre.content {
1321
+ margin: 0;
1322
+ padding: 16px 18px;
1323
+ background: var(--card);
1324
+ border: 1px solid var(--line);
1325
+ border-radius: 12px;
1326
+ font-family: var(--mono);
1327
+ font-size: 11.5px;
1328
+ line-height: 1.7;
1329
+ color: var(--text2);
1330
+ overflow-x: auto;
1331
+ white-space: pre-wrap;
1332
+ word-break: break-word;
1333
+ }
1334
+ .split-list .list-foot { flex: none; border-top: 1px solid var(--line); padding: 8px 10px; background: var(--bg); }
1335
+ .skill-row.pinned { margin: 0; }
1336
+
1337
+ /* ---- repo ---- */
1338
+
1339
+ .repo-file { display: flex; gap: 13px; font-family: var(--mono); font-size: 12px; padding: 3px 0; }
1340
+ .repo-file .st { width: 16px; flex: none; color: var(--green); }
1341
+ .repo-file .st.added { color: var(--accent); }
1342
+ .repo-file .st.deleted { color: var(--red); }
1343
+ .repo-file .p { color: var(--text2); word-break: break-all; }
1344
+ .commit-row { display: flex; gap: 13px; align-items: baseline; font-size: 13px; padding: 5px 0; }
1345
+ .commit-row .hash { font-family: var(--mono); font-size: 11px; color: var(--text3); flex: none; }
1346
+ .commit-row .subj { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1347
+ .commit-row .when { font-family: var(--mono); font-size: 10.5px; color: var(--text3); flex: none; }
1348
+ .base-branch-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
1349
+ #base-branch {
1350
+ height: 30px;
1351
+ padding: 0 10px;
1352
+ border: 1px solid var(--line2);
1353
+ border-radius: 9px;
1354
+ background: var(--panel2);
1355
+ color: var(--text);
1356
+ font-family: var(--mono);
1357
+ font-size: 12px;
1358
+ outline: none;
1359
+ cursor: pointer;
1360
+ max-width: 320px;
1361
+ }
1362
+
1363
+ .commit-row.clickable { cursor: pointer; border-radius: 8px; padding: 5px 8px; margin: 0 -8px; align-items: center; }
1364
+ .commit-row.clickable:hover { background: var(--panel2); }
1365
+ .commit-row .chev {
1366
+ width: 10px;
1367
+ height: 10px;
1368
+ flex: none;
1369
+ fill: none;
1370
+ stroke: var(--text3);
1371
+ stroke-width: 2.2;
1372
+ stroke-linecap: round;
1373
+ transition: transform 0.12s ease;
1374
+ }
1375
+ .commit-row.open .chev { transform: rotate(90deg); }
1376
+ .commit-diff { margin: 2px 0 8px 22px; }
1377
+ .commit-gh { display: inline-block; font-size: 11.5px; margin: 4px 0 2px; }
1378
+ .commit-head {
1379
+ margin: 4px 0 8px;
1380
+ padding: 10px 13px;
1381
+ background: var(--card);
1382
+ border: 1px solid var(--line);
1383
+ border-radius: 10px;
1384
+ font-family: var(--mono);
1385
+ font-size: 11px;
1386
+ line-height: 1.6;
1387
+ color: var(--text2);
1388
+ overflow-x: auto;
1389
+ white-space: pre-wrap;
1390
+ }
1391
+ .repo-diff {
1392
+ border: 1px solid var(--line);
1393
+ border-radius: 12px;
1394
+ background: var(--card);
1395
+ margin-top: 10px;
1396
+ }
1397
+ .repo-diff > summary { cursor: pointer; padding: 10px 14px; font-size: 12.5px; font-weight: 500; color: var(--text2); }
1398
+ .repo-diff .diff-wrap { padding: 0 14px 12px; }
1399
+
1400
+ /* ---- compare view (spec 010) ---- */
1401
+
1402
+ .compare-view { flex: 1; min-height: 0; overflow-y: auto; padding: 26px 40px; }
1403
+ .compare-view .inner { max-width: 980px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; }
1404
+ .compare-head h1 {
1405
+ margin: 0 0 2px;
1406
+ font-family: var(--serif);
1407
+ font-size: 24px;
1408
+ font-weight: 500;
1409
+ letter-spacing: -0.015em;
1410
+ }
1411
+ .compare-head .dim { font-size: 12.5px; }
1412
+ .compare-cols { display: flex; gap: 12px; align-items: stretch; }
1413
+ .compare-col {
1414
+ flex: 1;
1415
+ min-width: 0;
1416
+ border: 1px solid var(--line);
1417
+ border-radius: 13px;
1418
+ background: var(--card);
1419
+ box-shadow: var(--shadow-sm);
1420
+ padding: 14px;
1421
+ display: flex;
1422
+ flex-direction: column;
1423
+ gap: 8px;
1424
+ }
1425
+ .compare-col .col-head { display: flex; align-items: center; gap: 8px; }
1426
+ .compare-col .variant-letter { font-family: var(--mono); font-weight: 600; font-size: 16px; color: var(--accent); }
1427
+ .compare-col .col-meta { font-size: 11px; font-family: var(--mono); color: var(--text3); }
1428
+ .compare-col pre {
1429
+ margin: 0;
1430
+ font-family: var(--mono);
1431
+ font-size: 11px;
1432
+ line-height: 1.55;
1433
+ white-space: pre-wrap;
1434
+ word-break: break-word;
1435
+ overflow: auto;
1436
+ color: var(--text2);
1437
+ }
1438
+ .compare-col .col-stat { max-height: 140px; }
1439
+ .compare-col .col-handoff { max-height: 80px; color: var(--text3); }
1440
+ .compare-col .btn-dark { margin-top: auto; justify-content: center; }
1441
+ .compare-diffs { display: flex; flex-direction: column; gap: 6px; }
1442
+ .compare-diff { border: 1px solid var(--line); border-radius: 11px; background: var(--card); }
1443
+ .compare-diff > summary { cursor: pointer; padding: 8px 12px; font-size: 12.5px; font-weight: 500; color: var(--text2); }
1444
+ .compare-diff .diff-body { padding: 4px 10px 10px; }
1445
+
1446
+ /* ---- unified diff renderer (spec 009) ---- */
1447
+
1448
+ .diff-file { border: 1px solid var(--line); border-radius: 9px; margin: 3px 0; background: var(--bg); }
1449
+ .diff-file summary { cursor: pointer; padding: 5px 10px; font-family: var(--mono); font-size: 11.5px; font-weight: 600; }
1450
+ .diff-file pre {
1451
+ margin: 0;
1452
+ padding: 6px 10px;
1453
+ border-top: 1px solid var(--line);
1454
+ font-family: var(--mono);
1455
+ font-size: 11.5px;
1456
+ line-height: 1.55;
1457
+ overflow-x: auto;
1458
+ white-space: pre;
1459
+ }
1460
+ .diff-add { color: var(--green); }
1461
+ .diff-del { color: var(--red); }
1462
+ .diff-hunk { color: var(--accent); opacity: 0.8; }
1463
+ .diff-meta { color: var(--text3); opacity: 0.8; }
1464
+
1465
+ /* ---- bookmarklets (spec 011) ---- */
1466
+
1467
+ #bm-panel .bm-help { font-size: 13px; color: var(--text2); line-height: 1.65; margin: 10px 0; max-width: 56ch; }
1468
+ .bm-auto { display: flex; align-items: center; gap: 8px; font-size: 13px; margin-bottom: 10px; cursor: pointer; }
1469
+ .bm-auto input { accent-color: var(--accent); }
1470
+ .bm-filter {
1471
+ width: 100%;
1472
+ max-width: 340px;
1473
+ background: var(--panel2);
1474
+ border: 1px solid var(--line);
1475
+ border-radius: 99px;
1476
+ padding: 6px 13px;
1477
+ font-size: 12.5px;
1478
+ outline: none;
1479
+ margin: 10px 0 6px;
1480
+ display: block;
1481
+ }
1482
+ .bm-row { display: flex; align-items: center; gap: 8px; padding: 3px 0; min-width: 0; }
1483
+ a.bm {
1484
+ display: inline-block;
1485
+ padding: 4px 12px;
1486
+ border: 1px dashed var(--line2);
1487
+ border-radius: 99px;
1488
+ background: var(--panel2);
1489
+ color: var(--text);
1490
+ font-family: var(--mono);
1491
+ font-size: 12px;
1492
+ text-decoration: none;
1493
+ cursor: grab;
1494
+ white-space: nowrap;
1495
+ overflow: hidden;
1496
+ text-overflow: ellipsis;
1497
+ }
1498
+ a.bm:hover { border-color: var(--accent-line); color: var(--accent); text-decoration: none; }
1499
+ .bm-copy {
289
1500
  background: none;
290
- border: 1px solid transparent;
291
- color: var(--text-dim);
1501
+ border: 1px solid var(--line);
1502
+ color: var(--text3);
292
1503
  padding: 3px 10px;
293
- border-radius: 8px;
1504
+ border-radius: 99px;
294
1505
  cursor: pointer;
1506
+ font-size: 11.5px;
1507
+ }
1508
+ .bm-copy:hover { border-color: var(--text3); color: var(--text); }
1509
+ .bm-hint { font-size: 11.5px; color: var(--text3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1510
+
1511
+ /* ---- workflow builder (spec 012) ---- */
1512
+
1513
+ .wb-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) 300px; }
1514
+ .wb-main { overflow-y: auto; min-width: 0; }
1515
+ .wb-inner { max-width: 620px; margin: 0 auto; padding: 30px 40px 60px; }
1516
+
1517
+ .wb-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
1518
+ .wb-head h1 {
1519
+ margin: 0;
1520
+ font-family: var(--serif);
1521
+ font-size: 25px;
1522
+ font-weight: 500;
1523
+ letter-spacing: -0.015em;
1524
+ flex: 1;
1525
+ min-width: 180px;
1526
+ }
1527
+ .wb-head .btn-dark { height: 29px; }
1528
+
1529
+ .wb-meta { display: flex; align-items: center; gap: 10px; margin-top: 12px; }
1530
+ .wb-name-pill {
1531
+ display: inline-flex;
1532
+ align-items: center;
1533
+ gap: 7px;
1534
+ height: 30px;
1535
+ padding: 0 13px;
1536
+ border: 1px solid var(--line);
1537
+ border-radius: 99px;
1538
+ background: var(--panel2);
1539
+ }
1540
+ .wb-name-pill svg { width: 11px; height: 11px; fill: none; stroke: var(--text3); stroke-width: 2; stroke-linecap: round; flex: none; }
1541
+ .wb-name-pill input {
1542
+ border: none;
1543
+ background: transparent;
1544
+ color: var(--text);
1545
+ font-family: var(--mono);
295
1546
  font-size: 12px;
1547
+ font-weight: 600;
1548
+ outline: none;
1549
+ padding: 0;
1550
+ width: 170px;
296
1551
  }
297
- #list-tabs button:hover { color: var(--text); }
298
- #list-tabs button.active { color: var(--text); background: var(--bg-raised); border-color: var(--border); }
299
- #list-tabs .dot {
300
- display: inline-block;
301
- width: 7px;
302
- height: 7px;
303
- border-radius: 50%;
304
- background: var(--yellow);
305
- margin-left: 2px;
306
- animation: pulse 1.6s ease-in-out infinite;
307
- }
308
- .pr-badge {
1552
+ #wb-count { font-size: 11px; }
1553
+
1554
+ .wb-load { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-top: 12px; }
1555
+ .wb-load .wb-k { font-size: 12px; color: var(--text3); }
1556
+ .wb-load .chip-toggle { height: 25px; font-size: 11.5px; }
1557
+
1558
+ .wb-import {
1559
+ margin-top: 14px;
1560
+ border: 1px solid var(--accent-line);
1561
+ border-radius: 13px;
1562
+ background: var(--card);
1563
+ padding: 13px 14px;
1564
+ box-shadow: var(--shadow-sm);
1565
+ }
1566
+ .wb-import-label {
1567
+ font-size: 10.5px;
1568
+ font-weight: 600;
1569
+ letter-spacing: 0.09em;
1570
+ text-transform: uppercase;
1571
+ color: var(--accent);
1572
+ margin-bottom: 8px;
1573
+ }
1574
+ .wb-import textarea {
1575
+ width: 100%;
1576
+ border: 1px solid var(--line);
1577
+ border-radius: 9px;
1578
+ background: var(--bg);
1579
+ color: var(--text);
1580
+ font-family: var(--mono);
1581
+ font-size: 11.5px;
1582
+ line-height: 1.6;
1583
+ resize: vertical;
1584
+ outline: none;
1585
+ padding: 9px 11px;
1586
+ }
1587
+ .wb-import-actions { display: flex; gap: 8px; margin-top: 9px; }
1588
+ .wb-import-actions .btn-dark, .wb-import-actions .btn-ghost { height: 28px; font-size: 12px; }
1589
+
1590
+ #wb-steps { margin-top: 16px; }
1591
+
1592
+ /* insertion gaps: a hairline at rest, dashed slots while dragging, an accent
1593
+ "drop to insert" slot under the pointer */
1594
+ .wb-gap { position: relative; display: flex; align-items: center; justify-content: center; height: 16px; transition: height 0.12s ease; }
1595
+ .wb-gap-inner {
1596
+ width: 1.5px;
1597
+ height: 100%;
1598
+ background: var(--line2);
1599
+ pointer-events: none;
1600
+ overflow: hidden;
1601
+ font-size: 0;
1602
+ color: transparent;
1603
+ }
1604
+ .wb-dragging .wb-gap { height: 28px; }
1605
+ .wb-dragging .wb-gap-inner {
1606
+ width: 100%;
1607
+ height: 16px;
1608
+ border: 1.5px dashed var(--line2);
1609
+ border-radius: 9px;
1610
+ background: transparent;
1611
+ }
1612
+ .wb-dragging .wb-gap.over { height: 46px; }
1613
+ .wb-dragging .wb-gap.over .wb-gap-inner {
1614
+ height: 36px;
1615
+ border-color: var(--accent);
1616
+ border-radius: 11px;
1617
+ background: color-mix(in oklab, var(--accent) 7%, transparent);
1618
+ display: flex;
1619
+ align-items: center;
1620
+ justify-content: center;
309
1621
  font-size: 11px;
310
1622
  font-weight: 600;
311
- padding: 1px 8px;
312
- border-radius: 999px;
313
- background: color-mix(in srgb, var(--purple) 18%, transparent);
314
- color: var(--purple);
315
- text-decoration: none;
1623
+ color: var(--accent);
1624
+ }
1625
+ /* empty canvas: one big always-visible drop slot */
1626
+ .wb-gap.tall, .wb-dragging .wb-gap.tall { height: 72px; }
1627
+ .wb-gap.tall .wb-gap-inner, .wb-dragging .wb-gap.tall .wb-gap-inner {
1628
+ width: 100%;
1629
+ height: 100%;
1630
+ border: 1.5px dashed var(--line2);
1631
+ border-radius: 13px;
1632
+ background: transparent;
1633
+ display: flex;
1634
+ align-items: center;
1635
+ justify-content: center;
1636
+ font-size: 12px;
1637
+ color: var(--text3);
1638
+ }
1639
+ .wb-gap.tall.over .wb-gap-inner, .wb-dragging .wb-gap.tall.over .wb-gap-inner {
1640
+ border-color: var(--accent);
1641
+ color: var(--accent);
1642
+ background: color-mix(in oklab, var(--accent) 7%, transparent);
1643
+ }
1644
+
1645
+ .wb-step {
1646
+ display: flex;
1647
+ gap: 12px;
1648
+ align-items: center;
1649
+ padding: 12px 15px;
1650
+ border: 1px solid var(--line2);
1651
+ border-radius: 13px;
1652
+ box-shadow: var(--shadow-sm);
1653
+ cursor: grab;
1654
+ background: var(--card);
1655
+ }
1656
+ .wb-step.drag-src { opacity: 0.35; }
1657
+ .wb-step .grip { flex: none; fill: var(--text3); }
1658
+ .wb-step .num { font-size: 10px; color: var(--text3); flex: none; width: 18px; }
1659
+ .wb-ic { width: 14px; height: 14px; fill: none; stroke: var(--accent); stroke-width: 1.8; stroke-linejoin: round; flex: none; }
1660
+ .wb-step-main { flex: 1; min-width: 0; }
1661
+ .wb-step-name { font-size: 12.5px; font-weight: 600; color: var(--text); }
1662
+ .wb-step-desc {
1663
+ font-size: 11px;
1664
+ color: var(--text3);
1665
+ margin-top: 2px;
1666
+ line-height: 1.45;
1667
+ overflow: hidden;
1668
+ text-overflow: ellipsis;
1669
+ white-space: nowrap;
1670
+ }
1671
+ .wb-badge {
1672
+ flex: none;
1673
+ font-size: 9.5px;
1674
+ font-weight: 600;
1675
+ letter-spacing: 0.06em;
1676
+ text-transform: uppercase;
1677
+ padding: 2px 8px;
1678
+ border-radius: 99px;
1679
+ color: var(--text2);
1680
+ background: var(--panel2);
1681
+ }
1682
+ .wb-badge.unknown { color: var(--amber); background: color-mix(in oklab, var(--amber) 13%, transparent); }
1683
+ .wb-badge.check { color: var(--green); background: color-mix(in oklab, var(--green) 12%, transparent); }
1684
+ .wb-remove {
1685
+ width: 24px;
1686
+ height: 24px;
1687
+ flex: none;
1688
+ display: inline-flex;
1689
+ align-items: center;
1690
+ justify-content: center;
1691
+ border: none;
1692
+ border-radius: 99px;
1693
+ background: transparent;
1694
+ color: var(--text3);
1695
+ cursor: pointer;
1696
+ font-size: 14px;
1697
+ }
1698
+ .wb-remove:hover { color: var(--red); background: color-mix(in oklab, var(--red) 10%, transparent); }
1699
+ .wb-flow-note { display: flex; align-items: center; gap: 9px; justify-content: center; margin-top: 2px; font-size: 11.5px; color: var(--text3); }
1700
+ .wb-flow-note svg { fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
1701
+
1702
+ .wb-aside { border-left: 1px solid var(--line); background: var(--panel); overflow-y: auto; padding: 24px 16px; }
1703
+ .wb-hint { font-size: 11px; color: var(--text3); margin-bottom: 9px; line-height: 1.5; }
1704
+ #wb-palette { display: flex; flex-direction: column; gap: 6px; }
1705
+ .wb-skill {
1706
+ display: flex;
1707
+ align-items: center;
1708
+ gap: 8px;
1709
+ padding: 8px 12px;
1710
+ border: 1px solid var(--line);
1711
+ border-radius: 99px;
1712
+ background: var(--card);
1713
+ cursor: grab;
1714
+ }
1715
+ .wb-skill:hover { border-color: var(--accent-line); }
1716
+ .wb-skill .wb-ic { width: 12px; height: 12px; }
1717
+ .wb-skill .name { font-size: 11.5px; font-weight: 600; color: var(--text2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1718
+ .wb-skill-right { margin-left: auto; display: flex; align-items: center; gap: 7px; flex: none; }
1719
+ .wb-skill .in-flow { width: 11px; height: 11px; fill: none; stroke: var(--green); stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
1720
+ .wb-skill .dots { width: 10px; height: 10px; fill: var(--text3); }
1721
+
1722
+ .wb-yaml-head { display: flex; align-items: center; gap: 8px; margin: 20px 0 9px; }
1723
+ .wb-yaml-head .spacer { flex: 1; }
1724
+ .wb-yaml {
1725
+ margin: 0;
1726
+ padding: 12px 14px;
1727
+ background: var(--bg);
1728
+ border: 1px solid var(--line);
1729
+ border-radius: 11px;
1730
+ font-family: var(--mono);
1731
+ font-size: 10.5px;
1732
+ line-height: 1.7;
1733
+ color: var(--text2);
1734
+ overflow-x: auto;
1735
+ white-space: pre-wrap;
1736
+ }
1737
+ .wb-note { display: flex; align-items: flex-start; gap: 7px; margin-top: 10px; font-size: 11px; color: var(--text3); line-height: 1.5; }
1738
+ .wb-note svg { flex: none; margin-top: 1px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
1739
+
1740
+ /* narrow screens: sidebar shrinks, splits stack */
1741
+ @media (max-width: 900px) {
1742
+ #sidebar { width: 240px; min-width: 240px; }
1743
+ .split { grid-template-columns: 1fr; grid-template-rows: minmax(0, 45%) minmax(0, 1fr); }
1744
+ .split-list { border-right: none; border-bottom: 1px solid var(--line); }
1745
+ .wb-grid { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) minmax(0, 45%); }
1746
+ .wb-aside { border-left: none; border-top: 1px solid var(--line); }
316
1747
  }
317
- .pr-badge:hover { filter: brightness(1.2); }