declare-cc 1.0.7 → 2.0.0

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 (75) hide show
  1. package/README.md +153 -187
  2. package/dist/client/assets/index-BVuhr02G.css +1 -0
  3. package/dist/client/assets/index-DujGXAYw.js +9 -0
  4. package/dist/client/index.html +23 -0
  5. package/dist/index.js +17459 -0
  6. package/package.json +38 -45
  7. package/src/agents/prompts/00-research.md +90 -0
  8. package/src/agents/prompts/01-vision.md +38 -0
  9. package/src/agents/prompts/02-declarations.md +47 -0
  10. package/src/agents/prompts/03-milestones.md +43 -0
  11. package/src/agents/prompts/04-actions.md +90 -0
  12. package/src/agents/prompts/05-execution.md +63 -0
  13. package/src/agents/prompts/06-verification.md +104 -0
  14. package/LICENSE +0 -21
  15. package/agents/declare-codebase-mapper.md +0 -761
  16. package/agents/declare-debugger.md +0 -1198
  17. package/agents/declare-executor.md +0 -353
  18. package/agents/declare-integration-checker.md +0 -440
  19. package/agents/declare-plan-checker.md +0 -608
  20. package/agents/declare-planner.md +0 -1015
  21. package/agents/declare-research-synthesizer.md +0 -309
  22. package/agents/declare-researcher.md +0 -484
  23. package/agents/declare-roadmapper.md +0 -639
  24. package/agents/declare-verifier.md +0 -555
  25. package/bin/declare.js +0 -16
  26. package/bin/install.js +0 -1907
  27. package/commands/declare/actions.md +0 -113
  28. package/commands/declare/add-todo.md +0 -41
  29. package/commands/declare/audit.md +0 -76
  30. package/commands/declare/check-todos.md +0 -125
  31. package/commands/declare/complete-milestone.md +0 -215
  32. package/commands/declare/dashboard.md +0 -65
  33. package/commands/declare/debug.md +0 -162
  34. package/commands/declare/discuss.md +0 -65
  35. package/commands/declare/execute.md +0 -521
  36. package/commands/declare/future.md +0 -72
  37. package/commands/declare/health.md +0 -92
  38. package/commands/declare/help.md +0 -31
  39. package/commands/declare/init.md +0 -39
  40. package/commands/declare/map-codebase.md +0 -149
  41. package/commands/declare/milestones.md +0 -98
  42. package/commands/declare/new-cycle.md +0 -172
  43. package/commands/declare/new-project.md +0 -565
  44. package/commands/declare/pause.md +0 -138
  45. package/commands/declare/plan.md +0 -320
  46. package/commands/declare/prioritize.md +0 -65
  47. package/commands/declare/progress.md +0 -116
  48. package/commands/declare/quick.md +0 -119
  49. package/commands/declare/reapply-patches.md +0 -178
  50. package/commands/declare/research.md +0 -267
  51. package/commands/declare/resume.md +0 -146
  52. package/commands/declare/set-profile.md +0 -66
  53. package/commands/declare/settings.md +0 -119
  54. package/commands/declare/status.md +0 -65
  55. package/commands/declare/trace.md +0 -81
  56. package/commands/declare/update.md +0 -251
  57. package/commands/declare/verify.md +0 -65
  58. package/commands/declare/visualize.md +0 -74
  59. package/dist/declare-tools.cjs +0 -9428
  60. package/dist/public/app.js +0 -9086
  61. package/dist/public/index.html +0 -4292
  62. package/hooks/declare-activity.js +0 -106
  63. package/hooks/declare-check-update.js +0 -62
  64. package/hooks/declare-server.js +0 -116
  65. package/hooks/declare-statusline.js +0 -91
  66. package/scripts/build-hooks.js +0 -42
  67. package/scripts/release.js +0 -50
  68. package/templates/future.md +0 -4
  69. package/templates/milestones.md +0 -11
  70. package/workflows/actions.md +0 -89
  71. package/workflows/discuss.md +0 -476
  72. package/workflows/future.md +0 -185
  73. package/workflows/milestones.md +0 -87
  74. package/workflows/scope.md +0 -94
  75. package/workflows/verify.md +0 -504
@@ -1,4292 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Declare — Project DAG</title>
7
- <style>
8
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9
-
10
- :root {
11
- /* ── Mesh/Deco-inspired dark palette ── */
12
- --bg: #111111;
13
- --surface: #1a1a1a;
14
- --surface2: #222222;
15
- --surface3: #2a2a2a;
16
- --border: rgba(255,255,255,0.08);
17
- --border-strong: rgba(255,255,255,0.14);
18
- --text: #d4d4d4;
19
- --text-dim: #999999;
20
- --text-bright: #f5f5f5;
21
- --text-muted: #6b6b6b;
22
-
23
- /* Brand accent — deco lime green */
24
- --accent: #d0ec1a;
25
- --accent-dim: rgba(208, 236, 26, 0.12);
26
- --accent-border: rgba(208, 236, 26, 0.25);
27
-
28
- --decl-color: #93c5fd;
29
- --decl-bg: rgba(147, 197, 253, 0.06);
30
- --decl-border: rgba(147, 197, 253, 0.15);
31
-
32
- --mile-color: #a595ff;
33
- --mile-bg: rgba(165, 149, 255, 0.06);
34
- --mile-border: rgba(165, 149, 255, 0.15);
35
-
36
- --act-color: #86efac;
37
- --act-bg: rgba(134, 239, 172, 0.06);
38
- --act-border: rgba(134, 239, 172, 0.15);
39
-
40
- /* done tones */
41
- --decl-done-color: #6b96c8;
42
- --decl-done-bg: rgba(107, 150, 200, 0.05);
43
- --decl-done-border: rgba(107, 150, 200, 0.10);
44
-
45
- --mile-done-color: #8878c0;
46
- --mile-done-bg: rgba(136, 120, 192, 0.05);
47
- --mile-done-border: rgba(136, 120, 192, 0.10);
48
-
49
- --act-done-color: #5cb88a;
50
- --act-done-bg: rgba(92, 184, 138, 0.05);
51
- --act-done-border: rgba(92, 184, 138, 0.10);
52
-
53
- /* workflow progress tones */
54
- --planned-color: #93c5fd;
55
- --planned-bg: rgba(147, 197, 253, 0.06);
56
- --planned-border: rgba(147, 197, 253, 0.15);
57
-
58
- --executing-color: #fbbf24;
59
- --executing-bg: rgba(251, 191, 36, 0.06);
60
- --executing-border: rgba(251, 191, 36, 0.18);
61
-
62
- --broken-color: #f87171;
63
- --broken-bg: rgba(248, 113, 113, 0.06);
64
- --broken-border: rgba(248, 113, 113, 0.18);
65
-
66
- /* integrity wholeness indicators */
67
- --integrity-whole: #86efac;
68
- --integrity-whole-glow: rgba(134, 239, 172, 0.2);
69
- --integrity-partial: #fbbf24;
70
- --integrity-partial-glow: rgba(251, 191, 36, 0.2);
71
- --integrity-broken: #f87171;
72
- --integrity-broken-glow: rgba(248, 113, 113, 0.2);
73
-
74
- --wholeness-whole: #86efac;
75
- --wholeness-partial: #fbbf24;
76
- --wholeness-broken: #f87171;
77
-
78
- --renegotiated-color: #fbbf24;
79
- --renegotiated-bg: rgba(251, 191, 36, 0.06);
80
- --renegotiated-border: rgba(251, 191, 36, 0.18);
81
-
82
- --panel-width: 360px;
83
- --status-bar-height: 48px;
84
- --topbar-height: 0px;
85
- --radius: 6px;
86
- --radius-lg: 10px;
87
- }
88
-
89
- body {
90
- background: var(--bg);
91
- color: var(--text);
92
- font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
93
- font-size: 16px;
94
- line-height: 1.5;
95
- height: 100vh;
96
- display: flex;
97
- flex-direction: column;
98
- overflow: hidden;
99
- -webkit-font-smoothing: antialiased;
100
- -moz-osx-font-smoothing: grayscale;
101
- }
102
-
103
- /* ── Status bar ── */
104
- #status-bar {
105
- height: var(--status-bar-height);
106
- background: var(--surface);
107
- border-bottom: 1px solid var(--border);
108
- display: flex;
109
- align-items: center;
110
- gap: 0;
111
- padding: 0 20px;
112
- flex-shrink: 0;
113
- position: relative;
114
- z-index: 10;
115
- }
116
-
117
- #status-bar .project-name {
118
- font-weight: 600;
119
- font-size: 14px;
120
- color: var(--text-bright);
121
- letter-spacing: -0.01em;
122
- cursor: pointer;
123
- transition: color 0.15s;
124
- }
125
- #status-bar .project-name:hover { color: var(--accent); }
126
-
127
- /* Breadcrumb inline in status bar */
128
- #status-breadcrumb {
129
- display: flex;
130
- align-items: center;
131
- gap: 8px;
132
- margin-left: 0;
133
- font-size: 13px;
134
- }
135
- #status-breadcrumb .bc-sep {
136
- color: var(--text-muted);
137
- font-size: 11px;
138
- }
139
- #status-breadcrumb .bc-link {
140
- color: var(--text-dim);
141
- cursor: pointer;
142
- font-weight: 500;
143
- transition: color 0.15s;
144
- }
145
- #status-breadcrumb .bc-link:hover { color: var(--text-bright); }
146
- #status-breadcrumb .bc-current {
147
- color: var(--text-bright);
148
- font-weight: 600;
149
- }
150
- #status-breadcrumb .bc-title {
151
- color: var(--text-dim);
152
- font-size: 12px;
153
- font-weight: 400;
154
- }
155
-
156
- .stat-group {
157
- display: flex;
158
- align-items: center;
159
- gap: 6px;
160
- color: var(--text-dim);
161
- font-size: 12px;
162
- }
163
-
164
- .stat-group .value {
165
- font-weight: 600;
166
- color: var(--text);
167
- }
168
-
169
- .health-badge {
170
- padding: 2px 10px;
171
- border-radius: 12px;
172
- font-size: 11px;
173
- font-weight: 600;
174
- text-transform: uppercase;
175
- letter-spacing: 0.06em;
176
- }
177
- .health-healthy { background: #0a2018; color: #34d399; border: 1px solid #1a4d34; }
178
- .health-warnings { background: #251400; color: #ffa040; border: 1px solid #5a3000; }
179
- .health-errors { background: #2a0a10; color: #ff4d6d; border: 1px solid #5a1520; }
180
- .health-unknown { background: var(--surface2); color: var(--text-dim); border: 1px solid var(--border); }
181
-
182
- .status-pill {
183
- font-size: 11px;
184
- font-weight: 500;
185
- padding: 2px 10px;
186
- border-radius: 99px;
187
- border: 1px solid var(--border);
188
- color: var(--text-dim);
189
- white-space: nowrap;
190
- }
191
- .status-pill .pill-value {
192
- font-weight: 600;
193
- }
194
- .status-pill.integrity-ok .pill-value { color: var(--integrity-whole); }
195
- .status-pill.integrity-warn .pill-value { color: var(--integrity-partial); }
196
- .status-pill.integrity-bad .pill-value { color: var(--integrity-broken); }
197
-
198
- .spacer { flex: 1; }
199
- /* Status bar uses margin-left:auto on .status-right instead of spacer */
200
-
201
- #last-updated {
202
- color: var(--text-dim);
203
- font-size: 11px;
204
- white-space: nowrap;
205
- }
206
-
207
- #view-toggle {
208
- background: transparent;
209
- border: 1px solid var(--border);
210
- color: var(--text-dim);
211
- width: 28px;
212
- height: 28px;
213
- border-radius: var(--radius);
214
- cursor: pointer;
215
- font-size: 14px;
216
- display: flex;
217
- align-items: center;
218
- justify-content: center;
219
- transition: all 0.15s ease;
220
- padding: 0;
221
- margin-left: 10px;
222
- flex-shrink: 0;
223
- }
224
- #view-toggle:hover { background: var(--surface2); color: var(--text); border-color: var(--border-strong); }
225
- #view-toggle:active { transform: scale(0.97); }
226
-
227
- /* Right side: integrity + next/execute */
228
- .status-right {
229
- display: flex;
230
- align-items: center;
231
- gap: 12px;
232
- margin-left: auto;
233
- flex-shrink: 0;
234
- }
235
-
236
- #execute-main-btn {
237
- background: var(--accent-dim);
238
- border: 1px solid var(--accent-border);
239
- color: var(--accent);
240
- padding: 6px 18px;
241
- border-radius: var(--radius);
242
- cursor: pointer;
243
- font-size: 13px;
244
- font-weight: 600;
245
- transition: all 0.15s ease;
246
- white-space: nowrap;
247
- }
248
- #execute-main-btn:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
249
- #execute-main-btn:active { transform: scale(0.97); }
250
- #execute-main-btn:disabled { opacity: 0.4; cursor: not-allowed; }
251
- #execute-main-btn kbd {
252
- background: rgba(255,255,255,0.08);
253
- border: 1px solid rgba(255,255,255,0.12);
254
- border-radius: 3px;
255
- padding: 1px 5px;
256
- font-size: 10px;
257
- margin-right: 3px;
258
- vertical-align: baseline;
259
- }
260
- #execute-main-btn.btn-next {
261
- background: var(--surface2);
262
- border-color: var(--border-strong);
263
- color: var(--text);
264
- }
265
- #execute-main-btn.btn-next:hover { background: var(--surface3); }
266
- #execute-main-btn.btn-plan {
267
- background: var(--accent-dim);
268
- border-color: var(--accent-border);
269
- color: var(--accent);
270
- }
271
- #execute-main-btn.btn-plan:hover { background: rgba(208, 236, 26, 0.18); border-color: rgba(208, 236, 26, 0.4); }
272
- #execute-main-btn.btn-done {
273
- background: rgba(134, 239, 172, 0.08);
274
- border-color: rgba(134, 239, 172, 0.2);
275
- color: #86efac;
276
- }
277
-
278
- /* ── Main layout ── */
279
- #main {
280
- flex: 1;
281
- overflow: hidden;
282
- display: flex;
283
- flex-direction: column;
284
- }
285
-
286
- /* ── Canvas area — reserve space for fixed sidebar ── */
287
- #canvas-wrap {
288
- width: 100%;
289
- height: 100%;
290
- overflow: auto;
291
- background: var(--bg);
292
- padding-right: var(--panel-width);
293
- padding-bottom: 40px; /* room for activity feed */
294
- }
295
-
296
- #canvas-container {
297
- position: relative;
298
- min-width: 100%;
299
- min-height: 100%;
300
- padding: 40px 40px 80px;
301
- }
302
-
303
- #edges-svg {
304
- position: absolute;
305
- top: 0;
306
- left: 0;
307
- width: 100%;
308
- height: 100%;
309
- pointer-events: none;
310
- overflow: visible;
311
- }
312
-
313
- /* ── Layers ── */
314
- .layer {
315
- display: flex;
316
- flex-wrap: wrap;
317
- gap: 0;
318
- justify-content: center;
319
- align-items: flex-start;
320
- position: relative;
321
- margin-bottom: 0;
322
- }
323
-
324
- .layer-label {
325
- font-size: 10px;
326
- font-weight: 700;
327
- letter-spacing: 0.12em;
328
- text-transform: uppercase;
329
- color: var(--text-dim);
330
- text-align: center;
331
- margin-bottom: 12px;
332
- }
333
-
334
- .layer-section {
335
- margin-bottom: 40px;
336
- }
337
-
338
- /* ── Nodes ── */
339
- .node {
340
- border-radius: 10px;
341
- padding: 12px 16px;
342
- cursor: pointer;
343
- transition: transform 0.12s, box-shadow 0.12s, border-color 0.15s;
344
- position: relative;
345
- min-width: 160px;
346
- max-width: 220px;
347
- user-select: none;
348
- margin: 0 8px 0 8px;
349
- }
350
-
351
- .node:hover {
352
- transform: translateY(-2px);
353
- box-shadow: 0 6px 24px rgba(0,0,0,0.5);
354
- }
355
-
356
- .node.selected {
357
- box-shadow: 0 0 0 2px currentColor, 0 6px 24px rgba(0,0,0,0.5);
358
- }
359
-
360
- /* Declaration nodes */
361
- .node-declaration {
362
- background: var(--decl-bg);
363
- border: 1px solid var(--decl-border);
364
- color: var(--decl-color);
365
- }
366
-
367
- /* Milestone nodes */
368
- .node-milestone {
369
- background: var(--mile-bg);
370
- border: 1px solid var(--mile-border);
371
- color: var(--mile-color);
372
- }
373
-
374
- /* Action nodes */
375
- .node-action {
376
- background: var(--act-bg);
377
- border: 1px solid var(--act-border);
378
- color: var(--act-color);
379
- min-width: 140px;
380
- max-width: 190px;
381
- }
382
-
383
- /* Status overrides — DONE uses dimmed type-specific hues, not grey */
384
- .node-declaration.status-done,
385
- .node-declaration.status-honored,
386
- .node-declaration.status-kept {
387
- background: var(--decl-done-bg);
388
- border-color: var(--decl-done-border);
389
- color: var(--decl-done-color);
390
- opacity: 0.82;
391
- }
392
-
393
- .node-milestone.status-done,
394
- .node-milestone.status-honored,
395
- .node-milestone.status-kept {
396
- background: var(--mile-done-bg);
397
- border-color: var(--mile-done-border);
398
- color: var(--mile-done-color);
399
- opacity: 0.82;
400
- }
401
-
402
- .node-action.status-done,
403
- .node-action.status-honored,
404
- .node-action.status-kept {
405
- background: var(--act-done-bg);
406
- border-color: var(--act-done-border);
407
- color: var(--act-done-color);
408
- opacity: 0.82;
409
- }
410
-
411
- /* Workflow progress states — computed from action data, not MILESTONES.md */
412
- .node.status-planned {
413
- background: var(--planned-bg);
414
- border-color: var(--planned-border);
415
- color: var(--planned-color);
416
- opacity: 0.9;
417
- }
418
- .node.status-executing {
419
- background: var(--executing-bg);
420
- border-color: var(--executing-border);
421
- color: var(--executing-color);
422
- box-shadow: 0 0 0 1px var(--executing-border), 0 0 12px rgba(251,191,36,0.15);
423
- }
424
- .node.status-planned .node-title { color: var(--planned-color); }
425
- .node.status-executing .node-title { color: var(--executing-color); }
426
-
427
- /* Progress bar inside milestone node */
428
- .node-progress {
429
- margin-top: 7px;
430
- height: 3px;
431
- background: rgba(255,255,255,0.08);
432
- border-radius: 2px;
433
- overflow: hidden;
434
- }
435
- .node-progress-fill {
436
- height: 100%;
437
- border-radius: 2px;
438
- transition: width 0.4s ease;
439
- }
440
- .status-executing .node-progress-fill { background: var(--executing-color); }
441
- .status-planned .node-progress-fill { background: var(--planned-color); opacity:0.3; }
442
- .status-done .node-progress-fill,
443
- .status-kept .node-progress-fill,
444
- .status-honored .node-progress-fill { background: var(--act-done-color); }
445
-
446
- .node.status-broken {
447
- background: var(--broken-bg);
448
- border-color: var(--broken-border);
449
- color: var(--broken-color);
450
- }
451
-
452
- .node.status-renegotiated {
453
- background: var(--renegotiated-bg);
454
- border-color: var(--renegotiated-border);
455
- color: var(--renegotiated-color);
456
- }
457
-
458
- /* Wholeness left-border indicator */
459
- .node.wholeness-whole { border-left: 3px solid var(--wholeness-whole); }
460
- .node.wholeness-partial { border-left: 3px solid var(--wholeness-partial); }
461
- .node.wholeness-broken { border-left: 3px solid var(--wholeness-broken); }
462
-
463
- .node-id {
464
- font-size: 10px;
465
- font-weight: 700;
466
- letter-spacing: 0.06em;
467
- opacity: 0.7;
468
- margin-bottom: 4px;
469
- }
470
-
471
- .node-title {
472
- font-size: 12px;
473
- font-weight: 500;
474
- color: var(--text-bright);
475
- line-height: 1.35;
476
- word-break: break-word;
477
- }
478
-
479
- .node-declaration.status-done .node-title,
480
- .node-declaration.status-honored .node-title,
481
- .node-declaration.status-kept .node-title { color: var(--decl-done-color); }
482
-
483
- .node-milestone.status-done .node-title,
484
- .node-milestone.status-honored .node-title,
485
- .node-milestone.status-kept .node-title { color: var(--mile-done-color); }
486
-
487
- .node-action.status-done .node-title,
488
- .node-action.status-honored .node-title,
489
- .node-action.status-kept .node-title { color: var(--act-done-color); }
490
-
491
- .node.status-broken .node-title { color: var(--broken-color); }
492
- .node.status-renegotiated .node-title { color: var(--renegotiated-color); }
493
-
494
- .status-badge {
495
- display: inline-block;
496
- margin-top: 8px;
497
- padding: 2px 8px;
498
- border-radius: 8px;
499
- font-size: 10px;
500
- font-weight: 700;
501
- letter-spacing: 0.05em;
502
- text-transform: uppercase;
503
- background: rgba(255,255,255,0.06);
504
- }
505
-
506
- /* Integrity wholeness dot */
507
- .integrity-dot {
508
- display: inline-block;
509
- width: 7px;
510
- height: 7px;
511
- border-radius: 50%;
512
- margin-left: 6px;
513
- vertical-align: middle;
514
- position: relative;
515
- top: -0.5px;
516
- }
517
- .integrity-dot.integrity-whole {
518
- background: var(--integrity-whole);
519
- box-shadow: 0 0 6px var(--integrity-whole-glow);
520
- }
521
- .integrity-dot.integrity-partial {
522
- background: var(--integrity-partial);
523
- box-shadow: 0 0 6px var(--integrity-partial-glow);
524
- }
525
- .integrity-dot.integrity-broken {
526
- background: var(--integrity-broken);
527
- box-shadow: 0 0 6px var(--integrity-broken-glow);
528
- }
529
-
530
- /* ── Side panel — always visible, fixed right column ── */
531
- #side-panel {
532
- position: fixed;
533
- top: calc(var(--topbar-height) + var(--status-bar-height));
534
- right: 0;
535
- width: var(--panel-width);
536
- height: calc(100vh - var(--topbar-height) - var(--status-bar-height));
537
- background: var(--surface);
538
- border-left: 1px solid var(--border);
539
- display: flex;
540
- flex-direction: column;
541
- overflow: hidden;
542
- z-index: 20;
543
- }
544
-
545
- #panel-header {
546
- padding: 16px 20px 12px;
547
- border-bottom: 1px solid var(--border);
548
- display: flex;
549
- align-items: center;
550
- justify-content: space-between;
551
- flex-shrink: 0;
552
- }
553
-
554
- #panel-title {
555
- font-size: 12px;
556
- font-weight: 700;
557
- letter-spacing: 0.08em;
558
- text-transform: uppercase;
559
- color: var(--text-dim);
560
- }
561
-
562
- #panel-close {
563
- background: none;
564
- border: none;
565
- color: var(--text-dim);
566
- cursor: pointer;
567
- font-size: 18px;
568
- line-height: 1;
569
- padding: 0 4px;
570
- transition: color 0.12s;
571
- }
572
- #panel-close:hover { color: var(--text-bright); }
573
-
574
- #panel-body {
575
- flex: 1;
576
- overflow-y: auto;
577
- padding: 20px;
578
- }
579
-
580
- #panel-body::-webkit-scrollbar { width: 4px; }
581
- #panel-body::-webkit-scrollbar-track { background: transparent; }
582
- #panel-body::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
583
-
584
- .detail-id {
585
- font-size: 11px;
586
- font-weight: 700;
587
- letter-spacing: 0.08em;
588
- opacity: 0.6;
589
- margin-bottom: 6px;
590
- }
591
-
592
- .detail-title {
593
- font-size: 16px;
594
- font-weight: 600;
595
- color: var(--text-bright);
596
- line-height: 1.4;
597
- margin-bottom: 16px;
598
- }
599
-
600
- .detail-badge {
601
- display: inline-block;
602
- padding: 3px 12px;
603
- border-radius: 10px;
604
- font-size: 11px;
605
- font-weight: 700;
606
- letter-spacing: 0.06em;
607
- text-transform: uppercase;
608
- margin-bottom: 20px;
609
- }
610
-
611
- /* Wholeness badge in detail panel */
612
- .wholeness-badge {
613
- display: inline-block;
614
- padding: 2px 10px;
615
- border-radius: 10px;
616
- font-size: 11px;
617
- font-weight: 600;
618
- letter-spacing: 0.04em;
619
- text-transform: uppercase;
620
- }
621
- .wholeness-badge.wb-whole { background: #0a2018; color: var(--wholeness-whole); border: 1px solid #1a4d34; }
622
- .wholeness-badge.wb-partial { background: #1a1200; color: var(--wholeness-partial); border: 1px solid #3d2c00; }
623
- .wholeness-badge.wb-broken { background: #2a0a10; color: var(--wholeness-broken); border: 1px solid #5a1520; }
624
-
625
- .detail-section {
626
- margin-bottom: 20px;
627
- }
628
-
629
- .detail-label {
630
- font-size: 10px;
631
- font-weight: 700;
632
- letter-spacing: 0.1em;
633
- text-transform: uppercase;
634
- color: var(--text-dim);
635
- margin-bottom: 6px;
636
- }
637
-
638
- .detail-value {
639
- color: var(--text);
640
- font-size: 13px;
641
- line-height: 1.55;
642
- }
643
-
644
- .detail-tag-list {
645
- display: flex;
646
- flex-wrap: wrap;
647
- gap: 6px;
648
- }
649
-
650
- .detail-tag {
651
- padding: 3px 10px;
652
- border-radius: 6px;
653
- font-size: 11px;
654
- font-weight: 500;
655
- background: var(--surface2);
656
- border: 1px solid var(--border);
657
- color: var(--text-dim);
658
- cursor: pointer;
659
- transition: border-color 0.12s, color 0.12s;
660
- }
661
- .detail-tag:hover { border-color: var(--text-dim); color: var(--text); }
662
-
663
- /* ── Loading & error overlays ── */
664
- #overlay {
665
- position: fixed;
666
- inset: 0;
667
- background: rgba(14, 14, 18, 0.92);
668
- display: flex;
669
- flex-direction: column;
670
- align-items: center;
671
- justify-content: center;
672
- gap: 16px;
673
- z-index: 100;
674
- }
675
- #overlay.hidden { display: none; }
676
-
677
- .spinner {
678
- width: 36px;
679
- height: 36px;
680
- border: 3px solid var(--border);
681
- border-top-color: var(--decl-color);
682
- border-radius: 50%;
683
- animation: spin 0.7s linear infinite;
684
- }
685
-
686
- @keyframes spin { to { transform: rotate(360deg); } }
687
-
688
- #overlay-message {
689
- color: var(--text-dim);
690
- font-size: 14px;
691
- }
692
-
693
- #overlay-error {
694
- color: var(--broken-color);
695
- font-size: 13px;
696
- text-align: center;
697
- max-width: 400px;
698
- }
699
-
700
- #overlay-retry {
701
- display: none;
702
- background: var(--surface2);
703
- border: 1px solid var(--border);
704
- color: var(--text);
705
- padding: 8px 20px;
706
- border-radius: 8px;
707
- cursor: pointer;
708
- font-size: 13px;
709
- margin-top: 4px;
710
- }
711
- #overlay-retry:hover { border-color: var(--text-dim); }
712
-
713
- #edges-svg { transition: opacity 0.2s ease; }
714
-
715
- /* SVG edges */
716
- .edge {
717
- fill: none;
718
- stroke: var(--border);
719
- stroke-width: 1.5;
720
- opacity: 0.6;
721
- transition: opacity 0.3s ease;
722
- }
723
- .edge.highlight {
724
- stroke: var(--text-dim);
725
- opacity: 1;
726
- }
727
- .edge.focus-dim {
728
- opacity: 0.04;
729
- }
730
- #edges-svg {
731
- transition: opacity 0.18s ease;
732
- }
733
-
734
- /* Scrollbar */
735
- #canvas-wrap::-webkit-scrollbar { width: 6px; height: 6px; }
736
- #canvas-wrap::-webkit-scrollbar-track { background: transparent; }
737
- #canvas-wrap::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
738
-
739
- /* ── Focus mode — flex-basis collapse for simultaneous shrink + slide ── */
740
-
741
- /* Nodes being animated out: flex-basis + margin collapse simultaneously with slide */
742
- .node.focus-exiting {
743
- overflow: hidden;
744
- pointer-events: none;
745
- /* transition and initial flex-basis set via inline styles in JS */
746
- }
747
-
748
- /* Nodes in focus: stay put, get a glow */
749
- .node.focus-active {
750
- box-shadow: 0 0 0 2px currentColor, 0 8px 32px rgba(0,0,0,0.6) !important;
751
- }
752
-
753
- /* ESC hint */
754
- #focus-hint {
755
- position: fixed;
756
- bottom: 24px;
757
- left: calc(50% - var(--panel-width) / 2);
758
- transform: translateX(-50%);
759
- background: var(--surface2);
760
- border: 1px solid var(--border);
761
- color: var(--text-dim);
762
- padding: 7px 18px;
763
- border-radius: 20px;
764
- font-size: 12px;
765
- pointer-events: none;
766
- opacity: 0;
767
- transition: opacity 0.25s ease;
768
- z-index: 50;
769
- }
770
- #focus-hint.visible { opacity: 1; }
771
- /* ── Activity feed ── */
772
- /* ── Activity sidebar (right panel in drill-body) ── */
773
- #activity-feed {
774
- width: 280px;
775
- flex-shrink: 0;
776
- background: var(--surface);
777
- border-left: 1px solid var(--border);
778
- display: flex;
779
- flex-direction: column;
780
- overflow: hidden;
781
- }
782
-
783
- #activity-toggle {
784
- flex-shrink: 0;
785
- padding: 12px 16px 8px;
786
- font-size: 10px;
787
- font-weight: 700;
788
- letter-spacing: 0.06em;
789
- text-transform: uppercase;
790
- color: var(--text-dim);
791
- display: flex;
792
- align-items: center;
793
- gap: 6px;
794
- }
795
- #activity-pulse {
796
- width: 6px; height: 6px;
797
- border-radius: 50%;
798
- background: var(--act-color);
799
- opacity: 0;
800
- transition: opacity 0.3s;
801
- }
802
- #activity-pulse.live { opacity: 1; animation: pulse 1.5s ease-in-out infinite; }
803
- @keyframes pulse {
804
- 0%, 100% { opacity: 1; }
805
- 50% { opacity: 0.3; }
806
- }
807
-
808
- #activity-tabs {
809
- display: flex;
810
- gap: 4px;
811
- align-items: center;
812
- flex: 1;
813
- }
814
- .activity-tab {
815
- font-size: 10px;
816
- font-weight: 700;
817
- letter-spacing: 0.06em;
818
- text-transform: uppercase;
819
- color: var(--text-muted);
820
- cursor: pointer;
821
- padding: 2px 6px;
822
- border-radius: 3px;
823
- transition: color 0.15s, background 0.15s;
824
- }
825
- .activity-tab:hover { color: var(--text-dim); }
826
- .activity-tab.active { color: var(--text-bright); background: var(--surface3); }
827
-
828
- .activity-tab-content { display: none; }
829
- .activity-tab-content.active { display: flex; flex-direction: column; flex: 1; overflow: hidden; }
830
-
831
- #activity-cards.active { overflow-y: auto; padding: 8px; gap: 8px; }
832
- #activity-cards-active { display: flex; flex-direction: column; gap: 6px; }
833
- #activity-cards-recent { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); }
834
- #activity-cards-recent:empty { display: none; }
835
- #activity-cards::-webkit-scrollbar { width: 4px; }
836
- #activity-cards::-webkit-scrollbar-track { background: transparent; }
837
- #activity-cards::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
838
-
839
- #activity-list {
840
- flex: 1;
841
- overflow-y: auto;
842
- overflow-x: hidden;
843
- padding: 8px 0;
844
- font-size: 12px;
845
- display: flex;
846
- flex-direction: column;
847
- gap: 0;
848
- }
849
- #activity-list::-webkit-scrollbar { width: 4px; }
850
- #activity-list::-webkit-scrollbar-track { background: transparent; }
851
- #activity-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
852
-
853
- .activity-event {
854
- padding: 8px 16px;
855
- color: var(--text-dim);
856
- display: flex;
857
- flex-direction: column;
858
- gap: 3px;
859
- flex-shrink: 0;
860
- border-bottom: 1px solid rgba(255,255,255,0.03);
861
- transition: background 0.15s;
862
- }
863
- .activity-event:hover { background: var(--surface2); cursor: default; }
864
- .activity-event.clickable { cursor: pointer; }
865
- .activity-event.clickable:hover { background: var(--surface3); }
866
- .activity-event:last-child { border-bottom: none; }
867
- .activity-event.is-new {
868
- animation: activity-flash 1.5s ease-out;
869
- }
870
- @keyframes activity-flash {
871
- 0% { background: rgba(134, 239, 172, 0.08); }
872
- 100% { background: transparent; }
873
- }
874
-
875
- .ae-top {
876
- display: flex;
877
- align-items: center;
878
- gap: 6px;
879
- }
880
- .ae-time { opacity: 0.5; font-size: 11px; flex-shrink: 0; font-family: 'SF Mono', 'Fira Code', monospace; }
881
- .ae-icon { flex-shrink: 0; font-size: 12px; }
882
- .ae-label {
883
- font-size: 12px;
884
- font-weight: 600;
885
- overflow: hidden;
886
- text-overflow: ellipsis;
887
- white-space: nowrap;
888
- }
889
- .ae-label.agent-start { color: var(--act-color); }
890
- .ae-label.agent-done { color: var(--mile-color); }
891
- .ae-label.bash { color: var(--text); }
892
- .ae-label.write { color: var(--decl-color); }
893
- .ae-label.review { color: var(--accent); }
894
- .ae-desc {
895
- font-size: 12px;
896
- color: var(--text-dim);
897
- line-height: 1.4;
898
- overflow: hidden;
899
- text-overflow: ellipsis;
900
- white-space: nowrap;
901
- padding-left: 18px;
902
- }
903
-
904
- /* ── Execute/Stop button ── */
905
- .exec-btn {
906
- background: var(--act-bg);
907
- border: 1px solid var(--act-border);
908
- color: var(--act-color);
909
- padding: 6px 16px;
910
- border-radius: 6px;
911
- font-size: 12px;
912
- font-weight: 600;
913
- cursor: pointer;
914
- display: inline-flex;
915
- align-items: center;
916
- gap: 6px;
917
- transition: background 0.15s, border-color 0.15s;
918
- }
919
- .exec-btn:hover { background: #0d2818; border-color: #2a6a48; }
920
- .exec-btn:disabled { opacity: 0.5; cursor: not-allowed; }
921
-
922
- .exec-btn.stop {
923
- background: var(--broken-bg);
924
- border-color: var(--broken-border);
925
- color: var(--broken-color);
926
- }
927
- .exec-btn.stop:hover { background: #3a0e18; border-color: #7a2035; }
928
-
929
- /* ── Output log panel ── */
930
- .output-log {
931
- background: #0a0a0e;
932
- border: 1px solid var(--border);
933
- border-radius: 6px;
934
- padding: 10px 12px;
935
- margin-top: 12px;
936
- max-height: 300px;
937
- overflow-y: auto;
938
- font-family: monospace;
939
- font-size: 11px;
940
- line-height: 1.5;
941
- color: var(--text-dim);
942
- white-space: pre-wrap;
943
- word-break: break-all;
944
- }
945
- .output-log::-webkit-scrollbar { width: 4px; }
946
- .output-log::-webkit-scrollbar-track { background: transparent; }
947
- .output-log::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
948
-
949
- .output-log .exit-code {
950
- display: block;
951
- margin-top: 8px;
952
- padding-top: 8px;
953
- border-top: 1px solid var(--border);
954
- font-weight: 700;
955
- }
956
- .output-log .exit-code.success { color: var(--act-color); }
957
- .output-log .exit-code.failure { color: var(--broken-color); }
958
-
959
- /* ── Running node pulse animation ── */
960
- .node.is-running {
961
- animation: running-pulse 1.8s ease-in-out infinite;
962
- box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2);
963
- }
964
- @keyframes running-pulse {
965
- 0%, 100% { box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2); }
966
- 50% { box-shadow: 0 0 0 3px var(--executing-color), 0 0 24px rgba(251,191,36,0.35); }
967
- }
968
-
969
- /* ── Drill browser — 3-panel layout ── */
970
- #drill-browser {
971
- display: none;
972
- width: 100%;
973
- flex: 1;
974
- min-height: 0;
975
- flex-direction: column;
976
- }
977
- #drill-browser.active {
978
- display: flex;
979
- }
980
-
981
- #drill-breadcrumb {
982
- display: none; /* breadcrumb now lives in status bar */
983
- }
984
-
985
- /* 3-panel body: left detail + center list + right activity */
986
- #drill-body {
987
- flex: 1;
988
- display: flex;
989
- overflow: hidden;
990
- }
991
-
992
- /* Left detail panel — shown at level 2+ */
993
- #drill-detail {
994
- width: 280px;
995
- flex-shrink: 0;
996
- overflow-y: auto;
997
- background: var(--surface);
998
- border-right: 1px solid var(--border);
999
- padding: 20px;
1000
- display: none;
1001
- flex-direction: column;
1002
- gap: 16px;
1003
- }
1004
- #drill-detail.visible { display: flex; }
1005
- #drill-detail[data-node-type="declaration"] {
1006
- background: linear-gradient(180deg, rgba(134, 239, 172, 0.04) 0%, var(--surface) 40%);
1007
- border-right-color: rgba(134, 239, 172, 0.12);
1008
- }
1009
- #drill-detail[data-node-type="declaration"] .detail-id { color: var(--act-color); }
1010
- #drill-detail[data-node-type="milestone"] {
1011
- background: linear-gradient(180deg, rgba(165, 149, 255, 0.04) 0%, var(--surface) 40%);
1012
- border-right-color: rgba(165, 149, 255, 0.12);
1013
- }
1014
- #drill-detail[data-node-type="milestone"] .detail-id { color: var(--mile-color); }
1015
- #drill-detail[data-node-type="action"] {
1016
- background: linear-gradient(180deg, rgba(147, 197, 253, 0.04) 0%, var(--surface) 40%);
1017
- border-right-color: rgba(147, 197, 253, 0.12);
1018
- }
1019
- #drill-detail[data-node-type="action"] .detail-id { color: var(--decl-color); }
1020
- #drill-detail::-webkit-scrollbar { width: 4px; }
1021
- #drill-detail::-webkit-scrollbar-track { background: transparent; }
1022
- #drill-detail::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
1023
-
1024
- .detail-id {
1025
- font-size: 11px;
1026
- font-weight: 700;
1027
- letter-spacing: 0.04em;
1028
- text-transform: uppercase;
1029
- color: var(--text-dim);
1030
- }
1031
- .detail-title {
1032
- font-size: 18px;
1033
- font-weight: 700;
1034
- color: var(--text-bright);
1035
- line-height: 1.35;
1036
- letter-spacing: -0.01em;
1037
- }
1038
- .detail-desc {
1039
- font-size: 13px;
1040
- color: var(--text);
1041
- line-height: 1.6;
1042
- }
1043
- .detail-desc:empty { display: none; }
1044
- .detail-badges {
1045
- display: flex;
1046
- align-items: center;
1047
- gap: 6px;
1048
- flex-wrap: wrap;
1049
- }
1050
- .detail-section-label {
1051
- font-size: 11px;
1052
- font-weight: 600;
1053
- letter-spacing: 0.04em;
1054
- text-transform: uppercase;
1055
- color: var(--text-dim);
1056
- margin-top: 4px;
1057
- }
1058
- .detail-meta {
1059
- font-size: 12px;
1060
- color: var(--text);
1061
- line-height: 1.5;
1062
- }
1063
- .detail-actions {
1064
- display: flex;
1065
- gap: 8px;
1066
- margin-top: auto;
1067
- padding-top: 12px;
1068
- border-top: 1px solid var(--border);
1069
- }
1070
-
1071
- /* Center list panel */
1072
- #drill-center {
1073
- flex: 1;
1074
- display: flex;
1075
- flex-direction: column;
1076
- overflow: hidden;
1077
- min-width: 0;
1078
- }
1079
-
1080
- #drill-context {
1081
- padding: 12px 24px;
1082
- font-size: 13px;
1083
- color: var(--text-dim);
1084
- line-height: 1.6;
1085
- flex-shrink: 0;
1086
- background: var(--bg);
1087
- }
1088
- #drill-context:empty { display: none; padding: 0; }
1089
-
1090
- #drill-list {
1091
- flex: 1;
1092
- overflow-y: auto;
1093
- padding: 16px 24px 32px;
1094
- background: var(--bg);
1095
- }
1096
- #drill-list::-webkit-scrollbar { width: 5px; }
1097
- #drill-list::-webkit-scrollbar-track { background: transparent; }
1098
- #drill-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
1099
-
1100
- /* ── Lifecycle stage sections ── */
1101
- .lifecycle-stages {
1102
- display: flex;
1103
- flex-direction: column;
1104
- gap: 24px;
1105
- }
1106
- .lifecycle-section {
1107
- display: flex;
1108
- flex-direction: column;
1109
- gap: 10px;
1110
- }
1111
- .lifecycle-section.collapsed .lifecycle-cards { display: none; }
1112
- .lifecycle-header {
1113
- display: flex;
1114
- align-items: center;
1115
- gap: 8px;
1116
- padding: 6px 0;
1117
- user-select: none;
1118
- }
1119
- .lifecycle-icon {
1120
- font-size: 14px;
1121
- width: 20px;
1122
- text-align: center;
1123
- }
1124
- .lifecycle-label {
1125
- font-size: 13px;
1126
- font-weight: 600;
1127
- color: var(--text-dim);
1128
- text-transform: uppercase;
1129
- letter-spacing: 0.05em;
1130
- }
1131
- .lifecycle-count {
1132
- font-size: 11px;
1133
- font-weight: 700;
1134
- padding: 1px 7px;
1135
- border-radius: 10px;
1136
- }
1137
- .lifecycle-toggle {
1138
- font-size: 10px;
1139
- color: var(--text-muted);
1140
- margin-left: 4px;
1141
- }
1142
- .lifecycle-header-spacer { flex: 1; }
1143
- .lifecycle-stage-btn {
1144
- font-size: 12px;
1145
- font-weight: 600;
1146
- padding: 4px 14px;
1147
- border-radius: 14px;
1148
- border: 1px solid var(--border-strong);
1149
- background: var(--surface2);
1150
- color: var(--text);
1151
- cursor: pointer;
1152
- font-family: inherit;
1153
- transition: all 0.15s ease;
1154
- }
1155
- .lifecycle-stage-btn:hover {
1156
- background: var(--surface3);
1157
- border-color: var(--accent-border);
1158
- color: var(--text-bright);
1159
- }
1160
- .lifecycle-stage-btn + .lifecycle-stage-btn {
1161
- margin-left: 4px;
1162
- }
1163
-
1164
- /* ── Card derivation progress ── */
1165
- .drill-card-deriving {
1166
- border-color: var(--executing-border) !important;
1167
- background: var(--executing-bg) !important;
1168
- }
1169
- .derive-card-indicator {
1170
- display: flex;
1171
- align-items: center;
1172
- gap: 8px;
1173
- padding: 8px 12px;
1174
- font-size: 12px;
1175
- color: var(--executing-color);
1176
- font-weight: 600;
1177
- }
1178
- .derive-spinner {
1179
- display: inline-block;
1180
- width: 14px;
1181
- height: 14px;
1182
- border: 2px solid var(--executing-border);
1183
- border-top-color: var(--executing-color);
1184
- border-radius: 50%;
1185
- animation: derive-spin 0.8s linear infinite;
1186
- }
1187
- @keyframes derive-spin {
1188
- to { transform: rotate(360deg); }
1189
- }
1190
- #version-label {
1191
- position: fixed;
1192
- bottom: 6px;
1193
- left: 8px;
1194
- font-size: 10px;
1195
- color: #555;
1196
- pointer-events: none;
1197
- z-index: 1;
1198
- }
1199
- .derive-card-status {
1200
- display: inline-flex;
1201
- align-items: center;
1202
- gap: 4px;
1203
- font-size: 11px;
1204
- color: var(--executing-color);
1205
- font-weight: 600;
1206
- margin-left: 4px;
1207
- }
1208
- .derive-card-status .derive-spinner {
1209
- width: 10px;
1210
- height: 10px;
1211
- border-width: 1.5px;
1212
- }
1213
-
1214
- /* ── Filter chips ── */
1215
- .lifecycle-filter-chips {
1216
- display: flex;
1217
- gap: 6px;
1218
- flex-wrap: wrap;
1219
- }
1220
- .lifecycle-chip {
1221
- font-size: 12px;
1222
- padding: 4px 12px;
1223
- border-radius: 14px;
1224
- border: 1px solid var(--border);
1225
- background: transparent;
1226
- color: var(--text-dim);
1227
- cursor: pointer;
1228
- transition: all 0.15s ease;
1229
- font-family: inherit;
1230
- }
1231
- .lifecycle-chip:hover {
1232
- border-color: var(--border-strong);
1233
- color: var(--text);
1234
- }
1235
- .lifecycle-chip.active {
1236
- background: var(--chip-color, var(--accent));
1237
- border-color: var(--chip-color, var(--accent));
1238
- color: var(--bg);
1239
- font-weight: 600;
1240
- }
1241
- .chip-count {
1242
- font-weight: 700;
1243
- margin-left: 2px;
1244
- }
1245
-
1246
- /* ── Type badge ── */
1247
- .lifecycle-type-badge {
1248
- font-size: 10px;
1249
- font-weight: 700;
1250
- padding: 1px 6px;
1251
- border-radius: 4px;
1252
- text-transform: uppercase;
1253
- letter-spacing: 0.04em;
1254
- }
1255
- .lifecycle-type-badge.type-declaration {
1256
- background: rgba(134, 239, 172, 0.12);
1257
- color: #86efac;
1258
- }
1259
- .lifecycle-type-badge.type-milestone {
1260
- background: rgba(165, 149, 255, 0.12);
1261
- color: #a595ff;
1262
- }
1263
- .lifecycle-type-badge.type-action {
1264
- background: rgba(147, 197, 253, 0.12);
1265
- color: #93c5fd;
1266
- }
1267
-
1268
- .lifecycle-cards {
1269
- max-width: none;
1270
- margin: 0;
1271
- }
1272
-
1273
- /* ── Empty state / Onboarding ── */
1274
- .onboarding-empty {
1275
- max-width: 560px;
1276
- margin: 60px auto 0;
1277
- text-align: center;
1278
- display: flex;
1279
- flex-direction: column;
1280
- align-items: center;
1281
- gap: 16px;
1282
- }
1283
- .onboarding-project {
1284
- font-size: 28px;
1285
- font-weight: 700;
1286
- color: var(--text-bright);
1287
- letter-spacing: -0.02em;
1288
- }
1289
- .onboarding-heading {
1290
- font-size: 18px;
1291
- font-weight: 600;
1292
- color: var(--accent);
1293
- }
1294
- .onboarding-desc {
1295
- font-size: 14px;
1296
- color: var(--text-dim);
1297
- line-height: 1.6;
1298
- max-width: 380px;
1299
- }
1300
- .onboarding-form {
1301
- width: 100%;
1302
- display: flex;
1303
- flex-direction: column;
1304
- gap: 10px;
1305
- margin-top: 8px;
1306
- }
1307
- .onboarding-input, .onboarding-textarea {
1308
- width: 100%;
1309
- padding: 10px 14px;
1310
- font-size: 14px;
1311
- font-family: inherit;
1312
- background: var(--surface);
1313
- border: 1px solid var(--border);
1314
- border-radius: var(--radius);
1315
- color: var(--text);
1316
- outline: none;
1317
- transition: border-color 0.15s ease;
1318
- }
1319
- .onboarding-input:focus, .onboarding-textarea:focus {
1320
- border-color: var(--accent-border);
1321
- }
1322
- .onboarding-textarea { resize: vertical; min-height: 240px; }
1323
- .onboarding-btn {
1324
- padding: 10px 24px;
1325
- font-size: 14px;
1326
- font-weight: 600;
1327
- font-family: inherit;
1328
- background: var(--accent);
1329
- color: var(--bg);
1330
- border: none;
1331
- border-radius: var(--radius);
1332
- cursor: pointer;
1333
- transition: opacity 0.15s ease;
1334
- }
1335
- .onboarding-btn:hover { opacity: 0.9; }
1336
- .onboarding-btn:disabled { opacity: 0.5; cursor: default; }
1337
- .onboarding-error {
1338
- font-size: 13px;
1339
- color: var(--broken-color);
1340
- min-height: 18px;
1341
- }
1342
-
1343
- /* ── Onboarding flow (vision → questions → proposals) ── */
1344
- .onboard-container {
1345
- width: 100%;
1346
- padding: 16px 0;
1347
- }
1348
- .onboard-stream {
1349
- font-family: 'SF Mono', 'Fira Code', monospace;
1350
- font-size: 11px;
1351
- line-height: 1.5;
1352
- color: var(--text-muted);
1353
- max-height: 160px;
1354
- overflow-y: auto;
1355
- white-space: pre-wrap;
1356
- word-break: break-word;
1357
- margin: 0 0 12px 0;
1358
- padding: 10px 12px;
1359
- background: var(--surface);
1360
- border-radius: var(--radius);
1361
- border: 1px solid var(--border);
1362
- }
1363
- .onboard-stream.streaming {
1364
- border-color: var(--accent-border);
1365
- }
1366
- .onboard-phase-label {
1367
- font-size: 13px;
1368
- font-weight: 600;
1369
- color: var(--accent);
1370
- text-transform: uppercase;
1371
- letter-spacing: 0.05em;
1372
- margin-bottom: 12px;
1373
- }
1374
- .onboard-questions {
1375
- display: flex;
1376
- flex-direction: column;
1377
- gap: 10px;
1378
- }
1379
- .onboard-question {
1380
- background: var(--surface);
1381
- border: 1px solid transparent;
1382
- border-radius: var(--radius-lg);
1383
- padding: 18px 20px;
1384
- display: flex;
1385
- flex-direction: column;
1386
- gap: 10px;
1387
- transition: border-color 0.15s ease;
1388
- }
1389
- .onboard-question:focus-within {
1390
- border-color: var(--accent-border);
1391
- }
1392
- .onboard-question .oq-number {
1393
- font-size: 11px;
1394
- font-weight: 700;
1395
- color: var(--accent);
1396
- letter-spacing: 0.04em;
1397
- }
1398
- .onboard-question label {
1399
- font-size: 15px;
1400
- font-weight: 600;
1401
- color: var(--text-bright);
1402
- line-height: 1.4;
1403
- }
1404
- .onboard-question .oq-context {
1405
- font-size: 13px;
1406
- color: var(--text-dim);
1407
- line-height: 1.5;
1408
- }
1409
- .onboard-question .oq-options {
1410
- display: flex;
1411
- flex-wrap: wrap;
1412
- gap: 8px;
1413
- }
1414
- .onboard-question .oq-option {
1415
- padding: 6px 14px;
1416
- font-size: 13px;
1417
- background: var(--surface2);
1418
- border: 1px solid var(--border);
1419
- border-radius: 14px;
1420
- color: var(--text);
1421
- cursor: pointer;
1422
- transition: all 0.15s;
1423
- }
1424
- .onboard-question .oq-option:hover { border-color: var(--accent); color: var(--accent); }
1425
- .onboard-question .oq-option.selected { background: var(--accent); color: var(--bg); border-color: var(--accent); }
1426
- .onboard-question textarea {
1427
- width: 100%;
1428
- padding: 10px 14px;
1429
- font-size: 14px;
1430
- font-family: inherit;
1431
- background: var(--surface2);
1432
- border: 1px solid var(--border);
1433
- border-radius: var(--radius);
1434
- color: var(--text);
1435
- outline: none;
1436
- resize: vertical;
1437
- min-height: 48px;
1438
- line-height: 1.5;
1439
- }
1440
- .onboard-question textarea::placeholder { color: var(--text-dim); }
1441
- .onboard-question textarea:focus { border-color: var(--accent-border); background: var(--surface); }
1442
- .onboard-actions {
1443
- display: flex;
1444
- gap: 10px;
1445
- margin-top: 16px;
1446
- padding-top: 8px;
1447
- }
1448
- .onboard-actions button {
1449
- padding: 10px 24px;
1450
- font-size: 14px;
1451
- font-weight: 600;
1452
- font-family: inherit;
1453
- border-radius: var(--radius-lg);
1454
- cursor: pointer;
1455
- transition: all 0.15s;
1456
- }
1457
- .onboard-btn-primary {
1458
- background: var(--accent);
1459
- color: var(--bg);
1460
- border: none;
1461
- }
1462
- .onboard-btn-primary:hover { opacity: 0.9; }
1463
- .onboard-btn-secondary {
1464
- background: transparent;
1465
- color: var(--text-dim);
1466
- border: 1px solid var(--border);
1467
- }
1468
- .onboard-btn-secondary:hover { border-color: var(--text-dim); color: var(--text); }
1469
- .onboard-proposal {
1470
- background: var(--surface);
1471
- border: 1px solid transparent;
1472
- border-radius: var(--radius-lg);
1473
- padding: 18px 20px;
1474
- margin-bottom: 10px;
1475
- transition: all 0.2s;
1476
- }
1477
- .onboard-proposal:hover {
1478
- background: var(--surface2);
1479
- }
1480
- .onboard-proposal.current {
1481
- border-color: var(--accent);
1482
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1483
- }
1484
- .onboard-proposal.approved {
1485
- border-left: 3px solid var(--done-color);
1486
- opacity: 0.65;
1487
- }
1488
- .onboard-proposal .op-header {
1489
- display: flex;
1490
- align-items: center;
1491
- gap: 8px;
1492
- margin-bottom: 8px;
1493
- }
1494
- .onboard-proposal .op-check {
1495
- font-size: 18px;
1496
- color: var(--done-color);
1497
- }
1498
- .onboard-proposal .op-index {
1499
- font-size: 12px;
1500
- font-weight: 700;
1501
- color: var(--text-dim);
1502
- min-width: 20px;
1503
- }
1504
- .onboard-proposal .op-id {
1505
- font-size: 12px;
1506
- font-weight: 600;
1507
- color: var(--accent);
1508
- }
1509
- .onboard-title {
1510
- width: 100%;
1511
- padding: 8px 14px;
1512
- font-size: 15px;
1513
- font-weight: 600;
1514
- font-family: inherit;
1515
- background: var(--surface2);
1516
- border: 1px solid var(--border);
1517
- border-radius: var(--radius);
1518
- color: var(--text-bright);
1519
- outline: none;
1520
- }
1521
- .onboard-title:focus { border-color: var(--accent-border); background: var(--surface); }
1522
- .onboard-statement {
1523
- width: 100%;
1524
- padding: 8px 14px;
1525
- font-size: 14px;
1526
- font-family: inherit;
1527
- background: var(--surface2);
1528
- border: 1px solid var(--border);
1529
- border-radius: var(--radius);
1530
- color: var(--text);
1531
- outline: none;
1532
- resize: vertical;
1533
- min-height: 44px;
1534
- margin-top: 8px;
1535
- line-height: 1.5;
1536
- }
1537
- .onboard-statement:focus { border-color: var(--accent-border); background: var(--surface); }
1538
- .onboard-reason {
1539
- font-size: 13px;
1540
- color: var(--text-dim);
1541
- margin-top: 8px;
1542
- font-style: italic;
1543
- line-height: 1.4;
1544
- }
1545
- .onboard-progress {
1546
- font-size: 14px;
1547
- color: var(--text-dim);
1548
- margin-bottom: 12px;
1549
- font-weight: 600;
1550
- }
1551
-
1552
- /* ── Reconnecting banner ── */
1553
- #reconnect-banner {
1554
- position: fixed;
1555
- top: 0;
1556
- left: 50%;
1557
- transform: translateX(-50%) translateY(-100%);
1558
- background: var(--executing-color);
1559
- color: var(--bg);
1560
- padding: 6px 20px;
1561
- font-size: 13px;
1562
- font-weight: 600;
1563
- border-radius: 0 0 var(--radius) var(--radius);
1564
- z-index: 9999;
1565
- transition: transform 0.3s ease;
1566
- }
1567
- #reconnect-banner.visible {
1568
- transform: translateX(-50%) translateY(0);
1569
- }
1570
-
1571
- /* ── Lifecycle card transitions (disabled — instant render) ── */
1572
-
1573
- /* ── Loading skeleton ── */
1574
- .skeleton-card {
1575
- background: var(--surface);
1576
- border-radius: var(--radius-lg);
1577
- padding: 18px 20px;
1578
- animation: skeletonPulse 1.5s ease-in-out infinite;
1579
- }
1580
- .skeleton-line {
1581
- height: 12px;
1582
- background: var(--surface3);
1583
- border-radius: 4px;
1584
- margin-bottom: 8px;
1585
- }
1586
- .skeleton-line.short { width: 40%; }
1587
- .skeleton-line.medium { width: 70%; }
1588
- .skeleton-line.long { width: 90%; }
1589
- @keyframes skeletonPulse {
1590
- 0%, 100% { opacity: 0.6; }
1591
- 50% { opacity: 1; }
1592
- }
1593
-
1594
- /* ── Lifecycle progress bar ── */
1595
- .lifecycle-progress {
1596
- display: flex;
1597
- gap: 2px;
1598
- height: 4px;
1599
- border-radius: 2px;
1600
- overflow: hidden;
1601
- margin-top: 4px;
1602
- }
1603
- .lifecycle-progress-segment {
1604
- height: 100%;
1605
- transition: width 0.3s ease;
1606
- }
1607
-
1608
- .drill-cards {
1609
- max-width: 640px;
1610
- margin: 0 auto;
1611
- display: flex;
1612
- flex-direction: column;
1613
- gap: 10px;
1614
- }
1615
-
1616
- /* ── Card item ── */
1617
- .drill-card {
1618
- background: var(--surface);
1619
- border: 1px solid transparent;
1620
- border-radius: var(--radius-lg);
1621
- padding: 18px 20px;
1622
- cursor: pointer;
1623
- transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease;
1624
- display: flex;
1625
- flex-direction: column;
1626
- gap: 10px;
1627
- }
1628
- .drill-card:hover {
1629
- background: var(--surface2);
1630
- border-color: var(--border-strong);
1631
- box-shadow: 0 2px 12px rgba(0,0,0,0.15);
1632
- }
1633
- .drill-card.needs-review {
1634
- /* No border — blends into background until focused */
1635
- }
1636
- .drill-card.focused {
1637
- background: var(--surface2);
1638
- border-color: var(--card-tint-border, var(--border-strong));
1639
- box-shadow: inset 2px 0 0 var(--card-tint, var(--accent));
1640
- }
1641
-
1642
- /* ── Node-type tint colors on cards ── */
1643
- .drill-cards[data-node-type="declaration"] .drill-card {
1644
- --card-tint: #86efac;
1645
- --card-tint-border: rgba(134, 239, 172, 0.25);
1646
- --card-tint-glow: rgba(134, 239, 172, 0.08);
1647
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1648
- }
1649
- .drill-cards[data-node-type="declaration"] .drill-card .drill-card-id {
1650
- color: var(--act-color);
1651
- }
1652
- .drill-cards[data-node-type="milestone"] .drill-card {
1653
- --card-tint: #a595ff;
1654
- --card-tint-border: rgba(165, 149, 255, 0.25);
1655
- --card-tint-glow: rgba(165, 149, 255, 0.08);
1656
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.03) 0%, var(--surface) 60%);
1657
- }
1658
- .drill-cards[data-node-type="milestone"] .drill-card .drill-card-id {
1659
- color: var(--mile-color);
1660
- }
1661
- .drill-cards[data-node-type="action"] .drill-card {
1662
- --card-tint: #93c5fd;
1663
- --card-tint-border: rgba(147, 197, 253, 0.25);
1664
- --card-tint-glow: rgba(147, 197, 253, 0.08);
1665
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.03) 0%, var(--surface) 60%);
1666
- }
1667
- .drill-cards[data-node-type="action"] .drill-card .drill-card-id {
1668
- color: var(--decl-color);
1669
- }
1670
-
1671
- /* Hover state preserves tint gradient */
1672
- .drill-cards[data-node-type="declaration"] .drill-card:hover {
1673
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1674
- }
1675
- .drill-cards[data-node-type="milestone"] .drill-card:hover {
1676
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1677
- }
1678
- .drill-cards[data-node-type="action"] .drill-card:hover {
1679
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1680
- }
1681
-
1682
- /* Focused card gets stronger tint background */
1683
- .drill-cards[data-node-type="declaration"] .drill-card.focused {
1684
- background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1685
- }
1686
- .drill-cards[data-node-type="milestone"] .drill-card.focused {
1687
- background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1688
- }
1689
- .drill-cards[data-node-type="action"] .drill-card.focused {
1690
- background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1691
- }
1692
- .drill-card .drill-review-btn.approve-btn {
1693
- background: rgba(134, 239, 172, 0.10);
1694
- border-color: rgba(134, 239, 172, 0.35);
1695
- color: #86efac;
1696
- }
1697
- .drill-card .drill-review-btn.revision-btn {
1698
- background: rgba(248, 113, 113, 0.06);
1699
- border-color: rgba(248, 113, 113, 0.2);
1700
- color: #f87171;
1701
- }
1702
-
1703
- .drill-card-top {
1704
- display: flex;
1705
- align-items: flex-start;
1706
- gap: 12px;
1707
- }
1708
- .drill-card-id {
1709
- font-size: 12px;
1710
- font-weight: 700;
1711
- letter-spacing: 0.03em;
1712
- flex-shrink: 0;
1713
- padding-top: 2px;
1714
- color: var(--text-dim);
1715
- }
1716
- .drill-card-body {
1717
- flex: 1;
1718
- min-width: 0;
1719
- }
1720
- .drill-card-title {
1721
- font-size: 16px;
1722
- font-weight: 600;
1723
- color: var(--text-bright);
1724
- line-height: 1.4;
1725
- letter-spacing: -0.01em;
1726
- margin-bottom: 4px;
1727
- }
1728
- .drill-card-desc {
1729
- font-size: 13px;
1730
- color: var(--text);
1731
- line-height: 1.5;
1732
- margin-bottom: 8px;
1733
- }
1734
- .drill-card-desc:empty { display: none; margin: 0; }
1735
-
1736
- .drill-card-badges {
1737
- display: flex;
1738
- align-items: center;
1739
- gap: 6px;
1740
- flex-wrap: wrap;
1741
- }
1742
- .drill-card-stat {
1743
- font-size: 12px;
1744
- color: var(--text);
1745
- font-weight: 400;
1746
- }
1747
- .drill-card-stat strong {
1748
- color: var(--accent);
1749
- font-weight: 600;
1750
- }
1751
- /* Inline action list on milestone cards */
1752
- .drill-card-action-list {
1753
- list-style: none;
1754
- padding: 0;
1755
- margin: 6px 0 0 0;
1756
- display: flex;
1757
- flex-direction: column;
1758
- gap: 2px;
1759
- }
1760
- .drill-card-action-list li {
1761
- font-size: 11px;
1762
- color: var(--text-dim);
1763
- display: flex;
1764
- align-items: baseline;
1765
- gap: 6px;
1766
- }
1767
- .drill-card-action-list li .al-icon {
1768
- width: 10px;
1769
- text-align: center;
1770
- flex-shrink: 0;
1771
- font-size: 10px;
1772
- }
1773
- .drill-card-action-list li.done { color: var(--text-muted); text-decoration: line-through; }
1774
- .drill-card-action-list li.done .al-icon { color: var(--done-color, #86efac); }
1775
- .drill-card-action-list li.planned .al-icon { color: var(--accent); }
1776
- .drill-card-action-list li.unplanned .al-icon { color: var(--text-muted); }
1777
- .drill-card-no-actions {
1778
- font-size: 11px;
1779
- color: var(--text-muted);
1780
- font-style: italic;
1781
- margin-top: 6px;
1782
- }
1783
-
1784
- /* Card-level status pill */
1785
- .drill-status-pill {
1786
- display: inline-block;
1787
- padding: 3px 10px;
1788
- border-radius: 99px;
1789
- font-size: 11px;
1790
- font-weight: 600;
1791
- letter-spacing: 0.03em;
1792
- text-transform: uppercase;
1793
- background: rgba(255,255,255,0.04);
1794
- border: 1px solid var(--border);
1795
- color: var(--text-dim);
1796
- }
1797
- .drill-status-pill.s-done { background: var(--act-bg); border-color: var(--act-border); color: var(--act-color); }
1798
- .drill-status-pill.s-executing { background: var(--executing-bg); border-color: var(--executing-border); color: var(--executing-color); }
1799
- .drill-status-pill.s-planned { background: var(--planned-bg); border-color: var(--planned-border); color: var(--planned-color); }
1800
- .drill-status-pill.s-pending { background: rgba(255,255,255,0.03); color: var(--text-dim); }
1801
-
1802
- /* ── Card review actions (centered below content) ── */
1803
- .drill-card-actions {
1804
- display: flex;
1805
- gap: 8px;
1806
- padding-top: 8px;
1807
- border-top: 1px solid var(--border);
1808
- }
1809
- .drill-review-btn {
1810
- flex: 1;
1811
- padding: 8px 14px;
1812
- border-radius: var(--radius);
1813
- font-size: 13px;
1814
- font-weight: 600;
1815
- cursor: pointer;
1816
- border: 1px solid var(--border-strong);
1817
- background: transparent;
1818
- color: var(--text);
1819
- transition: all 0.15s ease;
1820
- text-align: center;
1821
- }
1822
- .drill-review-btn kbd, .drill-action-btn kbd {
1823
- display: inline-block;
1824
- padding: 0 5px;
1825
- border: 1px solid var(--border-strong);
1826
- border-radius: 3px;
1827
- font-size: 10px;
1828
- font-family: inherit;
1829
- font-weight: 700;
1830
- color: var(--text-dim);
1831
- background: var(--surface2);
1832
- margin-right: 2px;
1833
- vertical-align: baseline;
1834
- }
1835
- .drill-review-btn:hover, .drill-action-btn:hover {
1836
- background: var(--surface2);
1837
- border-color: var(--border-strong);
1838
- color: var(--text);
1839
- }
1840
- .drill-review-btn.approve-btn:hover {
1841
- background: rgba(134, 239, 172, 0.08);
1842
- border-color: rgba(134, 239, 172, 0.3);
1843
- color: #86efac;
1844
- }
1845
-
1846
- /* ── Flat action bar buttons ── */
1847
- .drill-action-btn {
1848
- padding: 6px 12px;
1849
- border-radius: var(--radius);
1850
- font-size: 12px;
1851
- font-weight: 500;
1852
- cursor: pointer;
1853
- border: 1px solid var(--border);
1854
- background: transparent;
1855
- color: var(--text-dim);
1856
- transition: all 0.15s ease;
1857
- }
1858
- .drill-action-btn:hover {
1859
- background: var(--surface2);
1860
- border-color: var(--border-strong);
1861
- color: var(--text);
1862
- }
1863
- .drill-action-btn.drill-action-primary {
1864
- background: var(--accent-dim);
1865
- border-color: var(--accent-border);
1866
- color: var(--accent);
1867
- font-weight: 600;
1868
- }
1869
- .drill-action-btn.drill-action-primary:hover {
1870
- background: var(--accent-border);
1871
- }
1872
- .drill-action-btn.drill-action-danger {
1873
- color: var(--text-dim);
1874
- }
1875
- .drill-action-btn.drill-action-danger:hover {
1876
- background: rgba(248,113,113,0.08);
1877
- border-color: rgba(248,113,113,0.3);
1878
- color: #f87171;
1879
- }
1880
-
1881
- /* ── Refine suggestion inline area ── */
1882
- .refine-area {
1883
- margin-top: 8px;
1884
- padding: 10px;
1885
- border: 1px solid var(--accent-border);
1886
- border-radius: var(--radius);
1887
- background: rgba(208,236,26,0.03);
1888
- font-size: 13px;
1889
- line-height: 1.5;
1890
- color: var(--text);
1891
- }
1892
- .refine-area .refine-streaming {
1893
- white-space: pre-wrap;
1894
- min-height: 24px;
1895
- }
1896
- .refine-area .refine-actions {
1897
- display: flex;
1898
- gap: 8px;
1899
- margin-top: 8px;
1900
- }
1901
- .refine-area .refine-accept {
1902
- padding: 5px 12px;
1903
- border-radius: var(--radius);
1904
- font-size: 12px;
1905
- font-weight: 600;
1906
- cursor: pointer;
1907
- border: 1px solid rgba(134,239,172,0.3);
1908
- background: rgba(134,239,172,0.08);
1909
- color: #86efac;
1910
- }
1911
- .refine-area .refine-discard {
1912
- padding: 5px 12px;
1913
- border-radius: var(--radius);
1914
- font-size: 12px;
1915
- font-weight: 600;
1916
- cursor: pointer;
1917
- border: 1px solid var(--border-strong);
1918
- background: transparent;
1919
- color: var(--text-dim);
1920
- }
1921
- .refine-write-input {
1922
- width: 100%;
1923
- padding: 8px;
1924
- border: 1px solid var(--border-strong);
1925
- border-radius: var(--radius);
1926
- background: var(--surface2);
1927
- color: var(--text);
1928
- font-size: 13px;
1929
- font-family: inherit;
1930
- resize: vertical;
1931
- min-height: 40px;
1932
- margin-bottom: 6px;
1933
- }
1934
- .refine-write-input:focus {
1935
- outline: none;
1936
- border-color: var(--accent-border);
1937
- }
1938
-
1939
- /* Expandable plan preview */
1940
- .drill-plan-toggle {
1941
- font-size: 11px;
1942
- color: var(--text-muted);
1943
- cursor: pointer;
1944
- padding: 2px 0;
1945
- user-select: none;
1946
- font-weight: 500;
1947
- transition: color 0.12s;
1948
- }
1949
- .drill-plan-toggle:hover { color: var(--text); }
1950
- .drill-plan-content {
1951
- display: none;
1952
- margin-top: 6px;
1953
- padding: 12px 14px;
1954
- background: var(--bg);
1955
- border: 1px solid var(--border);
1956
- border-radius: var(--radius);
1957
- font-size: 11px;
1958
- line-height: 1.6;
1959
- color: var(--text-dim);
1960
- max-height: 200px;
1961
- overflow-y: auto;
1962
- }
1963
- .drill-plan-content.open { display: block; }
1964
-
1965
- /* ── Bottom prompt bar ── */
1966
- #drill-prompt {
1967
- padding: 14px 24px;
1968
- background: var(--surface);
1969
- border-top: 1px solid var(--border);
1970
- display: flex;
1971
- align-items: center;
1972
- justify-content: center;
1973
- gap: 12px;
1974
- flex-shrink: 0;
1975
- font-size: 13px;
1976
- }
1977
- .drill-prompt-text {
1978
- color: var(--text);
1979
- }
1980
- .drill-prompt-text .drill-prompt-target {
1981
- color: var(--accent);
1982
- font-weight: 600;
1983
- cursor: pointer;
1984
- }
1985
- .drill-prompt-text .drill-prompt-target:hover { text-decoration: underline; }
1986
- .drill-prompt-complete {
1987
- color: var(--accent);
1988
- font-weight: 600;
1989
- }
1990
- /* Command card in agents panel */
1991
- #command-card {
1992
- background: var(--surface2);
1993
- border: 1px solid var(--border);
1994
- border-radius: 18px;
1995
- padding: 8px 14px;
1996
- cursor: default;
1997
- transition: all 0.15s ease;
1998
- margin-bottom: 4px;
1999
- }
2000
- #command-card:hover, #command-card:focus-within { border-color: var(--accent-border); }
2001
- #command-card .cmd-label {
2002
- display: none;
2003
- }
2004
- #command-card .cmd-key {
2005
- display: none;
2006
- }
2007
- #command-card .cmd-row {
2008
- display: flex;
2009
- align-items: center;
2010
- gap: 8px;
2011
- }
2012
- #command-card .cmd-shortcut {
2013
- background: var(--surface3);
2014
- border: 1px solid var(--border);
2015
- border-radius: 4px;
2016
- padding: 1px 6px;
2017
- font-size: 10px;
2018
- font-weight: 700;
2019
- color: var(--text-dim);
2020
- font-family: 'SF Mono', 'Fira Code', monospace;
2021
- flex-shrink: 0;
2022
- line-height: 1.6;
2023
- }
2024
- #command-card:focus-within .cmd-shortcut { display: none; }
2025
- #command-card.editing {
2026
- border-color: var(--accent);
2027
- border-style: solid;
2028
- cursor: default;
2029
- }
2030
- #command-card-input {
2031
- display: block;
2032
- width: 100%;
2033
- background: transparent;
2034
- border: none;
2035
- color: var(--text);
2036
- font-size: 13px;
2037
- padding: 2px 0;
2038
- outline: none;
2039
- font-family: inherit;
2040
- resize: none;
2041
- line-height: 1.4;
2042
- min-width: 0;
2043
- flex: 1;
2044
- }
2045
- #command-card-hint {
2046
- display: none;
2047
- font-size: 10px;
2048
- color: var(--text-dim);
2049
- margin-top: 4px;
2050
- }
2051
- #command-card.editing #command-card-hint { display: block; }
2052
- #command-card.running { border-color: var(--executing-color); border-style: solid; }
2053
- #command-card.running .cmd-label { display: none; }
2054
- #command-card.running #command-card-input { display: none; }
2055
- #command-card.running #command-card-hint { display: none; }
2056
- .command-output-stream {
2057
- font-family: 'SF Mono', 'Fira Code', monospace;
2058
- font-size: 11px;
2059
- line-height: 1.5;
2060
- color: var(--text-muted);
2061
- max-height: 200px;
2062
- overflow-y: auto;
2063
- white-space: pre-wrap;
2064
- word-break: break-word;
2065
- margin: 0;
2066
- padding: 0;
2067
- }
2068
- .command-output-stream.streaming { color: var(--executing-color); }
2069
- .drill-next-btn {
2070
- background: var(--accent-dim);
2071
- border: 1px solid var(--accent-border);
2072
- color: var(--accent);
2073
- padding: 6px 16px;
2074
- border-radius: var(--radius);
2075
- cursor: pointer;
2076
- font-size: 13px;
2077
- font-weight: 600;
2078
- margin-left: 12px;
2079
- transition: all 0.15s ease;
2080
- }
2081
- .drill-next-btn:hover { background: rgba(208, 236, 26, 0.18); }
2082
- .drill-next-btn kbd {
2083
- display: inline-block;
2084
- padding: 0 5px;
2085
- border: 1px solid var(--accent-border);
2086
- border-radius: 3px;
2087
- font-size: 10px;
2088
- font-family: inherit;
2089
- font-weight: 700;
2090
- color: var(--accent);
2091
- background: rgba(208, 236, 26, 0.08);
2092
- margin-right: 2px;
2093
- }
2094
- .drill-approve-all-btn {
2095
- background: rgba(134, 239, 172, 0.08);
2096
- border: 1px solid rgba(134, 239, 172, 0.3);
2097
- color: #86efac;
2098
- padding: 6px 16px;
2099
- border-radius: var(--radius);
2100
- cursor: pointer;
2101
- font-size: 13px;
2102
- font-weight: 600;
2103
- margin-left: 12px;
2104
- transition: all 0.15s ease;
2105
- }
2106
- .drill-approve-all-btn:hover { background: rgba(134, 239, 172, 0.15); }
2107
- .drill-approve-all-btn kbd {
2108
- display: inline-block;
2109
- padding: 0 5px;
2110
- border: 1px solid rgba(134, 239, 172, 0.3);
2111
- border-radius: 3px;
2112
- font-size: 10px;
2113
- font-family: inherit;
2114
- font-weight: 700;
2115
- color: #86efac;
2116
- background: rgba(134, 239, 172, 0.08);
2117
- margin-right: 2px;
2118
- }
2119
-
2120
- .col-empty {
2121
- padding: 40px 20px;
2122
- color: var(--text-muted);
2123
- font-size: 13px;
2124
- text-align: center;
2125
- }
2126
-
2127
- .col-empty-invite {
2128
- padding: 60px 32px;
2129
- text-align: center;
2130
- display: flex;
2131
- flex-direction: column;
2132
- align-items: center;
2133
- gap: 12px;
2134
- }
2135
- .empty-invite-title {
2136
- color: var(--text);
2137
- font-size: 15px;
2138
- font-weight: 600;
2139
- }
2140
- .empty-invite-desc {
2141
- color: var(--text-muted);
2142
- font-size: 13px;
2143
- max-width: 320px;
2144
- line-height: 1.5;
2145
- }
2146
- .empty-invite-input {
2147
- width: 100%;
2148
- max-width: 320px;
2149
- background: var(--surface2);
2150
- border: 1px solid var(--border);
2151
- border-radius: 6px;
2152
- color: var(--text);
2153
- font-size: 12px;
2154
- padding: 8px 10px;
2155
- resize: vertical;
2156
- font-family: inherit;
2157
- }
2158
- .empty-invite-input:focus {
2159
- outline: none;
2160
- border-color: var(--accent-border);
2161
- }
2162
- .empty-invite-input::placeholder {
2163
- color: var(--text-muted);
2164
- opacity: 0.6;
2165
- }
2166
- .empty-invite-btn {
2167
- background: var(--accent-dim);
2168
- border: 1px solid var(--accent-border);
2169
- color: var(--accent);
2170
- padding: 8px 20px;
2171
- border-radius: 6px;
2172
- font-size: 13px;
2173
- font-weight: 600;
2174
- cursor: pointer;
2175
- transition: all 0.15s ease;
2176
- }
2177
- .empty-invite-btn:hover {
2178
- background: rgba(208, 236, 26, 0.18);
2179
- border-color: rgba(208, 236, 26, 0.4);
2180
- }
2181
- .empty-invite-btn kbd {
2182
- background: rgba(255,255,255,0.08);
2183
- border: 1px solid rgba(255,255,255,0.12);
2184
- border-radius: 3px;
2185
- padding: 1px 5px;
2186
- font-size: 11px;
2187
- margin-right: 4px;
2188
- }
2189
- .col-empty-invite .output-log {
2190
- width: 100%;
2191
- max-width: 560px;
2192
- text-align: left;
2193
- max-height: 200px;
2194
- overflow-y: auto;
2195
- font-size: 12px;
2196
- line-height: 1.6;
2197
- color: var(--text-dim);
2198
- padding: 12px 16px;
2199
- border-radius: var(--radius);
2200
- background: var(--surface);
2201
- border: 1px solid var(--border);
2202
- }
2203
- .col-empty-invite .output-log .derive-log-line {
2204
- opacity: 0.5;
2205
- transition: opacity 0.3s;
2206
- }
2207
- .col-empty-invite .output-log .derive-log-line:last-child {
2208
- opacity: 1;
2209
- color: var(--text);
2210
- }
2211
- .col-empty-invite .derivation-checklist {
2212
- text-align: left;
2213
- width: 100%;
2214
- max-width: 560px;
2215
- }
2216
- .col-empty-invite #derivation-proposals {
2217
- width: 100%;
2218
- max-width: 560px;
2219
- text-align: left;
2220
- }
2221
- .derivation-progress {
2222
- width: 100%;
2223
- max-width: 560px;
2224
- margin-top: 16px;
2225
- padding: 14px 18px;
2226
- background: var(--surface);
2227
- border: 1px solid var(--border);
2228
- border-radius: var(--radius-lg);
2229
- }
2230
- .derive-phase {
2231
- display: flex;
2232
- align-items: center;
2233
- gap: 10px;
2234
- animation: derive-phase-in 0.4s ease;
2235
- }
2236
- .derive-phase-icon {
2237
- font-size: 18px;
2238
- flex-shrink: 0;
2239
- }
2240
- .derive-phase-text {
2241
- font-size: 13px;
2242
- color: var(--text);
2243
- font-weight: 500;
2244
- }
2245
- @keyframes derive-phase-in {
2246
- from { opacity: 0; transform: translateY(4px); }
2247
- to { opacity: 1; transform: translateY(0); }
2248
- }
2249
- .derive-stream-output {
2250
- margin-top: 10px;
2251
- padding: 10px 12px;
2252
- background: var(--bg);
2253
- border: 1px solid var(--border);
2254
- border-radius: var(--radius);
2255
- font-size: 12px;
2256
- line-height: 1.5;
2257
- color: var(--text-dim);
2258
- max-height: 160px;
2259
- overflow-y: auto;
2260
- white-space: pre-wrap;
2261
- word-break: break-word;
2262
- font-family: 'SF Mono', 'Fira Code', monospace;
2263
- }
2264
-
2265
- .derive-spinner {
2266
- display: inline-block;
2267
- width: 12px;
2268
- height: 12px;
2269
- border: 2px solid rgba(208,236,26,0.3);
2270
- border-top-color: var(--accent);
2271
- border-radius: 50%;
2272
- animation: derive-spin 0.8s linear infinite;
2273
- vertical-align: middle;
2274
- margin-right: 4px;
2275
- }
2276
- @keyframes derive-spin {
2277
- to { transform: rotate(360deg); }
2278
- }
2279
- .derive-elapsed {
2280
- opacity: 0.5;
2281
- font-size: 11px;
2282
- font-weight: 400;
2283
- }
2284
-
2285
- /* Hide side panel in drill browser mode */
2286
- body:not(.dag-mode) #side-panel { display: none; }
2287
- body.dag-mode #side-panel { display: flex; }
2288
- body.dag-mode #activity-feed { display: none; }
2289
-
2290
- /* ── Declaration form ── */
2291
- .decl-form-trigger {
2292
- background: none;
2293
- border: 1px solid var(--decl-border);
2294
- color: var(--decl-color);
2295
- width: 22px;
2296
- height: 22px;
2297
- border-radius: 4px;
2298
- cursor: pointer;
2299
- font-size: 14px;
2300
- line-height: 1;
2301
- display: inline-flex;
2302
- align-items: center;
2303
- justify-content: center;
2304
- transition: background 0.15s, border-color 0.15s;
2305
- flex-shrink: 0;
2306
- margin-left: auto;
2307
- }
2308
- .decl-form-trigger:hover {
2309
- background: var(--decl-bg);
2310
- border-color: var(--decl-color);
2311
- }
2312
-
2313
- .decl-form-overlay {
2314
- padding: 12px 16px;
2315
- border-bottom: 1px solid var(--border);
2316
- background: var(--surface2);
2317
- }
2318
-
2319
- .decl-form {
2320
- display: flex;
2321
- flex-direction: column;
2322
- gap: 8px;
2323
- }
2324
-
2325
- .decl-form input,
2326
- .decl-form textarea {
2327
- background: var(--surface);
2328
- border: 1px solid var(--border);
2329
- color: var(--text);
2330
- border-radius: 4px;
2331
- padding: 8px 12px;
2332
- width: 100%;
2333
- font-size: 13px;
2334
- font-family: inherit;
2335
- outline: none;
2336
- transition: border-color 0.15s;
2337
- }
2338
- .decl-form input:focus,
2339
- .decl-form textarea:focus {
2340
- border-color: var(--decl-color);
2341
- }
2342
-
2343
- .decl-form textarea {
2344
- resize: vertical;
2345
- min-height: 54px;
2346
- }
2347
-
2348
- .decl-form-actions {
2349
- display: flex;
2350
- gap: 8px;
2351
- align-items: center;
2352
- }
2353
-
2354
- .decl-form-actions .decl-submit-btn {
2355
- background: var(--decl-color);
2356
- color: #fff;
2357
- border: none;
2358
- border-radius: 4px;
2359
- padding: 6px 16px;
2360
- cursor: pointer;
2361
- font-size: 12px;
2362
- font-weight: 600;
2363
- transition: opacity 0.15s;
2364
- }
2365
- .decl-form-actions .decl-submit-btn:hover { opacity: 0.9; }
2366
- .decl-form-actions .decl-submit-btn:disabled {
2367
- opacity: 0.5;
2368
- cursor: not-allowed;
2369
- }
2370
-
2371
- .decl-form-actions .decl-cancel-btn {
2372
- background: transparent;
2373
- border: 1px solid var(--border);
2374
- color: var(--text-dim);
2375
- border-radius: 4px;
2376
- padding: 6px 16px;
2377
- cursor: pointer;
2378
- font-size: 12px;
2379
- transition: border-color 0.15s, color 0.15s;
2380
- }
2381
- .decl-form-actions .decl-cancel-btn:hover {
2382
- border-color: var(--text-dim);
2383
- color: var(--text);
2384
- }
2385
-
2386
- .decl-form .form-error {
2387
- color: var(--broken-color);
2388
- font-size: 12px;
2389
- margin-top: 4px;
2390
- min-height: 0;
2391
- }
2392
-
2393
- /* Status bar new-decl button */
2394
- .new-decl-btn {
2395
- background: var(--decl-bg);
2396
- border: 1px solid var(--decl-border);
2397
- color: var(--decl-color);
2398
- padding: 5px 14px;
2399
- border-radius: 6px;
2400
- cursor: pointer;
2401
- font-size: 12px;
2402
- font-weight: 600;
2403
- transition: background 0.15s, border-color 0.15s;
2404
- }
2405
- .new-decl-btn:hover { background: #0f2d50; border-color: var(--decl-color); }
2406
-
2407
- /* Play All button */
2408
- .play-btn {
2409
- background: #0a2018;
2410
- border: 1px solid var(--act-border);
2411
- color: var(--act-color);
2412
- padding: 5px 14px;
2413
- border-radius: 6px;
2414
- cursor: pointer;
2415
- font-size: 12px;
2416
- font-weight: 600;
2417
- transition: background 0.15s, border-color 0.15s;
2418
- }
2419
- .play-btn:hover { background: #0f3020; border-color: var(--act-color); }
2420
- .play-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2421
- .play-btn.playing {
2422
- background: var(--executing-bg);
2423
- border-color: var(--executing-border);
2424
- color: var(--executing-color);
2425
- animation: pulse-play 1.5s ease-in-out infinite;
2426
- }
2427
- @keyframes pulse-play {
2428
- 0%, 100% { opacity: 1; }
2429
- 50% { opacity: 0.7; }
2430
- }
2431
-
2432
- /* Play progress banner */
2433
- #play-banner {
2434
- display: none;
2435
- background: var(--surface);
2436
- border-bottom: 1px solid var(--executing-border);
2437
- padding: 8px 20px;
2438
- font-size: 12px;
2439
- color: var(--text);
2440
- align-items: center;
2441
- gap: 12px;
2442
- flex-shrink: 0;
2443
- }
2444
- #play-banner.visible { display: flex; }
2445
- #play-banner .play-wave-label {
2446
- color: var(--executing-color);
2447
- font-weight: 600;
2448
- }
2449
- #play-banner .play-actions-list {
2450
- display: flex;
2451
- gap: 6px;
2452
- flex-wrap: wrap;
2453
- }
2454
- #play-banner .play-action-tag {
2455
- background: var(--surface2);
2456
- border: 1px solid var(--border);
2457
- border-radius: 4px;
2458
- padding: 2px 8px;
2459
- font-size: 11px;
2460
- }
2461
- #play-banner .play-action-tag.active {
2462
- border-color: var(--executing-border);
2463
- color: var(--executing-color);
2464
- }
2465
- #play-banner .play-action-tag.done {
2466
- border-color: var(--act-border);
2467
- color: var(--act-color);
2468
- }
2469
- #play-banner .play-action-tag.failed {
2470
- border-color: var(--broken-border);
2471
- color: var(--broken-color);
2472
- }
2473
- .play-stop-btn {
2474
- background: var(--broken-bg);
2475
- border: 1px solid var(--broken-border);
2476
- color: var(--broken-color);
2477
- padding: 3px 10px;
2478
- border-radius: 4px;
2479
- cursor: pointer;
2480
- font-size: 11px;
2481
- margin-left: auto;
2482
- }
2483
- .play-stop-btn:hover { background: #3a0a10; }
2484
-
2485
- /* Scrollbar for column panels */
2486
- .col-panel::-webkit-scrollbar { width: 4px; }
2487
- .col-panel::-webkit-scrollbar-track { background: transparent; }
2488
- .col-panel::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
2489
-
2490
- /* ── File Viewer Modal ── */
2491
- #file-viewer-modal {
2492
- display: none;
2493
- position: fixed;
2494
- inset: 0;
2495
- z-index: 2000;
2496
- background: rgba(0, 0, 0, 0.75);
2497
- backdrop-filter: blur(4px);
2498
- justify-content: center;
2499
- align-items: center;
2500
- padding: 40px;
2501
- }
2502
- #file-viewer-modal.open {
2503
- display: flex;
2504
- }
2505
- .file-viewer-container {
2506
- background: var(--surface);
2507
- border: 1px solid var(--border);
2508
- border-radius: 12px;
2509
- width: 100%;
2510
- max-width: 820px;
2511
- max-height: 85vh;
2512
- display: flex;
2513
- flex-direction: column;
2514
- overflow: hidden;
2515
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
2516
- }
2517
- .file-viewer-header {
2518
- display: flex;
2519
- align-items: center;
2520
- justify-content: space-between;
2521
- padding: 12px 16px;
2522
- border-bottom: 1px solid var(--border);
2523
- background: var(--surface2);
2524
- flex-shrink: 0;
2525
- }
2526
- .file-viewer-path {
2527
- font-family: 'SF Mono', 'Fira Code', monospace;
2528
- font-size: 12px;
2529
- color: var(--text-bright);
2530
- font-weight: 600;
2531
- overflow: hidden;
2532
- text-overflow: ellipsis;
2533
- white-space: nowrap;
2534
- }
2535
- .file-viewer-close {
2536
- background: none;
2537
- border: 1px solid var(--border);
2538
- color: var(--text-dim);
2539
- cursor: pointer;
2540
- border-radius: 6px;
2541
- width: 28px;
2542
- height: 28px;
2543
- display: flex;
2544
- align-items: center;
2545
- justify-content: center;
2546
- font-size: 14px;
2547
- flex-shrink: 0;
2548
- margin-left: 12px;
2549
- }
2550
- .file-viewer-close:hover {
2551
- color: var(--text-bright);
2552
- border-color: var(--text-dim);
2553
- }
2554
- .file-viewer-body {
2555
- overflow-y: auto;
2556
- padding: 20px 24px;
2557
- flex: 1;
2558
- font-size: 13px;
2559
- line-height: 1.65;
2560
- color: var(--text);
2561
- }
2562
- /* Markdown rendered content */
2563
- .file-viewer-body.markdown h1 { font-size: 1.6em; font-weight: 700; color: var(--text-bright); margin: 0 0 0.6em; padding-bottom: 0.3em; border-bottom: 1px solid var(--border); }
2564
- .file-viewer-body.markdown h2 { font-size: 1.3em; font-weight: 700; color: var(--text-bright); margin: 1.2em 0 0.4em; padding-bottom: 0.25em; border-bottom: 1px solid var(--border); }
2565
- .file-viewer-body.markdown h3 { font-size: 1.1em; font-weight: 700; color: var(--text-bright); margin: 1em 0 0.3em; }
2566
- .file-viewer-body.markdown h4, .file-viewer-body.markdown h5, .file-viewer-body.markdown h6 { font-size: 1em; font-weight: 700; color: var(--text-bright); margin: 0.8em 0 0.2em; }
2567
- .file-viewer-body.markdown p { margin: 0 0 0.8em; }
2568
- .file-viewer-body.markdown ul, .file-viewer-body.markdown ol { margin: 0 0 0.8em; padding-left: 1.5em; }
2569
- .file-viewer-body.markdown li { margin-bottom: 0.3em; }
2570
- .file-viewer-body.markdown li > ul, .file-viewer-body.markdown li > ol { margin-top: 0.3em; margin-bottom: 0; }
2571
- .file-viewer-body.markdown code { font-family: 'SF Mono', 'Fira Code', monospace; background: var(--surface2); border: 1px solid var(--border); border-radius: 3px; padding: 1px 5px; font-size: 0.9em; color: var(--act-color); }
2572
- .file-viewer-body.markdown pre { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; overflow-x: auto; margin: 0 0 1em; }
2573
- .file-viewer-body.markdown pre code { background: none; border: none; padding: 0; color: var(--text); font-size: 12px; line-height: 1.5; }
2574
- .file-viewer-body.markdown blockquote { border-left: 3px solid var(--border); padding: 0.2em 0 0.2em 1em; margin: 0 0 0.8em; color: var(--text-dim); }
2575
- .file-viewer-body.markdown a { color: var(--decl-color); text-decoration: none; }
2576
- .file-viewer-body.markdown a:hover { text-decoration: underline; }
2577
- .file-viewer-body.markdown hr { border: none; border-top: 1px solid var(--border); margin: 1.2em 0; }
2578
- .file-viewer-body.markdown table { border-collapse: collapse; margin: 0 0 1em; width: 100%; }
2579
- .file-viewer-body.markdown th, .file-viewer-body.markdown td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; font-size: 12px; }
2580
- .file-viewer-body.markdown th { background: var(--surface2); font-weight: 700; color: var(--text-bright); }
2581
- .file-viewer-body.markdown img { max-width: 100%; }
2582
- .file-viewer-body.markdown strong { color: var(--text-bright); font-weight: 700; }
2583
- /* Preformatted (non-markdown) */
2584
- .file-viewer-body.preformatted {
2585
- font-family: 'SF Mono', 'Fira Code', monospace;
2586
- font-size: 12px;
2587
- line-height: 1.5;
2588
- white-space: pre-wrap;
2589
- word-break: break-all;
2590
- color: var(--text);
2591
- }
2592
- /* Clickable file links in plan detail */
2593
- .file-link {
2594
- cursor: pointer;
2595
- transition: border-color 0.15s;
2596
- }
2597
- .file-link:hover {
2598
- border-color: var(--act-color) !important;
2599
- text-decoration: underline;
2600
- }
2601
-
2602
- /* ── Declaration edit mode ── */
2603
- .decl-edit-mode input,
2604
- .decl-edit-mode textarea {
2605
- background: var(--surface);
2606
- border: 1px solid var(--border);
2607
- color: var(--text);
2608
- border-radius: 4px;
2609
- padding: 8px 12px;
2610
- width: 100%;
2611
- font-size: 13px;
2612
- font-family: inherit;
2613
- outline: none;
2614
- transition: border-color 0.15s;
2615
- }
2616
- .decl-edit-mode input:focus,
2617
- .decl-edit-mode textarea:focus {
2618
- border-color: var(--decl-color);
2619
- }
2620
- .decl-edit-mode textarea {
2621
- resize: vertical;
2622
- min-height: 54px;
2623
- }
2624
- .decl-edit-mode label {
2625
- font-size: 10px;
2626
- font-weight: 700;
2627
- letter-spacing: 0.1em;
2628
- text-transform: uppercase;
2629
- color: var(--text-dim);
2630
- margin-bottom: 4px;
2631
- margin-top: 12px;
2632
- display: block;
2633
- }
2634
- .decl-edit-mode label:first-child {
2635
- margin-top: 0;
2636
- }
2637
-
2638
- .decl-edit-actions {
2639
- display: flex;
2640
- gap: 8px;
2641
- align-items: center;
2642
- margin-top: 14px;
2643
- }
2644
- .decl-edit-actions .btn-save {
2645
- background: var(--decl-color);
2646
- color: #fff;
2647
- border: none;
2648
- border-radius: 4px;
2649
- padding: 6px 16px;
2650
- cursor: pointer;
2651
- font-size: 12px;
2652
- font-weight: 600;
2653
- transition: opacity 0.15s;
2654
- }
2655
- .decl-edit-actions .btn-save:hover { opacity: 0.9; }
2656
- .decl-edit-actions .btn-save:disabled { opacity: 0.5; cursor: not-allowed; }
2657
- .decl-edit-actions .btn-cancel {
2658
- background: transparent;
2659
- border: 1px solid var(--border);
2660
- color: var(--text-dim);
2661
- border-radius: 4px;
2662
- padding: 6px 16px;
2663
- cursor: pointer;
2664
- font-size: 12px;
2665
- transition: border-color 0.15s, color 0.15s;
2666
- }
2667
- .decl-edit-actions .btn-cancel:hover { border-color: var(--text-dim); color: var(--text); }
2668
-
2669
- .delete-confirm {
2670
- margin-top: 12px;
2671
- padding: 10px 12px;
2672
- background: var(--broken-bg);
2673
- border: 1px solid var(--broken-border);
2674
- border-radius: 6px;
2675
- font-size: 12px;
2676
- color: var(--broken-color);
2677
- }
2678
- .delete-confirm p {
2679
- margin-bottom: 8px;
2680
- }
2681
- .delete-confirm .delete-confirm-actions {
2682
- display: flex;
2683
- gap: 8px;
2684
- }
2685
- .delete-confirm .btn-confirm-delete {
2686
- background: var(--broken-color);
2687
- color: #fff;
2688
- border: none;
2689
- border-radius: 4px;
2690
- padding: 5px 14px;
2691
- cursor: pointer;
2692
- font-size: 12px;
2693
- font-weight: 600;
2694
- }
2695
- .delete-confirm .btn-confirm-cancel {
2696
- background: transparent;
2697
- border: 1px solid var(--broken-border);
2698
- color: var(--broken-color);
2699
- border-radius: 4px;
2700
- padding: 5px 14px;
2701
- cursor: pointer;
2702
- font-size: 12px;
2703
- }
2704
-
2705
- .decl-status-select {
2706
- background: var(--surface2);
2707
- color: var(--text);
2708
- border: 1px solid var(--border);
2709
- border-radius: 4px;
2710
- padding: 8px 12px;
2711
- width: 100%;
2712
- font-size: 13px;
2713
- font-family: inherit;
2714
- outline: none;
2715
- cursor: pointer;
2716
- transition: border-color 0.15s;
2717
- }
2718
- .decl-status-select:focus {
2719
- border-color: var(--decl-color);
2720
- }
2721
-
2722
- .decl-panel-actions {
2723
- display: flex;
2724
- gap: 8px;
2725
- margin-top: 16px;
2726
- }
2727
- .decl-panel-actions .btn-edit {
2728
- background: var(--decl-bg);
2729
- border: 1px solid var(--decl-border);
2730
- color: var(--decl-color);
2731
- border-radius: 4px;
2732
- padding: 5px 14px;
2733
- cursor: pointer;
2734
- font-size: 12px;
2735
- font-weight: 600;
2736
- transition: background 0.15s, border-color 0.15s;
2737
- }
2738
- .decl-panel-actions .btn-edit:hover { background: #0f2d50; border-color: var(--decl-color); }
2739
- .decl-panel-actions .btn-panel-delete {
2740
- background: transparent;
2741
- color: var(--broken-color);
2742
- border: 1px solid var(--broken-border);
2743
- border-radius: 4px;
2744
- padding: 5px 14px;
2745
- cursor: pointer;
2746
- font-size: 12px;
2747
- font-weight: 600;
2748
- transition: background 0.15s;
2749
- }
2750
- .decl-panel-actions .btn-panel-delete:hover { background: var(--broken-bg); }
2751
-
2752
- /* Workability path section */
2753
- .workability-path { margin-top: 4px; }
2754
- .workability-path .wp-header {
2755
- font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
2756
- text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px;
2757
- }
2758
- .wp-step {
2759
- display: flex; align-items: flex-start; gap: 10px;
2760
- padding: 8px 10px; border-radius: 6px;
2761
- background: var(--surface2); border: 1px solid var(--border);
2762
- margin-bottom: 6px; font-size: 12px;
2763
- }
2764
- .wp-step-action {
2765
- font-size: 10px; font-weight: 700; letter-spacing: 0.04em;
2766
- color: var(--act-color); cursor: pointer; white-space: nowrap;
2767
- flex-shrink: 0;
2768
- }
2769
- .wp-step-action:hover { text-decoration: underline; }
2770
- .wp-step-body { flex: 1; min-width: 0; }
2771
- .wp-step-title {
2772
- color: var(--text-bright); font-size: 12px; font-weight: 500;
2773
- line-height: 1.35; margin-bottom: 3px;
2774
- }
2775
- .wp-step-milestone {
2776
- font-size: 10px; color: var(--text-dim); opacity: 0.7;
2777
- }
2778
- .wp-impact {
2779
- display: inline-block; padding: 1px 7px; border-radius: 8px;
2780
- font-size: 9px; font-weight: 700; letter-spacing: 0.04em;
2781
- text-transform: uppercase; flex-shrink: 0; margin-top: 1px;
2782
- }
2783
- .wp-impact.impact-high { background: #2a0a10; color: var(--broken-color); border: 1px solid #5a1520; }
2784
- .wp-impact.impact-medium { background: #1a1200; color: var(--integrity-partial); border: 1px solid #3d2c00; }
2785
- .wp-impact.impact-low { background: #0a2018; color: var(--integrity-whole); border: 1px solid #1a4d34; }
2786
-
2787
- /* ── Derivation panel ── */
2788
- .derivation-panel {
2789
- margin-top: 12px;
2790
- border: 1px solid var(--border);
2791
- border-radius: 6px;
2792
- padding: 12px;
2793
- background: var(--bg);
2794
- }
2795
- .derivation-panel .output-log {
2796
- max-height: 200px;
2797
- overflow-y: auto;
2798
- font-family: 'SF Mono', Monaco, monospace;
2799
- font-size: 11px;
2800
- padding: 8px;
2801
- background: #1a1a2e;
2802
- color: #ccc;
2803
- border-radius: 4px;
2804
- white-space: pre-wrap;
2805
- margin-bottom: 12px;
2806
- }
2807
- .derivation-checklist { list-style: none; padding: 0; margin: 8px 0; }
2808
- .derivation-checklist li {
2809
- display: flex;
2810
- align-items: center;
2811
- gap: 8px;
2812
- padding: 6px 0;
2813
- border-bottom: 1px solid var(--border);
2814
- }
2815
- .derivation-checklist li:last-child { border-bottom: none; }
2816
- .derivation-checklist input[type="checkbox"] { flex-shrink: 0; }
2817
- .derivation-checklist input[type="text"] {
2818
- flex: 1;
2819
- background: var(--bg);
2820
- color: var(--fg, var(--text));
2821
- border: 1px solid var(--border);
2822
- border-radius: 3px;
2823
- padding: 4px 6px;
2824
- font-size: 13px;
2825
- }
2826
- .derivation-checklist .reason {
2827
- font-size: 11px;
2828
- color: #888;
2829
- margin-left: 28px;
2830
- display: block;
2831
- }
2832
- .derive-btn {
2833
- background: var(--accent, #4a6cf7);
2834
- color: #fff;
2835
- border: none;
2836
- padding: 6px 14px;
2837
- border-radius: 4px;
2838
- cursor: pointer;
2839
- font-size: 13px;
2840
- }
2841
- .derive-btn:hover { opacity: 0.85; }
2842
- .derive-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2843
- .derive-accept-btn {
2844
- background: #2ea043;
2845
- color: #fff;
2846
- border: none;
2847
- padding: 6px 14px;
2848
- border-radius: 4px;
2849
- cursor: pointer;
2850
- font-size: 13px;
2851
- margin-right: 8px;
2852
- }
2853
- .derive-cancel-btn {
2854
- background: transparent;
2855
- color: var(--text);
2856
- border: 1px solid var(--border);
2857
- padding: 6px 14px;
2858
- border-radius: 4px;
2859
- cursor: pointer;
2860
- font-size: 13px;
2861
- }
2862
-
2863
- /* ── Workflow next-step banner ── */
2864
- #workflow-banner {
2865
- display: none;
2866
- align-items: center;
2867
- gap: 16px;
2868
- padding: 12px 20px;
2869
- background: var(--surface);
2870
- border-bottom: 1px solid var(--border);
2871
- flex-shrink: 0;
2872
- }
2873
- #workflow-banner.visible { display: flex; }
2874
-
2875
- .wf-progress-bar {
2876
- width: 120px;
2877
- height: 6px;
2878
- background: rgba(255,255,255,0.06);
2879
- border-radius: 3px;
2880
- overflow: hidden;
2881
- flex-shrink: 0;
2882
- }
2883
- .wf-progress-fill {
2884
- height: 100%;
2885
- border-radius: 3px;
2886
- background: var(--act-color);
2887
- transition: width 0.4s ease;
2888
- }
2889
- .wf-progress-fill.state-empty { background: var(--text-dim); }
2890
- .wf-progress-fill.state-declarations_only { background: var(--decl-color); }
2891
- .wf-progress-fill.state-milestones_pending { background: var(--mile-color); }
2892
- .wf-progress-fill.state-actions_pending { background: var(--act-color); }
2893
- .wf-progress-fill.state-executing { background: var(--executing-color); }
2894
- .wf-progress-fill.state-complete { background: var(--integrity-whole); }
2895
-
2896
- .wf-state-label {
2897
- font-size: 10px;
2898
- font-weight: 700;
2899
- letter-spacing: 0.08em;
2900
- text-transform: uppercase;
2901
- color: var(--text-dim);
2902
- flex-shrink: 0;
2903
- }
2904
-
2905
- .wf-next-label {
2906
- font-size: 13px;
2907
- color: var(--text);
2908
- flex: 1;
2909
- }
2910
-
2911
- .wf-action-btn {
2912
- background: var(--act-bg);
2913
- border: 1px solid var(--act-border);
2914
- color: var(--act-color);
2915
- padding: 6px 16px;
2916
- border-radius: 6px;
2917
- font-size: 12px;
2918
- font-weight: 600;
2919
- cursor: pointer;
2920
- flex-shrink: 0;
2921
- transition: background 0.15s, border-color 0.15s;
2922
- white-space: nowrap;
2923
- }
2924
- .wf-action-btn:hover { background: #0d2818; border-color: #2a6a48; }
2925
-
2926
- .wf-action-btn.state-empty,
2927
- .wf-action-btn.state-declarations_only {
2928
- background: var(--decl-bg);
2929
- border-color: var(--decl-border);
2930
- color: var(--decl-color);
2931
- }
2932
- .wf-action-btn.state-empty:hover,
2933
- .wf-action-btn.state-declarations_only:hover {
2934
- background: #0f2d50;
2935
- border-color: var(--decl-color);
2936
- }
2937
- .wf-action-btn.state-milestones_pending {
2938
- background: var(--mile-bg);
2939
- border-color: var(--mile-border);
2940
- color: var(--mile-color);
2941
- }
2942
- .wf-action-btn.state-milestones_pending:hover {
2943
- background: #220e44;
2944
- border-color: var(--mile-color);
2945
- }
2946
- .wf-action-btn.state-executing {
2947
- background: var(--executing-bg);
2948
- border-color: var(--executing-border);
2949
- color: var(--executing-color);
2950
- }
2951
- .wf-action-btn.state-complete {
2952
- background: #0a2018;
2953
- border-color: #1a4d34;
2954
- color: var(--integrity-whole);
2955
- }
2956
-
2957
- .wf-pct {
2958
- font-size: 12px;
2959
- font-weight: 600;
2960
- color: var(--text-dim);
2961
- flex-shrink: 0;
2962
- }
2963
-
2964
- /* ── Reference badges ── */
2965
- .ref-link-badge {
2966
- display: inline-block;
2967
- padding: 3px 10px;
2968
- border-radius: 6px;
2969
- font-size: 11px;
2970
- font-weight: 500;
2971
- text-decoration: none;
2972
- transition: border-color 0.12s, color 0.12s;
2973
- max-width: 100%;
2974
- overflow: hidden;
2975
- text-overflow: ellipsis;
2976
- white-space: nowrap;
2977
- }
2978
- .ref-url-badge {
2979
- background: var(--decl-bg);
2980
- border: 1px solid var(--decl-border);
2981
- color: var(--decl-color);
2982
- cursor: pointer;
2983
- }
2984
- .ref-url-badge:hover { border-color: var(--decl-color); text-decoration: underline; }
2985
- .ref-path-badge {
2986
- background: var(--surface2);
2987
- border: 1px solid var(--border);
2988
- color: var(--text-dim);
2989
- font-family: 'SF Mono', 'Fira Code', monospace;
2990
- font-size: 10px;
2991
- }
2992
- .ref-input {
2993
- background: var(--surface);
2994
- border: 1px solid var(--border);
2995
- color: var(--text);
2996
- border-radius: 4px;
2997
- padding: 6px 10px;
2998
- width: 100%;
2999
- font-size: 12px;
3000
- font-family: inherit;
3001
- outline: none;
3002
- transition: border-color 0.15s;
3003
- }
3004
- .ref-input:focus { border-color: var(--decl-color); }
3005
- .ref-save-btn {
3006
- background: var(--decl-color);
3007
- color: #fff;
3008
- border: none;
3009
- border-radius: 4px;
3010
- padding: 5px 14px;
3011
- cursor: pointer;
3012
- font-size: 12px;
3013
- font-weight: 600;
3014
- transition: opacity 0.15s;
3015
- }
3016
- .ref-save-btn:hover { opacity: 0.9; }
3017
- .ref-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
3018
-
3019
- /* ── Activity pinned operation (at top of activity feed) ── */
3020
- .activity-pinned {
3021
- padding: 10px 16px;
3022
- background: var(--executing-bg);
3023
- border-bottom: 1px solid var(--executing-border);
3024
- display: flex;
3025
- align-items: center;
3026
- gap: 8px;
3027
- font-size: 12px;
3028
- color: var(--executing-color);
3029
- font-weight: 600;
3030
- letter-spacing: 0.02em;
3031
- flex-shrink: 0;
3032
- }
3033
- .activity-pinned .pinned-spinner {
3034
- width: 10px;
3035
- height: 10px;
3036
- border: 2px solid var(--border);
3037
- border-top-color: var(--executing-color);
3038
- border-radius: 50%;
3039
- animation: spin 0.7s linear infinite;
3040
- flex-shrink: 0;
3041
- }
3042
-
3043
- /* ── Agent activity cards ── */
3044
- .agent-card {
3045
- background: var(--surface2);
3046
- border: 1px solid var(--border);
3047
- border-radius: var(--radius);
3048
- padding: 10px 12px;
3049
- display: flex;
3050
- flex-direction: column;
3051
- gap: 6px;
3052
- transition: background 0.15s;
3053
- }
3054
- .agent-card:hover { background: var(--surface3); }
3055
- .agent-card.status-running { border-left: 3px solid var(--executing-color); }
3056
- .agent-card.status-complete,
3057
- .agent-card.status-done { border-left: 3px solid var(--act-color); opacity: 0.8; }
3058
- .agent-card.status-failed { border-left: 3px solid var(--broken-color); opacity: 0.8; }
3059
- .agent-card-header {
3060
- display: flex;
3061
- align-items: center;
3062
- gap: 8px;
3063
- }
3064
- .agent-card-icon {
3065
- font-size: 14px;
3066
- flex-shrink: 0;
3067
- width: 20px;
3068
- text-align: center;
3069
- }
3070
- .agent-card-target {
3071
- font-size: 12px;
3072
- font-weight: 600;
3073
- color: var(--text-bright);
3074
- overflow: hidden;
3075
- text-overflow: ellipsis;
3076
- white-space: nowrap;
3077
- flex: 1;
3078
- }
3079
- .agent-card-badge {
3080
- font-size: 10px;
3081
- font-weight: 700;
3082
- letter-spacing: 0.04em;
3083
- text-transform: uppercase;
3084
- padding: 2px 6px;
3085
- border-radius: 3px;
3086
- flex-shrink: 0;
3087
- }
3088
- .agent-card-badge.badge-running { color: var(--executing-color); background: var(--executing-bg); }
3089
- .agent-card-badge.badge-complete,
3090
- .agent-card-badge.badge-done { color: var(--act-color); background: var(--act-bg); }
3091
- .agent-card-badge.badge-failed { color: var(--broken-color); background: var(--broken-bg); }
3092
- .agent-card-meta {
3093
- display: flex;
3094
- align-items: center;
3095
- gap: 8px;
3096
- font-size: 11px;
3097
- color: var(--text-dim);
3098
- }
3099
- .agent-card-type { text-transform: capitalize; }
3100
- .agent-card-timer {
3101
- font-family: 'SF Mono', 'Fira Code', monospace;
3102
- font-size: 11px;
3103
- color: var(--text-dim);
3104
- }
3105
- .status-running .agent-card-timer { color: var(--executing-color); }
3106
- .agent-card-error {
3107
- font-size: 11px;
3108
- color: var(--broken-color);
3109
- margin-top: 2px;
3110
- overflow: hidden;
3111
- text-overflow: ellipsis;
3112
- white-space: nowrap;
3113
- }
3114
- .agent-card-summary {
3115
- font-size: 12px;
3116
- color: var(--text-dim);
3117
- margin-top: 4px;
3118
- white-space: nowrap;
3119
- overflow: hidden;
3120
- text-overflow: ellipsis;
3121
- }
3122
- .agent-card-view-result {
3123
- display: inline-block;
3124
- margin-top: 6px;
3125
- padding: 3px 10px;
3126
- font-size: 11px;
3127
- font-weight: 500;
3128
- color: var(--act-color);
3129
- background: transparent;
3130
- border: 1px solid var(--act-color);
3131
- border-radius: 4px;
3132
- cursor: pointer;
3133
- transition: background 0.15s, color 0.15s;
3134
- align-self: flex-start;
3135
- }
3136
- .agent-card-view-result:hover {
3137
- background: var(--act-color);
3138
- color: var(--surface1);
3139
- }
3140
-
3141
- /* ── Discuss (interview) flow ── */
3142
- .discuss-container {
3143
- margin-top: 8px;
3144
- border: 1px solid var(--border);
3145
- border-radius: var(--radius);
3146
- padding: 10px;
3147
- background: var(--surface2);
3148
- }
3149
- .discuss-loading { display: flex; flex-direction: column; gap: 8px; }
3150
- .discuss-streaming {
3151
- font-family: 'SF Mono', 'Fira Code', monospace;
3152
- font-size: 11px;
3153
- color: var(--executing-color);
3154
- max-height: 120px;
3155
- overflow-y: auto;
3156
- white-space: pre-wrap;
3157
- word-break: break-word;
3158
- margin: 0;
3159
- }
3160
- .discuss-header {
3161
- font-size: 12px;
3162
- font-weight: 600;
3163
- color: var(--text-bright);
3164
- margin-bottom: 8px;
3165
- }
3166
- .discuss-q {
3167
- margin-bottom: 10px;
3168
- padding-bottom: 8px;
3169
- border-bottom: 1px solid var(--border);
3170
- }
3171
- .discuss-q:last-of-type { border-bottom: none; }
3172
- .discuss-q-label {
3173
- font-size: 12px;
3174
- font-weight: 600;
3175
- color: var(--text-bright);
3176
- display: block;
3177
- margin-bottom: 4px;
3178
- }
3179
- .discuss-q-context {
3180
- font-size: 11px;
3181
- color: var(--text-dim);
3182
- margin-bottom: 6px;
3183
- font-style: italic;
3184
- }
3185
- .discuss-q-options {
3186
- display: flex;
3187
- flex-wrap: wrap;
3188
- gap: 4px;
3189
- margin-bottom: 6px;
3190
- }
3191
- .discuss-option-btn {
3192
- padding: 3px 10px;
3193
- font-size: 11px;
3194
- border: 1px solid var(--border);
3195
- border-radius: 4px;
3196
- background: var(--surface3);
3197
- color: var(--text-muted);
3198
- cursor: pointer;
3199
- }
3200
- .discuss-option-btn:hover {
3201
- border-color: var(--accent);
3202
- color: var(--accent);
3203
- }
3204
- .discuss-q-input {
3205
- width: 100%;
3206
- background: var(--surface1);
3207
- border: 1px solid var(--border);
3208
- border-radius: 4px;
3209
- color: var(--text-bright);
3210
- font-size: 12px;
3211
- padding: 6px 8px;
3212
- resize: vertical;
3213
- font-family: inherit;
3214
- }
3215
- .discuss-q-input:focus {
3216
- outline: none;
3217
- border-color: var(--accent);
3218
- }
3219
- .discuss-actions {
3220
- display: flex;
3221
- gap: 8px;
3222
- margin-top: 10px;
3223
- }
3224
- .discuss-error {
3225
- font-size: 12px;
3226
- color: var(--text-muted);
3227
- margin-bottom: 8px;
3228
- }
3229
- .agent-timer-final {
3230
- color: var(--text-muted);
3231
- }
3232
-
3233
- /* ── Classification toggle buttons ── */
3234
- .classify-btn {
3235
- background: var(--surface2);
3236
- border: 1px solid var(--border);
3237
- color: var(--text-dim);
3238
- padding: 4px 12px;
3239
- border-radius: 6px;
3240
- font-size: 11px;
3241
- font-weight: 600;
3242
- cursor: pointer;
3243
- transition: background 0.15s, border-color 0.15s, color 0.15s;
3244
- }
3245
- .classify-btn:hover { background: #252535; border-color: #3a3a50; color: var(--text); }
3246
- .classify-btn.active {
3247
- background: var(--mile-bg);
3248
- border-color: var(--mile-border);
3249
- color: var(--mile-color);
3250
- }
3251
-
3252
- /* ── Classification icon on nodes ── */
3253
- .class-icon {
3254
- font-size: 10px;
3255
- margin-right: 4px;
3256
- vertical-align: middle;
3257
- }
3258
-
3259
- /* ── Readiness badges on milestone nodes ── */
3260
- .readiness-badge {
3261
- display: inline-block;
3262
- font-size: 9px;
3263
- font-weight: 600;
3264
- letter-spacing: 0.5px;
3265
- padding: 1px 6px;
3266
- border-radius: 8px;
3267
- margin-left: 4px;
3268
- vertical-align: middle;
3269
- }
3270
- .readiness-ready {
3271
- background: rgba(52, 211, 153, 0.15);
3272
- color: #34d399;
3273
- border: 1px solid rgba(52, 211, 153, 0.3);
3274
- }
3275
- .readiness-blocked {
3276
- background: rgba(255, 77, 109, 0.15);
3277
- color: #ff4d6d;
3278
- border: 1px solid rgba(255, 77, 109, 0.3);
3279
- }
3280
- .readiness-no-actions {
3281
- background: rgba(110, 110, 136, 0.15);
3282
- color: #6e6e88;
3283
- border: 1px solid rgba(110, 110, 136, 0.3);
3284
- }
3285
-
3286
- /* ── Dependency indicator on nodes ── */
3287
- .dep-indicator {
3288
- font-size: 9px;
3289
- margin-left: 5px;
3290
- padding: 1px 5px;
3291
- border-radius: 8px;
3292
- background: rgba(255,255,255,0.06);
3293
- color: var(--text-dim);
3294
- vertical-align: middle;
3295
- }
3296
-
3297
- /* ── Dependency tags in detail panel ── */
3298
- .dep-tag {
3299
- display: inline-flex;
3300
- align-items: center;
3301
- gap: 4px;
3302
- padding: 3px 8px;
3303
- border-radius: 6px;
3304
- font-size: 11px;
3305
- font-weight: 500;
3306
- background: var(--mile-bg);
3307
- border: 1px solid var(--mile-border);
3308
- color: var(--mile-color);
3309
- cursor: pointer;
3310
- transition: border-color 0.12s;
3311
- }
3312
- .dep-tag:hover { border-color: var(--mile-color); }
3313
- .dep-remove {
3314
- font-size: 13px;
3315
- line-height: 1;
3316
- opacity: 0.5;
3317
- cursor: pointer;
3318
- transition: opacity 0.12s;
3319
- }
3320
- .dep-remove:hover { opacity: 1; color: var(--broken-color); }
3321
-
3322
- /* ── Dependency edges in DAG ── */
3323
- .edge.dep-edge {
3324
- stroke: var(--mile-color);
3325
- stroke-dasharray: 6 4;
3326
- opacity: 0.4;
3327
- }
3328
- .edge.dep-edge.highlight {
3329
- opacity: 0.8;
3330
- }
3331
-
3332
- /* ── Review state badges ── */
3333
- .review-badge {
3334
- display: inline-block;
3335
- padding: 2px 7px;
3336
- border-radius: 99px;
3337
- font-size: 10px;
3338
- font-weight: 600;
3339
- letter-spacing: 0.02em;
3340
- text-transform: uppercase;
3341
- cursor: pointer;
3342
- user-select: none;
3343
- transition: opacity 0.15s;
3344
- }
3345
- .review-badge:hover { opacity: 0.8; }
3346
- .review-draft { background: rgba(255,255,255,0.05); color: var(--text-dim); border: 1px solid var(--border); }
3347
- .review-in_review { background: rgba(147,197,253,0.1); color: #93c5fd; border: 1px solid rgba(147,197,253,0.25); }
3348
- .review-revision_needed { background: rgba(251,191,36,0.1); color: #fbbf24; border: 1px solid rgba(251,191,36,0.25); }
3349
- .review-approved { background: rgba(134,239,172,0.1); color: #86efac; border: 1px solid rgba(134,239,172,0.25); }
3350
-
3351
- /* ── Annotation panel ── */
3352
- .annotation-panel {
3353
- margin-top: 20px;
3354
- border-top: 1px solid var(--border);
3355
- padding-top: 16px;
3356
- }
3357
- .annotation-count {
3358
- font-size: 10px;
3359
- color: var(--text-dim);
3360
- font-weight: 400;
3361
- }
3362
- .annotation-lines {
3363
- font-family: 'SF Mono', 'Fira Code', monospace;
3364
- font-size: 11px;
3365
- line-height: 1.6;
3366
- background: var(--bg);
3367
- border: 1px solid var(--border);
3368
- border-radius: 6px;
3369
- padding: 8px 0;
3370
- max-height: 400px;
3371
- overflow-y: auto;
3372
- }
3373
- .ann-line {
3374
- display: flex;
3375
- padding: 0 10px;
3376
- }
3377
- .ann-line:hover {
3378
- background: var(--surface2);
3379
- }
3380
- .ann-line-num {
3381
- color: var(--text-dim);
3382
- opacity: 0.5;
3383
- min-width: 32px;
3384
- text-align: right;
3385
- padding-right: 10px;
3386
- cursor: pointer;
3387
- user-select: none;
3388
- }
3389
- .ann-line-num:hover {
3390
- opacity: 1;
3391
- color: #60a5fa;
3392
- }
3393
- .ann-line-text {
3394
- white-space: pre;
3395
- overflow-x: auto;
3396
- flex: 1;
3397
- }
3398
- .ann-line.has-annotation {
3399
- background: rgba(234, 179, 8, 0.08);
3400
- border-left: 2px solid #eab308;
3401
- }
3402
- .ann-comment {
3403
- display: flex;
3404
- align-items: center;
3405
- gap: 8px;
3406
- padding: 4px 10px 4px 42px;
3407
- background: rgba(234, 179, 8, 0.06);
3408
- border-left: 2px solid #eab308;
3409
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3410
- font-size: 11px;
3411
- }
3412
- .ann-comment-text {
3413
- flex: 1;
3414
- color: #eab308;
3415
- }
3416
- .ann-comment-meta {
3417
- font-size: 9px;
3418
- color: var(--text-dim);
3419
- opacity: 0.6;
3420
- }
3421
- .ann-resolve-btn {
3422
- background: none;
3423
- border: none;
3424
- color: var(--text-dim);
3425
- cursor: pointer;
3426
- font-size: 14px;
3427
- padding: 0 4px;
3428
- opacity: 0.5;
3429
- }
3430
- .ann-resolve-btn:hover {
3431
- opacity: 1;
3432
- color: var(--broken-color);
3433
- }
3434
- .ann-input-row {
3435
- display: flex;
3436
- gap: 6px;
3437
- padding: 4px 10px 4px 42px;
3438
- background: rgba(96, 165, 250, 0.06);
3439
- }
3440
- .ann-input {
3441
- flex: 1;
3442
- background: var(--surface);
3443
- border: 1px solid var(--border);
3444
- color: var(--text);
3445
- border-radius: 4px;
3446
- padding: 4px 8px;
3447
- font-size: 11px;
3448
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
3449
- }
3450
- .ann-input:focus {
3451
- outline: none;
3452
- border-color: #60a5fa;
3453
- }
3454
- .ann-submit-btn {
3455
- background: #60a5fa;
3456
- color: #000;
3457
- border: none;
3458
- border-radius: 4px;
3459
- padding: 4px 10px;
3460
- font-size: 10px;
3461
- font-weight: 700;
3462
- cursor: pointer;
3463
- }
3464
- .ann-submit-btn:hover {
3465
- background: #93bbfd;
3466
- }
3467
- .ann-show-more-btn {
3468
- display: block;
3469
- width: 100%;
3470
- background: none;
3471
- border: none;
3472
- border-top: 1px solid var(--border);
3473
- color: var(--text-dim);
3474
- padding: 6px;
3475
- font-size: 10px;
3476
- cursor: pointer;
3477
- text-align: center;
3478
- }
3479
- .ann-show-more-btn:hover {
3480
- color: var(--text);
3481
- background: var(--surface2);
3482
- }
3483
- .ann-no-artifact {
3484
- color: var(--text-dim);
3485
- font-size: 11px;
3486
- opacity: 0.5;
3487
- font-style: italic;
3488
- padding: 8px 0;
3489
- }
3490
- .ann-approve-section {
3491
- display: flex;
3492
- align-items: center;
3493
- gap: 12px;
3494
- margin-top: 12px;
3495
- padding: 10px 12px;
3496
- background: rgba(34, 197, 94, 0.08);
3497
- border: 1px solid rgba(34, 197, 94, 0.3);
3498
- border-radius: 6px;
3499
- }
3500
- .ann-approve-msg {
3501
- flex: 1;
3502
- font-size: 11px;
3503
- color: #22c55e;
3504
- font-weight: 500;
3505
- }
3506
- .ann-approve-btn {
3507
- background: #22c55e;
3508
- color: #000;
3509
- border: none;
3510
- border-radius: 4px;
3511
- padding: 6px 16px;
3512
- font-size: 11px;
3513
- font-weight: 700;
3514
- cursor: pointer;
3515
- text-transform: uppercase;
3516
- letter-spacing: 0.05em;
3517
- }
3518
- .ann-approve-btn:hover {
3519
- background: #4ade80;
3520
- }
3521
-
3522
- /* ── Revision round badge ── */
3523
- .revision-round-badge {
3524
- background: #e8e0ff;
3525
- color: #5b21b6;
3526
- font-size: 11px;
3527
- padding: 2px 8px;
3528
- border-radius: 10px;
3529
- font-weight: 600;
3530
- margin-left: 8px;
3531
- }
3532
-
3533
- /* ── Revision request button and output panel ── */
3534
- .ann-revise-section {
3535
- padding: 12px 8px;
3536
- border-top: 1px solid #e5e7eb;
3537
- margin-top: 8px;
3538
- }
3539
- .ann-revise-btn {
3540
- background: #7c3aed;
3541
- color: white;
3542
- border: none;
3543
- padding: 8px 16px;
3544
- border-radius: 6px;
3545
- cursor: pointer;
3546
- font-weight: 600;
3547
- width: 100%;
3548
- font-size: 12px;
3549
- }
3550
- .ann-revise-btn:hover {
3551
- background: #6d28d9;
3552
- }
3553
- .ann-revise-btn:disabled {
3554
- opacity: 0.6;
3555
- cursor: not-allowed;
3556
- }
3557
- .ann-revise-hint {
3558
- font-size: 11px;
3559
- color: #6b7280;
3560
- margin-top: 4px;
3561
- text-align: center;
3562
- }
3563
- #revision-panel {
3564
- background: #1e1b2e;
3565
- border-radius: 8px;
3566
- padding: 12px;
3567
- margin-top: 12px;
3568
- }
3569
- .revision-panel-header {
3570
- color: #c4b5fd;
3571
- font-weight: 600;
3572
- margin-bottom: 8px;
3573
- font-size: 13px;
3574
- }
3575
- #revision-output {
3576
- background: #0f0d1a;
3577
- color: #e2e8f0;
3578
- font-size: 11px;
3579
- font-family: monospace;
3580
- padding: 8px;
3581
- border-radius: 4px;
3582
- max-height: 300px;
3583
- overflow-y: auto;
3584
- white-space: pre-wrap;
3585
- word-break: break-word;
3586
- }
3587
- .revision-stop-btn {
3588
- background: #ef4444;
3589
- color: white;
3590
- border: none;
3591
- padding: 4px 12px;
3592
- border-radius: 4px;
3593
- cursor: pointer;
3594
- margin-top: 8px;
3595
- font-size: 12px;
3596
- }
3597
- .revision-stop-btn:hover {
3598
- background: #dc2626;
3599
- }
3600
-
3601
- /* ── Diff view ── */
3602
- .ann-diff-toggle {
3603
- background: transparent;
3604
- border: 1px solid #7c3aed;
3605
- color: #7c3aed;
3606
- font-size: 11px;
3607
- padding: 2px 8px;
3608
- border-radius: 4px;
3609
- cursor: pointer;
3610
- margin-left: 8px;
3611
- }
3612
- .ann-diff-toggle:hover {
3613
- background: #7c3aed;
3614
- color: white;
3615
- }
3616
- .diff-view {
3617
- font-family: 'SF Mono', 'Fira Code', monospace;
3618
- font-size: 11px;
3619
- overflow-x: auto;
3620
- max-height: 500px;
3621
- overflow-y: auto;
3622
- border-radius: 4px;
3623
- border: 1px solid var(--border);
3624
- }
3625
- .diff-header {
3626
- padding: 8px 12px;
3627
- background: var(--surface2);
3628
- border-bottom: 1px solid var(--border);
3629
- display: flex;
3630
- justify-content: space-between;
3631
- align-items: center;
3632
- font-weight: 600;
3633
- font-size: 12px;
3634
- color: var(--text-bright);
3635
- }
3636
- .diff-line {
3637
- display: flex;
3638
- padding: 0 8px;
3639
- min-height: 20px;
3640
- line-height: 20px;
3641
- }
3642
- .diff-line.diff-add {
3643
- background: rgba(34, 197, 94, 0.12);
3644
- }
3645
- .diff-line.diff-remove {
3646
- background: rgba(239, 68, 68, 0.12);
3647
- }
3648
- .diff-line.diff-same {
3649
- background: transparent;
3650
- }
3651
- .diff-gutter {
3652
- width: 35px;
3653
- text-align: right;
3654
- padding-right: 8px;
3655
- color: var(--text-dim);
3656
- user-select: none;
3657
- flex-shrink: 0;
3658
- font-size: 10px;
3659
- opacity: 0.5;
3660
- }
3661
- .diff-gutter-old {}
3662
- .diff-gutter-new {}
3663
- .diff-text {
3664
- flex: 1;
3665
- white-space: pre-wrap;
3666
- word-break: break-all;
3667
- }
3668
- .diff-prefix {
3669
- width: 16px;
3670
- text-align: center;
3671
- flex-shrink: 0;
3672
- font-weight: bold;
3673
- }
3674
- .diff-prefix.diff-add {
3675
- color: #22c55e;
3676
- }
3677
- .diff-prefix.diff-remove {
3678
- color: #ef4444;
3679
- }
3680
- .diff-close-btn {
3681
- background: transparent;
3682
- border: 1px solid var(--text-dim);
3683
- color: var(--text-dim);
3684
- font-size: 11px;
3685
- padding: 2px 8px;
3686
- border-radius: 4px;
3687
- cursor: pointer;
3688
- }
3689
- .diff-close-btn:hover {
3690
- border-color: var(--text-bright);
3691
- color: var(--text-bright);
3692
- }
3693
-
3694
- /* ── Readiness banner ── */
3695
- #readiness-banner {
3696
- display: none;
3697
- padding: 8px 16px;
3698
- background: var(--surface);
3699
- border-bottom: 1px solid var(--border);
3700
- font-size: 13px;
3701
- gap: 8px;
3702
- align-items: center;
3703
- flex-wrap: wrap;
3704
- flex-shrink: 0;
3705
- }
3706
- #readiness-banner.active { display: flex; }
3707
- .rb-progress { font-weight: 600; color: var(--text); }
3708
- .rb-remaining { color: var(--text-dim); }
3709
- .rb-complete { color: var(--act-color); font-weight: 600; }
3710
- .rb-link {
3711
- color: var(--act-color);
3712
- cursor: pointer;
3713
- text-decoration: underline;
3714
- margin: 0 2px;
3715
- font-size: 12px;
3716
- }
3717
- .rb-link:hover { opacity: 0.8; }
3718
- .rb-more { color: var(--text-dim); font-size: 12px; }
3719
- .enter-exec-btn {
3720
- margin-left: 8px;
3721
- padding: 7px 20px;
3722
- border: none;
3723
- border-radius: var(--radius);
3724
- font-weight: 600;
3725
- font-size: 13px;
3726
- cursor: pointer;
3727
- background: var(--accent);
3728
- color: #111;
3729
- transition: opacity 0.15s, transform 0.1s;
3730
- }
3731
- .enter-exec-btn:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
3732
- .enter-exec-btn:active:not(:disabled) { transform: scale(0.98); }
3733
- .enter-exec-btn:disabled {
3734
- opacity: 0.3;
3735
- cursor: not-allowed;
3736
- }
3737
-
3738
- /* ── Review action buttons ── */
3739
- .review-actions {
3740
- display: flex; gap: 8px; align-items: center;
3741
- margin: 12px 0; padding: 10px;
3742
- background: var(--surface1, var(--surface));
3743
- border-radius: 6px;
3744
- border: 1px solid var(--border);
3745
- }
3746
- .ra-btn {
3747
- padding: 6px 14px; border-radius: 4px; border: 1px solid var(--border);
3748
- cursor: pointer; font-size: 13px; font-weight: 500;
3749
- background: var(--surface2, var(--surface)); color: var(--text);
3750
- transition: background 0.15s, border-color 0.15s;
3751
- }
3752
- .ra-btn:hover { opacity: 0.85; }
3753
- .ra-approve.ra-active { background: var(--done-bg); color: var(--done-color); border-color: var(--done-border); }
3754
- .ra-revision.ra-active { background: var(--broken-bg); color: var(--broken-color); border-color: var(--broken-border); }
3755
- .ra-state { font-size: 12px; color: var(--text-dim); margin-left: auto; }
3756
-
3757
- /* ── Execution pipeline view ── */
3758
- #execution-view {
3759
- display: none;
3760
- width: 100%;
3761
- height: 100%;
3762
- background: var(--bg);
3763
- padding-right: var(--panel-width);
3764
- }
3765
- #execution-view.active { display: flex; flex-direction: column; }
3766
- .exec-content { display: flex; flex-direction: row; flex: 1; overflow: hidden; }
3767
-
3768
- .exec-left-panel {
3769
- width: 340px;
3770
- flex-shrink: 0;
3771
- overflow-y: auto;
3772
- border-right: 1px solid var(--border);
3773
- padding: 16px;
3774
- }
3775
-
3776
- .exec-pipeline { }
3777
-
3778
- .exec-output-panel {
3779
- flex: 1;
3780
- display: flex;
3781
- flex-direction: column;
3782
- overflow: hidden;
3783
- }
3784
- .exec-output-header {
3785
- height: 36px;
3786
- flex-shrink: 0;
3787
- display: flex;
3788
- align-items: center;
3789
- padding: 0 16px;
3790
- background: var(--surface);
3791
- border-bottom: 1px solid var(--border);
3792
- font-size: 12px;
3793
- color: var(--text-dim);
3794
- }
3795
- .exec-output-log {
3796
- flex: 1;
3797
- overflow-y: auto;
3798
- padding: 12px 16px;
3799
- font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
3800
- font-size: 12px;
3801
- line-height: 1.6;
3802
- color: var(--text);
3803
- white-space: pre-wrap;
3804
- word-break: break-all;
3805
- background: var(--bg);
3806
- margin: 0;
3807
- }
3808
- .exec-output-empty {
3809
- color: var(--text-dim);
3810
- font-size: 13px;
3811
- padding: 40px;
3812
- text-align: center;
3813
- }
3814
-
3815
- .exec-wave-label {
3816
- font-size: 11px;
3817
- color: var(--text-dim);
3818
- margin-bottom: 4px;
3819
- padding-left: 4px;
3820
- margin-top: 16px;
3821
- }
3822
- .exec-wave-label:first-child { margin-top: 0; }
3823
-
3824
- .exec-milestone-group {
3825
- margin-bottom: 16px;
3826
- }
3827
-
3828
- .exec-milestone-header {
3829
- font-weight: 600;
3830
- color: var(--mile-color);
3831
- padding: 8px 12px;
3832
- background: var(--mile-bg);
3833
- border: 1px solid var(--mile-border);
3834
- border-radius: 6px;
3835
- font-size: 14px;
3836
- display: flex;
3837
- align-items: center;
3838
- gap: 8px;
3839
- }
3840
- .exec-milestone-header .exec-milestone-status {
3841
- font-size: 10px;
3842
- font-weight: 700;
3843
- letter-spacing: 0.05em;
3844
- text-transform: uppercase;
3845
- padding: 2px 8px;
3846
- border-radius: 8px;
3847
- background: rgba(255,255,255,0.06);
3848
- margin-left: auto;
3849
- flex-shrink: 0;
3850
- }
3851
-
3852
- .exec-action-list {
3853
- margin-left: 20px;
3854
- border-left: 2px solid var(--border);
3855
- padding-left: 16px;
3856
- }
3857
-
3858
- .exec-action-item {
3859
- display: flex;
3860
- align-items: center;
3861
- gap: 10px;
3862
- padding: 8px 12px;
3863
- margin: 4px 0;
3864
- background: var(--surface);
3865
- border: 1px solid var(--border);
3866
- border-radius: 4px;
3867
- cursor: pointer;
3868
- font-size: 13px;
3869
- transition: background 0.15s, border-color 0.15s;
3870
- }
3871
- .exec-action-item:hover { background: var(--surface2); }
3872
- .exec-action-item.active {
3873
- border-color: var(--executing-border);
3874
- background: var(--executing-bg);
3875
- }
3876
-
3877
- .exec-status-dot {
3878
- width: 10px;
3879
- height: 10px;
3880
- border-radius: 50%;
3881
- flex-shrink: 0;
3882
- transition: background 0.3s ease, box-shadow 0.3s ease;
3883
- }
3884
- .exec-status-dot.queued { background: #555; }
3885
- .exec-status-dot.running { background: var(--planned-color); animation: exec-pulse 1.5s ease-in-out infinite; }
3886
- .exec-status-dot.done { background: var(--act-color); animation: dotComplete 0.3s ease; }
3887
- .exec-status-dot.failed { background: var(--broken-color); animation: dotComplete 0.3s ease; }
3888
-
3889
- @keyframes exec-pulse {
3890
- 0%, 100% { opacity: 1; }
3891
- 50% { opacity: 0.3; }
3892
- }
3893
-
3894
- @keyframes dotComplete {
3895
- 0% { transform: scale(1); }
3896
- 50% { transform: scale(1.3); }
3897
- 100% { transform: scale(1); }
3898
- }
3899
-
3900
- .exec-action-title {
3901
- flex: 1;
3902
- color: var(--text);
3903
- overflow: hidden;
3904
- text-overflow: ellipsis;
3905
- white-space: nowrap;
3906
- }
3907
-
3908
- .exec-action-status-label {
3909
- font-size: 11px;
3910
- color: var(--text-dim);
3911
- text-transform: uppercase;
3912
- flex-shrink: 0;
3913
- }
3914
-
3915
- /* ── Execution mode: hide all edit controls ── */
3916
- body.exec-mode #new-decl-btn { display: none; }
3917
- body.exec-mode #play-btn { display: none; }
3918
- body.exec-mode #workflow-banner { display: none; }
3919
- body.exec-mode #readiness-banner { display: none; }
3920
- body.exec-mode #side-panel { display: none; }
3921
- body.exec-mode #activity-feed { display: none; }
3922
- body.exec-mode #view-toggle { display: none; }
3923
- body.exec-mode #execution-view { padding-right: 0; }
3924
-
3925
- /* ── Execution topbar ── */
3926
- .exec-topbar {
3927
- display: none;
3928
- align-items: center;
3929
- gap: 12px;
3930
- padding: 0 16px;
3931
- height: 36px;
3932
- background: var(--surface);
3933
- border-bottom: 1px solid var(--border);
3934
- flex-shrink: 0;
3935
- }
3936
- body.exec-mode .exec-topbar { display: flex; }
3937
- body:not(.exec-mode) .exec-topbar { display: none; }
3938
- .exec-topbar-title {
3939
- font-size: 13px;
3940
- font-weight: 600;
3941
- color: var(--text-bright);
3942
- flex-shrink: 0;
3943
- }
3944
- .exec-exit-btn {
3945
- padding: 4px 12px;
3946
- border-radius: 4px;
3947
- border: 1px solid var(--border);
3948
- background: var(--surface2);
3949
- color: var(--text);
3950
- cursor: pointer;
3951
- font-size: 12px;
3952
- }
3953
- .exec-exit-btn:hover { background: var(--border); }
3954
- .exec-stop-btn {
3955
- padding: 4px 12px;
3956
- border-radius: 4px;
3957
- border: 1px solid var(--broken-border);
3958
- background: var(--broken-bg);
3959
- color: var(--broken-color);
3960
- cursor: pointer;
3961
- font-size: 12px;
3962
- font-weight: 600;
3963
- }
3964
- .exec-stop-btn:hover { opacity: 0.85; }
3965
-
3966
- /* ── Execution progress bar ── */
3967
- .exec-progress-container {
3968
- height: 6px;
3969
- background: var(--bg);
3970
- border-radius: 3px;
3971
- flex: 1;
3972
- margin: 0 16px;
3973
- min-width: 120px;
3974
- }
3975
- .exec-progress-fill {
3976
- height: 100%;
3977
- background: var(--decl-color);
3978
- border-radius: 3px;
3979
- transition: width 0.3s ease;
3980
- width: 0;
3981
- }
3982
- .exec-progress-pct {
3983
- font-size: 13px;
3984
- color: var(--text-dim);
3985
- min-width: 40px;
3986
- text-align: right;
3987
- }
3988
-
3989
- /* ── Pre-execution wave order view ── */
3990
- .exec-preorder-list {
3991
- list-style: none;
3992
- padding: 0;
3993
- margin: 0;
3994
- counter-reset: wave-counter;
3995
- }
3996
- .exec-preorder-wave {
3997
- border-left: 3px solid var(--planned-color);
3998
- padding: 12px 16px;
3999
- margin-bottom: 16px;
4000
- }
4001
- .exec-preorder-wave-header {
4002
- font-size: 13px;
4003
- font-weight: 700;
4004
- color: var(--text);
4005
- margin-bottom: 8px;
4006
- }
4007
- .exec-preorder-milestone {
4008
- padding: 6px 12px;
4009
- font-size: 13px;
4010
- color: var(--mile-color);
4011
- }
4012
- .exec-preorder-action {
4013
- padding: 4px 12px 4px 24px;
4014
- font-size: 12px;
4015
- color: var(--text-dim);
4016
- display: flex;
4017
- align-items: center;
4018
- gap: 8px;
4019
- }
4020
- .exec-confirm-btn {
4021
- background: var(--act-color);
4022
- color: white;
4023
- border: none;
4024
- padding: 10px 24px;
4025
- border-radius: 6px;
4026
- font-size: 14px;
4027
- font-weight: 600;
4028
- cursor: pointer;
4029
- margin-top: 20px;
4030
- width: 100%;
4031
- }
4032
- .exec-confirm-btn:hover { opacity: 0.9; }
4033
-
4034
- /* ── Drag-to-reorder feedback ── */
4035
- .exec-dragging { opacity: 0.4; outline: 2px dashed var(--planned-color); }
4036
- .exec-drop-valid { outline: 2px solid var(--act-color); background: rgba(52, 211, 153, 0.08); }
4037
- .exec-drop-invalid { outline: 2px solid var(--broken-color); opacity: 0.5; cursor: no-drop; }
4038
- .exec-preorder-milestone[draggable="true"],
4039
- .exec-preorder-action[draggable="true"] { cursor: grab; }
4040
- .exec-preorder-milestone[draggable="true"]:active,
4041
- .exec-preorder-action[draggable="true"]:active { cursor: grabbing; }
4042
- .exec-preorder-milestone[draggable="true"]::before,
4043
- .exec-preorder-action[draggable="true"]::before {
4044
- content: "\22EE\22EE";
4045
- color: var(--text-dim);
4046
- margin-right: 6px;
4047
- font-size: 11px;
4048
- letter-spacing: -3px;
4049
- }
4050
-
4051
- /* ── Failure modal ── */
4052
- .exec-failure-overlay {
4053
- position: fixed;
4054
- inset: 0;
4055
- background: rgba(0,0,0,0.6);
4056
- z-index: 1000;
4057
- display: flex;
4058
- align-items: center;
4059
- justify-content: center;
4060
- }
4061
- .exec-failure-modal {
4062
- background: var(--bg-card, #1e1e1e);
4063
- border: 1px solid var(--border, #333);
4064
- border-radius: 8px;
4065
- padding: 24px;
4066
- max-width: 420px;
4067
- width: 90%;
4068
- box-shadow: 0 8px 32px rgba(0,0,0,0.4);
4069
- }
4070
- .exec-failure-title {
4071
- font-size: 16px;
4072
- font-weight: 600;
4073
- color: #ff6b6b;
4074
- margin-bottom: 12px;
4075
- }
4076
- .exec-failure-details {
4077
- font-size: 13px;
4078
- color: var(--text-dim);
4079
- margin-bottom: 20px;
4080
- font-family: monospace;
4081
- white-space: pre-line;
4082
- }
4083
- .exec-failure-actions {
4084
- display: flex;
4085
- gap: 10px;
4086
- flex-wrap: wrap;
4087
- }
4088
- .exec-failure-btn {
4089
- padding: 8px 16px;
4090
- border-radius: 4px;
4091
- border: none;
4092
- cursor: pointer;
4093
- font-size: 13px;
4094
- font-weight: 500;
4095
- }
4096
- .exec-failure-btn.view-output {
4097
- background: transparent;
4098
- color: var(--accent, #4a9eff);
4099
- border: 1px solid var(--accent, #4a9eff);
4100
- }
4101
- .exec-failure-btn.skip {
4102
- background: #e8a838;
4103
- color: #000;
4104
- }
4105
- .exec-failure-btn.stop {
4106
- background: #ff4444;
4107
- color: #fff;
4108
- }
4109
- .exec-failure-btn:hover { opacity: 0.85; }
4110
-
4111
- </style>
4112
- </head>
4113
- <body>
4114
-
4115
- <!-- Status bar — project name + breadcrumb + nav | integrity + next/execute -->
4116
- <div id="status-bar">
4117
- <span class="project-name" id="project-name">Declare</span>
4118
- <div id="status-breadcrumb"></div>
4119
- <button id="view-toggle" title="Toggle graph view">
4120
- <span id="view-toggle-label">&#x2B13;</span>
4121
- </button>
4122
- <div class="status-right">
4123
- <span class="status-pill" id="integrity-pill"><span class="pill-value">–</span></span>
4124
- <button id="execute-main-btn">Next</button>
4125
- </div>
4126
- <button id="new-decl-btn" class="new-decl-btn" style="display:none">+ Declaration</button>
4127
- <button id="play-btn" class="play-btn" title="Execute all ready agent milestones in dependency order" style="display:none">Play All</button>
4128
- </div>
4129
- <!-- Hidden stat/compat elements -->
4130
- <span id="stat-decls" style="display:none">0</span>
4131
- <span id="stat-miles" style="display:none">0</span>
4132
- <span id="stat-acts" style="display:none">0</span>
4133
- <span id="health-badge" style="display:none"></span>
4134
- <span id="last-updated" style="display:none"></span>
4135
- <!-- Legacy workflow banner (hidden, rendered inside status bar now) -->
4136
- <div id="workflow-banner" style="display:none">
4137
- <span class="wf-state-label" id="wf-state-label"></span>
4138
- <div class="wf-progress-bar"><div class="wf-progress-fill" id="wf-progress-fill"></div></div>
4139
- <span class="wf-pct" id="wf-pct"></span>
4140
- <span class="wf-next-label" id="wf-next-label"></span>
4141
- <button class="wf-action-btn" id="wf-action-btn"></button>
4142
- </div>
4143
-
4144
- <!-- Play progress banner -->
4145
- <div id="play-banner">
4146
- <span class="play-wave-label" id="play-wave-label">Wave 0/0</span>
4147
- <div class="play-actions-list" id="play-actions-list"></div>
4148
- <button class="play-stop-btn" id="play-stop-btn">Stop</button>
4149
- </div>
4150
-
4151
- <!-- Main -->
4152
- <div id="main">
4153
- <div id="canvas-wrap" style="display:none">
4154
- <div id="canvas-container">
4155
- <svg id="edges-svg"></svg>
4156
- <div class="layer-section" id="layer-declarations">
4157
- <div class="layer-label">Declarations</div>
4158
- <div class="layer" id="nodes-declarations"></div>
4159
- </div>
4160
- <div class="layer-section" id="layer-milestones">
4161
- <div class="layer-label">Milestones</div>
4162
- <div class="layer" id="nodes-milestones"></div>
4163
- </div>
4164
- <div class="layer-section" id="layer-actions">
4165
- <div class="layer-label">Actions</div>
4166
- <div class="layer" id="nodes-actions"></div>
4167
- </div>
4168
- </div>
4169
- </div>
4170
-
4171
- <!-- Readiness banner — hidden, replaced by drill prompts -->
4172
- <div id="readiness-banner"></div>
4173
-
4174
- <!-- Drill browser — 3-panel drill-down: detail | list | activity -->
4175
- <div id="drill-browser" class="active">
4176
- <div id="drill-breadcrumb"></div>
4177
- <div id="drill-body">
4178
- <div id="drill-detail"></div>
4179
- <div id="drill-center">
4180
- <div id="drill-context"></div>
4181
- <div id="drill-list"></div>
4182
- <div id="drill-prompt"></div>
4183
- </div>
4184
- </div>
4185
- </div>
4186
-
4187
- <!-- Legacy column browser elements (hidden, kept for DOM ref compat) -->
4188
- <div id="column-browser" style="display:none">
4189
- <div id="col-decl-list"></div>
4190
- <div id="col-mile-list"></div>
4191
- <div id="col-act-list"></div>
4192
- </div>
4193
- <div id="decl-form-container" style="display:none"></div>
4194
- <button id="col-decl-add-btn" style="display:none"></button>
4195
-
4196
- <!-- Execution view — CI pipeline layout with live output panel -->
4197
- <div id="execution-view">
4198
- <div class="exec-topbar">
4199
- <span class="exec-topbar-title" id="exec-topbar-title">Execution Mode</span>
4200
- <span id="exec-wave-status" style="font-size:12px;color:var(--text-dim)"></span>
4201
- <div class="exec-progress-container"><div class="exec-progress-fill" id="exec-progress-fill"></div></div>
4202
- <span class="exec-progress-pct" id="exec-progress-pct"></span>
4203
- <button class="exec-stop-btn" id="exec-stop-btn">Stop</button>
4204
- <button class="exec-exit-btn" id="exec-exit-btn">Exit</button>
4205
- </div>
4206
- <div class="exec-content">
4207
- <div class="exec-left-panel">
4208
- <div class="exec-pipeline" id="exec-pipeline"></div>
4209
- </div>
4210
- <div class="exec-output-panel">
4211
- <div class="exec-output-header" id="exec-output-header">No action selected</div>
4212
- <pre class="exec-output-log" id="exec-output-log"></pre>
4213
- </div>
4214
- </div>
4215
- <div class="exec-failure-overlay" id="exec-failure-overlay" style="display:none;">
4216
- <div class="exec-failure-modal">
4217
- <div class="exec-failure-title">Action Failed</div>
4218
- <div class="exec-failure-details" id="exec-failure-details"></div>
4219
- <div class="exec-failure-actions">
4220
- <button class="exec-failure-btn view-output" id="exec-failure-view">View Output</button>
4221
- <button class="exec-failure-btn skip" id="exec-failure-skip">Skip &amp; Continue</button>
4222
- <button class="exec-failure-btn stop" id="exec-failure-stop">Stop Pipeline</button>
4223
- </div>
4224
- </div>
4225
- </div>
4226
- </div>
4227
- </div>
4228
-
4229
- <!-- Side panel — always visible fixed right column -->
4230
- <div id="side-panel">
4231
- <div id="panel-header">
4232
- <span id="panel-title">Details</span>
4233
- </div>
4234
- <div id="panel-body">
4235
- <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
4236
- Click any node to see details.<br>
4237
- Click a declaration or milestone<br>to focus its subtree.
4238
- </div>
4239
- </div>
4240
- </div>
4241
-
4242
- <!-- Activity feed placeholder (moved into drill-body via JS) -->
4243
- <div id="activity-feed">
4244
- <div id="activity-toggle">
4245
- <div id="activity-pulse"></div>
4246
- <div id="activity-tabs">
4247
- <span class="activity-tab active" data-tab="cards">Agents</span>
4248
- <span class="activity-tab" data-tab="log">Log</span>
4249
- </div>
4250
- </div>
4251
- <div id="activity-cards" class="activity-tab-content active">
4252
- <div id="command-card" class="editing" tabindex="0">
4253
- <div class="cmd-label"><span class="cmd-key">C</span> Chat</div>
4254
- <div class="cmd-row">
4255
- <textarea id="command-card-input" rows="1" placeholder="Ask anything..."></textarea>
4256
- <kbd class="cmd-shortcut">C</kbd>
4257
- </div>
4258
- <div id="command-card-hint">Enter to send &middot; Esc to cancel</div>
4259
- </div>
4260
- <div id="activity-cards-active"></div>
4261
- <div id="activity-cards-recent"></div>
4262
- </div>
4263
- <div id="activity-list" class="activity-tab-content">
4264
- <div style="padding:16px;color:var(--text-muted);font-size:11px;text-align:center;">No activity yet</div>
4265
- </div>
4266
- </div>
4267
-
4268
- <!-- Loading/error overlay -->
4269
- <div id="overlay">
4270
- <div class="spinner"></div>
4271
- <div id="overlay-message">Loading graph…</div>
4272
- <div id="overlay-error"></div>
4273
- <button id="overlay-retry">Retry</button>
4274
- </div>
4275
-
4276
- <div id="focus-hint">Press Esc or click outside to exit focus</div>
4277
-
4278
- <!-- File Viewer Modal -->
4279
- <div id="file-viewer-modal">
4280
- <div class="file-viewer-container">
4281
- <div class="file-viewer-header">
4282
- <span class="file-viewer-path" id="file-viewer-path"></span>
4283
- <button class="file-viewer-close" id="file-viewer-close">&times;</button>
4284
- </div>
4285
- <div class="file-viewer-body" id="file-viewer-body"></div>
4286
- </div>
4287
- </div>
4288
-
4289
- <div id="version-label"></div>
4290
- <script src="/public/app.js?v=27"></script>
4291
- </body>
4292
- </html>