@atolis-hq/corum 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.
Files changed (39) hide show
  1. package/README.md +223 -0
  2. package/dist/src/adapters/index.js +12 -0
  3. package/dist/src/adapters/openapi/index.js +12 -0
  4. package/dist/src/adapters/openapi/mapper.js +218 -0
  5. package/dist/src/adapters/openapi/parser.js +16 -0
  6. package/dist/src/bin/corum.js +164 -0
  7. package/dist/src/cli.js +20 -0
  8. package/dist/src/graph/index.js +128 -0
  9. package/dist/src/graph/overlay.js +136 -0
  10. package/dist/src/import/config.js +39 -0
  11. package/dist/src/import/runner.js +56 -0
  12. package/dist/src/loader/cluster-loader.js +120 -0
  13. package/dist/src/loader/constants.js +32 -0
  14. package/dist/src/loader/edge-loader.js +59 -0
  15. package/dist/src/loader/fs-utils.js +20 -0
  16. package/dist/src/loader/index.js +108 -0
  17. package/dist/src/loader/pack-loader.js +99 -0
  18. package/dist/src/mcp/index.js +333 -0
  19. package/dist/src/mcp/serializers.js +68 -0
  20. package/dist/src/openapi-to-api-endpoints.js +240 -0
  21. package/dist/src/reconcile/index.js +46 -0
  22. package/dist/src/schema/index.js +16 -0
  23. package/dist/src/source/config-file.js +22 -0
  24. package/dist/src/source/config.js +71 -0
  25. package/dist/src/source/content-utils.js +13 -0
  26. package/dist/src/source/file-source.js +135 -0
  27. package/dist/src/source/git-cache.js +54 -0
  28. package/dist/src/source/git-source.js +333 -0
  29. package/dist/src/source/index.js +8 -0
  30. package/dist/src/web/server.js +557 -0
  31. package/dist/src/writer/graph-writer.js +153 -0
  32. package/package.json +36 -0
  33. package/web/app.jsx +668 -0
  34. package/web/favicon.svg +19 -0
  35. package/web/index.html +41 -0
  36. package/web/nav.js +141 -0
  37. package/web/primitives.jsx +583 -0
  38. package/web/router.js +49 -0
  39. package/web/style.css +827 -0
package/web/style.css ADDED
@@ -0,0 +1,827 @@
1
+ :root,
2
+ [data-theme="light"] {
3
+ --paper: #ffffff;
4
+ --paper-2: #f7f7f8;
5
+ --paper-3: #eeeef1;
6
+ --ink: #141519;
7
+ --ink-2: #3a3c43;
8
+ --ink-3: #6c6f78;
9
+ --ink-4: #a8acb5;
10
+ --rule: #e4e6ea;
11
+ --rule-2: #cdd0d6;
12
+ --accent: #e8614a;
13
+ --accent-2: #fde6e0;
14
+ --accent-ink: #b3422e;
15
+ --ok: #3b9a66;
16
+ --warn: var(--accent);
17
+ --radius: 6px;
18
+ color-scheme: light;
19
+ }
20
+
21
+ body[data-theme="dark"] {
22
+ --paper: #15171c;
23
+ --paper-2: #1c1f25;
24
+ --paper-3: #262a33;
25
+ --ink: #f2f3f5;
26
+ --ink-2: #d4d6dc;
27
+ --ink-3: #9498a2;
28
+ --ink-4: #5f636d;
29
+ --rule: #2c2f38;
30
+ --rule-2: #3d414c;
31
+ --accent: #f27561;
32
+ --accent-2: #3a221c;
33
+ --accent-ink: #ffa796;
34
+ --ok: #5bbd85;
35
+ --warn: var(--accent);
36
+ color-scheme: dark;
37
+ }
38
+
39
+ * { box-sizing: border-box; }
40
+ html,
41
+ body {
42
+ margin: 0;
43
+ padding: 0;
44
+ height: 100%;
45
+ background: var(--paper);
46
+ color: var(--ink);
47
+ }
48
+
49
+ body {
50
+ font-family: "Inter", system-ui, sans-serif;
51
+ font-size: 13px;
52
+ line-height: 1.45;
53
+ -webkit-font-smoothing: antialiased;
54
+ }
55
+
56
+ button {
57
+ font: inherit;
58
+ }
59
+
60
+ #root {
61
+ display: flex;
62
+ flex-direction: column;
63
+ height: 100vh;
64
+ }
65
+
66
+ .mono { font-family: "JetBrains Mono", ui-monospace, monospace; }
67
+ .label-xs {
68
+ color: var(--ink-3);
69
+ font-size: 10px;
70
+ font-weight: 600;
71
+ letter-spacing: 0.12em;
72
+ text-transform: uppercase;
73
+ }
74
+ .label-sm {
75
+ color: var(--ink-3);
76
+ font-size: 11px;
77
+ }
78
+
79
+ .topbar {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 10px;
83
+ height: 48px;
84
+ padding: 10px 16px;
85
+ background: var(--accent);
86
+ color: var(--paper);
87
+ flex-shrink: 0;
88
+ }
89
+
90
+ .topbar .brand {
91
+ display: flex;
92
+ align-items: center;
93
+ gap: 8px;
94
+ color: #fff;
95
+ font-family: 'Space Grotesk', system-ui, sans-serif;
96
+ font-size: 18px;
97
+ font-weight: 600;
98
+ }
99
+
100
+ .main {
101
+ display: flex;
102
+ flex: 1;
103
+ min-height: 0;
104
+ }
105
+
106
+ .nav-rail {
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 4px;
110
+ width: 72px;
111
+ padding: 10px 8px;
112
+ background: var(--paper-2);
113
+ border-right: 1px solid var(--rule-2);
114
+ flex-shrink: 0;
115
+ }
116
+
117
+ .nav-rail-item {
118
+ display: flex;
119
+ flex-direction: column;
120
+ align-items: center;
121
+ justify-content: center;
122
+ gap: 5px;
123
+ min-height: 54px;
124
+ padding: 6px 4px;
125
+ border: 1px solid transparent;
126
+ border-radius: var(--radius);
127
+ color: var(--ink-3);
128
+ cursor: pointer;
129
+ }
130
+
131
+ .nav-rail-item span {
132
+ max-width: 58px;
133
+ overflow: hidden;
134
+ font-size: 10px;
135
+ font-weight: 600;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ .nav-rail-item:hover {
141
+ background: var(--paper);
142
+ color: var(--ink);
143
+ }
144
+
145
+ .nav-rail-item.active {
146
+ background: var(--accent);
147
+ color: var(--paper);
148
+ }
149
+
150
+ .nav-tree {
151
+ width: 280px;
152
+ min-width: 280px;
153
+ padding: 12px 10px 24px;
154
+ overflow: auto;
155
+ background: var(--paper);
156
+ border-right: 1px solid var(--rule);
157
+ }
158
+
159
+ .nav-section-head {
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: space-between;
163
+ gap: 8px;
164
+ padding: 8px 6px;
165
+ color: var(--ink-4);
166
+ text-transform: uppercase;
167
+ letter-spacing: 0.08em;
168
+ font-size: 12px;
169
+ font-weight: 700;
170
+ cursor: pointer;
171
+ }
172
+
173
+ .nav-template-head {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: 7px;
177
+ padding: 7px 6px 4px 16px;
178
+ color: var(--ink-3);
179
+ font-size: 10px;
180
+ font-weight: 700;
181
+ letter-spacing: 0.08em;
182
+ text-transform: uppercase;
183
+ }
184
+
185
+ .nav-subtype-head {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 7px;
189
+ padding: 5px 6px 2px 22px;
190
+ color: var(--ink-3);
191
+ font-size: 10px;
192
+ font-weight: 600;
193
+ letter-spacing: 0.06em;
194
+ text-transform: uppercase;
195
+ }
196
+
197
+ .nav-node-item {
198
+ margin: 1px 0;
199
+ padding: 6px 8px 6px 30px;
200
+ overflow: hidden;
201
+ border-radius: 4px;
202
+ color: var(--ink-2);
203
+ cursor: pointer;
204
+ font-size: 12px;
205
+ text-overflow: ellipsis;
206
+ white-space: nowrap;
207
+ }
208
+
209
+ .nav-node-item:hover {
210
+ background: var(--paper-2);
211
+ }
212
+
213
+ .nav-node-item.active {
214
+ background: var(--nav-node-active-bg, var(--ink));
215
+ color: var(--paper);
216
+ }
217
+
218
+ .nav-child-group {
219
+ margin: 1px 0 4px;
220
+ }
221
+
222
+ .nav-child-head {
223
+ padding: 4px 8px 2px 42px;
224
+ color: var(--ink-4);
225
+ font-size: 10px;
226
+ font-weight: 700;
227
+ text-transform: uppercase;
228
+ }
229
+
230
+ .nav-node-child {
231
+ padding-left: 50px;
232
+ }
233
+
234
+ .content {
235
+ flex: 1;
236
+ min-width: 0;
237
+ overflow: auto;
238
+ padding: 24px 30px 60px;
239
+ }
240
+
241
+ .content h1 {
242
+ margin: 0 0 12px;
243
+ font-size: 32px;
244
+ line-height: 1.1;
245
+ }
246
+
247
+ .card {
248
+ margin-bottom: 14px;
249
+ overflow: hidden;
250
+ border: 1px solid var(--rule-2);
251
+ border-radius: 8px;
252
+ background: var(--paper);
253
+ }
254
+
255
+ .card-head {
256
+ padding: 10px 14px;
257
+ background: var(--paper-2);
258
+ border-bottom: 1px solid var(--rule);
259
+ color: var(--ink-3);
260
+ font-size: 11px;
261
+ font-weight: 700;
262
+ letter-spacing: 0.08em;
263
+ text-transform: uppercase;
264
+ }
265
+
266
+ .card-body {
267
+ background: var(--paper);
268
+ }
269
+
270
+ .tag {
271
+ display: inline-block;
272
+ padding: 1px 7px;
273
+ border: 1px solid var(--rule-2);
274
+ border-radius: 3px;
275
+ background: var(--paper);
276
+ color: var(--ink-2);
277
+ font-size: 10px;
278
+ font-weight: 600;
279
+ letter-spacing: 0.04em;
280
+ text-transform: uppercase;
281
+ }
282
+
283
+ .tag.state-draft { background: var(--paper-3); color: var(--ink-2); }
284
+ .tag.state-proposed { background: var(--accent-2); border-color: var(--accent); color: var(--accent-ink); }
285
+ .tag.state-agreed { background: color-mix(in oklch, var(--ok) 18%, var(--paper)); border-color: var(--ok); color: var(--ink); }
286
+ .tag.state-implemented { background: var(--ink); border-color: var(--ink); color: var(--paper); }
287
+ .tag.state-future { background: transparent; border-style: dashed; color: var(--ink-3); }
288
+ .tag.state-removed { text-decoration: line-through; color: var(--ink-3); }
289
+ .tag.stability-stable { background: transparent; }
290
+ .tag.stability-unstable { border-style: dashed; color: var(--ink-3); }
291
+ .tag.stability-deprecated { color: var(--ink-3); text-decoration: line-through; }
292
+
293
+ .chip,
294
+ .template-badge {
295
+ display: inline-flex;
296
+ align-items: center;
297
+ gap: 6px;
298
+ min-height: 20px;
299
+ padding: 2px 8px;
300
+ border: 1px solid var(--rule-2);
301
+ border-radius: 999px;
302
+ background: var(--paper);
303
+ color: var(--ink-2);
304
+ font-size: 11px;
305
+ font-weight: 600;
306
+ }
307
+
308
+ .template-badge {
309
+ border-color: transparent;
310
+ color: #fff;
311
+ }
312
+
313
+ .prop-table {
314
+ width: 100%;
315
+ border-collapse: collapse;
316
+ }
317
+
318
+ .prop-table td {
319
+ vertical-align: top;
320
+ padding: 8px 14px;
321
+ border-bottom: 1px dashed var(--rule);
322
+ font-size: 12px;
323
+ }
324
+
325
+ .prop-table tr:last-child td {
326
+ border-bottom: none;
327
+ }
328
+
329
+ .prop-table td:first-child {
330
+ width: 220px;
331
+ color: var(--ink-3);
332
+ font-size: 11px;
333
+ font-weight: 600;
334
+ }
335
+
336
+ .prop-table pre {
337
+ margin: 0;
338
+ white-space: pre-wrap;
339
+ word-break: break-word;
340
+ }
341
+
342
+ .prop-row.nested {
343
+ background: color-mix(in oklch, var(--accent) 2%, var(--paper));
344
+ }
345
+
346
+ .prop-key-cell {
347
+ padding-left: 14px;
348
+ }
349
+
350
+ .prop-key-label {
351
+ display: block;
352
+ padding-left: calc(var(--prop-depth, 0) * 24px);
353
+ }
354
+
355
+ .node-ref-link {
356
+ cursor: pointer;
357
+ color: var(--accent);
358
+ text-decoration: underline;
359
+ font-size: inherit;
360
+ }
361
+
362
+ .prop-empty { color: var(--ink-4); }
363
+
364
+ .schema-card .card-body {
365
+ padding: 0;
366
+ }
367
+
368
+ .schema-section {
369
+ border-bottom: 1px solid var(--rule-2);
370
+ }
371
+
372
+ .schema-section:last-child {
373
+ border-bottom: none;
374
+ }
375
+
376
+ .enum-card .card-body {
377
+ padding: 0;
378
+ }
379
+
380
+ .enum-section {
381
+ border-bottom: 1px solid var(--rule-2);
382
+ }
383
+
384
+ .enum-section:last-child {
385
+ border-bottom: none;
386
+ }
387
+
388
+ .enum-row {
389
+ display: grid;
390
+ grid-template-columns: minmax(160px, 0.8fr) minmax(220px, 1.6fr) 100px;
391
+ gap: 12px;
392
+ align-items: center;
393
+ padding: 8px 14px;
394
+ border-bottom: 1px dashed var(--rule);
395
+ font-size: 12px;
396
+ }
397
+
398
+ .enum-row:last-child {
399
+ border-bottom: none;
400
+ }
401
+
402
+ .enum-row-head {
403
+ background: var(--paper-2);
404
+ font-weight: 600;
405
+ }
406
+
407
+ .enum-row .name {
408
+ color: var(--ink);
409
+ font-family: "JetBrains Mono", ui-monospace, monospace;
410
+ font-size: 11.5px;
411
+ font-weight: 600;
412
+ }
413
+
414
+ .enum-row .description {
415
+ min-width: 0;
416
+ overflow-wrap: anywhere;
417
+ color: var(--ink-2);
418
+ }
419
+
420
+ .schema-section-head {
421
+ display: flex;
422
+ align-items: flex-start;
423
+ justify-content: space-between;
424
+ gap: 16px;
425
+ padding: 12px 14px;
426
+ background: var(--paper);
427
+ }
428
+
429
+ .schema-title {
430
+ margin-bottom: 2px;
431
+ color: var(--ink);
432
+ font-size: 18px;
433
+ font-weight: 700;
434
+ }
435
+
436
+ .field-row {
437
+ display: grid;
438
+ grid-template-columns: 18px minmax(180px, 1.3fr) minmax(90px, 0.8fr) 96px 80px 100px minmax(160px, 1fr);
439
+ gap: 10px;
440
+ align-items: center;
441
+ padding: 8px 14px;
442
+ border-bottom: 1px dashed var(--rule);
443
+ font-size: 12px;
444
+ }
445
+
446
+ .field-row:last-child {
447
+ border-bottom: none;
448
+ }
449
+
450
+ .field-row-head {
451
+ background: var(--paper-2);
452
+ font-weight: 600;
453
+ }
454
+
455
+ .field-row.nested {
456
+ background: color-mix(in oklch, var(--accent) 3%, var(--paper));
457
+ }
458
+
459
+ .field-row .gutter {
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: center;
463
+ color: var(--ink-4);
464
+ }
465
+
466
+ .field-row .name {
467
+ min-width: 0;
468
+ overflow-wrap: anywhere;
469
+ color: var(--ink);
470
+ font-weight: 600;
471
+ }
472
+
473
+ .field-row.nested .name {
474
+ padding-left: calc(var(--field-depth, 1) * 24px);
475
+ }
476
+
477
+ .field-row .type {
478
+ overflow-wrap: anywhere;
479
+ color: var(--ink-3);
480
+ font-family: "JetBrains Mono", ui-monospace, monospace;
481
+ font-size: 11.5px;
482
+ }
483
+
484
+ .field-row .cardinality,
485
+ .field-row .req {
486
+ color: var(--ink-3);
487
+ font-family: "JetBrains Mono", ui-monospace, monospace;
488
+ font-size: 10.5px;
489
+ }
490
+
491
+ .field-row .state {
492
+ min-width: 0;
493
+ }
494
+
495
+ .field-row .lineage {
496
+ min-width: 0;
497
+ overflow-wrap: anywhere;
498
+ color: var(--ink-3);
499
+ font-family: "JetBrains Mono", ui-monospace, monospace;
500
+ font-size: 11px;
501
+ }
502
+
503
+ .meta-strip {
504
+ display: grid;
505
+ grid-template-columns: repeat(5, minmax(110px, 1fr));
506
+ margin-bottom: 16px;
507
+ border: 1px solid var(--rule-2);
508
+ border-radius: 8px;
509
+ overflow: hidden;
510
+ }
511
+
512
+ .meta-cell {
513
+ min-width: 0;
514
+ padding: 10px 12px;
515
+ border-right: 1px solid var(--rule);
516
+ background: var(--paper-2);
517
+ }
518
+
519
+ .meta-cell:last-child {
520
+ border-right: none;
521
+ }
522
+
523
+ .empty-state {
524
+ padding: 14px;
525
+ border: 1px dashed var(--rule-2);
526
+ border-radius: 8px;
527
+ color: var(--ink-3);
528
+ }
529
+
530
+ @media (max-width: 780px) {
531
+ .main {
532
+ flex-direction: column;
533
+ }
534
+
535
+ .nav-rail {
536
+ flex-direction: row;
537
+ width: 100%;
538
+ min-height: 64px;
539
+ border-right: none;
540
+ border-bottom: 1px solid var(--rule-2);
541
+ }
542
+
543
+ .nav-rail-item {
544
+ flex: 1;
545
+ }
546
+
547
+ .nav-tree {
548
+ width: 100%;
549
+ max-height: 260px;
550
+ border-right: none;
551
+ border-bottom: 1px solid var(--rule);
552
+ }
553
+
554
+ .content {
555
+ padding: 20px 16px 40px;
556
+ }
557
+
558
+ .meta-strip {
559
+ grid-template-columns: 1fr;
560
+ }
561
+
562
+ .meta-cell {
563
+ border-right: none;
564
+ border-bottom: 1px solid var(--rule);
565
+ }
566
+
567
+ .meta-cell:last-child {
568
+ border-bottom: none;
569
+ }
570
+ }
571
+
572
+ .branch-bar {
573
+ height: 38px;
574
+ display: flex;
575
+ align-items: center;
576
+ gap: 8px;
577
+ padding: 0 14px;
578
+ background: var(--paper-2);
579
+ border-bottom: 1px solid var(--rule);
580
+ flex-shrink: 0;
581
+ font-size: 11.5px;
582
+ position: relative;
583
+ overflow: visible;
584
+ z-index: 20;
585
+ }
586
+
587
+ .branch-bar-spacer {
588
+ flex: 1;
589
+ }
590
+
591
+ .branch-chip {
592
+ display: inline-flex;
593
+ align-items: center;
594
+ gap: 4px;
595
+ padding: 2px 8px;
596
+ border-radius: 4px;
597
+ font-size: 11px;
598
+ font-family: var(--font-mono, 'JetBrains Mono', monospace);
599
+ cursor: pointer;
600
+ user-select: none;
601
+ white-space: nowrap;
602
+ }
603
+
604
+ .branch-chip.viewing {
605
+ background: var(--ink);
606
+ color: var(--paper);
607
+ font-weight: 600;
608
+ }
609
+
610
+ .branch-failed-badge {
611
+ display: inline-flex;
612
+ align-items: center;
613
+ padding: 2px 7px;
614
+ border: 1px solid color-mix(in oklch, var(--accent) 35%, transparent);
615
+ border-radius: 999px;
616
+ background: color-mix(in oklch, var(--accent) 12%, var(--paper));
617
+ color: var(--accent-ink);
618
+ font-size: 10px;
619
+ font-weight: 700;
620
+ letter-spacing: 0.04em;
621
+ text-transform: uppercase;
622
+ }
623
+
624
+ .branch-chip.overlay {
625
+ background: color-mix(in oklch, var(--accent) 15%, var(--paper));
626
+ color: var(--accent);
627
+ border: 1px solid color-mix(in oklch, var(--accent) 40%, transparent);
628
+ }
629
+
630
+ .branch-chip-select {
631
+ border: 1px dashed color-mix(in oklch, var(--accent) 45%, transparent);
632
+ }
633
+
634
+ .branch-chip.overlay:hover {
635
+ background: color-mix(in oklch, var(--accent) 22%, var(--paper));
636
+ }
637
+
638
+ .branch-chip.reload {
639
+ background: var(--paper);
640
+ color: var(--ink-2);
641
+ border: 1px solid color-mix(in oklch, var(--ink) 18%, transparent);
642
+ cursor: pointer;
643
+ }
644
+
645
+ .branch-chip.reload:hover {
646
+ background: color-mix(in oklch, var(--ink) 10%, var(--paper));
647
+ }
648
+
649
+ .branch-chip.more {
650
+ background: var(--paper-3);
651
+ color: var(--ink-3);
652
+ border: 1px solid var(--rule);
653
+ }
654
+
655
+ .branch-chip-remove {
656
+ opacity: 0.55;
657
+ font-size: 10px;
658
+ margin-left: 2px;
659
+ line-height: 1;
660
+ }
661
+
662
+ .branch-chip-remove:hover {
663
+ opacity: 1;
664
+ }
665
+
666
+ .branch-seg {
667
+ display: flex;
668
+ gap: 1px;
669
+ background: var(--rule);
670
+ border-radius: 5px;
671
+ overflow: hidden;
672
+ font-size: 10.5px;
673
+ }
674
+
675
+ .branch-seg-item {
676
+ padding: 3px 9px;
677
+ background: var(--paper);
678
+ color: var(--ink-2);
679
+ cursor: pointer;
680
+ user-select: none;
681
+ white-space: nowrap;
682
+ }
683
+
684
+ .branch-seg-item.active {
685
+ background: var(--accent);
686
+ color: #fff;
687
+ font-weight: 600;
688
+ }
689
+
690
+ .branch-label {
691
+ color: var(--ink-3);
692
+ font-size: 10px;
693
+ text-transform: uppercase;
694
+ letter-spacing: 0.06em;
695
+ white-space: nowrap;
696
+ }
697
+
698
+ .branch-picker {
699
+ position: absolute;
700
+ top: calc(100% + 4px);
701
+ left: 0;
702
+ z-index: 100;
703
+ background: var(--paper);
704
+ border: 1px solid var(--rule-2);
705
+ border-radius: 6px;
706
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12);
707
+ min-width: 320px;
708
+ overflow: hidden;
709
+ }
710
+
711
+ .branch-picker-item {
712
+ padding: 7px 12px;
713
+ cursor: pointer;
714
+ font-size: 11.5px;
715
+ font-family: var(--font-mono, 'JetBrains Mono', monospace);
716
+ display: flex;
717
+ align-items: center;
718
+ gap: 8px;
719
+ }
720
+
721
+ .branch-picker-main {
722
+ overflow-wrap: anywhere;
723
+ }
724
+
725
+ .branch-picker-item:hover {
726
+ background: var(--paper-2);
727
+ }
728
+
729
+ .branch-picker-item.active {
730
+ color: var(--accent);
731
+ font-weight: 600;
732
+ }
733
+
734
+ .branch-picker-item-selectable {
735
+ justify-content: space-between;
736
+ }
737
+
738
+ .branch-picker-check {
739
+ flex-shrink: 0;
740
+ accent-color: var(--accent);
741
+ }
742
+
743
+ .branch-picker-item-disabled {
744
+ display: block;
745
+ cursor: not-allowed;
746
+ background: color-mix(in oklch, var(--accent) 5%, var(--paper));
747
+ }
748
+
749
+ .branch-picker-item-disabled:hover {
750
+ background: color-mix(in oklch, var(--accent) 5%, var(--paper));
751
+ }
752
+
753
+ .branch-picker-error {
754
+ margin-top: 2px;
755
+ color: var(--ink-3);
756
+ font-family: inherit;
757
+ font-size: 10px;
758
+ line-height: 1.35;
759
+ white-space: normal;
760
+ overflow-wrap: anywhere;
761
+ }
762
+
763
+ .signal-dots {
764
+ display: inline-flex;
765
+ align-items: center;
766
+ gap: 2px;
767
+ margin-left: 4px;
768
+ }
769
+
770
+ .signal-dot {
771
+ width: 5px;
772
+ height: 5px;
773
+ border-radius: 50%;
774
+ flex-shrink: 0;
775
+ }
776
+
777
+ .signal-dot-0 { background: var(--accent); }
778
+ .signal-dot-1 { background: #5c7aa8; }
779
+
780
+ .field-row.overlay-ghost {
781
+ opacity: 0.7;
782
+ background: color-mix(in oklch, var(--ink) 6%, var(--paper));
783
+ }
784
+
785
+ .field-row.overlay-ghost .name {
786
+ font-style: italic;
787
+ }
788
+
789
+ .overlay-stripe-0 {
790
+ border-left: 3px solid var(--accent);
791
+ background: color-mix(in oklch, var(--ink) 8%, var(--paper));
792
+ }
793
+
794
+ .overlay-stripe-1 {
795
+ border-left: 3px solid #5c7aa8;
796
+ background: color-mix(in oklch, var(--ink) 8%, var(--paper));
797
+ }
798
+
799
+ .overlay-conflict {
800
+ border-left: 3px solid #c44;
801
+ background: color-mix(in oklch, #c44 5%, var(--paper));
802
+ }
803
+
804
+ .overlay-legend {
805
+ display: flex;
806
+ align-items: center;
807
+ gap: 10px;
808
+ padding: 6px 12px;
809
+ background: var(--paper-2);
810
+ border-bottom: 1px dashed var(--rule);
811
+ flex-wrap: wrap;
812
+ }
813
+
814
+ .overlay-legend-item {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ gap: 5px;
818
+ font-size: 10.5px;
819
+ color: var(--ink-2);
820
+ }
821
+
822
+ .overlay-legend-swatch {
823
+ width: 10px;
824
+ height: 10px;
825
+ border-radius: 2px;
826
+ flex-shrink: 0;
827
+ }