@hanzlaa/rcode 3.4.33 → 3.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.
Files changed (106) hide show
  1. package/AGENTS.md +6 -6
  2. package/CONTRIBUTING.md +2 -0
  3. package/LICENSE +21 -0
  4. package/README.md +66 -403
  5. package/cli/doctor.js +87 -1
  6. package/cli/install.js +122 -31
  7. package/cli/lib/schemas.cjs +318 -0
  8. package/cli/postinstall.js +19 -3
  9. package/dist/rcode.js +316 -23
  10. package/package.json +14 -4
  11. package/rihal/agents/rihal-cross-platform-auditor.md +1 -1
  12. package/rihal/agents/rihal-dep-auditor.md +1 -1
  13. package/rihal/agents/rihal-docs-auditor.md +3 -145
  14. package/rihal/agents/rihal-i18n-auditor.md +1 -1
  15. package/rihal/agents/rihal-nyquist-auditor.md +4 -156
  16. package/rihal/agents/rihal-observability-auditor.md +1 -1
  17. package/rihal/bin/rihal-hooks.cjs +394 -4
  18. package/rihal/bin/rihal-tools.cjs +891 -24
  19. package/rihal/commands/create-prd.md +18 -0
  20. package/rihal/commands/execute-milestone.md +18 -0
  21. package/rihal/commands/plan-milestone.md +18 -0
  22. package/rihal/commands/scaffold-milestone.md +18 -0
  23. package/rihal/commands/scaffold-skill.md +18 -0
  24. package/rihal/references/REFERENCES_INDEX.md +49 -7
  25. package/rihal/references/agent-contracts.md +10 -0
  26. package/rihal/references/design-tokens.md +98 -0
  27. package/rihal/references/docs-auditor-playbook.md +148 -0
  28. package/rihal/references/git-preflight.md +117 -0
  29. package/rihal/references/iterative-retrieval.md +85 -0
  30. package/rihal/references/nyquist-auditor-playbook.md +157 -0
  31. package/rihal/references/workstream-flag.md +2 -2
  32. package/rihal/skills/actions/1-analysis/rihal-prfaq/SKILL.md +9 -0
  33. package/rihal/skills/actions/4-implementation/rihal-checkpoint-preview/SKILL.md +9 -0
  34. package/rihal/skills/actions/4-implementation/rihal-ci/SKILL.md +4 -0
  35. package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-02-review.md +2 -2
  36. package/rihal/skills/actions/4-implementation/rihal-harden/SKILL.md +4 -0
  37. package/rihal/skills/actions/4-implementation/rihal-migrate/SKILL.md +4 -0
  38. package/rihal/skills/agents/haitham-frontend/SKILL.md +2 -0
  39. package/rihal/templates/settings-hooks.json +39 -0
  40. package/rihal/workflows/check-todos.md +4 -0
  41. package/rihal/workflows/code-review-fix.md +4 -3
  42. package/rihal/workflows/code-review.md +1 -1
  43. package/rihal/workflows/debug.md +1 -1
  44. package/rihal/workflows/dev-story.md +4 -0
  45. package/rihal/workflows/diff.md +2 -2
  46. package/rihal/workflows/do.md +16 -8
  47. package/rihal/workflows/docs-update.md +2 -2
  48. package/rihal/workflows/enable-hooks.md +6 -1
  49. package/rihal/workflows/execute-milestone.md +139 -0
  50. package/rihal/workflows/execute-regression-gates.md +1 -1
  51. package/rihal/workflows/execute-sprint.md +54 -2
  52. package/rihal/workflows/execute-verify-phase-goal.md +31 -4
  53. package/rihal/workflows/execute-waves.md +33 -5
  54. package/rihal/workflows/execute.md +40 -6
  55. package/rihal/workflows/help.md +1 -1
  56. package/rihal/workflows/import.md +1 -1
  57. package/rihal/workflows/lens-audit.md +39 -23
  58. package/rihal/workflows/list-workspaces.md +1 -1
  59. package/rihal/workflows/map-codebase.md +4 -4
  60. package/rihal/workflows/new-milestone.md +18 -1
  61. package/rihal/workflows/new-project-research.md +53 -1
  62. package/rihal/workflows/new-workspace.md +1 -1
  63. package/rihal/workflows/plan-milestone.md +105 -0
  64. package/rihal/workflows/plan-research-validation.md +1 -1
  65. package/rihal/workflows/plan-spawn-planner.md +1 -1
  66. package/rihal/workflows/plan.md +31 -3
  67. package/rihal/workflows/plant-seed.md +6 -0
  68. package/rihal/workflows/quick.md +11 -5
  69. package/rihal/workflows/research-phase.md +24 -0
  70. package/rihal/workflows/scaffold-milestone.md +60 -0
  71. package/rihal/workflows/scaffold-skill.md +137 -0
  72. package/rihal/workflows/scan.md +1 -1
  73. package/rihal/workflows/session-report.md +43 -3
  74. package/rihal/workflows/verify-work.md +3 -3
  75. package/server/dashboard.js +154 -5
  76. package/server/lib/html/client/agents-data.js +27 -0
  77. package/server/lib/html/client/app.js +15 -0
  78. package/server/lib/html/client/components/App.js +211 -0
  79. package/server/lib/html/client/components/OrchPanel.js +293 -0
  80. package/server/lib/html/client/components/Sidebar.js +73 -0
  81. package/server/lib/html/client/components/Topbar.js +53 -0
  82. package/server/lib/html/client/components/XtermPanel.js +220 -0
  83. package/server/lib/html/client/components/shared.js +330 -0
  84. package/server/lib/html/client/icons-client.js +85 -0
  85. package/server/lib/html/client/orchestrator.js +279 -0
  86. package/server/lib/html/client/preact.js +34 -0
  87. package/server/lib/html/client/store.js +91 -0
  88. package/server/lib/html/client/util.js +186 -0
  89. package/server/lib/html/client/views/AgentsView.js +83 -0
  90. package/server/lib/html/client/views/DecisionsView.js +102 -0
  91. package/server/lib/html/client/views/FilesView.js +223 -0
  92. package/server/lib/html/client/views/KanbanView.js +236 -0
  93. package/server/lib/html/client/views/MemoryView.js +157 -0
  94. package/server/lib/html/client/views/MilestonesView.js +136 -0
  95. package/server/lib/html/client/views/OrchestrationView.js +167 -0
  96. package/server/lib/html/client/views/OverviewView.js +221 -0
  97. package/server/lib/html/client/views/PhasesView.js +184 -0
  98. package/server/lib/html/client/views/RoadmapView.js +238 -0
  99. package/server/lib/html/client/views/SprintsView.js +178 -0
  100. package/server/lib/html/client/views/TasksView.js +148 -0
  101. package/server/lib/html/client.js +42 -1064
  102. package/server/lib/html/css.js +2266 -466
  103. package/server/lib/html/icons.js +68 -0
  104. package/server/lib/html/shell.js +16 -210
  105. package/server/lib/scanner.js +109 -0
  106. package/server/orchestrator.js +362 -0
@@ -1,478 +1,2278 @@
1
+ /* CLAUDE.md exemption: pure CSS data file, no logic — 1000-line limit does not apply */
1
2
  /**
2
- * Dashboard CSS — all styles in one module.
3
- * Supports dark mode (default) and light mode via data-theme="light".
3
+ * Dashboard CSS — Linear design system.
4
+ * Dark-first (Linear-style). Rihal accent: #5e6ad2 (Aether Blue).
4
5
  */
5
6
  function renderCss() {
6
7
  return `<style>
7
- :root {
8
- --rihal-blue: #1e3a8a;
9
- --rihal-gold: #f59e0b;
10
- --bg: #0a0a0b;
11
- --bg-card: #111113;
12
- --bg-hover: #1a1a1e;
13
- --border: #1e1e24;
14
- --text-primary: #f0f0f2;
15
- --text-secondary: #a0a0aa;
16
- --text-muted: #606068;
17
- --accent-blue: #3b82f6;
18
- --accent-green: #10b981;
19
- --accent-amber: #f59e0b;
20
- --accent-red: #ef4444;
21
- --text-xs: 11px;
22
- --text-sm: 13px;
23
- --text-base: 15px;
24
- --text-lg: 18px;
25
- --text-xl: 24px;
26
- --space-1: 4px;
27
- --space-2: 8px;
28
- --space-3: 12px;
29
- --space-4: 16px;
30
- --space-5: 20px;
31
- --space-6: 24px;
32
- --space-7: 28px;
33
- --space-8: 32px;
34
- --radius-sm: 4px;
35
- --radius-md: 8px;
36
- --radius-lg: 12px;
37
- --shadow-card: 0 1px 3px rgba(0,0,0,0.4), 0 0 0 1px var(--border);
38
- }
39
- /* #313 Light mode */
40
- [data-theme="light"] {
41
- --bg: #f8f9fa;
42
- --bg-card: #ffffff;
43
- --bg-hover: #f0f1f3;
44
- --border: #e2e4e8;
45
- --text-primary: #1a1a1a;
46
- --text-secondary: #555;
47
- --text-muted: #888;
48
- --shadow-card: 0 1px 3px rgba(0,0,0,0.08), 0 0 0 1px var(--border);
49
- }
50
- * { box-sizing: border-box; margin: 0; padding: 0; }
51
- body {
52
- font-family: 'Inter', -apple-system, 'Segoe UI', sans-serif;
53
- background: var(--bg);
54
- color: var(--text-primary);
55
- line-height: 1.6;
8
+ @import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap");
9
+
10
+ /* ── Design tokens ─────────────────────────────────────────────── */
11
+ :root {
12
+ /* Surfaces */
13
+ --bg-page: #08090a;
14
+ --bg-elev-1: #0f1011;
15
+ --bg-elev-2: #161718;
16
+ --bg-elev-3: #1c1d1f;
17
+ --bg-hover: #23252a;
18
+ --bg-input: #1a1b1d;
19
+ --bg-active: #2c2d31;
20
+
21
+ /* Borders */
22
+ --border-subtle: rgba(255,255,255,0.06);
23
+ --border-default: #23252a;
24
+ --border-strong: #323334;
25
+
26
+ /* Text */
27
+ --text-primary: #f7f8f8;
28
+ --text-secondary: #b4bcd0;
29
+ --text-tertiary: #8a8f98;
30
+ --text-muted: #62666d;
31
+ --text-on-accent: #ffffff;
32
+
33
+ /* Brand — Rihal keeps Aether Blue */
34
+ --accent-primary: #5e6ad2;
35
+ --accent-hover: #7170ff;
36
+ --accent-active: #4853bb;
37
+ --accent-bg: rgba(94,106,210,0.12);
38
+ --accent-border: rgba(94,106,210,0.35);
39
+
40
+ /* Semantic */
41
+ --green: #4cb782;
42
+ --amber: #f2c94c;
43
+ --red: #eb5757;
44
+ --blue: #26b5ce;
45
+ --violet: #bf7af0;
46
+ --orange: #f2994a;
47
+
48
+ /* Status */
49
+ --status-todo: #e2e2e2;
50
+ --status-progress: #f2c94c;
51
+ --status-blocked: #eb5757;
52
+ --status-done: #4cb782;
53
+
54
+ /* Type */
55
+ --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
56
+ --font-mono: "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
57
+
58
+ /* Size scale */
59
+ --text-2xl: 24px;
60
+ --text-xl: 20px;
61
+ --text-lg: 17px;
62
+ --text-md: 15px;
63
+ --text-sm: 14px;
64
+ --text-xs: 13px;
65
+ --text-2xs: 11px;
66
+ --text-stat: 28px; /* stat card value — large metric numeral */
67
+
68
+ /* Component dimensions */
69
+ --h-header-btn: 26px; /* topbar button height */
70
+ --size-icon-btn: 32px; /* square icon button (hamburger, etc.) */
71
+
72
+ /* Spacing (4px base) */
73
+ --space-1: 2px;
74
+ --space-2: 4px;
75
+ --space-3: 8px;
76
+ --space-4: 12px;
77
+ --space-5: 16px;
78
+ --space-6: 20px;
79
+ --space-7: 24px;
80
+ --space-8: 32px;
81
+ --space-9: 48px;
82
+ --space-10: 64px;
83
+
84
+ /* Radius */
85
+ --radius-1: 2px;
86
+ --radius-2: 4px;
87
+ --radius-3: 6px;
88
+ --radius-4: 8px;
89
+ --radius-5: 12px;
90
+ --radius-full: 9999px;
91
+
92
+ /* Shadows */
93
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.4);
94
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.5);
95
+ --shadow-lg: 0 16px 32px rgba(0,0,0,0.6);
96
+ --shadow-modal: 0 32px 64px rgba(0,0,0,0.7), 0 0 0 1px rgba(255,255,255,0.06);
97
+ --shadow-focus: 0 0 0 2px var(--bg-page), 0 0 0 4px var(--accent-primary);
98
+
99
+ /* Motion */
100
+ --ease: cubic-bezier(0.4,0,0.2,1);
101
+ --ease-in: cubic-bezier(0.4,0,1,1);
102
+ --t-fast: 120ms;
103
+ --t-base: 200ms;
104
+ --t-menu: 240ms;
105
+ --t-view: 320ms;
106
+
107
+ /* Legacy compat aliases */
108
+ --bg: var(--bg-page);
109
+ --bg-card: var(--bg-elev-2);
110
+ --border: var(--border-default);
111
+ --radius-sm: var(--radius-2);
112
+ --radius-md: var(--radius-4);
113
+ --radius-lg: var(--radius-5);
114
+ --accent-green: var(--green);
115
+ --accent-amber: var(--amber);
116
+ --accent-red: var(--red);
117
+ --accent-blue: var(--blue);
118
+ }
119
+
120
+ /* Light mode */
121
+ [data-theme="light"] {
122
+ --bg-page: #f5f5f7;
123
+ --bg-elev-1: #ffffff;
124
+ --bg-elev-2: #f0f0f2;
125
+ --bg-elev-3: #e8e8ec;
126
+ --bg-hover: #e2e2e8;
127
+ --bg-input: #f8f8fa;
128
+ --bg-active: #dcdce4;
129
+ --border-subtle: rgba(0,0,0,0.06);
130
+ --border-default: #d8d8e0;
131
+ --border-strong: #c0c0cc;
132
+ --text-primary: #0f0f11;
133
+ --text-secondary: #4a4a58;
134
+ --text-tertiary: #72727e;
135
+ --text-muted: #9898a4;
136
+ --accent-bg: rgba(94,106,210,0.08);
137
+ }
138
+
139
+ /* ── Reset ─────────────────────────────────────────────────────── */
140
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
141
+
142
+ html, body {
143
+ height: 100%;
144
+ background: var(--bg-page);
145
+ color: var(--text-primary);
146
+ font-family: var(--font-sans);
147
+ font-size: var(--text-sm);
148
+ line-height: 1.5;
149
+ letter-spacing: -0.011em;
150
+ -webkit-font-smoothing: antialiased;
151
+ -moz-osx-font-smoothing: grayscale;
152
+ text-rendering: optimizeLegibility;
153
+ }
154
+
155
+ /* ── App shell — inverted L ────────────────────────────────────── */
156
+ .app-shell {
157
+ display: grid;
158
+ grid-template-columns: 240px 1fr;
159
+ height: 100vh;
160
+ overflow: hidden;
161
+ position: relative;
162
+ }
163
+
164
+ /* ── Sidebar ───────────────────────────────────────────────────── */
165
+ .sidebar {
166
+ background: var(--bg-elev-1);
167
+ border-right: 1px solid var(--border-subtle);
168
+ display: flex;
169
+ flex-direction: column;
170
+ overflow-y: auto;
171
+ overflow-x: hidden;
172
+ z-index: 20;
173
+ }
174
+
175
+ .sidebar-project {
176
+ display: flex;
177
+ flex-direction: column;
178
+ gap: 2px;
179
+ padding: var(--space-3) var(--space-4);
180
+ border-bottom: 1px solid var(--border-subtle);
181
+ min-height: 52px;
182
+ justify-content: center;
183
+ }
184
+ .sidebar-project .project-label {
185
+ font-size: var(--text-2xs);
186
+ font-weight: 500;
187
+ letter-spacing: 0.06em;
188
+ text-transform: uppercase;
189
+ color: var(--text-muted);
190
+ }
191
+ .sidebar-project > *:last-child {
192
+ font-size: var(--text-xs);
193
+ font-weight: 600;
194
+ color: var(--text-secondary);
195
+ white-space: nowrap;
196
+ overflow: hidden;
197
+ text-overflow: ellipsis;
198
+ }
199
+
200
+ .sidebar nav {
201
+ flex: 1;
202
+ padding: var(--space-3) var(--space-2);
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: 1px;
206
+ }
207
+
208
+ .nav-section {
209
+ font-size: var(--text-2xs);
210
+ font-weight: 500;
211
+ letter-spacing: 0.06em;
212
+ text-transform: uppercase;
213
+ color: var(--text-muted);
214
+ padding: var(--space-3) var(--space-3) var(--space-2);
215
+ margin-top: var(--space-3);
216
+ }
217
+ .nav-section:first-child { margin-top: 0; }
218
+
219
+ .nav-link {
220
+ display: flex;
221
+ align-items: center;
222
+ gap: var(--space-3);
223
+ height: 28px;
224
+ padding: 0 var(--space-3);
225
+ border-radius: var(--radius-2);
226
+ background: none;
227
+ border: none;
228
+ color: var(--text-tertiary);
229
+ font-family: var(--font-sans);
230
+ font-size: var(--text-xs);
231
+ font-weight: 500;
232
+ letter-spacing: -0.006em;
233
+ cursor: pointer;
234
+ width: 100%;
235
+ text-align: left;
236
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
237
+ }
238
+ .nav-link:hover { background: var(--bg-hover); color: var(--text-secondary); }
239
+ .nav-link.active { background: var(--bg-elev-2); color: var(--text-primary); }
240
+
241
+ /* Mobile hamburger */
242
+ .hamburger-btn {
243
+ display: none;
244
+ flex-direction: column;
245
+ gap: var(--space-2);
246
+ width: var(--size-icon-btn);
247
+ height: var(--size-icon-btn);
248
+ align-items: center;
249
+ justify-content: center;
250
+ background: none;
251
+ border: none;
252
+ cursor: pointer;
253
+ border-radius: var(--radius-2);
254
+ padding: 6px;
255
+ }
256
+ .hamburger-btn:hover { background: var(--bg-hover); }
257
+ .hamburger-btn span {
258
+ display: block;
259
+ width: 16px;
260
+ height: 1.5px;
261
+ background: var(--text-tertiary);
262
+ border-radius: 1px;
263
+ transition: opacity var(--t-fast) var(--ease);
264
+ }
265
+
266
+ #sidebar-backdrop {
267
+ display: none;
268
+ position: fixed;
269
+ inset: 0;
270
+ background: rgba(0,0,0,0.5); /* intentional: one-off overlay tint; translucency can't be expressed as a theme token */
271
+ z-index: 15;
272
+ }
273
+
274
+ /* ── Content area ──────────────────────────────────────────────── */
275
+ .content-area {
276
+ display: grid;
277
+ grid-template-rows: 44px 1fr;
278
+ min-height: 0;
279
+ overflow: hidden;
280
+ position: relative;
281
+ }
282
+
283
+ /* ── Topbar / header ───────────────────────────────────────────── */
284
+ header {
285
+ background: rgba(8,9,10,0.8); /* intentional: frosted glass tied to --bg-page exact value; alpha can't be expressed as a theme token */
286
+ backdrop-filter: blur(12px);
287
+ -webkit-backdrop-filter: blur(12px);
288
+ border-bottom: 1px solid var(--border-subtle);
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: space-between;
292
+ padding: 0 var(--space-5);
293
+ gap: var(--space-4);
294
+ position: relative;
295
+ z-index: 10;
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ [data-theme="light"] header {
300
+ background: rgba(245,245,247,0.85); /* intentional: light frosted glass; alpha channel can't be expressed as a theme token */
301
+ }
302
+
303
+ .brand {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: var(--space-4);
307
+ }
308
+ .brand .icon {
309
+ width: 28px;
310
+ height: 28px;
311
+ border-radius: var(--radius-2);
312
+ background: linear-gradient(135deg, var(--accent-hover), var(--accent-active));
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: center;
316
+ font-size: 15px;
317
+ flex-shrink: 0;
318
+ }
319
+ .brand h1 {
320
+ font-size: var(--text-xs);
321
+ font-weight: 600;
322
+ letter-spacing: -0.006em;
323
+ color: var(--text-primary);
324
+ }
325
+ .brand .arabic {
326
+ font-size: var(--text-2xs);
327
+ color: var(--text-muted);
328
+ letter-spacing: 0;
329
+ }
330
+
331
+ .header-actions {
332
+ display: flex;
333
+ align-items: center;
334
+ gap: var(--space-2);
335
+ }
336
+
337
+ .topbar-start-group {
338
+ display: flex;
339
+ align-items: center;
340
+ gap: var(--space-4); /* --space-4 = 12px */
341
+ }
342
+
343
+ .updated-ago {
344
+ font-size: var(--text-2xs); /* --text-2xs = 11px */
345
+ color: var(--text-muted);
346
+ }
347
+
348
+ .live {
349
+ width: 6px;
350
+ height: 6px;
351
+ border-radius: 50%;
352
+ background: var(--green);
353
+ display: inline-block;
354
+ animation: pulse-dot 2s ease-in-out infinite;
355
+ }
356
+ @keyframes pulse-dot {
357
+ 0%, 100% { opacity: 1; }
358
+ 50% { opacity: 0.4; }
359
+ }
360
+
361
+ .header-btn {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ gap: var(--space-2);
365
+ height: var(--h-header-btn);
366
+ padding: 0 var(--space-3);
367
+ background: var(--bg-elev-2);
368
+ border: 1px solid var(--border-default);
369
+ border-radius: var(--radius-2);
370
+ color: var(--text-secondary);
371
+ font-family: var(--font-sans);
372
+ font-size: var(--text-2xs);
373
+ font-weight: 500;
374
+ cursor: pointer;
375
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
376
+ letter-spacing: -0.006em;
377
+ white-space: nowrap;
378
+ }
379
+ .header-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
380
+ .header-btn:active { transform: scale(0.97); }
381
+
382
+ /* ── Main scroll area ──────────────────────────────────────────── */
383
+ .main-scroll {
384
+ overflow-y: auto;
385
+ overflow-x: hidden;
386
+ padding: var(--space-6) var(--space-7);
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: var(--space-7);
390
+ }
391
+
392
+ /* ── Views ─────────────────────────────────────────────────────── */
393
+ .view { display: none; }
394
+ .view.active { display: block; }
395
+
396
+ .view-title {
397
+ font-size: var(--text-xl);
398
+ font-weight: 600;
399
+ letter-spacing: -0.017em;
400
+ color: var(--text-primary);
401
+ margin-bottom: var(--space-5);
402
+ }
403
+
404
+ /* ── Section ───────────────────────────────────────────────────── */
405
+ section {
406
+ display: flex;
407
+ flex-direction: column;
408
+ gap: var(--space-4);
409
+ margin-top: var(--space-6);
410
+ }
411
+ section h2 {
412
+ font-size: var(--text-md);
413
+ font-weight: 600;
414
+ letter-spacing: -0.011em;
415
+ color: var(--text-primary);
416
+ }
417
+ .body {
418
+ background: var(--bg-elev-2);
419
+ border: 1px solid var(--border-subtle);
420
+ border-radius: var(--radius-4);
421
+ overflow: hidden;
422
+ }
423
+ section .body {
424
+ padding: var(--space-4) var(--space-5);
425
+ }
426
+
427
+ .ctx-pre {
428
+ margin: 0;
429
+ padding: var(--space-5);
430
+ font-family: "JetBrains Mono", "SF Mono", Consolas, monospace;
431
+ font-size: var(--text-xs);
432
+ line-height: 1.65;
433
+ color: var(--text-secondary);
434
+ white-space: pre-wrap;
435
+ word-break: break-word;
436
+ background: transparent;
437
+ border: none;
438
+ }
439
+
440
+ /* ── Stats ─────────────────────────────────────────────────────── */
441
+ .stats {
442
+ display: grid;
443
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
444
+ gap: var(--space-3);
445
+ margin-bottom: var(--space-7);
446
+ }
447
+ .stat {
448
+ background: var(--bg-elev-2);
449
+ border: 1px solid var(--border-subtle);
450
+ border-radius: var(--radius-4);
451
+ padding: var(--space-5);
452
+ border-left: 2px solid var(--accent-primary);
453
+ display: flex;
454
+ flex-direction: column;
455
+ gap: 4px;
456
+ }
457
+ .stat .label {
458
+ font-size: var(--text-2xs);
459
+ font-weight: 500;
460
+ letter-spacing: 0.06em;
461
+ text-transform: uppercase;
462
+ color: var(--text-muted);
463
+ }
464
+ .stat .value {
465
+ font-size: var(--text-stat);
466
+ font-weight: 700;
467
+ letter-spacing: -0.025em;
468
+ color: var(--text-primary);
469
+ line-height: 1;
470
+ }
471
+ .stat .sub {
472
+ font-size: var(--text-2xs);
473
+ color: var(--text-tertiary);
474
+ letter-spacing: -0.006em;
475
+ }
476
+
477
+ /* ── Items / list ──────────────────────────────────────────────── */
478
+ .item {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: var(--space-4);
482
+ padding: var(--space-3) var(--space-5);
483
+ border-bottom: 1px solid var(--border-subtle);
484
+ font-size: var(--text-xs);
485
+ color: var(--text-secondary);
486
+ cursor: pointer;
487
+ transition: background var(--t-fast) var(--ease);
488
+ letter-spacing: -0.006em;
489
+ }
490
+ .item:last-child { border-bottom: none; }
491
+ .item:hover { background: var(--bg-hover); }
492
+ .item strong {
493
+ color: var(--text-primary);
494
+ font-weight: 500;
495
+ }
496
+ .item-clickable { cursor: pointer; }
497
+ .item-clickable:hover { background: var(--bg-hover); }
498
+
499
+ .item-title {
500
+ font-size: var(--text-xs);
501
+ font-weight: 500;
502
+ color: var(--text-primary);
503
+ letter-spacing: -0.006em;
504
+ display: flex;
505
+ align-items: center;
506
+ flex-wrap: wrap;
507
+ gap: 6px;
508
+ margin-bottom: 4px;
509
+ }
510
+ .item-meta {
511
+ display: flex;
512
+ align-items: center;
513
+ flex-wrap: wrap;
514
+ gap: 4px;
515
+ font-size: var(--text-2xs);
516
+ color: var(--text-muted);
517
+ }
518
+
519
+ /* ── Tags (pill badges) ─────────────────────────────────────────── */
520
+ .tag {
521
+ display: inline-flex;
522
+ align-items: center;
523
+ height: 16px;
524
+ padding: 0 6px;
525
+ background: var(--bg-elev-3);
526
+ border: 1px solid var(--border-default);
527
+ border-radius: var(--radius-2);
528
+ font-size: var(--text-2xs);
529
+ color: var(--text-secondary);
530
+ font-family: var(--font-mono);
531
+ letter-spacing: 0;
532
+ white-space: nowrap;
533
+ }
534
+
535
+ /* ── Phase list container ───────────────────────────────────────── */
536
+ .phase-list {
537
+ background: var(--bg-elev-2);
538
+ border: 1px solid var(--border-subtle);
539
+ border-radius: var(--radius-4);
540
+ overflow: hidden;
541
+ }
542
+ .phase-list .item {
543
+ display: block;
544
+ padding: var(--space-4) var(--space-5);
545
+ border-bottom: 1px solid var(--border-subtle);
546
+ }
547
+ .phase-list .item:last-child { border-bottom: none; }
548
+ .phase-list .item:hover { background: var(--bg-hover); }
549
+
550
+ /* ── Breadcrumb / back nav ──────────────────────────────────────── */
551
+ .breadcrumb {
552
+ display: flex;
553
+ align-items: center;
554
+ gap: var(--space-2);
555
+ margin-bottom: var(--space-4);
556
+ flex-wrap: wrap;
557
+ }
558
+ .back-btn {
559
+ background: var(--bg-elev-3);
560
+ border: 1px solid var(--border-default);
561
+ border-radius: var(--radius-3);
562
+ color: var(--text-secondary);
563
+ font-size: var(--text-xs);
564
+ padding: 3px var(--space-4);
565
+ cursor: pointer;
566
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
567
+ font-family: var(--font-sans);
568
+ letter-spacing: -0.006em;
569
+ }
570
+ .back-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
571
+
572
+ /* ── Entity detail header ───────────────────────────────────────── */
573
+ .entity-header {
574
+ background: var(--bg-elev-2);
575
+ border: 1px solid var(--border-subtle);
576
+ border-radius: var(--radius-4);
577
+ padding: var(--space-5) var(--space-6);
578
+ margin-bottom: var(--space-5);
579
+ }
580
+ .entity-title {
581
+ font-size: var(--text-xl);
582
+ font-weight: 600;
583
+ letter-spacing: -0.017em;
584
+ color: var(--text-primary);
585
+ margin-bottom: var(--space-4);
586
+ display: flex;
587
+ align-items: center;
588
+ gap: var(--space-3);
589
+ flex-wrap: wrap;
590
+ }
591
+ .attr-grid {
592
+ display: grid;
593
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
594
+ gap: var(--space-3) var(--space-6);
595
+ margin-top: var(--space-4);
596
+ }
597
+ .attr-item {
598
+ display: flex;
599
+ flex-direction: column;
600
+ gap: 2px;
601
+ }
602
+ .attr-label {
603
+ font-size: var(--text-2xs);
604
+ font-weight: 500;
605
+ color: var(--text-muted);
606
+ text-transform: uppercase;
607
+ letter-spacing: 0.05em;
608
+ }
609
+ .attr-value {
610
+ font-size: var(--text-xs);
611
+ color: var(--text-primary);
612
+ font-weight: 400;
613
+ }
614
+
615
+ /* ── Completion ring ────────────────────────────────────────────── */
616
+ .completion-ring {
617
+ position: relative;
618
+ display: inline-flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ flex-shrink: 0;
622
+ }
623
+ .completion-ring svg { transform: rotate(-90deg); }
624
+ .ring-text {
625
+ position: absolute;
626
+ font-size: var(--text-2xs);
627
+ font-weight: 600;
628
+ color: var(--text-primary);
629
+ font-family: var(--font-mono);
630
+ }
631
+
632
+ /* ── Progress bar ───────────────────────────────────────────────── */
633
+ .progress-bar {
634
+ height: 4px;
635
+ background: var(--bg-elev-3);
636
+ border-radius: 2px;
637
+ overflow: hidden;
638
+ width: 100%;
639
+ }
640
+ .progress-bar-fill {
641
+ height: 100%;
642
+ background: var(--accent-primary);
643
+ border-radius: 2px;
644
+ transition: width 0.3s var(--ease);
645
+ }
646
+
647
+ /* ── Velocity bars ──────────────────────────────────────────────── */
648
+ .velocity-bar {
649
+ display: flex;
650
+ align-items: center;
651
+ gap: var(--space-3);
652
+ margin-bottom: var(--space-2);
653
+ font-size: var(--text-xs);
654
+ }
655
+ .velocity-bar-label {
656
+ width: 48px;
657
+ flex-shrink: 0;
658
+ color: var(--text-muted);
659
+ font-family: var(--font-mono);
660
+ font-size: var(--text-2xs);
661
+ }
662
+ .velocity-bar-track {
663
+ flex: 1;
664
+ height: 6px;
665
+ background: var(--bg-elev-3);
666
+ border-radius: 3px;
667
+ overflow: hidden;
668
+ }
669
+ .velocity-bar-fill {
670
+ height: 100%;
671
+ background: var(--accent-blue);
672
+ border-radius: 3px;
673
+ transition: width 0.3s var(--ease);
674
+ }
675
+ .velocity-bar-val {
676
+ width: 56px;
677
+ flex-shrink: 0;
678
+ color: var(--text-secondary);
679
+ font-family: var(--font-mono);
680
+ font-size: var(--text-2xs);
681
+ text-align: right;
682
+ }
683
+
684
+ /* ── Roadmap tree ───────────────────────────────────────────────── */
685
+ .tree-container {
686
+ background: var(--bg-elev-2);
687
+ border: 1px solid var(--border-subtle);
688
+ border-radius: var(--radius-4);
689
+ overflow: hidden;
690
+ margin-bottom: var(--space-4);
691
+ }
692
+ .tree-node { border-bottom: 1px solid var(--border-subtle); }
693
+ .tree-node:last-child { border-bottom: none; }
694
+ .tree-ms > .tree-row { background: var(--bg-elev-3); }
695
+ .tree-row {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: var(--space-2);
699
+ padding: var(--space-2) var(--space-5);
700
+ cursor: pointer;
701
+ font-size: var(--text-xs);
702
+ color: var(--text-secondary);
703
+ transition: background var(--t-fast) var(--ease);
704
+ letter-spacing: -0.006em;
705
+ }
706
+ .tree-row:hover { background: var(--bg-hover); }
707
+ .tree-header { font-weight: 600; color: var(--text-primary); }
708
+ .tree-children { padding-left: var(--space-5); }
709
+ .tree-icon { font-size: 11px; flex-shrink: 0; }
710
+ .tree-label {
711
+ flex: 1;
712
+ white-space: nowrap;
713
+ overflow: hidden;
714
+ text-overflow: ellipsis;
715
+ }
716
+ .tree-chevron {
717
+ font-size: 8px;
718
+ color: var(--text-muted);
719
+ flex-shrink: 0;
720
+ width: 10px;
721
+ }
722
+ .tree-badge {
723
+ font-size: var(--text-2xs);
724
+ color: var(--text-muted);
725
+ font-family: var(--font-mono);
726
+ flex-shrink: 0;
727
+ white-space: nowrap;
728
+ }
729
+ .task-leaf .tree-row { padding-left: var(--space-3); opacity: 0.85; }
730
+
731
+ /* ── Task expand detail ─────────────────────────────────────────── */
732
+ .task-detail {
733
+ background: var(--bg-elev-3);
734
+ border-top: 1px solid var(--border-subtle);
735
+ padding: var(--space-3) var(--space-5);
736
+ font-size: var(--text-xs);
737
+ }
738
+ .task-detail-row {
739
+ display: flex;
740
+ align-items: baseline;
741
+ gap: var(--space-2);
742
+ padding: 2px 0;
743
+ color: var(--text-secondary);
744
+ }
745
+ .task-detail-row strong { color: var(--text-muted); font-weight: 500; min-width: 64px; flex-shrink: 0; }
746
+ .task-detail-cmds { margin-top: var(--space-3); }
747
+ .task-expand-icon {
748
+ font-size: 8px;
749
+ color: var(--text-muted);
750
+ margin-left: auto;
751
+ padding-left: var(--space-2);
752
+ flex-shrink: 0;
753
+ }
754
+
755
+ /* ── Commands accordion ─────────────────────────────────────────── */
756
+ .cmd-hints {
757
+ margin-top: var(--space-4);
758
+ border: 1px solid var(--border-subtle);
759
+ border-radius: var(--radius-4);
760
+ overflow: hidden;
761
+ background: var(--bg-elev-2);
762
+ }
763
+ .cmd-hints summary {
764
+ padding: var(--space-3) var(--space-5);
765
+ font-size: var(--text-xs);
766
+ color: var(--text-secondary);
767
+ cursor: pointer;
768
+ user-select: none;
769
+ }
770
+ .cmd-hints summary:hover { background: var(--bg-hover); }
771
+ .cmd-hints-list { padding: var(--space-2) 0; }
772
+ .cmd-hint-item {
773
+ display: flex;
774
+ align-items: center;
775
+ gap: var(--space-3);
776
+ padding: var(--space-2) var(--space-5);
777
+ cursor: pointer;
778
+ transition: background var(--t-fast) var(--ease);
779
+ }
780
+ .cmd-hint-item:hover { background: var(--bg-hover); }
781
+ .cmd-text {
782
+ font-family: var(--font-mono);
783
+ font-size: var(--text-xs);
784
+ color: var(--accent-primary);
785
+ flex-shrink: 0;
786
+ }
787
+ .cmd-desc {
788
+ font-size: var(--text-xs);
789
+ color: var(--text-muted);
790
+ flex: 1;
791
+ }
792
+ .cmd-copy {
793
+ font-size: 11px;
794
+ opacity: 0.4;
795
+ flex-shrink: 0;
796
+ }
797
+ .cmd-hint-item:hover .cmd-copy { opacity: 0.8; }
798
+
799
+ /* ── Filter select ──────────────────────────────────────────────── */
800
+ .filter-select {
801
+ height: 28px;
802
+ background: var(--bg-input);
803
+ border: 1px solid var(--border-default);
804
+ border-radius: var(--radius-3);
805
+ color: var(--text-primary);
806
+ font-family: var(--font-sans);
807
+ font-size: var(--text-xs);
808
+ padding: 0 var(--space-3);
809
+ cursor: pointer;
810
+ outline: none;
811
+ transition: border-color var(--t-fast) var(--ease);
812
+ }
813
+ .filter-select:focus { border-color: var(--accent-primary); }
814
+ .filter-bar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
815
+
816
+ /* ── Decisions / Memory list ────────────────────────────────────── */
817
+ .decision-list {
818
+ background: var(--bg-elev-2);
819
+ border: 1px solid var(--border-subtle);
820
+ border-radius: var(--radius-4);
821
+ overflow: hidden;
822
+ margin-top: var(--space-2);
823
+ }
824
+ .memory-group-header {
825
+ font-size: var(--text-sm);
826
+ font-weight: 600;
827
+ color: var(--text-muted);
828
+ padding: var(--space-4) var(--space-4) var(--space-2);
829
+ text-transform: capitalize;
830
+ letter-spacing: -0.006em;
831
+ }
832
+
833
+ /* ── Markdown render ────────────────────────────────────────────── */
834
+ .md-render {
835
+ font-size: var(--text-xs);
836
+ color: var(--text-secondary);
837
+ line-height: 1.6;
838
+ letter-spacing: -0.006em;
839
+ }
840
+ .md-render h1,.md-render h2,.md-render h3 { color: var(--text-primary); margin: var(--space-4) 0 var(--space-2); font-weight: 600; }
841
+ .md-render h1 { font-size: var(--text-lg); }
842
+ .md-render h2 { font-size: var(--text-md); }
843
+ .md-render h3 { font-size: var(--text-xs); }
844
+ .md-render p { margin: var(--space-2) 0; }
845
+ .md-render code { font-family: var(--font-mono); background: var(--bg-elev-3); padding: 1px 4px; border-radius: var(--radius-1); font-size: 0.9em; }
846
+ .md-render pre { background: var(--bg-elev-3); border: 1px solid var(--border-subtle); border-radius: var(--radius-3); padding: var(--space-4); overflow-x: auto; margin: var(--space-3) 0; }
847
+ .md-render pre code { background: none; padding: 0; }
848
+ .md-render a { color: var(--accent-primary); text-decoration: none; }
849
+ .md-render a:hover { text-decoration: underline; }
850
+ .md-render ul,.md-render ol { padding-left: var(--space-5); margin: var(--space-2) 0; }
851
+ .md-render li { margin: 2px 0; }
852
+ .md-render blockquote { border-left: 2px solid var(--accent-primary); padding-left: var(--space-4); color: var(--text-muted); margin: var(--space-3) 0; }
853
+ .md-render hr { border: none; border-top: 1px solid var(--border-subtle); margin: var(--space-4) 0; }
854
+ .md-render table { border-collapse: collapse; width: 100%; margin: var(--space-3) 0; }
855
+ .md-render th,.md-render td { border: 1px solid var(--border-subtle); padding: var(--space-2) var(--space-3); text-align: left; font-size: var(--text-2xs); }
856
+ .md-render th { background: var(--bg-elev-3); font-weight: 600; color: var(--text-primary); }
857
+
858
+ /* ── Skeleton / loading ─────────────────────────────────────────── */
859
+ .skeleton {
860
+ background: linear-gradient(90deg, var(--bg-elev-2) 25%, var(--bg-elev-3) 50%, var(--bg-elev-2) 75%);
861
+ background-size: 200% 100%;
862
+ animation: shimmer 1.5s infinite;
863
+ border-radius: var(--radius-3);
864
+ height: 14px;
865
+ }
866
+ @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
867
+
868
+ /* ── Inline file entries ────────────────────────────────────────── */
869
+ .inline-file-entry {
870
+ display: flex;
871
+ align-items: center;
872
+ padding: var(--space-2) var(--space-4);
873
+ font-family: var(--font-mono);
874
+ font-size: var(--text-xs);
875
+ color: var(--text-secondary);
876
+ cursor: pointer;
877
+ border-bottom: 1px solid var(--border-subtle);
878
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
879
+ letter-spacing: 0;
880
+ }
881
+ .inline-file-entry:last-child { border-bottom: none; }
882
+ .inline-file-entry:hover { background: var(--bg-hover); color: var(--text-primary); }
883
+ .inline-file-entry.selected { background: rgba(94,106,210,0.1); color: var(--accent-primary); }
884
+ .inline-file-group { margin-bottom: var(--space-3); }
885
+ .inline-subgroup { padding-left: var(--space-4); }
886
+ .file-path-header {
887
+ font-size: var(--text-2xs);
888
+ color: var(--text-muted);
889
+ font-family: var(--font-mono);
890
+ padding: var(--space-2) var(--space-4);
891
+ border-bottom: 1px solid var(--border-subtle);
892
+ letter-spacing: 0;
893
+ }
894
+
895
+ .item-preview {
896
+ font-family: var(--font-mono);
897
+ font-size: var(--text-2xs);
898
+ color: var(--text-tertiary);
899
+ padding: var(--space-4) var(--space-5);
900
+ max-height: 280px;
901
+ overflow: auto;
902
+ white-space: pre-wrap;
903
+ word-break: break-word;
904
+ letter-spacing: 0;
905
+ line-height: 1.55;
906
+ border-top: 1px solid var(--border-subtle);
907
+ }
908
+
909
+ /* ── Empty states ──────────────────────────────────────────────── */
910
+ .empty {
911
+ display: flex;
912
+ flex-direction: column;
913
+ align-items: center;
914
+ justify-content: center;
915
+ padding: var(--space-10) var(--space-8);
916
+ color: var(--text-muted);
917
+ gap: var(--space-3);
918
+ text-align: center;
919
+ font-size: var(--text-xs);
920
+ }
921
+ .empty-action {
922
+ font-family: var(--font-mono);
923
+ font-size: var(--text-2xs);
924
+ background: var(--bg-elev-3);
925
+ border: 1px solid var(--border-default);
926
+ border-radius: var(--radius-3);
927
+ padding: var(--space-2) var(--space-4);
928
+ color: var(--text-tertiary);
929
+ margin-top: var(--space-3);
930
+ letter-spacing: 0;
931
+ }
932
+
933
+ /* ── Filter bar ────────────────────────────────────────────────── */
934
+ .filter-bar {
935
+ padding: var(--space-3) var(--space-4);
936
+ border-bottom: 1px solid var(--border-subtle);
937
+ }
938
+ .filter-input {
939
+ width: 100%;
940
+ height: 28px;
941
+ background: var(--bg-input);
942
+ border: 1px solid var(--border-default);
943
+ border-radius: var(--radius-3);
944
+ padding: 0 var(--space-4);
945
+ color: var(--text-primary);
946
+ font-family: var(--font-sans);
947
+ font-size: var(--text-xs);
948
+ letter-spacing: -0.006em;
949
+ outline: none;
950
+ transition: border-color var(--t-fast) var(--ease);
951
+ }
952
+ .filter-input::placeholder { color: var(--text-muted); }
953
+ .filter-input:focus { border-color: var(--accent-primary); }
954
+
955
+ /* ── Badges ────────────────────────────────────────────────────── */
956
+ .badge {
957
+ display: inline-flex;
958
+ align-items: center;
959
+ gap: 4px;
960
+ height: 18px;
961
+ padding: 0 6px;
962
+ border-radius: var(--radius-1);
963
+ font-size: var(--text-2xs);
964
+ font-weight: 500;
965
+ text-transform: uppercase;
966
+ letter-spacing: 0.04em;
967
+ white-space: nowrap;
968
+ }
969
+
970
+ /* ── Agents grid ───────────────────────────────────────────────── */
971
+ .agents {
972
+ display: grid;
973
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
974
+ gap: var(--space-3);
975
+ padding: var(--space-4);
976
+ }
977
+ .agent-card {
978
+ background: var(--bg-elev-2);
979
+ border: 1px solid var(--border-subtle);
980
+ border-radius: var(--radius-4);
981
+ padding: var(--space-4) var(--space-5);
982
+ transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
983
+ }
984
+ .agent-card:hover {
985
+ background: var(--bg-elev-3);
986
+ border-color: var(--border-default);
987
+ }
988
+ .agent-card .name {
989
+ font-size: var(--text-xs);
990
+ font-weight: 600;
991
+ color: var(--text-primary);
992
+ margin-bottom: 4px;
993
+ letter-spacing: -0.006em;
994
+ display: flex;
995
+ align-items: center;
996
+ gap: 6px;
997
+ flex-wrap: wrap;
998
+ }
999
+ .agent-card .arabic {
1000
+ font-size: var(--text-xl);
1001
+ color: var(--accent-primary);
1002
+ margin-bottom: 4px;
1003
+ line-height: 1.2;
1004
+ }
1005
+ .agent-card .role {
1006
+ font-size: var(--text-2xs);
1007
+ color: var(--text-tertiary);
1008
+ letter---spacing: -0.006em;
1009
+ }
1010
+ .real-badge {
1011
+ font-size: var(--text-2xs);
1012
+ font-weight: 500;
1013
+ padding: 1px 5px;
1014
+ border-radius: var(--radius-full);
1015
+ background: rgba(94,106,210,0.15);
1016
+ color: var(--accent-hover);
1017
+ text-transform: uppercase;
1018
+ letter-spacing: 0.04em;
1019
+ }
1020
+ .type-badge {
1021
+ font-size: var(--text-2xs);
1022
+ font-weight: 500;
1023
+ padding: 1px 5px;
1024
+ border-radius: var(--radius-1);
1025
+ background: var(--bg-hover);
1026
+ color: var(--text-muted);
1027
+ text-transform: uppercase;
1028
+ letter-spacing: 0.04em;
1029
+ }
1030
+
1031
+ /* ── Toast ─────────────────────────────────────────────────────── */
1032
+ .toast {
1033
+ position: fixed;
1034
+ bottom: var(--space-7);
1035
+ left: 50%;
1036
+ transform: translateX(-50%) translateY(80px);
1037
+ background: var(--bg-elev-3);
1038
+ border: 1px solid var(--border-subtle);
1039
+ border-radius: var(--radius-4);
1040
+ padding: var(--space-3) var(--space-5);
1041
+ font-size: var(--text-xs);
1042
+ font-weight: 500;
1043
+ color: var(--text-primary);
1044
+ box-shadow: var(--shadow-lg);
1045
+ z-index: 1000;
1046
+ opacity: 0;
1047
+ transition: all var(--t-base) var(--ease);
1048
+ white-space: nowrap;
1049
+ letter-spacing: -0.006em;
1050
+ pointer-events: none;
1051
+ }
1052
+ .toast.show {
1053
+ opacity: 1;
1054
+ transform: translateX(-50%) translateY(0);
1055
+ }
1056
+
1057
+ /* ── Banners ───────────────────────────────────────────────────── */
1058
+ #blocker-banner {
1059
+ display: flex;
1060
+ align-items: center;
1061
+ gap: var(--space-4);
1062
+ padding: var(--space-3) var(--space-5);
1063
+ background: rgba(235,87,87,0.1);
1064
+ border-bottom: 1px solid rgba(235,87,87,0.25);
1065
+ font-size: var(--text-xs);
1066
+ flex-shrink: 0;
1067
+ }
1068
+ .banner-title { font-weight: 600; color: var(--red); letter-spacing: -0.006em; }
1069
+ .banner-list { color: var(--text-secondary); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1070
+ .banner-dismiss {
1071
+ background: none;
1072
+ border: 1px solid rgba(235,87,87,0.4);
1073
+ border-radius: var(--radius-2);
1074
+ color: var(--red);
1075
+ font-size: var(--text-2xs);
1076
+ font-weight: 500;
1077
+ padding: 2px var(--space-3);
1078
+ cursor: pointer;
1079
+ white-space: nowrap;
1080
+ }
1081
+ .banner-dismiss:hover { background: rgba(235,87,87,0.15); }
1082
+
1083
+ #parse-warning {
1084
+ padding: var(--space-3) var(--space-5);
1085
+ background: rgba(242,201,76,0.08);
1086
+ border-bottom: 1px solid rgba(242,201,76,0.2);
1087
+ font-size: var(--text-xs);
1088
+ color: var(--amber);
1089
+ }
1090
+
1091
+ /* ── Footer ────────────────────────────────────────────────────── */
1092
+ footer {
1093
+ display: none;
1094
+ }
1095
+
1096
+ /* ── File tree ─────────────────────────────────────────────────── */
1097
+ .file-tree-item {
1098
+ display: flex;
1099
+ align-items: center;
1100
+ gap: var(--space-3);
1101
+ height: 28px;
1102
+ padding: 0 var(--space-5);
1103
+ font-size: var(--text-xs);
1104
+ color: var(--text-tertiary);
1105
+ cursor: pointer;
1106
+ border-bottom: 1px solid var(--border-subtle);
1107
+ letter-spacing: -0.006em;
1108
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1109
+ white-space: nowrap;
1110
+ overflow: hidden;
1111
+ text-overflow: ellipsis;
1112
+ }
1113
+ .file-tree-item:last-child { border-bottom: none; }
1114
+ .file-tree-item:hover { background: var(--bg-hover); color: var(--text-secondary); }
1115
+ .file-tree-item.selected { background: var(--accent-bg); color: var(--text-primary); }
1116
+ #file-view {
1117
+ padding: var(--space-5);
1118
+ background: var(--bg-elev-2);
1119
+ border: 1px solid var(--border-subtle);
1120
+ border-radius: var(--radius-4);
1121
+ margin-top: var(--space-4);
1122
+ }
1123
+
1124
+ /* ══════════════════════════════════════════════════════════════════
1125
+ KANBAN — orchestration board
1126
+ ══════════════════════════════════════════════════════════════════ */
1127
+
1128
+ .kanban-topbar {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ justify-content: space-between;
1132
+ padding: 0 var(--space-5);
1133
+ height: 40px;
1134
+ border-bottom: 1px solid var(--border-subtle);
1135
+ flex-shrink: 0;
1136
+ }
1137
+ .kanban-topbar-title {
1138
+ font-size: var(--text-xs);
1139
+ font-weight: 600;
1140
+ color: var(--text-primary);
1141
+ letter-spacing: -0.006em;
1142
+ display: flex;
1143
+ align-items: center;
1144
+ gap: var(--space-3);
1145
+ }
1146
+ .kanban-topbar-actions {
1147
+ display: flex;
1148
+ align-items: center;
1149
+ gap: var(--space-2);
1150
+ }
1151
+
1152
+ /* Orch status dot in topbar */
1153
+ .orch-status-dot {
1154
+ width: 6px;
1155
+ height: 6px;
1156
+ border-radius: 50%;
1157
+ display: inline-block;
1158
+ background: var(--text-muted);
1159
+ transition: background var(--t-base) var(--ease);
1160
+ }
1161
+ .orch-status-dot.up { background: var(--green); animation: pulse-dot 2s ease-in-out infinite; }
1162
+ .orch-status-dot.down { background: var(--red); animation: none; }
1163
+
1164
+ .kanban-board {
1165
+ display: grid;
1166
+ grid-template-columns: repeat(4, 1fr);
1167
+ gap: var(--space-3);
1168
+ padding: var(--space-5);
1169
+ height: 100%;
1170
+ min-height: 0;
1171
+ overflow-x: auto;
1172
+ align-items: start;
1173
+ }
1174
+
1175
+ .kanban-col {
1176
+ background: var(--bg-elev-1);
1177
+ border: 1px solid var(--border-subtle);
1178
+ border-radius: var(--radius-4);
1179
+ min-height: 200px;
1180
+ display: flex;
1181
+ flex-direction: column;
1182
+ overflow: hidden;
1183
+ }
1184
+
1185
+ .kanban-col-head {
1186
+ display: flex;
1187
+ align-items: center;
1188
+ justify-content: space-between;
1189
+ padding: var(--space-3) var(--space-4);
1190
+ border-bottom: 1px solid var(--border-subtle);
1191
+ flex-shrink: 0;
1192
+ }
1193
+ .kanban-col-head .col-label {
1194
+ font-size: var(--text-2xs);
1195
+ font-weight: 600;
1196
+ text-transform: uppercase;
1197
+ letter-spacing: 0.07em;
1198
+ color: var(--text-tertiary);
1199
+ display: flex;
1200
+ align-items: center;
1201
+ gap: var(--space-2);
1202
+ }
1203
+ .col-status-dot {
1204
+ width: 6px;
1205
+ height: 6px;
1206
+ border-radius: 50%;
1207
+ }
1208
+ .col-todo .col-status-dot { background: var(--status-todo); }
1209
+ .col-prog .col-status-dot { background: var(--status-progress); }
1210
+ .col-blocked .col-status-dot { background: var(--status-blocked); }
1211
+ .col-done .col-status-dot { background: var(--status-done); }
1212
+
1213
+ .kanban-count {
1214
+ display: inline-flex;
1215
+ align-items: center;
1216
+ justify-content: center;
1217
+ min-width: 18px;
1218
+ height: 18px;
1219
+ padding: 0 5px;
1220
+ background: var(--bg-elev-2);
1221
+ border-radius: var(--radius-full);
1222
+ font-size: var(--text-2xs);
1223
+ font-weight: 600;
1224
+ color: var(--text-muted);
1225
+ font-variant-numeric: tabular-nums;
1226
+ }
1227
+
1228
+ .kanban-col-body {
1229
+ flex: 1;
1230
+ padding: var(--space-2);
1231
+ display: flex;
1232
+ flex-direction: column;
1233
+ gap: var(--space-2);
1234
+ overflow-y: auto;
1235
+ }
1236
+
1237
+ /* Kanban card */
1238
+ .kanban-card {
1239
+ background: var(--bg-elev-2);
1240
+ border: 1px solid var(--border-subtle);
1241
+ border-radius: var(--radius-3);
1242
+ padding: var(--space-4);
1243
+ cursor: pointer;
1244
+ transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease);
1245
+ display: flex;
1246
+ flex-direction: column;
1247
+ gap: var(--space-2);
1248
+ position: relative;
1249
+ }
1250
+ .kanban-card:hover {
1251
+ background: var(--bg-elev-3);
1252
+ border-color: var(--border-default);
1253
+ }
1254
+ .kanban-card.running {
1255
+ border-color: var(--accent-border);
1256
+ box-shadow: 0 0 0 1px var(--accent-border);
1257
+ }
1258
+ .kanban-card.done {
1259
+ border-color: rgba(76,183,130,0.3);
1260
+ }
1261
+ .kanban-card.blocked-state {
1262
+ border-color: rgba(235,87,87,0.3);
1263
+ }
1264
+
1265
+ /* Drag-over highlight */
1266
+ .kanban-card.drag-over { opacity: 0.5; }
1267
+ .kanban-col-body.drag-target { background: var(--accent-bg); border-radius: var(--radius-3); }
1268
+
1269
+ .kanban-card-header {
1270
+ display: flex;
1271
+ align-items: flex-start;
1272
+ justify-content: space-between;
1273
+ gap: var(--space-3);
1274
+ }
1275
+ .kanban-card-title {
1276
+ font-size: var(--text-xs);
1277
+ font-weight: 500;
1278
+ color: var(--text-primary);
1279
+ letter-spacing: -0.006em;
1280
+ line-height: 1.4;
1281
+ flex: 1;
1282
+ }
1283
+ .kanban-card-id {
1284
+ font-family: var(--font-mono);
1285
+ font-size: var(--text-2xs);
1286
+ color: var(--text-muted);
1287
+ flex-shrink: 0;
1288
+ padding-top: 1px;
1289
+ letter-spacing: 0;
1290
+ }
1291
+ .kanban-card-meta {
1292
+ display: flex;
1293
+ align-items: center;
1294
+ gap: var(--space-2);
1295
+ flex-wrap: wrap;
1296
+ }
1297
+ .kanban-card-sprint {
1298
+ font-size: var(--text-2xs);
1299
+ color: var(--text-muted);
1300
+ letter-spacing: -0.006em;
1301
+ }
1302
+ .kanban-card-status {
1303
+ font-size: var(--text-2xs);
1304
+ font-weight: 500;
1305
+ text-transform: uppercase;
1306
+ letter-spacing: 0.04em;
1307
+ padding: 1px 5px;
1308
+ border-radius: var(--radius-1);
1309
+ }
1310
+ .s-todo .kanban-card-status { background: rgba(226,226,226,0.1); color: var(--status-todo); }
1311
+ .s-in_progress .kanban-card-status { background: rgba(242,201,76,0.12); color: var(--status-progress); }
1312
+ .s-blocked .kanban-card-status { background: rgba(235,87,87,0.12); color: var(--status-blocked); }
1313
+ .s-done .kanban-card-status { background: rgba(76,183,130,0.12); color: var(--status-done); }
1314
+
1315
+ /* Running indicator on card */
1316
+ .card-run-indicator {
1317
+ display: flex;
1318
+ align-items: center;
1319
+ gap: var(--space-2);
1320
+ font-size: var(--text-2xs);
1321
+ color: var(--accent-primary);
1322
+ font-weight: 500;
1323
+ letter-spacing: -0.006em;
1324
+ }
1325
+ .run-pulse {
1326
+ width: 6px;
1327
+ height: 6px;
1328
+ border-radius: 50%;
1329
+ background: var(--accent-primary);
1330
+ animation: run-blink 1s ease-in-out infinite;
1331
+ flex-shrink: 0;
1332
+ }
1333
+ @keyframes run-blink {
1334
+ 0%, 100% { opacity: 1; transform: scale(1); }
1335
+ 50% { opacity: 0.4; transform: scale(0.8); }
1336
+ }
1337
+
1338
+ .kanban-card-actions {
1339
+ display: flex;
1340
+ align-items: center;
1341
+ gap: var(--space-2);
1342
+ margin-top: 2px;
1343
+ }
1344
+
1345
+ /* Run / Stop buttons */
1346
+ .kanban-run-btn, .kanban-stop-btn {
1347
+ display: inline-flex;
1348
+ align-items: center;
1349
+ gap: 4px;
1350
+ height: 24px;
1351
+ padding: 0 var(--space-3);
1352
+ border-radius: var(--radius-2);
1353
+ font-family: var(--font-sans);
1354
+ font-size: var(--text-2xs);
1355
+ font-weight: 500;
1356
+ cursor: pointer;
1357
+ letter-spacing: -0.006em;
1358
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1359
+ border: 1px solid transparent;
1360
+ white-space: nowrap;
1361
+ }
1362
+ .kanban-run-btn {
1363
+ background: var(--accent-bg);
1364
+ border-color: var(--accent-border);
1365
+ color: var(--accent-hover);
1366
+ }
1367
+ .kanban-run-btn:hover {
1368
+ background: var(--accent-primary);
1369
+ border-color: var(--accent-primary);
1370
+ color: white;
1371
+ }
1372
+ .kanban-run-btn:active { transform: scale(0.97); }
1373
+
1374
+ .kanban-stop-btn {
1375
+ background: rgba(235,87,87,0.1);
1376
+ border-color: rgba(235,87,87,0.3);
1377
+ color: var(--red);
1378
+ }
1379
+ .kanban-stop-btn:hover {
1380
+ background: rgba(235,87,87,0.2);
1381
+ }
1382
+ .kanban-stop-btn:active { transform: scale(0.97); }
1383
+
1384
+ .kanban-view-btn {
1385
+ display: inline-flex;
1386
+ align-items: center;
1387
+ gap: 4px;
1388
+ height: 24px;
1389
+ padding: 0 var(--space-3);
1390
+ border-radius: var(--radius-2);
1391
+ font-family: var(--font-sans);
1392
+ font-size: var(--text-2xs);
1393
+ font-weight: 500;
1394
+ cursor: pointer;
1395
+ letter-spacing: -0.006em;
1396
+ background: var(--bg-hover);
1397
+ border: 1px solid var(--border-default);
1398
+ color: var(--text-secondary);
1399
+ transition: background var(--t-fast) var(--ease);
1400
+ }
1401
+ .kanban-view-btn:hover {
1402
+ background: var(--bg-active);
1403
+ color: var(--text-primary);
1404
+ }
1405
+
1406
+ .kanban-refresh-btn {
1407
+ display: inline-flex;
1408
+ align-items: center;
1409
+ gap: 4px;
1410
+ height: 26px;
1411
+ padding: 0 var(--space-3);
1412
+ border-radius: var(--radius-2);
1413
+ font-family: var(--font-sans);
1414
+ font-size: var(--text-2xs);
1415
+ font-weight: 500;
1416
+ cursor: pointer;
1417
+ letter-spacing: -0.006em;
1418
+ background: var(--bg-elev-2);
1419
+ border: 1px solid var(--border-default);
1420
+ color: var(--text-secondary);
1421
+ transition: background var(--t-fast) var(--ease);
1422
+ }
1423
+ .kanban-refresh-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
1424
+
1425
+ /* ── Orchestrator side panel ────────────────────────────────────── */
1426
+ #orch-panel {
1427
+ position: fixed;
1428
+ top: 0;
1429
+ right: 0;
1430
+ bottom: 0;
1431
+ width: 440px;
1432
+ max-width: 42vw;
1433
+ min-width: 320px;
1434
+ background: var(--bg-elev-1);
1435
+ border-left: 1px solid var(--border-subtle);
1436
+ display: flex;
1437
+ flex-direction: column;
1438
+ z-index: 50;
1439
+ transform: translateX(100%);
1440
+ transition: transform var(--t-menu) var(--ease);
1441
+ box-shadow: -8px 0 32px rgba(0,0,0,0.4);
1442
+ }
1443
+ #orch-panel.open {
1444
+ transform: translateX(0);
1445
+ }
1446
+
1447
+ .orch-panel-header {
1448
+ display: flex;
1449
+ align-items: center;
1450
+ justify-content: space-between;
1451
+ padding: 0 var(--space-4);
1452
+ height: 44px;
1453
+ border-bottom: 1px solid var(--border-subtle);
1454
+ flex-shrink: 0;
1455
+ background: var(--bg-elev-2);
1456
+ }
1457
+ .orch-panel-title {
1458
+ font-size: var(--text-xs);
1459
+ font-weight: 600;
1460
+ color: var(--text-primary);
1461
+ letter-spacing: -0.006em;
1462
+ display: flex;
1463
+ align-items: center;
1464
+ gap: var(--space-3);
1465
+ }
1466
+ .orch-panel-close {
1467
+ background: none;
1468
+ border: none;
1469
+ color: var(--text-tertiary);
1470
+ cursor: pointer;
1471
+ font-size: 18px;
1472
+ line-height: 1;
1473
+ width: 28px;
1474
+ height: 28px;
1475
+ display: flex;
1476
+ align-items: center;
1477
+ justify-content: center;
1478
+ border-radius: var(--radius-2);
1479
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1480
+ }
1481
+ .orch-panel-close:hover { background: var(--bg-hover); color: var(--text-primary); }
1482
+
1483
+ /* Tab strip */
1484
+ .orch-tabs {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ gap: 1px;
1488
+ padding: var(--space-2) var(--space-3);
1489
+ border-bottom: 1px solid var(--border-subtle);
1490
+ overflow-x: auto;
1491
+ flex-shrink: 0;
1492
+ background: var(--bg-elev-1);
1493
+ scrollbar-width: none;
1494
+ }
1495
+ .orch-tabs::-webkit-scrollbar { display: none; }
1496
+
1497
+ .orch-tab {
1498
+ display: inline-flex;
1499
+ align-items: center;
1500
+ gap: var(--space-2);
1501
+ height: 26px;
1502
+ padding: 0 var(--space-3);
1503
+ border-radius: var(--radius-2);
1504
+ font-family: var(--font-sans);
1505
+ font-size: var(--text-2xs);
1506
+ font-weight: 500;
1507
+ cursor: pointer;
1508
+ color: var(--text-tertiary);
1509
+ background: none;
1510
+ border: none;
1511
+ white-space: nowrap;
1512
+ letter-spacing: -0.006em;
1513
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1514
+ flex-shrink: 0;
1515
+ }
1516
+ .orch-tab:hover { background: var(--bg-hover); color: var(--text-secondary); }
1517
+ .orch-tab.active {
1518
+ background: var(--bg-elev-3);
1519
+ color: var(--text-primary);
1520
+ }
1521
+ .orch-tab-close {
1522
+ background: none;
1523
+ border: none;
1524
+ color: var(--text-muted);
1525
+ cursor: pointer;
1526
+ font-size: 12px;
1527
+ line-height: 1;
1528
+ padding: 0;
1529
+ display: flex;
1530
+ align-items: center;
1531
+ border-radius: 2px;
1532
+ width: 14px;
1533
+ height: 14px;
1534
+ justify-content: center;
1535
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1536
+ }
1537
+ .orch-tab-close:hover { background: var(--bg-hover); color: var(--red); }
1538
+ .orch-tab .tab-status-dot {
1539
+ width: 5px;
1540
+ height: 5px;
1541
+ border-radius: 50%;
1542
+ flex-shrink: 0;
1543
+ }
1544
+ .orch-tab .tab-status-dot.running { background: var(--accent-primary); animation: run-blink 1s infinite; }
1545
+ .orch-tab .tab-status-dot.done { background: var(--green); animation: none; }
1546
+ .orch-tab .tab-status-dot.error { background: var(--red); animation: none; }
1547
+ .orch-tab .tab-status-dot.stopped { background: var(--text-muted); animation: none; }
1548
+ .orch-tab .tab-status-dot.starting { background: var(--amber); animation: run-blink 0.6s infinite; }
1549
+
1550
+ /* Terminal body */
1551
+ .orch-terminal {
1552
+ flex: 1;
1553
+ overflow: hidden;
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ min-height: 0;
1557
+ }
1558
+ .orch-term-body {
1559
+ flex: 1;
1560
+ overflow-y: auto;
1561
+ padding: var(--space-4) var(--space-5);
1562
+ background: #050507;
1563
+ font-family: var(--font-mono);
1564
+ font-size: 12px;
1565
+ line-height: 1.6;
1566
+ letter-spacing: 0;
1567
+ scroll-behavior: smooth;
1568
+ }
1569
+ .orch-term-body::-webkit-scrollbar { width: 4px; }
1570
+ .orch-term-body::-webkit-scrollbar-track { background: transparent; }
1571
+ .orch-term-body::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; }
1572
+
1573
+ .orch-term-empty {
1574
+ display: flex;
1575
+ flex-direction: column;
1576
+ align-items: center;
1577
+ justify-content: center;
1578
+ height: 100%;
1579
+ color: var(--text-muted);
1580
+ font-family: var(--font-sans);
1581
+ font-size: var(--text-xs);
1582
+ gap: var(--space-3);
1583
+ text-align: center;
1584
+ }
1585
+
1586
+ .orch-empty-tab {
1587
+ padding: var(--space-2) var(--space-3); /* 6px 8px via space tokens */
1588
+ font-size: var(--text-2xs); /* 11px */
1589
+ color: var(--text-muted);
1590
+ }
1591
+
1592
+ .orch-footer-spacer {
1593
+ flex: 1;
1594
+ }
1595
+
1596
+ .orch-footer-status {
1597
+ font-size: var(--text-2xs); /* 11px */
1598
+ color: var(--text-muted);
1599
+ }
1600
+
1601
+ /* Terminal log lines */
1602
+ .kt-line { color: #a0c4a0; word-break: break-word; }
1603
+ .kt-line.tool { color: #7cb8ff; }
1604
+ .kt-line.warn { color: var(--amber); }
1605
+ .kt-line.err { color: var(--red); }
1606
+ .kt-line.meta { color: var(--text-muted); }
1607
+ .kt-line.done-line { color: var(--green); }
1608
+ .kt-stream { color: #c8d8c8; word-break: break-word; }
1609
+
1610
+ /* File ops panel */
1611
+ .orch-files {
1612
+ border-top: 1px solid var(--border-subtle);
1613
+ background: var(--bg-elev-2);
1614
+ max-height: 120px;
1615
+ overflow-y: auto;
1616
+ flex-shrink: 0;
1617
+ }
1618
+ .orch-files-head {
1619
+ padding: var(--space-2) var(--space-4);
1620
+ font-size: var(--text-2xs);
1621
+ font-weight: 500;
1622
+ text-transform: uppercase;
1623
+ letter-spacing: 0.06em;
1624
+ color: var(--text-muted);
1625
+ border-bottom: 1px solid var(--border-subtle);
1626
+ position: sticky;
1627
+ top: 0;
1628
+ background: var(--bg-elev-2);
1629
+ }
1630
+ .kt-file {
1631
+ display: flex;
1632
+ align-items: center;
1633
+ gap: var(--space-3);
1634
+ padding: var(--space-1) var(--space-4);
1635
+ font-family: var(--font-mono);
1636
+ font-size: var(--text-2xs);
1637
+ color: var(--text-tertiary);
1638
+ border-bottom: 1px solid var(--border-subtle);
1639
+ letter-spacing: 0;
1640
+ min-height: 22px;
1641
+ }
1642
+ .kt-file:last-child { border-bottom: none; }
1643
+ .kt-file .op-icon {
1644
+ font-size: 10px;
1645
+ flex-shrink: 0;
1646
+ width: 14px;
1647
+ text-align: center;
1648
+ }
1649
+ .op-w { color: var(--amber); }
1650
+ .op-r { color: var(--blue); }
1651
+ .op-b { color: var(--violet); }
1652
+
1653
+ /* Panel footer */
1654
+ .orch-panel-footer {
1655
+ display: flex;
1656
+ align-items: center;
1657
+ gap: var(--space-2);
1658
+ padding: var(--space-3) var(--space-4);
1659
+ border-top: 1px solid var(--border-subtle);
1660
+ background: var(--bg-elev-2);
1661
+ flex-shrink: 0;
1662
+ }
1663
+ .orch-footer-btn {
1664
+ display: inline-flex;
1665
+ align-items: center;
1666
+ gap: 4px;
1667
+ height: 26px;
1668
+ padding: 0 var(--space-3);
1669
+ border-radius: var(--radius-2);
1670
+ font-family: var(--font-sans);
1671
+ font-size: var(--text-2xs);
1672
+ font-weight: 500;
1673
+ cursor: pointer;
1674
+ letter-spacing: -0.006em;
1675
+ background: var(--bg-hover);
1676
+ border: 1px solid var(--border-default);
1677
+ color: var(--text-secondary);
1678
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
1679
+ }
1680
+ .orch-footer-btn:hover { background: var(--bg-active); color: var(--text-primary); }
1681
+ .orch-footer-btn.stop {
1682
+ background: rgba(235,87,87,0.1);
1683
+ border-color: rgba(235,87,87,0.3);
1684
+ color: var(--red);
1685
+ }
1686
+ .orch-footer-btn.stop:hover { background: rgba(235,87,87,0.2); }
1687
+
1688
+ /* ── Old kanban inline terminals (hidden) ────────────────────── */
1689
+ .kanban-log-panel { display: none !important; }
1690
+ .kanban-terminal { display: none !important; }
1691
+
1692
+ /* ── Roadmap / phases ───────────────────────────────────────── */
1693
+ .phase-row {
1694
+ display: grid;
1695
+ grid-template-columns: 36px 1fr auto;
1696
+ align-items: center;
1697
+ gap: var(--space-4);
1698
+ padding: var(--space-3) var(--space-5);
1699
+ border-bottom: 1px solid var(--border-subtle);
1700
+ font-size: var(--text-xs);
1701
+ cursor: pointer;
1702
+ transition: background var(--t-fast) var(--ease);
1703
+ letter-spacing: -0.006em;
1704
+ }
1705
+ .phase-row:last-child { border-bottom: none; }
1706
+ .phase-row:hover { background: var(--bg-hover); }
1707
+ .phase-num {
1708
+ font-family: var(--font-mono);
1709
+ font-size: var(--text-2xs);
1710
+ color: var(--text-muted);
1711
+ text-align: right;
1712
+ letter-spacing: 0;
1713
+ }
1714
+ .phase-done { color: var(--text-tertiary); }
1715
+ .phase-status {
1716
+ display: inline-flex;
1717
+ align-items: center;
1718
+ gap: 4px;
1719
+ font-size: var(--text-2xs);
1720
+ font-weight: 500;
1721
+ text-transform: uppercase;
1722
+ letter-spacing: 0.04em;
1723
+ padding: 1px 5px;
1724
+ border-radius: var(--radius-1);
1725
+ }
1726
+ .phase-status.done { background: rgba(76,183,130,0.12); color: var(--green); }
1727
+ .phase-status.planned { background: rgba(94,106,210,0.12); color: var(--accent-hover); }
1728
+ .phase-status.active { background: rgba(242,201,76,0.12); color: var(--amber); }
1729
+
1730
+ /* Sprint / tasks */
1731
+ .sprint-card {
1732
+ background: var(--bg-elev-2);
1733
+ border: 1px solid var(--border-subtle);
1734
+ border-radius: var(--radius-4);
1735
+ overflow: hidden;
1736
+ margin-bottom: var(--space-3);
1737
+ }
1738
+ .sprint-head {
1739
+ padding: var(--space-4) var(--space-5);
1740
+ border-bottom: 1px solid var(--border-subtle);
1741
+ display: flex;
1742
+ align-items: center;
1743
+ justify-content: space-between;
1744
+ cursor: pointer;
1745
+ }
1746
+ .sprint-head:hover { background: var(--bg-hover); }
1747
+ .sprint-name {
1748
+ font-size: var(--text-xs);
1749
+ font-weight: 600;
1750
+ color: var(--text-primary);
1751
+ letter-spacing: -0.006em;
1752
+ }
1753
+ .sprint-meta {
1754
+ font-size: var(--text-2xs);
1755
+ color: var(--text-muted);
1756
+ letter-spacing: -0.006em;
1757
+ }
1758
+ .task-row {
1759
+ display: flex;
1760
+ align-items: center;
1761
+ gap: var(--space-4);
1762
+ padding: var(--space-3) var(--space-5);
1763
+ border-bottom: 1px solid var(--border-subtle);
1764
+ font-size: var(--text-xs);
1765
+ letter-spacing: -0.006em;
1766
+ }
1767
+ .task-row:last-child { border-bottom: none; }
1768
+ .task-check {
1769
+ width: 14px;
1770
+ height: 14px;
1771
+ border: 1px solid var(--border-default);
1772
+ border-radius: var(--radius-1);
1773
+ flex-shrink: 0;
1774
+ display: flex;
1775
+ align-items: center;
1776
+ justify-content: center;
1777
+ font-size: 9px;
1778
+ color: var(--green);
1779
+ }
1780
+ .task-check.done { border-color: var(--green); background: rgba(76,183,130,0.12); }
1781
+ .task-id {
1782
+ font-family: var(--font-mono);
1783
+ font-size: var(--text-2xs);
1784
+ color: var(--text-muted);
1785
+ flex-shrink: 0;
1786
+ letter-spacing: 0;
1787
+ }
1788
+ .task-title {
1789
+ color: var(--text-primary);
1790
+ flex: 1;
1791
+ font-weight: 500;
1792
+ }
1793
+ .task-agent {
1794
+ font-size: var(--text-2xs);
1795
+ color: var(--text-tertiary);
1796
+ flex-shrink: 0;
1797
+ }
1798
+
1799
+ /* Memory bank */
1800
+ .memory-grid {
1801
+ display: grid;
1802
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1803
+ gap: var(--space-3);
1804
+ padding: var(--space-4);
1805
+ }
1806
+ .memory-card {
1807
+ background: var(--bg-elev-2);
1808
+ border: 1px solid var(--border-subtle);
1809
+ border-radius: var(--radius-4);
1810
+ padding: var(--space-4) var(--space-5);
1811
+ display: flex;
1812
+ flex-direction: column;
1813
+ gap: var(--space-2);
1814
+ }
1815
+ .memory-type {
1816
+ font-size: var(--text-2xs);
1817
+ font-weight: 500;
1818
+ text-transform: uppercase;
1819
+ letter-spacing: 0.06em;
1820
+ padding: 1px 5px;
1821
+ border-radius: var(--radius-1);
1822
+ display: inline-flex;
1823
+ align-self: flex-start;
1824
+ }
1825
+ .memory-type.user { background: rgba(94,106,210,0.12); color: var(--accent-hover); }
1826
+ .memory-type.feedback { background: rgba(242,201,76,0.12); color: var(--amber); }
1827
+ .memory-type.project { background: rgba(76,183,130,0.12); color: var(--green); }
1828
+ .memory-type.reference { background: rgba(38,181,206,0.12); color: var(--blue); }
1829
+ .memory-name {
1830
+ font-size: var(--text-xs);
1831
+ font-weight: 600;
1832
+ color: var(--text-primary);
1833
+ letter-spacing: -0.006em;
1834
+ }
1835
+ .memory-desc {
1836
+ font-size: var(--text-2xs);
1837
+ color: var(--text-tertiary);
1838
+ line-height: 1.5;
1839
+ letter-spacing: -0.006em;
1840
+ }
1841
+
1842
+ /* Decisions (ADRs) */
1843
+ .decision-card {
1844
+ background: var(--bg-elev-2);
1845
+ border: 1px solid var(--border-subtle);
1846
+ border-radius: var(--radius-4);
1847
+ padding: var(--space-4) var(--space-5);
1848
+ margin-bottom: var(--space-3);
1849
+ cursor: pointer;
1850
+ transition: background var(--t-fast) var(--ease);
1851
+ }
1852
+ .decision-card:hover { background: var(--bg-elev-3); }
1853
+ .decision-id {
1854
+ font-family: var(--font-mono);
1855
+ font-size: var(--text-2xs);
1856
+ color: var(--text-muted);
1857
+ letter-spacing: 0;
1858
+ margin-bottom: 4px;
1859
+ }
1860
+ .decision-title {
1861
+ font-size: var(--text-xs);
1862
+ font-weight: 600;
1863
+ color: var(--text-primary);
1864
+ letter-spacing: -0.006em;
1865
+ margin-bottom: 4px;
1866
+ }
1867
+ .decision-body {
1868
+ font-size: var(--text-2xs);
1869
+ color: var(--text-tertiary);
1870
+ line-height: 1.5;
1871
+ letter-spacing: -0.006em;
1872
+ }
1873
+
1874
+ /* ── Responsive / mobile ────────────────────────────────────── */
1875
+ @media (max-width: 768px) {
1876
+ .app-shell {
1877
+ grid-template-columns: 1fr;
1878
+ grid-template-rows: 44px 1fr;
56
1879
  }
57
- .app-shell { display: flex; height: 100vh; overflow: hidden; }
58
- /* Sidebar */
59
1880
  .sidebar {
60
- width: 240px; min-width: 240px;
61
- background: var(--bg-card);
62
- border-right: 1px solid var(--border);
63
- display: flex; flex-direction: column;
64
- overflow-y: auto; padding: var(--space-4) 0;
65
- }
66
- .sidebar-project {
67
- padding: var(--space-3) var(--space-4);
68
- font-size: var(--text-sm); font-weight: 600;
69
- color: var(--text-primary);
70
- border-bottom: 1px solid var(--border);
71
- margin-bottom: var(--space-3);
72
- }
73
- .sidebar-project .project-label {
74
- font-size: var(--text-xs); color: var(--text-muted);
75
- text-transform: uppercase; letter-spacing: 0.07em;
76
- margin-bottom: var(--space-1);
77
- }
78
- .nav-link {
79
- display: flex; align-items: center; gap: var(--space-2);
80
- padding: var(--space-2) var(--space-4);
81
- font-size: var(--text-sm); color: var(--text-secondary);
82
- cursor: pointer; border-radius: 0; border: none; background: none;
83
- width: 100%; text-align: left;
84
- transition: background 0.15s, color 0.15s; user-select: none;
85
- }
86
- .nav-link:hover { background: var(--bg-hover); color: var(--text-primary); }
87
- .nav-link.active { background: var(--bg-hover); color: var(--text-primary); font-weight: 600; }
88
- .nav-section {
89
- padding: var(--space-3) var(--space-4) var(--space-1);
90
- font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em;
91
- color: var(--text-muted); font-weight: 600;
1881
+ position: fixed;
1882
+ top: 0;
1883
+ left: -240px;
1884
+ height: 100vh;
1885
+ width: 240px;
1886
+ transition: left var(--t-menu) var(--ease);
1887
+ z-index: 30;
92
1888
  }
93
- /* Content */
94
- .content-area { flex: 1; overflow-y: auto; background: var(--bg); display: flex; flex-direction: column; }
95
- .view { display: none; padding: var(--space-8); }
96
- .view.active { display: block; }
97
- /* Header */
98
- header {
99
- background: var(--bg-card); border-bottom: 1px solid var(--border);
100
- padding: var(--space-4) var(--space-8);
101
- display: flex; justify-content: space-between; align-items: center; flex-shrink: 0;
1889
+ .sidebar.open {
1890
+ left: 0;
102
1891
  }
103
- .brand { display: flex; align-items: center; gap: var(--space-4); }
104
- .brand .icon { font-size: 40px; }
105
- .brand h1 { font-size: var(--text-xl); font-weight: 700; }
106
- .brand .arabic { color: var(--rihal-gold); font-size: var(--text-lg); margin-top: 2px; }
107
- .header-meta { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-sm); color: var(--text-secondary); }
108
- .header-actions { display: flex; align-items: center; gap: var(--space-2); }
109
- .live { display: inline-block; width: 8px; height: 8px; background: var(--accent-green); border-radius: 50%; animation: pulse 2s infinite; }
110
- @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
111
- .header-btn {
112
- background: var(--bg-hover); border: 1px solid var(--border); color: var(--text-primary);
113
- padding: var(--space-1) var(--space-3); border-radius: var(--radius-sm);
114
- cursor: pointer; font-size: var(--text-sm); transition: background 0.15s; font-family: inherit;
1892
+ #sidebar-backdrop.show {
1893
+ display: block;
115
1894
  }
116
- .header-btn:hover { background: var(--border); }
117
- /* Blocker banner */
118
- #blocker-banner {
119
- background: rgba(239,68,68,0.12); border-bottom: 1px solid rgba(239,68,68,0.4);
120
- padding: var(--space-3) var(--space-8); display: flex;
121
- align-items: center; justify-content: space-between; gap: var(--space-4);
122
- color: var(--accent-red); font-size: var(--text-sm);
123
- }
124
- #blocker-banner .banner-title { font-weight: 600; }
125
- #blocker-banner .banner-list { flex: 1; color: var(--text-secondary); font-size: var(--text-xs); margin-left: var(--space-3); }
126
- #blocker-banner .banner-dismiss {
127
- background: none; border: 1px solid rgba(239,68,68,0.4); color: var(--accent-red);
128
- padding: 2px 10px; border-radius: var(--radius-sm); cursor: pointer; font-size: var(--text-xs); font-family: inherit;
129
- }
130
- #blocker-banner .banner-dismiss:hover { background: rgba(239,68,68,0.2); }
131
- /* #322 Warning banner for parse errors */
132
- #parse-warning {
133
- background: rgba(245,158,11,0.12); border-bottom: 1px solid rgba(245,158,11,0.4);
134
- padding: var(--space-3) var(--space-8); display: flex;
135
- align-items: center; gap: var(--space-4);
136
- color: var(--accent-amber); font-size: var(--text-sm);
137
- }
138
- /* Stats grid */
139
- .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-8); }
140
- .stat {
141
- background: var(--bg-card); border: 1px solid var(--border); border-left: 4px solid var(--rihal-gold);
142
- padding: var(--space-5) var(--space-6); border-radius: var(--radius-md);
143
- }
144
- .stat .label { color: var(--text-muted); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: var(--space-2); }
145
- .stat .value { font-size: 28px; font-weight: 700; }
146
- .stat .sub { color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-1); }
147
- /* Sections */
148
- section { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); margin-bottom: var(--space-6); overflow: hidden; }
149
- section > h2 {
150
- background: rgba(245,158,11,0.08); padding: var(--space-4) var(--space-6);
151
- font-size: var(--text-sm); text-transform: uppercase; letter-spacing: 0.1em;
152
- color: var(--rihal-gold); border-bottom: 1px solid var(--border);
153
- display: flex; align-items: center; gap: 10px;
154
- }
155
- section .body { padding: var(--space-6); }
156
- /* Agent cards */
157
- .agents { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--space-3); }
158
- .agent-card {
159
- background: rgba(59,130,246,0.05); border: 1px solid var(--border);
160
- border-radius: var(--radius-md); padding: var(--space-4); transition: transform 0.2s;
161
- }
162
- .agent-card:hover { transform: translateY(-2px); border-color: var(--rihal-gold); }
163
- .agent-card .name { font-weight: 600; font-size: var(--text-base); margin-bottom: var(--space-1); }
164
- .agent-card .arabic { color: var(--rihal-gold); font-size: 14px; }
165
- .agent-card .role { color: var(--text-muted); font-size: var(--text-xs); margin-top: var(--space-2); }
166
- .agent-card.active { background: rgba(16,185,129,0.1); border-color: var(--accent-green); }
167
- .real-badge {
168
- display: inline-block; background: rgba(16,185,129,0.2); color: var(--accent-green);
169
- padding: 1px 6px; border-radius: 8px; font-size: 9px;
170
- text-transform: uppercase; letter-spacing: 0.05em; vertical-align: middle; margin-left: 4px;
171
- }
172
- /* #304 Agent type badge */
173
- .type-badge {
174
- display: inline-block; background: rgba(59,130,246,0.15); color: var(--accent-blue);
175
- padding: 1px 6px; border-radius: 8px; font-size: 9px;
176
- text-transform: uppercase; letter-spacing: 0.05em; vertical-align: middle; margin-left: 4px;
177
- }
178
- /* Items */
179
- .phase-list, .decision-list, .progress-list { display: flex; flex-direction: column; gap: var(--space-3); }
180
- .item {
181
- background: rgba(255,255,255,0.02); border: 1px solid var(--border);
182
- border-left: 3px solid var(--accent-blue); padding: var(--space-4) var(--space-5);
183
- border-radius: var(--radius-sm);
184
- }
185
- .item .item-title { font-weight: 600; margin-bottom: var(--space-2); }
186
- .item .item-meta { color: var(--text-muted); font-size: var(--text-xs); margin-bottom: var(--space-2); }
187
- .item-clickable { cursor: pointer; }
188
- .item-clickable:hover { background: var(--bg-hover); border-color: var(--accent-blue); }
189
-
190
- /* Task expandable detail */
191
- .task-expand-icon {
192
- float: right; font-size: 10px; color: var(--text-muted);
193
- transition: transform 0.2s ease;
194
- }
195
- .task-detail {
196
- margin-top: var(--space-3); padding-top: var(--space-3);
197
- border-top: 1px solid var(--border); font-size: var(--text-sm);
198
- }
199
- .task-detail-row { margin-bottom: var(--space-2); color: var(--text-secondary); line-height: 1.5; }
200
- .task-detail-row strong { color: var(--text-primary); }
201
-
202
- /* Hamburger & sidebar toggle */
203
- .hamburger-btn {
204
- display: none; background: none; border: 1px solid var(--border);
205
- border-radius: var(--radius-sm); padding: 6px 8px; cursor: pointer;
206
- flex-direction: column; gap: 4px; align-items: center; justify-content: center;
207
- }
208
- .hamburger-btn span {
209
- display: block; width: 18px; height: 2px; background: var(--text-primary);
210
- border-radius: 1px; transition: 0.2s;
211
- }
212
- .hamburger-btn:hover { background: var(--bg-hover); }
213
- #sidebar-backdrop {
214
- display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.5);
215
- z-index: 90;
216
- }
217
- #sidebar-backdrop.active { display: block; }
218
-
219
- .empty { color: var(--text-muted); text-align: center; padding: var(--space-8); font-style: italic; }
220
- /* #316 Actionable empty states */
221
- .empty-action {
222
- display: inline-block; margin-top: var(--space-3);
223
- background: var(--bg-hover); border: 1px solid var(--border);
224
- padding: var(--space-2) var(--space-4); border-radius: var(--radius-md);
225
- color: var(--accent-blue); font-size: var(--text-sm); font-style: normal;
226
- }
227
- .tag {
228
- display: inline-block; background: rgba(245,158,11,0.15); color: var(--rihal-gold);
229
- padding: 2px 10px; border-radius: 12px; font-size: 11px;
230
- text-transform: uppercase; letter-spacing: 0.05em; margin-right: 6px;
231
- }
232
- .status-chip {
233
- display: inline-flex; align-items: center; gap: 4px;
234
- padding: 2px 8px; border-radius: 99px; font-size: var(--text-xs);
235
- font-weight: 500; letter-spacing: 0.04em; text-transform: lowercase;
236
- }
237
- .status-chip.complete { background: rgba(16,185,129,0.15); color: var(--accent-green); }
238
- .status-chip.active,
239
- .status-chip.in_progress { background: rgba(59,130,246,0.15); color: var(--accent-blue); }
240
- .status-chip.blocked { background: rgba(239,68,68,0.15); color: var(--accent-red); }
241
- /* Fix #314: 'planned' gets its own class */
242
- .status-chip.planned { background: rgba(96,96,104,0.2); color: var(--text-muted); }
243
- .status-chip.todo { background: rgba(96,96,104,0.2); color: var(--text-muted); }
244
- .status-chip.other { background: rgba(96,96,104,0.2); color: var(--text-muted); }
245
- /* Progress bar */
246
- .progress-bar {
247
- height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; width: 100%;
248
- }
249
- .progress-bar-fill {
250
- height: 100%; border-radius: 3px; transition: width 0.3s ease;
251
- background: var(--accent-green);
252
- }
253
- /* File tree */
254
- .file-tree { font-size: var(--text-xs); }
255
- .file-tree-group { margin-bottom: var(--space-3); }
256
- .file-tree-group summary {
257
- color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.07em;
258
- font-size: 10px; padding: var(--space-1) var(--space-2); cursor: pointer; list-style: none;
259
- }
260
- .file-tree-item {
261
- display: block; padding: 3px var(--space-3); color: var(--text-secondary);
262
- cursor: pointer; border-radius: var(--radius-sm); overflow: hidden;
263
- text-overflow: ellipsis; white-space: nowrap; font-family: 'SF Mono', Monaco, Consolas, monospace;
264
- }
265
- .file-tree-item:hover { color: var(--text-primary); background: var(--bg-hover); }
266
- .file-tree-item.selected { color: var(--accent-blue); background: rgba(59,130,246,0.1); }
267
- /* #300 File modification date */
268
- .file-tree-date { color: var(--text-muted); font-size: 9px; margin-left: 4px; }
269
- /* Markdown render */
270
- .md-render {
271
- background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg);
272
- padding: var(--space-8); max-width: 860px; line-height: 1.7;
273
- }
274
- .md-render h1, .md-render h2, .md-render h3 { margin: var(--space-6) 0 var(--space-3); }
275
- .md-render code { background: var(--bg-hover); padding: 2px 6px; border-radius: var(--radius-sm); font-size: var(--text-sm); }
276
- .md-render pre { background: var(--bg-hover); padding: var(--space-4); border-radius: var(--radius-md); overflow-x: auto; }
277
- .md-render a { color: var(--accent-blue); }
278
- .md-render ul, .md-render ol { margin-left: var(--space-6); margin-bottom: var(--space-3); }
279
- /* #302 Syntax highlighting for fenced code blocks */
280
- .md-render pre code {
281
- background: none; padding: 0; display: block;
282
- color: var(--text-secondary); font-size: var(--text-sm);
283
- font-family: "SF Mono", Monaco, Consolas, monospace;
284
- }
285
- .md-render pre code .kw { color: #c678dd; }
286
- .md-render pre code .str { color: #98c379; }
287
- .md-render pre code .cm { color: #5c6370; font-style: italic; }
288
- /* Filter bar */
289
- .filter-bar { margin-bottom: var(--space-6); display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; }
290
- .filter-input {
291
- width: 100%; max-width: 360px; background: var(--bg-card);
292
- border: 1px solid var(--border); border-radius: var(--radius-md);
293
- color: var(--text-primary); font-size: var(--text-sm);
294
- padding: var(--space-2) var(--space-3); outline: none; font-family: inherit;
295
- }
296
- .filter-input:focus { border-color: var(--accent-blue); }
297
- .filter-input::placeholder { color: var(--text-muted); }
298
- /* #296 Filter select */
299
- .filter-select {
300
- background: var(--bg-card); border: 1px solid var(--border);
301
- border-radius: var(--radius-md); color: var(--text-primary);
302
- font-size: var(--text-sm); padding: var(--space-2) var(--space-3);
303
- font-family: inherit; outline: none;
304
- }
305
- .view-title { font-size: var(--text-lg); font-weight: 600; margin-bottom: var(--space-6); }
306
- /* Breadcrumb */
307
- .breadcrumb { margin-bottom: var(--space-5); }
308
- .back-btn {
309
- background: var(--bg-card); border: 1px solid var(--border); color: var(--text-secondary);
310
- padding: var(--space-2) var(--space-4); border-radius: var(--radius-md);
311
- cursor: pointer; font-size: var(--text-sm); font-family: inherit; transition: all 0.15s;
312
- }
313
- .back-btn:hover { color: var(--text-primary); border-color: var(--accent-blue); }
314
- /* Entity detail */
315
- .entity-header { margin-bottom: var(--space-6); }
316
- .entity-title { font-size: var(--text-xl); font-weight: 700; margin-bottom: var(--space-4); }
317
- .attr-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: var(--space-3); }
318
- .attr-item {
319
- background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-md);
320
- padding: var(--space-3) var(--space-4); display: flex; flex-direction: column; gap: 4px;
321
- }
322
- .attr-label { font-size: var(--text-xs); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; }
323
- .attr-value { font-size: var(--text-sm); font-weight: 500; }
324
- /* Tree */
325
- .tree-container { padding: 0; }
326
- .tree-ms { border-left: none !important; margin-left: 0 !important; }
327
- .tree-node { border-left: 1px solid var(--border); margin-left: var(--space-4); }
328
- .tree-row {
329
- display: flex; align-items: center; gap: var(--space-2);
330
- padding: var(--space-2) var(--space-3); cursor: pointer;
331
- border-radius: var(--radius-sm); transition: background 0.1s; user-select: none;
332
- }
333
- .tree-row:hover { background: var(--bg-hover); }
334
- .task-leaf > .tree-row { cursor: default; }
335
- .tree-chevron { color: var(--text-muted); font-size: 10px; width: 14px; flex-shrink: 0; }
336
- .tree-icon { flex-shrink: 0; }
337
- .tree-label { flex: 1; font-size: var(--text-sm); }
338
- .tree-badge { color: var(--text-muted); font-size: var(--text-xs); flex-shrink: 0; }
339
- .tree-ms > .tree-row .tree-label { font-weight: 700; font-size: var(--text-base); color: var(--rihal-gold); }
340
- .tree-children { padding-left: var(--space-3); }
341
- /* #311 Tree animation */
342
- .tree-children { overflow: hidden; transition: max-height 0.25s ease; }
343
- /* #315 Loading skeleton */
344
- .skeleton {
345
- background: linear-gradient(90deg, var(--bg-hover) 25%, var(--border) 50%, var(--bg-hover) 75%);
346
- background-size: 200% 100%;
347
- animation: shimmer 1.5s infinite;
348
- border-radius: var(--radius-md); height: 80px; margin-bottom: var(--space-3);
349
- }
350
- @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
351
- /* #298 File path header */
352
- .file-path-header {
353
- font-family: 'SF Mono', Monaco, Consolas, monospace;
354
- font-size: var(--text-sm); color: var(--text-muted);
355
- padding: var(--space-3) 0; margin-bottom: var(--space-4);
356
- border-bottom: 1px solid var(--border);
357
- display: flex; align-items: center; gap: var(--space-3);
358
- }
359
- .file-path-header .copy-btn {
360
- background: var(--bg-hover); border: 1px solid var(--border);
361
- color: var(--text-secondary); padding: 2px 8px; border-radius: var(--radius-sm);
362
- cursor: pointer; font-size: var(--text-xs); font-family: inherit;
363
- }
364
- .file-path-header .copy-btn:hover { color: var(--text-primary); }
365
- /* File view layout */
366
- #view-files { display: flex; flex-direction: column; }
367
- #file-list-inline { margin-bottom: var(--space-4); }
368
- #file-view { min-height: 200px; }
369
- .inline-subgroup summary { list-style: none; cursor: pointer; }
370
- .inline-subgroup summary::-webkit-details-marker { display: none; }
371
- .inline-subgroup summary:hover { color: var(--text-primary); }
372
- .file-tree-subgroup summary { list-style: none; cursor: pointer; }
373
- .file-tree-subgroup summary::-webkit-details-marker { display: none; }
374
- .file-tree-subgroup > summary::before { content: '▶ '; font-size: 9px; display: inline-block; }
375
- .file-tree-subgroup[open] > summary::before { content: '▼ '; }
376
- /* Footer */
377
- footer {
378
- text-align: center; padding: var(--space-8); color: var(--text-muted); font-size: var(--text-sm);
379
- border-top: 1px solid var(--border); margin-top: 48px;
380
- }
381
- footer .arabic { color: var(--rihal-gold); font-size: 16px; margin-bottom: var(--space-2); }
382
- code {
383
- background: rgba(255,255,255,0.05); padding: 2px 6px;
384
- border-radius: var(--radius-sm); font-size: var(--text-sm);
385
- font-family: "SF Mono", Monaco, Consolas, monospace;
386
- }
387
- h1, h2, h3 { line-height: 1.3; }
388
- p { margin-bottom: 10px; }
389
- ul { margin-left: 20px; margin-bottom: 10px; }
390
- /* Velocity bar */
391
- .velocity-bar { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
392
- .velocity-bar-label { font-size: var(--text-xs); color: var(--text-muted); width: 60px; text-align: right; }
393
- .velocity-bar-track { flex: 1; height: 14px; background: var(--border); border-radius: 7px; overflow: hidden; position: relative; }
394
- .velocity-bar-fill { height: 100%; border-radius: 7px; background: var(--accent-blue); }
395
- .velocity-bar-val { font-size: var(--text-xs); color: var(--text-secondary); width: 50px; }
396
- /* #280 Completion ring */
397
- .completion-ring { position: relative; width: 64px; height: 64px; }
398
- .completion-ring svg { transform: rotate(-90deg); }
399
- .completion-ring .ring-text {
400
- position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
401
- font-size: var(--text-sm); font-weight: 700;
402
- }
403
- /* #323 Responsive */
404
- @media (max-width: 768px) {
405
- .hamburger-btn { display: flex; }
406
- .sidebar {
407
- display: flex; position: fixed; left: -260px; top: 0; bottom: 0;
408
- z-index: 100; transition: left 0.25s ease;
409
- background: var(--bg-sidebar); box-shadow: 2px 0 12px rgba(0,0,0,0.3);
410
- }
411
- .sidebar.sidebar-open { left: 0; }
412
- .content-area { width: 100%; }
413
- .view { padding: var(--space-4); }
414
- header { padding: var(--space-3) var(--space-4); flex-wrap: wrap; gap: var(--space-2); }
415
- .brand .icon { font-size: 28px; }
416
- .brand h1 { font-size: var(--text-lg); }
417
- .stats { grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
418
- .agents { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
419
- .attr-grid { grid-template-columns: 1fr 1fr; }
420
- }
421
- /* Desktop sidebar toggle */
422
- @media (min-width: 769px) {
423
- .hamburger-btn { display: flex; }
424
- .sidebar { transition: margin-left 0.25s ease, opacity 0.25s ease; }
425
- body.sidebar-visible .sidebar { margin-left: 0; opacity: 1; }
426
- }
427
- /* Command hints accordion */
428
- .cmd-hints {
429
- margin-top: var(--space-4); border: 1px solid var(--border); border-radius: var(--radius-md);
430
- background: var(--bg-card); overflow: hidden;
431
- }
432
- .cmd-hints summary {
433
- padding: var(--space-2) var(--space-3); cursor: pointer; font-size: var(--text-sm);
434
- color: var(--text-muted); font-weight: 500; list-style: none;
435
- display: flex; align-items: center; gap: 6px; user-select: none;
436
- }
437
- .cmd-hints summary::-webkit-details-marker { display: none; }
438
- .cmd-hints summary::before { content: '▶'; font-size: 10px; transition: transform 0.2s; }
439
- .cmd-hints[open] summary::before { transform: rotate(90deg); }
440
- .cmd-hints summary:hover { color: var(--text-primary); background: var(--bg-hover); }
441
- .cmd-hints-list { padding: var(--space-2) 0; }
442
- .cmd-hint-item {
443
- display: flex; align-items: baseline; gap: var(--space-3); padding: var(--space-2) var(--space-3);
444
- cursor: pointer; transition: background 0.15s;
445
- }
446
- .cmd-hint-item:hover { background: var(--bg-hover); }
447
- .cmd-hint-item .cmd-text {
448
- font-family: 'SF Mono', Monaco, Consolas, monospace; font-size: var(--text-xs);
449
- color: var(--accent-blue); white-space: nowrap; font-weight: 500;
450
- }
451
- .cmd-hint-item .cmd-desc {
452
- font-size: var(--text-xs); color: var(--text-muted); flex: 1;
453
- }
454
- .cmd-hint-item .cmd-copy {
455
- font-size: 10px; color: var(--text-muted); opacity: 0; transition: opacity 0.15s; margin-left: auto;
456
- }
457
- .cmd-hint-item:hover .cmd-copy { opacity: 1; }
458
- /* Task detail inline commands */
459
- .task-detail-cmds {
460
- margin-top: var(--space-3); padding-top: var(--space-3);
461
- border-top: 1px solid var(--border);
462
- }
463
- .task-detail-cmds::before {
464
- content: '💡 Quick Commands'; display: block; font-size: var(--text-xs);
465
- color: var(--text-muted); font-weight: 600; margin-bottom: var(--space-2);
466
- text-transform: uppercase; letter-spacing: 0.5px;
467
- }
468
- /* Toast notification (for copy feedback) */
469
- .toast {
470
- position: fixed; bottom: 20px; right: 20px; background: var(--accent-green);
471
- color: #fff; padding: var(--space-2) var(--space-4); border-radius: var(--radius-md);
472
- font-size: var(--text-sm); z-index: 1000; opacity: 0; transition: opacity 0.3s;
473
- pointer-events: none;
474
- }
475
- .toast.show { opacity: 1; }
1895
+ .hamburger-btn { display: flex; }
1896
+ .content-area { grid-column: 1; }
1897
+ .kanban-board { grid-template-columns: repeat(4, 260px); }
1898
+ #orch-panel { max-width: 90vw; min-width: 280px; }
1899
+ }
1900
+
1901
+ /* ── Milestones / roadmap dynamic ───────────────────────────── */
1902
+ .milestone-section {
1903
+ background: var(--bg-elev-2);
1904
+ border: 1px solid var(--border-subtle);
1905
+ border-radius: var(--radius-4);
1906
+ overflow: hidden;
1907
+ margin-bottom: var(--space-4);
1908
+ }
1909
+ .milestone-head {
1910
+ display: flex;
1911
+ align-items: center;
1912
+ gap: var(--space-4);
1913
+ padding: var(--space-4) var(--space-5);
1914
+ border-bottom: 1px solid var(--border-subtle);
1915
+ background: var(--bg-elev-1);
1916
+ }
1917
+ .milestone-name {
1918
+ font-size: var(--text-xs);
1919
+ font-weight: 600;
1920
+ color: var(--text-primary);
1921
+ letter-spacing: -0.006em;
1922
+ flex: 1;
1923
+ }
1924
+ .milestone-prog {
1925
+ font-size: var(--text-2xs);
1926
+ color: var(--text-muted);
1927
+ letter-spacing: -0.006em;
1928
+ }
1929
+
1930
+ /* ── Overview dynamic area ──────────────────────────────────── */
1931
+ #view-overview-dynamic section { margin-top: var(--space-5); }
1932
+
1933
+ /* ── xterm Terminal Panel ───────────────────────────────────── */
1934
+ .term-backdrop {
1935
+ display: none;
1936
+ position: fixed;
1937
+ inset: 0;
1938
+ background: rgba(0,0,0,0.45);
1939
+ z-index: 200;
1940
+ }
1941
+ .term-backdrop.open { display: block; }
1942
+ .term-panel {
1943
+ display: none;
1944
+ position: fixed;
1945
+ bottom: 0;
1946
+ left: 236px;
1947
+ right: 0;
1948
+ height: 55vh;
1949
+ min-height: 300px;
1950
+ background: #0c0c0e;
1951
+ border-top: 2px solid var(--accent-primary);
1952
+ z-index: 201;
1953
+ flex-direction: column;
1954
+ }
1955
+ .term-panel.open { display: flex; }
1956
+ .term-panel.fullscreen {
1957
+ inset: 0;
1958
+ left: 0;
1959
+ height: 100vh;
1960
+ }
1961
+
1962
+ /* Minimized terminal pill */
1963
+ .term-pill {
1964
+ display: none;
1965
+ position: fixed;
1966
+ bottom: var(--space-4);
1967
+ right: var(--space-4);
1968
+ z-index: 201;
1969
+ align-items: center;
1970
+ gap: var(--space-2);
1971
+ padding: var(--space-2) var(--space-4);
1972
+ background: var(--bg-elev-3);
1973
+ border: 1px solid var(--accent-primary);
1974
+ border-radius: var(--radius-4);
1975
+ color: var(--text-primary);
1976
+ font-size: var(--text-xs);
1977
+ cursor: pointer;
1978
+ box-shadow: 0 6px 20px rgba(0,0,0,0.45);
1979
+ }
1980
+ .term-pill.show { display: flex; }
1981
+ .term-pill:hover { background: var(--bg-hover); }
1982
+ .term-pill-icon { color: var(--text-muted); }
1983
+
1984
+ /* "running" badge for phase / sprint / task cards */
1985
+ .run-badge {
1986
+ display: inline-flex;
1987
+ align-items: center;
1988
+ gap: 4px;
1989
+ margin-left: var(--space-2);
1990
+ padding: 1px var(--space-2);
1991
+ background: rgba(63,185,80,0.15);
1992
+ border: 1px solid rgba(63,185,80,0.4);
1993
+ border-radius: var(--radius-2);
1994
+ color: var(--accent-green);
1995
+ font-size: var(--text-2xs);
1996
+ font-weight: 600;
1997
+ white-space: nowrap;
1998
+ }
1999
+ .term-header {
2000
+ display: flex;
2001
+ align-items: center;
2002
+ justify-content: space-between;
2003
+ padding: 0 var(--space-4);
2004
+ height: 38px;
2005
+ background: var(--bg-elev-2);
2006
+ border-bottom: 1px solid var(--border-subtle);
2007
+ flex-shrink: 0;
2008
+ user-select: none;
2009
+ }
2010
+ .term-header-left { display: flex; align-items: center; gap: var(--space-3); }
2011
+ .term-header-right { display: flex; align-items: center; gap: var(--space-2); }
2012
+ .term-title {
2013
+ font-size: var(--text-xs);
2014
+ font-weight: 600;
2015
+ color: var(--text-secondary);
2016
+ font-family: var(--font-mono);
2017
+ letter-spacing: 0;
2018
+ }
2019
+ .term-status-dot {
2020
+ width: 8px;
2021
+ height: 8px;
2022
+ border-radius: 50%;
2023
+ background: var(--text-muted);
2024
+ flex-shrink: 0;
2025
+ }
2026
+ .term-status-dot.running { background: var(--accent-green); animation: pulse 1.5s infinite; }
2027
+ .term-status-dot.done { background: var(--accent-green); animation: none; }
2028
+ .term-status-dot.error { background: #ff4444; animation: none; }
2029
+ .term-status-dot.stopped { background: var(--accent-amber); animation: none; }
2030
+ .term-status-dot.connecting { background: var(--accent-blue); animation: pulse 1s infinite; }
2031
+ .term-btn {
2032
+ height: 22px;
2033
+ padding: 0 var(--space-3);
2034
+ background: var(--bg-elev-3);
2035
+ border: 1px solid var(--border-default);
2036
+ border-radius: var(--radius-2);
2037
+ color: var(--text-secondary);
2038
+ font-size: 10px;
2039
+ font-family: var(--font-mono);
2040
+ cursor: pointer;
2041
+ transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
2042
+ white-space: nowrap;
2043
+ }
2044
+ .term-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
2045
+ .term-stop-btn { color: #ff6b6b; border-color: rgba(255,107,107,0.3); }
2046
+ .term-stop-btn:hover { background: rgba(255,107,107,0.1); }
2047
+ #term-container {
2048
+ flex: 1;
2049
+ overflow: hidden;
2050
+ padding: 6px 8px;
2051
+ background: #0c0c0e;
2052
+ }
2053
+ .term-hint {
2054
+ padding: var(--space-2) var(--space-3);
2055
+ background: var(--bg-elev-2);
2056
+ border-top: 1px solid var(--border-subtle);
2057
+ color: var(--text-muted);
2058
+ font-size: var(--text-xs);
2059
+ flex-shrink: 0;
2060
+ }
2061
+ /* Run / Terminal action buttons (used on sprint/phase detail) */
2062
+ .term-run-btn {
2063
+ display: inline-flex;
2064
+ align-items: center;
2065
+ gap: var(--space-2);
2066
+ height: 28px;
2067
+ padding: 0 var(--space-4);
2068
+ background: var(--accent-primary);
2069
+ border: 1px solid rgba(255,255,255,0.1);
2070
+ border-radius: var(--radius-3);
2071
+ color: white;
2072
+ font-size: var(--text-xs);
2073
+ font-weight: 500;
2074
+ font-family: var(--font-sans);
2075
+ cursor: pointer;
2076
+ transition: opacity var(--t-fast) var(--ease);
2077
+ }
2078
+ .term-run-btn:hover { opacity: 0.85; }
2079
+ .term-run-btn.outline {
2080
+ background: transparent;
2081
+ border-color: var(--border-default);
2082
+ color: var(--text-secondary);
2083
+ }
2084
+ .term-run-btn.outline:hover { background: var(--bg-hover); color: var(--text-primary); }
2085
+ .term-run-btn.danger {
2086
+ background: transparent;
2087
+ border-color: rgba(255,107,107,0.4);
2088
+ color: #ff6b6b;
2089
+ }
2090
+ .term-run-btn.danger:hover { background: rgba(255,107,107,0.12); opacity: 1; }
2091
+ .term-action-bar {
2092
+ display: flex;
2093
+ align-items: center;
2094
+ gap: var(--space-3);
2095
+ margin-bottom: var(--space-5);
2096
+ }
2097
+ .term-status-dot.exited { background: #ff4444; animation: none; }
2098
+ .term-status-dot.waiting { background: var(--accent-amber); animation: pulse 1.2s infinite; }
2099
+
2100
+ /* Compact ▶ Run button on phase / sprint / task list cards */
2101
+ .card-run-btn {
2102
+ float: right;
2103
+ margin-left: var(--space-3);
2104
+ height: 20px;
2105
+ padding: 0 var(--space-3);
2106
+ background: transparent;
2107
+ border: 1px solid var(--border-default);
2108
+ border-radius: var(--radius-2);
2109
+ color: var(--text-tertiary);
2110
+ font-size: 10px;
2111
+ font-weight: 500;
2112
+ cursor: pointer;
2113
+ transition: background var(--t-fast) var(--ease),
2114
+ color var(--t-fast) var(--ease),
2115
+ border-color var(--t-fast) var(--ease);
2116
+ }
2117
+ .card-run-btn:hover {
2118
+ background: var(--accent-green);
2119
+ border-color: var(--accent-green);
2120
+ color: #fff;
2121
+ }
2122
+ .ms-actions {
2123
+ display: inline-flex;
2124
+ align-items: center;
2125
+ gap: var(--space-2);
2126
+ margin-left: var(--space-3);
2127
+ }
2128
+ .ms-audit-btn:hover {
2129
+ background: var(--accent-primary);
2130
+ border-color: var(--accent-primary);
2131
+ }
2132
+
2133
+ /* ── Orchestration view ─────────────────────────────────────── */
2134
+ .orch-subtitle {
2135
+ color: var(--text-tertiary);
2136
+ font-size: var(--text-sm);
2137
+ margin-bottom: var(--space-5);
2138
+ }
2139
+ .orch-grid {
2140
+ display: grid;
2141
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
2142
+ gap: var(--space-4);
2143
+ }
2144
+ .orch-card {
2145
+ background: var(--bg-elev-2);
2146
+ border: 1px solid var(--border-subtle);
2147
+ border-left: 3px solid var(--text-muted);
2148
+ border-radius: var(--radius-4);
2149
+ padding: var(--space-4) var(--space-5);
2150
+ display: flex;
2151
+ flex-direction: column;
2152
+ gap: var(--space-3);
2153
+ }
2154
+ .orch-card.orch-running { border-left-color: var(--accent-green); }
2155
+ .orch-card.orch-waiting {
2156
+ border-left-color: var(--accent-amber);
2157
+ background: rgba(245,158,11,0.05);
2158
+ }
2159
+ .orch-card.orch-waiting .orch-card-badge { color: var(--accent-amber); }
2160
+ .orch-card.orch-error,
2161
+ .orch-card.orch-exited { border-left-color: #ff4444; }
2162
+ .orch-card.orch-stopped { border-left-color: var(--accent-amber); }
2163
+ .orch-card.orch-done { border-left-color: var(--accent-blue); }
2164
+ .orch-card-head {
2165
+ display: flex;
2166
+ align-items: center;
2167
+ gap: var(--space-3);
2168
+ }
2169
+ .orch-card-id {
2170
+ font-weight: 600;
2171
+ font-size: var(--text-sm);
2172
+ color: var(--text-primary);
2173
+ }
2174
+ .orch-card-badge {
2175
+ margin-left: auto;
2176
+ font-size: var(--text-2xs);
2177
+ text-transform: uppercase;
2178
+ letter-spacing: 0.06em;
2179
+ color: var(--text-muted);
2180
+ }
2181
+ .orch-card-cmd {
2182
+ font-family: var(--font-mono);
2183
+ font-size: var(--text-xs);
2184
+ color: var(--text-secondary);
2185
+ background: var(--bg-elev-1);
2186
+ border-radius: var(--radius-2);
2187
+ padding: var(--space-2) var(--space-3);
2188
+ word-break: break-all;
2189
+ }
2190
+ .orch-card-meta {
2191
+ font-size: var(--text-2xs);
2192
+ color: var(--text-tertiary);
2193
+ }
2194
+ .orch-card-actions {
2195
+ display: flex;
2196
+ gap: var(--space-2);
2197
+ }
2198
+
2199
+ /* ── Icon alignment helpers (for sprint 32.2 SVG icon sweep) ── */
2200
+ .ic {
2201
+ display: inline-block;
2202
+ vertical-align: -0.15em; /* optical baseline alignment with surrounding text */
2203
+ flex-shrink: 0;
2204
+ }
2205
+ .btn-icon { display: inline-block; vertical-align: -0.1em; flex-shrink: 0; }
2206
+ .section-icon {
2207
+ display: inline-flex;
2208
+ align-items: center;
2209
+ gap: var(--space-2);
2210
+ }
2211
+ .tree-icon .ic { vertical-align: -0.15em; }
2212
+
2213
+ /* ── Scrollbar global ───────────────────────────────────────── */
2214
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
2215
+ ::-webkit-scrollbar-track { background: transparent; }
2216
+ ::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 3px; }
2217
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
2218
+ * { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
2219
+
2220
+ /* ── Command runner (Sprint 33.2) ───────────────────────────────────────────── */
2221
+ .cmd-runner {
2222
+ background: var(--bg-card);
2223
+ border: 1px solid var(--border);
2224
+ border-radius: var(--radius-md);
2225
+ padding: var(--space-4);
2226
+ margin-bottom: var(--space-5);
2227
+ }
2228
+ .cmd-runner-title {
2229
+ font-size: var(--text-sm);
2230
+ font-weight: 600;
2231
+ color: var(--text-muted);
2232
+ text-transform: uppercase;
2233
+ letter-spacing: 0.05em;
2234
+ margin-bottom: var(--space-3);
2235
+ display: flex;
2236
+ align-items: center;
2237
+ gap: var(--space-2);
2238
+ }
2239
+ .cmd-runner-row {
2240
+ display: flex;
2241
+ gap: var(--space-3);
2242
+ align-items: center;
2243
+ }
2244
+ .cmd-runner-select {
2245
+ flex: 1;
2246
+ background: var(--bg-input, var(--bg-elev-2));
2247
+ border: 1px solid var(--border);
2248
+ border-radius: var(--radius-sm);
2249
+ color: var(--text-primary);
2250
+ padding: var(--space-2) var(--space-3);
2251
+ font-size: var(--text-sm);
2252
+ cursor: pointer;
2253
+ }
2254
+ .cmd-runner-select:focus {
2255
+ outline: none;
2256
+ border-color: var(--accent-blue);
2257
+ }
2258
+ .cmd-runner-btn {
2259
+ background: var(--accent-blue);
2260
+ color: #fff;
2261
+ border: none;
2262
+ border-radius: var(--radius-sm);
2263
+ padding: var(--space-2) var(--space-4);
2264
+ font-size: var(--text-sm);
2265
+ font-weight: 600;
2266
+ cursor: pointer;
2267
+ display: flex;
2268
+ align-items: center;
2269
+ gap: var(--space-2);
2270
+ transition: opacity 0.15s;
2271
+ white-space: nowrap;
2272
+ }
2273
+ .cmd-runner-btn:hover:not(:disabled) { opacity: 0.85; }
2274
+ .cmd-runner-btn:disabled,
2275
+ .cmd-runner-btn--busy { opacity: 0.6; cursor: not-allowed; }
476
2276
  </style>`;
477
2277
  }
478
2278