@dskripchenko/flow 0.0.0-stage → 1.0.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.
package/dist/style.css ADDED
@@ -0,0 +1,1119 @@
1
+ /*
2
+ * @dskripchenko/flow — styles of the viewer and the editor. Colours come from
3
+ * the kit's tokens (--uid-*), so light and dark themes follow the kit.
4
+ * Hosts may override the --fl-* variables on .fl-view / .fl-editor.
5
+ */
6
+
7
+ .fl-view,
8
+ .fl-editor {
9
+ --fl-bg: var(--uid-surface-base, #fafafa);
10
+ --fl-grid: color-mix(in srgb, var(--uid-text-tertiary, #a1a1aa) 45%, transparent);
11
+ --fl-node-bg: var(--uid-surface-raised, #fff);
12
+ --fl-node-border: var(--uid-border-default, #d4d4d8);
13
+ --fl-node-text: var(--uid-text-primary, #18181b);
14
+ --fl-node-muted: var(--uid-text-secondary, #71717a);
15
+ --fl-edge: color-mix(in srgb, var(--uid-text-tertiary, #a1a1aa) 85%, var(--uid-text-secondary, #71717a));
16
+ --fl-accent: var(--uid-accent, #14b8a6);
17
+ --fl-accent-subtle: var(--uid-accent-subtle, #f0fdfa);
18
+ --fl-success: var(--uid-success, #059669);
19
+ --fl-success-subtle: var(--uid-success-subtle, #ecfdf5);
20
+ --fl-danger: var(--uid-danger, #e11d48);
21
+ --fl-danger-subtle: var(--uid-danger-subtle, #fff1f2);
22
+ --fl-warning: var(--uid-warning, #d97706);
23
+ --fl-warning-subtle: var(--uid-warning-subtle, #fffbeb);
24
+ --fl-info: var(--uid-info, #2563eb);
25
+ --fl-info-subtle: var(--uid-info-subtle, #eff6ff);
26
+ --fl-shadow: color-mix(in srgb, var(--uid-text-primary, #18181b) 9%, transparent);
27
+ --fl-font: var(--uid-font-family-sans, system-ui, sans-serif);
28
+ --fl-radius: var(--uid-radius-lg, 12px);
29
+
30
+ position: relative;
31
+ display: flex;
32
+ min-height: 360px;
33
+ height: 100%;
34
+ font-family: var(--fl-font);
35
+ color: var(--fl-node-text);
36
+ }
37
+
38
+ /* ------------------------------------------------------------------ canvas */
39
+
40
+ .fl-canvas {
41
+ position: relative;
42
+ flex: 1 1 auto;
43
+ min-width: 0;
44
+ min-height: inherit;
45
+ overflow: hidden;
46
+ background: var(--fl-bg);
47
+ border-radius: inherit;
48
+ touch-action: none;
49
+ user-select: none;
50
+ -webkit-user-select: none;
51
+ cursor: grab;
52
+ outline: none;
53
+ }
54
+ .fl-canvas.is-panning,
55
+ .fl-canvas.is-space,
56
+ .fl-canvas.is-space * {
57
+ cursor: grabbing;
58
+ }
59
+ .fl-canvas.is-editable {
60
+ cursor: default;
61
+ }
62
+ .fl-canvas.is-connecting,
63
+ .fl-canvas.is-connecting * {
64
+ cursor: crosshair;
65
+ }
66
+ .fl-svg {
67
+ position: absolute;
68
+ inset: 0;
69
+ width: 100%;
70
+ height: 100%;
71
+ display: block;
72
+ font-family: var(--fl-font);
73
+ }
74
+ .fl-canvas.is-animating .fl-viewport {
75
+ transition: transform 240ms var(--uid-ease-out, ease-out);
76
+ }
77
+ .fl-grid-dot {
78
+ fill: var(--fl-grid);
79
+ }
80
+
81
+ /* ------------------------------------------------------------------ groups */
82
+
83
+ .fl-group rect {
84
+ fill: color-mix(in srgb, var(--fl-node-muted) 6%, transparent);
85
+ stroke: color-mix(in srgb, var(--fl-node-muted) 35%, transparent);
86
+ stroke-dasharray: 5 4;
87
+ stroke-width: 1;
88
+ }
89
+ .fl-group__label {
90
+ font-size: 11px;
91
+ font-weight: 600;
92
+ letter-spacing: 0.04em;
93
+ text-transform: uppercase;
94
+ fill: var(--fl-node-muted);
95
+ }
96
+
97
+ /* ------------------------------------------------------------------- edges */
98
+
99
+ .fl-edge__hit {
100
+ fill: none;
101
+ stroke: transparent;
102
+ stroke-width: 16;
103
+ pointer-events: stroke;
104
+ cursor: pointer;
105
+ }
106
+ .fl-edge__line {
107
+ fill: none;
108
+ stroke: var(--fl-edge);
109
+ stroke-width: 1.6;
110
+ stroke-linecap: round;
111
+ stroke-linejoin: round;
112
+ pointer-events: none;
113
+ transition: stroke 120ms;
114
+ }
115
+ .fl-edge.is-hovered .fl-edge__line {
116
+ stroke: var(--fl-node-muted);
117
+ stroke-width: 2;
118
+ }
119
+ .fl-edge.is-association .fl-edge__line {
120
+ stroke-dasharray: 3 4;
121
+ stroke-width: 1.2;
122
+ }
123
+ .fl-edge.is-traversed .fl-edge__line {
124
+ stroke: color-mix(in srgb, var(--fl-success) 75%, var(--fl-edge));
125
+ stroke-width: 2;
126
+ }
127
+ .fl-edge.is-path .fl-edge__line {
128
+ stroke: var(--fl-accent);
129
+ stroke-width: 2.6;
130
+ }
131
+ .fl-edge__flow {
132
+ fill: none;
133
+ stroke: color-mix(in srgb, var(--fl-node-bg) 80%, transparent);
134
+ stroke-width: 1.4;
135
+ stroke-dasharray: 2 12;
136
+ stroke-linecap: round;
137
+ pointer-events: none;
138
+ animation: fl-flow 1.1s linear infinite;
139
+ }
140
+ .fl-edge.is-disabled .fl-edge__line {
141
+ stroke-dasharray: 5 5;
142
+ opacity: 0.45;
143
+ }
144
+ .fl-edge.is-selected .fl-edge__line,
145
+ .fl-edge.is-focused .fl-edge__line {
146
+ stroke: var(--fl-accent);
147
+ stroke-width: 2.6;
148
+ }
149
+ .fl-edge.has-error .fl-edge__line {
150
+ stroke: var(--fl-danger);
151
+ }
152
+ .fl-edge.has-warning .fl-edge__line {
153
+ stroke: var(--fl-warning);
154
+ }
155
+ .fl-arrow path {
156
+ fill: var(--fl-edge);
157
+ }
158
+ .fl-arrow--accent path {
159
+ fill: var(--fl-accent);
160
+ }
161
+ .fl-arrow--success path {
162
+ fill: color-mix(in srgb, var(--fl-success) 75%, var(--fl-edge));
163
+ }
164
+ .fl-arrow--muted path {
165
+ fill: var(--fl-edge);
166
+ opacity: 0.45;
167
+ }
168
+ .fl-arrow--danger path {
169
+ fill: var(--fl-danger);
170
+ }
171
+
172
+ .fl-edge-label {
173
+ cursor: pointer;
174
+ outline: none;
175
+ }
176
+ .fl-edge-label__bg {
177
+ fill: var(--fl-bg);
178
+ stroke: var(--uid-border-subtle, #e4e4e7);
179
+ stroke-width: 1;
180
+ }
181
+ .fl-edge-label__text {
182
+ font-size: 12px;
183
+ font-weight: 500;
184
+ fill: var(--fl-node-muted);
185
+ }
186
+ .fl-edge-label.is-path .fl-edge-label__bg {
187
+ stroke: color-mix(in srgb, var(--fl-accent) 55%, transparent);
188
+ fill: var(--fl-accent-subtle);
189
+ }
190
+ .fl-edge-label.is-path .fl-edge-label__text {
191
+ fill: var(--uid-accent-text, var(--fl-accent));
192
+ }
193
+ .fl-edge-label.is-selected .fl-edge-label__bg,
194
+ .fl-edge-label.is-focused .fl-edge-label__bg {
195
+ stroke: var(--fl-accent);
196
+ stroke-width: 1.5;
197
+ }
198
+ .fl-edge-label.is-disabled {
199
+ opacity: 0.5;
200
+ }
201
+ .fl-edge-label.is-disabled .fl-edge-label__text {
202
+ text-decoration: line-through;
203
+ }
204
+ .fl-edge-label:not(:has(rect)) {
205
+ pointer-events: none;
206
+ }
207
+
208
+
209
+ /* ------------------------------------------------------------------- nodes */
210
+
211
+ .fl-node-wrap {
212
+ cursor: pointer;
213
+ outline: none;
214
+ }
215
+ .fl-canvas.is-editable .fl-node-wrap {
216
+ cursor: grab;
217
+ }
218
+ .fl-canvas.is-dragging .fl-node-wrap {
219
+ cursor: grabbing;
220
+ }
221
+ .fl-node__body {
222
+ fill: var(--fl-node-bg);
223
+ stroke: var(--fl-node-border);
224
+ stroke-width: 1;
225
+ transition: stroke 120ms, fill 120ms;
226
+ }
227
+ .fl-node__shadow {
228
+ fill: var(--fl-shadow);
229
+ }
230
+ .fl-node-wrap.is-hovered .fl-node__body {
231
+ stroke: var(--uid-border-hover, #a1a1aa);
232
+ }
233
+ .fl-node__label {
234
+ font-size: 14px;
235
+ font-weight: 500;
236
+ fill: var(--fl-node-text);
237
+ pointer-events: none;
238
+ }
239
+ .fl-node__label--outside {
240
+ font-size: 13px;
241
+ fill: var(--fl-node-muted);
242
+ }
243
+ .fl-node__desc {
244
+ font-size: 12px;
245
+ font-weight: 400;
246
+ fill: var(--fl-node-muted);
247
+ }
248
+ .fl-node__tile rect {
249
+ fill: var(--fl-accent-subtle);
250
+ }
251
+ .fl-node__tile svg {
252
+ color: var(--uid-accent-text, var(--fl-accent));
253
+ }
254
+ .fl-node--rect.fl-node .fl-node__tile rect {
255
+ fill: var(--fl-info-subtle);
256
+ }
257
+ .fl-node--rect.fl-node .fl-node__tile svg {
258
+ color: var(--fl-info);
259
+ }
260
+ .fl-node__body--start {
261
+ fill: var(--fl-success-subtle);
262
+ stroke: var(--fl-success);
263
+ stroke-width: 1.5;
264
+ }
265
+ .fl-node--circle .fl-node__glyph {
266
+ color: var(--fl-success);
267
+ fill: var(--fl-success);
268
+ }
269
+ .fl-node__body--end {
270
+ fill: var(--fl-node-bg);
271
+ stroke: var(--fl-node-text);
272
+ stroke-width: 3;
273
+ }
274
+ .fl-node__end-core {
275
+ fill: var(--fl-node-text);
276
+ }
277
+ .fl-node--note .fl-node__body {
278
+ fill: var(--fl-warning-subtle);
279
+ stroke: color-mix(in srgb, var(--fl-warning) 45%, transparent);
280
+ }
281
+ .fl-node--note .fl-node__shadow {
282
+ display: none;
283
+ }
284
+ .fl-node--note .fl-node__label {
285
+ font-size: 13px;
286
+ font-weight: 400;
287
+ fill: var(--fl-node-muted);
288
+ }
289
+ .fl-node--diamond .fl-node__body {
290
+ fill: var(--fl-node-bg);
291
+ }
292
+
293
+ /* Status tones. */
294
+ .fl-node.fl-tone--accent .fl-node__body {
295
+ stroke: var(--fl-accent);
296
+ stroke-width: 2;
297
+ }
298
+ .fl-node.fl-tone--success .fl-node__body {
299
+ stroke: color-mix(in srgb, var(--fl-success) 70%, var(--fl-node-border));
300
+ stroke-width: 1.5;
301
+ }
302
+ .fl-node.fl-tone--danger .fl-node__body {
303
+ stroke: var(--fl-danger);
304
+ stroke-width: 2;
305
+ fill: color-mix(in srgb, var(--fl-danger-subtle) 60%, var(--fl-node-bg));
306
+ }
307
+ .fl-node.fl-tone--warning .fl-node__body {
308
+ stroke: var(--fl-warning);
309
+ stroke-width: 1.5;
310
+ stroke-dasharray: 6 3;
311
+ }
312
+ .fl-node.fl-tone--neutral .fl-node__body {
313
+ stroke-dasharray: 3 3;
314
+ }
315
+ .fl-node.fl-tone--neutral .fl-node__label {
316
+ fill: var(--fl-node-muted);
317
+ }
318
+ .fl-node.is-on-path:not(.has-status) .fl-node__body {
319
+ stroke: color-mix(in srgb, var(--fl-accent) 60%, var(--fl-node-border));
320
+ }
321
+
322
+ .fl-node__halo {
323
+ fill: none;
324
+ stroke: var(--fl-accent);
325
+ stroke-width: 6;
326
+ opacity: 0.22;
327
+ transform-box: fill-box;
328
+ transform-origin: center;
329
+ animation: fl-pulse 1.8s ease-in-out infinite;
330
+ pointer-events: none;
331
+ }
332
+ .fl-node.is-current .fl-node__halo {
333
+ opacity: 0.32;
334
+ }
335
+ .fl-node__ring {
336
+ fill: none;
337
+ stroke: var(--fl-accent);
338
+ stroke-width: 2;
339
+ pointer-events: none;
340
+ }
341
+ .fl-node.is-focused:not(.is-selected) .fl-node__ring {
342
+ stroke-dasharray: 4 3;
343
+ }
344
+
345
+ .fl-node__chip circle,
346
+ .fl-node__chip rect {
347
+ fill: var(--fl-node-muted);
348
+ stroke: var(--fl-bg);
349
+ stroke-width: 2;
350
+ }
351
+ .fl-node__chip svg {
352
+ color: #fff;
353
+ }
354
+ .fl-node__chip text {
355
+ font-size: 11px;
356
+ font-weight: 700;
357
+ fill: #fff;
358
+ font-variant-numeric: tabular-nums;
359
+ }
360
+ .fl-tone--success .fl-node__chip circle,
361
+ .fl-tone--success .fl-node__chip rect {
362
+ fill: var(--fl-success);
363
+ }
364
+ .fl-tone--danger .fl-node__chip circle,
365
+ .fl-tone--danger .fl-node__chip rect {
366
+ fill: var(--fl-danger);
367
+ }
368
+ .fl-tone--warning .fl-node__chip circle,
369
+ .fl-tone--warning .fl-node__chip rect {
370
+ fill: var(--fl-warning);
371
+ }
372
+ .fl-tone--accent .fl-node__chip circle,
373
+ .fl-tone--accent .fl-node__chip rect {
374
+ fill: var(--fl-accent);
375
+ }
376
+ .fl-tone--info .fl-node__chip circle,
377
+ .fl-tone--info .fl-node__chip rect {
378
+ fill: var(--fl-info);
379
+ }
380
+ .fl-node__chip--pulse .fl-node__pulse {
381
+ opacity: 0.35;
382
+ stroke: none;
383
+ transform-box: fill-box;
384
+ transform-origin: center;
385
+ animation: fl-ping 1.6s ease-out infinite;
386
+ }
387
+
388
+ /* Counters: quiet pills in kit tokens; accent for an active step, danger for an error. */
389
+ .fl-node__count rect,
390
+ .fl-edge-count rect {
391
+ fill: var(--uid-surface-raised, #fff);
392
+ stroke: var(--uid-border-default, #d4d4d8);
393
+ stroke-width: 1;
394
+ }
395
+ .fl-node__count text,
396
+ .fl-edge-count text {
397
+ font-size: 11px;
398
+ font-weight: 600;
399
+ fill: var(--uid-text-secondary, #71717a);
400
+ font-variant-numeric: tabular-nums;
401
+ }
402
+ .fl-node__count--accent rect,
403
+ .fl-edge-label.is-path .fl-edge-count rect {
404
+ fill: var(--fl-accent-subtle);
405
+ stroke: color-mix(in srgb, var(--fl-accent) 70%, transparent);
406
+ }
407
+ .fl-node__count--accent text,
408
+ .fl-edge-label.is-path .fl-edge-count text {
409
+ fill: var(--uid-accent-text, var(--fl-accent));
410
+ }
411
+ .fl-node__count--danger rect {
412
+ fill: var(--fl-danger-subtle);
413
+ stroke: color-mix(in srgb, var(--fl-danger) 70%, transparent);
414
+ }
415
+ .fl-node__count--danger text {
416
+ fill: var(--fl-danger);
417
+ }
418
+
419
+ .fl-node__enter {
420
+ cursor: pointer;
421
+ }
422
+ .fl-node__enter rect {
423
+ fill: var(--fl-node-bg);
424
+ stroke: var(--fl-node-border);
425
+ }
426
+ .fl-node__enter svg {
427
+ color: var(--fl-node-muted);
428
+ }
429
+ .fl-node__enter:hover rect {
430
+ stroke: var(--fl-accent);
431
+ fill: var(--fl-accent-subtle);
432
+ }
433
+ .fl-node__enter:hover svg {
434
+ color: var(--uid-accent-text, var(--fl-accent));
435
+ }
436
+
437
+ .fl-node__issue circle {
438
+ stroke: var(--fl-bg);
439
+ stroke-width: 2;
440
+ }
441
+ .fl-node.has-error .fl-node__issue circle {
442
+ fill: var(--fl-danger);
443
+ }
444
+ .fl-node.has-warning .fl-node__issue circle {
445
+ fill: var(--fl-warning);
446
+ }
447
+ .fl-node__issue text {
448
+ font-size: 11px;
449
+ font-weight: 800;
450
+ fill: #fff;
451
+ }
452
+ .fl-node.has-error .fl-node__body {
453
+ stroke: var(--fl-danger);
454
+ }
455
+
456
+ .fl-node.is-disabled {
457
+ opacity: 0.5;
458
+ }
459
+ .fl-node.is-disabled .fl-node__body {
460
+ stroke-dasharray: 4 3;
461
+ }
462
+ .fl-node.is-disabled .fl-node__label tspan:not(.fl-node__desc) {
463
+ text-decoration: line-through;
464
+ }
465
+ .fl-node-wrap.is-drop-target .fl-node__body {
466
+ stroke: var(--fl-accent);
467
+ stroke-width: 2;
468
+ }
469
+
470
+ /* --------------------------------------------------------------- editor UI */
471
+
472
+ .fl-handle {
473
+ cursor: crosshair;
474
+ }
475
+ .fl-handle__hit {
476
+ fill: transparent;
477
+ }
478
+ .fl-handle__dot {
479
+ fill: var(--fl-node-bg);
480
+ stroke: var(--fl-accent);
481
+ stroke-width: 1.6;
482
+ transition: r 100ms;
483
+ }
484
+ .fl-handle:hover .fl-handle__dot,
485
+ .fl-handle.is-snapped .fl-handle__dot {
486
+ fill: var(--fl-accent);
487
+ r: 6.5;
488
+ }
489
+ .fl-edge-end {
490
+ fill: var(--fl-node-bg);
491
+ stroke: var(--fl-accent);
492
+ stroke-width: 2;
493
+ cursor: move;
494
+ }
495
+ .fl-edge-end:hover {
496
+ fill: var(--fl-accent);
497
+ }
498
+ .fl-connect-preview {
499
+ fill: none;
500
+ stroke: var(--fl-accent);
501
+ stroke-width: 2;
502
+ stroke-dasharray: 6 4;
503
+ pointer-events: none;
504
+ }
505
+ .fl-connect-preview.is-snapped {
506
+ stroke-dasharray: none;
507
+ }
508
+ .fl-band {
509
+ fill: color-mix(in srgb, var(--fl-accent) 10%, transparent);
510
+ stroke: var(--fl-accent);
511
+ stroke-width: 1;
512
+ stroke-dasharray: 4 3;
513
+ vector-effect: non-scaling-stroke;
514
+ pointer-events: none;
515
+ }
516
+
517
+ /* ---------------------------------------------------------------- overlays */
518
+
519
+ .fl-controls {
520
+ position: absolute;
521
+ left: 12px;
522
+ bottom: 12px;
523
+ display: flex;
524
+ align-items: center;
525
+ gap: 2px;
526
+ padding: 3px;
527
+ background: var(--fl-node-bg);
528
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
529
+ border-radius: var(--uid-radius-md, 8px);
530
+ box-shadow: var(--uid-shadow-md);
531
+ cursor: default;
532
+ z-index: 2;
533
+ }
534
+ .fl-controls__zoom {
535
+ min-width: 52px;
536
+ font-variant-numeric: tabular-nums;
537
+ }
538
+ .fl-controls__sep {
539
+ width: 1px;
540
+ align-self: stretch;
541
+ margin: 4px 2px;
542
+ background: var(--uid-border-subtle, #e4e4e7);
543
+ }
544
+
545
+ .fl-minimap {
546
+ position: absolute;
547
+ right: 12px;
548
+ bottom: 12px;
549
+ background: color-mix(in srgb, var(--fl-node-bg) 92%, transparent);
550
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
551
+ border-radius: var(--uid-radius-md, 8px);
552
+ box-shadow: var(--uid-shadow-md);
553
+ overflow: hidden;
554
+ cursor: pointer;
555
+ z-index: 2;
556
+ }
557
+ .fl-minimap svg {
558
+ display: block;
559
+ touch-action: none;
560
+ }
561
+ .fl-minimap__node {
562
+ fill: color-mix(in srgb, var(--fl-node-muted) 45%, transparent);
563
+ }
564
+ .fl-minimap__node.is-current {
565
+ fill: var(--fl-accent);
566
+ }
567
+ .fl-minimap__node.is-selected {
568
+ fill: var(--uid-accent-text, var(--fl-accent));
569
+ }
570
+ .fl-minimap__group {
571
+ fill: color-mix(in srgb, var(--fl-node-muted) 10%, transparent);
572
+ }
573
+ .fl-minimap__view {
574
+ fill: color-mix(in srgb, var(--fl-accent) 8%, transparent);
575
+ stroke: var(--fl-accent);
576
+ }
577
+
578
+ .fl-hovebar {
579
+ position: absolute;
580
+ transform: translate(-50%, calc(-100% - 8px));
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 6px;
584
+ padding: 4px 6px 4px 10px;
585
+ background: var(--fl-node-bg);
586
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
587
+ border-radius: var(--uid-radius-md, 8px);
588
+ box-shadow: var(--uid-shadow-md);
589
+ cursor: default;
590
+ z-index: 3;
591
+ white-space: nowrap;
592
+ }
593
+ .fl-hovebar::after {
594
+ content: '';
595
+ position: absolute;
596
+ left: 0;
597
+ right: 0;
598
+ bottom: -10px;
599
+ height: 10px;
600
+ }
601
+ .fl-hovebar--edge {
602
+ transform: translate(-50%, calc(-100% - 6px));
603
+ }
604
+
605
+ .fl-nav {
606
+ position: absolute;
607
+ left: 12px;
608
+ top: 12px;
609
+ right: 12px;
610
+ display: flex;
611
+ align-items: center;
612
+ gap: 4px;
613
+ max-width: min(640px, calc(100% - 24px));
614
+ padding: 3px 12px 3px 3px;
615
+ background: var(--fl-node-bg);
616
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
617
+ border-radius: var(--uid-radius-md, 8px);
618
+ box-shadow: var(--uid-shadow-sm);
619
+ width: max-content;
620
+ cursor: default;
621
+ z-index: 2;
622
+ }
623
+ .fl-nav__crumbs {
624
+ min-width: 0;
625
+ flex: 1 1 auto;
626
+ }
627
+
628
+ .fl-status {
629
+ position: absolute;
630
+ right: 12px;
631
+ top: 12px;
632
+ display: flex;
633
+ flex-wrap: wrap;
634
+ justify-content: flex-end;
635
+ align-items: center;
636
+ gap: 8px;
637
+ max-width: calc(100% - 24px);
638
+ padding: 4px 6px 4px 12px;
639
+ background: color-mix(in srgb, var(--fl-node-bg) 94%, transparent);
640
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
641
+ border-radius: var(--uid-radius-md, 8px);
642
+ box-shadow: var(--uid-shadow-sm);
643
+ font-size: var(--uid-font-size-sm, 13px);
644
+ color: var(--fl-node-muted);
645
+ cursor: default;
646
+ z-index: 2;
647
+ }
648
+ .fl-view:has(.fl-nav) .fl-status {
649
+ top: 60px;
650
+ }
651
+ .fl-status__text {
652
+ font-variant-numeric: tabular-nums;
653
+ white-space: nowrap;
654
+ }
655
+ .fl-status__summary {
656
+ display: inline-flex;
657
+ flex-wrap: wrap;
658
+ gap: 4px;
659
+ }
660
+ .fl-status__dot {
661
+ width: 8px;
662
+ height: 8px;
663
+ border-radius: 50%;
664
+ background: var(--fl-node-muted);
665
+ flex: none;
666
+ }
667
+ .fl-status__dot.is-live {
668
+ background: var(--fl-success);
669
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--fl-success) 60%, transparent);
670
+ animation: fl-live 2s ease-out infinite;
671
+ }
672
+ .fl-status__dot.is-stale {
673
+ background: var(--fl-warning);
674
+ }
675
+ .fl-status__dot.is-error {
676
+ background: var(--fl-danger);
677
+ }
678
+
679
+ .fl-busy {
680
+ position: absolute;
681
+ inset: 0;
682
+ display: grid;
683
+ place-items: center;
684
+ background: color-mix(in srgb, var(--fl-bg) 60%, transparent);
685
+ z-index: 4;
686
+ }
687
+
688
+ .fl-empty {
689
+ position: absolute;
690
+ inset: 0;
691
+ display: flex;
692
+ flex-direction: column;
693
+ align-items: center;
694
+ justify-content: center;
695
+ gap: 6px;
696
+ padding: 24px;
697
+ text-align: center;
698
+ cursor: default;
699
+ pointer-events: none;
700
+ }
701
+ .fl-empty > * {
702
+ pointer-events: auto;
703
+ }
704
+ .fl-empty__title {
705
+ margin: 0;
706
+ font-size: var(--uid-font-size-lg, 16px);
707
+ font-weight: 600;
708
+ color: var(--fl-node-text);
709
+ }
710
+ .fl-empty__hint {
711
+ margin: 0;
712
+ max-width: 360px;
713
+ color: var(--fl-node-muted);
714
+ font-size: var(--uid-font-size-sm, 13px);
715
+ line-height: 1.5;
716
+ }
717
+ .fl-layout-error {
718
+ position: absolute;
719
+ left: 50%;
720
+ top: 50%;
721
+ transform: translate(-50%, -50%);
722
+ color: var(--fl-danger);
723
+ }
724
+
725
+ /* ----------------------------------------------------------------- details */
726
+
727
+ .fl-details {
728
+ display: flex;
729
+ flex-direction: column;
730
+ gap: 14px;
731
+ }
732
+ .fl-details__head {
733
+ display: flex;
734
+ flex-wrap: wrap;
735
+ gap: 6px;
736
+ align-items: center;
737
+ }
738
+ .fl-details__desc {
739
+ margin: 0;
740
+ color: var(--uid-text-secondary);
741
+ line-height: 1.5;
742
+ }
743
+ .fl-details__enter {
744
+ align-self: flex-start;
745
+ }
746
+ .fl-details__section {
747
+ margin: 4px 0 0;
748
+ font-size: var(--uid-font-size-xs, 12px);
749
+ font-weight: 600;
750
+ letter-spacing: 0.04em;
751
+ text-transform: uppercase;
752
+ color: var(--uid-text-secondary);
753
+ }
754
+ .fl-details code {
755
+ font-family: var(--uid-font-family-mono, monospace);
756
+ font-size: 0.92em;
757
+ }
758
+
759
+ /* --------------------------------------------------------------- animation */
760
+
761
+ @keyframes fl-pulse {
762
+ 0%,
763
+ 100% {
764
+ opacity: 0.12;
765
+ stroke-width: 4;
766
+ }
767
+ 50% {
768
+ opacity: 0.34;
769
+ stroke-width: 9;
770
+ }
771
+ }
772
+ @keyframes fl-ping {
773
+ 0% {
774
+ transform: scale(0.8);
775
+ opacity: 0.5;
776
+ }
777
+ 100% {
778
+ transform: scale(1.9);
779
+ opacity: 0;
780
+ }
781
+ }
782
+ @keyframes fl-flow {
783
+ to {
784
+ stroke-dashoffset: -14;
785
+ }
786
+ }
787
+ @keyframes fl-live {
788
+ 0% {
789
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--fl-success) 55%, transparent);
790
+ }
791
+ 70%,
792
+ 100% {
793
+ box-shadow: 0 0 0 6px transparent;
794
+ }
795
+ }
796
+
797
+ @media (prefers-reduced-motion: reduce) {
798
+ .fl-node__halo,
799
+ .fl-node__chip--pulse .fl-node__pulse,
800
+ .fl-edge__flow,
801
+ .fl-status__dot.is-live {
802
+ animation: none;
803
+ }
804
+ .fl-canvas.is-animating .fl-viewport {
805
+ transition: none;
806
+ }
807
+ }
808
+
809
+ @media (max-width: 640px) {
810
+ .fl-minimap {
811
+ display: none;
812
+ }
813
+ .fl-status__summary {
814
+ display: none;
815
+ }
816
+ .fl-controls__zoom {
817
+ display: none;
818
+ }
819
+ }
820
+
821
+ /* ------------------------------------------------------------------ editor */
822
+
823
+ .fl-editor {
824
+ flex-direction: column;
825
+ background: var(--fl-node-bg);
826
+ border: 1px solid var(--uid-border-subtle, #e4e4e7);
827
+ border-radius: var(--fl-radius);
828
+ overflow: hidden;
829
+ }
830
+ .fl-toolbar {
831
+ display: flex;
832
+ align-items: center;
833
+ gap: 2px;
834
+ padding: 6px 8px;
835
+ border-bottom: 1px solid var(--uid-border-subtle, #e4e4e7);
836
+ background: var(--fl-node-bg);
837
+ min-height: 44px;
838
+ box-sizing: border-box;
839
+ flex: none;
840
+ }
841
+ .fl-toolbar__sep {
842
+ width: 1px;
843
+ height: 20px;
844
+ margin: 0 6px;
845
+ background: var(--uid-border-subtle, #e4e4e7);
846
+ }
847
+ .fl-toolbar__spacer {
848
+ flex: 1 1 auto;
849
+ }
850
+ .fl-toolbar__text {
851
+ white-space: nowrap;
852
+ }
853
+ .fl-editor__body {
854
+ display: flex;
855
+ flex: 1 1 auto;
856
+ min-height: 0;
857
+ }
858
+ .fl-editor__palette {
859
+ flex: none;
860
+ width: 196px;
861
+ padding: 12px;
862
+ border-right: 1px solid var(--uid-border-subtle, #e4e4e7);
863
+ overflow-y: auto;
864
+ box-sizing: border-box;
865
+ }
866
+ .fl-editor__canvas {
867
+ position: relative;
868
+ flex: 1 1 auto;
869
+ min-width: 0;
870
+ display: flex;
871
+ }
872
+ .fl-editor__canvas .fl-canvas {
873
+ border-radius: 0;
874
+ }
875
+ .fl-editor__side {
876
+ flex: none;
877
+ width: 312px;
878
+ border-left: 1px solid var(--uid-border-subtle, #e4e4e7);
879
+ overflow-y: auto;
880
+ padding: 4px 14px 16px;
881
+ box-sizing: border-box;
882
+ }
883
+ .fl-panel-title {
884
+ margin: 2px 2px 10px;
885
+ font-size: var(--uid-font-size-xs, 12px);
886
+ font-weight: 600;
887
+ letter-spacing: 0.04em;
888
+ text-transform: uppercase;
889
+ color: var(--fl-node-muted);
890
+ }
891
+
892
+ .fl-palette {
893
+ display: flex;
894
+ flex-direction: column;
895
+ gap: 6px;
896
+ }
897
+ .fl-palette__item-wrap {
898
+ display: flex;
899
+ }
900
+ .fl-palette__item.uid-button {
901
+ flex: 1 1 auto;
902
+ justify-content: flex-start;
903
+ cursor: grab;
904
+ touch-action: none;
905
+ }
906
+ .fl-palette__hint {
907
+ margin: 8px 2px 0;
908
+ font-size: var(--uid-font-size-xs, 12px);
909
+ line-height: 1.45;
910
+ color: var(--fl-node-muted);
911
+ }
912
+ .fl-palette-ghost {
913
+ position: fixed;
914
+ z-index: 1000;
915
+ transform: translate(-50%, -50%);
916
+ padding: 8px 14px;
917
+ border-radius: 10px;
918
+ background: var(--uid-surface-raised, #fff);
919
+ border: 1.5px solid var(--uid-accent, #14b8a6);
920
+ box-shadow: var(--uid-shadow-lg);
921
+ color: var(--uid-text-primary);
922
+ font: 500 13px var(--uid-font-family-sans, system-ui, sans-serif);
923
+ pointer-events: none;
924
+ opacity: 0.92;
925
+ }
926
+
927
+ .fl-props {
928
+ display: flex;
929
+ flex-direction: column;
930
+ gap: 14px;
931
+ padding-top: 14px;
932
+ }
933
+ .fl-props__muted {
934
+ margin: 0;
935
+ color: var(--fl-node-muted);
936
+ font-size: var(--uid-font-size-sm, 13px);
937
+ line-height: 1.5;
938
+ }
939
+ .fl-props__route {
940
+ font-weight: 500;
941
+ color: var(--fl-node-text);
942
+ }
943
+ .fl-props__count {
944
+ margin: 0;
945
+ font-weight: 600;
946
+ }
947
+ .fl-props__tools {
948
+ display: flex;
949
+ flex-wrap: wrap;
950
+ gap: 4px;
951
+ }
952
+ .fl-props__section {
953
+ display: flex;
954
+ flex-direction: column;
955
+ gap: 8px;
956
+ padding-top: 12px;
957
+ border-top: 1px solid var(--uid-border-subtle, #e4e4e7);
958
+ }
959
+ .fl-props__section h4 {
960
+ margin: 0;
961
+ font-size: var(--uid-font-size-xs, 12px);
962
+ font-weight: 600;
963
+ letter-spacing: 0.04em;
964
+ text-transform: uppercase;
965
+ color: var(--fl-node-muted);
966
+ }
967
+ .fl-props__row {
968
+ display: flex;
969
+ gap: 6px;
970
+ }
971
+ .fl-props__kv {
972
+ display: grid;
973
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr) auto;
974
+ gap: 4px;
975
+ align-items: center;
976
+ }
977
+ .fl-props__add,
978
+ .fl-props__delete {
979
+ align-self: flex-start;
980
+ }
981
+ .fl-props__condition input {
982
+ font-family: var(--uid-font-family-mono, monospace);
983
+ }
984
+
985
+ .fl-issues__summary {
986
+ margin: 14px 0 8px;
987
+ font-size: var(--uid-font-size-sm, 13px);
988
+ color: var(--fl-node-muted);
989
+ }
990
+ .fl-issues__none {
991
+ display: flex;
992
+ align-items: center;
993
+ gap: 8px;
994
+ margin: 8px 0;
995
+ color: var(--fl-success);
996
+ font-size: var(--uid-font-size-sm, 13px);
997
+ }
998
+ .fl-issues__list {
999
+ list-style: none;
1000
+ margin: 0;
1001
+ padding: 0;
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ gap: 2px;
1005
+ }
1006
+ .fl-issue.uid-button {
1007
+ width: 100%;
1008
+ justify-content: flex-start;
1009
+ height: auto;
1010
+ min-height: 32px;
1011
+ padding-top: 6px;
1012
+ padding-bottom: 6px;
1013
+ text-align: left;
1014
+ white-space: normal;
1015
+ align-items: flex-start;
1016
+ }
1017
+ .fl-issue__text {
1018
+ font-weight: 400;
1019
+ line-height: 1.4;
1020
+ }
1021
+ .fl-issue--error .uid-icon {
1022
+ color: var(--fl-danger);
1023
+ }
1024
+ .fl-issue--warning .uid-icon {
1025
+ color: var(--fl-warning);
1026
+ }
1027
+ .fl-tab-issues__count {
1028
+ margin-left: 6px;
1029
+ }
1030
+
1031
+ .fl-hint {
1032
+ position: absolute;
1033
+ left: 50%;
1034
+ bottom: 14px;
1035
+ transform: translateX(-50%);
1036
+ margin: 0;
1037
+ padding: 4px 10px;
1038
+ border-radius: 999px;
1039
+ background: color-mix(in srgb, var(--fl-node-bg) 85%, transparent);
1040
+ color: var(--fl-node-muted);
1041
+ font-size: var(--uid-font-size-xs, 12px);
1042
+ pointer-events: none;
1043
+ white-space: nowrap;
1044
+ }
1045
+ .fl-editor-empty {
1046
+ display: flex;
1047
+ flex-direction: column;
1048
+ align-items: center;
1049
+ gap: 8px;
1050
+ max-width: 400px;
1051
+ }
1052
+ .fl-editor-empty__actions {
1053
+ display: flex;
1054
+ flex-wrap: wrap;
1055
+ justify-content: center;
1056
+ gap: 8px;
1057
+ margin-top: 8px;
1058
+ }
1059
+
1060
+ .fl-menu-label {
1061
+ flex: 1 1 auto;
1062
+ }
1063
+ .fl-menu-shortcut {
1064
+ margin-left: 16px;
1065
+ font: inherit;
1066
+ font-size: var(--uid-font-size-xs, 12px);
1067
+ color: var(--uid-text-tertiary, #a1a1aa);
1068
+ }
1069
+
1070
+ .fl-import {
1071
+ display: flex;
1072
+ flex-direction: column;
1073
+ gap: 12px;
1074
+ }
1075
+ .fl-import__source textarea {
1076
+ font-family: var(--uid-font-family-mono, monospace);
1077
+ font-size: 13px;
1078
+ }
1079
+
1080
+ .fl-editor.is-narrow .fl-hint {
1081
+ display: none;
1082
+ }
1083
+
1084
+ /* A pressed toggle (minimap, snap): the kit's secondary variant, tinted with the accent. */
1085
+ .fl-toggle.uid-button.is-active {
1086
+ background: var(--fl-accent-subtle);
1087
+ color: var(--uid-accent-text, var(--fl-accent));
1088
+ }
1089
+
1090
+ .fl-props__head {
1091
+ display: flex;
1092
+ align-items: center;
1093
+ gap: 8px;
1094
+ min-width: 0;
1095
+ }
1096
+ .fl-props__head .uid-icon,
1097
+ .fl-props__head svg {
1098
+ flex: none;
1099
+ color: var(--fl-node-muted);
1100
+ }
1101
+ .fl-props__kind {
1102
+ font-weight: 600;
1103
+ font-size: var(--uid-font-size-sm, 13px);
1104
+ }
1105
+ .fl-props__id {
1106
+ margin-left: auto;
1107
+ min-width: 0;
1108
+ overflow: hidden;
1109
+ text-overflow: ellipsis;
1110
+ white-space: nowrap;
1111
+ font-family: var(--uid-font-family-mono, monospace);
1112
+ font-size: var(--uid-font-size-xs, 12px);
1113
+ color: var(--fl-node-muted);
1114
+ }
1115
+ .fl-props__transition.uid-button {
1116
+ justify-content: flex-start;
1117
+ width: 100%;
1118
+ }
1119
+ /*$vite$:1*/