@crvouga/atlas 0.10.2 → 0.12.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 (114) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -0
  3. package/dist/reports/src/catalog-health.d.ts +142 -0
  4. package/dist/reports/src/catalog-health.js +257 -0
  5. package/dist/reports/src/test-catalog.d.ts +8 -0
  6. package/dist/reports/src/test-catalog.js +5 -1
  7. package/dist/schema/src/api.d.ts +79 -0
  8. package/dist/schema/src/api.js +50 -0
  9. package/dist/server/src/app.js +9 -0
  10. package/dist/server/src/llms.js +1 -0
  11. package/dist/server/src/openapi.js +18 -2
  12. package/dist/server/src/settings-page.d.ts +4 -4
  13. package/dist/server/src/settings-page.js +17 -78
  14. package/docs/reference/http-api.md +34 -0
  15. package/docs/reference/reports.md +224 -0
  16. package/docs/reference/schema.md +10 -0
  17. package/docs/reference/server.md +4 -4
  18. package/docs/server.md +10 -0
  19. package/docs/ui.md +142 -0
  20. package/docs/workspaces.md +130 -0
  21. package/llms-full.txt +322 -0
  22. package/llms.txt +2 -0
  23. package/package.json +17 -10
  24. package/packages/schema/schemas/catalog-health.schema.json +400 -0
  25. package/packages/server/openapi.json +596 -0
  26. package/packages/visualizer/src/admin/SettingsPage.tsx +456 -0
  27. package/packages/visualizer/src/admin/main.tsx +11 -0
  28. package/packages/visualizer/src/app/AppShell.tsx +62 -38
  29. package/packages/visualizer/src/app/gazetteer.tsx +90 -83
  30. package/packages/visualizer/src/app/router.tsx +33 -15
  31. package/packages/visualizer/src/components/ActivityIndicator.tsx +4 -5
  32. package/packages/visualizer/src/components/DataIssues.tsx +36 -54
  33. package/packages/visualizer/src/components/Header.tsx +197 -125
  34. package/packages/visualizer/src/components/Legend.tsx +13 -41
  35. package/packages/visualizer/src/components/ProjectPicker.tsx +61 -26
  36. package/packages/visualizer/src/components/Screen.tsx +80 -71
  37. package/packages/visualizer/src/components/SpecLogo.tsx +15 -0
  38. package/packages/visualizer/src/components/Status.tsx +20 -34
  39. package/packages/visualizer/src/components/labels.tsx +8 -3
  40. package/packages/visualizer/src/components/spec-logos/APACHE-2.0.txt +206 -0
  41. package/packages/visualizer/src/components/spec-logos/CAMUNDA-MIT.txt +21 -0
  42. package/packages/visualizer/src/components/spec-logos/FILE-ICONS-ISC.txt +13 -0
  43. package/packages/visualizer/src/components/spec-logos/README.md +23 -0
  44. package/packages/visualizer/src/components/spec-logos/SIMPLE-ICONS-CC0.txt +30 -0
  45. package/packages/visualizer/src/components/spec-logos/alloy.svg +1 -0
  46. package/packages/visualizer/src/components/spec-logos/dmn.svg +3 -0
  47. package/packages/visualizer/src/components/spec-logos/gherkin.svg +1 -0
  48. package/packages/visualizer/src/components/spec-logos/openslo.svg +63 -0
  49. package/packages/visualizer/src/components/spec-logos/quint.svg +1 -0
  50. package/packages/visualizer/src/evidence/artifacts.tsx +263 -110
  51. package/packages/visualizer/src/evidence/chart-source.tsx +18 -0
  52. package/packages/visualizer/src/evidence/check-detail.tsx +283 -139
  53. package/packages/visualizer/src/evidence/decision-table.tsx +35 -26
  54. package/packages/visualizer/src/evidence/document-page.tsx +51 -29
  55. package/packages/visualizer/src/evidence/feature-page.tsx +121 -53
  56. package/packages/visualizer/src/evidence/marks.tsx +112 -79
  57. package/packages/visualizer/src/evidence/model-page.tsx +77 -46
  58. package/packages/visualizer/src/evidence/model-trace.tsx +55 -35
  59. package/packages/visualizer/src/evidence/overview.tsx +137 -69
  60. package/packages/visualizer/src/evidence/recording-page.tsx +70 -31
  61. package/packages/visualizer/src/evidence/recording.tsx +135 -68
  62. package/packages/visualizer/src/evidence/snapshot.tsx +99 -43
  63. package/packages/visualizer/src/evidence/source-text.tsx +33 -0
  64. package/packages/visualizer/src/evidence/sources-panel.tsx +138 -144
  65. package/packages/visualizer/src/evidence/spec-header.tsx +52 -36
  66. package/packages/visualizer/src/evidence/spec-index.tsx +61 -32
  67. package/packages/visualizer/src/evidence/spec-page.tsx +56 -25
  68. package/packages/visualizer/src/evidence/test-filter.tsx +38 -14
  69. package/packages/visualizer/src/explorer/Explorer.tsx +688 -261
  70. package/packages/visualizer/src/explorer/ExplorerIndex.tsx +136 -68
  71. package/packages/visualizer/src/explorer/RunsView.tsx +307 -94
  72. package/packages/visualizer/src/explorer/TestDetail.tsx +393 -118
  73. package/packages/visualizer/src/explorer/parts.tsx +35 -13
  74. package/packages/visualizer/src/find/Finder.tsx +106 -90
  75. package/packages/visualizer/src/find/open.ts +17 -20
  76. package/packages/visualizer/src/live/test-progress.tsx +60 -22
  77. package/packages/visualizer/src/looks/Stage.tsx +223 -110
  78. package/packages/visualizer/src/main.tsx +9 -11
  79. package/packages/visualizer/src/map/ChartMap.tsx +125 -69
  80. package/packages/visualizer/src/map/EventEdge.tsx +59 -37
  81. package/packages/visualizer/src/map/map.module.css +12 -546
  82. package/packages/visualizer/src/map/nodes.tsx +124 -70
  83. package/packages/visualizer/src/reachable.test.ts +3 -2
  84. package/packages/visualizer/src/spec-kind.ts +2 -2
  85. package/packages/visualizer/src/ui/grammars/ALLOY-MIT.txt +21 -0
  86. package/packages/visualizer/src/ui/grammars/QUINT-APACHE-2.0.txt +206 -0
  87. package/packages/visualizer/src/ui/grammars/README.md +14 -0
  88. package/packages/visualizer/src/ui/grammars/alloy.json +71 -0
  89. package/packages/visualizer/src/ui/grammars/quint.json +152 -0
  90. package/packages/visualizer/src/ui/highlight.ts +50 -0
  91. package/packages/visualizer/src/ui/theme.tsx +109 -0
  92. package/packages/visualizer/src/views/ChartPage.tsx +46 -26
  93. package/packages/visualizer/src/views/ChartTests.tsx +59 -22
  94. package/packages/visualizer/src/views/ProductPage.tsx +16 -15
  95. package/packages/visualizer/src/views/SidePanel.tsx +241 -131
  96. package/packages/visualizer/src/app/gazetteer.module.css +0 -107
  97. package/packages/visualizer/src/components/ActivityIndicator.module.css +0 -4
  98. package/packages/visualizer/src/components/DataIssues.module.css +0 -136
  99. package/packages/visualizer/src/components/Header.module.css +0 -114
  100. package/packages/visualizer/src/components/Legend.module.css +0 -84
  101. package/packages/visualizer/src/components/Screen.module.css +0 -312
  102. package/packages/visualizer/src/components/Status.module.css +0 -116
  103. package/packages/visualizer/src/components/icons.tsx +0 -156
  104. package/packages/visualizer/src/evidence/artifacts.module.css +0 -213
  105. package/packages/visualizer/src/evidence/evidence.module.css +0 -907
  106. package/packages/visualizer/src/evidence/recording.module.css +0 -460
  107. package/packages/visualizer/src/evidence/sources.module.css +0 -168
  108. package/packages/visualizer/src/evidence/spec-snapshot.tsx +0 -26
  109. package/packages/visualizer/src/explorer/explorer.module.css +0 -1238
  110. package/packages/visualizer/src/find/Finder.module.css +0 -168
  111. package/packages/visualizer/src/looks/stage.module.css +0 -300
  112. package/packages/visualizer/src/styles/global.css +0 -105
  113. package/packages/visualizer/src/styles/tokens.css +0 -80
  114. package/packages/visualizer/src/views/views.module.css +0 -546
@@ -1,546 +1,12 @@
1
- .flow {
2
- width: 100%;
3
- height: 100%;
4
- background: radial-gradient(circle at 1px 1px, #d5e0e7 1px, transparent 0) 0 0 / 22px 22px;
5
- }
6
-
7
- .markers {
8
- position: absolute;
9
- width: 0;
10
- height: 0;
11
- }
12
-
13
- .handle {
14
- opacity: 0;
15
- pointer-events: none;
16
- width: 1px;
17
- height: 1px;
18
- min-width: 0;
19
- min-height: 0;
20
- border: 0;
21
- }
22
-
23
- /* Screens */
24
-
25
- .screen {
26
- position: relative;
27
- box-sizing: border-box;
28
- width: 100%;
29
- height: 100%;
30
- display: flex;
31
- flex-direction: column;
32
- align-items: stretch;
33
- gap: 0.4rem;
34
- padding: 6px;
35
- background: var(--card);
36
- border: 2px solid var(--line);
37
- border-radius: 1rem;
38
- color: var(--ink);
39
- text-decoration: none;
40
- box-shadow: var(--shadow-card);
41
- transition:
42
- box-shadow 160ms var(--ease),
43
- border-color 160ms var(--ease),
44
- opacity var(--fade) var(--ease);
45
- }
46
-
47
- .screen:hover {
48
- box-shadow: var(--shadow-raised);
49
- }
50
-
51
- .screen[data-status='passed'] {
52
- border-color: var(--passed-line);
53
- }
54
- .screen[data-status='failed'] {
55
- border-color: var(--failed);
56
- }
57
- .screen[data-status='flaky'] {
58
- border-color: var(--flaky);
59
- }
60
- .screen[data-status='not-reached'],
61
- .screen[data-status='not-yet-run'],
62
- .screen[data-status='spec-only'] {
63
- border-style: dashed;
64
- border-color: var(--line-2);
65
- }
66
-
67
- .screen[data-final='true'] {
68
- box-shadow:
69
- 0 0 0 3px var(--card),
70
- 0 0 0 4.5px var(--line-2),
71
- var(--shadow-card);
72
- }
73
-
74
- .screen[data-selected='true'] {
75
- box-shadow: 0 0 0 2px var(--place);
76
- }
77
-
78
- .screen[data-dimmed='true'],
79
- .chartLink[data-dimmed='true'],
80
- .context[data-dimmed='true'],
81
- .summary[data-dimmed='true'] {
82
- opacity: 0.35;
83
- }
84
-
85
- .screenLabel {
86
- font-size: 0.78rem;
87
- font-weight: 600;
88
- line-height: 1.2;
89
- display: grid;
90
- grid-template-columns: auto 1fr;
91
- gap: 0.35rem;
92
- align-items: baseline;
93
- padding: 0 0.15rem;
94
- overflow: hidden;
95
- }
96
-
97
- .screenLabel > span:last-child {
98
- display: -webkit-box;
99
- -webkit-line-clamp: 3;
100
- -webkit-box-orient: vertical;
101
- overflow: hidden;
102
- }
103
-
104
- .assumed {
105
- position: absolute;
106
- top: 12px;
107
- right: 12px;
108
- font-size: 0.6rem;
109
- font-weight: 700;
110
- padding: 0.1rem 0.4rem;
111
- border-radius: var(--pill);
112
- color: var(--ink-3);
113
- background: rgba(241, 245, 249, 0.95);
114
- border: 1px dashed var(--faint);
115
- }
116
-
117
- /* Groups and regions */
118
-
119
- .group {
120
- width: 100%;
121
- height: 100%;
122
- border: 1px solid var(--line);
123
- border-radius: var(--radius-xl);
124
- background: rgba(255, 255, 255, 0.55);
125
- }
126
-
127
- .group[data-variant='region'] {
128
- border-style: dashed;
129
- border-color: var(--line-2);
130
- background: rgba(248, 250, 252, 0.6);
131
- }
132
-
133
- .group[data-variant='parallel'] {
134
- border-style: dashed;
135
- }
136
-
137
- .groupLabel {
138
- position: absolute;
139
- top: 0.7rem;
140
- left: 1rem;
141
- right: 1rem;
142
- display: flex;
143
- gap: 0.45rem;
144
- align-items: center;
145
- font-size: 0.85rem;
146
- font-weight: 400;
147
- color: var(--ink-2);
148
- white-space: nowrap;
149
- overflow: hidden;
150
- text-overflow: ellipsis;
151
- }
152
-
153
- .group[data-variant='region'] .groupLabel {
154
- color: var(--ink-2);
155
- }
156
-
157
- .groupTag {
158
- font-size: 0.65rem;
159
- font-weight: 400;
160
- color: var(--ink-3);
161
- background: var(--bg);
162
- border-radius: var(--pill);
163
- padding: 0.1rem 0.5rem;
164
- }
165
-
166
- /* Child chart box */
167
-
168
- .chartLink {
169
- width: 100%;
170
- height: 100%;
171
- display: flex;
172
- flex-direction: column;
173
- gap: 0.45rem;
174
- justify-content: center;
175
- padding: 1rem 1.1rem;
176
- background: var(--card);
177
- border: 1px solid var(--line);
178
- border-radius: var(--radius-lg);
179
- color: var(--ink);
180
- text-decoration: none;
181
- box-shadow: var(--shadow-card);
182
- transition: opacity var(--fade) var(--ease);
183
- }
184
-
185
- .chartTitle {
186
- font-size: 1rem;
187
- line-height: 1.2;
188
- }
189
-
190
- .chartDescription {
191
- font-size: 0.78rem;
192
- color: var(--ink-3);
193
- display: -webkit-box;
194
- -webkit-line-clamp: 2;
195
- -webkit-box-orient: vertical;
196
- overflow: hidden;
197
- }
198
-
199
- .chartCta {
200
- font-size: 0.8rem;
201
- color: var(--place);
202
- }
203
-
204
- /* Screens from other charts */
205
-
206
- .context {
207
- width: 100%;
208
- height: 100%;
209
- display: flex;
210
- flex-direction: column;
211
- justify-content: center;
212
- gap: 0.35rem;
213
- padding: 0.75rem;
214
- background: var(--bg);
215
- border: 1.5px dashed var(--line-2);
216
- border-radius: var(--radius-lg);
217
- color: var(--ink);
218
- text-decoration: none;
219
- transition: opacity var(--fade) var(--ease);
220
- }
221
-
222
- .context:hover {
223
- border-color: var(--place);
224
- }
225
-
226
- .contextChart {
227
- font-size: 0.65rem;
228
- font-weight: 400;
229
- color: var(--muted);
230
- }
231
-
232
- /* A collapsed section: the name and how many places are inside. */
233
-
234
- .summary {
235
- width: 100%;
236
- height: 100%;
237
- display: flex;
238
- flex-direction: column;
239
- justify-content: center;
240
- gap: 0.35rem;
241
- padding: 0.85rem 1rem;
242
- background: var(--card);
243
- border: 1px solid var(--line);
244
- border-radius: var(--radius-lg);
245
- color: var(--ink);
246
- text-decoration: none;
247
- box-shadow: var(--shadow-card);
248
- }
249
-
250
- .summary:hover {
251
- border-color: var(--place);
252
- }
253
-
254
- .summary[data-status='failed'] {
255
- border-color: var(--failed);
256
- }
257
-
258
- .summary[data-status='flaky'] {
259
- border-color: var(--flaky);
260
- }
261
-
262
- .summaryName {
263
- display: flex;
264
- gap: 0.45rem;
265
- align-items: center;
266
- font-size: 0.95rem;
267
- font-weight: 700;
268
- line-height: 1.2;
269
- }
270
-
271
- .summaryCount {
272
- font-size: 0.8rem;
273
- color: var(--ink-2);
274
- }
275
-
276
- /* The flow pane owns the drag. These boxes still need their own clicks. */
277
- .screen,
278
- .summary,
279
- .chartLink,
280
- .context {
281
- pointer-events: all;
282
- }
283
-
284
- .contextName {
285
- display: grid;
286
- grid-template-columns: auto 1fr;
287
- gap: 0.35rem;
288
- align-items: baseline;
289
- font-size: 0.8rem;
290
- font-weight: 600;
291
- line-height: 1.25;
292
- }
293
-
294
- /* Edges and event chips */
295
-
296
- .edge {
297
- fill: none;
298
- stroke: var(--line-2);
299
- stroke-width: 2;
300
- transition:
301
- stroke var(--fade) var(--ease),
302
- opacity var(--fade) var(--ease);
303
- }
304
-
305
- .edge[data-kind='user'][data-status='passed'],
306
- .edge[data-kind='user'][data-status='flaky'] {
307
- stroke: var(--user-line);
308
- }
309
- .edge[data-kind='system'][data-status='passed'],
310
- .edge[data-kind='system'][data-status='flaky'] {
311
- stroke: var(--system-line);
312
- }
313
- .edge[data-kind='time'][data-status='passed'],
314
- .edge[data-kind='time'][data-status='flaky'] {
315
- stroke: var(--time-line);
316
- }
317
- .edge[data-kind='hand-off'][data-status='passed'] {
318
- stroke: var(--handoff-line);
319
- }
320
- .edge[data-status='failed'] {
321
- stroke: var(--failed-line);
322
- }
323
- .edge[data-unchecked='true'] {
324
- stroke-dasharray: 6 5;
325
- }
326
- .edge[data-selected='true'],
327
- .edge[data-highlight='true'] {
328
- stroke: var(--place);
329
- stroke-width: 2.5;
330
- stroke-dasharray: none;
331
- }
332
- .edge[data-dimmed='true'] {
333
- opacity: 0.25;
334
- }
335
-
336
- .chip {
337
- position: absolute;
338
- z-index: 1;
339
- height: 28px;
340
- display: flex;
341
- align-items: center;
342
- gap: 0.35rem;
343
- padding: 0 0.6rem 0 0.4rem;
344
- border-radius: var(--pill);
345
- font-size: 0.72rem;
346
- font-weight: 600;
347
- text-decoration: none;
348
- white-space: nowrap;
349
- overflow: hidden;
350
- border: 1.5px solid;
351
- pointer-events: all;
352
- transition:
353
- transform 160ms var(--ease),
354
- box-shadow 160ms var(--ease),
355
- opacity var(--fade) var(--ease);
356
- }
357
-
358
- .chip[data-kind='user'] {
359
- background: var(--user-soft);
360
- color: var(--user-ink);
361
- border-color: var(--user-line);
362
- }
363
- .chip[data-kind='system'] {
364
- background: var(--system-soft);
365
- color: var(--system-ink);
366
- border-color: var(--system-line);
367
- }
368
- .chip[data-kind='time'] {
369
- background: var(--time-soft);
370
- color: var(--time-ink);
371
- border-color: var(--time-line);
372
- }
373
- .chip[data-kind='hand-off'] {
374
- background: var(--handoff-soft);
375
- color: var(--handoff-ink);
376
- border-color: var(--handoff-line);
377
- }
378
- .chip[data-unchecked='true'] {
379
- background: var(--bg);
380
- color: var(--ink-3);
381
- border-color: var(--line-2);
382
- border-style: dashed;
383
- }
384
- .chip[data-status='failed'] {
385
- border-color: var(--failed);
386
- color: var(--failed-ink);
387
- }
388
- .chip[data-status='flaky'] {
389
- border-color: var(--flaky-ink);
390
- color: var(--flaky-ink);
391
- }
392
- .chip[data-selected='true'] {
393
- outline: 2px solid var(--place);
394
- outline-offset: 1px;
395
- }
396
- .chip[data-highlight='true'] {
397
- box-shadow: var(--shadow-raised);
398
- }
399
- .chip[data-dimmed='true'] {
400
- opacity: 0.3;
401
- }
402
- .chip:hover {
403
- box-shadow: 0 4px 12px rgba(15, 23, 42, 0.12);
404
- }
405
-
406
- .chipIcon {
407
- flex: none;
408
- display: inline-grid;
409
- place-items: center;
410
- width: 18px;
411
- height: 18px;
412
- border-radius: 50%;
413
- background: rgba(255, 255, 255, 0.85);
414
- }
415
-
416
- .chip[data-kind='user'] .chipIcon {
417
- color: var(--user);
418
- }
419
- .chip[data-kind='system'] .chipIcon {
420
- color: var(--system);
421
- }
422
- .chip[data-kind='time'] .chipIcon {
423
- color: var(--time);
424
- }
425
- .chip[data-kind='hand-off'] .chipIcon {
426
- color: var(--handoff);
427
- }
428
-
429
- .chipText {
430
- overflow: hidden;
431
- text-overflow: ellipsis;
432
- }
433
-
434
- .stepNo {
435
- flex: none;
436
- background: var(--user);
437
- color: #fff;
438
- border-radius: var(--pill);
439
- min-width: 1.3rem;
440
- height: 1.3rem;
441
- display: inline-grid;
442
- place-items: center;
443
- font-size: 0.7rem;
444
- }
445
-
446
- /* Controls */
447
-
448
- .zoom {
449
- position: absolute;
450
- right: 1rem;
451
- top: 1rem;
452
- display: flex;
453
- flex-direction: column;
454
- gap: 0.4rem;
455
- z-index: 5;
456
- }
457
-
458
- .zoomButton {
459
- width: 2.25rem;
460
- height: 2.25rem;
461
- display: grid;
462
- place-items: center;
463
- border: 1px solid var(--line);
464
- background: var(--card);
465
- color: var(--ink);
466
- border-radius: var(--pill);
467
- cursor: pointer;
468
- box-shadow: var(--shadow-card);
469
- }
470
-
471
- .zoomButton:hover {
472
- border-color: var(--place);
473
- color: var(--place);
474
- }
475
-
476
- .legendSlot {
477
- position: absolute;
478
- left: 1rem;
479
- bottom: 1rem;
480
- z-index: 5;
481
- max-width: calc(100% - 15rem);
482
- }
483
-
484
- .minimap {
485
- width: 180px;
486
- height: 120px;
487
- }
488
-
489
- /* Loading and messages */
490
-
491
- .skeleton,
492
- .mapMessage {
493
- height: 100%;
494
- display: flex;
495
- flex-direction: column;
496
- align-items: center;
497
- justify-content: center;
498
- gap: 1.25rem;
499
- color: var(--muted);
500
- background: radial-gradient(circle at 1px 1px, #e2e8f0 1px, transparent 0) 0 0 / 22px 22px;
501
- }
502
-
503
- .skeletonRow {
504
- display: flex;
505
- gap: 2.5rem;
506
- }
507
-
508
- .skeletonPhone {
509
- width: 120px;
510
- height: 260px;
511
- border-radius: 1rem;
512
- border: 2px dashed var(--line-2);
513
- background: linear-gradient(100deg, var(--bg-2) 30%, #e9eef5 50%, var(--bg-2) 70%) 0 0 / 300% 100%;
514
- animation: shimmer 1.4s linear infinite;
515
- }
516
-
517
- @keyframes shimmer {
518
- to {
519
- background-position: -150% 0;
520
- }
521
- }
522
-
523
- .skeletonLabel {
524
- font-size: 0.9rem;
525
- }
526
-
527
- .retryButton {
528
- border: 1px solid var(--line);
529
- background: var(--card);
530
- color: var(--user);
531
- border-radius: var(--pill);
532
- padding: 0.4rem 0.9rem;
533
- cursor: pointer;
534
- }
535
-
536
- @media (max-width: 900px) {
537
- .legendSlot {
538
- max-width: calc(100% - 2rem);
539
- bottom: auto;
540
- top: 1rem;
541
- right: 4rem;
542
- }
543
- .minimap {
544
- display: none;
545
- }
546
- }
1
+ /* React Flow requires geometry and SVG edge styles. Ordinary UI uses Mantine. */
2
+ .handle { opacity: 0; pointer-events: none; }
3
+ .markers { position: absolute; width: 0; height: 0; }
4
+ .node { text-decoration: none; color: var(--mantine-color-text); }
5
+ .node[data-selected='true'] { outline: 2px solid var(--mantine-primary-color-filled); }
6
+ .node[data-status='failed'] { border-color: var(--mantine-color-red-6); }
7
+ .node[data-dimmed='true'], .chip[data-dimmed='true'], .edge[data-dimmed='true'] { opacity: 0.35; }
8
+ .edge { fill: none; stroke: var(--mantine-color-gray-6); stroke-width: 1.5; }
9
+ .edge[data-kind='user'] { stroke: var(--mantine-color-blue-7); }
10
+ .edge[data-selected='true'], .edge[data-highlight='true'] { stroke: var(--mantine-primary-color-filled); stroke-width: 2.5; }
11
+ .edge[data-unchecked='true'] { stroke: var(--mantine-color-gray-4); stroke-dasharray: 5 4; }
12
+ .chip { position: absolute; pointer-events: all; max-width: none; text-decoration: none; }