mellos-mapping 0.20.2 → 0.22.1

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 (68) hide show
  1. package/README.md +125 -88
  2. package/README.zh-CN.md +122 -84
  3. package/dist/hook-session-start.mjs +25 -19
  4. package/dist/mmap.mjs +302 -170
  5. package/dist/preview.mjs +1418 -0
  6. package/dist/server.mjs +1198 -400
  7. package/dist/store-paths.mjs +40 -21
  8. package/dist/terminal-worker.mjs +3188 -0
  9. package/dist/watch.mjs +523 -280
  10. package/dist/web/TERMINAL-LICENSES.txt +70 -0
  11. package/dist/web/app.css +967 -0
  12. package/dist/web/app.js +1356 -0
  13. package/dist/web/index.html +9 -0
  14. package/dist/web/terminal.css +9 -0
  15. package/dist/web/terminal.html +7 -0
  16. package/dist/web/terminal.js +9293 -0
  17. package/dist/web/xterm.css +285 -0
  18. package/dist/web.mjs +5535 -0
  19. package/docs/codex.md +183 -0
  20. package/lib/domain/text.d.ts +9 -0
  21. package/lib/domain/text.js +43 -0
  22. package/lib/domain/types.js +10 -1
  23. package/lib/preview/index.d.ts +3 -0
  24. package/lib/preview/index.js +3 -0
  25. package/lib/preview/markdown.d.ts +8 -0
  26. package/lib/preview/markdown.js +54 -0
  27. package/lib/preview/presentation.d.ts +6 -0
  28. package/lib/preview/presentation.js +14 -0
  29. package/lib/preview/publisher.d.ts +23 -0
  30. package/lib/preview/publisher.js +143 -0
  31. package/lib/preview/svg.d.ts +3 -0
  32. package/lib/preview/svg.js +74 -0
  33. package/lib/preview/text.d.ts +4 -0
  34. package/lib/preview/text.js +13 -0
  35. package/lib/render/canvas.d.ts +1 -1
  36. package/lib/render/canvas.js +4 -2
  37. package/lib/render/draw.js +9 -6
  38. package/lib/render/render.d.ts +6 -0
  39. package/lib/render/render.js +50 -18
  40. package/lib/render/width.js +3 -1
  41. package/lib/store/atomic.d.ts +18 -0
  42. package/lib/store/atomic.js +86 -0
  43. package/lib/store/channels.d.ts +40 -0
  44. package/lib/store/channels.js +135 -0
  45. package/lib/store/format.js +3 -1
  46. package/lib/store/json-text.d.ts +9 -0
  47. package/lib/store/json-text.js +16 -0
  48. package/lib/store/maps.d.ts +12 -0
  49. package/lib/store/maps.js +42 -0
  50. package/lib/store/migration.d.ts +12 -0
  51. package/lib/store/migration.js +46 -0
  52. package/lib/store/pages.d.ts +46 -0
  53. package/lib/store/pages.js +89 -0
  54. package/lib/store/policy.d.ts +74 -0
  55. package/lib/store/policy.js +144 -0
  56. package/lib/store/store.d.ts +9 -256
  57. package/lib/store/store.js +10 -694
  58. package/lib/store/viewers.d.ts +81 -0
  59. package/lib/store/viewers.js +186 -0
  60. package/package.json +25 -6
  61. package/scripts/codex-cli.mjs +42 -0
  62. package/scripts/codex-register.mjs +27 -94
  63. package/scripts/mmap.mjs +26 -16
  64. package/scripts/open-pane.mjs +37 -18
  65. package/scripts/pane-core.mjs +57 -220
  66. package/scripts/terminal-session.mjs +137 -0
  67. package/scripts/tmux-session.mjs +90 -0
  68. package/scripts/watcher-command.mjs +16 -0
@@ -0,0 +1,967 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg:#101419;
4
+ --panel:#171d24;
5
+ --card:#1b242d;
6
+ --surface:#131a21;
7
+ --line:#2b3540;
8
+ --text:#e6ecf1;
9
+ --muted:#8d9ba9;
10
+ --faint:#5e6e7e;
11
+ --accent:#74dfc0;
12
+ --dot:#2a343d;
13
+ --shadow:0 8px 24px #0003;
14
+ --detail-height:210px;
15
+ font-family:
16
+ Inter,
17
+ "Segoe UI",
18
+ "Microsoft YaHei",
19
+ sans-serif;
20
+ font-synthesis: none;
21
+ }
22
+ * {
23
+ box-sizing: border-box;
24
+ }
25
+ html,
26
+ body {
27
+ margin: 0;
28
+ height: 100%;
29
+ overflow: hidden;
30
+ }
31
+ body {
32
+ background: var(--bg);
33
+ color: var(--text);
34
+ font-size: 13px;
35
+ }
36
+ button,
37
+ input,
38
+ select {
39
+ font: inherit;
40
+ }
41
+ button {
42
+ color: inherit;
43
+ cursor: pointer;
44
+ background: transparent;
45
+ border: 1px solid transparent;
46
+ border-radius: 7px;
47
+ }
48
+ button:hover {
49
+ background: var(--line);
50
+ }
51
+ button:focus-visible,
52
+ select:focus-visible,
53
+ input:focus-visible,
54
+ [tabindex]:focus-visible {
55
+ outline: 2px solid var(--accent);
56
+ outline-offset: 3px;
57
+ }
58
+ button:disabled {
59
+ opacity: .35;
60
+ cursor: default;
61
+ }
62
+ input,
63
+ select {
64
+ color: var(--text);
65
+ background: var(--panel);
66
+ border: 1px solid var(--line);
67
+ border-radius: 7px;
68
+ }
69
+ button,
70
+ select,
71
+ input {
72
+ min-height: 30px;
73
+ }
74
+ button[hidden],
75
+ [hidden] {
76
+ display: none !important;
77
+ }
78
+ #app {
79
+ height: 100dvh;
80
+ display: flex;
81
+ flex-direction: column;
82
+ min-width: 340px;
83
+ }
84
+ header {
85
+ height: 64px;
86
+ flex-shrink: 0;
87
+ padding: 0 26px;
88
+ display: flex;
89
+ align-items: center;
90
+ justify-content: space-between;
91
+ border-bottom: 1px solid var(--line);
92
+ }
93
+ .brand {
94
+ display: flex;
95
+ gap: 11px;
96
+ align-items: center;
97
+ font-size: 18px;
98
+ font-weight: 650;
99
+ letter-spacing: -.3px;
100
+ }
101
+ .brand-mark {
102
+ width: 34px;
103
+ height: 34px;
104
+ border-radius: 9px;
105
+ background: #74dfc017;
106
+ border: 1px solid #74dfc042;
107
+ display: grid;
108
+ place-items: center;
109
+ color: var(--accent);
110
+ }
111
+ .brand-mark svg {
112
+ width: 24px;
113
+ fill: none;
114
+ stroke: currentColor;
115
+ stroke-width: 1.5;
116
+ stroke-linejoin: round;
117
+ }
118
+ .brand-sub {
119
+ font-size: 11px;
120
+ font-weight: 400;
121
+ color: var(--muted);
122
+ margin-left: 12px;
123
+ letter-spacing: .8px;
124
+ }
125
+ .header-actions {
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 9px;
129
+ }
130
+ .icon-button {
131
+ width: 32px;
132
+ font-size: 17px;
133
+ color: var(--muted);
134
+ }
135
+ #connection {
136
+ font-size: 11px;
137
+ color: var(--muted);
138
+ margin-right: 8px;
139
+ white-space: nowrap;
140
+ }
141
+ #connection i {
142
+ display: inline-block;
143
+ width: 6px;
144
+ height: 6px;
145
+ border-radius: 50%;
146
+ background: var(--accent);
147
+ margin-right: 7px;
148
+ }
149
+ #connection.offline i {
150
+ background: #e3b771;
151
+ }
152
+ .map-heading {
153
+ padding: 22px 26px 16px;
154
+ flex-shrink: 0;
155
+ }
156
+ .project-line {
157
+ display: flex;
158
+ gap: 10px;
159
+ font-size: 11px;
160
+ color: var(--muted);
161
+ margin-bottom: 11px;
162
+ }
163
+ .project-line span:first-child {
164
+ color: var(--accent);
165
+ }
166
+ .title-row {
167
+ display: flex;
168
+ gap: 18px;
169
+ align-items: center;
170
+ justify-content: space-between;
171
+ }
172
+ h1 {
173
+ font-size: 23px;
174
+ font-weight: 600;
175
+ letter-spacing: -.4px;
176
+ line-height: 1.4;
177
+ margin: 0;
178
+ overflow: hidden;
179
+ text-overflow: ellipsis;
180
+ white-space: nowrap;
181
+ }
182
+ #pages {
183
+ max-width: 170px;
184
+ width: 140px;
185
+ padding: 5px 9px;
186
+ font-size: 11px;
187
+ }
188
+ #breadcrumbs {
189
+ display: flex;
190
+ gap: 4px;
191
+ align-items: center;
192
+ font-size: 11px;
193
+ color: var(--muted);
194
+ }
195
+ #breadcrumbs:empty {
196
+ display: none;
197
+ }
198
+ #breadcrumbs button {
199
+ padding: 0 5px;
200
+ }
201
+ .progress-row {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 14px;
205
+ margin-top: 13px;
206
+ font-size: 11px;
207
+ color: var(--muted);
208
+ }
209
+ #summary {
210
+ white-space: nowrap;
211
+ }
212
+ #summary b {
213
+ color: var(--text);
214
+ font-weight: 500;
215
+ }
216
+ #progress {
217
+ height: 3px;
218
+ background: var(--line);
219
+ max-width: 110px;
220
+ flex: 1;
221
+ min-width: 25px;
222
+ border-radius: 5px;
223
+ overflow: hidden;
224
+ }
225
+ #progress i {
226
+ display: block;
227
+ background: var(--accent);
228
+ height: 100%;
229
+ transition: width .4s;
230
+ }
231
+ .follow {
232
+ margin-left: auto;
233
+ font-size: 11px;
234
+ color: var(--muted);
235
+ padding: 2px 8px;
236
+ white-space: nowrap;
237
+ }
238
+ .follow.active {
239
+ color: var(--accent);
240
+ background: #74dfc00d;
241
+ }
242
+ .toolbar {
243
+ padding: 0 26px 15px;
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 8px;
247
+ }
248
+ .search {
249
+ display: flex;
250
+ align-items: center;
251
+ position: relative;
252
+ flex: 1;
253
+ max-width: 360px;
254
+ }
255
+ .search input {
256
+ width: 100%;
257
+ padding: 8px 35px;
258
+ min-height: 36px;
259
+ font-size: 12px;
260
+ }
261
+ .search svg {
262
+ position: absolute;
263
+ left: 11px;
264
+ width: 15px;
265
+ height: 15px;
266
+ stroke: var(--muted);
267
+ fill: none;
268
+ stroke-width: 1.5;
269
+ }
270
+ .search kbd {
271
+ position: absolute;
272
+ right: 11px;
273
+ color: var(--faint);
274
+ font-size: 10px;
275
+ }
276
+ .search input::placeholder {
277
+ color: var(--faint);
278
+ }
279
+ .tool-button {
280
+ border-color: var(--line);
281
+ font-size: 11px;
282
+ padding: 6px 11px;
283
+ white-space: nowrap;
284
+ }
285
+ .tool-button[aria-pressed=true] {
286
+ color: var(--accent);
287
+ border-color: #74dfc070;
288
+ }
289
+ .canvas-shell {
290
+ flex: 1;
291
+ min-height: 160px;
292
+ position: relative;
293
+ background: var(--surface);
294
+ border-block: 1px solid var(--line);
295
+ overflow: hidden;
296
+ }
297
+ #viewport {
298
+ position: absolute;
299
+ inset: 37px 0 0;
300
+ overflow: hidden;
301
+ touch-action: none;
302
+ cursor: grab;
303
+ background-image: radial-gradient(var(--dot) .8px, transparent .8px);
304
+ background-size: 20px 20px;
305
+ }
306
+ #viewport.dragging {
307
+ cursor: grabbing;
308
+ }
309
+ #stage {
310
+ position: absolute;
311
+ inset: 0;
312
+ }
313
+ .map-scene {
314
+ display: block;
315
+ width: 100%;
316
+ height: 100%;
317
+ }
318
+ .band {
319
+ font-size: 11px;
320
+ fill: var(--muted);
321
+ pointer-events: none;
322
+ }
323
+ .band line,
324
+ .band-rank-box {
325
+ stroke: var(--line);
326
+ stroke-width: 1;
327
+ fill: none;
328
+ }
329
+ .band-rank {
330
+ font-size: 10px;
331
+ fill: var(--faint);
332
+ }
333
+ .band-count {
334
+ fill: var(--faint);
335
+ }
336
+ .lane-label {
337
+ fill: var(--muted);
338
+ font-size: 11px;
339
+ pointer-events: none;
340
+ }
341
+ .wires {
342
+ pointer-events: none;
343
+ }
344
+ .edge {
345
+ transition: opacity .15s;
346
+ }
347
+ .edge path {
348
+ fill: none;
349
+ stroke: #637483;
350
+ stroke-width: 1.4;
351
+ }
352
+ .edge text {
353
+ fill: var(--muted);
354
+ font-size: 10px;
355
+ paint-order: stroke;
356
+ stroke: var(--surface);
357
+ stroke-width: 5px;
358
+ stroke-linejoin: round;
359
+ }
360
+ .edge.focus path {
361
+ stroke: var(--accent);
362
+ stroke-width: 2;
363
+ }
364
+ .edge.focus text {
365
+ fill: var(--accent);
366
+ }
367
+ .node {
368
+ --node-fill: var(--card);
369
+ --node-stroke: var(--line);
370
+ --status-color: var(--muted);
371
+ cursor: pointer;
372
+ transition: opacity .15s;
373
+ }
374
+ .node-card {
375
+ fill: var(--node-fill);
376
+ stroke: var(--node-stroke);
377
+ stroke-width: 1;
378
+ }
379
+ .node:hover .node-card,
380
+ .node.focus .node-card,
381
+ .node:focus-visible .node-card {
382
+ stroke: var(--accent);
383
+ stroke-width: 1.5;
384
+ }
385
+ .node-head {
386
+ font-size: 10px;
387
+ fill: var(--status-color);
388
+ }
389
+ .status-dot {
390
+ fill: var(--status-color);
391
+ }
392
+ .node-kind {
393
+ opacity: .7;
394
+ }
395
+ .node-title {
396
+ fill: var(--text);
397
+ font-size: 16px;
398
+ font-weight: 550;
399
+ letter-spacing: .1px;
400
+ }
401
+ .node-foot {
402
+ fill: var(--faint);
403
+ font-size: 10px;
404
+ }
405
+ .submap-badge {
406
+ fill: var(--accent);
407
+ font-size: 10px;
408
+ }
409
+ .node.planned .node-card {
410
+ stroke-dasharray: 5 4;
411
+ }
412
+ .node.done {
413
+ --node-stroke: #37594f;
414
+ --status-color: #7adcb4;
415
+ }
416
+ .node.in-progress {
417
+ --node-stroke: #a3884c;
418
+ --node-fill: #28261e;
419
+ --status-color: #e6c579;
420
+ }
421
+ .node.in-progress .status-dot {
422
+ fill: none;
423
+ stroke: var(--status-color);
424
+ stroke-width: 1.5;
425
+ stroke-dasharray: 13 6;
426
+ animation: spin 1s linear infinite;
427
+ }
428
+ .node.regressed {
429
+ --node-stroke: #904d54;
430
+ --status-color: #e88d94;
431
+ }
432
+ .node.unverified {
433
+ --status-color: #d3b58c;
434
+ }
435
+ .node.unverified .status-dot {
436
+ fill: none;
437
+ stroke: var(--status-color);
438
+ stroke-width: 1;
439
+ }
440
+ .muted-node {
441
+ opacity: .2;
442
+ }
443
+ .muted-edge {
444
+ opacity: .12;
445
+ }
446
+ .filters {
447
+ position: absolute;
448
+ top: 0;
449
+ left: 0;
450
+ right: 0;
451
+ height: 37px;
452
+ display: flex;
453
+ gap: 5px;
454
+ align-items: center;
455
+ padding: 0 24px;
456
+ background: var(--surface);
457
+ border-bottom: 1px solid #ffffff04;
458
+ overflow-x: auto;
459
+ scrollbar-width: none;
460
+ }
461
+ .filters button {
462
+ font-size: 10px;
463
+ color: var(--muted);
464
+ padding: 4px 8px;
465
+ white-space: nowrap;
466
+ min-height: 25px;
467
+ display: flex;
468
+ gap: 6px;
469
+ align-items: center;
470
+ }
471
+ .filters button.active {
472
+ background: var(--line);
473
+ color: var(--text);
474
+ }
475
+ .filters i {
476
+ width: 5px;
477
+ height: 5px;
478
+ display: inline-block;
479
+ border-radius: 50%;
480
+ background: var(--muted);
481
+ }
482
+ .filters .done {
483
+ background: #7adcb4;
484
+ }
485
+ .filters .in-progress {
486
+ background: #e6c579;
487
+ }
488
+ .filters .regressed {
489
+ background: #e88d94;
490
+ }
491
+ .filters .unverified {
492
+ background: #d3b58c;
493
+ }
494
+ .zoom-controls {
495
+ position: absolute;
496
+ left: 24px;
497
+ bottom: 17px;
498
+ display: flex;
499
+ gap: 3px;
500
+ align-items: center;
501
+ padding: 3px;
502
+ background: var(--panel);
503
+ border: 1px solid var(--line);
504
+ border-radius: 8px;
505
+ box-shadow: var(--shadow);
506
+ }
507
+ .zoom-controls button {
508
+ width: 28px;
509
+ font-size: 18px;
510
+ }
511
+ .zoom-controls output {
512
+ width: 44px;
513
+ font-size: 10px;
514
+ text-align: center;
515
+ color: var(--muted);
516
+ }
517
+ .zoom-controls > span {
518
+ height: 17px;
519
+ width: 1px;
520
+ background: var(--line);
521
+ margin: 0 3px;
522
+ }
523
+ #minimap {
524
+ position: absolute;
525
+ right: 24px;
526
+ bottom: 17px;
527
+ width: 110px;
528
+ height: auto;
529
+ max-height: 90px;
530
+ border: 1px solid var(--line);
531
+ border-radius: 7px;
532
+ background: var(--panel);
533
+ padding: 7px;
534
+ cursor: crosshair;
535
+ box-shadow: var(--shadow);
536
+ line-height: 0;
537
+ }
538
+ #minimap svg {
539
+ width: 100%;
540
+ max-height: 70px;
541
+ }
542
+ #minimap .mini-node {
543
+ fill: var(--faint);
544
+ }
545
+ #minimap .mini-window {
546
+ fill: #74dfc00b;
547
+ stroke: var(--accent);
548
+ stroke-width: 5;
549
+ }
550
+ #match-count {
551
+ position: absolute;
552
+ left: 24px;
553
+ top: 48px;
554
+ font-size: 11px;
555
+ color: var(--accent);
556
+ pointer-events: none;
557
+ }
558
+ #empty {
559
+ position: absolute;
560
+ inset: 0;
561
+ display: grid;
562
+ place-content: center;
563
+ text-align: center;
564
+ color: var(--muted);
565
+ padding: 50px;
566
+ font-size: 13px;
567
+ white-space: pre-wrap;
568
+ line-height: 1.8;
569
+ }
570
+ #divider {
571
+ height: 13px;
572
+ flex-shrink: 0;
573
+ display: flex;
574
+ align-items: center;
575
+ justify-content: center;
576
+ background: var(--panel);
577
+ cursor: row-resize;
578
+ touch-action: none;
579
+ }
580
+ #divider i {
581
+ width: 34px;
582
+ height: 3px;
583
+ background: var(--line);
584
+ border-radius: 4px;
585
+ }
586
+ #divider:hover i {
587
+ background: var(--accent);
588
+ }
589
+ #inspector {
590
+ height: var(--detail-height);
591
+ min-height: 100px;
592
+ max-height: 50vh;
593
+ overflow-y: auto;
594
+ flex-shrink: 0;
595
+ background: var(--panel);
596
+ padding: 9px 26px 17px;
597
+ scrollbar-width: thin;
598
+ scrollbar-color: var(--line) transparent;
599
+ }
600
+ .inspector-heading {
601
+ display: flex;
602
+ align-items: center;
603
+ justify-content: space-between;
604
+ gap: 16px;
605
+ margin-bottom: 11px;
606
+ }
607
+ .eyebrow {
608
+ font-size: 9px;
609
+ letter-spacing: 1.2px;
610
+ color: var(--muted);
611
+ }
612
+ h2 {
613
+ font-size: 17px;
614
+ font-weight: 550;
615
+ margin: 6px 0 0;
616
+ line-height: 1.4;
617
+ }
618
+ .quiet {
619
+ font-size: 11px;
620
+ color: var(--faint);
621
+ }
622
+ .overview-grid {
623
+ display: grid;
624
+ grid-template-columns: repeat(4, 1fr);
625
+ gap: 12px;
626
+ margin-top: 17px;
627
+ }
628
+ .overview-grid > div {
629
+ border-right: 1px solid var(--line);
630
+ display: flex;
631
+ flex-direction: column;
632
+ gap: 7px;
633
+ }
634
+ .overview-grid > div:last-child {
635
+ border-right: 0;
636
+ }
637
+ .overview-grid strong {
638
+ font-size: 23px;
639
+ font-weight: 450;
640
+ letter-spacing: -.5px;
641
+ }
642
+ .overview-grid span {
643
+ color: var(--muted);
644
+ font-size: 10px;
645
+ }
646
+ .inspector-hint {
647
+ font-size: 11px;
648
+ line-height: 1.8;
649
+ color: var(--muted);
650
+ margin: 18px 0 0;
651
+ }
652
+ .node-description {
653
+ font-size: 12px;
654
+ line-height: 1.9;
655
+ white-space: pre-wrap;
656
+ color: var(--muted);
657
+ margin: 0 0 13px;
658
+ }
659
+ .evidence {
660
+ background: #74dfc009;
661
+ border-left: 2px solid #74dfc055;
662
+ padding: 9px 12px;
663
+ margin-bottom: 13px;
664
+ }
665
+ .evidence > span {
666
+ font-size: 9px;
667
+ letter-spacing: 1px;
668
+ color: var(--accent);
669
+ }
670
+ .evidence p {
671
+ font-size: 11px;
672
+ line-height: 1.8;
673
+ margin: 5px 0 0;
674
+ white-space: pre-wrap;
675
+ overflow-wrap: anywhere;
676
+ }
677
+ .evidence.regressed {
678
+ border-color: #e88d94;
679
+ }
680
+ .evidence.regressed > span {
681
+ color: #e88d94;
682
+ }
683
+ .neighbor-grid {
684
+ display: grid;
685
+ grid-template-columns: 1fr 1fr;
686
+ gap: 18px;
687
+ }
688
+ .relations > div {
689
+ display: flex;
690
+ flex-wrap: wrap;
691
+ gap: 5px;
692
+ margin-top: 8px;
693
+ }
694
+ .relation {
695
+ padding: 4px 7px;
696
+ border: 1px solid var(--line);
697
+ font-size: 10px;
698
+ display: inline-flex;
699
+ gap: 10px;
700
+ align-items: center;
701
+ text-align: left;
702
+ }
703
+ .relation > span {
704
+ color: var(--faint);
705
+ }
706
+ .relation small {
707
+ color: var(--muted);
708
+ font-size: 9px;
709
+ }
710
+ .group-members {
711
+ display: flex;
712
+ gap: 7px;
713
+ flex-wrap: wrap;
714
+ margin-bottom: 13px;
715
+ }
716
+ .dive-button {
717
+ border-color: #74dfc040;
718
+ color: var(--accent);
719
+ font-size: 11px;
720
+ padding: 7px 10px;
721
+ margin-bottom: 13px;
722
+ }
723
+ .dive-button > span {
724
+ margin-left: 20px;
725
+ }
726
+ footer {
727
+ height: 29px;
728
+ flex-shrink: 0;
729
+ border-top: 1px solid var(--line);
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: space-between;
733
+ padding: 0 26px;
734
+ color: var(--faint);
735
+ font-size: 9px;
736
+ gap: 12px;
737
+ }
738
+ #toast {
739
+ position: fixed;
740
+ left: 50%;
741
+ bottom: 38px;
742
+ transform: translateX(-50%);
743
+ background: var(--card);
744
+ border: 1px solid var(--line);
745
+ border-radius: 8px;
746
+ box-shadow: var(--shadow);
747
+ padding: 12px 18px;
748
+ font-size: 12px;
749
+ z-index: 5;
750
+ max-width: 90%;
751
+ line-height: 1.6;
752
+ }
753
+ dialog {
754
+ background: var(--panel);
755
+ color: var(--text);
756
+ border: 1px solid var(--line);
757
+ border-radius: 12px;
758
+ padding: 24px;
759
+ max-width: 430px;
760
+ width: calc(100% - 40px);
761
+ box-shadow: 0 25px 80px #0008;
762
+ }
763
+ dialog::backdrop {
764
+ background: #05090da8;
765
+ backdrop-filter: blur(4px);
766
+ }
767
+ dialog p {
768
+ color: var(--muted);
769
+ font-size: 12px;
770
+ line-height: 2;
771
+ white-space: pre-line;
772
+ }
773
+ .dialog-actions {
774
+ display: flex;
775
+ gap: 9px;
776
+ justify-content: flex-end;
777
+ margin-top: 25px;
778
+ }
779
+ .dialog-actions button {
780
+ padding: 7px 13px;
781
+ border-color: var(--line);
782
+ }
783
+ .dialog-actions .danger {
784
+ color: #f4b1b5;
785
+ background: #9e404430;
786
+ border-color: #9e4044;
787
+ }
788
+ [data-theme=light] {
789
+ color-scheme: light;
790
+ --bg:#f8fafb;
791
+ --panel:#fff;
792
+ --card:#fff;
793
+ --surface:#f2f5f6;
794
+ --line:#dce3e7;
795
+ --text:#253943;
796
+ --muted:#647b87;
797
+ --faint:#8b9da6;
798
+ --accent:#207e69;
799
+ --dot:#d3dde1;
800
+ --shadow:0 4px 13px #263c4708;
801
+ }
802
+ [data-theme=light] .node.in-progress {
803
+ --node-fill: #fffaf0;
804
+ --node-stroke: #d0b97c;
805
+ --status-color: #97722a;
806
+ }
807
+ [data-theme=light] .node.done {
808
+ --node-stroke: #a2c7b8;
809
+ --status-color: #288067;
810
+ }
811
+ [data-theme=light] .node.regressed {
812
+ --node-stroke: #d4a0a7;
813
+ --status-color: #b04a59;
814
+ }
815
+ [data-theme=light] .node.unverified {
816
+ --status-color: #a07839;
817
+ }
818
+ @keyframes spin {
819
+ to {
820
+ stroke-dashoffset: -19;
821
+ }
822
+ }
823
+ @media (prefers-reduced-motion: reduce) {
824
+ *,
825
+ *::before,
826
+ *::after {
827
+ animation: none !important;
828
+ transition: none !important;
829
+ }
830
+ }
831
+ @media (max-width: 620px) {
832
+ header {
833
+ padding: 0 17px;
834
+ height: 55px;
835
+ }
836
+ .brand-sub {
837
+ display: none;
838
+ }
839
+ .map-heading {
840
+ padding: 17px 17px 12px;
841
+ }
842
+ h1 {
843
+ font-size: 19px;
844
+ }
845
+ .title-row {
846
+ gap: 10px;
847
+ }
848
+ #pages {
849
+ max-width: 108px;
850
+ font-size: 10px;
851
+ }
852
+ .toolbar {
853
+ padding: 0 17px 12px;
854
+ gap: 5px;
855
+ }
856
+ .filters {
857
+ padding: 0 10px;
858
+ gap: 0;
859
+ }
860
+ .filters button {
861
+ padding-inline: 6px;
862
+ font-size: 9px;
863
+ }
864
+ .progress-row {
865
+ gap: 9px;
866
+ }
867
+ #progress {
868
+ max-width: 60px;
869
+ }
870
+ #inspector {
871
+ padding-inline: 17px;
872
+ }
873
+ .zoom-controls {
874
+ left: 17px;
875
+ }
876
+ #minimap {
877
+ right: 17px;
878
+ width: 90px;
879
+ }
880
+ footer {
881
+ padding-inline: 17px;
882
+ font-size: 8px;
883
+ }
884
+ .tool-button {
885
+ padding-inline: 8px;
886
+ }
887
+ }
888
+ @media (max-height: 720px) {
889
+ header {
890
+ height: 48px;
891
+ }
892
+ .map-heading {
893
+ padding-top: 12px;
894
+ padding-bottom: 10px;
895
+ }
896
+ .project-line {
897
+ margin-bottom: 6px;
898
+ }
899
+ .progress-row {
900
+ margin-top: 8px;
901
+ }
902
+ .toolbar {
903
+ padding-bottom: 10px;
904
+ }
905
+ #inspector {
906
+ height: 150px;
907
+ }
908
+ .overview-grid {
909
+ margin-top: 10px;
910
+ }
911
+ .inspector-hint {
912
+ margin-top: 12px;
913
+ }
914
+ }
915
+ .node-title {
916
+ font-size: 16px;
917
+ }
918
+ @media (min-width: 1100px) {
919
+ #app {
920
+ display: grid;
921
+ grid-template-columns: minmax(0, 1fr) 300px;
922
+ grid-template-rows: 58px auto auto minmax(0, 1fr) 29px;
923
+ }
924
+ header {
925
+ grid-column: 1 / -1;
926
+ height: auto;
927
+ }
928
+ .map-heading,
929
+ .toolbar {
930
+ grid-column: 1;
931
+ }
932
+ .canvas-shell {
933
+ grid-column: 1;
934
+ grid-row: 4;
935
+ }
936
+ #divider {
937
+ display: none;
938
+ }
939
+ #inspector {
940
+ grid-column: 2;
941
+ grid-row: 2 / 5;
942
+ height: auto;
943
+ max-height: none;
944
+ min-height: 0;
945
+ border-left: 1px solid var(--line);
946
+ padding: 24px 20px;
947
+ }
948
+ .inspector-heading {
949
+ align-items: start;
950
+ }
951
+ .inspector-heading > .quiet {
952
+ display: none;
953
+ }
954
+ .overview-grid {
955
+ grid-template-columns: repeat(2, 1fr);
956
+ gap: 24px 12px;
957
+ }
958
+ .overview-grid > div:nth-child(2) {
959
+ border: 0;
960
+ }
961
+ .neighbor-grid {
962
+ grid-template-columns: 1fr;
963
+ }
964
+ footer {
965
+ grid-column: 1 / -1;
966
+ }
967
+ }