declare-cc 0.5.9 → 0.6.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.
@@ -8,70 +8,96 @@
8
8
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9
9
 
10
10
  :root {
11
- --bg: #0e0e12;
12
- --surface: #16161e;
13
- --surface2: #1e1e2a;
14
- --border: #2a2a38;
15
- --text: #c8c8d8;
16
- --text-dim: #6e6e88;
17
- --text-bright: #e8e8f0;
18
-
19
- --decl-color: #4a9eff;
20
- --decl-bg: #0d2240;
21
- --decl-border: #1a4880;
22
-
23
- --mile-color: #a66bff;
24
- --mile-bg: #1a0d33;
25
- --mile-border: #3d1f6e;
26
-
27
- --act-color: #34d399;
28
- --act-bg: #0a2018;
29
- --act-border: #1a4d34;
30
-
31
- /* done tones — dimmed hue-specific variants, not grey */
32
- --decl-done-color: #4a7ab8;
33
- --decl-done-bg: #0a1c2e;
34
- --decl-done-border: #163454;
35
-
36
- --mile-done-color: #7050b8;
37
- --mile-done-bg: #130c28;
38
- --mile-done-border: #251848;
39
-
40
- --act-done-color: #26906a;
41
- --act-done-bg: #08180f;
42
- --act-done-border: #123428;
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);
43
52
 
44
53
  /* workflow progress tones */
45
- --planned-color: #5ba3ff;
46
- --planned-bg: #091828;
47
- --planned-border: #12305a;
54
+ --planned-color: #93c5fd;
55
+ --planned-bg: rgba(147, 197, 253, 0.06);
56
+ --planned-border: rgba(147, 197, 253, 0.15);
48
57
 
49
58
  --executing-color: #fbbf24;
50
- --executing-bg: #1a1200;
51
- --executing-border:#3d2c00;
59
+ --executing-bg: rgba(251, 191, 36, 0.06);
60
+ --executing-border: rgba(251, 191, 36, 0.18);
52
61
 
53
- --broken-color: #ff4d6d;
54
- --broken-bg: #2a0a10;
55
- --broken-border: #5a1520;
62
+ --broken-color: #f87171;
63
+ --broken-bg: rgba(248, 113, 113, 0.06);
64
+ --broken-border: rgba(248, 113, 113, 0.18);
56
65
 
57
- --renegotiated-color: #ffa040;
58
- --renegotiated-bg: #251400;
59
- --renegotiated-border: #5a3000;
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);
60
81
 
61
82
  --panel-width: 360px;
62
- --status-bar-height: 52px;
83
+ --status-bar-height: 48px;
84
+ --topbar-height: 0px;
85
+ --radius: 6px;
86
+ --radius-lg: 10px;
63
87
  }
64
88
 
65
89
  body {
66
90
  background: var(--bg);
67
91
  color: var(--text);
68
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
69
- font-size: 13px;
92
+ font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
93
+ font-size: 14px;
70
94
  line-height: 1.5;
71
95
  height: 100vh;
72
96
  display: flex;
73
97
  flex-direction: column;
74
98
  overflow: hidden;
99
+ -webkit-font-smoothing: antialiased;
100
+ -moz-osx-font-smoothing: grayscale;
75
101
  }
76
102
 
77
103
  /* ── Status bar ── */
@@ -81,7 +107,7 @@
81
107
  border-bottom: 1px solid var(--border);
82
108
  display: flex;
83
109
  align-items: center;
84
- gap: 24px;
110
+ gap: 0;
85
111
  padding: 0 20px;
86
112
  flex-shrink: 0;
87
113
  position: relative;
@@ -92,7 +118,39 @@
92
118
  font-weight: 600;
93
119
  font-size: 14px;
94
120
  color: var(--text-bright);
95
- margin-right: 8px;
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;
96
154
  }
97
155
 
98
156
  .stat-group {
@@ -121,7 +179,24 @@
121
179
  .health-errors { background: #2a0a10; color: #ff4d6d; border: 1px solid #5a1520; }
122
180
  .health-unknown { background: var(--surface2); color: var(--text-dim); border: 1px solid var(--border); }
123
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
+
124
198
  .spacer { flex: 1; }
199
+ /* Status bar uses margin-left:auto on .status-right instead of spacer */
125
200
 
126
201
  #last-updated {
127
202
  color: var(--text-dim);
@@ -129,23 +204,78 @@
129
204
  white-space: nowrap;
130
205
  }
131
206
 
132
- #refresh-btn {
133
- background: var(--surface2);
207
+ #view-toggle {
208
+ background: transparent;
134
209
  border: 1px solid var(--border);
135
- color: var(--text);
136
- padding: 5px 14px;
137
- border-radius: 6px;
210
+ color: var(--text-dim);
211
+ width: 28px;
212
+ height: 28px;
213
+ border-radius: var(--radius);
138
214
  cursor: pointer;
139
- font-size: 12px;
140
- transition: background 0.15s, border-color 0.15s;
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);
141
264
  }
142
- #refresh-btn:hover { background: #252535; border-color: #3a3a50; }
143
- #refresh-btn:active { transform: scale(0.97); }
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); }
144
272
 
145
273
  /* ── Main layout ── */
146
274
  #main {
147
275
  flex: 1;
148
276
  overflow: hidden;
277
+ display: flex;
278
+ flex-direction: column;
149
279
  }
150
280
 
151
281
  /* ── Canvas area — reserve space for fixed sidebar ── */
@@ -320,6 +450,11 @@
320
450
  color: var(--renegotiated-color);
321
451
  }
322
452
 
453
+ /* Wholeness left-border indicator */
454
+ .node.wholeness-whole { border-left: 3px solid var(--wholeness-whole); }
455
+ .node.wholeness-partial { border-left: 3px solid var(--wholeness-partial); }
456
+ .node.wholeness-broken { border-left: 3px solid var(--wholeness-broken); }
457
+
323
458
  .node-id {
324
459
  font-size: 10px;
325
460
  font-weight: 700;
@@ -363,13 +498,37 @@
363
498
  background: rgba(255,255,255,0.06);
364
499
  }
365
500
 
501
+ /* Integrity wholeness dot */
502
+ .integrity-dot {
503
+ display: inline-block;
504
+ width: 7px;
505
+ height: 7px;
506
+ border-radius: 50%;
507
+ margin-left: 6px;
508
+ vertical-align: middle;
509
+ position: relative;
510
+ top: -0.5px;
511
+ }
512
+ .integrity-dot.integrity-whole {
513
+ background: var(--integrity-whole);
514
+ box-shadow: 0 0 6px var(--integrity-whole-glow);
515
+ }
516
+ .integrity-dot.integrity-partial {
517
+ background: var(--integrity-partial);
518
+ box-shadow: 0 0 6px var(--integrity-partial-glow);
519
+ }
520
+ .integrity-dot.integrity-broken {
521
+ background: var(--integrity-broken);
522
+ box-shadow: 0 0 6px var(--integrity-broken-glow);
523
+ }
524
+
366
525
  /* ── Side panel — always visible, fixed right column ── */
367
526
  #side-panel {
368
527
  position: fixed;
369
- top: var(--status-bar-height);
528
+ top: calc(var(--topbar-height) + var(--status-bar-height));
370
529
  right: 0;
371
530
  width: var(--panel-width);
372
- height: calc(100vh - var(--status-bar-height));
531
+ height: calc(100vh - var(--topbar-height) - var(--status-bar-height));
373
532
  background: var(--surface);
374
533
  border-left: 1px solid var(--border);
375
534
  display: flex;
@@ -444,6 +603,20 @@
444
603
  margin-bottom: 20px;
445
604
  }
446
605
 
606
+ /* Wholeness badge in detail panel */
607
+ .wholeness-badge {
608
+ display: inline-block;
609
+ padding: 2px 10px;
610
+ border-radius: 10px;
611
+ font-size: 11px;
612
+ font-weight: 600;
613
+ letter-spacing: 0.04em;
614
+ text-transform: uppercase;
615
+ }
616
+ .wholeness-badge.wb-whole { background: #0a2018; color: var(--wholeness-whole); border: 1px solid #1a4d34; }
617
+ .wholeness-badge.wb-partial { background: #1a1200; color: var(--wholeness-partial); border: 1px solid #3d2c00; }
618
+ .wholeness-badge.wb-broken { background: #2a0a10; color: var(--wholeness-broken); border: 1px solid #5a1520; }
619
+
447
620
  .detail-section {
448
621
  margin-bottom: 20px;
449
622
  }
@@ -591,38 +764,30 @@
591
764
  }
592
765
  #focus-hint.visible { opacity: 1; }
593
766
  /* ── Activity feed ── */
767
+ /* ── Activity sidebar (right panel in drill-body) ── */
594
768
  #activity-feed {
595
- position: fixed;
596
- bottom: 0;
597
- left: 0;
598
- right: var(--panel-width);
599
- height: 36px;
769
+ width: 280px;
770
+ flex-shrink: 0;
600
771
  background: var(--surface);
601
- border-top: 1px solid var(--border);
772
+ border-left: 1px solid var(--border);
602
773
  display: flex;
603
- align-items: center;
774
+ flex-direction: column;
604
775
  overflow: hidden;
605
- z-index: 20;
606
- transition: height 0.2s ease;
607
776
  }
608
- #activity-feed.expanded { height: 180px; align-items: flex-start; }
609
- #activity-feed.has-events { border-top-color: var(--act-border); }
610
777
 
611
778
  #activity-toggle {
612
779
  flex-shrink: 0;
613
- padding: 0 12px;
780
+ padding: 12px 16px 8px;
614
781
  font-size: 10px;
615
782
  font-weight: 700;
616
783
  letter-spacing: 0.06em;
784
+ text-transform: uppercase;
617
785
  color: var(--text-dim);
618
- cursor: pointer;
619
- user-select: none;
620
786
  display: flex;
621
787
  align-items: center;
622
788
  gap: 6px;
623
- height: 36px;
789
+ border-bottom: 1px solid var(--border);
624
790
  }
625
- #activity-toggle:hover { color: var(--text-bright); }
626
791
  #activity-pulse {
627
792
  width: 6px; height: 6px;
628
793
  border-radius: 50%;
@@ -640,105 +805,2531 @@
640
805
  flex: 1;
641
806
  overflow-y: auto;
642
807
  overflow-x: hidden;
643
- padding: 0 8px;
644
- font-size: 11px;
645
- font-family: monospace;
808
+ padding: 8px 0;
809
+ font-size: 12px;
646
810
  display: flex;
647
811
  flex-direction: column;
648
812
  gap: 0;
649
813
  }
650
- #activity-feed:not(.expanded) #activity-list { flex-direction: row; align-items: center; gap: 16px; overflow: hidden; white-space: nowrap; }
814
+ #activity-list::-webkit-scrollbar { width: 4px; }
815
+ #activity-list::-webkit-scrollbar-track { background: transparent; }
816
+ #activity-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
651
817
 
652
818
  .activity-event {
653
- padding: 4px 0;
819
+ padding: 8px 16px;
654
820
  color: var(--text-dim);
655
- border-bottom: 1px solid var(--surface2);
656
821
  display: flex;
657
- align-items: baseline;
658
- gap: 8px;
822
+ flex-direction: column;
823
+ gap: 3px;
659
824
  flex-shrink: 0;
825
+ border-bottom: 1px solid rgba(255,255,255,0.03);
826
+ transition: background 0.15s;
660
827
  }
661
- #activity-feed:not(.expanded) .activity-event { border: none; padding: 0; }
828
+ .activity-event:hover { background: var(--surface2); }
662
829
  .activity-event:last-child { border-bottom: none; }
830
+ .activity-event.is-new {
831
+ animation: activity-flash 1.5s ease-out;
832
+ }
833
+ @keyframes activity-flash {
834
+ 0% { background: rgba(134, 239, 172, 0.08); }
835
+ 100% { background: transparent; }
836
+ }
663
837
 
664
- .ae-time { opacity: 0.4; font-size: 10px; flex-shrink: 0; }
665
- .ae-icon { flex-shrink: 0; }
666
- .ae-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
667
- .ae-text.agent-start { color: var(--act-color); font-weight: 600; }
668
- .ae-text.agent-done { color: var(--mile-color); }
669
- .ae-text.bash { color: var(--text-dim); }
670
- .ae-text.write { color: var(--decl-color); }
838
+ .ae-top {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 6px;
842
+ }
843
+ .ae-time { opacity: 0.5; font-size: 11px; flex-shrink: 0; font-family: 'SF Mono', 'Fira Code', monospace; }
844
+ .ae-icon { flex-shrink: 0; font-size: 12px; }
845
+ .ae-label {
846
+ font-size: 12px;
847
+ font-weight: 600;
848
+ overflow: hidden;
849
+ text-overflow: ellipsis;
850
+ white-space: nowrap;
851
+ }
852
+ .ae-label.agent-start { color: var(--act-color); }
853
+ .ae-label.agent-done { color: var(--mile-color); }
854
+ .ae-label.bash { color: var(--text); }
855
+ .ae-label.write { color: var(--decl-color); }
856
+ .ae-label.review { color: var(--accent); }
857
+ .ae-desc {
858
+ font-size: 12px;
859
+ color: var(--text-dim);
860
+ line-height: 1.4;
861
+ overflow: hidden;
862
+ text-overflow: ellipsis;
863
+ white-space: nowrap;
864
+ padding-left: 18px;
865
+ }
671
866
 
672
- </style>
673
- </head>
674
- <body>
867
+ /* ── Execute/Stop button ── */
868
+ .exec-btn {
869
+ background: var(--act-bg);
870
+ border: 1px solid var(--act-border);
871
+ color: var(--act-color);
872
+ padding: 6px 16px;
873
+ border-radius: 6px;
874
+ font-size: 12px;
875
+ font-weight: 600;
876
+ cursor: pointer;
877
+ display: inline-flex;
878
+ align-items: center;
879
+ gap: 6px;
880
+ transition: background 0.15s, border-color 0.15s;
881
+ }
882
+ .exec-btn:hover { background: #0d2818; border-color: #2a6a48; }
883
+ .exec-btn:disabled { opacity: 0.5; cursor: not-allowed; }
675
884
 
676
- <!-- Status bar -->
677
- <div id="status-bar">
678
- <span class="project-name" id="project-name">Declare</span>
679
- <span class="stat-group"><span class="value" id="stat-decls">–</span> Declarations</span>
680
- <span class="stat-group"><span class="value" id="stat-miles">–</span> Milestones</span>
681
- <span class="stat-group"><span class="value" id="stat-acts">–</span> Actions</span>
682
- <span id="health-badge" class="health-badge health-unknown">–</span>
683
- <span class="spacer"></span>
684
- <span id="last-updated"></span>
685
- <button id="refresh-btn">Refresh</button>
686
- </div>
885
+ .exec-btn.stop {
886
+ background: var(--broken-bg);
887
+ border-color: var(--broken-border);
888
+ color: var(--broken-color);
889
+ }
890
+ .exec-btn.stop:hover { background: #3a0e18; border-color: #7a2035; }
687
891
 
688
- <!-- Main -->
689
- <div id="main">
690
- <div id="canvas-wrap">
691
- <div id="canvas-container">
692
- <svg id="edges-svg"></svg>
693
- <div class="layer-section" id="layer-declarations">
694
- <div class="layer-label">Declarations</div>
695
- <div class="layer" id="nodes-declarations"></div>
696
- </div>
697
- <div class="layer-section" id="layer-milestones">
698
- <div class="layer-label">Milestones</div>
699
- <div class="layer" id="nodes-milestones"></div>
700
- </div>
701
- <div class="layer-section" id="layer-actions">
702
- <div class="layer-label">Actions</div>
703
- <div class="layer" id="nodes-actions"></div>
704
- </div>
705
- </div>
706
- </div>
707
- </div>
892
+ /* ── Output log panel ── */
893
+ .output-log {
894
+ background: #0a0a0e;
895
+ border: 1px solid var(--border);
896
+ border-radius: 6px;
897
+ padding: 10px 12px;
898
+ margin-top: 12px;
899
+ max-height: 300px;
900
+ overflow-y: auto;
901
+ font-family: monospace;
902
+ font-size: 11px;
903
+ line-height: 1.5;
904
+ color: var(--text-dim);
905
+ white-space: pre-wrap;
906
+ word-break: break-all;
907
+ }
908
+ .output-log::-webkit-scrollbar { width: 4px; }
909
+ .output-log::-webkit-scrollbar-track { background: transparent; }
910
+ .output-log::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
708
911
 
709
- <!-- Side panel — always visible fixed right column -->
710
- <div id="side-panel">
711
- <div id="panel-header">
712
- <span id="panel-title">Details</span>
713
- </div>
714
- <div id="panel-body">
715
- <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
716
- Click any node to see details.<br>
717
- Click a declaration or milestone<br>to focus its subtree.
718
- </div>
719
- </div>
720
- </div>
912
+ .output-log .exit-code {
913
+ display: block;
914
+ margin-top: 8px;
915
+ padding-top: 8px;
916
+ border-top: 1px solid var(--border);
917
+ font-weight: 700;
918
+ }
919
+ .output-log .exit-code.success { color: var(--act-color); }
920
+ .output-log .exit-code.failure { color: var(--broken-color); }
721
921
 
722
- <!-- Activity feed live agent/tool event stream -->
723
- <div id="activity-feed">
724
- <div id="activity-toggle">
725
- <div id="activity-pulse"></div>
726
- <span id="activity-label">ACTIVITY</span>
727
- </div>
728
- <div id="activity-list">
729
- <span style="color:var(--text-dim);font-size:10px;opacity:0.4">No activity yet agents will appear here when running</span>
730
- </div>
731
- </div>
922
+ /* ── Running node pulse animation ── */
923
+ .node.is-running {
924
+ animation: running-pulse 1.8s ease-in-out infinite;
925
+ box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2);
926
+ }
927
+ @keyframes running-pulse {
928
+ 0%, 100% { box-shadow: 0 0 0 2px var(--executing-color), 0 0 16px rgba(251,191,36,0.2); }
929
+ 50% { box-shadow: 0 0 0 3px var(--executing-color), 0 0 24px rgba(251,191,36,0.35); }
930
+ }
732
931
 
733
- <!-- Loading/error overlay -->
734
- <div id="overlay">
735
- <div class="spinner"></div>
736
- <div id="overlay-message">Loading graph…</div>
737
- <div id="overlay-error"></div>
738
- <button id="overlay-retry">Retry</button>
739
- </div>
932
+ /* ── Drill browser — 3-panel layout ── */
933
+ #drill-browser {
934
+ display: none;
935
+ width: 100%;
936
+ flex: 1;
937
+ min-height: 0;
938
+ flex-direction: column;
939
+ }
940
+ #drill-browser.active {
941
+ display: flex;
942
+ }
740
943
 
741
- <div id="focus-hint">Press Esc or click outside to exit focus</div>
742
- <script src="/public/app.js"></script>
944
+ #drill-breadcrumb {
945
+ display: none; /* breadcrumb now lives in status bar */
946
+ }
947
+
948
+ /* 3-panel body: left detail + center list + right activity */
949
+ #drill-body {
950
+ flex: 1;
951
+ display: flex;
952
+ overflow: hidden;
953
+ }
954
+
955
+ /* Left detail panel — shown at level 2+ */
956
+ #drill-detail {
957
+ width: 280px;
958
+ flex-shrink: 0;
959
+ overflow-y: auto;
960
+ background: var(--surface);
961
+ border-right: 1px solid var(--border);
962
+ padding: 20px;
963
+ display: none;
964
+ flex-direction: column;
965
+ gap: 16px;
966
+ }
967
+ #drill-detail.visible { display: flex; }
968
+ #drill-detail[data-node-type="declaration"] {
969
+ background: linear-gradient(180deg, rgba(134, 239, 172, 0.04) 0%, var(--surface) 40%);
970
+ border-right-color: rgba(134, 239, 172, 0.12);
971
+ }
972
+ #drill-detail[data-node-type="declaration"] .detail-id { color: var(--act-color); }
973
+ #drill-detail[data-node-type="milestone"] {
974
+ background: linear-gradient(180deg, rgba(165, 149, 255, 0.04) 0%, var(--surface) 40%);
975
+ border-right-color: rgba(165, 149, 255, 0.12);
976
+ }
977
+ #drill-detail[data-node-type="milestone"] .detail-id { color: var(--mile-color); }
978
+ #drill-detail[data-node-type="action"] {
979
+ background: linear-gradient(180deg, rgba(147, 197, 253, 0.04) 0%, var(--surface) 40%);
980
+ border-right-color: rgba(147, 197, 253, 0.12);
981
+ }
982
+ #drill-detail[data-node-type="action"] .detail-id { color: var(--decl-color); }
983
+ #drill-detail::-webkit-scrollbar { width: 4px; }
984
+ #drill-detail::-webkit-scrollbar-track { background: transparent; }
985
+ #drill-detail::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
986
+
987
+ .detail-id {
988
+ font-size: 11px;
989
+ font-weight: 700;
990
+ letter-spacing: 0.04em;
991
+ text-transform: uppercase;
992
+ color: var(--text-dim);
993
+ }
994
+ .detail-title {
995
+ font-size: 18px;
996
+ font-weight: 700;
997
+ color: var(--text-bright);
998
+ line-height: 1.35;
999
+ letter-spacing: -0.01em;
1000
+ }
1001
+ .detail-desc {
1002
+ font-size: 13px;
1003
+ color: var(--text);
1004
+ line-height: 1.6;
1005
+ }
1006
+ .detail-desc:empty { display: none; }
1007
+ .detail-badges {
1008
+ display: flex;
1009
+ align-items: center;
1010
+ gap: 6px;
1011
+ flex-wrap: wrap;
1012
+ }
1013
+ .detail-section-label {
1014
+ font-size: 11px;
1015
+ font-weight: 600;
1016
+ letter-spacing: 0.04em;
1017
+ text-transform: uppercase;
1018
+ color: var(--text-dim);
1019
+ margin-top: 4px;
1020
+ }
1021
+ .detail-meta {
1022
+ font-size: 12px;
1023
+ color: var(--text);
1024
+ line-height: 1.5;
1025
+ }
1026
+ .detail-actions {
1027
+ display: flex;
1028
+ gap: 8px;
1029
+ margin-top: auto;
1030
+ padding-top: 12px;
1031
+ border-top: 1px solid var(--border);
1032
+ }
1033
+
1034
+ /* Center list panel */
1035
+ #drill-center {
1036
+ flex: 1;
1037
+ display: flex;
1038
+ flex-direction: column;
1039
+ overflow: hidden;
1040
+ min-width: 0;
1041
+ }
1042
+
1043
+ #drill-context {
1044
+ padding: 12px 24px;
1045
+ font-size: 13px;
1046
+ color: var(--text-dim);
1047
+ line-height: 1.6;
1048
+ flex-shrink: 0;
1049
+ background: var(--bg);
1050
+ }
1051
+ #drill-context:empty { display: none; padding: 0; }
1052
+
1053
+ #drill-list {
1054
+ flex: 1;
1055
+ overflow-y: auto;
1056
+ padding: 16px 24px 32px;
1057
+ background: var(--bg);
1058
+ }
1059
+ #drill-list::-webkit-scrollbar { width: 5px; }
1060
+ #drill-list::-webkit-scrollbar-track { background: transparent; }
1061
+ #drill-list::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
1062
+
1063
+ .drill-cards {
1064
+ max-width: 640px;
1065
+ margin: 0 auto;
1066
+ display: flex;
1067
+ flex-direction: column;
1068
+ gap: 10px;
1069
+ }
1070
+
1071
+ /* ── Card item ── */
1072
+ .drill-card {
1073
+ background: var(--surface);
1074
+ border: 1px solid transparent;
1075
+ border-radius: var(--radius-lg);
1076
+ padding: 18px 20px;
1077
+ cursor: pointer;
1078
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease;
1079
+ display: flex;
1080
+ flex-direction: column;
1081
+ gap: 10px;
1082
+ }
1083
+ .drill-card:hover {
1084
+ background: var(--surface2);
1085
+ border-color: var(--border-strong);
1086
+ box-shadow: 0 2px 12px rgba(0,0,0,0.15);
1087
+ }
1088
+ .drill-card.needs-review {
1089
+ /* No border — blends into background until focused */
1090
+ }
1091
+ .drill-card.focused {
1092
+ background: var(--surface2);
1093
+ border-color: var(--border-strong);
1094
+ box-shadow: inset 2px 0 0 var(--accent);
1095
+ }
1096
+ .drill-card.current-review {
1097
+ border-color: var(--card-tint-border, var(--accent-border));
1098
+ box-shadow: inset 3px 0 0 var(--card-tint, var(--accent)), 0 0 0 1px var(--card-tint-border, var(--accent-border)), 0 4px 16px var(--card-tint-glow, rgba(208, 236, 26, 0.08));
1099
+ }
1100
+
1101
+ /* ── Node-type tint colors on cards ── */
1102
+ .drill-cards[data-node-type="declaration"] .drill-card {
1103
+ --card-tint: #86efac;
1104
+ --card-tint-border: rgba(134, 239, 172, 0.25);
1105
+ --card-tint-glow: rgba(134, 239, 172, 0.08);
1106
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.03) 0%, var(--surface) 60%);
1107
+ }
1108
+ .drill-cards[data-node-type="declaration"] .drill-card .drill-card-id {
1109
+ color: var(--act-color);
1110
+ }
1111
+ .drill-cards[data-node-type="milestone"] .drill-card {
1112
+ --card-tint: #a595ff;
1113
+ --card-tint-border: rgba(165, 149, 255, 0.25);
1114
+ --card-tint-glow: rgba(165, 149, 255, 0.08);
1115
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.03) 0%, var(--surface) 60%);
1116
+ }
1117
+ .drill-cards[data-node-type="milestone"] .drill-card .drill-card-id {
1118
+ color: var(--mile-color);
1119
+ }
1120
+ .drill-cards[data-node-type="action"] .drill-card {
1121
+ --card-tint: #93c5fd;
1122
+ --card-tint-border: rgba(147, 197, 253, 0.25);
1123
+ --card-tint-glow: rgba(147, 197, 253, 0.08);
1124
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.03) 0%, var(--surface) 60%);
1125
+ }
1126
+ .drill-cards[data-node-type="action"] .drill-card .drill-card-id {
1127
+ color: var(--decl-color);
1128
+ }
1129
+
1130
+ /* Hover state preserves tint gradient */
1131
+ .drill-cards[data-node-type="declaration"] .drill-card:hover {
1132
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1133
+ }
1134
+ .drill-cards[data-node-type="milestone"] .drill-card:hover {
1135
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1136
+ }
1137
+ .drill-cards[data-node-type="action"] .drill-card:hover {
1138
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1139
+ }
1140
+
1141
+ /* Current-review card gets stronger tint */
1142
+ .drill-cards[data-node-type="declaration"] .drill-card.current-review {
1143
+ background: linear-gradient(135deg, rgba(134, 239, 172, 0.06) 0%, var(--surface2) 60%);
1144
+ }
1145
+ .drill-cards[data-node-type="milestone"] .drill-card.current-review {
1146
+ background: linear-gradient(135deg, rgba(165, 149, 255, 0.06) 0%, var(--surface2) 60%);
1147
+ }
1148
+ .drill-cards[data-node-type="action"] .drill-card.current-review {
1149
+ background: linear-gradient(135deg, rgba(147, 197, 253, 0.06) 0%, var(--surface2) 60%);
1150
+ }
1151
+ .drill-card.current-review .drill-review-btn.approve-btn {
1152
+ background: rgba(134, 239, 172, 0.10);
1153
+ border-color: rgba(134, 239, 172, 0.35);
1154
+ color: #86efac;
1155
+ }
1156
+ .drill-card.current-review .drill-review-btn.revision-btn {
1157
+ background: rgba(248, 113, 113, 0.06);
1158
+ border-color: rgba(248, 113, 113, 0.2);
1159
+ color: #f87171;
1160
+ }
1161
+
1162
+ .drill-card-top {
1163
+ display: flex;
1164
+ align-items: flex-start;
1165
+ gap: 12px;
1166
+ }
1167
+ .drill-card-id {
1168
+ font-size: 12px;
1169
+ font-weight: 700;
1170
+ letter-spacing: 0.03em;
1171
+ flex-shrink: 0;
1172
+ padding-top: 2px;
1173
+ color: var(--text-dim);
1174
+ }
1175
+ .drill-card-body {
1176
+ flex: 1;
1177
+ min-width: 0;
1178
+ }
1179
+ .drill-card-title {
1180
+ font-size: 16px;
1181
+ font-weight: 600;
1182
+ color: var(--text-bright);
1183
+ line-height: 1.4;
1184
+ letter-spacing: -0.01em;
1185
+ margin-bottom: 4px;
1186
+ }
1187
+ .drill-card-desc {
1188
+ font-size: 13px;
1189
+ color: var(--text);
1190
+ line-height: 1.5;
1191
+ margin-bottom: 8px;
1192
+ }
1193
+ .drill-card-desc:empty { display: none; margin: 0; }
1194
+
1195
+ .drill-card-badges {
1196
+ display: flex;
1197
+ align-items: center;
1198
+ gap: 6px;
1199
+ flex-wrap: wrap;
1200
+ }
1201
+ .drill-card-stat {
1202
+ font-size: 12px;
1203
+ color: var(--text);
1204
+ font-weight: 400;
1205
+ }
1206
+ .drill-card-stat strong {
1207
+ color: var(--accent);
1208
+ font-weight: 600;
1209
+ }
1210
+
1211
+ /* Card-level status pill */
1212
+ .drill-status-pill {
1213
+ display: inline-block;
1214
+ padding: 3px 10px;
1215
+ border-radius: 99px;
1216
+ font-size: 11px;
1217
+ font-weight: 600;
1218
+ letter-spacing: 0.03em;
1219
+ text-transform: uppercase;
1220
+ background: rgba(255,255,255,0.04);
1221
+ border: 1px solid var(--border);
1222
+ color: var(--text-dim);
1223
+ }
1224
+ .drill-status-pill.s-done { background: var(--act-bg); border-color: var(--act-border); color: var(--act-color); }
1225
+ .drill-status-pill.s-executing { background: var(--executing-bg); border-color: var(--executing-border); color: var(--executing-color); }
1226
+ .drill-status-pill.s-planned { background: var(--planned-bg); border-color: var(--planned-border); color: var(--planned-color); }
1227
+ .drill-status-pill.s-pending { background: rgba(255,255,255,0.03); color: var(--text-dim); }
1228
+
1229
+ /* ── Card review actions (centered below content) ── */
1230
+ .drill-card-actions {
1231
+ display: flex;
1232
+ gap: 8px;
1233
+ padding-top: 8px;
1234
+ border-top: 1px solid var(--border);
1235
+ }
1236
+ .drill-review-btn {
1237
+ flex: 1;
1238
+ padding: 8px 14px;
1239
+ border-radius: var(--radius);
1240
+ font-size: 13px;
1241
+ font-weight: 600;
1242
+ cursor: pointer;
1243
+ border: 1px solid var(--border-strong);
1244
+ background: transparent;
1245
+ color: var(--text);
1246
+ transition: all 0.15s ease;
1247
+ text-align: center;
1248
+ }
1249
+ .drill-review-btn kbd, .drill-action-btn kbd {
1250
+ display: inline-block;
1251
+ padding: 0 5px;
1252
+ border: 1px solid var(--border-strong);
1253
+ border-radius: 3px;
1254
+ font-size: 10px;
1255
+ font-family: inherit;
1256
+ font-weight: 700;
1257
+ color: var(--text-dim);
1258
+ background: var(--surface2);
1259
+ margin-right: 2px;
1260
+ vertical-align: baseline;
1261
+ }
1262
+ .drill-review-btn:hover, .drill-action-btn:hover {
1263
+ background: var(--surface2);
1264
+ border-color: var(--border-strong);
1265
+ color: var(--text);
1266
+ }
1267
+ .drill-review-btn.approve-btn:hover {
1268
+ background: rgba(134, 239, 172, 0.08);
1269
+ border-color: rgba(134, 239, 172, 0.3);
1270
+ color: #86efac;
1271
+ }
1272
+
1273
+ /* ── Flat action bar buttons ── */
1274
+ .drill-action-btn {
1275
+ padding: 6px 12px;
1276
+ border-radius: var(--radius);
1277
+ font-size: 12px;
1278
+ font-weight: 500;
1279
+ cursor: pointer;
1280
+ border: 1px solid var(--border);
1281
+ background: transparent;
1282
+ color: var(--text-dim);
1283
+ transition: all 0.15s ease;
1284
+ }
1285
+ .drill-action-btn:hover {
1286
+ background: var(--surface2);
1287
+ border-color: var(--border-strong);
1288
+ color: var(--text);
1289
+ }
1290
+ .drill-action-btn.drill-action-danger {
1291
+ color: var(--text-dim);
1292
+ }
1293
+ .drill-action-btn.drill-action-danger:hover {
1294
+ background: rgba(248,113,113,0.08);
1295
+ border-color: rgba(248,113,113,0.3);
1296
+ color: #f87171;
1297
+ }
1298
+
1299
+ /* ── Refine suggestion inline area ── */
1300
+ .refine-area {
1301
+ margin-top: 8px;
1302
+ padding: 10px;
1303
+ border: 1px solid var(--accent-border);
1304
+ border-radius: var(--radius);
1305
+ background: rgba(208,236,26,0.03);
1306
+ font-size: 13px;
1307
+ line-height: 1.5;
1308
+ color: var(--text);
1309
+ }
1310
+ .refine-area .refine-streaming {
1311
+ white-space: pre-wrap;
1312
+ min-height: 24px;
1313
+ }
1314
+ .refine-area .refine-actions {
1315
+ display: flex;
1316
+ gap: 8px;
1317
+ margin-top: 8px;
1318
+ }
1319
+ .refine-area .refine-accept {
1320
+ padding: 5px 12px;
1321
+ border-radius: var(--radius);
1322
+ font-size: 12px;
1323
+ font-weight: 600;
1324
+ cursor: pointer;
1325
+ border: 1px solid rgba(134,239,172,0.3);
1326
+ background: rgba(134,239,172,0.08);
1327
+ color: #86efac;
1328
+ }
1329
+ .refine-area .refine-discard {
1330
+ padding: 5px 12px;
1331
+ border-radius: var(--radius);
1332
+ font-size: 12px;
1333
+ font-weight: 600;
1334
+ cursor: pointer;
1335
+ border: 1px solid var(--border-strong);
1336
+ background: transparent;
1337
+ color: var(--text-dim);
1338
+ }
1339
+ .refine-write-input {
1340
+ width: 100%;
1341
+ padding: 8px;
1342
+ border: 1px solid var(--border-strong);
1343
+ border-radius: var(--radius);
1344
+ background: var(--surface2);
1345
+ color: var(--text);
1346
+ font-size: 13px;
1347
+ font-family: inherit;
1348
+ resize: vertical;
1349
+ min-height: 40px;
1350
+ margin-bottom: 6px;
1351
+ }
1352
+ .refine-write-input:focus {
1353
+ outline: none;
1354
+ border-color: var(--accent-border);
1355
+ }
1356
+
1357
+ /* Expandable exec-plan preview */
1358
+ .drill-exec-plan-toggle {
1359
+ font-size: 11px;
1360
+ color: var(--text-muted);
1361
+ cursor: pointer;
1362
+ padding: 2px 0;
1363
+ user-select: none;
1364
+ font-weight: 500;
1365
+ transition: color 0.12s;
1366
+ }
1367
+ .drill-exec-plan-toggle:hover { color: var(--text); }
1368
+ .drill-exec-plan-content {
1369
+ display: none;
1370
+ margin-top: 6px;
1371
+ padding: 12px 14px;
1372
+ background: var(--bg);
1373
+ border: 1px solid var(--border);
1374
+ border-radius: var(--radius);
1375
+ font-size: 11px;
1376
+ line-height: 1.6;
1377
+ color: var(--text-dim);
1378
+ max-height: 200px;
1379
+ overflow-y: auto;
1380
+ }
1381
+ .drill-exec-plan-content.open { display: block; }
1382
+
1383
+ /* ── Bottom prompt bar ── */
1384
+ #drill-prompt {
1385
+ padding: 14px 24px;
1386
+ background: var(--surface);
1387
+ border-top: 1px solid var(--border);
1388
+ display: flex;
1389
+ align-items: center;
1390
+ justify-content: center;
1391
+ gap: 12px;
1392
+ flex-shrink: 0;
1393
+ font-size: 13px;
1394
+ }
1395
+ .drill-prompt-text {
1396
+ color: var(--text);
1397
+ }
1398
+ .drill-prompt-text .drill-prompt-target {
1399
+ color: var(--accent);
1400
+ font-weight: 600;
1401
+ cursor: pointer;
1402
+ }
1403
+ .drill-prompt-text .drill-prompt-target:hover { text-decoration: underline; }
1404
+ .drill-prompt-complete {
1405
+ color: var(--accent);
1406
+ font-weight: 600;
1407
+ }
1408
+ .drill-next-btn {
1409
+ background: var(--accent-dim);
1410
+ border: 1px solid var(--accent-border);
1411
+ color: var(--accent);
1412
+ padding: 6px 16px;
1413
+ border-radius: var(--radius);
1414
+ cursor: pointer;
1415
+ font-size: 13px;
1416
+ font-weight: 600;
1417
+ margin-left: 12px;
1418
+ transition: all 0.15s ease;
1419
+ }
1420
+ .drill-next-btn:hover { background: rgba(208, 236, 26, 0.18); }
1421
+ .drill-next-btn kbd {
1422
+ display: inline-block;
1423
+ padding: 0 5px;
1424
+ border: 1px solid var(--accent-border);
1425
+ border-radius: 3px;
1426
+ font-size: 10px;
1427
+ font-family: inherit;
1428
+ font-weight: 700;
1429
+ color: var(--accent);
1430
+ background: rgba(208, 236, 26, 0.08);
1431
+ margin-right: 2px;
1432
+ }
1433
+
1434
+ .col-empty {
1435
+ padding: 40px 20px;
1436
+ color: var(--text-muted);
1437
+ font-size: 13px;
1438
+ text-align: center;
1439
+ }
1440
+
1441
+ .col-empty-invite {
1442
+ padding: 60px 32px;
1443
+ text-align: center;
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ align-items: center;
1447
+ gap: 12px;
1448
+ }
1449
+ .empty-invite-title {
1450
+ color: var(--text);
1451
+ font-size: 15px;
1452
+ font-weight: 600;
1453
+ }
1454
+ .empty-invite-desc {
1455
+ color: var(--text-muted);
1456
+ font-size: 13px;
1457
+ max-width: 320px;
1458
+ line-height: 1.5;
1459
+ }
1460
+ .empty-invite-input {
1461
+ width: 100%;
1462
+ max-width: 320px;
1463
+ background: var(--surface2);
1464
+ border: 1px solid var(--border);
1465
+ border-radius: 6px;
1466
+ color: var(--text);
1467
+ font-size: 12px;
1468
+ padding: 8px 10px;
1469
+ resize: vertical;
1470
+ font-family: inherit;
1471
+ }
1472
+ .empty-invite-input:focus {
1473
+ outline: none;
1474
+ border-color: var(--accent-border);
1475
+ }
1476
+ .empty-invite-input::placeholder {
1477
+ color: var(--text-muted);
1478
+ opacity: 0.6;
1479
+ }
1480
+ .empty-invite-btn {
1481
+ background: var(--accent-dim);
1482
+ border: 1px solid var(--accent-border);
1483
+ color: var(--accent);
1484
+ padding: 8px 20px;
1485
+ border-radius: 6px;
1486
+ font-size: 13px;
1487
+ font-weight: 600;
1488
+ cursor: pointer;
1489
+ transition: all 0.15s ease;
1490
+ }
1491
+ .empty-invite-btn:hover {
1492
+ background: rgba(208, 236, 26, 0.18);
1493
+ border-color: rgba(208, 236, 26, 0.4);
1494
+ }
1495
+ .empty-invite-btn kbd {
1496
+ background: rgba(255,255,255,0.08);
1497
+ border: 1px solid rgba(255,255,255,0.12);
1498
+ border-radius: 3px;
1499
+ padding: 1px 5px;
1500
+ font-size: 11px;
1501
+ margin-right: 4px;
1502
+ }
1503
+ .col-empty-invite .output-log {
1504
+ width: 100%;
1505
+ max-width: 420px;
1506
+ text-align: left;
1507
+ }
1508
+ .col-empty-invite .derivation-checklist {
1509
+ text-align: left;
1510
+ width: 100%;
1511
+ max-width: 420px;
1512
+ }
1513
+ .derive-spinner {
1514
+ display: inline-block;
1515
+ width: 12px;
1516
+ height: 12px;
1517
+ border: 2px solid rgba(208,236,26,0.3);
1518
+ border-top-color: var(--accent);
1519
+ border-radius: 50%;
1520
+ animation: derive-spin 0.8s linear infinite;
1521
+ vertical-align: middle;
1522
+ margin-right: 4px;
1523
+ }
1524
+ @keyframes derive-spin {
1525
+ to { transform: rotate(360deg); }
1526
+ }
1527
+ .derive-elapsed {
1528
+ opacity: 0.5;
1529
+ font-size: 11px;
1530
+ font-weight: 400;
1531
+ }
1532
+
1533
+ /* Hide side panel in drill browser mode */
1534
+ body:not(.dag-mode) #side-panel { display: none; }
1535
+ body.dag-mode #side-panel { display: flex; }
1536
+ body.dag-mode #activity-feed { display: none; }
1537
+
1538
+ /* ── Declaration form ── */
1539
+ .decl-form-trigger {
1540
+ background: none;
1541
+ border: 1px solid var(--decl-border);
1542
+ color: var(--decl-color);
1543
+ width: 22px;
1544
+ height: 22px;
1545
+ border-radius: 4px;
1546
+ cursor: pointer;
1547
+ font-size: 14px;
1548
+ line-height: 1;
1549
+ display: inline-flex;
1550
+ align-items: center;
1551
+ justify-content: center;
1552
+ transition: background 0.15s, border-color 0.15s;
1553
+ flex-shrink: 0;
1554
+ margin-left: auto;
1555
+ }
1556
+ .decl-form-trigger:hover {
1557
+ background: var(--decl-bg);
1558
+ border-color: var(--decl-color);
1559
+ }
1560
+
1561
+ .decl-form-overlay {
1562
+ padding: 12px 16px;
1563
+ border-bottom: 1px solid var(--border);
1564
+ background: var(--surface2);
1565
+ }
1566
+
1567
+ .decl-form {
1568
+ display: flex;
1569
+ flex-direction: column;
1570
+ gap: 8px;
1571
+ }
1572
+
1573
+ .decl-form input,
1574
+ .decl-form textarea {
1575
+ background: var(--surface);
1576
+ border: 1px solid var(--border);
1577
+ color: var(--text);
1578
+ border-radius: 4px;
1579
+ padding: 8px 12px;
1580
+ width: 100%;
1581
+ font-size: 13px;
1582
+ font-family: inherit;
1583
+ outline: none;
1584
+ transition: border-color 0.15s;
1585
+ }
1586
+ .decl-form input:focus,
1587
+ .decl-form textarea:focus {
1588
+ border-color: var(--decl-color);
1589
+ }
1590
+
1591
+ .decl-form textarea {
1592
+ resize: vertical;
1593
+ min-height: 54px;
1594
+ }
1595
+
1596
+ .decl-form-actions {
1597
+ display: flex;
1598
+ gap: 8px;
1599
+ align-items: center;
1600
+ }
1601
+
1602
+ .decl-form-actions .decl-submit-btn {
1603
+ background: var(--decl-color);
1604
+ color: #fff;
1605
+ border: none;
1606
+ border-radius: 4px;
1607
+ padding: 6px 16px;
1608
+ cursor: pointer;
1609
+ font-size: 12px;
1610
+ font-weight: 600;
1611
+ transition: opacity 0.15s;
1612
+ }
1613
+ .decl-form-actions .decl-submit-btn:hover { opacity: 0.9; }
1614
+ .decl-form-actions .decl-submit-btn:disabled {
1615
+ opacity: 0.5;
1616
+ cursor: not-allowed;
1617
+ }
1618
+
1619
+ .decl-form-actions .decl-cancel-btn {
1620
+ background: transparent;
1621
+ border: 1px solid var(--border);
1622
+ color: var(--text-dim);
1623
+ border-radius: 4px;
1624
+ padding: 6px 16px;
1625
+ cursor: pointer;
1626
+ font-size: 12px;
1627
+ transition: border-color 0.15s, color 0.15s;
1628
+ }
1629
+ .decl-form-actions .decl-cancel-btn:hover {
1630
+ border-color: var(--text-dim);
1631
+ color: var(--text);
1632
+ }
1633
+
1634
+ .decl-form .form-error {
1635
+ color: var(--broken-color);
1636
+ font-size: 12px;
1637
+ margin-top: 4px;
1638
+ min-height: 0;
1639
+ }
1640
+
1641
+ /* Status bar new-decl button */
1642
+ .new-decl-btn {
1643
+ background: var(--decl-bg);
1644
+ border: 1px solid var(--decl-border);
1645
+ color: var(--decl-color);
1646
+ padding: 5px 14px;
1647
+ border-radius: 6px;
1648
+ cursor: pointer;
1649
+ font-size: 12px;
1650
+ font-weight: 600;
1651
+ transition: background 0.15s, border-color 0.15s;
1652
+ }
1653
+ .new-decl-btn:hover { background: #0f2d50; border-color: var(--decl-color); }
1654
+
1655
+ /* Play All button */
1656
+ .play-btn {
1657
+ background: #0a2018;
1658
+ border: 1px solid var(--act-border);
1659
+ color: var(--act-color);
1660
+ padding: 5px 14px;
1661
+ border-radius: 6px;
1662
+ cursor: pointer;
1663
+ font-size: 12px;
1664
+ font-weight: 600;
1665
+ transition: background 0.15s, border-color 0.15s;
1666
+ }
1667
+ .play-btn:hover { background: #0f3020; border-color: var(--act-color); }
1668
+ .play-btn:disabled { opacity: 0.4; cursor: not-allowed; }
1669
+ .play-btn.playing {
1670
+ background: var(--executing-bg);
1671
+ border-color: var(--executing-border);
1672
+ color: var(--executing-color);
1673
+ animation: pulse-play 1.5s ease-in-out infinite;
1674
+ }
1675
+ @keyframes pulse-play {
1676
+ 0%, 100% { opacity: 1; }
1677
+ 50% { opacity: 0.7; }
1678
+ }
1679
+
1680
+ /* Play progress banner */
1681
+ #play-banner {
1682
+ display: none;
1683
+ background: var(--surface);
1684
+ border-bottom: 1px solid var(--executing-border);
1685
+ padding: 8px 20px;
1686
+ font-size: 12px;
1687
+ color: var(--text);
1688
+ align-items: center;
1689
+ gap: 12px;
1690
+ flex-shrink: 0;
1691
+ }
1692
+ #play-banner.visible { display: flex; }
1693
+ #play-banner .play-wave-label {
1694
+ color: var(--executing-color);
1695
+ font-weight: 600;
1696
+ }
1697
+ #play-banner .play-actions-list {
1698
+ display: flex;
1699
+ gap: 6px;
1700
+ flex-wrap: wrap;
1701
+ }
1702
+ #play-banner .play-action-tag {
1703
+ background: var(--surface2);
1704
+ border: 1px solid var(--border);
1705
+ border-radius: 4px;
1706
+ padding: 2px 8px;
1707
+ font-size: 11px;
1708
+ }
1709
+ #play-banner .play-action-tag.active {
1710
+ border-color: var(--executing-border);
1711
+ color: var(--executing-color);
1712
+ }
1713
+ #play-banner .play-action-tag.done {
1714
+ border-color: var(--act-border);
1715
+ color: var(--act-color);
1716
+ }
1717
+ #play-banner .play-action-tag.failed {
1718
+ border-color: var(--broken-border);
1719
+ color: var(--broken-color);
1720
+ }
1721
+ .play-stop-btn {
1722
+ background: var(--broken-bg);
1723
+ border: 1px solid var(--broken-border);
1724
+ color: var(--broken-color);
1725
+ padding: 3px 10px;
1726
+ border-radius: 4px;
1727
+ cursor: pointer;
1728
+ font-size: 11px;
1729
+ margin-left: auto;
1730
+ }
1731
+ .play-stop-btn:hover { background: #3a0a10; }
1732
+
1733
+ /* Scrollbar for column panels */
1734
+ .col-panel::-webkit-scrollbar { width: 4px; }
1735
+ .col-panel::-webkit-scrollbar-track { background: transparent; }
1736
+ .col-panel::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
1737
+
1738
+ /* ── File Viewer Modal ── */
1739
+ #file-viewer-modal {
1740
+ display: none;
1741
+ position: fixed;
1742
+ inset: 0;
1743
+ z-index: 2000;
1744
+ background: rgba(0, 0, 0, 0.75);
1745
+ backdrop-filter: blur(4px);
1746
+ justify-content: center;
1747
+ align-items: center;
1748
+ padding: 40px;
1749
+ }
1750
+ #file-viewer-modal.open {
1751
+ display: flex;
1752
+ }
1753
+ .file-viewer-container {
1754
+ background: var(--surface);
1755
+ border: 1px solid var(--border);
1756
+ border-radius: 12px;
1757
+ width: 100%;
1758
+ max-width: 820px;
1759
+ max-height: 85vh;
1760
+ display: flex;
1761
+ flex-direction: column;
1762
+ overflow: hidden;
1763
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
1764
+ }
1765
+ .file-viewer-header {
1766
+ display: flex;
1767
+ align-items: center;
1768
+ justify-content: space-between;
1769
+ padding: 12px 16px;
1770
+ border-bottom: 1px solid var(--border);
1771
+ background: var(--surface2);
1772
+ flex-shrink: 0;
1773
+ }
1774
+ .file-viewer-path {
1775
+ font-family: 'SF Mono', 'Fira Code', monospace;
1776
+ font-size: 12px;
1777
+ color: var(--text-bright);
1778
+ font-weight: 600;
1779
+ overflow: hidden;
1780
+ text-overflow: ellipsis;
1781
+ white-space: nowrap;
1782
+ }
1783
+ .file-viewer-close {
1784
+ background: none;
1785
+ border: 1px solid var(--border);
1786
+ color: var(--text-dim);
1787
+ cursor: pointer;
1788
+ border-radius: 6px;
1789
+ width: 28px;
1790
+ height: 28px;
1791
+ display: flex;
1792
+ align-items: center;
1793
+ justify-content: center;
1794
+ font-size: 14px;
1795
+ flex-shrink: 0;
1796
+ margin-left: 12px;
1797
+ }
1798
+ .file-viewer-close:hover {
1799
+ color: var(--text-bright);
1800
+ border-color: var(--text-dim);
1801
+ }
1802
+ .file-viewer-body {
1803
+ overflow-y: auto;
1804
+ padding: 20px 24px;
1805
+ flex: 1;
1806
+ font-size: 13px;
1807
+ line-height: 1.65;
1808
+ color: var(--text);
1809
+ }
1810
+ /* Markdown rendered content */
1811
+ .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); }
1812
+ .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); }
1813
+ .file-viewer-body.markdown h3 { font-size: 1.1em; font-weight: 700; color: var(--text-bright); margin: 1em 0 0.3em; }
1814
+ .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; }
1815
+ .file-viewer-body.markdown p { margin: 0 0 0.8em; }
1816
+ .file-viewer-body.markdown ul, .file-viewer-body.markdown ol { margin: 0 0 0.8em; padding-left: 1.5em; }
1817
+ .file-viewer-body.markdown li { margin-bottom: 0.3em; }
1818
+ .file-viewer-body.markdown li > ul, .file-viewer-body.markdown li > ol { margin-top: 0.3em; margin-bottom: 0; }
1819
+ .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); }
1820
+ .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; }
1821
+ .file-viewer-body.markdown pre code { background: none; border: none; padding: 0; color: var(--text); font-size: 12px; line-height: 1.5; }
1822
+ .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); }
1823
+ .file-viewer-body.markdown a { color: var(--decl-color); text-decoration: none; }
1824
+ .file-viewer-body.markdown a:hover { text-decoration: underline; }
1825
+ .file-viewer-body.markdown hr { border: none; border-top: 1px solid var(--border); margin: 1.2em 0; }
1826
+ .file-viewer-body.markdown table { border-collapse: collapse; margin: 0 0 1em; width: 100%; }
1827
+ .file-viewer-body.markdown th, .file-viewer-body.markdown td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; font-size: 12px; }
1828
+ .file-viewer-body.markdown th { background: var(--surface2); font-weight: 700; color: var(--text-bright); }
1829
+ .file-viewer-body.markdown img { max-width: 100%; }
1830
+ .file-viewer-body.markdown strong { color: var(--text-bright); font-weight: 700; }
1831
+ /* Preformatted (non-markdown) */
1832
+ .file-viewer-body.preformatted {
1833
+ font-family: 'SF Mono', 'Fira Code', monospace;
1834
+ font-size: 12px;
1835
+ line-height: 1.5;
1836
+ white-space: pre-wrap;
1837
+ word-break: break-all;
1838
+ color: var(--text);
1839
+ }
1840
+ /* Clickable file links in exec-plan detail */
1841
+ .file-link {
1842
+ cursor: pointer;
1843
+ transition: border-color 0.15s;
1844
+ }
1845
+ .file-link:hover {
1846
+ border-color: var(--act-color) !important;
1847
+ text-decoration: underline;
1848
+ }
1849
+
1850
+ /* ── Declaration edit mode ── */
1851
+ .decl-edit-mode input,
1852
+ .decl-edit-mode textarea {
1853
+ background: var(--surface);
1854
+ border: 1px solid var(--border);
1855
+ color: var(--text);
1856
+ border-radius: 4px;
1857
+ padding: 8px 12px;
1858
+ width: 100%;
1859
+ font-size: 13px;
1860
+ font-family: inherit;
1861
+ outline: none;
1862
+ transition: border-color 0.15s;
1863
+ }
1864
+ .decl-edit-mode input:focus,
1865
+ .decl-edit-mode textarea:focus {
1866
+ border-color: var(--decl-color);
1867
+ }
1868
+ .decl-edit-mode textarea {
1869
+ resize: vertical;
1870
+ min-height: 54px;
1871
+ }
1872
+ .decl-edit-mode label {
1873
+ font-size: 10px;
1874
+ font-weight: 700;
1875
+ letter-spacing: 0.1em;
1876
+ text-transform: uppercase;
1877
+ color: var(--text-dim);
1878
+ margin-bottom: 4px;
1879
+ margin-top: 12px;
1880
+ display: block;
1881
+ }
1882
+ .decl-edit-mode label:first-child {
1883
+ margin-top: 0;
1884
+ }
1885
+
1886
+ .decl-edit-actions {
1887
+ display: flex;
1888
+ gap: 8px;
1889
+ align-items: center;
1890
+ margin-top: 14px;
1891
+ }
1892
+ .decl-edit-actions .btn-save {
1893
+ background: var(--decl-color);
1894
+ color: #fff;
1895
+ border: none;
1896
+ border-radius: 4px;
1897
+ padding: 6px 16px;
1898
+ cursor: pointer;
1899
+ font-size: 12px;
1900
+ font-weight: 600;
1901
+ transition: opacity 0.15s;
1902
+ }
1903
+ .decl-edit-actions .btn-save:hover { opacity: 0.9; }
1904
+ .decl-edit-actions .btn-save:disabled { opacity: 0.5; cursor: not-allowed; }
1905
+ .decl-edit-actions .btn-cancel {
1906
+ background: transparent;
1907
+ border: 1px solid var(--border);
1908
+ color: var(--text-dim);
1909
+ border-radius: 4px;
1910
+ padding: 6px 16px;
1911
+ cursor: pointer;
1912
+ font-size: 12px;
1913
+ transition: border-color 0.15s, color 0.15s;
1914
+ }
1915
+ .decl-edit-actions .btn-cancel:hover { border-color: var(--text-dim); color: var(--text); }
1916
+
1917
+ .delete-confirm {
1918
+ margin-top: 12px;
1919
+ padding: 10px 12px;
1920
+ background: var(--broken-bg);
1921
+ border: 1px solid var(--broken-border);
1922
+ border-radius: 6px;
1923
+ font-size: 12px;
1924
+ color: var(--broken-color);
1925
+ }
1926
+ .delete-confirm p {
1927
+ margin-bottom: 8px;
1928
+ }
1929
+ .delete-confirm .delete-confirm-actions {
1930
+ display: flex;
1931
+ gap: 8px;
1932
+ }
1933
+ .delete-confirm .btn-confirm-delete {
1934
+ background: var(--broken-color);
1935
+ color: #fff;
1936
+ border: none;
1937
+ border-radius: 4px;
1938
+ padding: 5px 14px;
1939
+ cursor: pointer;
1940
+ font-size: 12px;
1941
+ font-weight: 600;
1942
+ }
1943
+ .delete-confirm .btn-confirm-cancel {
1944
+ background: transparent;
1945
+ border: 1px solid var(--broken-border);
1946
+ color: var(--broken-color);
1947
+ border-radius: 4px;
1948
+ padding: 5px 14px;
1949
+ cursor: pointer;
1950
+ font-size: 12px;
1951
+ }
1952
+
1953
+ .decl-status-select {
1954
+ background: var(--surface2);
1955
+ color: var(--text);
1956
+ border: 1px solid var(--border);
1957
+ border-radius: 4px;
1958
+ padding: 8px 12px;
1959
+ width: 100%;
1960
+ font-size: 13px;
1961
+ font-family: inherit;
1962
+ outline: none;
1963
+ cursor: pointer;
1964
+ transition: border-color 0.15s;
1965
+ }
1966
+ .decl-status-select:focus {
1967
+ border-color: var(--decl-color);
1968
+ }
1969
+
1970
+ .decl-panel-actions {
1971
+ display: flex;
1972
+ gap: 8px;
1973
+ margin-top: 16px;
1974
+ }
1975
+ .decl-panel-actions .btn-edit {
1976
+ background: var(--decl-bg);
1977
+ border: 1px solid var(--decl-border);
1978
+ color: var(--decl-color);
1979
+ border-radius: 4px;
1980
+ padding: 5px 14px;
1981
+ cursor: pointer;
1982
+ font-size: 12px;
1983
+ font-weight: 600;
1984
+ transition: background 0.15s, border-color 0.15s;
1985
+ }
1986
+ .decl-panel-actions .btn-edit:hover { background: #0f2d50; border-color: var(--decl-color); }
1987
+ .decl-panel-actions .btn-panel-delete {
1988
+ background: transparent;
1989
+ color: var(--broken-color);
1990
+ border: 1px solid var(--broken-border);
1991
+ border-radius: 4px;
1992
+ padding: 5px 14px;
1993
+ cursor: pointer;
1994
+ font-size: 12px;
1995
+ font-weight: 600;
1996
+ transition: background 0.15s;
1997
+ }
1998
+ .decl-panel-actions .btn-panel-delete:hover { background: var(--broken-bg); }
1999
+
2000
+ /* Workability path section */
2001
+ .workability-path { margin-top: 4px; }
2002
+ .workability-path .wp-header {
2003
+ font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
2004
+ text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px;
2005
+ }
2006
+ .wp-step {
2007
+ display: flex; align-items: flex-start; gap: 10px;
2008
+ padding: 8px 10px; border-radius: 6px;
2009
+ background: var(--surface2); border: 1px solid var(--border);
2010
+ margin-bottom: 6px; font-size: 12px;
2011
+ }
2012
+ .wp-step-action {
2013
+ font-size: 10px; font-weight: 700; letter-spacing: 0.04em;
2014
+ color: var(--act-color); cursor: pointer; white-space: nowrap;
2015
+ flex-shrink: 0;
2016
+ }
2017
+ .wp-step-action:hover { text-decoration: underline; }
2018
+ .wp-step-body { flex: 1; min-width: 0; }
2019
+ .wp-step-title {
2020
+ color: var(--text-bright); font-size: 12px; font-weight: 500;
2021
+ line-height: 1.35; margin-bottom: 3px;
2022
+ }
2023
+ .wp-step-milestone {
2024
+ font-size: 10px; color: var(--text-dim); opacity: 0.7;
2025
+ }
2026
+ .wp-impact {
2027
+ display: inline-block; padding: 1px 7px; border-radius: 8px;
2028
+ font-size: 9px; font-weight: 700; letter-spacing: 0.04em;
2029
+ text-transform: uppercase; flex-shrink: 0; margin-top: 1px;
2030
+ }
2031
+ .wp-impact.impact-high { background: #2a0a10; color: var(--broken-color); border: 1px solid #5a1520; }
2032
+ .wp-impact.impact-medium { background: #1a1200; color: var(--integrity-partial); border: 1px solid #3d2c00; }
2033
+ .wp-impact.impact-low { background: #0a2018; color: var(--integrity-whole); border: 1px solid #1a4d34; }
2034
+
2035
+ /* ── Derivation panel ── */
2036
+ .derivation-panel {
2037
+ margin-top: 12px;
2038
+ border: 1px solid var(--border);
2039
+ border-radius: 6px;
2040
+ padding: 12px;
2041
+ background: var(--bg);
2042
+ }
2043
+ .derivation-panel .output-log {
2044
+ max-height: 200px;
2045
+ overflow-y: auto;
2046
+ font-family: 'SF Mono', Monaco, monospace;
2047
+ font-size: 11px;
2048
+ padding: 8px;
2049
+ background: #1a1a2e;
2050
+ color: #ccc;
2051
+ border-radius: 4px;
2052
+ white-space: pre-wrap;
2053
+ margin-bottom: 12px;
2054
+ }
2055
+ .derivation-checklist { list-style: none; padding: 0; margin: 8px 0; }
2056
+ .derivation-checklist li {
2057
+ display: flex;
2058
+ align-items: center;
2059
+ gap: 8px;
2060
+ padding: 6px 0;
2061
+ border-bottom: 1px solid var(--border);
2062
+ }
2063
+ .derivation-checklist li:last-child { border-bottom: none; }
2064
+ .derivation-checklist input[type="checkbox"] { flex-shrink: 0; }
2065
+ .derivation-checklist input[type="text"] {
2066
+ flex: 1;
2067
+ background: var(--bg);
2068
+ color: var(--fg, var(--text));
2069
+ border: 1px solid var(--border);
2070
+ border-radius: 3px;
2071
+ padding: 4px 6px;
2072
+ font-size: 13px;
2073
+ }
2074
+ .derivation-checklist .reason {
2075
+ font-size: 11px;
2076
+ color: #888;
2077
+ margin-left: 28px;
2078
+ display: block;
2079
+ }
2080
+ .derive-btn {
2081
+ background: var(--accent, #4a6cf7);
2082
+ color: #fff;
2083
+ border: none;
2084
+ padding: 6px 14px;
2085
+ border-radius: 4px;
2086
+ cursor: pointer;
2087
+ font-size: 13px;
2088
+ }
2089
+ .derive-btn:hover { opacity: 0.85; }
2090
+ .derive-btn:disabled { opacity: 0.4; cursor: not-allowed; }
2091
+ .derive-accept-btn {
2092
+ background: #2ea043;
2093
+ color: #fff;
2094
+ border: none;
2095
+ padding: 6px 14px;
2096
+ border-radius: 4px;
2097
+ cursor: pointer;
2098
+ font-size: 13px;
2099
+ margin-right: 8px;
2100
+ }
2101
+ .derive-cancel-btn {
2102
+ background: transparent;
2103
+ color: var(--text);
2104
+ border: 1px solid var(--border);
2105
+ padding: 6px 14px;
2106
+ border-radius: 4px;
2107
+ cursor: pointer;
2108
+ font-size: 13px;
2109
+ }
2110
+
2111
+ /* ── Workflow next-step banner ── */
2112
+ #workflow-banner {
2113
+ display: none;
2114
+ align-items: center;
2115
+ gap: 16px;
2116
+ padding: 12px 20px;
2117
+ background: var(--surface);
2118
+ border-bottom: 1px solid var(--border);
2119
+ flex-shrink: 0;
2120
+ }
2121
+ #workflow-banner.visible { display: flex; }
2122
+
2123
+ .wf-progress-bar {
2124
+ width: 120px;
2125
+ height: 6px;
2126
+ background: rgba(255,255,255,0.06);
2127
+ border-radius: 3px;
2128
+ overflow: hidden;
2129
+ flex-shrink: 0;
2130
+ }
2131
+ .wf-progress-fill {
2132
+ height: 100%;
2133
+ border-radius: 3px;
2134
+ background: var(--act-color);
2135
+ transition: width 0.4s ease;
2136
+ }
2137
+ .wf-progress-fill.state-empty { background: var(--text-dim); }
2138
+ .wf-progress-fill.state-declarations_only { background: var(--decl-color); }
2139
+ .wf-progress-fill.state-milestones_pending { background: var(--mile-color); }
2140
+ .wf-progress-fill.state-actions_pending { background: var(--act-color); }
2141
+ .wf-progress-fill.state-executing { background: var(--executing-color); }
2142
+ .wf-progress-fill.state-complete { background: var(--integrity-whole); }
2143
+
2144
+ .wf-state-label {
2145
+ font-size: 10px;
2146
+ font-weight: 700;
2147
+ letter-spacing: 0.08em;
2148
+ text-transform: uppercase;
2149
+ color: var(--text-dim);
2150
+ flex-shrink: 0;
2151
+ }
2152
+
2153
+ .wf-next-label {
2154
+ font-size: 13px;
2155
+ color: var(--text);
2156
+ flex: 1;
2157
+ }
2158
+
2159
+ .wf-action-btn {
2160
+ background: var(--act-bg);
2161
+ border: 1px solid var(--act-border);
2162
+ color: var(--act-color);
2163
+ padding: 6px 16px;
2164
+ border-radius: 6px;
2165
+ font-size: 12px;
2166
+ font-weight: 600;
2167
+ cursor: pointer;
2168
+ flex-shrink: 0;
2169
+ transition: background 0.15s, border-color 0.15s;
2170
+ white-space: nowrap;
2171
+ }
2172
+ .wf-action-btn:hover { background: #0d2818; border-color: #2a6a48; }
2173
+
2174
+ .wf-action-btn.state-empty,
2175
+ .wf-action-btn.state-declarations_only {
2176
+ background: var(--decl-bg);
2177
+ border-color: var(--decl-border);
2178
+ color: var(--decl-color);
2179
+ }
2180
+ .wf-action-btn.state-empty:hover,
2181
+ .wf-action-btn.state-declarations_only:hover {
2182
+ background: #0f2d50;
2183
+ border-color: var(--decl-color);
2184
+ }
2185
+ .wf-action-btn.state-milestones_pending {
2186
+ background: var(--mile-bg);
2187
+ border-color: var(--mile-border);
2188
+ color: var(--mile-color);
2189
+ }
2190
+ .wf-action-btn.state-milestones_pending:hover {
2191
+ background: #220e44;
2192
+ border-color: var(--mile-color);
2193
+ }
2194
+ .wf-action-btn.state-executing {
2195
+ background: var(--executing-bg);
2196
+ border-color: var(--executing-border);
2197
+ color: var(--executing-color);
2198
+ }
2199
+ .wf-action-btn.state-complete {
2200
+ background: #0a2018;
2201
+ border-color: #1a4d34;
2202
+ color: var(--integrity-whole);
2203
+ }
2204
+
2205
+ .wf-pct {
2206
+ font-size: 12px;
2207
+ font-weight: 600;
2208
+ color: var(--text-dim);
2209
+ flex-shrink: 0;
2210
+ }
2211
+
2212
+ /* ── Reference badges ── */
2213
+ .ref-link-badge {
2214
+ display: inline-block;
2215
+ padding: 3px 10px;
2216
+ border-radius: 6px;
2217
+ font-size: 11px;
2218
+ font-weight: 500;
2219
+ text-decoration: none;
2220
+ transition: border-color 0.12s, color 0.12s;
2221
+ max-width: 100%;
2222
+ overflow: hidden;
2223
+ text-overflow: ellipsis;
2224
+ white-space: nowrap;
2225
+ }
2226
+ .ref-url-badge {
2227
+ background: var(--decl-bg);
2228
+ border: 1px solid var(--decl-border);
2229
+ color: var(--decl-color);
2230
+ cursor: pointer;
2231
+ }
2232
+ .ref-url-badge:hover { border-color: var(--decl-color); text-decoration: underline; }
2233
+ .ref-path-badge {
2234
+ background: var(--surface2);
2235
+ border: 1px solid var(--border);
2236
+ color: var(--text-dim);
2237
+ font-family: 'SF Mono', 'Fira Code', monospace;
2238
+ font-size: 10px;
2239
+ }
2240
+ .ref-input {
2241
+ background: var(--surface);
2242
+ border: 1px solid var(--border);
2243
+ color: var(--text);
2244
+ border-radius: 4px;
2245
+ padding: 6px 10px;
2246
+ width: 100%;
2247
+ font-size: 12px;
2248
+ font-family: inherit;
2249
+ outline: none;
2250
+ transition: border-color 0.15s;
2251
+ }
2252
+ .ref-input:focus { border-color: var(--decl-color); }
2253
+ .ref-save-btn {
2254
+ background: var(--decl-color);
2255
+ color: #fff;
2256
+ border: none;
2257
+ border-radius: 4px;
2258
+ padding: 5px 14px;
2259
+ cursor: pointer;
2260
+ font-size: 12px;
2261
+ font-weight: 600;
2262
+ transition: opacity 0.15s;
2263
+ }
2264
+ .ref-save-btn:hover { opacity: 0.9; }
2265
+ .ref-save-btn:disabled { opacity: 0.5; cursor: not-allowed; }
2266
+
2267
+ /* ── Activity pinned operation (at top of activity feed) ── */
2268
+ .activity-pinned {
2269
+ padding: 10px 16px;
2270
+ background: var(--executing-bg);
2271
+ border-bottom: 1px solid var(--executing-border);
2272
+ display: flex;
2273
+ align-items: center;
2274
+ gap: 8px;
2275
+ font-size: 12px;
2276
+ color: var(--executing-color);
2277
+ font-weight: 600;
2278
+ letter-spacing: 0.02em;
2279
+ flex-shrink: 0;
2280
+ }
2281
+ .activity-pinned .pinned-spinner {
2282
+ width: 10px;
2283
+ height: 10px;
2284
+ border: 2px solid var(--border);
2285
+ border-top-color: var(--executing-color);
2286
+ border-radius: 50%;
2287
+ animation: spin 0.7s linear infinite;
2288
+ flex-shrink: 0;
2289
+ }
2290
+
2291
+ /* ── Classification toggle buttons ── */
2292
+ .classify-btn {
2293
+ background: var(--surface2);
2294
+ border: 1px solid var(--border);
2295
+ color: var(--text-dim);
2296
+ padding: 4px 12px;
2297
+ border-radius: 6px;
2298
+ font-size: 11px;
2299
+ font-weight: 600;
2300
+ cursor: pointer;
2301
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
2302
+ }
2303
+ .classify-btn:hover { background: #252535; border-color: #3a3a50; color: var(--text); }
2304
+ .classify-btn.active {
2305
+ background: var(--mile-bg);
2306
+ border-color: var(--mile-border);
2307
+ color: var(--mile-color);
2308
+ }
2309
+
2310
+ /* ── Classification icon on nodes ── */
2311
+ .class-icon {
2312
+ font-size: 10px;
2313
+ margin-right: 4px;
2314
+ vertical-align: middle;
2315
+ }
2316
+
2317
+ /* ── Readiness badges on milestone nodes ── */
2318
+ .readiness-badge {
2319
+ display: inline-block;
2320
+ font-size: 9px;
2321
+ font-weight: 600;
2322
+ letter-spacing: 0.5px;
2323
+ padding: 1px 6px;
2324
+ border-radius: 8px;
2325
+ margin-left: 4px;
2326
+ vertical-align: middle;
2327
+ }
2328
+ .readiness-ready {
2329
+ background: rgba(52, 211, 153, 0.15);
2330
+ color: #34d399;
2331
+ border: 1px solid rgba(52, 211, 153, 0.3);
2332
+ }
2333
+ .readiness-blocked {
2334
+ background: rgba(255, 77, 109, 0.15);
2335
+ color: #ff4d6d;
2336
+ border: 1px solid rgba(255, 77, 109, 0.3);
2337
+ }
2338
+ .readiness-no-actions {
2339
+ background: rgba(110, 110, 136, 0.15);
2340
+ color: #6e6e88;
2341
+ border: 1px solid rgba(110, 110, 136, 0.3);
2342
+ }
2343
+
2344
+ /* ── Dependency indicator on nodes ── */
2345
+ .dep-indicator {
2346
+ font-size: 9px;
2347
+ margin-left: 5px;
2348
+ padding: 1px 5px;
2349
+ border-radius: 8px;
2350
+ background: rgba(255,255,255,0.06);
2351
+ color: var(--text-dim);
2352
+ vertical-align: middle;
2353
+ }
2354
+
2355
+ /* ── Dependency tags in detail panel ── */
2356
+ .dep-tag {
2357
+ display: inline-flex;
2358
+ align-items: center;
2359
+ gap: 4px;
2360
+ padding: 3px 8px;
2361
+ border-radius: 6px;
2362
+ font-size: 11px;
2363
+ font-weight: 500;
2364
+ background: var(--mile-bg);
2365
+ border: 1px solid var(--mile-border);
2366
+ color: var(--mile-color);
2367
+ cursor: pointer;
2368
+ transition: border-color 0.12s;
2369
+ }
2370
+ .dep-tag:hover { border-color: var(--mile-color); }
2371
+ .dep-remove {
2372
+ font-size: 13px;
2373
+ line-height: 1;
2374
+ opacity: 0.5;
2375
+ cursor: pointer;
2376
+ transition: opacity 0.12s;
2377
+ }
2378
+ .dep-remove:hover { opacity: 1; color: var(--broken-color); }
2379
+
2380
+ /* ── Dependency edges in DAG ── */
2381
+ .edge.dep-edge {
2382
+ stroke: var(--mile-color);
2383
+ stroke-dasharray: 6 4;
2384
+ opacity: 0.4;
2385
+ }
2386
+ .edge.dep-edge.highlight {
2387
+ opacity: 0.8;
2388
+ }
2389
+
2390
+ /* ── Review state badges ── */
2391
+ .review-badge {
2392
+ display: inline-block;
2393
+ padding: 2px 7px;
2394
+ border-radius: 99px;
2395
+ font-size: 10px;
2396
+ font-weight: 600;
2397
+ letter-spacing: 0.02em;
2398
+ text-transform: uppercase;
2399
+ cursor: pointer;
2400
+ user-select: none;
2401
+ transition: opacity 0.15s;
2402
+ }
2403
+ .review-badge:hover { opacity: 0.8; }
2404
+ .review-draft { background: rgba(255,255,255,0.05); color: var(--text-dim); border: 1px solid var(--border); }
2405
+ .review-in_review { background: rgba(147,197,253,0.1); color: #93c5fd; border: 1px solid rgba(147,197,253,0.25); }
2406
+ .review-revision_needed { background: rgba(251,191,36,0.1); color: #fbbf24; border: 1px solid rgba(251,191,36,0.25); }
2407
+ .review-approved { background: rgba(134,239,172,0.1); color: #86efac; border: 1px solid rgba(134,239,172,0.25); }
2408
+
2409
+ /* ── Annotation panel ── */
2410
+ .annotation-panel {
2411
+ margin-top: 20px;
2412
+ border-top: 1px solid var(--border);
2413
+ padding-top: 16px;
2414
+ }
2415
+ .annotation-count {
2416
+ font-size: 10px;
2417
+ color: var(--text-dim);
2418
+ font-weight: 400;
2419
+ }
2420
+ .annotation-lines {
2421
+ font-family: 'SF Mono', 'Fira Code', monospace;
2422
+ font-size: 11px;
2423
+ line-height: 1.6;
2424
+ background: var(--bg);
2425
+ border: 1px solid var(--border);
2426
+ border-radius: 6px;
2427
+ padding: 8px 0;
2428
+ max-height: 400px;
2429
+ overflow-y: auto;
2430
+ }
2431
+ .ann-line {
2432
+ display: flex;
2433
+ padding: 0 10px;
2434
+ }
2435
+ .ann-line:hover {
2436
+ background: var(--surface2);
2437
+ }
2438
+ .ann-line-num {
2439
+ color: var(--text-dim);
2440
+ opacity: 0.5;
2441
+ min-width: 32px;
2442
+ text-align: right;
2443
+ padding-right: 10px;
2444
+ cursor: pointer;
2445
+ user-select: none;
2446
+ }
2447
+ .ann-line-num:hover {
2448
+ opacity: 1;
2449
+ color: #60a5fa;
2450
+ }
2451
+ .ann-line-text {
2452
+ white-space: pre;
2453
+ overflow-x: auto;
2454
+ flex: 1;
2455
+ }
2456
+ .ann-line.has-annotation {
2457
+ background: rgba(234, 179, 8, 0.08);
2458
+ border-left: 2px solid #eab308;
2459
+ }
2460
+ .ann-comment {
2461
+ display: flex;
2462
+ align-items: center;
2463
+ gap: 8px;
2464
+ padding: 4px 10px 4px 42px;
2465
+ background: rgba(234, 179, 8, 0.06);
2466
+ border-left: 2px solid #eab308;
2467
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
2468
+ font-size: 11px;
2469
+ }
2470
+ .ann-comment-text {
2471
+ flex: 1;
2472
+ color: #eab308;
2473
+ }
2474
+ .ann-comment-meta {
2475
+ font-size: 9px;
2476
+ color: var(--text-dim);
2477
+ opacity: 0.6;
2478
+ }
2479
+ .ann-resolve-btn {
2480
+ background: none;
2481
+ border: none;
2482
+ color: var(--text-dim);
2483
+ cursor: pointer;
2484
+ font-size: 14px;
2485
+ padding: 0 4px;
2486
+ opacity: 0.5;
2487
+ }
2488
+ .ann-resolve-btn:hover {
2489
+ opacity: 1;
2490
+ color: var(--broken-color);
2491
+ }
2492
+ .ann-input-row {
2493
+ display: flex;
2494
+ gap: 6px;
2495
+ padding: 4px 10px 4px 42px;
2496
+ background: rgba(96, 165, 250, 0.06);
2497
+ }
2498
+ .ann-input {
2499
+ flex: 1;
2500
+ background: var(--surface);
2501
+ border: 1px solid var(--border);
2502
+ color: var(--text);
2503
+ border-radius: 4px;
2504
+ padding: 4px 8px;
2505
+ font-size: 11px;
2506
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
2507
+ }
2508
+ .ann-input:focus {
2509
+ outline: none;
2510
+ border-color: #60a5fa;
2511
+ }
2512
+ .ann-submit-btn {
2513
+ background: #60a5fa;
2514
+ color: #000;
2515
+ border: none;
2516
+ border-radius: 4px;
2517
+ padding: 4px 10px;
2518
+ font-size: 10px;
2519
+ font-weight: 700;
2520
+ cursor: pointer;
2521
+ }
2522
+ .ann-submit-btn:hover {
2523
+ background: #93bbfd;
2524
+ }
2525
+ .ann-show-more-btn {
2526
+ display: block;
2527
+ width: 100%;
2528
+ background: none;
2529
+ border: none;
2530
+ border-top: 1px solid var(--border);
2531
+ color: var(--text-dim);
2532
+ padding: 6px;
2533
+ font-size: 10px;
2534
+ cursor: pointer;
2535
+ text-align: center;
2536
+ }
2537
+ .ann-show-more-btn:hover {
2538
+ color: var(--text);
2539
+ background: var(--surface2);
2540
+ }
2541
+ .ann-no-artifact {
2542
+ color: var(--text-dim);
2543
+ font-size: 11px;
2544
+ opacity: 0.5;
2545
+ font-style: italic;
2546
+ padding: 8px 0;
2547
+ }
2548
+ .ann-approve-section {
2549
+ display: flex;
2550
+ align-items: center;
2551
+ gap: 12px;
2552
+ margin-top: 12px;
2553
+ padding: 10px 12px;
2554
+ background: rgba(34, 197, 94, 0.08);
2555
+ border: 1px solid rgba(34, 197, 94, 0.3);
2556
+ border-radius: 6px;
2557
+ }
2558
+ .ann-approve-msg {
2559
+ flex: 1;
2560
+ font-size: 11px;
2561
+ color: #22c55e;
2562
+ font-weight: 500;
2563
+ }
2564
+ .ann-approve-btn {
2565
+ background: #22c55e;
2566
+ color: #000;
2567
+ border: none;
2568
+ border-radius: 4px;
2569
+ padding: 6px 16px;
2570
+ font-size: 11px;
2571
+ font-weight: 700;
2572
+ cursor: pointer;
2573
+ text-transform: uppercase;
2574
+ letter-spacing: 0.05em;
2575
+ }
2576
+ .ann-approve-btn:hover {
2577
+ background: #4ade80;
2578
+ }
2579
+
2580
+ /* ── Revision round badge ── */
2581
+ .revision-round-badge {
2582
+ background: #e8e0ff;
2583
+ color: #5b21b6;
2584
+ font-size: 11px;
2585
+ padding: 2px 8px;
2586
+ border-radius: 10px;
2587
+ font-weight: 600;
2588
+ margin-left: 8px;
2589
+ }
2590
+
2591
+ /* ── Revision request button and output panel ── */
2592
+ .ann-revise-section {
2593
+ padding: 12px 8px;
2594
+ border-top: 1px solid #e5e7eb;
2595
+ margin-top: 8px;
2596
+ }
2597
+ .ann-revise-btn {
2598
+ background: #7c3aed;
2599
+ color: white;
2600
+ border: none;
2601
+ padding: 8px 16px;
2602
+ border-radius: 6px;
2603
+ cursor: pointer;
2604
+ font-weight: 600;
2605
+ width: 100%;
2606
+ font-size: 12px;
2607
+ }
2608
+ .ann-revise-btn:hover {
2609
+ background: #6d28d9;
2610
+ }
2611
+ .ann-revise-btn:disabled {
2612
+ opacity: 0.6;
2613
+ cursor: not-allowed;
2614
+ }
2615
+ .ann-revise-hint {
2616
+ font-size: 11px;
2617
+ color: #6b7280;
2618
+ margin-top: 4px;
2619
+ text-align: center;
2620
+ }
2621
+ #revision-panel {
2622
+ background: #1e1b2e;
2623
+ border-radius: 8px;
2624
+ padding: 12px;
2625
+ margin-top: 12px;
2626
+ }
2627
+ .revision-panel-header {
2628
+ color: #c4b5fd;
2629
+ font-weight: 600;
2630
+ margin-bottom: 8px;
2631
+ font-size: 13px;
2632
+ }
2633
+ #revision-output {
2634
+ background: #0f0d1a;
2635
+ color: #e2e8f0;
2636
+ font-size: 11px;
2637
+ font-family: monospace;
2638
+ padding: 8px;
2639
+ border-radius: 4px;
2640
+ max-height: 300px;
2641
+ overflow-y: auto;
2642
+ white-space: pre-wrap;
2643
+ word-break: break-word;
2644
+ }
2645
+ .revision-stop-btn {
2646
+ background: #ef4444;
2647
+ color: white;
2648
+ border: none;
2649
+ padding: 4px 12px;
2650
+ border-radius: 4px;
2651
+ cursor: pointer;
2652
+ margin-top: 8px;
2653
+ font-size: 12px;
2654
+ }
2655
+ .revision-stop-btn:hover {
2656
+ background: #dc2626;
2657
+ }
2658
+
2659
+ /* ── Diff view ── */
2660
+ .ann-diff-toggle {
2661
+ background: transparent;
2662
+ border: 1px solid #7c3aed;
2663
+ color: #7c3aed;
2664
+ font-size: 11px;
2665
+ padding: 2px 8px;
2666
+ border-radius: 4px;
2667
+ cursor: pointer;
2668
+ margin-left: 8px;
2669
+ }
2670
+ .ann-diff-toggle:hover {
2671
+ background: #7c3aed;
2672
+ color: white;
2673
+ }
2674
+ .diff-view {
2675
+ font-family: 'SF Mono', 'Fira Code', monospace;
2676
+ font-size: 11px;
2677
+ overflow-x: auto;
2678
+ max-height: 500px;
2679
+ overflow-y: auto;
2680
+ border-radius: 4px;
2681
+ border: 1px solid var(--border);
2682
+ }
2683
+ .diff-header {
2684
+ padding: 8px 12px;
2685
+ background: var(--surface2);
2686
+ border-bottom: 1px solid var(--border);
2687
+ display: flex;
2688
+ justify-content: space-between;
2689
+ align-items: center;
2690
+ font-weight: 600;
2691
+ font-size: 12px;
2692
+ color: var(--text-bright);
2693
+ }
2694
+ .diff-line {
2695
+ display: flex;
2696
+ padding: 0 8px;
2697
+ min-height: 20px;
2698
+ line-height: 20px;
2699
+ }
2700
+ .diff-line.diff-add {
2701
+ background: rgba(34, 197, 94, 0.12);
2702
+ }
2703
+ .diff-line.diff-remove {
2704
+ background: rgba(239, 68, 68, 0.12);
2705
+ }
2706
+ .diff-line.diff-same {
2707
+ background: transparent;
2708
+ }
2709
+ .diff-gutter {
2710
+ width: 35px;
2711
+ text-align: right;
2712
+ padding-right: 8px;
2713
+ color: var(--text-dim);
2714
+ user-select: none;
2715
+ flex-shrink: 0;
2716
+ font-size: 10px;
2717
+ opacity: 0.5;
2718
+ }
2719
+ .diff-gutter-old {}
2720
+ .diff-gutter-new {}
2721
+ .diff-text {
2722
+ flex: 1;
2723
+ white-space: pre-wrap;
2724
+ word-break: break-all;
2725
+ }
2726
+ .diff-prefix {
2727
+ width: 16px;
2728
+ text-align: center;
2729
+ flex-shrink: 0;
2730
+ font-weight: bold;
2731
+ }
2732
+ .diff-prefix.diff-add {
2733
+ color: #22c55e;
2734
+ }
2735
+ .diff-prefix.diff-remove {
2736
+ color: #ef4444;
2737
+ }
2738
+ .diff-close-btn {
2739
+ background: transparent;
2740
+ border: 1px solid var(--text-dim);
2741
+ color: var(--text-dim);
2742
+ font-size: 11px;
2743
+ padding: 2px 8px;
2744
+ border-radius: 4px;
2745
+ cursor: pointer;
2746
+ }
2747
+ .diff-close-btn:hover {
2748
+ border-color: var(--text-bright);
2749
+ color: var(--text-bright);
2750
+ }
2751
+
2752
+ /* ── Readiness banner ── */
2753
+ #readiness-banner {
2754
+ display: none;
2755
+ padding: 8px 16px;
2756
+ background: var(--surface);
2757
+ border-bottom: 1px solid var(--border);
2758
+ font-size: 13px;
2759
+ gap: 8px;
2760
+ align-items: center;
2761
+ flex-wrap: wrap;
2762
+ flex-shrink: 0;
2763
+ }
2764
+ #readiness-banner.active { display: flex; }
2765
+ .rb-progress { font-weight: 600; color: var(--text); }
2766
+ .rb-remaining { color: var(--text-dim); }
2767
+ .rb-complete { color: var(--act-color); font-weight: 600; }
2768
+ .rb-link {
2769
+ color: var(--act-color);
2770
+ cursor: pointer;
2771
+ text-decoration: underline;
2772
+ margin: 0 2px;
2773
+ font-size: 12px;
2774
+ }
2775
+ .rb-link:hover { opacity: 0.8; }
2776
+ .rb-more { color: var(--text-dim); font-size: 12px; }
2777
+ .enter-exec-btn {
2778
+ margin-left: 8px;
2779
+ padding: 7px 20px;
2780
+ border: none;
2781
+ border-radius: var(--radius);
2782
+ font-weight: 600;
2783
+ font-size: 13px;
2784
+ cursor: pointer;
2785
+ background: var(--accent);
2786
+ color: #111;
2787
+ transition: opacity 0.15s, transform 0.1s;
2788
+ }
2789
+ .enter-exec-btn:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
2790
+ .enter-exec-btn:active:not(:disabled) { transform: scale(0.98); }
2791
+ .enter-exec-btn:disabled {
2792
+ opacity: 0.3;
2793
+ cursor: not-allowed;
2794
+ }
2795
+
2796
+ /* ── Review action buttons ── */
2797
+ .review-actions {
2798
+ display: flex; gap: 8px; align-items: center;
2799
+ margin: 12px 0; padding: 10px;
2800
+ background: var(--surface1, var(--surface));
2801
+ border-radius: 6px;
2802
+ border: 1px solid var(--border);
2803
+ }
2804
+ .ra-btn {
2805
+ padding: 6px 14px; border-radius: 4px; border: 1px solid var(--border);
2806
+ cursor: pointer; font-size: 13px; font-weight: 500;
2807
+ background: var(--surface2, var(--surface)); color: var(--text);
2808
+ transition: background 0.15s, border-color 0.15s;
2809
+ }
2810
+ .ra-btn:hover { opacity: 0.85; }
2811
+ .ra-approve.ra-active { background: var(--done-bg); color: var(--done-color); border-color: var(--done-border); }
2812
+ .ra-revision.ra-active { background: var(--broken-bg); color: var(--broken-color); border-color: var(--broken-border); }
2813
+ .ra-state { font-size: 12px; color: var(--text-dim); margin-left: auto; }
2814
+
2815
+ /* ── Execution pipeline view ── */
2816
+ #execution-view {
2817
+ display: none;
2818
+ width: 100%;
2819
+ height: 100%;
2820
+ background: var(--bg);
2821
+ padding-right: var(--panel-width);
2822
+ }
2823
+ #execution-view.active { display: flex; flex-direction: column; }
2824
+ .exec-content { display: flex; flex-direction: row; flex: 1; overflow: hidden; }
2825
+
2826
+ .exec-left-panel {
2827
+ width: 340px;
2828
+ flex-shrink: 0;
2829
+ overflow-y: auto;
2830
+ border-right: 1px solid var(--border);
2831
+ padding: 16px;
2832
+ }
2833
+
2834
+ .exec-pipeline { }
2835
+
2836
+ .exec-output-panel {
2837
+ flex: 1;
2838
+ display: flex;
2839
+ flex-direction: column;
2840
+ overflow: hidden;
2841
+ }
2842
+ .exec-output-header {
2843
+ height: 36px;
2844
+ flex-shrink: 0;
2845
+ display: flex;
2846
+ align-items: center;
2847
+ padding: 0 16px;
2848
+ background: var(--surface);
2849
+ border-bottom: 1px solid var(--border);
2850
+ font-size: 12px;
2851
+ color: var(--text-dim);
2852
+ }
2853
+ .exec-output-log {
2854
+ flex: 1;
2855
+ overflow-y: auto;
2856
+ padding: 12px 16px;
2857
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
2858
+ font-size: 12px;
2859
+ line-height: 1.6;
2860
+ color: var(--text);
2861
+ white-space: pre-wrap;
2862
+ word-break: break-all;
2863
+ background: var(--bg);
2864
+ margin: 0;
2865
+ }
2866
+ .exec-output-empty {
2867
+ color: var(--text-dim);
2868
+ font-size: 13px;
2869
+ padding: 40px;
2870
+ text-align: center;
2871
+ }
2872
+
2873
+ .exec-wave-label {
2874
+ font-size: 11px;
2875
+ color: var(--text-dim);
2876
+ margin-bottom: 4px;
2877
+ padding-left: 4px;
2878
+ margin-top: 16px;
2879
+ }
2880
+ .exec-wave-label:first-child { margin-top: 0; }
2881
+
2882
+ .exec-milestone-group {
2883
+ margin-bottom: 16px;
2884
+ }
2885
+
2886
+ .exec-milestone-header {
2887
+ font-weight: 600;
2888
+ color: var(--mile-color);
2889
+ padding: 8px 12px;
2890
+ background: var(--mile-bg);
2891
+ border: 1px solid var(--mile-border);
2892
+ border-radius: 6px;
2893
+ font-size: 14px;
2894
+ display: flex;
2895
+ align-items: center;
2896
+ gap: 8px;
2897
+ }
2898
+ .exec-milestone-header .exec-milestone-status {
2899
+ font-size: 10px;
2900
+ font-weight: 700;
2901
+ letter-spacing: 0.05em;
2902
+ text-transform: uppercase;
2903
+ padding: 2px 8px;
2904
+ border-radius: 8px;
2905
+ background: rgba(255,255,255,0.06);
2906
+ margin-left: auto;
2907
+ flex-shrink: 0;
2908
+ }
2909
+
2910
+ .exec-action-list {
2911
+ margin-left: 20px;
2912
+ border-left: 2px solid var(--border);
2913
+ padding-left: 16px;
2914
+ }
2915
+
2916
+ .exec-action-item {
2917
+ display: flex;
2918
+ align-items: center;
2919
+ gap: 10px;
2920
+ padding: 8px 12px;
2921
+ margin: 4px 0;
2922
+ background: var(--surface);
2923
+ border: 1px solid var(--border);
2924
+ border-radius: 4px;
2925
+ cursor: pointer;
2926
+ font-size: 13px;
2927
+ transition: background 0.15s, border-color 0.15s;
2928
+ }
2929
+ .exec-action-item:hover { background: var(--surface2); }
2930
+ .exec-action-item.active {
2931
+ border-color: var(--executing-border);
2932
+ background: var(--executing-bg);
2933
+ }
2934
+
2935
+ .exec-status-dot {
2936
+ width: 10px;
2937
+ height: 10px;
2938
+ border-radius: 50%;
2939
+ flex-shrink: 0;
2940
+ transition: background 0.3s ease, box-shadow 0.3s ease;
2941
+ }
2942
+ .exec-status-dot.queued { background: #555; }
2943
+ .exec-status-dot.running { background: var(--planned-color); animation: exec-pulse 1.5s ease-in-out infinite; }
2944
+ .exec-status-dot.done { background: var(--act-color); animation: dotComplete 0.3s ease; }
2945
+ .exec-status-dot.failed { background: var(--broken-color); animation: dotComplete 0.3s ease; }
2946
+
2947
+ @keyframes exec-pulse {
2948
+ 0%, 100% { opacity: 1; }
2949
+ 50% { opacity: 0.3; }
2950
+ }
2951
+
2952
+ @keyframes dotComplete {
2953
+ 0% { transform: scale(1); }
2954
+ 50% { transform: scale(1.3); }
2955
+ 100% { transform: scale(1); }
2956
+ }
2957
+
2958
+ .exec-action-title {
2959
+ flex: 1;
2960
+ color: var(--text);
2961
+ overflow: hidden;
2962
+ text-overflow: ellipsis;
2963
+ white-space: nowrap;
2964
+ }
2965
+
2966
+ .exec-action-status-label {
2967
+ font-size: 11px;
2968
+ color: var(--text-dim);
2969
+ text-transform: uppercase;
2970
+ flex-shrink: 0;
2971
+ }
2972
+
2973
+ /* ── Execution mode: hide all edit controls ── */
2974
+ body.exec-mode #new-decl-btn { display: none; }
2975
+ body.exec-mode #play-btn { display: none; }
2976
+ body.exec-mode #workflow-banner { display: none; }
2977
+ body.exec-mode #readiness-banner { display: none; }
2978
+ body.exec-mode #side-panel { display: none; }
2979
+ body.exec-mode #activity-feed { display: none; }
2980
+ body.exec-mode #view-toggle { display: none; }
2981
+ body.exec-mode #execution-view { padding-right: 0; }
2982
+
2983
+ /* ── Execution topbar ── */
2984
+ .exec-topbar {
2985
+ display: none;
2986
+ align-items: center;
2987
+ gap: 12px;
2988
+ padding: 0 16px;
2989
+ height: 36px;
2990
+ background: var(--surface);
2991
+ border-bottom: 1px solid var(--border);
2992
+ flex-shrink: 0;
2993
+ }
2994
+ body.exec-mode .exec-topbar { display: flex; }
2995
+ body:not(.exec-mode) .exec-topbar { display: none; }
2996
+ .exec-topbar-title {
2997
+ font-size: 13px;
2998
+ font-weight: 600;
2999
+ color: var(--text-bright);
3000
+ flex-shrink: 0;
3001
+ }
3002
+ .exec-exit-btn {
3003
+ padding: 4px 12px;
3004
+ border-radius: 4px;
3005
+ border: 1px solid var(--border);
3006
+ background: var(--surface2);
3007
+ color: var(--text);
3008
+ cursor: pointer;
3009
+ font-size: 12px;
3010
+ }
3011
+ .exec-exit-btn:hover { background: var(--border); }
3012
+ .exec-stop-btn {
3013
+ padding: 4px 12px;
3014
+ border-radius: 4px;
3015
+ border: 1px solid var(--broken-border);
3016
+ background: var(--broken-bg);
3017
+ color: var(--broken-color);
3018
+ cursor: pointer;
3019
+ font-size: 12px;
3020
+ font-weight: 600;
3021
+ }
3022
+ .exec-stop-btn:hover { opacity: 0.85; }
3023
+
3024
+ /* ── Execution progress bar ── */
3025
+ .exec-progress-container {
3026
+ height: 6px;
3027
+ background: var(--bg);
3028
+ border-radius: 3px;
3029
+ flex: 1;
3030
+ margin: 0 16px;
3031
+ min-width: 120px;
3032
+ }
3033
+ .exec-progress-fill {
3034
+ height: 100%;
3035
+ background: var(--decl-color);
3036
+ border-radius: 3px;
3037
+ transition: width 0.3s ease;
3038
+ width: 0;
3039
+ }
3040
+ .exec-progress-pct {
3041
+ font-size: 13px;
3042
+ color: var(--text-dim);
3043
+ min-width: 40px;
3044
+ text-align: right;
3045
+ }
3046
+
3047
+ /* ── Pre-execution wave order view ── */
3048
+ .exec-preorder-list {
3049
+ list-style: none;
3050
+ padding: 0;
3051
+ margin: 0;
3052
+ counter-reset: wave-counter;
3053
+ }
3054
+ .exec-preorder-wave {
3055
+ border-left: 3px solid var(--planned-color);
3056
+ padding: 12px 16px;
3057
+ margin-bottom: 16px;
3058
+ }
3059
+ .exec-preorder-wave-header {
3060
+ font-size: 13px;
3061
+ font-weight: 700;
3062
+ color: var(--text);
3063
+ margin-bottom: 8px;
3064
+ }
3065
+ .exec-preorder-milestone {
3066
+ padding: 6px 12px;
3067
+ font-size: 13px;
3068
+ color: var(--mile-color);
3069
+ }
3070
+ .exec-preorder-action {
3071
+ padding: 4px 12px 4px 24px;
3072
+ font-size: 12px;
3073
+ color: var(--text-dim);
3074
+ display: flex;
3075
+ align-items: center;
3076
+ gap: 8px;
3077
+ }
3078
+ .exec-confirm-btn {
3079
+ background: var(--act-color);
3080
+ color: white;
3081
+ border: none;
3082
+ padding: 10px 24px;
3083
+ border-radius: 6px;
3084
+ font-size: 14px;
3085
+ font-weight: 600;
3086
+ cursor: pointer;
3087
+ margin-top: 20px;
3088
+ width: 100%;
3089
+ }
3090
+ .exec-confirm-btn:hover { opacity: 0.9; }
3091
+
3092
+ /* ── Drag-to-reorder feedback ── */
3093
+ .exec-dragging { opacity: 0.4; outline: 2px dashed var(--planned-color); }
3094
+ .exec-drop-valid { outline: 2px solid var(--act-color); background: rgba(52, 211, 153, 0.08); }
3095
+ .exec-drop-invalid { outline: 2px solid var(--broken-color); opacity: 0.5; cursor: no-drop; }
3096
+ .exec-preorder-milestone[draggable="true"],
3097
+ .exec-preorder-action[draggable="true"] { cursor: grab; }
3098
+ .exec-preorder-milestone[draggable="true"]:active,
3099
+ .exec-preorder-action[draggable="true"]:active { cursor: grabbing; }
3100
+ .exec-preorder-milestone[draggable="true"]::before,
3101
+ .exec-preorder-action[draggable="true"]::before {
3102
+ content: "\22EE\22EE";
3103
+ color: var(--text-dim);
3104
+ margin-right: 6px;
3105
+ font-size: 11px;
3106
+ letter-spacing: -3px;
3107
+ }
3108
+
3109
+ /* ── Failure modal ── */
3110
+ .exec-failure-overlay {
3111
+ position: fixed;
3112
+ inset: 0;
3113
+ background: rgba(0,0,0,0.6);
3114
+ z-index: 1000;
3115
+ display: flex;
3116
+ align-items: center;
3117
+ justify-content: center;
3118
+ }
3119
+ .exec-failure-modal {
3120
+ background: var(--bg-card, #1e1e1e);
3121
+ border: 1px solid var(--border, #333);
3122
+ border-radius: 8px;
3123
+ padding: 24px;
3124
+ max-width: 420px;
3125
+ width: 90%;
3126
+ box-shadow: 0 8px 32px rgba(0,0,0,0.4);
3127
+ }
3128
+ .exec-failure-title {
3129
+ font-size: 16px;
3130
+ font-weight: 600;
3131
+ color: #ff6b6b;
3132
+ margin-bottom: 12px;
3133
+ }
3134
+ .exec-failure-details {
3135
+ font-size: 13px;
3136
+ color: var(--text-dim);
3137
+ margin-bottom: 20px;
3138
+ font-family: monospace;
3139
+ white-space: pre-line;
3140
+ }
3141
+ .exec-failure-actions {
3142
+ display: flex;
3143
+ gap: 10px;
3144
+ flex-wrap: wrap;
3145
+ }
3146
+ .exec-failure-btn {
3147
+ padding: 8px 16px;
3148
+ border-radius: 4px;
3149
+ border: none;
3150
+ cursor: pointer;
3151
+ font-size: 13px;
3152
+ font-weight: 500;
3153
+ }
3154
+ .exec-failure-btn.view-output {
3155
+ background: transparent;
3156
+ color: var(--accent, #4a9eff);
3157
+ border: 1px solid var(--accent, #4a9eff);
3158
+ }
3159
+ .exec-failure-btn.skip {
3160
+ background: #e8a838;
3161
+ color: #000;
3162
+ }
3163
+ .exec-failure-btn.stop {
3164
+ background: #ff4444;
3165
+ color: #fff;
3166
+ }
3167
+ .exec-failure-btn:hover { opacity: 0.85; }
3168
+
3169
+ </style>
3170
+ </head>
3171
+ <body>
3172
+
3173
+ <!-- Status bar — project name + breadcrumb + nav | integrity + next/execute -->
3174
+ <div id="status-bar">
3175
+ <span class="project-name" id="project-name">Declare</span>
3176
+ <div id="status-breadcrumb"></div>
3177
+ <button id="view-toggle" title="Toggle graph view">
3178
+ <span id="view-toggle-label">&#x2B13;</span>
3179
+ </button>
3180
+ <div class="status-right">
3181
+ <span class="status-pill" id="integrity-pill"><span class="pill-value">–</span></span>
3182
+ <button id="execute-main-btn">Next</button>
3183
+ </div>
3184
+ <button id="new-decl-btn" class="new-decl-btn" style="display:none">+ Declaration</button>
3185
+ <button id="play-btn" class="play-btn" title="Execute all ready agent milestones in dependency order" style="display:none">Play All</button>
3186
+ </div>
3187
+ <!-- Hidden stat/compat elements -->
3188
+ <span id="stat-decls" style="display:none">0</span>
3189
+ <span id="stat-miles" style="display:none">0</span>
3190
+ <span id="stat-acts" style="display:none">0</span>
3191
+ <span id="health-badge" style="display:none"></span>
3192
+ <span id="last-updated" style="display:none"></span>
3193
+ <!-- Legacy workflow banner (hidden, rendered inside status bar now) -->
3194
+ <div id="workflow-banner" style="display:none">
3195
+ <span class="wf-state-label" id="wf-state-label"></span>
3196
+ <div class="wf-progress-bar"><div class="wf-progress-fill" id="wf-progress-fill"></div></div>
3197
+ <span class="wf-pct" id="wf-pct"></span>
3198
+ <span class="wf-next-label" id="wf-next-label"></span>
3199
+ <button class="wf-action-btn" id="wf-action-btn"></button>
3200
+ </div>
3201
+
3202
+ <!-- Play progress banner -->
3203
+ <div id="play-banner">
3204
+ <span class="play-wave-label" id="play-wave-label">Wave 0/0</span>
3205
+ <div class="play-actions-list" id="play-actions-list"></div>
3206
+ <button class="play-stop-btn" id="play-stop-btn">Stop</button>
3207
+ </div>
3208
+
3209
+ <!-- Main -->
3210
+ <div id="main">
3211
+ <div id="canvas-wrap" style="display:none">
3212
+ <div id="canvas-container">
3213
+ <svg id="edges-svg"></svg>
3214
+ <div class="layer-section" id="layer-declarations">
3215
+ <div class="layer-label">Declarations</div>
3216
+ <div class="layer" id="nodes-declarations"></div>
3217
+ </div>
3218
+ <div class="layer-section" id="layer-milestones">
3219
+ <div class="layer-label">Milestones</div>
3220
+ <div class="layer" id="nodes-milestones"></div>
3221
+ </div>
3222
+ <div class="layer-section" id="layer-actions">
3223
+ <div class="layer-label">Actions</div>
3224
+ <div class="layer" id="nodes-actions"></div>
3225
+ </div>
3226
+ </div>
3227
+ </div>
3228
+
3229
+ <!-- Readiness banner — hidden, replaced by drill prompts -->
3230
+ <div id="readiness-banner"></div>
3231
+
3232
+ <!-- Drill browser — 3-panel drill-down: detail | list | activity -->
3233
+ <div id="drill-browser" class="active">
3234
+ <div id="drill-breadcrumb"></div>
3235
+ <div id="drill-body">
3236
+ <div id="drill-detail"></div>
3237
+ <div id="drill-center">
3238
+ <div id="drill-context"></div>
3239
+ <div id="drill-list"></div>
3240
+ <div id="drill-prompt"></div>
3241
+ </div>
3242
+ </div>
3243
+ </div>
3244
+
3245
+ <!-- Legacy column browser elements (hidden, kept for DOM ref compat) -->
3246
+ <div id="column-browser" style="display:none">
3247
+ <div id="col-decl-list"></div>
3248
+ <div id="col-mile-list"></div>
3249
+ <div id="col-act-list"></div>
3250
+ </div>
3251
+ <div id="decl-form-container" style="display:none"></div>
3252
+ <button id="col-decl-add-btn" style="display:none"></button>
3253
+
3254
+ <!-- Execution view — CI pipeline layout with live output panel -->
3255
+ <div id="execution-view">
3256
+ <div class="exec-topbar">
3257
+ <span class="exec-topbar-title" id="exec-topbar-title">Execution Mode</span>
3258
+ <span id="exec-wave-status" style="font-size:12px;color:var(--text-dim)"></span>
3259
+ <div class="exec-progress-container"><div class="exec-progress-fill" id="exec-progress-fill"></div></div>
3260
+ <span class="exec-progress-pct" id="exec-progress-pct"></span>
3261
+ <button class="exec-stop-btn" id="exec-stop-btn">Stop</button>
3262
+ <button class="exec-exit-btn" id="exec-exit-btn">Exit</button>
3263
+ </div>
3264
+ <div class="exec-content">
3265
+ <div class="exec-left-panel">
3266
+ <div class="exec-pipeline" id="exec-pipeline"></div>
3267
+ </div>
3268
+ <div class="exec-output-panel">
3269
+ <div class="exec-output-header" id="exec-output-header">No action selected</div>
3270
+ <pre class="exec-output-log" id="exec-output-log"></pre>
3271
+ </div>
3272
+ </div>
3273
+ <div class="exec-failure-overlay" id="exec-failure-overlay" style="display:none;">
3274
+ <div class="exec-failure-modal">
3275
+ <div class="exec-failure-title">Action Failed</div>
3276
+ <div class="exec-failure-details" id="exec-failure-details"></div>
3277
+ <div class="exec-failure-actions">
3278
+ <button class="exec-failure-btn view-output" id="exec-failure-view">View Output</button>
3279
+ <button class="exec-failure-btn skip" id="exec-failure-skip">Skip &amp; Continue</button>
3280
+ <button class="exec-failure-btn stop" id="exec-failure-stop">Stop Pipeline</button>
3281
+ </div>
3282
+ </div>
3283
+ </div>
3284
+ </div>
3285
+ </div>
3286
+
3287
+ <!-- Side panel — always visible fixed right column -->
3288
+ <div id="side-panel">
3289
+ <div id="panel-header">
3290
+ <span id="panel-title">Details</span>
3291
+ </div>
3292
+ <div id="panel-body">
3293
+ <div id="panel-empty" style="color:var(--text-dim);font-size:12px;padding:8px 0;line-height:1.7">
3294
+ Click any node to see details.<br>
3295
+ Click a declaration or milestone<br>to focus its subtree.
3296
+ </div>
3297
+ </div>
3298
+ </div>
3299
+
3300
+ <!-- Activity feed placeholder (moved into drill-body via JS) -->
3301
+ <div id="activity-feed">
3302
+ <div id="activity-pinned"></div>
3303
+ <div id="activity-toggle">
3304
+ <div id="activity-pulse"></div>
3305
+ <span id="activity-label">ACTIVITY</span>
3306
+ </div>
3307
+ <div id="activity-list">
3308
+ <div style="padding:16px;color:var(--text-muted);font-size:11px;text-align:center;">No activity yet</div>
3309
+ </div>
3310
+ </div>
3311
+
3312
+ <!-- Loading/error overlay -->
3313
+ <div id="overlay">
3314
+ <div class="spinner"></div>
3315
+ <div id="overlay-message">Loading graph…</div>
3316
+ <div id="overlay-error"></div>
3317
+ <button id="overlay-retry">Retry</button>
3318
+ </div>
3319
+
3320
+ <div id="focus-hint">Press Esc or click outside to exit focus</div>
3321
+
3322
+ <!-- File Viewer Modal -->
3323
+ <div id="file-viewer-modal">
3324
+ <div class="file-viewer-container">
3325
+ <div class="file-viewer-header">
3326
+ <span class="file-viewer-path" id="file-viewer-path"></span>
3327
+ <button class="file-viewer-close" id="file-viewer-close">&times;</button>
3328
+ </div>
3329
+ <div class="file-viewer-body" id="file-viewer-body"></div>
3330
+ </div>
3331
+ </div>
3332
+
3333
+ <script src="/public/app.js?v=2"></script>
743
3334
  </body>
744
3335
  </html>