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