ketatlas 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 (51) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE.md +10 -0
  4. package/README.md +130 -0
  5. package/assets/INTER-LICENSE +93 -0
  6. package/assets/KETJS-LICENSE +21 -0
  7. package/assets/LUCIDE-LICENSE +43 -0
  8. package/assets/design-system.lock.json +56 -0
  9. package/assets/inter-latin-wght-normal.woff2 +0 -0
  10. package/assets/inter-vietnamese-wght-normal.woff2 +0 -0
  11. package/bin/audit.js +116 -0
  12. package/bin/ketatlas.js +148 -0
  13. package/bin/server.js +93 -0
  14. package/bin/viewer.js +20 -0
  15. package/docs/architecture.md +57 -0
  16. package/docs/authoring.md +49 -0
  17. package/docs/cli.md +70 -0
  18. package/docs/configuration.md +65 -0
  19. package/docs/integration.md +108 -0
  20. package/docs/migration.md +35 -0
  21. package/docs/releasing.md +40 -0
  22. package/package.json +59 -0
  23. package/schema.json +187 -0
  24. package/src/config.js +196 -0
  25. package/src/icons.js +23 -0
  26. package/src/index.d.ts +106 -0
  27. package/src/index.js +679 -0
  28. package/src/layout.js +103 -0
  29. package/src/template.js +38 -0
  30. package/styles/design-system.css +2838 -0
  31. package/styles/design-system.document.css +2838 -0
  32. package/styles/fonts.css +17 -0
  33. package/styles/ketatlas.css +992 -0
  34. package/templates/basic/README.md +14 -0
  35. package/templates/basic/atlas.json +45 -0
  36. package/templates/basic/ketatlas.schema.json +187 -0
  37. package/templates/basic/screens/done.html +18 -0
  38. package/templates/basic/screens/screen.css +48 -0
  39. package/templates/basic/screens/welcome.html +21 -0
  40. package/templates/basic/styles/LICENSE +21 -0
  41. package/templates/basic/styles/design-system.css +2838 -0
  42. package/templates/process/README.md +14 -0
  43. package/templates/process/atlas.json +83 -0
  44. package/templates/process/ketatlas.schema.json +187 -0
  45. package/templates/web/README.md +14 -0
  46. package/templates/web/atlas.json +77 -0
  47. package/templates/web/ketatlas.schema.json +187 -0
  48. package/templates/web/screens/demo.css +255 -0
  49. package/templates/web/screens/portal.html +41 -0
  50. package/templates/web/styles/LICENSE +21 -0
  51. package/templates/web/styles/design-system.css +2838 -0
@@ -0,0 +1,992 @@
1
+ /* Layout composition; tokens and primitives come from the pinned KetJS design system. */
2
+ :host {
3
+ display: block;
4
+ height: 100%;
5
+ min-height: 480px;
6
+ container-type: inline-size;
7
+ font-family: var(--kv-font-sans);
8
+ font-size: 16px;
9
+ color: var(--kv-text-main);
10
+ line-height: var(--kv-leading-normal);
11
+ }
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ box-sizing: border-box;
16
+ }
17
+ [hidden] {
18
+ display: none !important;
19
+ }
20
+ h1,
21
+ h2,
22
+ h3,
23
+ p {
24
+ margin: 0;
25
+ }
26
+ button,
27
+ input,
28
+ a {
29
+ font: inherit;
30
+ -webkit-tap-highlight-color: transparent;
31
+ }
32
+ button {
33
+ cursor: pointer;
34
+ }
35
+ button:not([data-ui]),
36
+ a:not([data-ui]) {
37
+ color: inherit;
38
+ }
39
+ button,
40
+ a {
41
+ touch-action: manipulation;
42
+ }
43
+ a {
44
+ text-decoration: none;
45
+ }
46
+ button:focus-visible,
47
+ a:focus-visible,
48
+ input:focus-visible {
49
+ outline: 2px solid var(--kv-focus-border);
50
+ outline-offset: 2px;
51
+ }
52
+ svg {
53
+ display: block;
54
+ width: 20px;
55
+ height: 20px;
56
+ flex: none;
57
+ }
58
+ button svg,
59
+ a svg {
60
+ pointer-events: none;
61
+ }
62
+ .grow {
63
+ flex: 1;
64
+ min-width: 0;
65
+ }
66
+ .icon-button {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ min-width: 44px;
71
+ min-height: 44px;
72
+ background: transparent;
73
+ border: 0;
74
+ border-radius: var(--kv-radius-md);
75
+ }
76
+ .icon-button:hover {
77
+ background: var(--kv-surface-hover);
78
+ }
79
+ .brand-mark {
80
+ width: 32px;
81
+ height: 32px;
82
+ border-radius: var(--kv-radius-md);
83
+ background: var(--kv-accent);
84
+ color: var(--kv-on-accent);
85
+ display: grid;
86
+ place-items: center;
87
+ font-weight: var(--kv-weight-bold);
88
+ }
89
+ .review-search {
90
+ margin: 0 var(--kv-space-3) var(--kv-space-3);
91
+ position: relative;
92
+ }
93
+ .review-search input {
94
+ width: 100%;
95
+ padding: var(--kv-space-3);
96
+ border: 1px solid var(--kv-input-border);
97
+ border-radius: var(--kv-radius-md);
98
+ background: var(--kv-input-bg);
99
+ color: var(--kv-text-main);
100
+ }
101
+ .mock-filter-empty {
102
+ padding: var(--kv-space-4);
103
+ color: var(--kv-text-muted);
104
+ font-size: var(--kv-text-sm);
105
+ }
106
+ .frame-error {
107
+ padding: var(--kv-space-3);
108
+ color: var(--kv-danger);
109
+ font-size: var(--kv-text-xs);
110
+ }
111
+ .flow-page {
112
+ height: 100%;
113
+ overflow: hidden;
114
+ display: flex;
115
+ flex-direction: column;
116
+ }
117
+ .map-header {
118
+ height: 72px;
119
+ flex: none;
120
+ display: flex;
121
+ align-items: center;
122
+ gap: var(--kv-space-6);
123
+ padding: var(--kv-space-3) var(--kv-space-5);
124
+ border-bottom: 1px solid var(--kv-panel-border);
125
+ background: var(--kv-panel-bg);
126
+ z-index: 2;
127
+ }
128
+ .map-brand {
129
+ display: flex;
130
+ gap: var(--kv-space-3);
131
+ align-items: center;
132
+ }
133
+ .map-brand strong {
134
+ font-size: var(--kv-text-base);
135
+ display: block;
136
+ }
137
+ .map-brand small {
138
+ font-size: var(--kv-text-xs);
139
+ color: var(--kv-text-muted);
140
+ display: block;
141
+ margin-top: var(--kv-space-1);
142
+ }
143
+ .map-total {
144
+ font-size: var(--kv-text-sm);
145
+ color: var(--kv-text-muted);
146
+ padding-left: var(--kv-space-6);
147
+ border-left: 1px solid var(--kv-panel-border);
148
+ }
149
+ .map-header-actions {
150
+ margin-left: auto;
151
+ display: flex;
152
+ gap: var(--kv-space-2);
153
+ align-items: center;
154
+ }
155
+ .map-header-actions a {
156
+ min-height: 40px;
157
+ }
158
+ .map-layout {
159
+ display: grid;
160
+ grid-template-columns: 248px minmax(0, 1fr);
161
+ min-height: 0;
162
+ flex: 1;
163
+ }
164
+ .map-sidebar {
165
+ display: flex;
166
+ flex-direction: column;
167
+ min-height: 0;
168
+ border-right: 1px solid var(--kv-panel-border);
169
+ background: var(--kv-panel-bg);
170
+ z-index: 2;
171
+ }
172
+ .map-sidebar-heading {
173
+ padding: var(--kv-space-5) var(--kv-space-4);
174
+ }
175
+ .map-sidebar-heading h1 {
176
+ font-size: var(--kv-text-lg);
177
+ font-weight: var(--kv-weight-semibold);
178
+ letter-spacing: -0.02em;
179
+ }
180
+ .map-sidebar-heading p {
181
+ font-size: var(--kv-text-xs);
182
+ color: var(--kv-text-muted);
183
+ margin-top: var(--kv-space-2);
184
+ }
185
+ .map-sidebar .review-search {
186
+ margin-bottom: var(--kv-space-2);
187
+ }
188
+ .map-sidebar .review-search input {
189
+ padding-left: var(--kv-space-3);
190
+ font-size: var(--kv-text-xs);
191
+ height: 42px;
192
+ }
193
+ #flow-list {
194
+ overflow-y: auto;
195
+ padding: 0 var(--kv-space-2) var(--kv-space-4);
196
+ flex: 1;
197
+ min-height: 0;
198
+ }
199
+ .flow-group-title {
200
+ font-size: var(--kv-text-2xs);
201
+ color: var(--kv-text-muted);
202
+ font-weight: var(--kv-weight-semibold);
203
+ text-transform: uppercase;
204
+ letter-spacing: 0.06em;
205
+ padding: var(--kv-space-5) var(--kv-space-3) var(--kv-space-2);
206
+ }
207
+ .flow-link {
208
+ border: 0;
209
+ background: transparent;
210
+ display: flex;
211
+ gap: var(--kv-space-3);
212
+ width: 100%;
213
+ padding: var(--kv-space-3);
214
+ text-align: left;
215
+ border-radius: var(--kv-radius-md);
216
+ align-items: flex-start;
217
+ color: var(--kv-text-secondary);
218
+ font-size: var(--kv-text-sm);
219
+ min-height: 52px;
220
+ }
221
+ .flow-link:hover {
222
+ background: var(--kv-surface-hover);
223
+ }
224
+ .flow-link.active {
225
+ background: var(--kv-accent-subtle);
226
+ color: var(--kv-accent);
227
+ }
228
+ .flow-link strong {
229
+ font-weight: var(--kv-weight-medium);
230
+ display: block;
231
+ line-height: var(--kv-leading-normal);
232
+ }
233
+ .flow-link small {
234
+ display: block;
235
+ font-size: var(--kv-text-2xs);
236
+ color: var(--kv-text-muted);
237
+ margin-top: var(--kv-space-1);
238
+ }
239
+ .flow-number {
240
+ font-size: var(--kv-text-xs);
241
+ line-height: 20px;
242
+ font-variant-numeric: tabular-nums;
243
+ color: var(--kv-text-muted);
244
+ }
245
+ .flow-link.active .flow-number {
246
+ color: var(--kv-accent);
247
+ }
248
+ .map-sidebar-footer {
249
+ display: flex;
250
+ gap: var(--kv-space-2);
251
+ align-items: flex-start;
252
+ border-top: 1px solid var(--kv-panel-border);
253
+ padding: var(--kv-space-4);
254
+ font-size: var(--kv-text-2xs);
255
+ color: var(--kv-text-muted);
256
+ line-height: var(--kv-leading-relaxed);
257
+ }
258
+ .map-live-dot {
259
+ display: block;
260
+ width: 6px;
261
+ height: 6px;
262
+ border-radius: var(--kv-radius-full);
263
+ background: var(--kv-positive);
264
+ margin-top: 5px;
265
+ flex: none;
266
+ }
267
+ #map-menu {
268
+ display: none;
269
+ }
270
+ .map-viewport {
271
+ position: relative;
272
+ min-width: 0;
273
+ min-height: 0;
274
+ overflow: hidden;
275
+ touch-action: none;
276
+ cursor: grab;
277
+ background-color: var(--kv-page-bg);
278
+ background-image: radial-gradient(var(--kv-panel-border) 1px, transparent 1px);
279
+ background-size: 24px 24px;
280
+ outline: none;
281
+ }
282
+ .map-viewport:focus-visible {
283
+ outline: 2px solid var(--kv-focus-border);
284
+ outline-offset: -2px;
285
+ }
286
+ .map-viewport.dragging,
287
+ .map-viewport.dragging * {
288
+ cursor: grabbing !important;
289
+ user-select: none;
290
+ }
291
+ .map-world {
292
+ position: absolute;
293
+ left: 0;
294
+ top: 0;
295
+ transform-origin: 0 0;
296
+ will-change: transform;
297
+ user-select: none;
298
+ }
299
+ .map-edges {
300
+ position: absolute;
301
+ left: 0;
302
+ top: 0;
303
+ overflow: visible;
304
+ width: 100%;
305
+ height: 100%;
306
+ pointer-events: none;
307
+ display: block;
308
+ }
309
+ .flow-edge path {
310
+ fill: none;
311
+ stroke: var(--kv-accent);
312
+ stroke-width: 2;
313
+ vector-effect: non-scaling-stroke;
314
+ }
315
+ .flow-edge.branch path {
316
+ stroke: var(--kv-text-muted);
317
+ stroke-dasharray: 5 4;
318
+ }
319
+ .flow-edge.recovery path {
320
+ stroke: var(--kv-warning);
321
+ stroke-dasharray: 5 4;
322
+ }
323
+ .flow-edge foreignObject {
324
+ overflow: visible;
325
+ }
326
+ .edge-label {
327
+ display: inline-block;
328
+ max-width: 156px;
329
+ border: 1px solid var(--kv-panel-border);
330
+ border-radius: var(--kv-radius-md);
331
+ padding: var(--kv-space-1-5) var(--kv-space-2);
332
+ font-family: var(--kv-font-sans);
333
+ font-size: var(--kv-text-xs);
334
+ line-height: var(--kv-leading-normal);
335
+ font-weight: var(--kv-weight-medium);
336
+ color: var(--kv-text-secondary);
337
+ background: var(--kv-panel-bg);
338
+ box-shadow: var(--kv-shadow-xs);
339
+ text-align: center;
340
+ }
341
+ .flow-edge.recovery .edge-label {
342
+ color: var(--kv-warning);
343
+ }
344
+ .edge-label-wrap {
345
+ display: flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ height: 100%;
349
+ width: 100%;
350
+ }
351
+ .map-world.has-selection .flow-edge {
352
+ opacity: 0.15;
353
+ }
354
+ .map-world.has-selection .flow-edge.related {
355
+ opacity: 1;
356
+ }
357
+ .flow-lane {
358
+ position: absolute;
359
+ border-top: 1px solid var(--kv-panel-border);
360
+ pointer-events: none;
361
+ padding-top: var(--kv-space-5);
362
+ }
363
+ .flow-lane-head {
364
+ display: flex;
365
+ align-items: center;
366
+ gap: var(--kv-space-3);
367
+ }
368
+ .lane-number {
369
+ display: grid;
370
+ place-items: center;
371
+ width: 34px;
372
+ height: 34px;
373
+ border: 1px solid var(--kv-border-default);
374
+ border-radius: var(--kv-radius-md);
375
+ background: var(--kv-panel-bg);
376
+ color: var(--kv-text-muted);
377
+ font-size: var(--kv-text-sm);
378
+ }
379
+ .flow-lane h2 {
380
+ font-size: var(--kv-text-xl);
381
+ font-weight: var(--kv-weight-semibold);
382
+ letter-spacing: -0.02em;
383
+ }
384
+ .flow-lane p {
385
+ font-size: var(--kv-text-sm);
386
+ color: var(--kv-text-muted);
387
+ margin-top: var(--kv-space-2);
388
+ max-width: 760px;
389
+ }
390
+ .flow-node {
391
+ position: absolute;
392
+ width: var(--node-width);
393
+ border: 1px solid var(--kv-border-default);
394
+ border-radius: var(--kv-radius-lg);
395
+ background: var(--kv-panel-bg);
396
+ box-shadow: var(--kv-shadow-sm);
397
+ overflow: visible;
398
+ cursor: grab;
399
+ }
400
+ .flow-node:hover {
401
+ border-color: var(--kv-accent-border);
402
+ }
403
+ .flow-node.selected {
404
+ border-color: var(--kv-accent);
405
+ box-shadow: 0 0 0 4px var(--kv-accent-subtle);
406
+ }
407
+ .flow-node.related-node {
408
+ border-color: var(--kv-accent);
409
+ }
410
+ .node-head {
411
+ height: 58px;
412
+ padding: var(--kv-space-2) var(--kv-space-3);
413
+ display: flex;
414
+ flex-direction: column;
415
+ justify-content: center;
416
+ gap: var(--kv-space-1);
417
+ overflow: hidden;
418
+ }
419
+ .node-head small {
420
+ font-size: var(--kv-text-2xs);
421
+ color: var(--kv-text-muted);
422
+ font-variant-numeric: tabular-nums;
423
+ }
424
+ .node-head h3 {
425
+ font-size: var(--kv-text-sm);
426
+ line-height: var(--kv-leading-tight);
427
+ font-weight: var(--kv-weight-semibold);
428
+ white-space: nowrap;
429
+ overflow: hidden;
430
+ text-overflow: ellipsis;
431
+ }
432
+ .node-preview {
433
+ height: var(--preview-height);
434
+ width: var(--preview-width);
435
+ margin: 0;
436
+ overflow: hidden;
437
+ position: relative;
438
+ border: 0;
439
+ background: var(--kv-panel-bg);
440
+ pointer-events: none;
441
+ contain: strict;
442
+ }
443
+ .node-preview iframe {
444
+ position: absolute;
445
+ left: 0;
446
+ top: 0;
447
+ width: var(--screen-width);
448
+ height: var(--screen-height);
449
+ border: 0;
450
+ transform: scale(var(--preview-scale));
451
+ transform-origin: top left;
452
+ pointer-events: none;
453
+ background: var(--kv-panel-bg);
454
+ }
455
+ .node-placeholder {
456
+ position: absolute;
457
+ inset: 0;
458
+ padding: var(--kv-space-4);
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: var(--kv-space-3);
462
+ color: var(--kv-text-muted);
463
+ font-size: var(--kv-text-xs);
464
+ background: var(--kv-panel-bg-subtle);
465
+ }
466
+ .node-placeholder span {
467
+ height: 12px;
468
+ background: var(--kv-panel-border);
469
+ border-radius: var(--kv-radius-xs);
470
+ }
471
+ .node-placeholder span:nth-child(2) {
472
+ width: 65%;
473
+ }
474
+ .node-placeholder p {
475
+ margin: auto;
476
+ text-align: center;
477
+ line-height: var(--kv-leading-relaxed);
478
+ }
479
+ .node-foot {
480
+ height: 32px;
481
+ padding: var(--kv-space-1) var(--kv-space-3);
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: space-between;
485
+ font-size: var(--kv-text-2xs);
486
+ color: var(--kv-text-muted);
487
+ }
488
+ .node-foot button {
489
+ border: 0;
490
+ background: none;
491
+ color: var(--kv-accent);
492
+ font-size: var(--kv-text-2xs);
493
+ display: flex;
494
+ align-items: center;
495
+ gap: var(--kv-space-1);
496
+ padding: var(--kv-space-1) 0;
497
+ }
498
+ .node-foot button svg {
499
+ width: 12px;
500
+ height: 12px;
501
+ }
502
+ .node-badge {
503
+ position: absolute;
504
+ top: -32px;
505
+ left: 0;
506
+ display: flex;
507
+ align-items: center;
508
+ gap: var(--kv-space-1);
509
+ border-radius: var(--kv-radius-full);
510
+ padding: var(--kv-space-1) var(--kv-space-2);
511
+ background: var(--kv-positive-bg);
512
+ color: var(--kv-positive);
513
+ font-size: var(--kv-text-xs);
514
+ font-weight: var(--kv-weight-semibold);
515
+ white-space: nowrap;
516
+ }
517
+ .node-badge.destination {
518
+ background: var(--kv-accent-subtle);
519
+ color: var(--kv-accent);
520
+ }
521
+ .node-badge svg {
522
+ width: 14px;
523
+ height: 14px;
524
+ }
525
+ .flow-node.external {
526
+ padding: var(--kv-space-5);
527
+ border-style: dashed;
528
+ min-height: 180px;
529
+ display: flex;
530
+ flex-direction: column;
531
+ justify-content: center;
532
+ }
533
+ .external-icon {
534
+ width: 36px;
535
+ height: 36px;
536
+ border-radius: var(--kv-radius-md);
537
+ display: grid;
538
+ place-items: center;
539
+ background: var(--kv-accent-subtle);
540
+ color: var(--kv-accent);
541
+ margin-bottom: var(--kv-space-3);
542
+ }
543
+ .flow-node.external small {
544
+ color: var(--kv-text-muted);
545
+ font-size: var(--kv-text-2xs);
546
+ margin-bottom: var(--kv-space-2);
547
+ }
548
+ .flow-node.external h3 {
549
+ font-size: var(--kv-text-base);
550
+ font-weight: var(--kv-weight-semibold);
551
+ margin-bottom: var(--kv-space-2);
552
+ }
553
+ .flow-node.external p {
554
+ font-size: var(--kv-text-xs);
555
+ color: var(--kv-text-secondary);
556
+ line-height: var(--kv-leading-relaxed);
557
+ }
558
+ .map-context {
559
+ position: absolute;
560
+ left: var(--kv-space-5);
561
+ right: var(--kv-space-5);
562
+ top: var(--kv-space-4);
563
+ display: flex;
564
+ align-items: flex-start;
565
+ gap: var(--kv-space-5);
566
+ justify-content: space-between;
567
+ pointer-events: none;
568
+ }
569
+ .map-context-text {
570
+ max-width: 650px;
571
+ background: var(--kv-page-bg);
572
+ padding: var(--kv-space-3) var(--kv-space-4);
573
+ border: 1px solid var(--kv-panel-border);
574
+ border-radius: var(--kv-radius-lg);
575
+ }
576
+ .map-context span {
577
+ font-size: var(--kv-text-2xs);
578
+ color: var(--kv-text-muted);
579
+ font-weight: var(--kv-weight-semibold);
580
+ }
581
+ .map-context h2 {
582
+ font-size: var(--kv-text-lg);
583
+ font-weight: var(--kv-weight-semibold);
584
+ letter-spacing: -0.02em;
585
+ margin-top: var(--kv-space-1);
586
+ }
587
+ .map-context p {
588
+ font-size: var(--kv-text-xs);
589
+ color: var(--kv-text-secondary);
590
+ line-height: var(--kv-leading-relaxed);
591
+ margin-top: var(--kv-space-2);
592
+ }
593
+ .map-context button {
594
+ pointer-events: auto;
595
+ white-space: nowrap;
596
+ box-shadow: var(--kv-shadow-xs);
597
+ margin-top: var(--kv-space-3);
598
+ }
599
+ .map-legend {
600
+ position: absolute;
601
+ left: var(--kv-space-6);
602
+ top: 142px;
603
+ display: flex;
604
+ gap: var(--kv-space-4);
605
+ align-items: center;
606
+ font-size: var(--kv-text-2xs);
607
+ color: var(--kv-text-muted);
608
+ pointer-events: none;
609
+ background: var(--kv-page-bg);
610
+ padding: var(--kv-space-1) var(--kv-space-2);
611
+ border-radius: var(--kv-radius-sm);
612
+ }
613
+ .map-legend span {
614
+ display: flex;
615
+ align-items: center;
616
+ gap: var(--kv-space-2);
617
+ }
618
+ .map-legend i {
619
+ width: 20px;
620
+ height: 0;
621
+ border-top: 2px solid var(--kv-accent);
622
+ }
623
+ .map-legend i.branch {
624
+ border-color: var(--kv-text-muted);
625
+ border-top-style: dashed;
626
+ }
627
+ .map-legend i.recovery {
628
+ border-color: var(--kv-warning);
629
+ border-top-style: dashed;
630
+ }
631
+ .map-bottom {
632
+ position: absolute;
633
+ left: var(--kv-space-5);
634
+ bottom: var(--kv-space-5);
635
+ right: 208px;
636
+ display: flex;
637
+ justify-content: space-between;
638
+ gap: var(--kv-space-4);
639
+ align-items: flex-end;
640
+ pointer-events: none;
641
+ }
642
+ .map-bottom p {
643
+ font-size: var(--kv-text-2xs);
644
+ color: var(--kv-text-muted);
645
+ background: var(--kv-page-bg);
646
+ max-width: 310px;
647
+ padding: var(--kv-space-2);
648
+ border-radius: var(--kv-radius-md);
649
+ line-height: var(--kv-leading-relaxed);
650
+ }
651
+ .map-zoom {
652
+ pointer-events: auto;
653
+ display: flex;
654
+ align-items: center;
655
+ background: var(--kv-panel-bg);
656
+ border: 1px solid var(--kv-panel-border);
657
+ border-radius: var(--kv-radius-lg);
658
+ box-shadow: var(--kv-shadow-sm);
659
+ padding: var(--kv-space-1);
660
+ }
661
+ .map-zoom .icon-button {
662
+ min-width: 36px;
663
+ min-height: 36px;
664
+ }
665
+ .map-zoom > button:not(.icon-button) {
666
+ border: 0;
667
+ background: none;
668
+ min-width: 50px;
669
+ padding: var(--kv-space-2);
670
+ font-size: var(--kv-text-xs);
671
+ color: var(--kv-text-secondary);
672
+ font-variant-numeric: tabular-nums;
673
+ }
674
+ .map-zoom svg {
675
+ width: 17px;
676
+ height: 17px;
677
+ }
678
+ .map-control-divider {
679
+ height: 20px;
680
+ border-left: 1px solid var(--kv-panel-border);
681
+ margin: 0 var(--kv-space-1);
682
+ }
683
+ .map-minimap {
684
+ position: absolute;
685
+ bottom: var(--kv-space-5);
686
+ right: var(--kv-space-5);
687
+ width: 178px;
688
+ background: var(--kv-panel-bg);
689
+ border: 1px solid var(--kv-panel-border);
690
+ border-radius: var(--kv-radius-lg);
691
+ box-shadow: var(--kv-shadow-sm);
692
+ padding: var(--kv-space-2);
693
+ cursor: default;
694
+ }
695
+ .map-minimap > span {
696
+ font-size: var(--kv-text-2xs);
697
+ color: var(--kv-text-muted);
698
+ display: block;
699
+ padding: 0 var(--kv-space-1);
700
+ }
701
+ .map-minimap svg {
702
+ width: 160px;
703
+ height: 108px;
704
+ cursor: crosshair;
705
+ display: block;
706
+ touch-action: none;
707
+ }
708
+ .minimap-node {
709
+ fill: var(--kv-panel-bg-subtle);
710
+ stroke: var(--kv-border-strong);
711
+ stroke-width: 0.75;
712
+ }
713
+ .minimap-node.start {
714
+ fill: var(--kv-positive-bg);
715
+ stroke: var(--kv-positive);
716
+ }
717
+ .minimap-window {
718
+ fill: var(--kv-accent-subtle);
719
+ fill-opacity: 0.55;
720
+ stroke: var(--kv-accent);
721
+ stroke-width: 1.5;
722
+ }
723
+ .map-minimap button {
724
+ border: 0;
725
+ border-top: 1px solid var(--kv-panel-border);
726
+ width: 100%;
727
+ padding: var(--kv-space-2) 0 0;
728
+ background: none;
729
+ font-size: var(--kv-text-2xs);
730
+ color: var(--kv-accent);
731
+ }
732
+ .node-details {
733
+ position: absolute;
734
+ right: var(--kv-space-5);
735
+ top: var(--kv-space-16);
736
+ max-height: calc(100% - 160px);
737
+ overflow: auto;
738
+ width: 280px;
739
+ background: var(--kv-panel-bg);
740
+ border: 1px solid var(--kv-panel-border);
741
+ border-radius: var(--kv-radius-lg);
742
+ box-shadow: var(--kv-shadow-md);
743
+ cursor: default;
744
+ padding: var(--kv-space-4);
745
+ z-index: 2;
746
+ }
747
+ .node-details .detail-head {
748
+ display: flex;
749
+ align-items: flex-start;
750
+ gap: var(--kv-space-2);
751
+ margin-bottom: var(--kv-space-3);
752
+ }
753
+ .node-details .detail-head .icon-button {
754
+ min-height: 24px;
755
+ min-width: 24px;
756
+ }
757
+ .node-details small {
758
+ font-size: var(--kv-text-2xs);
759
+ color: var(--kv-text-muted);
760
+ }
761
+ .node-details h3 {
762
+ font-size: var(--kv-text-base);
763
+ font-weight: var(--kv-weight-semibold);
764
+ margin-top: var(--kv-space-1);
765
+ }
766
+ .node-details h4 {
767
+ margin: var(--kv-space-4) 0 var(--kv-space-2);
768
+ font-size: var(--kv-text-xs);
769
+ font-weight: var(--kv-weight-semibold);
770
+ color: var(--kv-text-muted);
771
+ }
772
+ .detail-edge {
773
+ border: 0;
774
+ background: var(--kv-page-bg);
775
+ width: 100%;
776
+ padding: var(--kv-space-3);
777
+ margin-bottom: var(--kv-space-2);
778
+ display: block;
779
+ text-align: left;
780
+ border-radius: var(--kv-radius-md);
781
+ }
782
+ .detail-edge strong {
783
+ font-size: var(--kv-text-xs);
784
+ font-weight: var(--kv-weight-medium);
785
+ display: block;
786
+ color: var(--kv-text-main);
787
+ }
788
+ .detail-edge span {
789
+ font-size: var(--kv-text-2xs);
790
+ display: block;
791
+ color: var(--kv-text-muted);
792
+ margin-top: var(--kv-space-1);
793
+ }
794
+ .node-details > a,
795
+ .node-details > [data-ui="action"] {
796
+ width: 100%;
797
+ margin-top: var(--kv-space-2);
798
+ }
799
+ .node-details p {
800
+ font-size: var(--kv-text-xs);
801
+ color: var(--kv-text-muted);
802
+ line-height: var(--kv-leading-relaxed);
803
+ }
804
+ .screen-dialog,
805
+ .help-dialog {
806
+ padding: 0;
807
+ border: 1px solid var(--kv-panel-border);
808
+ border-radius: var(--kv-radius-xl);
809
+ color: var(--kv-text-main);
810
+ background: var(--kv-panel-bg);
811
+ box-shadow: var(--kv-shadow-float);
812
+ }
813
+ .screen-dialog::backdrop,
814
+ .help-dialog::backdrop {
815
+ background: color-mix(in srgb, var(--kv-text-main) 35%, transparent);
816
+ }
817
+ .screen-dialog {
818
+ width: var(--dialog-width, 390px);
819
+ max-width: 100vw;
820
+ max-height: 94dvh;
821
+ border: 0;
822
+ overflow: auto;
823
+ }
824
+ .screen-dialog header {
825
+ display: flex;
826
+ align-items: center;
827
+ justify-content: space-between;
828
+ padding: var(--kv-space-3) var(--kv-space-4);
829
+ border-bottom: 1px solid var(--kv-panel-border);
830
+ position: sticky;
831
+ top: 0;
832
+ z-index: 1;
833
+ background: var(--kv-panel-bg);
834
+ }
835
+ .screen-dialog header small {
836
+ font-size: var(--kv-text-xs);
837
+ color: var(--kv-text-muted);
838
+ }
839
+ .screen-dialog h2 {
840
+ font-size: var(--kv-text-base);
841
+ font-weight: var(--kv-weight-semibold);
842
+ margin-top: var(--kv-space-1);
843
+ }
844
+ #dialog-preview {
845
+ width: 390px;
846
+ height: 844px;
847
+ margin: 0;
848
+ overflow: hidden;
849
+ background: var(--kv-panel-bg);
850
+ }
851
+ #dialog-preview iframe {
852
+ width: 390px;
853
+ height: 844px;
854
+ border: 0;
855
+ display: block;
856
+ }
857
+ .screen-dialog footer {
858
+ padding: var(--kv-space-3);
859
+ display: flex;
860
+ align-items: center;
861
+ justify-content: space-between;
862
+ gap: var(--kv-space-3);
863
+ border-top: 1px solid var(--kv-panel-border);
864
+ }
865
+ .screen-dialog footer p {
866
+ font-size: var(--kv-text-xs);
867
+ color: var(--kv-text-muted);
868
+ }
869
+ .help-dialog {
870
+ width: 440px;
871
+ max-width: calc(100vw - 32px);
872
+ padding: var(--kv-space-6);
873
+ }
874
+ .help-dialog h2 {
875
+ font-size: var(--kv-text-xl);
876
+ font-weight: var(--kv-weight-semibold);
877
+ }
878
+ .help-dialog ul {
879
+ padding-left: var(--kv-space-5);
880
+ font-size: var(--kv-text-sm);
881
+ color: var(--kv-text-secondary);
882
+ line-height: var(--kv-leading-relaxed);
883
+ }
884
+ .help-dialog li {
885
+ margin-block: var(--kv-space-3);
886
+ }
887
+ .help-dialog p {
888
+ font-size: var(--kv-text-xs);
889
+ color: var(--kv-text-muted);
890
+ margin-bottom: var(--kv-space-5);
891
+ line-height: var(--kv-leading-relaxed);
892
+ }
893
+ .help-dialog button {
894
+ width: 100%;
895
+ }
896
+ @container (max-width: 1100px) {
897
+ .map-context p {
898
+ max-width: 470px;
899
+ }
900
+ .map-context-text {
901
+ max-width: 570px;
902
+ }
903
+ .map-bottom p {
904
+ display: none;
905
+ }
906
+ .map-bottom {
907
+ justify-content: center;
908
+ }
909
+ .map-context button {
910
+ font-size: var(--kv-text-xs);
911
+ }
912
+ .map-legend {
913
+ font-size: var(--kv-text-2xs);
914
+ gap: var(--kv-space-2);
915
+ }
916
+ }
917
+ @container (max-width: 760px) {
918
+ .map-header {
919
+ height: 64px;
920
+ padding: var(--kv-space-2);
921
+ gap: var(--kv-space-2);
922
+ }
923
+ .map-total,
924
+ .map-header-actions a {
925
+ display: none;
926
+ }
927
+ #map-menu {
928
+ display: flex;
929
+ }
930
+ .map-layout {
931
+ display: block;
932
+ position: relative;
933
+ }
934
+ .map-sidebar {
935
+ display: none;
936
+ position: absolute;
937
+ top: 0;
938
+ bottom: 0;
939
+ left: 0;
940
+ width: 248px;
941
+ box-shadow: var(--kv-shadow-md);
942
+ z-index: 5;
943
+ }
944
+ .flow-page.sidebar-open .map-sidebar {
945
+ display: flex;
946
+ }
947
+ .map-viewport {
948
+ width: 100%;
949
+ height: 100%;
950
+ }
951
+ .map-context {
952
+ left: var(--kv-space-3);
953
+ right: var(--kv-space-3);
954
+ top: var(--kv-space-3);
955
+ }
956
+ .map-context button {
957
+ display: none;
958
+ }
959
+ .map-context-text {
960
+ padding: var(--kv-space-3);
961
+ width: 100%;
962
+ }
963
+ .map-context h2 {
964
+ font-size: var(--kv-text-base);
965
+ }
966
+ .map-context p {
967
+ display: none;
968
+ }
969
+ .map-legend {
970
+ top: 100px;
971
+ left: var(--kv-space-3);
972
+ right: var(--kv-space-3);
973
+ justify-content: space-between;
974
+ }
975
+ .map-bottom {
976
+ left: var(--kv-space-3);
977
+ right: var(--kv-space-3);
978
+ bottom: var(--kv-space-3);
979
+ }
980
+ .map-minimap {
981
+ display: none;
982
+ }
983
+ .node-details {
984
+ top: 140px;
985
+ right: var(--kv-space-3);
986
+ max-width: calc(100% - 24px);
987
+ }
988
+ .map-brand .brand-mark {
989
+ width: 28px;
990
+ height: 28px;
991
+ }
992
+ }