@robotaccomplice/architext 1.0.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 (43) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +497 -0
  3. package/docs/architecture/AGENTS_APPENDIX.md +39 -0
  4. package/docs/architecture/ARCHITECTURE_PLAN.md +520 -0
  5. package/docs/architecture/LLM_ARCHITEXT.md +95 -0
  6. package/docs/architext/AGENTS_APPENDIX.md +39 -0
  7. package/docs/architext/LLM_ARCHITEXT.md +64 -0
  8. package/docs/architext/README.md +120 -0
  9. package/docs/architext/data/data-classification.json +34 -0
  10. package/docs/architext/data/decisions.json +54 -0
  11. package/docs/architext/data/flows.json +114 -0
  12. package/docs/architext/data/glossary.json +24 -0
  13. package/docs/architext/data/manifest.json +23 -0
  14. package/docs/architext/data/nodes.json +194 -0
  15. package/docs/architext/data/risks.json +59 -0
  16. package/docs/architext/data/views.json +91 -0
  17. package/docs/architext/dist/assets/index-BWZ6sEpA.js +51 -0
  18. package/docs/architext/dist/assets/index-iWLms0Pa.css +1 -0
  19. package/docs/architext/dist/compass.svg +9 -0
  20. package/docs/architext/dist/index.html +14 -0
  21. package/docs/architext/index.html +13 -0
  22. package/docs/architext/package-lock.json +1822 -0
  23. package/docs/architext/package.json +28 -0
  24. package/docs/architext/public/compass.svg +9 -0
  25. package/docs/architext/schema/data-classification.schema.json +28 -0
  26. package/docs/architext/schema/decisions.schema.json +33 -0
  27. package/docs/architext/schema/flows.schema.json +72 -0
  28. package/docs/architext/schema/glossary.schema.json +22 -0
  29. package/docs/architext/schema/manifest.schema.json +47 -0
  30. package/docs/architext/schema/nodes.schema.json +69 -0
  31. package/docs/architext/schema/risks.schema.json +34 -0
  32. package/docs/architext/schema/views.schema.json +48 -0
  33. package/docs/architext/src/main.tsx +2133 -0
  34. package/docs/architext/src/styles.css +1475 -0
  35. package/docs/architext/tools/validate-architext.mjs +163 -0
  36. package/docs/architext/tsconfig.json +21 -0
  37. package/docs/architext/vite.config.ts +47 -0
  38. package/docs/assets/screenshots/architext-c4.png +0 -0
  39. package/docs/assets/screenshots/architext-data-risks.png +0 -0
  40. package/docs/assets/screenshots/architext-flows.png +0 -0
  41. package/docs/assets/screenshots/architext-sequence.png +0 -0
  42. package/package.json +81 -0
  43. package/tools/architext-adopt.mjs +874 -0
@@ -0,0 +1,1475 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #0c0e11;
4
+ --surface: #111316;
5
+ --panel: #1a1c1f;
6
+ --panel-2: #1e2023;
7
+ --panel-3: #282a2d;
8
+ --ink: #e2e2e6;
9
+ --muted: #b9cacb;
10
+ --dim: #849495;
11
+ --line: #3b494b;
12
+ --line-strong: #849495;
13
+ --blue: #00dbe9;
14
+ --green: #2ff801;
15
+ --yellow: #fed639;
16
+ --red: #ffb4ab;
17
+ --purple: #9f8cff;
18
+ --cyan: #00dbe9;
19
+ --orange: #fed639;
20
+ --pink: #ff9db7;
21
+ --shadow: none;
22
+ --font-headline: "Hanken Grotesk", "Arial Narrow", Inter, ui-sans-serif, system-ui, sans-serif;
23
+ --font-body: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
24
+ --font-mono: "JetBrains Mono", "SFMono-Regular", Consolas, "Liberation Mono", monospace;
25
+ font-family: var(--font-body);
26
+ }
27
+
28
+ * {
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ html,
33
+ body,
34
+ #root {
35
+ height: 100%;
36
+ }
37
+
38
+ body {
39
+ margin: 0;
40
+ background: var(--bg);
41
+ color: var(--ink);
42
+ }
43
+
44
+ button,
45
+ input,
46
+ select {
47
+ font: inherit;
48
+ }
49
+
50
+ button,
51
+ select,
52
+ input {
53
+ color: var(--ink);
54
+ background: var(--panel-2);
55
+ border: 1px solid var(--line);
56
+ border-radius: 0;
57
+ }
58
+
59
+ button,
60
+ select {
61
+ cursor: pointer;
62
+ }
63
+
64
+ button:hover,
65
+ button:focus,
66
+ select:hover,
67
+ select:focus,
68
+ input:focus {
69
+ border-color: var(--blue);
70
+ outline: 1px solid rgba(0, 219, 233, 0.32);
71
+ outline-offset: 1px;
72
+ }
73
+
74
+ .app {
75
+ height: 100%;
76
+ display: grid;
77
+ grid-template-columns: 320px minmax(0, 1fr) 390px;
78
+ grid-template-rows: auto minmax(0, 1fr);
79
+ gap: 8px;
80
+ padding: 8px;
81
+ overflow: hidden;
82
+ }
83
+
84
+ .app.left-collapsed {
85
+ grid-template-columns: 52px minmax(0, 1fr) 390px;
86
+ }
87
+
88
+ .app.right-collapsed {
89
+ grid-template-columns: 320px minmax(0, 1fr) 52px;
90
+ }
91
+
92
+ .app.left-collapsed.right-collapsed {
93
+ grid-template-columns: 52px minmax(0, 1fr) 52px;
94
+ }
95
+
96
+ .app.diagram-focused {
97
+ grid-template-columns: 52px minmax(0, 1fr) 52px;
98
+ }
99
+
100
+ .topbar {
101
+ grid-column: 1 / -1;
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: space-between;
105
+ gap: 16px;
106
+ padding: 10px 12px;
107
+ border: 1px solid var(--line);
108
+ border-radius: 0;
109
+ background: var(--surface);
110
+ box-shadow: var(--shadow);
111
+ }
112
+
113
+ .topbar h1,
114
+ .topbar p,
115
+ .diagram-header h2,
116
+ .diagram-header p,
117
+ .steps h2,
118
+ .steps p,
119
+ .details h2,
120
+ .details p {
121
+ margin: 0;
122
+ }
123
+
124
+ .topbar > div:first-child {
125
+ min-width: 0;
126
+ }
127
+
128
+ .topbar > div:first-child p:not(.eyebrow) {
129
+ overflow: hidden;
130
+ text-overflow: ellipsis;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ .topbar h1 {
135
+ font-family: var(--font-headline);
136
+ font-size: 22px;
137
+ letter-spacing: -0.02em;
138
+ }
139
+
140
+ .project-title-line,
141
+ .diagram-title-line {
142
+ display: flex;
143
+ min-width: 0;
144
+ align-items: baseline;
145
+ gap: 10px;
146
+ }
147
+
148
+ .project-title-line p,
149
+ .diagram-title-line p {
150
+ min-width: 0;
151
+ overflow: hidden;
152
+ text-overflow: ellipsis;
153
+ white-space: nowrap;
154
+ }
155
+
156
+ .topbar p,
157
+ .diagram-header p,
158
+ .steps p,
159
+ .details p,
160
+ .muted {
161
+ color: var(--muted);
162
+ line-height: 1.45;
163
+ }
164
+
165
+ .eyebrow {
166
+ color: var(--blue);
167
+ font-family: var(--font-mono);
168
+ font-size: 11px;
169
+ font-weight: 800;
170
+ letter-spacing: 0.08em;
171
+ text-transform: uppercase;
172
+ }
173
+
174
+ .topbar-actions {
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 8px;
178
+ }
179
+
180
+ .topbar-actions button,
181
+ .topbar-actions select {
182
+ min-height: 36px;
183
+ padding: 7px 10px;
184
+ }
185
+
186
+ .mode-tabs {
187
+ display: flex;
188
+ flex-wrap: wrap;
189
+ gap: 2px;
190
+ justify-content: flex-end;
191
+ }
192
+
193
+ .mode-tabs button {
194
+ min-width: 74px;
195
+ padding: 7px 9px;
196
+ border-color: transparent;
197
+ border-bottom-color: var(--line);
198
+ color: var(--muted);
199
+ background: transparent;
200
+ font-family: var(--font-mono);
201
+ font-size: 12px;
202
+ letter-spacing: 0.05em;
203
+ }
204
+
205
+ .mode-tabs button.active {
206
+ border-color: transparent;
207
+ border-bottom-color: var(--blue);
208
+ color: var(--ink);
209
+ background: var(--panel-2);
210
+ }
211
+
212
+ .left-nav,
213
+ .diagram-area,
214
+ .details {
215
+ position: relative;
216
+ min-height: 0;
217
+ border: 1px solid var(--line);
218
+ border-radius: 0;
219
+ background: var(--panel);
220
+ box-shadow: var(--shadow);
221
+ }
222
+
223
+ .diagram-area {
224
+ overflow: hidden;
225
+ }
226
+
227
+ .left-nav {
228
+ grid-column: 1;
229
+ grid-row: 2;
230
+ }
231
+
232
+ .diagram-area {
233
+ grid-column: 2;
234
+ grid-row: 2;
235
+ }
236
+
237
+ .details {
238
+ grid-column: 3;
239
+ grid-row: 2;
240
+ }
241
+
242
+ .left-nav {
243
+ display: grid;
244
+ grid-template-rows: auto minmax(0, 1fr);
245
+ }
246
+
247
+ .panel-rail {
248
+ height: 100%;
249
+ display: grid;
250
+ place-items: center;
251
+ color: var(--muted);
252
+ font-size: 11px;
253
+ font-weight: 800;
254
+ letter-spacing: 0.16em;
255
+ text-transform: uppercase;
256
+ writing-mode: vertical-rl;
257
+ transform: rotate(180deg);
258
+ user-select: none;
259
+ }
260
+
261
+ .side-toggle {
262
+ position: absolute;
263
+ z-index: 20;
264
+ top: 16px;
265
+ width: 24px;
266
+ height: 40px;
267
+ display: grid;
268
+ place-items: center;
269
+ padding: 0;
270
+ border-radius: 0;
271
+ border: 1px solid var(--line);
272
+ color: var(--blue);
273
+ background: var(--surface);
274
+ box-shadow: none;
275
+ font-family: var(--font-mono);
276
+ font-weight: 900;
277
+ line-height: 1;
278
+ }
279
+
280
+ .side-toggle:hover {
281
+ background: var(--panel-3);
282
+ box-shadow: inset 0 0 0 1px rgba(0, 219, 233, 0.25);
283
+ }
284
+
285
+ .side-toggle::after {
286
+ position: absolute;
287
+ top: 50%;
288
+ min-width: max-content;
289
+ padding: 4px 6px;
290
+ border: 1px solid var(--line);
291
+ border-radius: 0;
292
+ color: var(--ink);
293
+ background: var(--bg);
294
+ box-shadow: none;
295
+ content: attr(data-tooltip);
296
+ font-family: var(--font-mono);
297
+ font-size: 11px;
298
+ font-weight: 700;
299
+ opacity: 0;
300
+ pointer-events: none;
301
+ transform: translateY(-50%);
302
+ transition: opacity 0.12s ease;
303
+ }
304
+
305
+ .side-toggle:hover::after {
306
+ opacity: 1;
307
+ }
308
+
309
+ .left-side-toggle {
310
+ right: -12px;
311
+ }
312
+
313
+ .app.left-collapsed .left-side-toggle {
314
+ right: -12px;
315
+ }
316
+
317
+ .right-side-toggle {
318
+ left: -12px;
319
+ }
320
+
321
+ .app.right-collapsed .right-side-toggle {
322
+ left: -12px;
323
+ }
324
+
325
+ .left-side-toggle::after {
326
+ left: 36px;
327
+ }
328
+
329
+ .right-side-toggle::after {
330
+ right: 36px;
331
+ }
332
+
333
+ .panel-head {
334
+ padding: 10px 12px;
335
+ border-bottom: 1px solid var(--line);
336
+ }
337
+
338
+ .panel-head h2 {
339
+ margin: 0 0 8px;
340
+ font-family: var(--font-mono);
341
+ font-size: 12px;
342
+ letter-spacing: 0.08em;
343
+ text-transform: uppercase;
344
+ }
345
+
346
+ .panel-head p {
347
+ margin: 6px 0 0;
348
+ color: var(--muted);
349
+ font-size: 11px;
350
+ line-height: 1.4;
351
+ }
352
+
353
+ .panel-head input {
354
+ width: 100%;
355
+ min-height: 30px;
356
+ padding: 6px 8px;
357
+ border-width: 0 0 1px;
358
+ font-family: var(--font-mono);
359
+ font-size: 12px;
360
+ }
361
+
362
+ .flow-list {
363
+ overflow: auto;
364
+ }
365
+
366
+ .flow-list {
367
+ padding: 8px;
368
+ }
369
+
370
+ .entity-list {
371
+ min-height: 0;
372
+ overflow: auto;
373
+ padding: 8px;
374
+ }
375
+
376
+ .entity-list h3 {
377
+ margin: 8px 0 5px;
378
+ color: var(--muted);
379
+ font-family: var(--font-mono);
380
+ font-size: 0.72rem;
381
+ letter-spacing: 0.08em;
382
+ text-transform: uppercase;
383
+ }
384
+
385
+ .flow-card,
386
+ .entity-card {
387
+ width: 100%;
388
+ display: grid;
389
+ gap: 4px;
390
+ margin-bottom: 6px;
391
+ padding: 8px;
392
+ text-align: left;
393
+ background: var(--panel-2);
394
+ }
395
+
396
+ .entity-card.passive {
397
+ cursor: default;
398
+ }
399
+
400
+ .flow-card.active,
401
+ .entity-card.active {
402
+ border-color: var(--blue);
403
+ border-left: 4px solid var(--blue);
404
+ background: #102024;
405
+ }
406
+
407
+ .flow-card strong,
408
+ .entity-card strong,
409
+ .step-card strong,
410
+ .node-card strong,
411
+ .mini-record strong {
412
+ display: block;
413
+ }
414
+
415
+ .flow-card strong,
416
+ .entity-card strong,
417
+ .step-card strong,
418
+ .node-card strong,
419
+ .c4-node strong,
420
+ .mini-record strong {
421
+ font-family: var(--font-mono);
422
+ }
423
+
424
+ .flow-card span,
425
+ .entity-card span,
426
+ .node-card span,
427
+ .step-card span {
428
+ color: var(--muted);
429
+ font-size: 11px;
430
+ line-height: 1.3;
431
+ }
432
+
433
+ .diagram-area {
434
+ display: grid;
435
+ grid-template-rows: auto minmax(0, 1fr) auto;
436
+ overflow: hidden;
437
+ }
438
+
439
+ .diagram-header,
440
+ .steps {
441
+ padding: 8px 10px;
442
+ }
443
+
444
+ .diagram-header {
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: space-between;
448
+ gap: 10px;
449
+ border-bottom: 1px solid var(--line);
450
+ background: var(--surface);
451
+ }
452
+
453
+ .diagram-header h2 {
454
+ font-family: var(--font-headline);
455
+ font-size: 20px;
456
+ letter-spacing: -0.02em;
457
+ }
458
+
459
+ .diagram-header p {
460
+ font-size: 13px;
461
+ }
462
+
463
+ .diagram-controls {
464
+ display: flex;
465
+ flex: 0 0 auto;
466
+ align-items: center;
467
+ gap: 6px;
468
+ }
469
+
470
+ .diagram-controls button {
471
+ min-height: 28px;
472
+ padding: 4px 7px;
473
+ font-family: var(--font-mono);
474
+ font-size: 11px;
475
+ }
476
+
477
+ .diagram-controls span {
478
+ min-width: 44px;
479
+ color: var(--muted);
480
+ font-family: var(--font-mono);
481
+ font-size: 11px;
482
+ text-align: center;
483
+ }
484
+
485
+ .legend {
486
+ position: relative;
487
+ color: var(--muted);
488
+ font-family: var(--font-mono);
489
+ font-size: 11px;
490
+ }
491
+
492
+ .legend summary {
493
+ min-height: 28px;
494
+ padding: 5px 8px;
495
+ border: 1px solid var(--line);
496
+ color: var(--blue);
497
+ list-style: none;
498
+ cursor: pointer;
499
+ }
500
+
501
+ .legend summary::-webkit-details-marker {
502
+ display: none;
503
+ }
504
+
505
+ .legend > div {
506
+ position: absolute;
507
+ z-index: 15;
508
+ right: 0;
509
+ top: calc(100% + 4px);
510
+ display: grid;
511
+ grid-template-columns: repeat(2, max-content);
512
+ gap: 7px 10px;
513
+ min-width: 260px;
514
+ padding: 10px;
515
+ border: 1px solid var(--line);
516
+ background: var(--panel-2);
517
+ }
518
+
519
+ .legend span {
520
+ display: inline-flex;
521
+ align-items: center;
522
+ gap: 5px;
523
+ }
524
+
525
+ .dot {
526
+ width: 9px;
527
+ height: 9px;
528
+ border-radius: 0;
529
+ background: var(--muted);
530
+ }
531
+
532
+ .diagram-viewport {
533
+ min-width: 0;
534
+ min-height: 0;
535
+ overflow: hidden;
536
+ }
537
+
538
+ .map-shell {
539
+ position: relative;
540
+ width: 100%;
541
+ height: 100%;
542
+ min-width: 0;
543
+ min-height: 0;
544
+ overflow: auto;
545
+ background:
546
+ radial-gradient(circle, rgba(59, 73, 75, 0.5) 1px, transparent 1px),
547
+ var(--bg);
548
+ background-size: 32px 32px;
549
+ }
550
+
551
+ .diagram-canvas {
552
+ position: relative;
553
+ min-width: 100%;
554
+ min-height: 100%;
555
+ }
556
+
557
+ .flow-lines {
558
+ position: absolute;
559
+ inset: 0;
560
+ pointer-events: none;
561
+ overflow: visible;
562
+ }
563
+
564
+ .flow-edge,
565
+ .relationship-edge {
566
+ cursor: pointer;
567
+ pointer-events: all;
568
+ }
569
+
570
+ .flow-edge:focus,
571
+ .relationship-edge:focus {
572
+ outline: none;
573
+ }
574
+
575
+ .flow-line {
576
+ fill: none;
577
+ stroke: var(--blue);
578
+ stroke-width: 2;
579
+ stroke-linecap: round;
580
+ stroke-linejoin: round;
581
+ opacity: 0.9;
582
+ }
583
+
584
+ .structural-line {
585
+ fill: none;
586
+ stroke: var(--muted);
587
+ stroke-width: 1.4;
588
+ stroke-linecap: round;
589
+ stroke-linejoin: round;
590
+ stroke-dasharray: 6 6;
591
+ opacity: 0.85;
592
+ }
593
+
594
+ .relationship-label {
595
+ fill: var(--muted);
596
+ paint-order: stroke;
597
+ stroke: #0b0f16;
598
+ stroke-width: 4px;
599
+ font-family: var(--font-mono);
600
+ font-size: 10px;
601
+ font-weight: 800;
602
+ text-anchor: middle;
603
+ }
604
+
605
+ .relationship-edge.selected .structural-line,
606
+ .relationship-edge.selected .c4-relationship {
607
+ stroke: var(--blue);
608
+ }
609
+
610
+ .flow-lines marker path {
611
+ fill: var(--blue);
612
+ }
613
+
614
+ #arrowhead-selected path,
615
+ #sequence-arrowhead-selected path {
616
+ fill: var(--blue);
617
+ }
618
+
619
+ .flow-edge.selected .flow-line {
620
+ stroke: var(--blue);
621
+ }
622
+
623
+ .flow-edge.selected .flow-step-dot {
624
+ fill: var(--blue);
625
+ }
626
+
627
+ .flow-step-dot {
628
+ fill: var(--blue);
629
+ stroke: #002022;
630
+ stroke-width: 1;
631
+ }
632
+
633
+ .flow-step-label {
634
+ fill: #002022;
635
+ font-family: var(--font-mono);
636
+ font-size: 11px;
637
+ font-weight: 900;
638
+ text-anchor: middle;
639
+ pointer-events: none;
640
+ }
641
+
642
+ .sequence-shell {
643
+ background:
644
+ radial-gradient(circle, rgba(59, 73, 75, 0.5) 1px, transparent 1px),
645
+ var(--bg);
646
+ background-size: 32px 32px;
647
+ }
648
+
649
+ .sequence-participant-rail {
650
+ position: sticky;
651
+ z-index: 8;
652
+ top: 0;
653
+ height: 58px;
654
+ min-width: 100%;
655
+ background: rgba(12, 14, 17, 0.94);
656
+ border-bottom: 1px solid var(--line);
657
+ }
658
+
659
+ .sequence-participant-card {
660
+ position: absolute;
661
+ top: 9px;
662
+ height: 38px;
663
+ display: grid;
664
+ gap: 1px;
665
+ padding: 5px 7px;
666
+ text-align: center;
667
+ background: var(--panel-2);
668
+ border-color: var(--line-strong);
669
+ }
670
+
671
+ .sequence-participant-card strong {
672
+ overflow: hidden;
673
+ font-size: 11px;
674
+ text-overflow: ellipsis;
675
+ white-space: nowrap;
676
+ }
677
+
678
+ .sequence-participant-card span {
679
+ color: var(--dim);
680
+ font-family: var(--font-mono);
681
+ font-size: 10px;
682
+ }
683
+
684
+ .sequence-canvas {
685
+ display: block;
686
+ min-width: 100%;
687
+ min-height: 100%;
688
+ }
689
+
690
+ .sequence-participant {
691
+ fill: var(--panel-2);
692
+ stroke: var(--line-strong);
693
+ stroke-width: 1.5;
694
+ }
695
+
696
+ .sequence-title {
697
+ fill: var(--ink);
698
+ font-family: var(--font-mono);
699
+ font-size: 11px;
700
+ font-weight: 800;
701
+ text-anchor: middle;
702
+ }
703
+
704
+ .sequence-kind,
705
+ .sequence-data {
706
+ fill: var(--muted);
707
+ font-family: var(--font-mono);
708
+ font-size: 10px;
709
+ text-anchor: middle;
710
+ }
711
+
712
+ .lifeline {
713
+ stroke: var(--line-strong);
714
+ stroke-width: 1.5;
715
+ stroke-dasharray: 4 5;
716
+ }
717
+
718
+ .sequence-message {
719
+ cursor: pointer;
720
+ }
721
+
722
+ .sequence-line {
723
+ stroke: var(--blue);
724
+ stroke-width: 1.8;
725
+ stroke-linecap: round;
726
+ }
727
+
728
+ .sequence-message.async .sequence-line {
729
+ stroke-dasharray: 7 5;
730
+ }
731
+
732
+ .sequence-message.persistence .sequence-line {
733
+ stroke: var(--green);
734
+ }
735
+
736
+ .sequence-message.response .sequence-line {
737
+ stroke: var(--cyan);
738
+ }
739
+
740
+ .sequence-canvas marker path {
741
+ fill: var(--blue);
742
+ }
743
+
744
+ #sequence-arrowhead-response path {
745
+ fill: var(--cyan);
746
+ }
747
+
748
+ #sequence-arrowhead-persistence path {
749
+ fill: var(--green);
750
+ }
751
+
752
+ #sequence-arrowhead-selected path {
753
+ fill: var(--blue);
754
+ }
755
+
756
+ .sequence-step-dot {
757
+ fill: var(--blue);
758
+ stroke: #002022;
759
+ stroke-width: 1;
760
+ }
761
+
762
+ .sequence-step-label {
763
+ fill: #002022;
764
+ font-family: var(--font-mono);
765
+ font-size: 11px;
766
+ font-weight: 900;
767
+ text-anchor: middle;
768
+ }
769
+
770
+ .sequence-action {
771
+ fill: var(--ink);
772
+ font-family: var(--font-mono);
773
+ font-size: 11px;
774
+ font-weight: 800;
775
+ text-anchor: middle;
776
+ paint-order: stroke;
777
+ stroke: #0b0f16;
778
+ stroke-width: 3px;
779
+ }
780
+
781
+ .sequence-message.selected .sequence-line {
782
+ stroke: var(--blue);
783
+ }
784
+
785
+ .sequence-message.selected .sequence-step-dot {
786
+ fill: var(--blue);
787
+ }
788
+
789
+ .lane-column {
790
+ position: absolute;
791
+ top: 14px;
792
+ border-left: 1px dashed var(--line);
793
+ pointer-events: none;
794
+ }
795
+
796
+ .lane-column h3 {
797
+ margin: 0;
798
+ padding-left: 8px;
799
+ color: var(--muted);
800
+ font-family: var(--font-mono);
801
+ font-size: 11px;
802
+ letter-spacing: 0.12em;
803
+ text-transform: uppercase;
804
+ }
805
+
806
+ .node-card {
807
+ position: absolute;
808
+ display: grid;
809
+ align-content: center;
810
+ gap: 2px;
811
+ padding: 5px 7px;
812
+ text-align: left;
813
+ opacity: 0.45;
814
+ border-left-width: 3px;
815
+ overflow: hidden;
816
+ font-family: var(--font-mono);
817
+ }
818
+
819
+ .node-card strong,
820
+ .c4-node strong {
821
+ font-size: 12px;
822
+ line-height: 1.15;
823
+ }
824
+
825
+ .node-card strong {
826
+ display: -webkit-box;
827
+ overflow: hidden;
828
+ -webkit-box-orient: vertical;
829
+ -webkit-line-clamp: 2;
830
+ }
831
+
832
+ .node-card.in-flow {
833
+ opacity: 1;
834
+ border-color: var(--blue);
835
+ }
836
+
837
+ .node-card.selected {
838
+ background: #102024;
839
+ box-shadow: inset 0 0 0 1px rgba(0, 219, 233, 0.45);
840
+ }
841
+
842
+ .node-card.actor {
843
+ border-left-color: var(--pink);
844
+ }
845
+
846
+ .node-card.software-system {
847
+ border-left-color: var(--cyan);
848
+ }
849
+
850
+ .node-card.client {
851
+ border-left-color: var(--blue);
852
+ }
853
+
854
+ .node-card.service,
855
+ .node-card.worker {
856
+ border-left-color: var(--purple);
857
+ }
858
+
859
+ .node-card.queue {
860
+ border-left-color: var(--orange);
861
+ }
862
+
863
+ .node-card.data-store {
864
+ border-left-color: var(--green);
865
+ }
866
+
867
+ .node-card.external-service {
868
+ border-left-color: var(--muted);
869
+ }
870
+
871
+ .c4-shell {
872
+ background: var(--bg);
873
+ }
874
+
875
+ .c4-canvas {
876
+ position: relative;
877
+ min-width: 100%;
878
+ min-height: 100%;
879
+ }
880
+
881
+ .c4-boundary {
882
+ position: absolute;
883
+ inset: 54px 34px 34px 34px;
884
+ border: 1px dashed rgba(0, 219, 233, 0.26);
885
+ border-radius: 0;
886
+ pointer-events: none;
887
+ }
888
+
889
+ .c4-boundary span {
890
+ position: absolute;
891
+ top: -12px;
892
+ left: 18px;
893
+ padding: 2px 8px;
894
+ color: var(--cyan);
895
+ background: var(--bg);
896
+ font-family: var(--font-mono);
897
+ font-size: 11px;
898
+ font-weight: 800;
899
+ letter-spacing: 0.08em;
900
+ text-transform: uppercase;
901
+ }
902
+
903
+ .c4-lane-label {
904
+ position: absolute;
905
+ color: var(--muted);
906
+ font-family: var(--font-mono);
907
+ font-size: 11px;
908
+ font-weight: 900;
909
+ letter-spacing: 0.12em;
910
+ text-transform: uppercase;
911
+ }
912
+
913
+ .c4-node {
914
+ position: absolute;
915
+ display: grid;
916
+ gap: 3px;
917
+ padding: 8px;
918
+ text-align: left;
919
+ border-color: var(--line-strong);
920
+ border-left-width: 3px;
921
+ background: var(--panel-2);
922
+ }
923
+
924
+ .c4-node.selected {
925
+ border-color: var(--blue);
926
+ background: #102024;
927
+ }
928
+
929
+ .c4-node small {
930
+ color: var(--muted);
931
+ font-size: 10px;
932
+ line-height: 1.25;
933
+ }
934
+
935
+ .c4-relationship {
936
+ fill: none;
937
+ stroke: var(--muted);
938
+ stroke-width: 1.4;
939
+ stroke-dasharray: 6 6;
940
+ opacity: 0.76;
941
+ }
942
+
943
+ .c4-lines marker path {
944
+ fill: var(--muted);
945
+ }
946
+
947
+ #c4-arrowhead-selected path {
948
+ fill: var(--blue);
949
+ }
950
+
951
+ .c4-label {
952
+ fill: var(--ink);
953
+ }
954
+
955
+ .edge-strip {
956
+ position: sticky;
957
+ left: 0;
958
+ bottom: 0;
959
+ display: flex;
960
+ gap: 6px;
961
+ align-items: center;
962
+ padding: 6px 8px;
963
+ border-top: 1px solid var(--line);
964
+ background: rgba(12, 14, 17, 0.95);
965
+ overflow: auto;
966
+ }
967
+
968
+ .edge-chip,
969
+ .edge-count {
970
+ flex: 0 0 auto;
971
+ color: var(--muted);
972
+ border: 1px solid var(--line);
973
+ border-radius: 0;
974
+ padding: 3px 6px;
975
+ font-family: var(--font-mono);
976
+ font-size: 11px;
977
+ }
978
+
979
+ .edge-chip {
980
+ color: var(--blue);
981
+ background: transparent;
982
+ }
983
+
984
+ .edge-chip.active {
985
+ color: #002022;
986
+ background: var(--blue);
987
+ border-color: var(--blue);
988
+ }
989
+
990
+ .steps {
991
+ border-top: 1px solid var(--line);
992
+ background: var(--surface);
993
+ }
994
+
995
+ .steps.collapsed {
996
+ padding-block: 6px;
997
+ }
998
+
999
+ .steps-head {
1000
+ display: flex;
1001
+ align-items: center;
1002
+ justify-content: space-between;
1003
+ gap: 10px;
1004
+ margin-bottom: 4px;
1005
+ }
1006
+
1007
+ .steps-title-line {
1008
+ display: flex;
1009
+ min-width: 0;
1010
+ align-items: baseline;
1011
+ gap: 10px;
1012
+ }
1013
+
1014
+ .steps-head h2 {
1015
+ flex: 0 0 auto;
1016
+ font-family: var(--font-headline);
1017
+ font-size: 18px;
1018
+ }
1019
+
1020
+ .steps-title-line p {
1021
+ min-width: 0;
1022
+ overflow: hidden;
1023
+ text-overflow: ellipsis;
1024
+ white-space: nowrap;
1025
+ }
1026
+
1027
+ .steps-actions {
1028
+ display: inline-flex;
1029
+ align-items: center;
1030
+ gap: 6px;
1031
+ }
1032
+
1033
+ .step-list {
1034
+ display: flex;
1035
+ gap: 6px;
1036
+ margin-top: 6px;
1037
+ overflow-x: auto;
1038
+ padding-bottom: 2px;
1039
+ }
1040
+
1041
+ .step-card {
1042
+ flex: 0 0 190px;
1043
+ display: grid;
1044
+ grid-template-columns: auto minmax(0, 1fr);
1045
+ grid-template-rows: auto auto;
1046
+ gap: 3px 8px;
1047
+ min-height: 36px;
1048
+ padding: 6px;
1049
+ text-align: left;
1050
+ }
1051
+
1052
+ .step-card strong {
1053
+ overflow: hidden;
1054
+ font-size: 11px;
1055
+ line-height: 1.25;
1056
+ text-overflow: ellipsis;
1057
+ }
1058
+
1059
+ .step-card span:last-child {
1060
+ overflow: hidden;
1061
+ text-overflow: ellipsis;
1062
+ white-space: nowrap;
1063
+ }
1064
+
1065
+ .step-card.active {
1066
+ border-color: var(--blue);
1067
+ background: #102024;
1068
+ }
1069
+
1070
+ .step-number {
1071
+ grid-row: 1 / span 2;
1072
+ display: inline-grid;
1073
+ place-items: center;
1074
+ width: 20px;
1075
+ height: 20px;
1076
+ border-radius: 0;
1077
+ color: #002022;
1078
+ background: var(--blue);
1079
+ font-family: var(--font-mono);
1080
+ font-weight: 900;
1081
+ }
1082
+
1083
+ .step-card .step-number {
1084
+ color: #001719;
1085
+ background: #7df4ff;
1086
+ }
1087
+
1088
+ .details {
1089
+ padding: 0;
1090
+ }
1091
+
1092
+ .detail-content {
1093
+ height: 100%;
1094
+ overflow: auto;
1095
+ padding: 0 12px 12px;
1096
+ }
1097
+
1098
+ .detail-sticky {
1099
+ position: sticky;
1100
+ z-index: 5;
1101
+ top: 0;
1102
+ padding: 12px 0 8px;
1103
+ border-bottom: 1px solid rgba(0, 219, 233, 0.32);
1104
+ background:
1105
+ linear-gradient(90deg, rgba(0, 219, 233, 0.11), transparent 34%),
1106
+ rgba(26, 28, 31, 0.98);
1107
+ }
1108
+
1109
+ .detail-content h2 {
1110
+ margin: 4px 0 6px;
1111
+ font-family: var(--font-headline);
1112
+ font-size: 20px;
1113
+ letter-spacing: -0.02em;
1114
+ }
1115
+
1116
+ .badge-row {
1117
+ display: flex;
1118
+ flex-wrap: wrap;
1119
+ gap: 4px;
1120
+ margin: 8px 0;
1121
+ }
1122
+
1123
+ .detail-index {
1124
+ display: flex;
1125
+ gap: 4px;
1126
+ margin-top: 8px;
1127
+ overflow-x: auto;
1128
+ padding-bottom: 2px;
1129
+ }
1130
+
1131
+ .detail-index a {
1132
+ flex: 0 0 auto;
1133
+ --section-accent: var(--blue);
1134
+ padding: 3px 6px;
1135
+ border: 1px solid color-mix(in srgb, var(--section-accent) 35%, var(--line));
1136
+ color: color-mix(in srgb, var(--section-accent) 70%, var(--muted));
1137
+ background: color-mix(in srgb, var(--section-accent) 5%, transparent);
1138
+ font-family: var(--font-mono);
1139
+ font-size: 11px;
1140
+ text-decoration: none;
1141
+ }
1142
+
1143
+ .detail-index a:hover,
1144
+ .detail-index a:focus {
1145
+ color: var(--ink);
1146
+ border-color: var(--section-accent, var(--blue));
1147
+ background: color-mix(in srgb, var(--section-accent, var(--blue)) 12%, transparent);
1148
+ }
1149
+
1150
+ .detail-index a[href="#summary"] {
1151
+ --section-accent: var(--blue);
1152
+ }
1153
+
1154
+ .detail-index a[href="#runtime"] {
1155
+ --section-accent: var(--green);
1156
+ }
1157
+
1158
+ .detail-index a[href="#interfaces"] {
1159
+ --section-accent: var(--cyan);
1160
+ }
1161
+
1162
+ .detail-index a[href="#data"] {
1163
+ --section-accent: var(--purple);
1164
+ }
1165
+
1166
+ .detail-index a[href="#security"] {
1167
+ --section-accent: var(--yellow);
1168
+ }
1169
+
1170
+ .detail-index a[href="#observability"] {
1171
+ --section-accent: #7df4ff;
1172
+ }
1173
+
1174
+ .detail-index a[href="#risks"] {
1175
+ --section-accent: var(--red);
1176
+ }
1177
+
1178
+ .detail-index a[href="#decisions"] {
1179
+ --section-accent: #b9cacb;
1180
+ }
1181
+
1182
+ .detail-index a[href="#verification"] {
1183
+ --section-accent: var(--green);
1184
+ }
1185
+
1186
+ .badge {
1187
+ display: inline-flex;
1188
+ align-items: center;
1189
+ gap: 5px;
1190
+ width: fit-content;
1191
+ min-height: 18px;
1192
+ margin-right: 4px;
1193
+ margin-top: 4px;
1194
+ padding: 2px 5px;
1195
+ border: 1px solid var(--line);
1196
+ border-radius: 0;
1197
+ color: var(--muted);
1198
+ background: var(--panel-2);
1199
+ font-family: var(--font-mono);
1200
+ font-size: 10px;
1201
+ font-weight: 700;
1202
+ text-transform: uppercase;
1203
+ }
1204
+
1205
+ .badge::before {
1206
+ width: 6px;
1207
+ height: 6px;
1208
+ background: currentColor;
1209
+ content: "";
1210
+ }
1211
+
1212
+ .badge.implemented,
1213
+ .badge.low {
1214
+ color: var(--green);
1215
+ border-color: rgba(47, 248, 1, 0.45);
1216
+ }
1217
+
1218
+ .badge.partial,
1219
+ .badge.medium {
1220
+ color: var(--yellow);
1221
+ border-color: rgba(254, 214, 57, 0.45);
1222
+ }
1223
+
1224
+ .badge.planned,
1225
+ .badge.high {
1226
+ color: var(--yellow);
1227
+ border-color: rgba(254, 214, 57, 0.45);
1228
+ }
1229
+
1230
+ .badge.critical {
1231
+ color: var(--red);
1232
+ border-color: rgba(255, 180, 171, 0.45);
1233
+ }
1234
+
1235
+ .detail-section {
1236
+ --section-accent: var(--line-strong);
1237
+ position: relative;
1238
+ padding: 10px 0 10px 10px;
1239
+ border-top: 1px solid var(--line);
1240
+ border-left: 2px solid color-mix(in srgb, var(--section-accent) 60%, transparent);
1241
+ background: linear-gradient(90deg, color-mix(in srgb, var(--section-accent) 7%, transparent), transparent 42%);
1242
+ }
1243
+
1244
+ .detail-section#summary {
1245
+ --section-accent: var(--blue);
1246
+ }
1247
+
1248
+ .detail-section#runtime {
1249
+ --section-accent: var(--green);
1250
+ }
1251
+
1252
+ .detail-section#interfaces {
1253
+ --section-accent: var(--cyan);
1254
+ }
1255
+
1256
+ .detail-section#data {
1257
+ --section-accent: var(--purple);
1258
+ }
1259
+
1260
+ .detail-section#security {
1261
+ --section-accent: var(--yellow);
1262
+ }
1263
+
1264
+ .detail-section#observability {
1265
+ --section-accent: #7df4ff;
1266
+ }
1267
+
1268
+ .detail-section#risks {
1269
+ --section-accent: var(--red);
1270
+ }
1271
+
1272
+ .detail-section#decisions {
1273
+ --section-accent: #b9cacb;
1274
+ }
1275
+
1276
+ .detail-section#verification {
1277
+ --section-accent: var(--green);
1278
+ }
1279
+
1280
+ .detail-section h3 {
1281
+ margin: 0 0 6px;
1282
+ color: var(--section-accent);
1283
+ font-family: var(--font-mono);
1284
+ font-size: 11px;
1285
+ letter-spacing: 0.08em;
1286
+ text-transform: uppercase;
1287
+ }
1288
+
1289
+ .detail-section h3::before {
1290
+ display: inline-block;
1291
+ width: 7px;
1292
+ height: 7px;
1293
+ margin-right: 7px;
1294
+ background: currentColor;
1295
+ content: "";
1296
+ }
1297
+
1298
+ .detail-section ul {
1299
+ margin: 0;
1300
+ padding-left: 18px;
1301
+ }
1302
+
1303
+ .detail-section li {
1304
+ margin: 3px 0;
1305
+ color: var(--muted);
1306
+ line-height: 1.35;
1307
+ }
1308
+
1309
+ .text-link {
1310
+ display: block;
1311
+ width: 100%;
1312
+ margin: 4px 0;
1313
+ padding: 6px;
1314
+ text-align: left;
1315
+ }
1316
+
1317
+ .mini-record,
1318
+ .data-class {
1319
+ margin-top: 8px;
1320
+ padding: 8px;
1321
+ border: 1px solid var(--line);
1322
+ border-radius: 0;
1323
+ background: var(--panel-2);
1324
+ }
1325
+
1326
+ .mini-record p,
1327
+ .data-class p {
1328
+ margin-top: 6px;
1329
+ }
1330
+
1331
+ .path-pair {
1332
+ display: grid;
1333
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
1334
+ gap: 6px;
1335
+ align-items: center;
1336
+ margin: 10px 0;
1337
+ }
1338
+
1339
+ .path-pair button {
1340
+ padding: 7px;
1341
+ }
1342
+
1343
+ .filter-row {
1344
+ display: flex;
1345
+ flex-wrap: wrap;
1346
+ gap: 4px;
1347
+ margin-top: 8px;
1348
+ }
1349
+
1350
+ .filter-row button {
1351
+ min-height: 24px;
1352
+ padding: 3px 6px;
1353
+ color: var(--muted);
1354
+ font-family: var(--font-mono);
1355
+ font-size: 10px;
1356
+ text-transform: uppercase;
1357
+ }
1358
+
1359
+ .filter-row button.active {
1360
+ color: #002022;
1361
+ border-color: var(--blue);
1362
+ background: var(--blue);
1363
+ }
1364
+
1365
+ .loading,
1366
+ .fatal {
1367
+ min-height: 100%;
1368
+ display: grid;
1369
+ place-items: center;
1370
+ padding: 24px;
1371
+ }
1372
+
1373
+ .fatal {
1374
+ place-items: start;
1375
+ }
1376
+
1377
+ .fatal pre {
1378
+ max-width: 1100px;
1379
+ overflow: auto;
1380
+ padding: 16px;
1381
+ border: 1px solid var(--red);
1382
+ border-radius: 0;
1383
+ color: var(--red);
1384
+ background: #1d1014;
1385
+ }
1386
+
1387
+ ::-webkit-scrollbar {
1388
+ width: 4px;
1389
+ height: 4px;
1390
+ }
1391
+
1392
+ ::-webkit-scrollbar-thumb {
1393
+ background: var(--line);
1394
+ border-radius: 0;
1395
+ }
1396
+
1397
+ ::-webkit-scrollbar-track {
1398
+ background: transparent;
1399
+ }
1400
+
1401
+ @media (max-width: 900px) {
1402
+ .app,
1403
+ .app.left-collapsed,
1404
+ .app.right-collapsed,
1405
+ .app.left-collapsed.right-collapsed {
1406
+ grid-template-columns: 1fr;
1407
+ grid-template-rows: auto auto minmax(480px, 1fr) auto;
1408
+ overflow: auto;
1409
+ }
1410
+
1411
+ .left-nav,
1412
+ .diagram-area,
1413
+ .details {
1414
+ grid-column: 1;
1415
+ grid-row: auto;
1416
+ }
1417
+
1418
+ .left-nav,
1419
+ .details {
1420
+ max-height: 420px;
1421
+ }
1422
+
1423
+ .side-toggle {
1424
+ display: none;
1425
+ }
1426
+
1427
+ .topbar,
1428
+ .diagram-header {
1429
+ flex-direction: column;
1430
+ align-items: stretch;
1431
+ }
1432
+
1433
+ .mode-tabs,
1434
+ .legend {
1435
+ justify-content: flex-start;
1436
+ }
1437
+ }
1438
+
1439
+ @media (max-width: 760px) {
1440
+ .app,
1441
+ .app.left-collapsed,
1442
+ .app.right-collapsed,
1443
+ .app.left-collapsed.right-collapsed {
1444
+ padding: 8px;
1445
+ gap: 8px;
1446
+ }
1447
+
1448
+ .app.left-collapsed,
1449
+ .app.right-collapsed,
1450
+ .app.left-collapsed.right-collapsed {
1451
+ grid-template-rows: auto auto minmax(520px, 1fr) auto;
1452
+ }
1453
+
1454
+ .app.left-collapsed .left-nav,
1455
+ .app.right-collapsed .details {
1456
+ min-height: 48px;
1457
+ max-height: 56px;
1458
+ }
1459
+
1460
+ .side-toggle {
1461
+ display: grid;
1462
+ }
1463
+
1464
+ .details {
1465
+ max-height: 70vh;
1466
+ }
1467
+
1468
+ .step-card {
1469
+ flex-basis: 260px;
1470
+ }
1471
+
1472
+ .diagram-controls {
1473
+ flex-wrap: wrap;
1474
+ }
1475
+ }