eminiar 0.0.0-stage → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1624 @@
1
+ /* eminiar dashboard — grey/blue palette, light by default, dark via system or toggle */
2
+ :root {
3
+ --bg: #f5f6f8;
4
+ --fg: #1b1f24;
5
+ --muted: #6b7280;
6
+ --card: #fff;
7
+ --line: #e5e7eb;
8
+ --accent: #2563eb;
9
+ --accent-soft: #dbeafe;
10
+ --ok: #16a34a;
11
+ --bad: #dc2626;
12
+ --warn: #d97706;
13
+ --bar: #93c5fd;
14
+ --code: #f1f3f5;
15
+ --hover: #eef1f5;
16
+ --shadow: 0 6px 24px rgba(0, 0, 0, 0.12);
17
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
18
+ /* code tokens */
19
+ --tok-kw: #7c3aed;
20
+ --tok-str: #15803d;
21
+ --tok-num: #b45309;
22
+ --tok-cm: #9ca3af;
23
+ --tok-fn: #2563eb;
24
+ --tok-ty: #0d9488;
25
+ --tok-pn: #6b7280;
26
+ }
27
+ @media (prefers-color-scheme: dark) {
28
+ :root:not([data-theme="light"]) {
29
+ --bg: #0f1115;
30
+ --fg: #e5e7eb;
31
+ --muted: #9ca3af;
32
+ --card: #171a21;
33
+ --line: #262a33;
34
+ --accent: #60a5fa;
35
+ --accent-soft: #1e3a5f;
36
+ --ok: #4ade80;
37
+ --bad: #f87171;
38
+ --warn: #fbbf24;
39
+ --bar: #1d4ed8;
40
+ --code: #0b0d11;
41
+ --hover: #1d212b;
42
+ --shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
43
+ --tok-kw: #c4b5fd;
44
+ --tok-str: #86efac;
45
+ --tok-num: #fcd34d;
46
+ --tok-cm: #6b7280;
47
+ --tok-fn: #93c5fd;
48
+ --tok-ty: #5eead4;
49
+ --tok-pn: #9ca3af;
50
+ }
51
+ }
52
+ :root[data-theme="dark"] {
53
+ --bg: #0f1115;
54
+ --fg: #e5e7eb;
55
+ --muted: #9ca3af;
56
+ --card: #171a21;
57
+ --line: #262a33;
58
+ --accent: #60a5fa;
59
+ --accent-soft: #1e3a5f;
60
+ --ok: #4ade80;
61
+ --bad: #f87171;
62
+ --warn: #fbbf24;
63
+ --bar: #1d4ed8;
64
+ --code: #0b0d11;
65
+ --hover: #1d212b;
66
+ --shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
67
+ --tok-kw: #c4b5fd;
68
+ --tok-str: #86efac;
69
+ --tok-num: #fcd34d;
70
+ --tok-cm: #6b7280;
71
+ --tok-fn: #93c5fd;
72
+ --tok-ty: #5eead4;
73
+ --tok-pn: #9ca3af;
74
+ }
75
+
76
+ * {
77
+ box-sizing: border-box;
78
+ }
79
+ html,
80
+ body {
81
+ height: 100%;
82
+ }
83
+ body {
84
+ margin: 0;
85
+ font:
86
+ 14px / 1.5 system-ui,
87
+ -apple-system,
88
+ "Segoe UI",
89
+ Roboto,
90
+ sans-serif;
91
+ background: var(--bg);
92
+ color: var(--fg);
93
+ }
94
+ #app {
95
+ display: flex;
96
+ flex-direction: column;
97
+ height: 100%;
98
+ }
99
+ a {
100
+ color: var(--accent);
101
+ cursor: pointer;
102
+ text-decoration: none;
103
+ }
104
+ a:hover {
105
+ text-decoration: underline;
106
+ }
107
+ code {
108
+ background: var(--code);
109
+ padding: 1px 4px;
110
+ border-radius: 4px;
111
+ font: 12.5px var(--mono);
112
+ }
113
+ pre {
114
+ margin: 0;
115
+ }
116
+ h1,
117
+ h2,
118
+ h3,
119
+ h4 {
120
+ margin: 0;
121
+ font-weight: 600;
122
+ }
123
+ input,
124
+ select,
125
+ button,
126
+ textarea {
127
+ font: inherit;
128
+ color: inherit;
129
+ background: var(--card);
130
+ border: 1px solid var(--line);
131
+ border-radius: 6px;
132
+ padding: 6px 10px;
133
+ }
134
+ input[type="text"],
135
+ input[type="search"] {
136
+ min-width: 0;
137
+ }
138
+ button {
139
+ cursor: pointer;
140
+ white-space: nowrap;
141
+ }
142
+ button:hover {
143
+ border-color: var(--accent);
144
+ }
145
+ button:disabled {
146
+ opacity: 0.5;
147
+ cursor: default;
148
+ }
149
+ button.primary {
150
+ background: var(--accent);
151
+ color: #fff;
152
+ border-color: var(--accent);
153
+ }
154
+ button.danger {
155
+ color: var(--bad);
156
+ border-color: var(--bad);
157
+ }
158
+ button.sm {
159
+ padding: 3px 8px;
160
+ font-size: 12px;
161
+ }
162
+ button.ghost {
163
+ background: none;
164
+ border-color: transparent;
165
+ color: var(--muted);
166
+ }
167
+ button.ghost:hover,
168
+ button.ghost.on {
169
+ color: var(--fg);
170
+ border-color: var(--line);
171
+ background: var(--card);
172
+ }
173
+ button.chip {
174
+ padding: 2px 9px;
175
+ font-size: 12px;
176
+ border-radius: 999px;
177
+ background: none;
178
+ color: var(--muted);
179
+ }
180
+ button.chip.on {
181
+ color: var(--fg);
182
+ background: var(--accent-soft);
183
+ border-color: var(--accent);
184
+ }
185
+ textarea {
186
+ width: 100%;
187
+ min-height: 300px;
188
+ font: 12.5px / 1.5 var(--mono);
189
+ resize: vertical;
190
+ }
191
+ .muted {
192
+ color: var(--muted);
193
+ }
194
+ .ok {
195
+ color: var(--ok);
196
+ }
197
+ .bad {
198
+ color: var(--bad);
199
+ }
200
+ .warn {
201
+ color: var(--warn);
202
+ }
203
+ .small {
204
+ font-size: 12px;
205
+ }
206
+ .mono {
207
+ font-family: var(--mono);
208
+ font-size: 12.5px;
209
+ }
210
+ .num {
211
+ text-align: right;
212
+ font-variant-numeric: tabular-nums;
213
+ white-space: nowrap;
214
+ }
215
+ .nowrap {
216
+ white-space: nowrap;
217
+ }
218
+ .break {
219
+ word-break: break-all;
220
+ }
221
+ .ellipsis {
222
+ overflow: hidden;
223
+ text-overflow: ellipsis;
224
+ white-space: nowrap;
225
+ }
226
+ .row {
227
+ display: flex;
228
+ gap: 8px;
229
+ align-items: center;
230
+ flex-wrap: wrap;
231
+ }
232
+ .row.tight {
233
+ gap: 4px;
234
+ }
235
+ .grow {
236
+ flex: 1;
237
+ min-width: 0;
238
+ }
239
+ .spacer {
240
+ flex: 1;
241
+ }
242
+ .stack {
243
+ display: flex;
244
+ flex-direction: column;
245
+ gap: 8px;
246
+ }
247
+
248
+ /* --- shell --- */
249
+ header.top {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: 12px;
253
+ padding: 0 16px;
254
+ height: 48px;
255
+ border-bottom: 1px solid var(--line);
256
+ background: var(--card);
257
+ flex: none;
258
+ }
259
+ header.top .brand {
260
+ font-size: 15px;
261
+ letter-spacing: 0.02em;
262
+ font-weight: 600;
263
+ margin-right: 6px;
264
+ }
265
+ header.top .brand span {
266
+ color: var(--accent);
267
+ }
268
+ header.top .brand small {
269
+ color: var(--muted);
270
+ font-weight: 400;
271
+ margin-left: 6px;
272
+ font-size: 11px;
273
+ }
274
+ nav.tabs {
275
+ display: flex;
276
+ gap: 2px;
277
+ }
278
+ nav.tabs button {
279
+ background: none;
280
+ border: 1px solid transparent;
281
+ color: var(--muted);
282
+ padding: 5px 10px;
283
+ border-radius: 6px;
284
+ }
285
+ nav.tabs button.active {
286
+ color: var(--fg);
287
+ border-color: var(--line);
288
+ background: var(--bg);
289
+ }
290
+ nav.tabs button:hover {
291
+ color: var(--fg);
292
+ }
293
+ header.top select.project {
294
+ max-width: 220px;
295
+ flex: 0 1 auto;
296
+ }
297
+ .dot {
298
+ display: inline-block;
299
+ width: 8px;
300
+ height: 8px;
301
+ border-radius: 50%;
302
+ background: var(--muted);
303
+ vertical-align: middle;
304
+ margin-right: 5px;
305
+ }
306
+ .dot.fresh {
307
+ background: var(--ok);
308
+ }
309
+ .dot.stale {
310
+ background: var(--warn);
311
+ }
312
+ .dot.empty {
313
+ background: var(--bad);
314
+ }
315
+ main.work {
316
+ flex: 1;
317
+ min-height: 0;
318
+ overflow: auto;
319
+ }
320
+ main.work.fill {
321
+ overflow: hidden;
322
+ display: flex;
323
+ flex-direction: column;
324
+ }
325
+ .page {
326
+ padding: 18px 20px;
327
+ max-width: 1500px;
328
+ margin: 0 auto;
329
+ }
330
+ footer.status {
331
+ display: flex;
332
+ gap: 16px;
333
+ align-items: center;
334
+ padding: 0 16px;
335
+ height: 26px;
336
+ font-size: 11.5px;
337
+ color: var(--muted);
338
+ border-top: 1px solid var(--line);
339
+ background: var(--card);
340
+ flex: none;
341
+ }
342
+ footer.status b {
343
+ color: var(--fg);
344
+ font-weight: 500;
345
+ }
346
+
347
+ /* --- cards, grids, tables --- */
348
+ .card {
349
+ background: var(--card);
350
+ border: 1px solid var(--line);
351
+ border-radius: 10px;
352
+ padding: 14px;
353
+ min-width: 0;
354
+ }
355
+ .card.flush {
356
+ padding: 0;
357
+ overflow: hidden;
358
+ }
359
+ .card h3 {
360
+ font-size: 12px;
361
+ color: var(--muted);
362
+ text-transform: uppercase;
363
+ letter-spacing: 0.04em;
364
+ display: flex;
365
+ align-items: center;
366
+ gap: 8px;
367
+ margin-bottom: 8px;
368
+ }
369
+ .card h3 .right {
370
+ margin-left: auto;
371
+ text-transform: none;
372
+ letter-spacing: 0;
373
+ font-weight: 400;
374
+ }
375
+ .grid {
376
+ display: grid;
377
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
378
+ gap: 12px;
379
+ margin-bottom: 14px;
380
+ }
381
+ .grid.two {
382
+ grid-template-columns: 1fr 1fr;
383
+ }
384
+ .grid.wide {
385
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
386
+ }
387
+ @media (max-width: 900px) {
388
+ .grid.two,
389
+ .grid.wide {
390
+ grid-template-columns: 1fr !important;
391
+ }
392
+ }
393
+ .big {
394
+ font-size: 26px;
395
+ font-weight: 600;
396
+ line-height: 1.2;
397
+ }
398
+ .sub {
399
+ color: var(--muted);
400
+ font-size: 12px;
401
+ margin-top: 2px;
402
+ }
403
+ table {
404
+ width: 100%;
405
+ border-collapse: collapse;
406
+ }
407
+ th,
408
+ td {
409
+ text-align: left;
410
+ padding: 5px 8px;
411
+ border-bottom: 1px solid var(--line);
412
+ vertical-align: top;
413
+ }
414
+ th {
415
+ color: var(--muted);
416
+ font-weight: 500;
417
+ font-size: 12px;
418
+ white-space: nowrap;
419
+ }
420
+ th.sortable {
421
+ cursor: pointer;
422
+ user-select: none;
423
+ }
424
+ th.sortable:hover {
425
+ color: var(--fg);
426
+ }
427
+ th.sorted {
428
+ color: var(--fg);
429
+ }
430
+ tr.click {
431
+ cursor: pointer;
432
+ }
433
+ tr.click:hover td {
434
+ background: var(--hover);
435
+ }
436
+ tr.sel td {
437
+ background: var(--accent-soft);
438
+ }
439
+ .bar {
440
+ display: inline-block;
441
+ height: 8px;
442
+ background: var(--bar);
443
+ border-radius: 2px;
444
+ vertical-align: middle;
445
+ min-width: 2px;
446
+ }
447
+ .bars {
448
+ display: flex;
449
+ align-items: flex-end;
450
+ gap: 3px;
451
+ height: 70px;
452
+ }
453
+ .bars div {
454
+ flex: 1;
455
+ background: var(--bar);
456
+ border-radius: 2px 2px 0 0;
457
+ min-width: 4px;
458
+ }
459
+ .kv {
460
+ display: grid;
461
+ grid-template-columns: auto 1fr;
462
+ gap: 3px 12px;
463
+ font-size: 12.5px;
464
+ margin: 0;
465
+ }
466
+ .kv dt {
467
+ color: var(--muted);
468
+ }
469
+ .kv dd {
470
+ margin: 0;
471
+ word-break: break-all;
472
+ }
473
+ .empty {
474
+ color: var(--muted);
475
+ padding: 24px;
476
+ text-align: center;
477
+ }
478
+ .tag {
479
+ display: inline-block;
480
+ font-size: 11px;
481
+ padding: 0 7px;
482
+ border: 1px solid var(--line);
483
+ border-radius: 999px;
484
+ color: var(--muted);
485
+ margin-right: 4px;
486
+ white-space: nowrap;
487
+ line-height: 18px;
488
+ }
489
+ .tag.kind {
490
+ border-color: currentColor;
491
+ }
492
+ .tag.s-proposed {
493
+ color: var(--warn);
494
+ border-color: var(--warn);
495
+ }
496
+ .tag.s-superseded,
497
+ .tag.s-deprecated {
498
+ color: var(--muted);
499
+ text-decoration: line-through;
500
+ }
501
+ .tag.s-accepted {
502
+ color: var(--ok);
503
+ border-color: var(--ok);
504
+ }
505
+ .tag.risk-high {
506
+ color: var(--bad);
507
+ border-color: var(--bad);
508
+ }
509
+ .tag.risk-medium {
510
+ color: var(--warn);
511
+ border-color: var(--warn);
512
+ }
513
+ .tag.risk-low {
514
+ color: var(--ok);
515
+ border-color: var(--ok);
516
+ }
517
+ .spin {
518
+ display: inline-block;
519
+ width: 12px;
520
+ height: 12px;
521
+ border: 2px solid var(--line);
522
+ border-top-color: var(--accent);
523
+ border-radius: 50%;
524
+ animation: spin 0.8s linear infinite;
525
+ vertical-align: -2px;
526
+ }
527
+ @keyframes spin {
528
+ to {
529
+ transform: rotate(360deg);
530
+ }
531
+ }
532
+ .toast {
533
+ position: fixed;
534
+ right: 16px;
535
+ bottom: 36px;
536
+ background: var(--fg);
537
+ color: var(--bg);
538
+ padding: 10px 14px;
539
+ border-radius: 8px;
540
+ font-size: 13px;
541
+ box-shadow: var(--shadow);
542
+ z-index: 20;
543
+ max-width: 440px;
544
+ }
545
+ .toast.bad {
546
+ background: var(--bad);
547
+ color: #fff;
548
+ }
549
+ .subtabs {
550
+ display: flex;
551
+ gap: 2px;
552
+ border-bottom: 1px solid var(--line);
553
+ margin-bottom: 14px;
554
+ }
555
+ .subtabs button {
556
+ background: none;
557
+ border: none;
558
+ border-bottom: 2px solid transparent;
559
+ border-radius: 0;
560
+ color: var(--muted);
561
+ padding: 8px 12px;
562
+ }
563
+ .subtabs button.active {
564
+ color: var(--fg);
565
+ border-bottom-color: var(--accent);
566
+ }
567
+ .subtabs button:hover {
568
+ color: var(--fg);
569
+ }
570
+ .list {
571
+ max-height: 72vh;
572
+ overflow: auto;
573
+ }
574
+ .item {
575
+ padding: 8px 10px;
576
+ border-bottom: 1px solid var(--line);
577
+ cursor: pointer;
578
+ border-left: 3px solid transparent;
579
+ }
580
+ .item:hover {
581
+ background: var(--hover);
582
+ }
583
+ .item.sel {
584
+ border-left-color: var(--accent);
585
+ background: var(--accent-soft);
586
+ }
587
+ .list .group-h {
588
+ position: sticky;
589
+ top: 0;
590
+ z-index: 1;
591
+ padding: 6px 10px 4px;
592
+ font-size: 11px;
593
+ font-weight: 700;
594
+ letter-spacing: 0.06em;
595
+ text-transform: uppercase;
596
+ color: var(--muted);
597
+ background: var(--card);
598
+ border-bottom: 1px solid var(--line);
599
+ }
600
+ .list .cat-h {
601
+ display: flex;
602
+ align-items: center;
603
+ gap: 6px;
604
+ padding: 7px 10px;
605
+ font-size: 12px;
606
+ font-weight: 600;
607
+ cursor: pointer;
608
+ user-select: none;
609
+ background: var(--hover);
610
+ border-bottom: 1px solid var(--line);
611
+ }
612
+ .list .cat-h:hover {
613
+ background: var(--accent-soft);
614
+ }
615
+ .list .cat-h .caret {
616
+ width: 10px;
617
+ color: var(--muted);
618
+ }
619
+ .list .cat-h .right {
620
+ margin-left: auto;
621
+ font-weight: 400;
622
+ }
623
+ .row.wrap {
624
+ flex-wrap: wrap;
625
+ }
626
+ .item .n {
627
+ font-weight: 600;
628
+ font-size: 13px;
629
+ word-break: break-all;
630
+ }
631
+ .item .p {
632
+ color: var(--muted);
633
+ font-size: 12px;
634
+ overflow: hidden;
635
+ text-overflow: ellipsis;
636
+ white-space: nowrap;
637
+ }
638
+ .field {
639
+ display: flex;
640
+ flex-direction: column;
641
+ gap: 3px;
642
+ margin-bottom: 10px;
643
+ }
644
+ .field label {
645
+ font-size: 12px;
646
+ color: var(--muted);
647
+ }
648
+ .field input,
649
+ .field select {
650
+ width: 100%;
651
+ }
652
+ pre.log {
653
+ font: 12px / 1.45 var(--mono);
654
+ white-space: pre-wrap;
655
+ word-break: break-word;
656
+ background: var(--code);
657
+ border: 1px solid var(--line);
658
+ border-radius: 8px;
659
+ padding: 10px;
660
+ max-height: 420px;
661
+ overflow: auto;
662
+ }
663
+ pre.json {
664
+ font: 12px var(--mono);
665
+ white-space: pre-wrap;
666
+ word-break: break-word;
667
+ }
668
+ .hit {
669
+ padding: 10px 0;
670
+ border-bottom: 1px solid var(--line);
671
+ }
672
+ .hit .t {
673
+ font-weight: 600;
674
+ }
675
+ .hit pre {
676
+ white-space: pre-wrap;
677
+ margin-top: 6px;
678
+ font-size: 12.5px;
679
+ opacity: 0.9;
680
+ }
681
+ .actions {
682
+ display: grid;
683
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
684
+ gap: 12px;
685
+ margin-bottom: 14px;
686
+ }
687
+ .actions .card p {
688
+ margin: 0 0 10px;
689
+ color: var(--muted);
690
+ font-size: 12.5px;
691
+ }
692
+
693
+ /* --- split panes --- */
694
+ .split {
695
+ display: grid;
696
+ height: 100%;
697
+ min-height: 0;
698
+ }
699
+ .split > .pane {
700
+ min-width: 0;
701
+ min-height: 0;
702
+ overflow: auto;
703
+ }
704
+ .split > .gutter {
705
+ width: 5px;
706
+ cursor: col-resize;
707
+ background: transparent;
708
+ }
709
+ .split > .gutter:hover,
710
+ .split > .gutter.on {
711
+ background: var(--accent);
712
+ opacity: 0.5;
713
+ }
714
+ .panel {
715
+ background: var(--card);
716
+ border-right: 1px solid var(--line);
717
+ height: 100%;
718
+ display: flex;
719
+ flex-direction: column;
720
+ min-height: 0;
721
+ }
722
+ .panel.right {
723
+ border-right: none;
724
+ border-left: 1px solid var(--line);
725
+ }
726
+ .panel .head {
727
+ padding: 8px 10px;
728
+ border-bottom: 1px solid var(--line);
729
+ font-size: 11px;
730
+ color: var(--muted);
731
+ text-transform: uppercase;
732
+ letter-spacing: 0.04em;
733
+ display: flex;
734
+ align-items: center;
735
+ gap: 8px;
736
+ flex: none;
737
+ }
738
+ .panel .body {
739
+ flex: 1;
740
+ min-height: 0;
741
+ overflow: auto;
742
+ }
743
+ .panel .section {
744
+ padding: 10px;
745
+ border-bottom: 1px solid var(--line);
746
+ }
747
+ .panel .section h4 {
748
+ font-size: 12px;
749
+ color: var(--muted);
750
+ margin-bottom: 6px;
751
+ font-weight: 500;
752
+ }
753
+
754
+ /* --- file tree --- */
755
+ .tree {
756
+ font-size: 12.5px;
757
+ padding: 4px 0;
758
+ }
759
+ .tree .node {
760
+ display: flex;
761
+ align-items: center;
762
+ gap: 5px;
763
+ padding: 2px 8px;
764
+ cursor: pointer;
765
+ white-space: nowrap;
766
+ user-select: none;
767
+ }
768
+ .tree .node:hover {
769
+ background: var(--hover);
770
+ }
771
+ .tree .node.sel {
772
+ background: var(--accent-soft);
773
+ }
774
+ .tree .arrow {
775
+ width: 12px;
776
+ color: var(--muted);
777
+ font-size: 10px;
778
+ text-align: center;
779
+ }
780
+ .tree .name {
781
+ overflow: hidden;
782
+ text-overflow: ellipsis;
783
+ }
784
+ .tree .st {
785
+ width: 6px;
786
+ height: 6px;
787
+ border-radius: 50%;
788
+ flex: none;
789
+ background: var(--line);
790
+ }
791
+ .tree .st.indexed {
792
+ background: var(--ok);
793
+ }
794
+ .tree .st.partial {
795
+ background: var(--warn);
796
+ }
797
+ .tree .st.skipped,
798
+ .tree .st.unsupported {
799
+ background: var(--bad);
800
+ }
801
+ .tree .heat {
802
+ margin-left: auto;
803
+ font-size: 10.5px;
804
+ color: var(--muted);
805
+ font-variant-numeric: tabular-nums;
806
+ }
807
+ .tree .heat.hot {
808
+ color: var(--warn);
809
+ }
810
+
811
+ /* --- code view --- */
812
+ .code {
813
+ font: 12.5px / 1.55 var(--mono);
814
+ background: var(--code);
815
+ height: 100%;
816
+ overflow: auto;
817
+ }
818
+ .code table {
819
+ border-collapse: collapse;
820
+ width: 100%;
821
+ }
822
+ .code td {
823
+ padding: 0 10px;
824
+ border: none;
825
+ vertical-align: top;
826
+ white-space: pre;
827
+ }
828
+ .code td.ln {
829
+ width: 1%;
830
+ text-align: right;
831
+ color: var(--muted);
832
+ user-select: none;
833
+ padding-right: 12px;
834
+ border-right: 1px solid var(--line);
835
+ cursor: pointer;
836
+ }
837
+ .code tr.hl td {
838
+ background: var(--accent-soft);
839
+ }
840
+ .code tr.sym td.ln {
841
+ color: var(--accent);
842
+ font-weight: 600;
843
+ }
844
+ .code .mark {
845
+ display: inline-block;
846
+ width: 6px;
847
+ margin-right: 4px;
848
+ color: var(--accent);
849
+ }
850
+ .token.comment,
851
+ .token.prolog,
852
+ .token.doctype,
853
+ .token.cdata {
854
+ color: var(--tok-cm);
855
+ font-style: italic;
856
+ }
857
+ .token.keyword,
858
+ .token.boolean,
859
+ .token.important {
860
+ color: var(--tok-kw);
861
+ }
862
+ .token.string,
863
+ .token.char,
864
+ .token.template-string,
865
+ .token.attr-value {
866
+ color: var(--tok-str);
867
+ }
868
+ .token.number,
869
+ .token.constant,
870
+ .token.symbol {
871
+ color: var(--tok-num);
872
+ }
873
+ .token.function,
874
+ .token.function-variable {
875
+ color: var(--tok-fn);
876
+ }
877
+ .token.class-name,
878
+ .token.builtin,
879
+ .token.maybe-class-name {
880
+ color: var(--tok-ty);
881
+ }
882
+ .token.punctuation,
883
+ .token.operator {
884
+ color: var(--tok-pn);
885
+ }
886
+ .token.property,
887
+ .token.tag,
888
+ .token.attr-name {
889
+ color: var(--tok-fn);
890
+ }
891
+ .crumbs {
892
+ padding: 8px 12px;
893
+ border-bottom: 1px solid var(--line);
894
+ background: var(--card);
895
+ display: flex;
896
+ gap: 6px;
897
+ align-items: center;
898
+ font-size: 12.5px;
899
+ flex: none;
900
+ }
901
+ .crumbs .sep {
902
+ color: var(--muted);
903
+ }
904
+
905
+ /* --- graph canvas --- */
906
+ .gwrap {
907
+ position: relative;
908
+ background: var(--card);
909
+ height: 100%;
910
+ min-height: 240px;
911
+ overflow: hidden;
912
+ }
913
+ .gwrap canvas {
914
+ display: block;
915
+ width: 100%;
916
+ height: 100%;
917
+ cursor: grab;
918
+ }
919
+ .gwrap canvas.drag {
920
+ cursor: grabbing;
921
+ }
922
+ .gwrap canvas.hover {
923
+ cursor: pointer;
924
+ }
925
+ .gwrap .overlay {
926
+ position: absolute;
927
+ background: var(--card);
928
+ border: 1px solid var(--line);
929
+ border-radius: 8px;
930
+ padding: 6px 10px;
931
+ font-size: 11.5px;
932
+ box-shadow: var(--shadow);
933
+ }
934
+ .gwrap .legend {
935
+ left: 10px;
936
+ bottom: 10px;
937
+ display: flex;
938
+ gap: 10px;
939
+ flex-wrap: wrap;
940
+ max-width: 70%;
941
+ }
942
+ .gwrap .legend i {
943
+ display: inline-block;
944
+ width: 10px;
945
+ height: 10px;
946
+ border-radius: 50%;
947
+ margin-right: 4px;
948
+ vertical-align: -1px;
949
+ }
950
+ .gwrap .legend s {
951
+ display: inline-block;
952
+ width: 18px;
953
+ height: 0;
954
+ border-top: 2px solid;
955
+ margin-right: 4px;
956
+ vertical-align: 3px;
957
+ }
958
+ .gwrap .hint {
959
+ right: 10px;
960
+ top: 10px;
961
+ max-width: 48%;
962
+ }
963
+ .gwrap .tip {
964
+ pointer-events: none;
965
+ max-width: 360px;
966
+ word-break: break-all;
967
+ }
968
+ .gwrap .fit {
969
+ right: 10px;
970
+ bottom: 10px;
971
+ padding: 3px 8px;
972
+ cursor: pointer;
973
+ }
974
+ .gtoolbar {
975
+ display: flex;
976
+ gap: 6px;
977
+ align-items: center;
978
+ flex-wrap: wrap;
979
+ padding: 8px 12px;
980
+ border-bottom: 1px solid var(--line);
981
+ background: var(--card);
982
+ flex: none;
983
+ }
984
+ .gtoolbar input[type="text"] {
985
+ width: 260px;
986
+ }
987
+ .gtoolbar .count {
988
+ margin-left: auto;
989
+ color: var(--muted);
990
+ font-size: 12px;
991
+ white-space: nowrap;
992
+ }
993
+ .suggest {
994
+ position: absolute;
995
+ z-index: 10;
996
+ background: var(--card);
997
+ border: 1px solid var(--line);
998
+ border-radius: 8px;
999
+ box-shadow: var(--shadow);
1000
+ max-height: 280px;
1001
+ overflow: auto;
1002
+ min-width: 320px;
1003
+ }
1004
+ .suggest div {
1005
+ padding: 6px 10px;
1006
+ cursor: pointer;
1007
+ font-size: 12.5px;
1008
+ display: flex;
1009
+ gap: 8px;
1010
+ align-items: center;
1011
+ }
1012
+ .suggest div:hover,
1013
+ .suggest div.on {
1014
+ background: var(--hover);
1015
+ }
1016
+ .suggest .path {
1017
+ color: var(--muted);
1018
+ font-size: 11px;
1019
+ margin-left: auto;
1020
+ overflow: hidden;
1021
+ text-overflow: ellipsis;
1022
+ white-space: nowrap;
1023
+ max-width: 180px;
1024
+ }
1025
+
1026
+ /* --- treemap --- */
1027
+ .treemap {
1028
+ position: relative;
1029
+ width: 100%;
1030
+ height: 520px;
1031
+ background: var(--card);
1032
+ border: 1px solid var(--line);
1033
+ border-radius: 10px;
1034
+ overflow: hidden;
1035
+ }
1036
+ .treemap .cell {
1037
+ position: absolute;
1038
+ overflow: hidden;
1039
+ border: 1px solid var(--card);
1040
+ font-size: 11px;
1041
+ cursor: pointer;
1042
+ padding: 2px 4px;
1043
+ color: #fff;
1044
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
1045
+ }
1046
+ .treemap .cell.dir {
1047
+ background: transparent !important;
1048
+ border: 1px solid var(--line);
1049
+ color: var(--fg);
1050
+ text-shadow: none;
1051
+ padding: 0;
1052
+ }
1053
+ .treemap .cell.dir > .lbl {
1054
+ font-size: 11px;
1055
+ padding: 2px 5px;
1056
+ color: var(--muted);
1057
+ background: var(--card);
1058
+ display: inline-block;
1059
+ max-width: 100%;
1060
+ overflow: hidden;
1061
+ text-overflow: ellipsis;
1062
+ white-space: nowrap;
1063
+ }
1064
+ .treemap .cell:hover {
1065
+ outline: 2px solid var(--accent);
1066
+ z-index: 2;
1067
+ }
1068
+ .treemap .cell.sel {
1069
+ outline: 2px solid var(--fg);
1070
+ z-index: 2;
1071
+ }
1072
+
1073
+ /* --- behavior tree --- */
1074
+ .btree {
1075
+ font-size: 12.5px;
1076
+ }
1077
+ .btree .bnode {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ gap: 6px;
1081
+ padding: 3px 6px;
1082
+ border-radius: 6px;
1083
+ cursor: pointer;
1084
+ }
1085
+ .btree .bnode:hover {
1086
+ background: var(--hover);
1087
+ }
1088
+ .btree .bnode.sel {
1089
+ background: var(--accent-soft);
1090
+ }
1091
+ .btree .kids {
1092
+ margin-left: 18px;
1093
+ border-left: 1px dashed var(--line);
1094
+ padding-left: 6px;
1095
+ }
1096
+
1097
+ /* --- history explorer ------------------------------------------------------------- */
1098
+ .hist-stats {
1099
+ display: grid;
1100
+ grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
1101
+ gap: 8px;
1102
+ margin-bottom: 10px;
1103
+ }
1104
+ .hist-stats .stat {
1105
+ background: var(--card);
1106
+ border: 1px solid var(--line);
1107
+ border-radius: 10px;
1108
+ padding: 8px 12px;
1109
+ }
1110
+ .hist-stats .stat .v {
1111
+ font-size: 20px;
1112
+ font-weight: 600;
1113
+ letter-spacing: -0.01em;
1114
+ }
1115
+ .hist-stats .stat .v small {
1116
+ font-size: 12px;
1117
+ font-weight: 400;
1118
+ color: var(--muted);
1119
+ margin-left: 4px;
1120
+ }
1121
+ .hist-stats .stat .k {
1122
+ font-size: 11px;
1123
+ color: var(--muted);
1124
+ text-transform: uppercase;
1125
+ letter-spacing: 0.04em;
1126
+ }
1127
+ .hist-chart {
1128
+ position: relative;
1129
+ user-select: none;
1130
+ }
1131
+ .hist-chart svg {
1132
+ display: block;
1133
+ cursor: crosshair;
1134
+ }
1135
+ .hist-chart .grid {
1136
+ stroke: var(--line);
1137
+ stroke-width: 1;
1138
+ }
1139
+ .hist-chart .axis,
1140
+ .hist-chart .lbl {
1141
+ font-size: 10px;
1142
+ fill: var(--muted);
1143
+ }
1144
+ .hist-chart .lbl {
1145
+ fill: var(--fg);
1146
+ pointer-events: none;
1147
+ }
1148
+ .hist-chart .brush {
1149
+ fill: var(--accent);
1150
+ opacity: 0.1;
1151
+ stroke: var(--accent);
1152
+ stroke-dasharray: 3 2;
1153
+ }
1154
+ .hist-chart .cross {
1155
+ stroke: var(--fg);
1156
+ opacity: 0.35;
1157
+ }
1158
+ .hist-chart .dot {
1159
+ stroke: var(--card);
1160
+ stroke-width: 1.5;
1161
+ cursor: pointer;
1162
+ opacity: 0.9;
1163
+ }
1164
+ .hist-chart .dot:hover,
1165
+ .hist-chart .dot.sel {
1166
+ stroke: var(--fg);
1167
+ stroke-width: 2;
1168
+ opacity: 1;
1169
+ }
1170
+ .hist-chart .tip {
1171
+ position: absolute;
1172
+ pointer-events: none;
1173
+ background: var(--card);
1174
+ border: 1px solid var(--line);
1175
+ border-radius: 8px;
1176
+ box-shadow: var(--shadow);
1177
+ padding: 6px 10px;
1178
+ font-size: 12px;
1179
+ max-width: 300px;
1180
+ z-index: 3;
1181
+ }
1182
+ .kdot {
1183
+ display: inline-block;
1184
+ width: 9px;
1185
+ height: 9px;
1186
+ border-radius: 50%;
1187
+ margin-right: 5px;
1188
+ vertical-align: -1px;
1189
+ }
1190
+ .kdot-lbl {
1191
+ font-size: 11px;
1192
+ color: var(--muted);
1193
+ margin-right: 8px;
1194
+ white-space: nowrap;
1195
+ }
1196
+ .spark {
1197
+ vertical-align: middle;
1198
+ }
1199
+ .spark polyline {
1200
+ fill: none;
1201
+ stroke: var(--accent);
1202
+ stroke-width: 1.5;
1203
+ }
1204
+ .spark circle {
1205
+ fill: var(--accent);
1206
+ }
1207
+ .commits {
1208
+ display: flex;
1209
+ align-items: stretch;
1210
+ }
1211
+ .commits .lanes {
1212
+ flex: 0 0 auto;
1213
+ margin-right: 4px;
1214
+ }
1215
+ .commits .lanes path,
1216
+ .commits .lanes line {
1217
+ fill: none;
1218
+ stroke-width: 2;
1219
+ }
1220
+ .commits .lanes circle.off {
1221
+ opacity: 0.5;
1222
+ }
1223
+ .commits .rows {
1224
+ flex: 1 1 auto;
1225
+ min-width: 0;
1226
+ }
1227
+ .crow {
1228
+ display: grid;
1229
+ grid-template-columns: 78px 1fr auto;
1230
+ gap: 0 10px;
1231
+ align-items: center;
1232
+ height: 28px;
1233
+ padding: 0 8px;
1234
+ border-radius: 6px;
1235
+ cursor: pointer;
1236
+ font-size: 12.5px;
1237
+ white-space: nowrap;
1238
+ }
1239
+ .crow:hover {
1240
+ background: var(--hover);
1241
+ }
1242
+ .crow.sel {
1243
+ background: var(--accent-soft);
1244
+ }
1245
+ .crow.off {
1246
+ opacity: 0.6;
1247
+ }
1248
+ .crow .when {
1249
+ color: var(--muted);
1250
+ font-size: 11px;
1251
+ }
1252
+ .crow .subj {
1253
+ overflow: hidden;
1254
+ text-overflow: ellipsis;
1255
+ min-width: 0;
1256
+ }
1257
+ .crow .subj .sha {
1258
+ font-family: var(--mono);
1259
+ color: var(--muted);
1260
+ font-size: 11px;
1261
+ margin-right: 6px;
1262
+ }
1263
+ .crow .meta {
1264
+ display: flex;
1265
+ align-items: center;
1266
+ gap: 6px;
1267
+ color: var(--muted);
1268
+ font-size: 11px;
1269
+ }
1270
+ .crow .meta .flag {
1271
+ font-size: 11px;
1272
+ padding: 0 5px;
1273
+ border-radius: 4px;
1274
+ border: 1px solid var(--line);
1275
+ }
1276
+ .crow .meta .flag.warn {
1277
+ color: var(--warn);
1278
+ border-color: var(--warn);
1279
+ }
1280
+ .crow .meta .flag.bad {
1281
+ color: var(--bad);
1282
+ border-color: var(--bad);
1283
+ }
1284
+ .crow .meta .flag.ok {
1285
+ color: var(--ok);
1286
+ border-color: var(--ok);
1287
+ }
1288
+ .ref {
1289
+ display: inline-block;
1290
+ font-size: 10.5px;
1291
+ padding: 0 6px;
1292
+ border-radius: 4px;
1293
+ background: var(--accent-soft);
1294
+ color: var(--fg);
1295
+ margin-left: 4px;
1296
+ font-family: var(--mono);
1297
+ }
1298
+ .ref.tag {
1299
+ background: transparent;
1300
+ border: 1px solid var(--warn);
1301
+ color: var(--warn);
1302
+ border-radius: 4px;
1303
+ line-height: 16px;
1304
+ }
1305
+ .ref.remote {
1306
+ opacity: 0.7;
1307
+ }
1308
+ .pm {
1309
+ display: inline-flex;
1310
+ align-items: center;
1311
+ gap: 2px;
1312
+ font-family: var(--mono);
1313
+ font-size: 11px;
1314
+ }
1315
+ .pm .add {
1316
+ color: var(--ok);
1317
+ }
1318
+ .pm .del {
1319
+ color: var(--bad);
1320
+ }
1321
+ .pm .bars {
1322
+ display: inline-flex;
1323
+ height: 8px;
1324
+ gap: 1px;
1325
+ }
1326
+ .pm .bars i {
1327
+ display: inline-block;
1328
+ height: 8px;
1329
+ width: 4px;
1330
+ border-radius: 1px;
1331
+ background: var(--line);
1332
+ }
1333
+ .pm .bars i.a {
1334
+ background: var(--ok);
1335
+ }
1336
+ .pm .bars i.d {
1337
+ background: var(--bad);
1338
+ }
1339
+ .msg {
1340
+ white-space: pre-wrap;
1341
+ font-size: 12.5px;
1342
+ line-height: 1.5;
1343
+ background: var(--code);
1344
+ border-radius: 8px;
1345
+ padding: 8px 10px;
1346
+ max-height: 220px;
1347
+ overflow: auto;
1348
+ }
1349
+ .diff {
1350
+ font-family: var(--mono);
1351
+ font-size: 11.5px;
1352
+ line-height: 1.45;
1353
+ background: var(--code);
1354
+ border-radius: 8px;
1355
+ overflow: auto;
1356
+ max-height: 60vh;
1357
+ }
1358
+ .diff div {
1359
+ padding: 0 10px;
1360
+ white-space: pre;
1361
+ }
1362
+ .diff .add {
1363
+ background: rgba(22, 163, 74, 0.14);
1364
+ }
1365
+ .diff .del {
1366
+ background: rgba(220, 38, 38, 0.14);
1367
+ }
1368
+ .diff .hunk {
1369
+ color: var(--accent);
1370
+ background: var(--accent-soft);
1371
+ }
1372
+ .diff .file {
1373
+ color: var(--fg);
1374
+ font-weight: 600;
1375
+ padding-top: 6px;
1376
+ border-top: 1px solid var(--line);
1377
+ }
1378
+ .cfiles {
1379
+ display: flex;
1380
+ flex-direction: column;
1381
+ }
1382
+ .cfile {
1383
+ padding: 5px 0;
1384
+ border-bottom: 1px dashed var(--line);
1385
+ font-size: 12.5px;
1386
+ }
1387
+ .cfile:last-child {
1388
+ border-bottom: 0;
1389
+ }
1390
+ .cfile .row.tight.small a {
1391
+ margin-right: 4px;
1392
+ }
1393
+ .chain {
1394
+ border-left: 2px solid var(--line);
1395
+ margin-left: 6px;
1396
+ padding-left: 10px;
1397
+ }
1398
+ .chain .step {
1399
+ position: relative;
1400
+ padding: 3px 0;
1401
+ font-size: 12.5px;
1402
+ }
1403
+ .chain .step::before {
1404
+ content: "";
1405
+ position: absolute;
1406
+ left: -15px;
1407
+ top: 9px;
1408
+ width: 8px;
1409
+ height: 8px;
1410
+ border-radius: 50%;
1411
+ background: var(--card);
1412
+ border: 2px solid var(--muted);
1413
+ }
1414
+ .chain .step.fix::before {
1415
+ border-color: #e11d48;
1416
+ }
1417
+ .chain .step.origin::before {
1418
+ border-color: #2563eb;
1419
+ }
1420
+ .riskbar {
1421
+ display: inline-block;
1422
+ height: 6px;
1423
+ width: 60px;
1424
+ border-radius: 3px;
1425
+ background: var(--line);
1426
+ vertical-align: middle;
1427
+ overflow: hidden;
1428
+ }
1429
+ .riskbar i {
1430
+ display: block;
1431
+ height: 100%;
1432
+ background: var(--accent);
1433
+ }
1434
+ .lesson {
1435
+ display: flex;
1436
+ gap: 8px;
1437
+ padding: 5px 0;
1438
+ border-bottom: 1px dashed var(--line);
1439
+ font-size: 12.5px;
1440
+ }
1441
+ .lesson:last-child {
1442
+ border-bottom: 0;
1443
+ }
1444
+ .lesson .i {
1445
+ flex: 0 0 auto;
1446
+ color: var(--accent);
1447
+ }
1448
+ .ab {
1449
+ display: inline-flex;
1450
+ align-items: center;
1451
+ gap: 4px;
1452
+ font-family: var(--mono);
1453
+ font-size: 11px;
1454
+ }
1455
+ .ab .bar {
1456
+ height: 6px;
1457
+ width: auto;
1458
+ margin: 0;
1459
+ }
1460
+
1461
+ /* --- rendered markdown (memories) --- */
1462
+ .md {
1463
+ line-height: 1.55;
1464
+ overflow-wrap: anywhere;
1465
+ min-width: 0;
1466
+ }
1467
+ .md > :first-child {
1468
+ margin-top: 0;
1469
+ }
1470
+ .md > :last-child {
1471
+ margin-bottom: 0;
1472
+ }
1473
+ .md.preview {
1474
+ min-height: 300px;
1475
+ padding: 10px 12px;
1476
+ border: 1px solid var(--line);
1477
+ border-radius: 6px;
1478
+ background: var(--card);
1479
+ }
1480
+ .md h1,
1481
+ .md h2,
1482
+ .md h3,
1483
+ .md h4,
1484
+ .md h5,
1485
+ .md h6 {
1486
+ margin: 18px 0 8px;
1487
+ line-height: 1.3;
1488
+ }
1489
+ .md h1 {
1490
+ font-size: 20px;
1491
+ }
1492
+ .md h2 {
1493
+ font-size: 17px;
1494
+ padding-bottom: 4px;
1495
+ border-bottom: 1px solid var(--line);
1496
+ }
1497
+ .md h3 {
1498
+ font-size: 15px;
1499
+ }
1500
+ .md h4,
1501
+ .md h5,
1502
+ .md h6 {
1503
+ font-size: 14px;
1504
+ }
1505
+ .md p {
1506
+ margin: 0 0 10px;
1507
+ }
1508
+ .md ul,
1509
+ .md ol {
1510
+ margin: 0 0 10px;
1511
+ padding-left: 22px;
1512
+ }
1513
+ .md li {
1514
+ margin: 2px 0;
1515
+ }
1516
+ .md li > p {
1517
+ margin: 0 0 4px;
1518
+ }
1519
+ .md li > ul,
1520
+ .md li > ol {
1521
+ margin-bottom: 0;
1522
+ }
1523
+ .md li.task {
1524
+ list-style: none;
1525
+ margin-left: -18px;
1526
+ }
1527
+ .md li.task input {
1528
+ margin: 0 6px 0 0;
1529
+ vertical-align: -1px;
1530
+ }
1531
+ .md blockquote {
1532
+ margin: 0 0 10px;
1533
+ padding: 2px 12px;
1534
+ border-left: 3px solid var(--bar);
1535
+ color: var(--muted);
1536
+ }
1537
+ .md pre.code {
1538
+ margin: 0 0 10px;
1539
+ padding: 10px 12px;
1540
+ background: var(--code);
1541
+ border: 1px solid var(--line);
1542
+ border-radius: 6px;
1543
+ overflow-x: auto;
1544
+ font: 12.5px / 1.5 var(--mono);
1545
+ position: relative;
1546
+ }
1547
+ .md pre.code[data-lang]::after {
1548
+ content: attr(data-lang);
1549
+ position: absolute;
1550
+ top: 4px;
1551
+ right: 8px;
1552
+ font-size: 10px;
1553
+ color: var(--muted);
1554
+ }
1555
+ .md pre.code code {
1556
+ background: none;
1557
+ padding: 0;
1558
+ font: inherit;
1559
+ }
1560
+ .md table {
1561
+ border-collapse: collapse;
1562
+ margin: 0 0 10px;
1563
+ font-size: 13px;
1564
+ max-width: 100%;
1565
+ display: block;
1566
+ overflow-x: auto;
1567
+ }
1568
+ .md th,
1569
+ .md td {
1570
+ border: 1px solid var(--line);
1571
+ padding: 4px 8px;
1572
+ text-align: left;
1573
+ vertical-align: top;
1574
+ }
1575
+ .md th {
1576
+ background: var(--hover);
1577
+ font-weight: 600;
1578
+ }
1579
+ .md hr {
1580
+ border: 0;
1581
+ border-top: 1px solid var(--line);
1582
+ margin: 14px 0;
1583
+ }
1584
+ .md img {
1585
+ max-width: 100%;
1586
+ border-radius: 6px;
1587
+ }
1588
+ .md a.ref {
1589
+ font-family: var(--mono);
1590
+ font-size: 12.5px;
1591
+ background: var(--accent-soft);
1592
+ padding: 0 4px;
1593
+ border-radius: 4px;
1594
+ }
1595
+ .md .md-html {
1596
+ color: var(--muted);
1597
+ font: 12px / 1.5 var(--mono);
1598
+ white-space: pre-wrap;
1599
+ }
1600
+ .md pre.md-html {
1601
+ margin: 0 0 10px;
1602
+ }
1603
+ .mem-refs a.ref {
1604
+ font-family: var(--mono);
1605
+ font-size: 11px;
1606
+ background: var(--accent-soft);
1607
+ padding: 0 6px;
1608
+ border-radius: 999px;
1609
+ }
1610
+
1611
+ @media (max-width: 900px) {
1612
+ header.top {
1613
+ flex-wrap: wrap;
1614
+ height: auto;
1615
+ padding: 8px 12px;
1616
+ }
1617
+ header.top select.project {
1618
+ max-width: 220px;
1619
+ flex: 0 1 auto;
1620
+ }
1621
+ .page {
1622
+ padding: 12px 16px;
1623
+ }
1624
+ }