ai-advisory-board 0.1.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.
package/gui/style.css ADDED
@@ -0,0 +1,2312 @@
1
+ /* ---------- Tokens ---------- */
2
+
3
+ :root {
4
+ --bg: #0b0d10;
5
+ --bg-elev: #131720;
6
+ --bg-elev-2: #1a2030;
7
+ --border: #2a3348;
8
+ --border-strong: #3a4666;
9
+ --text: #f1f3f7;
10
+ --text-dim: #b4bccc;
11
+ --text-faint: #818a9d;
12
+
13
+ --brand: #7c5cff;
14
+ --brand-2: #4cc9ff;
15
+ --ok: #4ade80;
16
+ --warn: #fbbf24;
17
+ --err: #f87171;
18
+ --info: #60a5fa;
19
+
20
+ /* Member palette — pulled from the CLI's chalk colors */
21
+ --m-cyan: #67e8f9;
22
+ --m-green: #86efac;
23
+ --m-yellow: #fde047;
24
+ --m-magenta: #f0abfc;
25
+ --m-blue: #93c5fd;
26
+ --m-red: #fca5a5;
27
+ --m-orange: #fdba74;
28
+ --m-pink: #f9a8d4;
29
+ --m-purple: #c4b5fd;
30
+
31
+ --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
32
+ --font-mono: ui-monospace, 'Cascadia Code', 'JetBrains Mono', Menlo, monospace;
33
+ --radius: 12px;
34
+ --radius-sm: 8px;
35
+ --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.2);
36
+ --shadow-2: 0 8px 24px rgba(0, 0, 0, 0.35);
37
+ }
38
+
39
+ /* ---------- Reset ---------- */
40
+
41
+ * { box-sizing: border-box; }
42
+ html, body { margin: 0; padding: 0; height: 100%; }
43
+ body {
44
+ background: var(--bg);
45
+ color: var(--text);
46
+ font-family: var(--font);
47
+ font-size: 14px;
48
+ line-height: 1.55;
49
+ display: grid;
50
+ grid-template-columns: 260px 1fr;
51
+ overflow: hidden;
52
+ }
53
+
54
+ button { font: inherit; cursor: pointer; }
55
+ textarea, input, button { color: inherit; }
56
+ ::selection { background: var(--brand); color: white; }
57
+
58
+ /* ---------- Sidebar ---------- */
59
+
60
+ .sidebar {
61
+ background: var(--bg-elev);
62
+ border-right: 1px solid var(--border);
63
+ display: flex;
64
+ flex-direction: column;
65
+ padding: 16px 12px 12px;
66
+ height: 100vh;
67
+ }
68
+
69
+ .brand {
70
+ display: flex;
71
+ gap: 10px;
72
+ align-items: center;
73
+ padding: 6px 8px 18px;
74
+ }
75
+
76
+ .brand-mark {
77
+ width: 32px;
78
+ height: 32px;
79
+ border-radius: 8px;
80
+ background: linear-gradient(135deg, var(--brand) 0%, var(--brand-2) 100%);
81
+ box-shadow: 0 4px 12px rgba(124, 92, 255, 0.4);
82
+ }
83
+
84
+ .brand-title {
85
+ font-weight: 600;
86
+ font-size: 14px;
87
+ letter-spacing: -0.01em;
88
+ }
89
+
90
+ .brand-sub {
91
+ font-size: 11.5px;
92
+ color: var(--text-faint);
93
+ }
94
+
95
+ .nav {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: 2px;
99
+ flex: 1;
100
+ }
101
+
102
+ .nav-item {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 10px;
106
+ padding: 9px 10px;
107
+ border-radius: var(--radius-sm);
108
+ background: transparent;
109
+ border: 0;
110
+ color: var(--text-dim);
111
+ text-align: left;
112
+ font-size: 13.5px;
113
+ transition: background 0.15s, color 0.15s;
114
+ }
115
+
116
+ .nav-item:hover {
117
+ background: var(--bg-elev-2);
118
+ color: var(--text);
119
+ }
120
+
121
+ .nav-item.active {
122
+ background: var(--bg-elev-2);
123
+ color: var(--text);
124
+ box-shadow: inset 0 0 0 1px var(--border-strong);
125
+ }
126
+
127
+ .nav-icon { font-size: 14px; }
128
+
129
+ .sidebar-footer {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 8px;
133
+ padding: 10px;
134
+ border-top: 1px solid var(--border);
135
+ margin-top: 10px;
136
+ font-size: 11.5px;
137
+ color: var(--text-faint);
138
+ }
139
+
140
+ .status-dot {
141
+ width: 8px;
142
+ height: 8px;
143
+ border-radius: 50%;
144
+ background: var(--text-faint);
145
+ transition: background 0.2s;
146
+ }
147
+ .status-dot.ok { background: var(--ok); box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.15); }
148
+ .status-dot.err { background: var(--err); }
149
+
150
+ /* ---------- Main ---------- */
151
+
152
+ .main { overflow: hidden; height: 100vh; display: flex; flex-direction: column; }
153
+
154
+ .view {
155
+ height: 100%;
156
+ display: flex;
157
+ flex-direction: column;
158
+ overflow: hidden;
159
+ }
160
+
161
+ .view-header {
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: space-between;
165
+ padding: 18px 28px;
166
+ border-bottom: 1px solid var(--border);
167
+ background: var(--bg);
168
+ }
169
+
170
+ .view-title { font-size: 16px; font-weight: 600; letter-spacing: -0.01em; }
171
+ .view-subtitle { color: var(--text-faint); font-size: 12.5px; margin-top: 2px; }
172
+
173
+ .view-body { flex: 1; overflow: auto; padding: 24px 28px; }
174
+
175
+ .empty-state {
176
+ display: flex;
177
+ flex-direction: column;
178
+ align-items: center;
179
+ justify-content: center;
180
+ text-align: center;
181
+ color: var(--text-faint);
182
+ padding: 60px 20px;
183
+ }
184
+ .empty-state-emoji { font-size: 36px; margin-bottom: 14px; opacity: 0.5; }
185
+ .empty-state-title { color: var(--text); font-size: 15px; margin-bottom: 4px; font-weight: 500; }
186
+
187
+ /* ---------- Buttons ---------- */
188
+
189
+ .btn-primary {
190
+ background: var(--brand);
191
+ color: white;
192
+ border: 0;
193
+ padding: 8px 14px;
194
+ border-radius: var(--radius-sm);
195
+ font-size: 13px;
196
+ font-weight: 500;
197
+ transition: filter 0.15s;
198
+ }
199
+ .btn-primary:hover { filter: brightness(1.08); }
200
+ .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
201
+
202
+ .btn-secondary {
203
+ background: transparent;
204
+ color: var(--text-dim);
205
+ border: 1px solid var(--border-strong);
206
+ padding: 8px 14px;
207
+ border-radius: var(--radius-sm);
208
+ font-size: 13px;
209
+ }
210
+ .btn-secondary:hover { background: var(--bg-elev-2); color: var(--text); }
211
+
212
+ .icon-btn {
213
+ background: transparent;
214
+ border: 0;
215
+ color: var(--text-dim);
216
+ font-size: 18px;
217
+ padding: 4px 8px;
218
+ border-radius: 4px;
219
+ }
220
+ .icon-btn:hover { background: var(--bg-elev-2); color: var(--text); }
221
+
222
+ /* ---------- Discussions list ---------- */
223
+
224
+ .discussion-list {
225
+ display: flex;
226
+ flex-direction: column;
227
+ gap: 8px;
228
+ }
229
+
230
+ .discussion-card {
231
+ background: var(--bg-elev);
232
+ border: 1px solid var(--border);
233
+ border-radius: var(--radius);
234
+ padding: 14px 16px;
235
+ cursor: pointer;
236
+ transition: background 0.15s, border-color 0.15s;
237
+ }
238
+ .discussion-card:hover {
239
+ background: var(--bg-elev-2);
240
+ border-color: var(--border-strong);
241
+ }
242
+
243
+ .discussion-card-q {
244
+ font-size: 14px;
245
+ color: var(--text);
246
+ margin-bottom: 6px;
247
+ display: -webkit-box;
248
+ -webkit-line-clamp: 2;
249
+ -webkit-box-orient: vertical;
250
+ overflow: hidden;
251
+ }
252
+
253
+ .discussion-card-meta {
254
+ display: flex;
255
+ gap: 12px;
256
+ font-size: 11.5px;
257
+ color: var(--text-faint);
258
+ }
259
+
260
+ .status-pill {
261
+ display: inline-flex;
262
+ align-items: center;
263
+ gap: 5px;
264
+ padding: 2px 8px;
265
+ border-radius: 99px;
266
+ font-size: 11px;
267
+ font-weight: 500;
268
+ }
269
+ .status-pill.open { background: rgba(96, 165, 250, 0.15); color: var(--info); }
270
+ .status-pill.done { background: rgba(74, 222, 128, 0.15); color: var(--ok); }
271
+ .status-pill.awaiting { background: rgba(251, 191, 36, 0.15); color: var(--warn); }
272
+
273
+ /* ---------- Chat view ---------- */
274
+
275
+ .chat-view {
276
+ display: flex;
277
+ flex-direction: column;
278
+ height: 100%;
279
+ }
280
+
281
+ .chat-header-q {
282
+ font-size: 18px;
283
+ font-weight: 500;
284
+ color: var(--text);
285
+ letter-spacing: -0.01em;
286
+ line-height: 1.3;
287
+ }
288
+
289
+ .chat-stream {
290
+ flex: 1;
291
+ overflow-y: auto;
292
+ padding: 20px 28px 24px;
293
+ }
294
+
295
+ .round-divider {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 12px;
299
+ margin: 22px 0 16px;
300
+ color: var(--text-faint);
301
+ font-size: 11.5px;
302
+ text-transform: uppercase;
303
+ letter-spacing: 0.08em;
304
+ }
305
+ .round-divider::before,
306
+ .round-divider::after {
307
+ content: '';
308
+ flex: 1;
309
+ height: 1px;
310
+ background: var(--border);
311
+ }
312
+
313
+ /* ---------- Message bubble ---------- */
314
+
315
+ .message {
316
+ display: flex;
317
+ gap: 12px;
318
+ margin-bottom: 18px;
319
+ animation: message-in 0.2s ease;
320
+ }
321
+
322
+ @keyframes message-in {
323
+ from { opacity: 0; transform: translateY(4px); }
324
+ to { opacity: 1; transform: translateY(0); }
325
+ }
326
+
327
+ .avatar {
328
+ width: 36px;
329
+ height: 36px;
330
+ flex-shrink: 0;
331
+ border-radius: 50%;
332
+ display: flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ font-size: 12px;
336
+ font-weight: 600;
337
+ color: var(--bg);
338
+ background: var(--m-cyan);
339
+ letter-spacing: 0.02em;
340
+ }
341
+
342
+ /* per-color avatars driven from data-color */
343
+ .avatar[data-color="cyan"] { background: var(--m-cyan); }
344
+ .avatar[data-color="green"] { background: var(--m-green); }
345
+ .avatar[data-color="yellow"] { background: var(--m-yellow); }
346
+ .avatar[data-color="magenta"] { background: var(--m-magenta); }
347
+ .avatar[data-color="blue"] { background: var(--m-blue); }
348
+ .avatar[data-color="red"] { background: var(--m-red); }
349
+ .avatar[data-color="orange"] { background: var(--m-orange); }
350
+ .avatar[data-color="pink"] { background: var(--m-pink); }
351
+ .avatar[data-color="purple"] { background: var(--m-purple); }
352
+
353
+ .message-body {
354
+ flex: 1;
355
+ min-width: 0;
356
+ }
357
+
358
+ .message-name {
359
+ font-size: 13px;
360
+ font-weight: 600;
361
+ color: var(--text);
362
+ margin-bottom: 2px;
363
+ }
364
+
365
+ .message-meta {
366
+ display: inline;
367
+ font-size: 11.5px;
368
+ color: var(--text-faint);
369
+ margin-left: 8px;
370
+ font-weight: 400;
371
+ }
372
+
373
+ .bubble {
374
+ background: var(--bg-elev);
375
+ border: 1px solid var(--border);
376
+ border-radius: 16px;
377
+ border-top-left-radius: 4px;
378
+ padding: 12px 16px;
379
+ max-width: 720px;
380
+ white-space: pre-wrap;
381
+ word-wrap: break-word;
382
+ }
383
+
384
+ .system-bubble {
385
+ background: transparent;
386
+ border: 1px dashed var(--border-strong);
387
+ color: var(--text-dim);
388
+ font-size: 12px;
389
+ padding: 10px 14px;
390
+ border-radius: var(--radius-sm);
391
+ max-width: 720px;
392
+ }
393
+
394
+ /* ---------- Typing indicator (the stars of the show) ---------- */
395
+
396
+ .typing-bubble {
397
+ background: var(--bg-elev);
398
+ border: 1px solid var(--border);
399
+ border-radius: 16px;
400
+ border-top-left-radius: 4px;
401
+ padding: 11px 16px;
402
+ display: inline-flex;
403
+ align-items: center;
404
+ gap: 10px;
405
+ width: max-content;
406
+ max-width: 360px;
407
+ font-size: 12.5px;
408
+ color: var(--text-dim);
409
+ }
410
+
411
+ .typing-activity {
412
+ font-style: italic;
413
+ color: var(--text-dim);
414
+ letter-spacing: 0.005em;
415
+ }
416
+
417
+ .typing {
418
+ display: inline-flex;
419
+ align-items: center;
420
+ gap: 4px;
421
+ }
422
+
423
+ .typing span {
424
+ width: 6px;
425
+ height: 6px;
426
+ border-radius: 50%;
427
+ background: var(--text-faint);
428
+ display: inline-block;
429
+ animation: typing-bounce 1.4s infinite ease-in-out;
430
+ }
431
+
432
+ .typing span:nth-child(1) { animation-delay: -0.32s; }
433
+ .typing span:nth-child(2) { animation-delay: -0.16s; }
434
+ .typing span:nth-child(3) { animation-delay: 0; }
435
+
436
+ @keyframes typing-bounce {
437
+ 0%, 80%, 100% { transform: scale(0.8); opacity: 0.4; }
438
+ 40% { transform: scale(1); opacity: 1; }
439
+ }
440
+
441
+ .typing-detail {
442
+ display: none;
443
+ margin-top: 6px;
444
+ font-size: 11.5px;
445
+ color: var(--text-faint);
446
+ font-family: var(--font-mono);
447
+ max-width: 540px;
448
+ overflow: hidden;
449
+ text-overflow: ellipsis;
450
+ white-space: nowrap;
451
+ }
452
+
453
+ /* ---------- Structured response details ---------- */
454
+
455
+ .struct {
456
+ margin-top: 10px;
457
+ display: flex;
458
+ flex-direction: column;
459
+ gap: 8px;
460
+ }
461
+
462
+ .struct-section {
463
+ background: var(--bg-elev-2);
464
+ border-radius: var(--radius-sm);
465
+ padding: 10px 14px;
466
+ }
467
+
468
+ .struct-section-title {
469
+ font-size: 11px;
470
+ font-weight: 600;
471
+ color: var(--text-faint);
472
+ text-transform: uppercase;
473
+ letter-spacing: 0.06em;
474
+ margin-bottom: 6px;
475
+ }
476
+
477
+ .struct-section ul {
478
+ margin: 0;
479
+ padding-left: 16px;
480
+ font-size: 12.5px;
481
+ color: var(--text);
482
+ }
483
+
484
+ .struct-section ul li { margin: 2px 0; }
485
+
486
+ .confidence-row {
487
+ display: flex;
488
+ align-items: center;
489
+ gap: 8px;
490
+ font-size: 11.5px;
491
+ color: var(--text-faint);
492
+ }
493
+
494
+ .confidence-bar {
495
+ height: 6px;
496
+ background: var(--bg-elev-2);
497
+ border-radius: 3px;
498
+ flex: 1;
499
+ max-width: 140px;
500
+ overflow: hidden;
501
+ }
502
+
503
+ .confidence-bar-fill {
504
+ height: 100%;
505
+ background: linear-gradient(90deg, var(--brand) 0%, var(--brand-2) 100%);
506
+ transition: width 0.4s;
507
+ }
508
+
509
+ /* ---------- Composer ---------- */
510
+
511
+ .composer {
512
+ border-top: 1px solid var(--border);
513
+ padding: 16px 28px;
514
+ background: var(--bg);
515
+ display: flex;
516
+ gap: 10px;
517
+ }
518
+
519
+ .composer textarea {
520
+ flex: 1;
521
+ background: var(--bg-elev);
522
+ border: 1px solid var(--border);
523
+ color: var(--text);
524
+ padding: 10px 12px;
525
+ border-radius: var(--radius-sm);
526
+ font-family: inherit;
527
+ font-size: 13px;
528
+ resize: none;
529
+ min-height: 40px;
530
+ max-height: 160px;
531
+ }
532
+
533
+ .composer textarea:focus {
534
+ outline: 0;
535
+ border-color: var(--brand);
536
+ }
537
+
538
+ /* ---------- Modal ---------- */
539
+
540
+ /* The hidden attribute has the same specificity as a class in CSS, so a
541
+ `.modal-backdrop { display: flex }` rule would win over the UA `[hidden]`
542
+ rule — making every modal visible on page load. Force it explicitly. */
543
+ [hidden] { display: none !important; }
544
+
545
+ .modal-backdrop {
546
+ position: fixed;
547
+ inset: 0;
548
+ background: rgba(0, 0, 0, 0.6);
549
+ backdrop-filter: blur(4px);
550
+ display: flex;
551
+ align-items: center;
552
+ justify-content: center;
553
+ z-index: 100;
554
+ }
555
+
556
+ .modal {
557
+ background: var(--bg-elev);
558
+ border: 1px solid var(--border-strong);
559
+ border-radius: var(--radius);
560
+ width: min(560px, 92vw);
561
+ max-height: 90vh;
562
+ display: flex;
563
+ flex-direction: column;
564
+ box-shadow: var(--shadow-2);
565
+ }
566
+
567
+ .modal-header {
568
+ padding: 16px 20px;
569
+ border-bottom: 1px solid var(--border);
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: space-between;
573
+ }
574
+
575
+ .modal-header h2 { margin: 0; font-size: 15px; font-weight: 600; }
576
+
577
+ .modal-body { padding: 18px 20px; overflow-y: auto; }
578
+
579
+ .modal-footer {
580
+ padding: 14px 20px;
581
+ border-top: 1px solid var(--border);
582
+ display: flex;
583
+ justify-content: flex-end;
584
+ gap: 10px;
585
+ }
586
+
587
+ .field-label {
588
+ display: block;
589
+ font-size: 11.5px;
590
+ text-transform: uppercase;
591
+ letter-spacing: 0.06em;
592
+ font-weight: 600;
593
+ color: var(--text-faint);
594
+ margin-bottom: 6px;
595
+ margin-top: 14px;
596
+ }
597
+ .field-label:first-of-type { margin-top: 0; }
598
+
599
+ .modal-body textarea {
600
+ width: 100%;
601
+ background: var(--bg);
602
+ border: 1px solid var(--border-strong);
603
+ color: var(--text);
604
+ padding: 10px 12px;
605
+ border-radius: var(--radius-sm);
606
+ font-family: inherit;
607
+ font-size: 13.5px;
608
+ resize: vertical;
609
+ }
610
+ .modal-body textarea:focus { outline: 0; border-color: var(--brand); }
611
+
612
+ /* ---------- Chat footer (continue / respond) ---------- */
613
+
614
+ .chat-footer {
615
+ border-top: 1px solid var(--border);
616
+ padding: 16px 28px 20px;
617
+ background: var(--bg-elev);
618
+ display: flex;
619
+ flex-direction: column;
620
+ align-items: flex-start;
621
+ gap: 8px;
622
+ }
623
+ .chat-footer:empty { display: none; }
624
+
625
+ .chat-actions {
626
+ display: flex;
627
+ gap: 10px;
628
+ flex-wrap: wrap;
629
+ }
630
+
631
+ .follow-up-form .follow-up-chips {
632
+ margin-top: 4px;
633
+ }
634
+
635
+ .respond-form {
636
+ width: 100%;
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: 10px;
640
+ }
641
+
642
+ .respond-options {
643
+ display: flex;
644
+ flex-wrap: wrap;
645
+ gap: 8px;
646
+ }
647
+
648
+ .respond-form textarea {
649
+ width: 100%;
650
+ background: var(--bg);
651
+ border: 1px solid var(--border-strong);
652
+ color: var(--text);
653
+ padding: 10px 12px;
654
+ border-radius: var(--radius-sm);
655
+ font-family: inherit;
656
+ font-size: 13.5px;
657
+ resize: vertical;
658
+ min-height: 60px;
659
+ }
660
+ .respond-form textarea:focus { outline: 0; border-color: var(--brand); }
661
+
662
+ .respond-form .btn-primary {
663
+ align-self: flex-end;
664
+ }
665
+
666
+ /* ---------- Member chips ---------- */
667
+
668
+ .member-chips {
669
+ display: flex;
670
+ flex-wrap: wrap;
671
+ gap: 8px;
672
+ }
673
+
674
+ .chip {
675
+ display: inline-flex;
676
+ align-items: center;
677
+ gap: 8px;
678
+ padding: 6px 10px 6px 6px;
679
+ background: var(--bg-elev-2);
680
+ border: 1px solid var(--border-strong);
681
+ border-radius: 99px;
682
+ font-size: 12.5px;
683
+ cursor: pointer;
684
+ transition: background 0.15s, border-color 0.15s;
685
+ user-select: none;
686
+ }
687
+
688
+ .chip:hover { background: var(--bg); }
689
+
690
+ .chip.selected {
691
+ background: rgba(124, 92, 255, 0.15);
692
+ border-color: var(--brand);
693
+ }
694
+
695
+ .chip .avatar {
696
+ width: 22px;
697
+ height: 22px;
698
+ font-size: 10px;
699
+ }
700
+
701
+ /* ---------- Members grid ---------- */
702
+
703
+ .members-grid {
704
+ display: grid;
705
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
706
+ gap: 14px;
707
+ }
708
+
709
+ .member-card {
710
+ background: var(--bg-elev);
711
+ border: 1px solid var(--border);
712
+ border-radius: var(--radius);
713
+ padding: 18px;
714
+ display: flex;
715
+ flex-direction: column;
716
+ gap: 12px;
717
+ }
718
+
719
+ .member-card-head {
720
+ display: flex;
721
+ gap: 12px;
722
+ align-items: center;
723
+ }
724
+
725
+ .member-card-name { font-size: 14px; font-weight: 600; }
726
+ .member-card-title { font-size: 12px; color: var(--text-dim); }
727
+
728
+ .member-card .expertise {
729
+ display: flex;
730
+ flex-wrap: wrap;
731
+ gap: 4px;
732
+ }
733
+ .expertise-tag {
734
+ font-size: 10.5px;
735
+ padding: 2px 8px;
736
+ background: var(--bg-elev-2);
737
+ color: var(--text-dim);
738
+ border-radius: 99px;
739
+ }
740
+
741
+ .member-card .persona-preview {
742
+ font-size: 12.5px;
743
+ color: var(--text-dim);
744
+ display: -webkit-box;
745
+ -webkit-line-clamp: 4;
746
+ -webkit-box-orient: vertical;
747
+ overflow: hidden;
748
+ line-height: 1.5;
749
+ }
750
+
751
+ /* ---------- Kanban ---------- */
752
+
753
+ .kanban {
754
+ display: grid;
755
+ grid-template-columns: repeat(3, 1fr);
756
+ gap: 14px;
757
+ height: 100%;
758
+ }
759
+
760
+ .kanban-col {
761
+ background: var(--bg-elev);
762
+ border: 1px solid var(--border);
763
+ border-radius: var(--radius);
764
+ padding: 12px;
765
+ display: flex;
766
+ flex-direction: column;
767
+ min-height: 0;
768
+ }
769
+
770
+ .kanban-col-head {
771
+ font-size: 12px;
772
+ text-transform: uppercase;
773
+ letter-spacing: 0.06em;
774
+ color: var(--text-faint);
775
+ margin-bottom: 10px;
776
+ display: flex;
777
+ justify-content: space-between;
778
+ align-items: center;
779
+ }
780
+
781
+ .kanban-col-count {
782
+ font-size: 11px;
783
+ background: var(--bg-elev-2);
784
+ color: var(--text-dim);
785
+ padding: 1px 7px;
786
+ border-radius: 99px;
787
+ }
788
+
789
+ .kanban-cards {
790
+ display: flex;
791
+ flex-direction: column;
792
+ gap: 8px;
793
+ overflow-y: auto;
794
+ }
795
+
796
+ .kanban-card {
797
+ background: var(--bg-elev-2);
798
+ border: 1px solid var(--border);
799
+ border-radius: var(--radius-sm);
800
+ padding: 10px 12px;
801
+ }
802
+
803
+ .kanban-card-title { font-size: 13px; margin-bottom: 4px; }
804
+ .kanban-card-meta { display: flex; gap: 8px; font-size: 11px; color: var(--text-faint); }
805
+
806
+ .priority-mark {
807
+ display: inline-block;
808
+ width: 6px;
809
+ height: 6px;
810
+ border-radius: 50%;
811
+ }
812
+ .priority-mark.high { background: var(--err); }
813
+ .priority-mark.medium { background: var(--warn); }
814
+ .priority-mark.low { background: var(--info); }
815
+
816
+ .kanban-card {
817
+ cursor: grab;
818
+ transition: transform 80ms ease, box-shadow 80ms ease, opacity 80ms ease;
819
+ }
820
+ .kanban-card:hover {
821
+ border-color: var(--accent);
822
+ box-shadow: 0 1px 0 var(--accent-dim);
823
+ }
824
+ .kanban-card.dragging {
825
+ opacity: 0.55;
826
+ cursor: grabbing;
827
+ }
828
+ .kanban-card-desc {
829
+ font-size: 12px;
830
+ color: var(--text-dim);
831
+ margin-bottom: 6px;
832
+ line-height: 1.4;
833
+ }
834
+ .kanban-col.drop-target,
835
+ .kanban-cards.drop-target {
836
+ outline: 2px dashed var(--accent);
837
+ outline-offset: -2px;
838
+ background: var(--bg-elev-2);
839
+ }
840
+
841
+ /* ---------- Action modal (add/edit + extract) ---------- */
842
+
843
+ .modal-input,
844
+ .modal-textarea,
845
+ .modal-select {
846
+ width: 100%;
847
+ background: var(--bg-elev-2);
848
+ border: 1px solid var(--border);
849
+ border-radius: var(--radius-sm);
850
+ color: var(--text);
851
+ padding: 8px 10px;
852
+ font: inherit;
853
+ font-size: 13px;
854
+ margin-bottom: 8px;
855
+ }
856
+ .modal-textarea { resize: vertical; min-height: 80px; }
857
+ .modal-label {
858
+ display: block;
859
+ font-size: 11px;
860
+ text-transform: uppercase;
861
+ letter-spacing: 0.06em;
862
+ color: var(--text-faint);
863
+ margin: 8px 0 4px;
864
+ }
865
+ .modal-row {
866
+ display: grid;
867
+ grid-template-columns: 1fr 1fr;
868
+ gap: 12px;
869
+ }
870
+
871
+ .extract-candidates {
872
+ display: flex;
873
+ flex-direction: column;
874
+ gap: 8px;
875
+ margin-top: 12px;
876
+ max-height: 50vh;
877
+ overflow-y: auto;
878
+ }
879
+ .extract-row {
880
+ display: grid;
881
+ grid-template-columns: 24px 1fr;
882
+ gap: 10px;
883
+ padding: 10px;
884
+ background: var(--bg-elev-2);
885
+ border: 1px solid var(--border);
886
+ border-radius: var(--radius-sm);
887
+ }
888
+ .extract-row-title { font-weight: 600; font-size: 13px; margin-bottom: 4px; }
889
+ .extract-row-desc { font-size: 12px; color: var(--text-dim); margin-bottom: 4px; line-height: 1.4; }
890
+ .extract-checkbox { margin-top: 2px; transform: scale(1.1); }
891
+
892
+ /* ---------- Principles ---------- */
893
+
894
+ .principles-grid {
895
+ display: grid;
896
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
897
+ gap: 14px;
898
+ }
899
+
900
+ .principle-card {
901
+ background: var(--bg-elev);
902
+ border: 1px solid var(--border);
903
+ border-radius: var(--radius);
904
+ padding: 16px;
905
+ }
906
+
907
+ .principle-head {
908
+ display: flex;
909
+ justify-content: space-between;
910
+ align-items: flex-start;
911
+ gap: 8px;
912
+ margin-bottom: 8px;
913
+ }
914
+
915
+ .principle-title { font-size: 14px; font-weight: 600; }
916
+ .principle-cat {
917
+ font-size: 10.5px;
918
+ text-transform: uppercase;
919
+ color: var(--text-faint);
920
+ letter-spacing: 0.06em;
921
+ flex-shrink: 0;
922
+ margin-top: 2px;
923
+ }
924
+
925
+ .principle-desc { font-size: 12.5px; color: var(--text-dim); margin-bottom: 8px; line-height: 1.5; }
926
+
927
+ .priority-row {
928
+ display: flex;
929
+ align-items: center;
930
+ gap: 6px;
931
+ font-size: 11px;
932
+ color: var(--text-faint);
933
+ }
934
+
935
+ .priority-bar {
936
+ flex: 1;
937
+ height: 4px;
938
+ background: var(--bg-elev-2);
939
+ border-radius: 2px;
940
+ max-width: 80px;
941
+ }
942
+
943
+ .priority-bar-fill {
944
+ height: 100%;
945
+ background: var(--brand);
946
+ border-radius: 2px;
947
+ }
948
+
949
+ /* ---------- Settings ---------- */
950
+
951
+ .settings-table {
952
+ width: 100%;
953
+ border-collapse: collapse;
954
+ background: var(--bg-elev);
955
+ border: 1px solid var(--border);
956
+ border-radius: var(--radius);
957
+ overflow: hidden;
958
+ font-size: 13px;
959
+ }
960
+
961
+ .settings-table td { padding: 10px 16px; border-top: 1px solid var(--border); }
962
+ .settings-table tr:first-child td { border-top: 0; }
963
+ .settings-table td:first-child { color: var(--text-dim); width: 220px; }
964
+ .settings-table td:last-child { font-family: var(--font-mono); font-size: 12.5px; }
965
+
966
+ /* ---------- Toasts ---------- */
967
+
968
+ .toast-container {
969
+ position: fixed;
970
+ bottom: 20px;
971
+ right: 20px;
972
+ display: flex;
973
+ flex-direction: column;
974
+ gap: 8px;
975
+ z-index: 200;
976
+ }
977
+
978
+ .toast {
979
+ background: var(--bg-elev);
980
+ border: 1px solid var(--border-strong);
981
+ border-radius: var(--radius-sm);
982
+ padding: 10px 14px;
983
+ font-size: 12.5px;
984
+ max-width: 360px;
985
+ box-shadow: var(--shadow-2);
986
+ animation: toast-in 0.2s ease;
987
+ }
988
+
989
+ .toast.err { border-color: var(--err); }
990
+ .toast.ok { border-color: var(--ok); }
991
+
992
+ @keyframes toast-in {
993
+ from { opacity: 0; transform: translateX(20px); }
994
+ to { opacity: 1; transform: translateX(0); }
995
+ }
996
+
997
+ /* ---------- Workspace card (sidebar) ---------- */
998
+
999
+ .workspace-card {
1000
+ margin: 4px 4px 14px;
1001
+ padding: 10px 12px;
1002
+ background: var(--bg-elev-2);
1003
+ border: 1px solid var(--border-strong);
1004
+ border-radius: var(--radius-sm);
1005
+ display: flex;
1006
+ flex-direction: column;
1007
+ gap: 4px;
1008
+ font-size: 11.5px;
1009
+ }
1010
+
1011
+ .ws-row {
1012
+ display: flex;
1013
+ align-items: center;
1014
+ justify-content: space-between;
1015
+ gap: 8px;
1016
+ }
1017
+
1018
+ .ws-label-key { color: var(--text-faint); text-transform: uppercase; letter-spacing: 0.06em; font-size: 10.5px; font-weight: 600; }
1019
+
1020
+ .ws-pill {
1021
+ padding: 2px 8px;
1022
+ border-radius: 99px;
1023
+ font-size: 10.5px;
1024
+ font-weight: 600;
1025
+ text-transform: uppercase;
1026
+ letter-spacing: 0.04em;
1027
+ background: var(--bg);
1028
+ color: var(--text-dim);
1029
+ border: 1px solid var(--border-strong);
1030
+ }
1031
+ .ws-pill.home { color: var(--brand-2); border-color: rgba(76, 201, 255, 0.3); }
1032
+ .ws-pill.project { color: var(--ok); border-color: rgba(74, 222, 128, 0.3); }
1033
+
1034
+ .ws-count {
1035
+ color: var(--text);
1036
+ font-variant-numeric: tabular-nums;
1037
+ font-weight: 500;
1038
+ }
1039
+
1040
+ .ws-path {
1041
+ font-family: var(--font-mono);
1042
+ font-size: 10.5px;
1043
+ color: var(--text-faint);
1044
+ overflow: hidden;
1045
+ text-overflow: ellipsis;
1046
+ white-space: nowrap;
1047
+ display: block;
1048
+ width: 100%;
1049
+ padding-top: 2px;
1050
+ border-top: 1px solid var(--border);
1051
+ margin-top: 2px;
1052
+ }
1053
+
1054
+ /* ---------- Modal empty state (in new-discussion modal) ---------- */
1055
+
1056
+ .modal-empty {
1057
+ background: rgba(251, 191, 36, 0.08);
1058
+ border: 1px solid rgba(251, 191, 36, 0.3);
1059
+ border-radius: var(--radius-sm);
1060
+ padding: 14px 16px;
1061
+ width: 100%;
1062
+ }
1063
+ .modal-empty-title {
1064
+ color: var(--warn);
1065
+ font-weight: 600;
1066
+ font-size: 13px;
1067
+ margin-bottom: 6px;
1068
+ }
1069
+ .modal-empty-meta {
1070
+ color: var(--text-dim);
1071
+ font-size: 12px;
1072
+ line-height: 1.5;
1073
+ }
1074
+
1075
+ /* ---------- Wider modal (for edit forms) ---------- */
1076
+
1077
+ .modal-wide { max-width: 600px; }
1078
+
1079
+ /* ---------- Form fields ---------- */
1080
+
1081
+ .form-field {
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ gap: 6px;
1085
+ margin-bottom: 14px;
1086
+ }
1087
+ .form-field input[type="text"],
1088
+ .form-field input[type="number"],
1089
+ .form-field input[type="email"],
1090
+ .form-field input[type="password"],
1091
+ .form-field textarea,
1092
+ .form-field select {
1093
+ width: 100%;
1094
+ background: var(--bg);
1095
+ border: 1px solid var(--border-strong);
1096
+ color: var(--text);
1097
+ padding: 8px 11px;
1098
+ border-radius: var(--radius-sm);
1099
+ font-family: inherit;
1100
+ font-size: 13px;
1101
+ }
1102
+ .form-field textarea { resize: vertical; min-height: 60px; }
1103
+ .form-field select { cursor: pointer; }
1104
+ .form-field input:focus,
1105
+ .form-field textarea:focus,
1106
+ .form-field select:focus { outline: 0; border-color: var(--brand); }
1107
+
1108
+ .field-help {
1109
+ color: var(--text-faint);
1110
+ font-size: 11.5px;
1111
+ font-style: italic;
1112
+ }
1113
+
1114
+ /* Switch (iOS-style toggle) */
1115
+
1116
+ .switch {
1117
+ display: inline-flex;
1118
+ align-items: center;
1119
+ cursor: pointer;
1120
+ position: relative;
1121
+ width: 36px;
1122
+ height: 20px;
1123
+ }
1124
+ .switch input { opacity: 0; width: 0; height: 0; position: absolute; }
1125
+ .switch-track {
1126
+ position: absolute;
1127
+ inset: 0;
1128
+ background: var(--bg-elev-2);
1129
+ border: 1px solid var(--border-strong);
1130
+ border-radius: 99px;
1131
+ transition: background 0.18s, border-color 0.18s;
1132
+ }
1133
+ .switch-track::before {
1134
+ content: '';
1135
+ position: absolute;
1136
+ width: 14px;
1137
+ height: 14px;
1138
+ left: 2px;
1139
+ top: 2px;
1140
+ background: var(--text-dim);
1141
+ border-radius: 50%;
1142
+ transition: transform 0.18s, background 0.18s;
1143
+ }
1144
+ .switch input:checked + .switch-track {
1145
+ background: var(--brand);
1146
+ border-color: var(--brand);
1147
+ }
1148
+ .switch input:checked + .switch-track::before {
1149
+ transform: translateX(16px);
1150
+ background: white;
1151
+ }
1152
+
1153
+ .switch-row {
1154
+ display: flex;
1155
+ align-items: center;
1156
+ justify-content: space-between;
1157
+ padding: 10px 0;
1158
+ font-size: 13px;
1159
+ color: var(--text);
1160
+ border-top: 1px solid var(--border);
1161
+ margin-top: 14px;
1162
+ cursor: pointer;
1163
+ }
1164
+
1165
+ /* ---------- Member card actions ---------- */
1166
+
1167
+ .member-card-headtext { flex: 1; min-width: 0; }
1168
+ .member-card.is-inactive { opacity: 0.55; }
1169
+
1170
+ .card-actions {
1171
+ display: flex;
1172
+ gap: 8px;
1173
+ padding-top: 12px;
1174
+ margin-top: 14px;
1175
+ border-top: 1px solid var(--border);
1176
+ }
1177
+ .card-actions .btn-secondary,
1178
+ .card-actions .btn-danger-ghost {
1179
+ padding: 5px 10px;
1180
+ font-size: 12px;
1181
+ }
1182
+
1183
+ /* ---------- Buttons (additions) ---------- */
1184
+
1185
+ .btn-danger {
1186
+ background: var(--err);
1187
+ color: white;
1188
+ border: 0;
1189
+ padding: 8px 14px;
1190
+ border-radius: var(--radius-sm);
1191
+ font-size: 13px;
1192
+ font-weight: 500;
1193
+ margin-right: auto; /* push to left when adjacent to Cancel/Save */
1194
+ }
1195
+ .btn-danger:hover { filter: brightness(1.1); }
1196
+
1197
+ .btn-danger-ghost {
1198
+ background: transparent;
1199
+ color: var(--err);
1200
+ border: 1px solid rgba(248, 113, 113, 0.4);
1201
+ padding: 8px 14px;
1202
+ border-radius: var(--radius-sm);
1203
+ font-size: 13px;
1204
+ }
1205
+ .btn-danger-ghost:hover {
1206
+ background: rgba(248, 113, 113, 0.1);
1207
+ border-color: var(--err);
1208
+ }
1209
+
1210
+ /* ---------- Principle card (additions) ---------- */
1211
+
1212
+ .principle-card.is-inactive { opacity: 0.55; }
1213
+ .principle-head {
1214
+ display: flex;
1215
+ align-items: center;
1216
+ gap: 10px;
1217
+ }
1218
+ .principle-head .switch { margin-left: auto; flex-shrink: 0; }
1219
+
1220
+ /* ---------- Settings form ---------- */
1221
+
1222
+ .settings-form {
1223
+ max-width: 640px;
1224
+ background: var(--bg-elev);
1225
+ border: 1px solid var(--border);
1226
+ border-radius: var(--radius);
1227
+ padding: 22px 24px;
1228
+ }
1229
+
1230
+ .form-actions {
1231
+ display: flex;
1232
+ gap: 10px;
1233
+ padding-top: 14px;
1234
+ border-top: 1px solid var(--border);
1235
+ margin-top: 20px;
1236
+ }
1237
+
1238
+ /* ---------- Confirm modal ---------- */
1239
+
1240
+ .confirm-message {
1241
+ color: var(--text-dim);
1242
+ line-height: 1.55;
1243
+ font-size: 13.5px;
1244
+ }
1245
+
1246
+ /* ---------- View header (button on right) ---------- */
1247
+
1248
+ .view-header { gap: 16px; }
1249
+ .view-header .btn-primary { white-space: nowrap; }
1250
+
1251
+ /* ---------- User message bubble (right-aligned, like sent messages) ---------- */
1252
+
1253
+ .message.message-user {
1254
+ flex-direction: row-reverse;
1255
+ }
1256
+ .message.message-user .message-body {
1257
+ align-items: flex-end;
1258
+ }
1259
+ .user-body {
1260
+ display: flex;
1261
+ flex-direction: column;
1262
+ align-items: flex-end;
1263
+ max-width: 70%;
1264
+ margin-left: auto;
1265
+ }
1266
+ .user-body .message-name {
1267
+ text-align: right;
1268
+ color: var(--text-faint);
1269
+ font-size: 11.5px;
1270
+ text-transform: uppercase;
1271
+ letter-spacing: 0.06em;
1272
+ margin-bottom: 4px;
1273
+ }
1274
+ .user-bubble {
1275
+ background: linear-gradient(135deg, var(--brand) 0%, #6b4eff 100%);
1276
+ color: white;
1277
+ padding: 10px 14px;
1278
+ border-radius: 14px 14px 4px 14px;
1279
+ font-size: 13.5px;
1280
+ line-height: 1.55;
1281
+ box-shadow: 0 2px 8px rgba(124, 92, 255, 0.25);
1282
+ word-break: break-word;
1283
+ white-space: pre-wrap;
1284
+ }
1285
+ .avatar.avatar-user {
1286
+ background: linear-gradient(135deg, var(--brand) 0%, var(--brand-2) 100%);
1287
+ color: white;
1288
+ }
1289
+
1290
+ /* ========================================================== */
1291
+ /* Knowledge Wiki (Phase 1.5) */
1292
+ /* ========================================================== */
1293
+
1294
+ .view-knowledge {
1295
+ display: flex;
1296
+ flex-direction: column;
1297
+ height: 100%;
1298
+ gap: 12px;
1299
+ padding: 18px 24px 16px 24px;
1300
+ }
1301
+ .view-knowledge .view-header {
1302
+ display: flex;
1303
+ justify-content: space-between;
1304
+ align-items: flex-end;
1305
+ gap: 16px;
1306
+ }
1307
+ .view-knowledge .view-actions {
1308
+ display: flex;
1309
+ gap: 8px;
1310
+ align-items: center;
1311
+ }
1312
+ .view-knowledge #wiki-search {
1313
+ background: var(--surface);
1314
+ color: var(--text);
1315
+ border: 1px solid var(--border);
1316
+ border-radius: 6px;
1317
+ padding: 6px 10px;
1318
+ font-size: 13px;
1319
+ min-width: 280px;
1320
+ }
1321
+ .wiki-layout {
1322
+ display: grid;
1323
+ grid-template-columns: 320px 1fr;
1324
+ gap: 16px;
1325
+ flex: 1;
1326
+ min-height: 0;
1327
+ }
1328
+ .wiki-sidebar {
1329
+ background: var(--surface);
1330
+ border: 1px solid var(--border);
1331
+ border-radius: 8px;
1332
+ padding: 10px;
1333
+ overflow-y: auto;
1334
+ display: flex;
1335
+ flex-direction: column;
1336
+ gap: 8px;
1337
+ }
1338
+ .wiki-filters {
1339
+ display: flex;
1340
+ flex-wrap: wrap;
1341
+ gap: 4px;
1342
+ }
1343
+ .chip-filter {
1344
+ background: transparent;
1345
+ border: 1px solid var(--border);
1346
+ color: var(--text-dim);
1347
+ border-radius: 999px;
1348
+ padding: 3px 10px;
1349
+ font-size: 11.5px;
1350
+ cursor: pointer;
1351
+ }
1352
+ .chip-filter.active {
1353
+ background: var(--brand);
1354
+ color: white;
1355
+ border-color: var(--brand);
1356
+ }
1357
+ .wiki-page-list {
1358
+ display: flex;
1359
+ flex-direction: column;
1360
+ gap: 4px;
1361
+ overflow-y: auto;
1362
+ }
1363
+ .wiki-page-item {
1364
+ display: grid;
1365
+ grid-template-columns: auto 1fr;
1366
+ grid-template-rows: auto auto;
1367
+ gap: 4px 8px;
1368
+ background: transparent;
1369
+ border: 1px solid transparent;
1370
+ color: var(--text);
1371
+ border-radius: 6px;
1372
+ padding: 6px 8px;
1373
+ text-align: left;
1374
+ cursor: pointer;
1375
+ font-size: 12.5px;
1376
+ }
1377
+ .wiki-page-item:hover { background: rgba(255, 255, 255, 0.04); border-color: var(--border); }
1378
+ .wiki-page-item.active { background: rgba(124, 92, 255, 0.10); border-color: var(--brand); }
1379
+ .wiki-page-type {
1380
+ font-size: 10px;
1381
+ padding: 1px 6px;
1382
+ border-radius: 999px;
1383
+ text-transform: uppercase;
1384
+ letter-spacing: 0.06em;
1385
+ background: rgba(255, 255, 255, 0.08);
1386
+ color: var(--text-dim);
1387
+ }
1388
+ .wiki-page-type.type-concept { background: rgba(124, 92, 255, 0.18); color: #c4b3ff; }
1389
+ .wiki-page-type.type-entity { background: rgba(94, 255, 173, 0.15); color: #7be0a3; }
1390
+ .wiki-page-type.type-decision { background: rgba(255, 192, 92, 0.18); color: #ffcb6b; }
1391
+ .wiki-page-type.type-source-summary { background: rgba(255, 124, 168, 0.15); color: #ffb0c5; }
1392
+ .wiki-page-type.type-comparison { background: rgba(108, 200, 255, 0.18); color: #9ed8ff; }
1393
+ .wiki-page-slug { font-weight: 600; }
1394
+ .wiki-page-summary {
1395
+ grid-column: 1 / -1;
1396
+ color: var(--text-dim);
1397
+ font-size: 11.5px;
1398
+ }
1399
+ .wiki-detail {
1400
+ background: var(--surface);
1401
+ border: 1px solid var(--border);
1402
+ border-radius: 8px;
1403
+ padding: 20px 24px;
1404
+ overflow-y: auto;
1405
+ display: grid;
1406
+ grid-template-columns: 1fr 260px;
1407
+ gap: 24px;
1408
+ align-content: start;
1409
+ }
1410
+ .wiki-detail-empty {
1411
+ grid-column: 1 / -1;
1412
+ color: var(--text-dim);
1413
+ display: flex;
1414
+ flex-direction: column;
1415
+ gap: 8px;
1416
+ }
1417
+ .wiki-page-header { grid-column: 1 / -1; display: flex; flex-direction: column; gap: 8px; margin-bottom: 8px; }
1418
+ .wiki-page-meta { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
1419
+ .wiki-page-summary-large { color: var(--text-dim); font-size: 14px; margin: 0; }
1420
+ .wiki-page-content {
1421
+ font-size: 14px;
1422
+ line-height: 1.65;
1423
+ color: var(--text);
1424
+ }
1425
+ .wiki-page-content h1 { font-size: 22px; margin: 12px 0 8px; }
1426
+ .wiki-page-content h2 { font-size: 17px; margin: 18px 0 6px; color: var(--text); border-bottom: 1px solid var(--border); padding-bottom: 4px; }
1427
+ .wiki-page-content h3 { font-size: 14.5px; margin: 14px 0 4px; color: var(--text-dim); }
1428
+ .wiki-page-content p { margin: 6px 0; }
1429
+ .wiki-page-content ul, .wiki-page-content ol { padding-left: 22px; margin: 6px 0; }
1430
+ .wiki-page-content li { margin: 2px 0; }
1431
+ .wiki-page-content code { background: rgba(255, 255, 255, 0.06); padding: 1px 5px; border-radius: 3px; font-size: 12.5px; }
1432
+ .wiki-page-content pre { background: rgba(0, 0, 0, 0.3); padding: 10px 12px; border-radius: 6px; overflow-x: auto; }
1433
+ .wiki-page-content blockquote { border-left: 3px solid var(--brand); padding: 4px 12px; color: var(--text-dim); margin: 8px 0; }
1434
+
1435
+ .wiki-link {
1436
+ color: var(--brand-2);
1437
+ text-decoration: none;
1438
+ border-bottom: 1px dotted var(--brand-2);
1439
+ cursor: pointer;
1440
+ }
1441
+ .wiki-link:hover { color: white; border-bottom-style: solid; }
1442
+ .wiki-unresolved {
1443
+ color: var(--err, #ff6b6b);
1444
+ border-bottom: 1px dotted var(--err, #ff6b6b);
1445
+ cursor: pointer;
1446
+ }
1447
+ .wiki-transclusion, .wiki-blockid {
1448
+ color: var(--text-dim);
1449
+ border-bottom: 1px dashed var(--text-dim);
1450
+ font-style: italic;
1451
+ }
1452
+
1453
+ .wiki-sidecar { display: flex; flex-direction: column; gap: 14px; }
1454
+ .wiki-sidecar h3 { font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-dim); margin: 0 0 6px; }
1455
+ .wiki-tag-row { display: flex; flex-wrap: wrap; gap: 4px; }
1456
+ .wiki-tag { background: rgba(255, 255, 255, 0.06); border-radius: 4px; padding: 1px 6px; font-size: 11.5px; }
1457
+ .wiki-source-list { padding-left: 16px; margin: 0; font-size: 12px; }
1458
+ .wiki-related, .wiki-backlinks { font-size: 12.5px; display: flex; flex-direction: column; gap: 4px; }
1459
+
1460
+ .wiki-ingest-panel {
1461
+ position: fixed;
1462
+ right: 24px;
1463
+ bottom: 80px;
1464
+ width: 420px;
1465
+ background: var(--surface);
1466
+ border: 1px solid var(--border);
1467
+ border-radius: 10px;
1468
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4);
1469
+ z-index: 30;
1470
+ }
1471
+ .wiki-ingest-panel .panel-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); }
1472
+ .wiki-ingest-panel .panel-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 10px; }
1473
+ .wiki-ingest-panel .panel-actions { display: flex; justify-content: flex-end; gap: 8px; }
1474
+ .wiki-ingest-panel textarea, .wiki-ingest-panel input {
1475
+ background: var(--bg);
1476
+ color: var(--text);
1477
+ border: 1px solid var(--border);
1478
+ border-radius: 6px;
1479
+ padding: 6px 10px;
1480
+ font-size: 12.5px;
1481
+ width: 100%;
1482
+ }
1483
+
1484
+ .wiki-query-bar { display: flex; gap: 8px; padding-top: 6px; }
1485
+ .wiki-query-bar input { flex: 1; background: var(--surface); border: 1px solid var(--border); color: var(--text); border-radius: 6px; padding: 8px 12px; }
1486
+ .wiki-query-answer { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; font-size: 13px; }
1487
+ .wiki-citations { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 6px; }
1488
+ .wiki-citation { font-family: var(--mono, monospace); font-size: 12px; }
1489
+
1490
+ .badge { display: inline-block; padding: 1px 8px; font-size: 11px; border-radius: 999px; background: rgba(255, 255, 255, 0.06); color: var(--text-dim); }
1491
+ .badge-warn { background: rgba(255, 192, 92, 0.16); color: #ffcb6b; }
1492
+ .badge-type { background: rgba(124, 92, 255, 0.18); color: #c4b3ff; }
1493
+
1494
+ /* ---------------------------------------------------------------- */
1495
+ /* Phase 2: header-actions, tools-chips, enhance row, explorer wizard, coach view */
1496
+ /* ---------------------------------------------------------------- */
1497
+
1498
+ .header-actions { display: flex; gap: 8px; align-items: center; }
1499
+
1500
+ .enhance-row {
1501
+ display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
1502
+ }
1503
+ .enhance-row select {
1504
+ background: var(--surface);
1505
+ border: 1px solid var(--border);
1506
+ color: var(--text);
1507
+ border-radius: 6px;
1508
+ padding: 6px 10px;
1509
+ font-size: 13px;
1510
+ }
1511
+ .tools-chips {
1512
+ display: flex; gap: 8px; flex-wrap: wrap;
1513
+ }
1514
+ .tool-chip {
1515
+ display: inline-flex; gap: 6px; align-items: center;
1516
+ padding: 4px 10px;
1517
+ border-radius: 999px;
1518
+ background: rgba(255, 255, 255, 0.04);
1519
+ border: 1px solid var(--border);
1520
+ font-size: 12px;
1521
+ cursor: pointer;
1522
+ }
1523
+ .tool-chip input { margin: 0; }
1524
+
1525
+ /* Principle Explorer wizard */
1526
+ .explorer-wrap { display: flex; flex-direction: column; gap: 12px; min-height: 400px; }
1527
+ .explorer-steps { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
1528
+ .explorer-step-dot {
1529
+ padding: 4px 12px;
1530
+ border-radius: 999px;
1531
+ background: rgba(255, 255, 255, 0.04);
1532
+ border: 1px solid var(--border);
1533
+ color: var(--text-dim);
1534
+ font-size: 12px;
1535
+ }
1536
+ .explorer-step-dot.active {
1537
+ background: rgba(124, 92, 255, 0.22);
1538
+ border-color: rgba(124, 92, 255, 0.5);
1539
+ color: #c4b3ff;
1540
+ }
1541
+ .explorer-transcript {
1542
+ display: flex; flex-direction: column; gap: 10px;
1543
+ max-height: 360px; overflow-y: auto;
1544
+ padding: 10px; border-radius: 8px;
1545
+ background: var(--bg);
1546
+ border: 1px solid var(--border);
1547
+ }
1548
+ .explorer-msg { display: flex; flex-direction: column; gap: 4px; }
1549
+ .explorer-msg .explorer-role {
1550
+ font-size: 11px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.04em;
1551
+ }
1552
+ .explorer-msg.assistant .explorer-content {
1553
+ background: rgba(124, 92, 255, 0.10);
1554
+ border-radius: 8px;
1555
+ padding: 10px 14px;
1556
+ font-size: 13px;
1557
+ white-space: pre-wrap;
1558
+ }
1559
+ .explorer-msg.user .explorer-content {
1560
+ background: rgba(255, 255, 255, 0.04);
1561
+ border-radius: 8px;
1562
+ padding: 10px 14px;
1563
+ font-size: 13px;
1564
+ white-space: pre-wrap;
1565
+ }
1566
+ .explorer-composer {
1567
+ display: flex; gap: 8px;
1568
+ }
1569
+ .explorer-composer textarea {
1570
+ flex: 1;
1571
+ background: var(--surface);
1572
+ border: 1px solid var(--border);
1573
+ color: var(--text);
1574
+ border-radius: 6px;
1575
+ padding: 8px 12px;
1576
+ font-size: 13px;
1577
+ resize: vertical;
1578
+ }
1579
+ .explorer-thinking {
1580
+ font-size: 12px; color: var(--text-dim); font-style: italic; padding: 6px 0;
1581
+ }
1582
+ .explorer-draft {
1583
+ font-size: 12px;
1584
+ color: var(--text-dim);
1585
+ padding: 10px 12px;
1586
+ border-radius: 8px;
1587
+ background: rgba(255, 255, 255, 0.03);
1588
+ border: 1px dashed var(--border);
1589
+ margin-top: 6px;
1590
+ }
1591
+ .explorer-draft strong { color: var(--text); }
1592
+
1593
+ /* Coach view */
1594
+ .coach-view { display: flex; flex-direction: column; gap: 12px; height: 100%; }
1595
+ .coach-layout {
1596
+ flex: 1;
1597
+ display: grid;
1598
+ grid-template-columns: 280px 1fr;
1599
+ gap: 12px;
1600
+ min-height: 0;
1601
+ }
1602
+ .coach-sidebar {
1603
+ background: var(--surface);
1604
+ border: 1px solid var(--border);
1605
+ border-radius: 8px;
1606
+ padding: 12px;
1607
+ overflow-y: auto;
1608
+ }
1609
+ .coach-sidebar-head { font-weight: 600; font-size: 12px; text-transform: uppercase; color: var(--text-dim); margin-bottom: 8px; }
1610
+ .coach-session-list { display: flex; flex-direction: column; gap: 6px; }
1611
+ .coach-session-row {
1612
+ text-align: left;
1613
+ background: transparent;
1614
+ border: 1px solid var(--border);
1615
+ border-radius: 6px;
1616
+ padding: 8px 10px;
1617
+ color: var(--text);
1618
+ cursor: pointer;
1619
+ }
1620
+ .coach-session-row:hover { background: rgba(255, 255, 255, 0.04); }
1621
+ .coach-session-row.active {
1622
+ border-color: rgba(124, 92, 255, 0.5);
1623
+ background: rgba(124, 92, 255, 0.10);
1624
+ }
1625
+ .coach-session-title { font-size: 13px; font-weight: 500; margin-bottom: 4px; }
1626
+ .coach-session-meta { font-size: 11px; color: var(--text-dim); }
1627
+ .coach-detail {
1628
+ background: var(--surface);
1629
+ border: 1px solid var(--border);
1630
+ border-radius: 8px;
1631
+ padding: 16px;
1632
+ display: flex;
1633
+ flex-direction: column;
1634
+ gap: 12px;
1635
+ overflow: hidden;
1636
+ }
1637
+ .coach-empty { color: var(--text-dim); }
1638
+ .coach-chat-head { padding-bottom: 8px; border-bottom: 1px solid var(--border); }
1639
+ .coach-chat-title { font-size: 16px; font-weight: 600; }
1640
+ .coach-chat-situation { font-size: 13px; color: var(--text-dim); margin-top: 4px; }
1641
+ .coach-chat-meta { font-size: 12px; color: var(--text-dim); margin-top: 6px; display: flex; gap: 6px; align-items: center; }
1642
+ .coach-stream {
1643
+ flex: 1; overflow-y: auto; min-height: 200px;
1644
+ display: flex; flex-direction: column; gap: 10px;
1645
+ padding: 6px 2px;
1646
+ }
1647
+ .coach-msg { display: flex; flex-direction: column; gap: 4px; }
1648
+ .coach-msg .coach-role { font-size: 11px; text-transform: uppercase; color: var(--text-dim); letter-spacing: 0.04em; }
1649
+ .coach-msg.user .coach-msg-body {
1650
+ background: rgba(255, 255, 255, 0.04);
1651
+ border-radius: 8px;
1652
+ padding: 10px 14px;
1653
+ white-space: pre-wrap;
1654
+ }
1655
+ .coach-msg.assistant .coach-msg-body {
1656
+ background: rgba(124, 92, 255, 0.10);
1657
+ border-radius: 8px;
1658
+ padding: 10px 14px;
1659
+ white-space: pre-wrap;
1660
+ }
1661
+ .coach-msg-refs { font-size: 11px; color: var(--text-dim); }
1662
+ .coach-thinking { font-size: 12px; color: var(--text-dim); font-style: italic; }
1663
+ .coach-composer { display: flex; gap: 8px; padding-top: 6px; border-top: 1px solid var(--border); }
1664
+ .coach-composer textarea {
1665
+ flex: 1;
1666
+ background: var(--bg);
1667
+ border: 1px solid var(--border);
1668
+ color: var(--text);
1669
+ border-radius: 6px;
1670
+ padding: 8px 12px;
1671
+ font-size: 13px;
1672
+ resize: vertical;
1673
+ }
1674
+
1675
+ /* ==================================================================
1676
+ Sparring (Phase 3) — 1:1 deep dive modal
1677
+ ================================================================== */
1678
+
1679
+ .message-name-row {
1680
+ display: flex;
1681
+ align-items: center;
1682
+ gap: 10px;
1683
+ flex-wrap: wrap;
1684
+ }
1685
+ .btn-ghost {
1686
+ background: transparent;
1687
+ border: 1px solid transparent;
1688
+ color: var(--text-dim);
1689
+ padding: 2px 8px;
1690
+ border-radius: 6px;
1691
+ font-size: 11px;
1692
+ cursor: pointer;
1693
+ transition: all 0.12s ease;
1694
+ }
1695
+ .btn-ghost:hover {
1696
+ background: rgba(124, 92, 255, 0.10);
1697
+ border-color: rgba(124, 92, 255, 0.30);
1698
+ color: var(--text);
1699
+ }
1700
+ .btn-spar {
1701
+ font-weight: 500;
1702
+ }
1703
+
1704
+ .sparring-modal {
1705
+ max-width: 880px;
1706
+ width: 92vw;
1707
+ max-height: 86vh;
1708
+ display: flex;
1709
+ flex-direction: column;
1710
+ }
1711
+ .sparring-modal .modal-header {
1712
+ flex-shrink: 0;
1713
+ }
1714
+ .sparring-body {
1715
+ flex: 1;
1716
+ display: flex;
1717
+ flex-direction: column;
1718
+ min-height: 0;
1719
+ gap: 14px;
1720
+ }
1721
+ .spar-header-actions {
1722
+ display: flex;
1723
+ gap: 8px;
1724
+ align-items: center;
1725
+ }
1726
+ .sparring-anchor {
1727
+ flex-shrink: 0;
1728
+ background: rgba(124, 92, 255, 0.08);
1729
+ border-left: 3px solid rgba(124, 92, 255, 0.6);
1730
+ padding: 10px 14px;
1731
+ border-radius: 6px;
1732
+ max-height: 140px;
1733
+ overflow-y: auto;
1734
+ }
1735
+ .sparring-anchor-label {
1736
+ font-size: 11px;
1737
+ text-transform: uppercase;
1738
+ letter-spacing: 0.04em;
1739
+ color: var(--text-dim);
1740
+ margin-bottom: 4px;
1741
+ }
1742
+ .sparring-anchor-text {
1743
+ font-size: 13px;
1744
+ white-space: pre-wrap;
1745
+ line-height: 1.5;
1746
+ }
1747
+ .sparring-transcript {
1748
+ flex: 1;
1749
+ overflow-y: auto;
1750
+ display: flex;
1751
+ flex-direction: column;
1752
+ gap: 12px;
1753
+ padding: 6px 2px;
1754
+ min-height: 200px;
1755
+ }
1756
+ .sparring-empty {
1757
+ font-style: italic;
1758
+ padding: 12px;
1759
+ }
1760
+ .sparring-composer {
1761
+ flex-shrink: 0;
1762
+ border-top: 1px solid var(--border);
1763
+ padding-top: 10px;
1764
+ display: flex;
1765
+ flex-direction: column;
1766
+ gap: 8px;
1767
+ }
1768
+ .sparring-composer textarea {
1769
+ background: var(--bg);
1770
+ border: 1px solid var(--border);
1771
+ color: var(--text);
1772
+ border-radius: 6px;
1773
+ padding: 8px 12px;
1774
+ font-size: 13px;
1775
+ resize: vertical;
1776
+ width: 100%;
1777
+ }
1778
+ .sparring-composer-actions {
1779
+ display: flex;
1780
+ justify-content: flex-end;
1781
+ }
1782
+ .sparring-sources {
1783
+ margin-top: 8px;
1784
+ padding-top: 8px;
1785
+ border-top: 1px dashed var(--border);
1786
+ }
1787
+ .sparring-sources ul {
1788
+ margin: 4px 0 0 0;
1789
+ padding-left: 18px;
1790
+ font-size: 12px;
1791
+ }
1792
+ .sparring-sources a {
1793
+ color: rgba(124, 92, 255, 0.95);
1794
+ text-decoration: none;
1795
+ }
1796
+ .sparring-sources a:hover {
1797
+ text-decoration: underline;
1798
+ }
1799
+
1800
+ .chat-header-actions {
1801
+ display: flex;
1802
+ gap: 8px;
1803
+ align-items: center;
1804
+ }
1805
+
1806
+ .sparring-session-list {
1807
+ display: flex;
1808
+ flex-direction: column;
1809
+ gap: 6px;
1810
+ }
1811
+ .sparring-session-row {
1812
+ display: block;
1813
+ width: 100%;
1814
+ text-align: left;
1815
+ background: rgba(255, 255, 255, 0.02);
1816
+ border: 1px solid var(--border);
1817
+ border-radius: 8px;
1818
+ padding: 10px 14px;
1819
+ cursor: pointer;
1820
+ color: var(--text);
1821
+ transition: all 0.12s ease;
1822
+ }
1823
+ .sparring-session-row:hover {
1824
+ background: rgba(124, 92, 255, 0.08);
1825
+ border-color: rgba(124, 92, 255, 0.30);
1826
+ }
1827
+ .spar-row-title { font-weight: 500; font-size: 13px; }
1828
+ .spar-row-meta { font-size: 11px; color: var(--text-dim); margin-top: 3px; }
1829
+ .spar-row-subtitle { font-size: 12px; color: var(--text-dim); margin-top: 2px; font-style: italic; }
1830
+
1831
+ /* ------------------------------------------------------------------ */
1832
+ /* Phase 5 — Skill Planner + skill-creator orchestration UI */
1833
+ /* ------------------------------------------------------------------ */
1834
+
1835
+ /* Action card Plan + Solve buttons */
1836
+ .kanban-card-actions {
1837
+ display: flex;
1838
+ gap: 6px;
1839
+ margin-top: 8px;
1840
+ }
1841
+ .kanban-card-action {
1842
+ font-size: 11px;
1843
+ padding: 4px 10px;
1844
+ border-radius: 6px;
1845
+ cursor: pointer;
1846
+ border: 1px solid var(--border);
1847
+ background: rgba(255, 255, 255, 0.04);
1848
+ color: var(--text);
1849
+ }
1850
+ .kanban-card-action:hover {
1851
+ background: rgba(255, 255, 255, 0.08);
1852
+ }
1853
+ .kanban-card-action.btn-primary {
1854
+ background: rgba(124, 92, 255, 0.18);
1855
+ border-color: rgba(124, 92, 255, 0.45);
1856
+ }
1857
+ .kanban-card-action.btn-primary:hover {
1858
+ background: rgba(124, 92, 255, 0.30);
1859
+ }
1860
+
1861
+ /* Planner progress pane (4 phases + live stream) */
1862
+ .planner-phase {
1863
+ display: flex;
1864
+ justify-content: space-between;
1865
+ align-items: center;
1866
+ padding: 8px 12px;
1867
+ margin: 4px 0;
1868
+ border: 1px solid var(--border);
1869
+ border-radius: 6px;
1870
+ background: rgba(255, 255, 255, 0.02);
1871
+ }
1872
+ .planner-phase[data-status="done"] {
1873
+ border-color: rgba(80, 200, 120, 0.45);
1874
+ background: rgba(80, 200, 120, 0.06);
1875
+ }
1876
+ .planner-phase[data-status="running"] {
1877
+ border-color: rgba(124, 92, 255, 0.45);
1878
+ background: rgba(124, 92, 255, 0.08);
1879
+ }
1880
+ .planner-phase-label {
1881
+ font-weight: 500;
1882
+ }
1883
+ .planner-phase-status {
1884
+ font-size: 11px;
1885
+ text-transform: uppercase;
1886
+ color: var(--text-dim);
1887
+ }
1888
+ .planner-stream {
1889
+ margin-top: 12px;
1890
+ max-height: 240px;
1891
+ overflow-y: auto;
1892
+ font-family: ui-monospace, "SF Mono", Monaco, monospace;
1893
+ font-size: 12px;
1894
+ color: var(--text-dim);
1895
+ }
1896
+ .planner-stream-row {
1897
+ padding: 2px 0;
1898
+ }
1899
+
1900
+ /* Proposal modal */
1901
+ .planner-proposal h3 {
1902
+ font-size: 14px;
1903
+ margin: 16px 0 8px;
1904
+ }
1905
+ .planner-tier-row {
1906
+ display: flex;
1907
+ gap: 18px;
1908
+ margin: 12px 0;
1909
+ }
1910
+ .planner-tier-label {
1911
+ font-size: 13px;
1912
+ }
1913
+ .planner-rationale {
1914
+ font-size: 13px;
1915
+ line-height: 1.5;
1916
+ color: var(--text);
1917
+ background: rgba(124, 92, 255, 0.06);
1918
+ border-left: 3px solid rgba(124, 92, 255, 0.45);
1919
+ padding: 10px 14px;
1920
+ border-radius: 4px;
1921
+ }
1922
+ .planner-integration-row,
1923
+ .planner-stakeholder-row {
1924
+ display: flex;
1925
+ align-items: flex-start;
1926
+ gap: 10px;
1927
+ padding: 6px 0;
1928
+ border-bottom: 1px solid rgba(255, 255, 255, 0.04);
1929
+ }
1930
+ .planner-integration-row input[type="checkbox"],
1931
+ .planner-stakeholder-row input[type="checkbox"] {
1932
+ margin-top: 4px;
1933
+ }
1934
+ .planner-kind {
1935
+ font-family: ui-monospace, "SF Mono", Monaco, monospace;
1936
+ font-size: 11px;
1937
+ background: rgba(255, 255, 255, 0.06);
1938
+ padding: 1px 6px;
1939
+ border-radius: 4px;
1940
+ color: var(--text-dim);
1941
+ }
1942
+ .planner-cost {
1943
+ font-size: 12px;
1944
+ color: var(--text-dim);
1945
+ margin-top: 14px;
1946
+ font-style: italic;
1947
+ }
1948
+
1949
+ /* Skills view */
1950
+ .skills-view {
1951
+ padding: 12px 0;
1952
+ }
1953
+ .skills-row {
1954
+ display: grid;
1955
+ grid-template-columns: 1fr auto;
1956
+ align-items: center;
1957
+ gap: 12px;
1958
+ padding: 12px 16px;
1959
+ margin: 6px 0;
1960
+ border: 1px solid var(--border);
1961
+ border-radius: 8px;
1962
+ background: rgba(255, 255, 255, 0.02);
1963
+ }
1964
+ .skills-name strong { font-size: 14px; }
1965
+ .skills-scope { font-size: 11px; color: var(--text-dim); }
1966
+ .skills-dir { font-size: 11px; color: var(--text-dim); font-family: ui-monospace, "SF Mono", monospace; grid-column: 1 / -1; }
1967
+ .skills-actions { display: flex; gap: 8px; }
1968
+ .skill-detail-body {
1969
+ font-family: ui-monospace, "SF Mono", Monaco, monospace;
1970
+ font-size: 12px;
1971
+ line-height: 1.5;
1972
+ white-space: pre-wrap;
1973
+ max-height: 60vh;
1974
+ overflow-y: auto;
1975
+ background: rgba(0, 0, 0, 0.20);
1976
+ padding: 12px;
1977
+ border-radius: 6px;
1978
+ }
1979
+
1980
+ /* Phase 5 — failed phase + persistent error banner (caught via live MCP smoke 2026-05-21) */
1981
+ .planner-phase[data-status="failed"] {
1982
+ border-color: rgba(220, 80, 80, 0.55);
1983
+ background: rgba(220, 80, 80, 0.08);
1984
+ }
1985
+ .planner-error-banner {
1986
+ margin-top: 16px;
1987
+ padding: 12px 14px;
1988
+ border: 1px solid rgba(220, 80, 80, 0.55);
1989
+ border-radius: 6px;
1990
+ background: rgba(220, 80, 80, 0.12);
1991
+ color: #f8b8b8;
1992
+ font-size: 13px;
1993
+ font-weight: 500;
1994
+ white-space: pre-wrap;
1995
+ }
1996
+
1997
+ /* =================================================================
1998
+ * Phase 6.5 polish — light theme, theme toggle, mobile sidebar,
1999
+ * usage dashboard.
2000
+ * ================================================================= */
2001
+
2002
+ /* ---------- Light theme override ----------
2003
+ * The :root tokens above are the dark default. data-theme="light" remaps
2004
+ * the same token names so every existing var(--bg) etc. stays green. */
2005
+ :root[data-theme="light"] {
2006
+ --bg: #f8fafc;
2007
+ --bg-elev: #ffffff;
2008
+ --bg-elev-2: #eef2f7;
2009
+ --border: #d8deea;
2010
+ --border-strong: #b8c1d4;
2011
+ --text: #1a1f29;
2012
+ --text-dim: #4a5266;
2013
+ --text-faint: #6c7589;
2014
+
2015
+ --brand: #6b46c1;
2016
+ --brand-2: #0ea5e9;
2017
+ --ok: #16a34a;
2018
+ --warn: #d97706;
2019
+ --err: #dc2626;
2020
+ --info: #2563eb;
2021
+
2022
+ /* Members palette — slightly darker so they read on a white background. */
2023
+ --m-cyan: #0891b2;
2024
+ --m-green: #16a34a;
2025
+ --m-yellow: #ca8a04;
2026
+ --m-magenta: #c026d3;
2027
+ --m-blue: #2563eb;
2028
+ --m-red: #dc2626;
2029
+ --m-orange: #ea580c;
2030
+ --m-pink: #db2777;
2031
+ --m-purple: #7c3aed;
2032
+
2033
+ --shadow-1: 0 1px 2px rgba(15, 23, 42, 0.06);
2034
+ --shadow-2: 0 8px 24px rgba(15, 23, 42, 0.08);
2035
+ }
2036
+
2037
+ /* In light theme, avatar text should be light against the darker palette. */
2038
+ :root[data-theme="light"] .avatar {
2039
+ color: #ffffff;
2040
+ }
2041
+
2042
+ /* Persistent error banner reads as red in light mode too. */
2043
+ :root[data-theme="light"] .planner-error-banner {
2044
+ color: #7f1d1d;
2045
+ background: rgba(220, 38, 38, 0.08);
2046
+ }
2047
+
2048
+ /* ---------- Theme toggle ---------- */
2049
+ .theme-toggle {
2050
+ display: flex;
2051
+ align-items: center;
2052
+ gap: 8px;
2053
+ margin-bottom: 8px;
2054
+ padding: 8px 10px;
2055
+ width: 100%;
2056
+ background: transparent;
2057
+ border: 1px solid var(--border);
2058
+ border-radius: var(--radius-sm);
2059
+ color: var(--text-dim);
2060
+ font-size: 12.5px;
2061
+ font-weight: 500;
2062
+ cursor: pointer;
2063
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
2064
+ }
2065
+ .theme-toggle:hover {
2066
+ background: var(--bg-elev-2);
2067
+ color: var(--text);
2068
+ border-color: var(--border-strong);
2069
+ }
2070
+ .theme-toggle-icon {
2071
+ font-size: 13px;
2072
+ line-height: 1;
2073
+ }
2074
+ .theme-toggle-label {
2075
+ flex: 1;
2076
+ text-align: left;
2077
+ }
2078
+
2079
+ /* ---------- Mobile sidebar toggle + scrim ----------
2080
+ * The toggle button starts as `display: none` here. The mobile media query
2081
+ * promotes it to `display: flex`; the desktop media query keeps it hidden
2082
+ * via `!important`. The scrim is gated by the `hidden` attribute (toggled
2083
+ * from app.js) so it only paints when the user has explicitly opened the
2084
+ * sidebar on mobile. */
2085
+ .sidebar-toggle {
2086
+ display: none;
2087
+ position: fixed;
2088
+ top: 12px;
2089
+ left: 12px;
2090
+ z-index: 60;
2091
+ width: 38px;
2092
+ height: 38px;
2093
+ border-radius: 8px;
2094
+ border: 1px solid var(--border);
2095
+ background: var(--bg-elev);
2096
+ color: var(--text);
2097
+ font-size: 18px;
2098
+ align-items: center;
2099
+ justify-content: center;
2100
+ box-shadow: var(--shadow-1);
2101
+ }
2102
+ .sidebar-scrim {
2103
+ display: none;
2104
+ position: fixed;
2105
+ inset: 0;
2106
+ z-index: 40;
2107
+ background: rgba(0, 0, 0, 0.45);
2108
+ }
2109
+
2110
+ /* ---------- Mobile responsive ---------- */
2111
+ @media (max-width: 760px) {
2112
+ body {
2113
+ grid-template-columns: 1fr;
2114
+ }
2115
+ .sidebar {
2116
+ position: fixed;
2117
+ top: 0;
2118
+ left: 0;
2119
+ bottom: 0;
2120
+ width: 280px;
2121
+ z-index: 50;
2122
+ transform: translateX(-100%);
2123
+ transition: transform 0.22s ease;
2124
+ box-shadow: var(--shadow-2);
2125
+ }
2126
+ body.sidebar-open .sidebar {
2127
+ transform: translateX(0);
2128
+ }
2129
+ .sidebar-toggle {
2130
+ display: flex;
2131
+ }
2132
+ .sidebar-scrim:not([hidden]) {
2133
+ display: block;
2134
+ }
2135
+ body.sidebar-open .sidebar-scrim {
2136
+ display: block;
2137
+ }
2138
+ .main {
2139
+ padding-top: 56px; /* leave room for the floating hamburger button */
2140
+ }
2141
+ .view {
2142
+ padding-left: 12px;
2143
+ padding-right: 12px;
2144
+ }
2145
+ .view-header {
2146
+ flex-wrap: wrap;
2147
+ gap: 8px;
2148
+ }
2149
+ .modal {
2150
+ width: calc(100vw - 24px);
2151
+ max-width: calc(100vw - 24px);
2152
+ }
2153
+ }
2154
+
2155
+ /* On non-mobile, never paint the hamburger or scrim — the sidebar is always docked. */
2156
+ @media (min-width: 761px) {
2157
+ .sidebar-toggle { display: none !important; }
2158
+ .sidebar-scrim { display: none !important; }
2159
+ }
2160
+
2161
+ /* ---------- Usage dashboard ---------- */
2162
+ .usage-range {
2163
+ display: flex;
2164
+ gap: 6px;
2165
+ flex-wrap: wrap;
2166
+ }
2167
+ .usage-range-btn {
2168
+ padding: 6px 10px;
2169
+ font-size: 12.5px;
2170
+ }
2171
+ .usage-range-btn.active {
2172
+ background: var(--brand);
2173
+ color: white;
2174
+ border-color: var(--brand);
2175
+ }
2176
+ .usage-body {
2177
+ padding-bottom: 32px;
2178
+ }
2179
+ .usage-loading {
2180
+ padding: 32px 8px;
2181
+ color: var(--text-faint);
2182
+ text-align: center;
2183
+ }
2184
+ .usage-content {
2185
+ display: flex;
2186
+ flex-direction: column;
2187
+ gap: 24px;
2188
+ }
2189
+ .usage-totals {
2190
+ display: grid;
2191
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
2192
+ gap: 12px;
2193
+ }
2194
+ .usage-stat {
2195
+ padding: 14px 16px;
2196
+ background: var(--bg-elev);
2197
+ border: 1px solid var(--border);
2198
+ border-radius: var(--radius);
2199
+ }
2200
+ .usage-stat-label {
2201
+ font-size: 11.5px;
2202
+ color: var(--text-faint);
2203
+ text-transform: uppercase;
2204
+ letter-spacing: 0.06em;
2205
+ margin-bottom: 6px;
2206
+ }
2207
+ .usage-stat-value {
2208
+ font-size: 22px;
2209
+ font-weight: 600;
2210
+ color: var(--text);
2211
+ font-variant-numeric: tabular-nums;
2212
+ }
2213
+ .usage-section-title {
2214
+ font-size: 13px;
2215
+ font-weight: 600;
2216
+ color: var(--text-dim);
2217
+ text-transform: uppercase;
2218
+ letter-spacing: 0.06em;
2219
+ margin: 0 0 8px;
2220
+ }
2221
+ .usage-sparkline {
2222
+ display: flex;
2223
+ align-items: flex-end;
2224
+ gap: 4px;
2225
+ height: 130px;
2226
+ padding: 12px;
2227
+ background: var(--bg-elev);
2228
+ border: 1px solid var(--border);
2229
+ border-radius: var(--radius);
2230
+ overflow-x: auto;
2231
+ }
2232
+ .usage-sparkline-bar {
2233
+ flex: 1 0 18px;
2234
+ min-height: 4px;
2235
+ background: linear-gradient(180deg, var(--brand) 0%, var(--brand-2) 100%);
2236
+ border-radius: 4px 4px 0 0;
2237
+ position: relative;
2238
+ display: flex;
2239
+ justify-content: center;
2240
+ align-items: flex-end;
2241
+ cursor: default;
2242
+ }
2243
+ .usage-sparkline-label {
2244
+ position: absolute;
2245
+ bottom: -18px;
2246
+ font-size: 10px;
2247
+ color: var(--text-faint);
2248
+ white-space: nowrap;
2249
+ }
2250
+ .usage-split {
2251
+ display: grid;
2252
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
2253
+ gap: 16px;
2254
+ }
2255
+ .usage-table-wrap {
2256
+ background: var(--bg-elev);
2257
+ border: 1px solid var(--border);
2258
+ border-radius: var(--radius);
2259
+ padding: 16px;
2260
+ }
2261
+ .usage-table {
2262
+ width: 100%;
2263
+ border-collapse: collapse;
2264
+ font-size: 12.5px;
2265
+ }
2266
+ .usage-table th {
2267
+ text-align: left;
2268
+ font-weight: 500;
2269
+ font-size: 11px;
2270
+ color: var(--text-faint);
2271
+ text-transform: uppercase;
2272
+ letter-spacing: 0.06em;
2273
+ padding: 6px 8px;
2274
+ border-bottom: 1px solid var(--border);
2275
+ }
2276
+ .usage-table td {
2277
+ padding: 8px;
2278
+ border-bottom: 1px solid var(--border);
2279
+ color: var(--text-dim);
2280
+ font-variant-numeric: tabular-nums;
2281
+ }
2282
+ .usage-table tbody tr:last-child td {
2283
+ border-bottom: none;
2284
+ }
2285
+ .usage-table-key {
2286
+ color: var(--text);
2287
+ font-weight: 500;
2288
+ word-break: break-all;
2289
+ }
2290
+ .usage-table-cost {
2291
+ position: relative;
2292
+ min-width: 110px;
2293
+ }
2294
+ .usage-table-cost-value {
2295
+ position: relative;
2296
+ z-index: 1;
2297
+ }
2298
+ .usage-table-cost-bar {
2299
+ position: absolute;
2300
+ left: 8px;
2301
+ right: 8px;
2302
+ bottom: 4px;
2303
+ height: 3px;
2304
+ border-radius: 2px;
2305
+ background: linear-gradient(90deg, var(--brand) 0%, var(--brand-2) 100%);
2306
+ opacity: 0.55;
2307
+ }
2308
+ .usage-empty {
2309
+ color: var(--text-faint);
2310
+ padding: 6px 0;
2311
+ font-size: 12.5px;
2312
+ }