@homescriptone/opencode-viewer-extender 0.0.0-stage → 1.2.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.
@@ -0,0 +1,1174 @@
1
+
2
+ :root {
3
+ --bg: #fbfaf7;
4
+ --surface: #ffffff;
5
+ --surface-2: #f5f4f0;
6
+ --surface-3: #eeede8;
7
+ --ink: #1a1a19;
8
+ --ink-2: #2f2f2d;
9
+ --muted: #6b6a65;
10
+ --muted-2: #8f8e89;
11
+ --hair: #e8e6df;
12
+ --hair-2: #d9d7ce;
13
+
14
+ /* Light warm sidebar tokens for projects panel */
15
+ --side-bg: #f7f5ee;
16
+ --side-bg-2: #efece3;
17
+ --side-ink: #1a1a19;
18
+ --side-ink-muted: #6b6a65;
19
+ --side-ink-faint: #a8a69d;
20
+ --side-hair: #e1ddce;
21
+
22
+ /* Accent - Koomi teal */
23
+ --accent: oklch(0.62 0.11 185);
24
+ --accent-ink: oklch(0.38 0.08 185);
25
+ --accent-wash: oklch(0.96 0.03 185);
26
+ --accent-hair: oklch(0.88 0.05 185);
27
+
28
+ --error: #dc2626;
29
+
30
+ --radius-sm: 6px;
31
+ --radius: 8px;
32
+ --radius-lg: 12px;
33
+ --radius-xl: 16px;
34
+
35
+ --shadow-sm: 0 1px 0 rgba(20,20,20,0.03), 0 1px 2px rgba(20,20,20,0.04);
36
+ --shadow: 0 1px 0 rgba(20,20,20,0.03), 0 4px 12px -4px rgba(20,20,20,0.08);
37
+
38
+ --font-sans: 'Geist', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
39
+ --font-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace;
40
+ }
41
+
42
+ * {
43
+ box-sizing: border-box;
44
+ }
45
+
46
+ *::-webkit-scrollbar { width: 8px; height: 8px; }
47
+ *::-webkit-scrollbar-track { background: transparent; }
48
+ *::-webkit-scrollbar-thumb { background: transparent; border-radius: 4px; }
49
+ *:hover::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.12); }
50
+ *:hover::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.2); }
51
+
52
+ html,
53
+ body {
54
+ height: 100%;
55
+ margin: 0;
56
+ background: var(--bg);
57
+ color: var(--ink);
58
+ font-family: var(--font-sans);
59
+ -webkit-font-smoothing: antialiased;
60
+ -moz-osx-font-smoothing: grayscale;
61
+ font-feature-settings: "ss01", "cv11";
62
+ }
63
+
64
+ #app {
65
+ height: 100vh;
66
+ display: grid;
67
+ grid-template-columns: 280px 360px minmax(0, 1fr);
68
+ background: var(--bg);
69
+ }
70
+
71
+ .panel {
72
+ min-height: 0;
73
+ display: flex;
74
+ flex-direction: column;
75
+ background: var(--surface);
76
+ border-right: 1px solid var(--hair);
77
+ }
78
+
79
+ #projects-panel {
80
+ background: var(--side-bg);
81
+ color: var(--side-ink);
82
+ border-right: 1px solid var(--side-hair);
83
+ }
84
+
85
+ #sessions-panel,
86
+ #messages-panel {
87
+ background: var(--surface);
88
+ }
89
+
90
+ .panel:last-child {
91
+ border-right: none;
92
+ }
93
+
94
+ .panel-header {
95
+ padding: 14px 16px 12px;
96
+ border-bottom: 1px solid var(--hair);
97
+ background: var(--surface);
98
+ box-shadow: 0 1px 0 rgba(20, 20, 20, 0.03);
99
+ display: flex;
100
+ align-items: flex-start;
101
+ justify-content: space-between;
102
+ gap: 8px;
103
+ }
104
+
105
+ #projects-panel .panel-header {
106
+ background: var(--side-bg);
107
+ border-bottom: 1px solid var(--side-hair);
108
+ }
109
+
110
+ .panel-title {
111
+ font-size: 13.5px;
112
+ font-weight: 600;
113
+ letter-spacing: -0.01em;
114
+ margin: 0;
115
+ color: var(--ink);
116
+ line-height: 1.3;
117
+ }
118
+
119
+ #projects-panel .panel-title {
120
+ color: var(--side-ink);
121
+ }
122
+
123
+ .panel-subtitle {
124
+ font-size: 11px;
125
+ color: var(--muted);
126
+ margin-top: 2px;
127
+ font-family: var(--font-mono);
128
+ letter-spacing: 0.02em;
129
+ }
130
+
131
+ #projects-panel .panel-subtitle {
132
+ color: var(--side-ink-muted);
133
+ }
134
+
135
+ .panel-body {
136
+ flex: 1;
137
+ overflow: auto;
138
+ padding: 8px 10px;
139
+ min-height: 0;
140
+ }
141
+
142
+ .state {
143
+ color: var(--muted);
144
+ font-size: 13px;
145
+ padding: 14px 8px;
146
+ }
147
+
148
+ #projects-panel .state {
149
+ color: var(--side-ink-muted);
150
+ }
151
+
152
+ .state.error {
153
+ color: var(--error);
154
+ }
155
+
156
+ .project-row {
157
+ width: 100%;
158
+ background: transparent;
159
+ border: 1px solid transparent;
160
+ border-radius: var(--radius-sm);
161
+ color: var(--side-ink-muted);
162
+ margin-bottom: 2px;
163
+ text-align: left;
164
+ cursor: pointer;
165
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
166
+ padding: 8px 10px;
167
+ }
168
+
169
+ .project-row:hover {
170
+ color: var(--side-ink);
171
+ background: var(--side-bg-2);
172
+ }
173
+
174
+ .project-row.selected {
175
+ position: relative;
176
+ color: var(--accent);
177
+ background: color-mix(in oklab, var(--accent) 10%, transparent);
178
+ border-color: transparent;
179
+ }
180
+
181
+ .project-row.selected::before {
182
+ content: "";
183
+ position: absolute;
184
+ left: 0;
185
+ top: 50%;
186
+ transform: translateY(-50%);
187
+ width: 3px;
188
+ height: 14px;
189
+ border-radius: 2px;
190
+ background: var(--accent);
191
+ }
192
+
193
+ .project-top {
194
+ display: flex;
195
+ align-items: center;
196
+ gap: 8px;
197
+ }
198
+
199
+ .dot {
200
+ width: 5px;
201
+ height: 5px;
202
+ border-radius: 999px;
203
+ flex: 0 0 auto;
204
+ background: var(--side-ink-faint);
205
+ }
206
+
207
+ .project-name {
208
+ font-size: 13px;
209
+ font-weight: 600;
210
+ color: inherit;
211
+ min-width: 0;
212
+ overflow: hidden;
213
+ text-overflow: ellipsis;
214
+ white-space: nowrap;
215
+ flex: 1;
216
+ }
217
+
218
+ .project-time {
219
+ font-size: 10.5px;
220
+ color: var(--side-ink-faint);
221
+ font-family: var(--font-mono);
222
+ flex: 0 0 auto;
223
+ }
224
+
225
+ .project-path {
226
+ margin-top: 6px;
227
+ font-size: 10.5px;
228
+ color: var(--side-ink-faint);
229
+ font-family: var(--font-mono);
230
+ overflow: hidden;
231
+ text-overflow: ellipsis;
232
+ white-space: nowrap;
233
+ }
234
+
235
+ .session-card {
236
+ width: 100%;
237
+ background: var(--surface);
238
+ border: 1px solid var(--hair);
239
+ border-radius: var(--radius);
240
+ box-shadow: none;
241
+ color: var(--ink);
242
+ margin-bottom: 8px;
243
+ text-align: left;
244
+ cursor: pointer;
245
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
246
+ padding: 12px 14px;
247
+ }
248
+
249
+ .session-card:hover {
250
+ border-color: var(--hair-2);
251
+ background: var(--surface-2);
252
+ }
253
+
254
+ .session-card.selected {
255
+ border-color: color-mix(in oklab, var(--accent) 45%, var(--hair));
256
+ background: var(--accent-wash);
257
+ box-shadow: none;
258
+ }
259
+
260
+ .session-title {
261
+ margin: 0 0 8px;
262
+ font-size: 13px;
263
+ font-weight: 600;
264
+ letter-spacing: -0.01em;
265
+ line-height: 1.35;
266
+ color: var(--ink);
267
+ display: -webkit-box;
268
+ -webkit-line-clamp: 2;
269
+ -webkit-box-orient: vertical;
270
+ overflow: hidden;
271
+ }
272
+
273
+ .session-project-context {
274
+ margin: -2px 0 8px;
275
+ font-size: 10.5px;
276
+ color: var(--muted);
277
+ font-family: var(--font-mono);
278
+ overflow: hidden;
279
+ text-overflow: ellipsis;
280
+ white-space: nowrap;
281
+ }
282
+
283
+ .session-meta {
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: space-between;
287
+ gap: 8px;
288
+ font-size: 11px;
289
+ color: var(--muted);
290
+ font-family: var(--font-mono);
291
+ }
292
+
293
+ .badge {
294
+ border: 1px solid var(--accent-hair);
295
+ color: var(--accent-ink);
296
+ background: var(--accent-wash);
297
+ border-radius: 999px;
298
+ padding: 2px 7px;
299
+ font-size: 10.5px;
300
+ font-weight: 500;
301
+ font-family: var(--font-mono);
302
+ text-transform: lowercase;
303
+ }
304
+
305
+ .sessions-toolbar {
306
+ display: flex;
307
+ gap: 6px;
308
+ padding: 8px 12px 10px;
309
+ border-bottom: 1px solid var(--hair);
310
+ background: var(--surface);
311
+ flex-wrap: wrap;
312
+ }
313
+
314
+ #projects-panel .sessions-toolbar {
315
+ background: var(--side-bg);
316
+ border-bottom: 1px solid var(--side-hair);
317
+ }
318
+
319
+ .sessions-search {
320
+ flex: 1 1 160px;
321
+ min-width: 0;
322
+ background: var(--surface-2);
323
+ border: 1px solid var(--hair);
324
+ border-radius: var(--radius-sm);
325
+ padding: 6px 9px;
326
+ font-size: 12.5px;
327
+ font-family: var(--font-sans);
328
+ color: var(--ink);
329
+ outline: none;
330
+ transition: border-color 0.15s ease, background 0.15s ease;
331
+ }
332
+
333
+ .sessions-search:focus {
334
+ border-color: var(--accent-hair);
335
+ background: #fff;
336
+ }
337
+
338
+ .sessions-scope {
339
+ flex: 0 0 auto;
340
+ background: var(--surface-2);
341
+ border: 1px solid var(--hair);
342
+ border-radius: var(--radius-sm);
343
+ padding: 6px 8px;
344
+ font-size: 12px;
345
+ font-family: var(--font-sans);
346
+ color: var(--ink);
347
+ cursor: pointer;
348
+ }
349
+
350
+ .sessions-scope:focus {
351
+ outline: none;
352
+ border-color: var(--accent-hair);
353
+ }
354
+
355
+ .load-more-wrap {
356
+ display: flex;
357
+ justify-content: center;
358
+ padding: 6px 0 2px;
359
+ }
360
+
361
+ .load-more-btn,
362
+ .mini-btn {
363
+ background: var(--surface);
364
+ color: var(--ink);
365
+ border: 1px solid var(--hair);
366
+ border-radius: var(--radius-sm);
367
+ padding: 7px 11px;
368
+ font-size: 12px;
369
+ font-weight: 500;
370
+ cursor: pointer;
371
+ transition: border-color 0.15s ease, background 0.15s ease;
372
+ }
373
+
374
+ .load-more-btn:hover,
375
+ .mini-btn:hover {
376
+ border-color: var(--hair-2);
377
+ background: #fff;
378
+ }
379
+
380
+ .load-more-btn:disabled,
381
+ .mini-btn:disabled {
382
+ opacity: 0.6;
383
+ cursor: not-allowed;
384
+ }
385
+
386
+ .messages {
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: 12px;
390
+ min-height: 100%;
391
+ }
392
+
393
+ .message {
394
+ align-self: stretch;
395
+ background: var(--surface);
396
+ border: 1px solid var(--hair);
397
+ border-radius: var(--radius);
398
+ box-shadow: none;
399
+ padding: 12px 14px;
400
+ scroll-margin-top: 12px;
401
+ }
402
+
403
+ .message.role-user {
404
+ background: color-mix(in oklab, var(--accent) 6%, var(--surface));
405
+ border-color: color-mix(in oklab, var(--accent) 20%, var(--hair));
406
+ }
407
+
408
+ .message.role-assistant {
409
+ background: var(--surface);
410
+ border-color: var(--hair);
411
+ }
412
+
413
+ .message-meta {
414
+ display: flex;
415
+ flex-wrap: wrap;
416
+ gap: 7px;
417
+ margin-bottom: 8px;
418
+ font-size: 11px;
419
+ color: var(--muted);
420
+ font-family: var(--font-mono);
421
+ }
422
+
423
+ .message-meta .pill {
424
+ border: 1px solid var(--hair);
425
+ border-radius: 999px;
426
+ padding: 2px 8px;
427
+ background: var(--surface-2);
428
+ font-size: 10.5px;
429
+ }
430
+
431
+ .part {
432
+ margin-bottom: 8px;
433
+ font-size: 13.5px;
434
+ line-height: 1.6;
435
+ color: var(--ink-2);
436
+ }
437
+
438
+ .part:last-child {
439
+ margin-bottom: 0;
440
+ }
441
+
442
+ .part pre,
443
+ .part code {
444
+ font-family: var(--font-mono);
445
+ }
446
+
447
+ .part pre {
448
+ white-space: pre-wrap;
449
+ word-break: break-word;
450
+ background: var(--surface-2);
451
+ border: 1px solid var(--hair);
452
+ border-radius: var(--radius);
453
+ padding: 9px;
454
+ margin: 8px 0 0;
455
+ color: var(--ink-2);
456
+ font-size: 12px;
457
+ overflow: auto;
458
+ max-height: 420px;
459
+ }
460
+
461
+ .part code {
462
+ background: var(--surface-2);
463
+ border: 1px solid var(--hair);
464
+ border-radius: 4px;
465
+ padding: 1px 4px;
466
+ font-size: 12.5px;
467
+ }
468
+
469
+ /* Markdown table */
470
+ .md-table-wrap {
471
+ overflow-x: auto;
472
+ margin: 10px 0;
473
+ border: 1px solid var(--hair);
474
+ border-radius: var(--radius);
475
+ }
476
+
477
+ .md-table {
478
+ border-collapse: collapse;
479
+ width: 100%;
480
+ font-size: 13px;
481
+ line-height: 1.5;
482
+ font-variant-numeric: tabular-nums;
483
+ }
484
+
485
+ .md-table th,
486
+ .md-table td {
487
+ padding: 7px 12px;
488
+ border-bottom: 1px solid var(--hair);
489
+ text-align: left;
490
+ }
491
+
492
+ .md-table th {
493
+ background: var(--surface-2);
494
+ font-weight: 600;
495
+ font-size: 11.5px;
496
+ color: var(--muted);
497
+ text-transform: uppercase;
498
+ letter-spacing: 0.04em;
499
+ }
500
+
501
+ .md-table td {
502
+ color: var(--ink-2);
503
+ }
504
+
505
+ .md-table th + th,
506
+ .md-table td + td {
507
+ border-left: 1px solid var(--hair);
508
+ }
509
+
510
+ .md-table tbody tr:nth-child(even) {
511
+ background: var(--surface-2);
512
+ }
513
+
514
+ .md-table tbody tr:last-child td {
515
+ border-bottom: none;
516
+ }
517
+
518
+ .md-table tbody tr:hover td {
519
+ background: color-mix(in oklab, var(--accent) 6%, var(--surface));
520
+ }
521
+
522
+ /* Markdown headers */
523
+ .md-h {
524
+ margin: 14px 0 4px;
525
+ line-height: 1.3;
526
+ letter-spacing: -0.01em;
527
+ color: var(--ink);
528
+ }
529
+
530
+ .md-h:first-child { margin-top: 0; }
531
+
532
+ h1.md-h { font-size: 20px; }
533
+ h2.md-h { font-size: 17px; }
534
+ h3.md-h { font-size: 15px; }
535
+ h4.md-h, h5.md-h, h6.md-h { font-size: 13.5px; }
536
+
537
+ /* Markdown horizontal rule */
538
+ .md-hr {
539
+ border: none;
540
+ border-top: 1px solid var(--hair);
541
+ margin: 12px 0;
542
+ }
543
+
544
+ /* Markdown lists */
545
+ .md-list {
546
+ margin: 6px 0;
547
+ padding-left: 22px;
548
+ }
549
+
550
+ .md-list li {
551
+ margin-bottom: 2px;
552
+ }
553
+
554
+ /* Markdown links */
555
+ .part a {
556
+ color: var(--accent-ink);
557
+ text-decoration: underline;
558
+ text-decoration-color: var(--accent-hair);
559
+ text-underline-offset: 2px;
560
+ }
561
+
562
+ .part a:hover {
563
+ text-decoration-color: var(--accent-ink);
564
+ }
565
+
566
+ /* Markdown blockquote */
567
+ .md-blockquote {
568
+ margin: 8px 0;
569
+ padding: 6px 12px;
570
+ border-left: 3px solid var(--accent-hair);
571
+ color: var(--muted);
572
+ background: var(--surface-2);
573
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
574
+ }
575
+
576
+ details {
577
+ border: 1px solid var(--hair);
578
+ border-radius: var(--radius);
579
+ background: var(--surface-2);
580
+ padding: 6px 8px;
581
+ }
582
+
583
+ summary {
584
+ cursor: pointer;
585
+ color: var(--muted);
586
+ font-size: 12px;
587
+ user-select: none;
588
+ }
589
+
590
+ .summary-reasoning {
591
+ font-style: italic;
592
+ color: var(--muted-2);
593
+ }
594
+
595
+ .summary-tool {
596
+ color: var(--accent-ink);
597
+ }
598
+
599
+ .part-patch {
600
+ border: 1px solid var(--hair);
601
+ border-radius: var(--radius);
602
+ background: var(--surface-2);
603
+ padding: 8px 10px;
604
+ font-size: 12px;
605
+ }
606
+
607
+ .part-patch-files {
608
+ margin-top: 4px;
609
+ color: var(--muted);
610
+ font-family: var(--font-mono);
611
+ font-size: 11px;
612
+ }
613
+
614
+ .part-file {
615
+ border: 1px solid var(--hair);
616
+ border-radius: var(--radius);
617
+ background: var(--surface-2);
618
+ padding: 8px 10px;
619
+ font-size: 12px;
620
+ display: flex;
621
+ align-items: center;
622
+ gap: 6px;
623
+ }
624
+
625
+ .part-image {
626
+ max-width: 100%;
627
+ max-height: 500px;
628
+ border-radius: var(--radius);
629
+ border: 1px solid var(--hair);
630
+ margin-top: 8px;
631
+ display: block;
632
+ cursor: pointer;
633
+ }
634
+
635
+ .part-image:hover {
636
+ border-color: var(--accent-hair);
637
+ }
638
+
639
+ .part-file-wrap {
640
+ margin-bottom: 8px;
641
+ }
642
+
643
+ .part-agent {
644
+ display: inline-block;
645
+ border: 1px solid var(--accent-hair);
646
+ background: var(--accent-wash);
647
+ color: var(--accent-ink);
648
+ border-radius: 999px;
649
+ padding: 3px 10px;
650
+ font-size: 12px;
651
+ }
652
+
653
+ .part-step-finish {
654
+ font-size: 11px;
655
+ color: var(--muted);
656
+ padding: 4px 0;
657
+ border-top: 1px solid var(--hair);
658
+ display: flex;
659
+ gap: 8px;
660
+ flex-wrap: wrap;
661
+ }
662
+
663
+ .part-compaction {
664
+ text-align: center;
665
+ color: var(--muted);
666
+ font-size: 11px;
667
+ padding: 8px 0;
668
+ letter-spacing: 0.5px;
669
+ }
670
+
671
+ .part-retry {
672
+ color: var(--muted);
673
+ font-size: 11px;
674
+ padding: 2px 0;
675
+ }
676
+
677
+ .tool-status {
678
+ display: inline-block;
679
+ font-size: 10px;
680
+ border-radius: 999px;
681
+ padding: 1px 6px;
682
+ margin-left: 6px;
683
+ }
684
+
685
+ .tool-status.completed { background: var(--accent-wash); color: var(--accent-ink); border: 1px solid var(--accent-hair); }
686
+ .tool-status.error { background: #fef2f2; color: #b42318; border: 1px solid #fecaca; }
687
+ .tool-status.pending { background: #fff7ed; color: #b45309; border: 1px solid #fed7aa; }
688
+
689
+ .subagent-card {
690
+ display: flex;
691
+ align-items: center;
692
+ gap: 12px;
693
+ padding: 12px 14px;
694
+ margin: 4px 0;
695
+ background: var(--accent-wash);
696
+ border: 1px solid var(--accent-hair);
697
+ border-radius: var(--radius-lg);
698
+ cursor: pointer;
699
+ transition: border-color 0.15s ease, background 0.15s ease;
700
+ }
701
+
702
+ .subagent-card:hover {
703
+ border-color: color-mix(in oklab, var(--accent) 45%, var(--accent-hair));
704
+ background: color-mix(in oklab, var(--accent) 14%, var(--surface));
705
+ }
706
+
707
+ .subagent-card-icon {
708
+ font-size: 20px;
709
+ flex: 0 0 auto;
710
+ }
711
+
712
+ .subagent-card-content {
713
+ flex: 1;
714
+ min-width: 0;
715
+ }
716
+
717
+ .subagent-card-title {
718
+ font-size: 13px;
719
+ font-weight: 600;
720
+ color: var(--ink);
721
+ white-space: nowrap;
722
+ overflow: hidden;
723
+ text-overflow: ellipsis;
724
+ }
725
+
726
+ .subagent-card-time {
727
+ font-size: 11px;
728
+ color: var(--muted);
729
+ font-family: var(--font-mono);
730
+ margin-top: 2px;
731
+ }
732
+
733
+ .subagent-card-arrow {
734
+ color: var(--accent-ink);
735
+ font-size: 16px;
736
+ flex: 0 0 auto;
737
+ }
738
+
739
+ .back-btn {
740
+ background: none;
741
+ border: 1px solid var(--hair);
742
+ border-radius: var(--radius-sm);
743
+ color: var(--accent-ink);
744
+ padding: 4px 10px;
745
+ font-size: 12px;
746
+ cursor: pointer;
747
+ transition: border-color 0.15s ease, background 0.15s ease;
748
+ flex: 0 0 auto;
749
+ }
750
+
751
+ .back-btn:hover {
752
+ border-color: var(--hair-2);
753
+ background: var(--surface);
754
+ }
755
+
756
+ .meta-line {
757
+ font-size: 12px;
758
+ color: var(--muted);
759
+ }
760
+
761
+ .tiny-muted {
762
+ color: var(--muted);
763
+ font-size: 11px;
764
+ }
765
+
766
+ .messages-shell {
767
+ flex: 1;
768
+ min-height: 0;
769
+ display: flex;
770
+ background: var(--surface);
771
+ }
772
+
773
+ #messages-panel .messages-shell > .panel-body {
774
+ flex: 1;
775
+ min-width: 0;
776
+ }
777
+
778
+ .message-outline {
779
+ width: 250px;
780
+ flex: 0 0 250px;
781
+ min-height: 0;
782
+ display: flex;
783
+ flex-direction: column;
784
+ border-left: 1px solid var(--hair);
785
+ background: var(--surface-2);
786
+ transition: width 0.15s ease, flex-basis 0.15s ease;
787
+ }
788
+
789
+ .message-outline.collapsed {
790
+ width: 42px;
791
+ flex-basis: 42px;
792
+ }
793
+
794
+ .message-outline-header {
795
+ padding: 10px 10px 8px;
796
+ border-bottom: 1px solid var(--hair);
797
+ display: flex;
798
+ align-items: center;
799
+ justify-content: space-between;
800
+ gap: 8px;
801
+ }
802
+
803
+ .message-outline-title {
804
+ font-size: 11px;
805
+ font-weight: 600;
806
+ color: var(--muted);
807
+ text-transform: uppercase;
808
+ letter-spacing: 0.04em;
809
+ white-space: nowrap;
810
+ overflow: hidden;
811
+ text-overflow: ellipsis;
812
+ }
813
+
814
+ .message-outline-toggle {
815
+ background: var(--surface);
816
+ border: 1px solid var(--hair);
817
+ border-radius: var(--radius-sm);
818
+ color: var(--muted);
819
+ cursor: pointer;
820
+ font-size: 12px;
821
+ height: 24px;
822
+ min-width: 24px;
823
+ padding: 0 7px;
824
+ }
825
+
826
+ .message-outline-toggle:hover {
827
+ border-color: var(--hair-2);
828
+ color: var(--ink);
829
+ }
830
+
831
+ .message-outline-list {
832
+ flex: 1;
833
+ min-height: 0;
834
+ overflow: auto;
835
+ padding: 8px;
836
+ }
837
+
838
+ .message-outline-item {
839
+ width: 100%;
840
+ background: transparent;
841
+ border: 1px solid transparent;
842
+ border-radius: var(--radius-sm);
843
+ color: var(--ink-2);
844
+ cursor: pointer;
845
+ display: block;
846
+ margin-bottom: 4px;
847
+ padding: 8px;
848
+ text-align: left;
849
+ }
850
+
851
+ .message-outline-item:hover {
852
+ background: var(--surface);
853
+ border-color: var(--hair);
854
+ }
855
+
856
+ .message-outline-item-title {
857
+ font-size: 12px;
858
+ font-weight: 500;
859
+ line-height: 1.35;
860
+ display: -webkit-box;
861
+ -webkit-line-clamp: 2;
862
+ -webkit-box-orient: vertical;
863
+ overflow: hidden;
864
+ }
865
+
866
+ .message-outline-item-time {
867
+ color: var(--muted);
868
+ font-family: var(--font-mono);
869
+ font-size: 10px;
870
+ margin-top: 4px;
871
+ }
872
+
873
+ .message-outline-empty {
874
+ color: var(--muted);
875
+ font-size: 12px;
876
+ padding: 10px 2px;
877
+ }
878
+
879
+ .message-outline.collapsed .message-outline-title,
880
+ .message-outline.collapsed .message-outline-list {
881
+ display: none;
882
+ }
883
+
884
+ .message-outline.collapsed .message-outline-header {
885
+ justify-content: center;
886
+ padding-left: 8px;
887
+ padding-right: 8px;
888
+ }
889
+
890
+ @media (max-width: 1024px) {
891
+ #app {
892
+ grid-template-columns: 1fr;
893
+ grid-template-rows: minmax(170px, 32vh) minmax(170px, 32vh) minmax(260px, 1fr);
894
+ }
895
+
896
+ .panel {
897
+ border-right: none;
898
+ border-bottom: 1px solid var(--hair);
899
+ }
900
+
901
+ #projects-panel {
902
+ border-bottom: 1px solid var(--side-hair);
903
+ }
904
+
905
+ .panel:last-child {
906
+ border-bottom: none;
907
+ }
908
+
909
+ .messages-shell {
910
+ flex-direction: column;
911
+ }
912
+
913
+ .message-outline {
914
+ width: auto;
915
+ flex: 0 0 120px;
916
+ border-left: none;
917
+ border-top: 1px solid var(--hair);
918
+ }
919
+
920
+ .message-outline.collapsed {
921
+ width: auto;
922
+ flex-basis: 40px;
923
+ }
924
+ }
925
+
926
+ .header-actions {
927
+ display: flex;
928
+ align-items: center;
929
+ gap: 6px;
930
+ flex: 0 0 auto;
931
+ }
932
+
933
+ .header-btn {
934
+ background: none;
935
+ border: 1px solid var(--hair);
936
+ border-radius: var(--radius-sm);
937
+ color: var(--accent-ink);
938
+ padding: 4px 10px;
939
+ font-size: 12px;
940
+ cursor: pointer;
941
+ transition: border-color 0.15s ease, background 0.15s ease;
942
+ flex: 0 0 auto;
943
+ white-space: nowrap;
944
+ }
945
+
946
+ .header-btn:hover {
947
+ border-color: var(--hair-2);
948
+ background: var(--surface);
949
+ }
950
+
951
+ .export-menu-wrap {
952
+ position: relative;
953
+ flex: 0 0 auto;
954
+ }
955
+
956
+ .export-menu {
957
+ position: absolute;
958
+ top: calc(100% + 4px);
959
+ right: 0;
960
+ z-index: 50;
961
+ min-width: 180px;
962
+ padding: 4px;
963
+ background: var(--surface);
964
+ border: 1px solid var(--hair);
965
+ border-radius: var(--radius-sm);
966
+ box-shadow: 0 8px 24px rgba(20, 20, 20, 0.12);
967
+ display: flex;
968
+ flex-direction: column;
969
+ }
970
+
971
+ .export-menu-item {
972
+ text-align: left;
973
+ background: none;
974
+ border: none;
975
+ border-radius: calc(var(--radius-sm) - 2px);
976
+ color: var(--ink);
977
+ padding: 7px 10px;
978
+ font-size: 12.5px;
979
+ cursor: pointer;
980
+ }
981
+
982
+ .export-menu-item:hover {
983
+ background: var(--accent-wash);
984
+ color: var(--accent-ink);
985
+ }
986
+
987
+ .part-snapshot {
988
+ font-family: var(--font-mono);
989
+ font-size: 12px;
990
+ }
991
+
992
+ .header-btn.active {
993
+ border-color: var(--accent-hair);
994
+ background: var(--accent-wash);
995
+ color: var(--accent-ink);
996
+ }
997
+
998
+ .project-row.selectable,
999
+ .session-card.selectable {
1000
+ display: flex;
1001
+ align-items: flex-start;
1002
+ gap: 10px;
1003
+ cursor: pointer;
1004
+ }
1005
+
1006
+ .project-row.selectable .project-row-body,
1007
+ .session-card.selectable .session-card-body {
1008
+ flex: 1;
1009
+ min-width: 0;
1010
+ }
1011
+
1012
+ .checkbox {
1013
+ flex: 0 0 auto;
1014
+ width: 15px;
1015
+ height: 15px;
1016
+ margin-top: 2px;
1017
+ border: 1px solid var(--hair-2);
1018
+ border-radius: 4px;
1019
+ background: var(--surface);
1020
+ position: relative;
1021
+ transition: background 0.12s ease, border-color 0.12s ease;
1022
+ }
1023
+
1024
+ .checkbox.checked {
1025
+ background: var(--accent);
1026
+ border-color: var(--accent);
1027
+ }
1028
+
1029
+ .checkbox.checked::after {
1030
+ content: "";
1031
+ position: absolute;
1032
+ left: 4px;
1033
+ top: 1px;
1034
+ width: 4px;
1035
+ height: 8px;
1036
+ border: solid #fff;
1037
+ border-width: 0 2px 2px 0;
1038
+ transform: rotate(45deg);
1039
+ }
1040
+
1041
+ .project-row.selectable.checked,
1042
+ .session-card.selectable.checked {
1043
+ border-color: var(--accent-hair);
1044
+ background: var(--accent-wash);
1045
+ }
1046
+
1047
+ .bulk-bar {
1048
+ position: fixed;
1049
+ left: 50%;
1050
+ bottom: 20px;
1051
+ transform: translateX(-50%);
1052
+ z-index: 400;
1053
+ display: flex;
1054
+ align-items: center;
1055
+ gap: 8px;
1056
+ padding: 8px 12px;
1057
+ background: var(--surface);
1058
+ border: 1px solid var(--hair-2);
1059
+ border-radius: 12px;
1060
+ box-shadow: 0 10px 30px rgba(20, 20, 20, 0.16);
1061
+ }
1062
+
1063
+ .bulk-count {
1064
+ font-size: 12.5px;
1065
+ font-weight: 600;
1066
+ color: var(--ink);
1067
+ padding-right: 4px;
1068
+ }
1069
+
1070
+ .bulk-btn {
1071
+ background: none;
1072
+ border: 1px solid var(--hair);
1073
+ border-radius: var(--radius-sm);
1074
+ color: var(--accent-ink);
1075
+ padding: 5px 12px;
1076
+ font-size: 12.5px;
1077
+ cursor: pointer;
1078
+ transition: border-color 0.15s ease, background 0.15s ease;
1079
+ }
1080
+
1081
+ .bulk-btn:hover {
1082
+ border-color: var(--hair-2);
1083
+ background: var(--accent-wash);
1084
+ }
1085
+
1086
+ .bulk-btn.danger {
1087
+ color: #b23b3b;
1088
+ border-color: #e4bcbc;
1089
+ }
1090
+
1091
+ .bulk-btn.danger:hover {
1092
+ background: #fbeaea;
1093
+ border-color: #d99a9a;
1094
+ }
1095
+
1096
+ .bulk-btn.ghost {
1097
+ color: var(--muted);
1098
+ }
1099
+
1100
+ .modal-overlay {
1101
+ position: fixed;
1102
+ inset: 0;
1103
+ z-index: 500;
1104
+ display: flex;
1105
+ align-items: center;
1106
+ justify-content: center;
1107
+ background: rgba(20, 20, 20, 0.32);
1108
+ padding: 20px;
1109
+ }
1110
+
1111
+ .modal {
1112
+ width: min(460px, 100%);
1113
+ max-height: 80vh;
1114
+ overflow: auto;
1115
+ background: var(--surface);
1116
+ border: 1px solid var(--hair);
1117
+ border-radius: 14px;
1118
+ box-shadow: 0 20px 60px rgba(20, 20, 20, 0.28);
1119
+ }
1120
+
1121
+ .modal-header {
1122
+ display: flex;
1123
+ align-items: center;
1124
+ justify-content: space-between;
1125
+ gap: 12px;
1126
+ padding: 14px 16px;
1127
+ border-bottom: 1px solid var(--hair);
1128
+ }
1129
+
1130
+ .modal-header h3 {
1131
+ margin: 0;
1132
+ font-size: 14px;
1133
+ font-weight: 600;
1134
+ }
1135
+
1136
+ .modal-body {
1137
+ padding: 8px 10px 12px;
1138
+ }
1139
+
1140
+ .plugin-row {
1141
+ display: flex;
1142
+ align-items: flex-start;
1143
+ gap: 10px;
1144
+ padding: 10px 8px;
1145
+ border-radius: 8px;
1146
+ cursor: pointer;
1147
+ }
1148
+
1149
+ .plugin-row:hover {
1150
+ background: var(--accent-wash);
1151
+ }
1152
+
1153
+ .plugin-row input {
1154
+ margin-top: 2px;
1155
+ accent-color: var(--accent);
1156
+ }
1157
+
1158
+ .plugin-info {
1159
+ display: flex;
1160
+ flex-direction: column;
1161
+ gap: 2px;
1162
+ min-width: 0;
1163
+ }
1164
+
1165
+ .plugin-name {
1166
+ font-size: 13px;
1167
+ font-weight: 600;
1168
+ color: var(--ink);
1169
+ }
1170
+
1171
+ .plugin-desc {
1172
+ font-size: 12px;
1173
+ color: var(--muted);
1174
+ }