@24vlh/vds 0.1.2 → 0.1.3

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 (35) hide show
  1. package/dist/components/accordion.css +170 -170
  2. package/dist/components/authoring.css +332 -332
  3. package/dist/components/buttons.css +683 -683
  4. package/dist/components/charts.css +502 -502
  5. package/dist/components/command.css +520 -520
  6. package/dist/components/content-blocks.css +944 -944
  7. package/dist/components/doc-block.css +782 -782
  8. package/dist/components/feedback.css +657 -657
  9. package/dist/components/flows.css +1101 -1101
  10. package/dist/components/forms-advanced.css +462 -462
  11. package/dist/components/forms.css +627 -1831
  12. package/dist/components/forms.min.css +1 -1
  13. package/dist/components/header-footer.css +348 -348
  14. package/dist/components/hero.css +498 -498
  15. package/dist/components/icons.css +937 -937
  16. package/dist/components/icons.min.css +1 -1
  17. package/dist/components/navigation.css +900 -900
  18. package/dist/components/overlays.css +498 -498
  19. package/dist/components/sections.css +450 -450
  20. package/dist/components/skeleton.css +385 -385
  21. package/dist/components/tables.css +591 -591
  22. package/dist/components/tabs.css +307 -307
  23. package/dist/components/toasts.css +421 -421
  24. package/dist/components/tooltips-popovers.css +447 -447
  25. package/dist/components/typography.css +250 -250
  26. package/dist/components/utilities.css +3433 -3433
  27. package/dist/core.css +866 -866
  28. package/dist/identity.css +266 -266
  29. package/dist/themes/carbon.css +658 -658
  30. package/dist/themes/graphite.css +658 -658
  31. package/dist/themes/navy.css +657 -657
  32. package/dist/themes/slate.css +659 -659
  33. package/dist/vds.css +19009 -20312
  34. package/dist/vds.min.css +1 -1
  35. package/package.json +3 -2
@@ -1,1101 +1,1101 @@
1
- /************************************************************
2
- * VLAH DESIGN SYSTEM (VDS) - Flows & Timelines
3
- *
4
- * Responsibilities:
5
- * - Provide multi-step flow architecture: horizontal/vertical steps,
6
- * state transitions, process nodes, journeys, branching flows,
7
- * form-flow scaffolding, and rich timelines
8
- * - Implement progress bars (solid, striped, reversed, segmented)
9
- * with CSS-only animation and semantic variants
10
- * - Expose interaction patterns: clickable, disabled, upcoming,
11
- * error/success/warning/info states, density modes, and icon variants
12
- * - Deliver layout scaffolding for complex journeys and workflows,
13
- * ensuring predictable spacing, sizing, and semantic signalling
14
- *
15
- * System Notes:
16
- * - Fully token-driven: flow gaps, insets, radii, bullet sizes,
17
- * timeline points, stripe sizes, and animation speeds
18
- * - 100% CSS; reduced-motion fallbacks defined for animated stripes
19
- * - Composable: integrates with cards, content blocks, utilities,
20
- * and documentation previews without overrides
21
- ************************************************************/
22
-
23
- /* ---------------------------------------------------------
24
- 1. FLOW TOKEN DEFINITIONS
25
- --------------------------------------------------------- */
26
-
27
- [data-vds-flow],
28
- .vds-flow {
29
- --flow-component-disabled-opacity: 0.48;
30
-
31
- --flow-step-bullet-sm: var(--space-5);
32
- --flow-step-bullet-md: var(--space-5_5);
33
- --flow-step-bullet-lg: var(--space-6);
34
-
35
- --flow-timeline-point-sm: var(--space-2);
36
- --flow-timeline-point-md: var(--space-3);
37
- --flow-timeline-point-xs: var(--space-1_5);
38
-
39
- --flow-node-min-width: var(--space-40);
40
- --flow-stage-min-width: var(--space-48);
41
- --flow-grid-min-md: var(--flow-stage-min-width);
42
-
43
- --flow-icon-size-sm: var(--space-3);
44
- --flow-icon-size-md: var(--space-4);
45
- --flow-icon-size-lg: var(--space-5);
46
-
47
- --flow-gap-xs: var(--space-1);
48
- --flow-gap-sm: var(--space-2);
49
- --flow-gap-md: var(--space-3);
50
- --flow-gap-lg: var(--space-4);
51
- --flow-gap-xl: var(--space-8);
52
-
53
- --flow-inset-xs: var(--space-2);
54
- --flow-inset-sm: var(--space-3);
55
- --flow-inset-md: var(--space-4);
56
- --flow-inset-lg: var(--space-6);
57
-
58
- --flow-progress-stripe-size: var(--space-3);
59
- --flow-progress-stripe-speed: 1.2s;
60
- }
61
-
62
- /* ---------------------------------------------------------
63
- 2. GLOBAL FLOW MODIFIERS
64
- --------------------------------------------------------- */
65
-
66
- .flow--compact .flow {
67
- gap: var(--flow-gap-lg);
68
- }
69
-
70
- .flow--compact .flow__body {
71
- gap: var(--flow-gap-md);
72
- }
73
-
74
- .flow--compact .steps {
75
- gap: var(--flow-gap-sm);
76
- }
77
-
78
- .flow--compact .timeline {
79
- gap: var(--flow-gap-sm);
80
- }
81
-
82
- .flow--compact .journey {
83
- gap: var(--flow-gap-md);
84
- }
85
-
86
- .flow--compact .process-flow {
87
- gap: var(--flow-gap-sm);
88
- }
89
-
90
- .flow--compact .state-flow {
91
- gap: var(--flow-gap-xs);
92
- }
93
-
94
- .flow--compact .form-flow {
95
- gap: var(--flow-gap-md);
96
- }
97
-
98
- .steps__item--upcoming {
99
- color: var(--color-text-soft);
100
- }
101
-
102
- .journey__stage--upcoming,
103
- .process-flow__node--upcoming,
104
- .flow-branch__option--upcoming,
105
- .state-flow__item--upcoming {
106
- border-color: var(--color-border-subtle);
107
- background-color: var(--color-surface-subtle);
108
- color: var(--color-text-muted);
109
- }
110
-
111
- .steps__item:focus-visible,
112
- .steps__item--clickable:focus-visible,
113
- .journey__stage--clickable:focus-visible,
114
- .process-flow__node--clickable:focus-visible,
115
- .flow-branch__option--clickable:focus-visible {
116
- outline: var(--focus-ring-width) solid var(--color-accent);
117
- outline-offset: var(--focus-ring-offset);
118
- }
119
-
120
- .steps__item--disabled,
121
- .steps__item[aria-disabled="true"] {
122
- opacity: var(--flow-component-disabled-opacity);
123
- cursor: not-allowed;
124
- }
125
-
126
- .journey__stage--disabled,
127
- .journey__stage[aria-disabled="true"],
128
- .process-flow__node--disabled,
129
- .process-flow__node[aria-disabled="true"],
130
- .flow-branch__option--disabled,
131
- .flow-branch__option[aria-disabled="true"] {
132
- opacity: var(--flow-component-disabled-opacity);
133
- pointer-events: none;
134
- }
135
-
136
- /* ---------------------------------------------------------
137
- 3. FLOW CONTAINER / WIZARD
138
- --------------------------------------------------------- */
139
-
140
- .flow {
141
- display: flex;
142
- flex-direction: column;
143
- gap: var(--space-8);
144
- }
145
-
146
- .flow__header {
147
- display: flex;
148
- flex-direction: column;
149
- gap: var(--space-2);
150
- }
151
-
152
- .flow__title {
153
- font-size: var(--text-lg);
154
- font-weight: 600;
155
- }
156
-
157
- .flow__subtitle {
158
- font-size: var(--text-sm);
159
- color: var(--color-text-muted);
160
- }
161
-
162
- .flow__body {
163
- display: flex;
164
- flex-direction: column;
165
- gap: var(--space-6);
166
- }
167
-
168
- .flow__nav {
169
- display: flex;
170
- justify-content: flex-end;
171
- gap: var(--space-4);
172
- }
173
-
174
- /* ---------------------------------------------------------
175
- 4. STEP INDICATOR (HORIZONTAL)
176
- --------------------------------------------------------- */
177
-
178
- .steps {
179
- display: flex;
180
- align-items: center;
181
- gap: var(--space-4);
182
- }
183
-
184
- .steps__item {
185
- display: flex;
186
- align-items: center;
187
- gap: var(--flow-gap-sm);
188
- font-size: var(--text-xs);
189
- color: var(--color-text-muted);
190
- }
191
-
192
- .steps__item--clickable {
193
- cursor: pointer;
194
- }
195
-
196
- .steps__item--clickable:hover .steps__label {
197
- color: var(--color-text);
198
- }
199
-
200
- .steps__item--clickable:active {
201
- transform: translateY(1px);
202
- opacity: 0.95;
203
- }
204
-
205
- .steps__item--error {
206
- color: var(--color-danger-strong);
207
- }
208
-
209
- .steps__item--error .steps__bullet {
210
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
211
- border-color: var(--danger-soft-border, var(--color-danger));
212
- color: var(--danger-soft-on, var(--color-on-danger));
213
- }
214
-
215
- .steps__item--warning {
216
- color: var(--color-warning-strong);
217
- }
218
-
219
- .steps__item--warning .steps__bullet {
220
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
221
- border-color: var(--warning-soft-border, var(--color-warning));
222
- color: var(--warning-soft-on, var(--color-on-warning));
223
- }
224
-
225
- .steps__item[aria-current="step"],
226
- .steps__item[aria-current="step"] .steps__label {
227
- color: var(--color-text);
228
- }
229
-
230
- .steps__bullet {
231
- width: var(--flow-step-bullet-md);
232
- height: var(--flow-step-bullet-md);
233
- border-radius: 999px;
234
-
235
- display: flex;
236
- align-items: center;
237
- justify-content: center;
238
-
239
- border: var(--border-width) solid var(--color-border-subtle);
240
- background-color: var(--color-surface-subtle);
241
- color: var(--color-text-muted);
242
-
243
- font-size: var(--text-xxs);
244
- flex-shrink: 0;
245
- }
246
-
247
- .steps__label {
248
- white-space: nowrap;
249
- }
250
-
251
- .steps__line {
252
- flex: 1;
253
- height: var(--border-width);
254
- background-color: var(--color-border-subtle);
255
- }
256
-
257
- .steps__item--active .steps__bullet {
258
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
259
- border-color: var(--accent-soft-border, var(--color-accent));
260
- color: var(--accent-soft-on, var(--color-on-accent));
261
- }
262
-
263
- .steps__item--complete .steps__bullet {
264
- background-color: var(--success-soft-surface, var(--color-success-soft));
265
- border-color: var(--success-soft-border, var(--color-success));
266
- color: var(--success-soft-on, var(--color-on-success));
267
- opacity: 0.7;
268
- }
269
-
270
- .steps__item--active,
271
- .steps__item--complete {
272
- color: var(--color-text);
273
- }
274
-
275
- .steps--a .steps__bullet {
276
- width: var(--flow-step-bullet-lg);
277
- height: var(--flow-step-bullet-lg);
278
- }
279
-
280
- .steps--c .steps__bullet {
281
- width: var(--flow-step-bullet-sm);
282
- height: var(--flow-step-bullet-sm);
283
- font-size: var(--text-xxs);
284
- }
285
-
286
- /* ---------------------------------------------------------
287
- 5. STEP INDICATOR (VERTICAL)
288
- --------------------------------------------------------- */
289
-
290
- .steps--vertical {
291
- flex-direction: column;
292
- align-items: flex-start;
293
- }
294
-
295
- .steps--vertical .steps__item {
296
- align-items: flex-start;
297
- }
298
-
299
- .steps--vertical .steps__line {
300
- width: var(--border-width);
301
- min-height: var(--flow-gap-xl);
302
- height: auto;
303
- background-color: var(--color-border-subtle);
304
- margin-left: calc(var(--flow-step-bullet-md) / 2 - var(--border-width) / 2);
305
- flex: auto;
306
- }
307
-
308
- /* ---------------------------------------------------------
309
- 6. FLOW PROGRESS BARS
310
- --------------------------------------------------------- */
311
-
312
- .flow-progress {
313
- width: 100%;
314
- height: var(--border-width-strong);
315
- background-color: var(--color-muted-bg);
316
- border-radius: var(--radius-sm);
317
- overflow: hidden;
318
- }
319
-
320
- .flow-progress__bar {
321
- height: 100%;
322
- width: 0;
323
- background-color: var(--color-muted-bg);
324
- transition: width 0.2s ease;
325
- }
326
-
327
- .flow-progress--striped .flow-progress__bar {
328
- background-image: repeating-linear-gradient(
329
- 45deg,
330
- var(--color-text-soft) 0,
331
- var(--color-text-soft) var(--flow-progress-stripe-size),
332
- var(--color-muted-bg) var(--flow-progress-stripe-size),
333
- var(--color-muted-bg) calc(var(--flow-progress-stripe-size) * 2)
334
- );
335
- animation: flow-progress-stripes var(--flow-progress-stripe-speed) linear infinite;
336
- }
337
-
338
- .flow-progress--striped .flow-progress__bar--error {
339
- background-image: repeating-linear-gradient(
340
- 45deg,
341
- var(--color-danger) 0,
342
- var(--color-danger) var(--flow-progress-stripe-size),
343
- var(--color-danger-soft) var(--flow-progress-stripe-size),
344
- var(--color-danger-soft) calc(var(--flow-progress-stripe-size) * 2)
345
- );
346
- }
347
-
348
- .flow-progress--striped .flow-progress__bar--warning {
349
- background-image: repeating-linear-gradient(
350
- 45deg,
351
- var(--color-warning) 0,
352
- var(--color-warning) var(--flow-progress-stripe-size),
353
- var(--color-warning-soft) var(--flow-progress-stripe-size),
354
- var(--color-warning-soft) calc(var(--flow-progress-stripe-size) * 2)
355
- );
356
- }
357
-
358
- @keyframes flow-progress-stripes {
359
- from {
360
- background-position: 0 0;
361
- }
362
- to {
363
- background-position: calc(var(--flow-progress-stripe-size) * -2.828) 0;
364
- }
365
- }
366
-
367
- @media (prefers-reduced-motion: reduce) {
368
- .flow-progress--striped .flow-progress__bar {
369
- animation: none;
370
- background-position: 0 0;
371
- }
372
- }
373
-
374
- .flow-progress--striped-right .flow-progress__bar {
375
- animation: flow-progress-stripes-right var(--flow-progress-stripe-speed) linear infinite;
376
- }
377
-
378
- @keyframes flow-progress-stripes-right {
379
- from {
380
- background-position: calc(var(--flow-progress-stripe-size) * -2.828) 0;
381
- }
382
- to {
383
- background-position: 0 0;
384
- }
385
- }
386
-
387
- @media (prefers-reduced-motion: reduce) {
388
- .flow-progress--striped-right .flow-progress__bar {
389
- animation: none;
390
- background-position: 0 0;
391
- }
392
- }
393
-
394
- .flow-progress--segments {
395
- display: flex;
396
- height: var(--border-width-strong);
397
- overflow: hidden;
398
- border-radius: var(--radius-sm);
399
- }
400
-
401
- .flow-progress__segment {
402
- flex: 1;
403
- background-color: var(--color-muted-bg);
404
- }
405
-
406
- .flow-progress__segment--complete {
407
- background-color: var(--color-success);
408
- }
409
-
410
- .flow-progress__segment--error {
411
- background-color: var(--color-danger);
412
- }
413
-
414
- .flow-progress__segment--warning {
415
- background-color: var(--color-warning);
416
- }
417
-
418
- /* ---------------------------------------------------------
419
- 7. MINIMAL TIMELINE (A)
420
- --------------------------------------------------------- */
421
-
422
- .timeline {
423
- display: flex;
424
- flex-direction: column;
425
- gap: var(--flow-gap-md);
426
- }
427
-
428
- .timeline__item {
429
- display: flex;
430
- align-items: stretch;
431
- gap: var(--flow-gap-sm);
432
- }
433
-
434
- .timeline__point-wrap {
435
- display: flex;
436
- flex-direction: column;
437
- align-items: center;
438
- gap: var(--flow-gap-xs);
439
- }
440
-
441
- .timeline__point {
442
- width: var(--flow-timeline-point-sm);
443
- height: var(--flow-timeline-point-sm);
444
- border-radius: 999px;
445
- border: var(--border-width-strong) solid var(--color-accent);
446
- background-color: var(--color-surface);
447
- flex-shrink: 0;
448
- }
449
-
450
- .timeline__point--upcoming {
451
- border-color: var(--color-border-subtle);
452
- }
453
-
454
- .timeline__point--error {
455
- border-color: var(--color-danger);
456
- background-color: var(--color-danger-soft);
457
- }
458
-
459
- .timeline__point--warning {
460
- border-color: var(--warning-soft-border, var(--color-warning));
461
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
462
- }
463
-
464
- .timeline__point--success {
465
- border-color: var(--danger-soft-border, var(--color-danger));
466
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
467
- }
468
-
469
- .timeline__point--info {
470
- border-color: var(--info-soft-border, var(--color-info));
471
- background-color: var(--info-soft-surface, var(--color-info-soft));
472
- }
473
-
474
- .timeline__icon {
475
- width: var(--flow-icon-size-md);
476
- height: var(--flow-icon-size-md);
477
- color: var(--color-icon-muted);
478
- }
479
-
480
- .timeline__icon--left {
481
- margin-right: var(--flow-gap-xs);
482
- }
483
-
484
- .timeline__icon--right {
485
- margin-left: var(--flow-gap-xs);
486
- }
487
-
488
- .timeline__icon--top {
489
- margin-bottom: var(--flow-gap-xs);
490
- }
491
-
492
- .timeline__line {
493
- flex: 1;
494
- width: var(--border-width-strong);
495
- background-color: var(--color-border-subtle);
496
- }
497
-
498
- .timeline__content {
499
- flex: 1;
500
- display: flex;
501
- flex-direction: column;
502
- gap: var(--flow-gap-xs);
503
- }
504
-
505
- .timeline__label {
506
- font-size: var(--text-sm);
507
- font-weight: 500;
508
-
509
- display: flex;
510
- align-items: center;
511
- gap: var(--space-2);
512
- }
513
-
514
- .timeline__note {
515
- font-size: var(--text-xs);
516
- color: var(--color-text-muted);
517
- }
518
-
519
- .timeline--horizontal {
520
- flex-direction: row;
521
- align-items: flex-start;
522
- }
523
-
524
- .timeline--horizontal .timeline__item {
525
- flex-direction: column;
526
- align-items: center;
527
- }
528
-
529
- .timeline--horizontal .timeline__point-wrap {
530
- flex-direction: row;
531
- }
532
-
533
- .timeline--horizontal .timeline__line {
534
- width: var(--component-gap-xl);
535
- height: var(--border-width-strong);
536
- }
537
-
538
- .timeline--compact .timeline__item {
539
- gap: var(--flow-gap-xs);
540
- }
541
-
542
- .timeline--compact .timeline__note {
543
- font-size: var(--text-xxs);
544
- }
545
-
546
- .timeline--compact .timeline__point {
547
- width: var(--flow-timeline-point-xs);
548
- height: var(--flow-timeline-point-xs);
549
- }
550
-
551
- .timeline--compact .timeline__icon {
552
- width: var(--flow-icon-size-sm);
553
- height: var(--flow-icon-size-sm);
554
- }
555
-
556
- /* ---------------------------------------------------------
557
- 8. RICH TIMELINE (B)
558
- --------------------------------------------------------- */
559
-
560
- .timeline--rich {
561
- display: flex;
562
- flex-direction: column;
563
- gap: var(--flow-gap-lg);
564
- }
565
-
566
- .timeline--rich .timeline__item {
567
- display: flex;
568
- align-items: stretch;
569
- gap: var(--flow-gap-md);
570
- border-radius: var(--radius-sm);
571
- padding: var(--flow-inset-sm);
572
- border: var(--border-width) solid var(--color-border-subtle);
573
- background-color: var(--flow-zebra-bg-alt);
574
- }
575
-
576
- .timeline--rich .timeline__item:nth-child(even) {
577
- background-color: var(--flow-zebra-bg);
578
- }
579
-
580
- .timeline--rich .timeline__item:nth-child(odd) {
581
- background-color: var(--flow-zebra-bg-alt);
582
- }
583
-
584
- .timeline--rich .timeline__point-wrap {
585
- display: flex;
586
- flex-direction: column;
587
- align-items: center;
588
- gap: var(--flow-gap-xs);
589
- flex-shrink: 0;
590
- }
591
-
592
- .timeline--rich .timeline__point {
593
- width: var(--flow-timeline-point-md);
594
- height: var(--flow-timeline-point-md);
595
- }
596
-
597
- .timeline--rich .timeline__line {
598
- flex: 1;
599
- width: var(--border-width-strong);
600
- background-color: var(--color-border-subtle);
601
- border-radius: var(--radius-sm);
602
- }
603
-
604
- .timeline--rich .timeline__item:last-child .timeline__line {
605
- display: none;
606
- }
607
-
608
- .timeline-events {
609
- display: flex;
610
- flex-direction: column;
611
- gap: var(--space-4);
612
- }
613
-
614
- .timeline-events .timeline__item {
615
- align-items: flex-start;
616
- gap: var(--space-4);
617
- }
618
-
619
- .timeline__timestamp {
620
- font-size: var(--text-xxs);
621
- color: var(--color-text-soft);
622
- }
623
-
624
- .timeline__meta {
625
- font-size: var(--text-xs);
626
- color: var(--color-text-muted);
627
- }
628
-
629
- .timeline__body {
630
- font-size: var(--text-sm);
631
- color: var(--color-text);
632
- margin-top: var(--flow-gap-xs);
633
- }
634
-
635
- .timeline--audit .timeline__label {
636
- font-size: var(--text-xs);
637
- text-transform: uppercase;
638
- letter-spacing: 0.05em;
639
- }
640
-
641
- .timeline--audit .timeline__body {
642
- font-size: var(--text-xs);
643
- }
644
-
645
- /* ---------------------------------------------------------
646
- 9. JOURNEY MAP (HIGH-LEVEL FLOWS)
647
- --------------------------------------------------------- */
648
-
649
- .journey {
650
- display: flex;
651
- flex-wrap: wrap;
652
- gap: var(--flow-gap-lg);
653
- }
654
-
655
- .journey--compact {
656
- gap: var(--flow-gap-md);
657
- }
658
-
659
- .journey__stage {
660
- flex: 1 1 var(--flow-stage-min-width);
661
- min-width: var(--flow-stage-min-width);
662
-
663
- display: flex;
664
- flex-direction: column;
665
- gap: var(--flow-gap-sm);
666
-
667
- padding: var(--flow-inset-md);
668
- border-radius: var(--radius-md);
669
- border: var(--border-width) solid var(--color-border-subtle);
670
- background-color: var(--color-surface);
671
- }
672
-
673
- .journey__stage--clickable {
674
- cursor: pointer;
675
- }
676
-
677
- .journey__stage--clickable:hover {
678
- border-color: var(--color-accent);
679
- }
680
-
681
- .journey__stage--clickable:active {
682
- transform: translateY(1px);
683
- opacity: 0.96;
684
- }
685
-
686
- .journey__stage--disabled {
687
- opacity: var(--flow-component-disabled-opacity);
688
- pointer-events: none;
689
- }
690
-
691
- .journey__stage--active {
692
- border-color: var(--color-accent);
693
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
694
- color: var(--accent-soft-on, var(--color-on-accent));
695
- }
696
-
697
- .journey__stage--complete,
698
- .journey__stage--success {
699
- border-color: var(--color-success);
700
- background-color: var(--success-soft-surface, var(--color-success-soft));
701
- color: var(--success-soft-on, var(--color-on-success));
702
- }
703
-
704
- .journey__stage--error {
705
- border-color: var(--color-danger);
706
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
707
- color: var(--danger-soft-on, var(--color-on-danger));
708
- }
709
-
710
- .journey__stage--warning {
711
- border-color: var(--color-warning);
712
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
713
- color: var(--warning-soft-on, var(--color-on-warning));
714
- }
715
-
716
- .journey__stage--info {
717
- border-color: var(--color-accent);
718
- background-color: var(--info-soft-surface, var(--color-info-soft));
719
- color: var(--info-soft-on, var(--color-on-info));
720
- }
721
-
722
- .journey__icon {
723
- width: var(--flow-icon-size-lg);
724
- height: var(--flow-icon-size-lg);
725
- color: var(--color-icon-muted);
726
- }
727
-
728
- .journey__marker {
729
- font-size: var(--text-xs);
730
- font-weight: 600;
731
- text-transform: uppercase;
732
- letter-spacing: 0.04em;
733
- color: var(--color-text-muted);
734
- }
735
-
736
- .journey__title {
737
- font-size: var(--text-md);
738
- font-weight: 600;
739
- }
740
-
741
- .journey__details {
742
- font-size: var(--text-sm);
743
- color: var(--color-text-muted);
744
- }
745
-
746
- /* ---------------------------------------------------------
747
- 10. PROCESS FLOW (NODE-BASED)
748
- --------------------------------------------------------- */
749
-
750
- .process-flow {
751
- display: flex;
752
- flex-wrap: wrap;
753
- align-items: center;
754
- gap: var(--flow-gap-md);
755
- }
756
-
757
- .process-flow--compact {
758
- gap: var(--flow-gap-sm);
759
- }
760
-
761
- .process-flow__node {
762
- min-width: var(--flow-node-min-width);
763
- padding: var(--flow-inset-sm) var(--flow-inset-md);
764
- border-radius: var(--radius-md);
765
- border: var(--border-width) solid var(--color-border-subtle);
766
- background-color: var(--color-surface);
767
- font-size: var(--text-sm);
768
- display: flex;
769
- flex-direction: column;
770
- align-items: center;
771
- text-align: center;
772
- gap: var(--flow-gap-xs);
773
- }
774
-
775
- .process-flow__node--clickable {
776
- cursor: pointer;
777
- }
778
-
779
- .process-flow__node--clickable:hover {
780
- border-color: var(--color-accent);
781
- }
782
-
783
- .process-flow__node--clickable:active {
784
- transform: translateY(1px);
785
- opacity: 0.96;
786
- }
787
-
788
- .process-flow__node--disabled {
789
- opacity: var(--flow-component-disabled-opacity);
790
- pointer-events: none;
791
- }
792
-
793
- .process-flow__node--active {
794
- border-color: var(--color-accent);
795
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
796
- }
797
-
798
- .process-flow__node--complete,
799
- .process-flow__node--success {
800
- border-color: var(--color-success);
801
- background-color: var(--success-soft-surface, var(--color-success-soft));
802
- }
803
-
804
- .process-flow__node--error {
805
- border-color: var(--color-danger);
806
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
807
- }
808
-
809
- .process-flow__node--warning {
810
- border-color: var(--color-warning);
811
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
812
- }
813
-
814
- .process-flow__node--info {
815
- border-color: var(--color-accent);
816
- background-color: var(--info-soft-surface, var(--color-info-soft));
817
- }
818
-
819
- .process-flow__icon {
820
- width: var(--flow-icon-size-md);
821
- height: var(--flow-icon-size-md);
822
- color: var(--color-icon-muted);
823
- margin-bottom: 0;
824
- flex-shrink: 0;
825
- }
826
-
827
- .process-flow__arrow {
828
- width: var(--space-6);
829
- height: var(--border-width);
830
- background-color: var(--color-border-subtle);
831
- flex-shrink: 0;
832
- }
833
-
834
- .process-flow__arrow--error {
835
- background-color: var(--color-danger);
836
- }
837
-
838
- .process-flow__arrow--warning {
839
- background-color: var(--color-warning);
840
- }
841
-
842
- .process-flow--vertical {
843
- flex-direction: column;
844
- align-items: flex-start;
845
- }
846
-
847
- .process-flow--vertical .process-flow__arrow {
848
- width: var(--border-width);
849
- height: var(--space-6);
850
- margin-left: calc(
851
- var(--flow-node-min-width) / 2 - var(--border-width) / 2
852
- );
853
- }
854
-
855
- /* ---------------------------------------------------------
856
- 11. STATE FLOW (STATUS STEPS)
857
- --------------------------------------------------------- */
858
-
859
- .state-flow {
860
- display: inline-flex;
861
- align-items: center;
862
- gap: var(--flow-gap-sm);
863
- flex-wrap: wrap;
864
- }
865
-
866
- .state-flow__item {
867
- padding: var(--flow-inset-xs) var(--flow-inset-sm);
868
- font-size: var(--text-xs);
869
- border-radius: 999px;
870
- border: var(--border-width) solid var(--color-border-subtle);
871
- background-color: var(--color-surface-subtle);
872
- color: var(--color-text-muted);
873
- }
874
-
875
- .state-flow__item--active {
876
- border-color: var(--color-accent);
877
- color: var(--accent-soft-on, var(--color-on-accent));
878
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
879
- }
880
-
881
- .state-flow__item--complete {
882
- border-color: var(--color-success);
883
- color: var(--success-soft-on, var(--color-on-success));
884
- background-color: var(--success-soft-surface, var(--color-success-soft));
885
- }
886
-
887
- .state-flow__item--error {
888
- border-color: var(--color-danger);
889
- color: var(--danger-soft-on, var(--color-on-danger));
890
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
891
- }
892
-
893
- .state-flow__item--warning {
894
- border-color: var(--color-warning);
895
- color: var(--warning-soft-on, var(--color-on-warning));
896
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
897
- }
898
-
899
- .state-flow__item--info {
900
- border-color: var(--color-accent);
901
- color: var(--info-soft-on, var(--color-on-info));
902
- background-color: var(--info-soft-surface, var(--color-info-soft));
903
- }
904
-
905
- /* ---------------------------------------------------------
906
- 12. MULTI-STEP FORM SCAFFOLDING
907
- --------------------------------------------------------- */
908
-
909
- .form-flow {
910
- display: flex;
911
- flex-direction: column;
912
- justify-content: center;
913
- gap: var(--flow-gap-lg);
914
- }
915
-
916
- .form-flow__step {
917
- display: flex;
918
- flex-direction: column;
919
- gap: var(--flow-gap-md);
920
- }
921
-
922
- .form-flow__step--error {
923
- border-left: var(--border-width-strong) solid var(--color-danger);
924
- padding-left: var(--flow-inset-sm);
925
- background-color: var(--color-danger-soft);
926
- }
927
-
928
- .form-flow__step--warning {
929
- border-left: var(--border-width-strong) solid var(--color-warning);
930
- padding-left: var(--flow-inset-sm);
931
- background-color: var(--color-warning-soft);
932
- }
933
-
934
- .form-flow__step--valid,
935
- .form-flow__step--success {
936
- border-left: var(--border-width-strong) solid var(--color-success);
937
- padding-left: var(--flow-inset-sm);
938
- background-color: var(--color-success-soft);
939
- }
940
-
941
- .form-flow__actions {
942
- display: flex;
943
- justify-content: space-between;
944
- gap: var(--flow-gap-md);
945
- }
946
-
947
- .form-flow__actions-right {
948
- margin-left: auto;
949
- display: inline-flex;
950
- gap: var(--flow-gap-md);
951
- }
952
-
953
- /* ---------------------------------------------------------
954
- 13. BRANCHING FLOW CALLOUTS
955
- --------------------------------------------------------- */
956
-
957
- .flow-branch {
958
- display: grid;
959
- grid-template-columns: repeat(auto-fit, minmax(var(--flow-grid-min-md), 1fr));
960
- grid-gap: var(--flow-gap-lg);
961
- gap: var(--flow-gap-lg);
962
- }
963
-
964
- .flow-branch__icon {
965
- width: var(--flow-icon-size-md);
966
- height: var(--flow-icon-size-md);
967
- color: var(--color-icon-muted);
968
- flex-shrink: 0;
969
- }
970
-
971
- .flow-branch__title {
972
- font-size: var(--text-md);
973
- font-weight: 600;
974
- color: var(--color-text);
975
- }
976
-
977
- .flow-branch__details {
978
- font-size: var(--text-sm);
979
- color: var(--color-text-muted);
980
- line-height: var(--line-height-normal);
981
- }
982
-
983
- .flow-branch--compact {
984
- gap: var(--flow-gap-md);
985
- }
986
-
987
- .flow-branch--compact .flow-branch__title {
988
- font-size: var(--text-sm);
989
- }
990
-
991
- .flow-branch--compact .flow-branch__details {
992
- font-size: var(--text-xs);
993
- }
994
-
995
- .flow-branch__option {
996
- border-radius: var(--radius-md);
997
- border: var(--border-width) solid var(--color-border-subtle);
998
- background-color: var(--color-surface);
999
- padding: var(--flow-inset-md);
1000
-
1001
- display: flex;
1002
- flex-direction: column;
1003
- gap: var(--flow-gap-sm);
1004
-
1005
- font-size: var(--text-sm);
1006
- }
1007
-
1008
- .flow-branch__option--clickable {
1009
- cursor: pointer;
1010
- }
1011
-
1012
- .flow-branch__option--clickable:hover {
1013
- border-color: var(--color-accent);
1014
- }
1015
-
1016
- .flow-branch__option--clickable:active {
1017
- transform: translateY(1px);
1018
- opacity: 0.96;
1019
- }
1020
-
1021
- .flow-branch__option--disabled {
1022
- opacity: var(--flow-component-disabled-opacity);
1023
- pointer-events: none;
1024
- }
1025
-
1026
- .flow-branch__option--active {
1027
- border-color: var(--color-accent);
1028
- background-color: var(--accent-soft-surface, var(--color-accent-soft));
1029
- color: var(--accent-soft-on, var(--color-on-accent));
1030
- }
1031
-
1032
- .flow-branch__option--complete,
1033
- .flow-branch__option--success {
1034
- border-color: var(--color-success);
1035
- background-color: var(--success-soft-surface, var(--color-success-soft));
1036
- color: var(--success-soft-on, var(--color-on-success));
1037
- }
1038
-
1039
- .flow-branch__option--error {
1040
- border-color: var(--color-danger);
1041
- background-color: var(--danger-soft-surface, var(--color-danger-soft));
1042
- color: var(--danger-soft-on, var(--color-on-danger));
1043
- }
1044
-
1045
- .flow-branch__option--warning {
1046
- border-color: var(--color-warning);
1047
- background-color: var(--warning-soft-surface, var(--color-warning-soft));
1048
- color: var(--warning-soft-on, var(--color-on-warning));
1049
- }
1050
-
1051
- .flow-branch__option--info {
1052
- border-color: var(--color-accent);
1053
- background-color: var(--info-soft-surface, var(--color-info-soft));
1054
- color: var(--info-soft-on, var(--color-on-info));
1055
- }
1056
-
1057
- .flow-branch__arrow {
1058
- width: var(--space-6);
1059
- height: var(--border-width);
1060
- background-color: var(--color-border-subtle);
1061
- margin-left: auto;
1062
- margin-right: auto;
1063
- flex-shrink: 0;
1064
- }
1065
-
1066
- .flow-branch__arrow--error {
1067
- background-color: var(--color-danger);
1068
- }
1069
-
1070
- .flow-branch__arrow--warning {
1071
- background-color: var(--color-warning);
1072
- }
1073
-
1074
- /* ---------------------------------------------------------
1075
- 14. RESPONSIVE
1076
- --------------------------------------------------------- */
1077
-
1078
- @media (max-width: 768px) {
1079
-
1080
- .steps {
1081
- flex-wrap: wrap;
1082
- }
1083
-
1084
- .process-flow {
1085
- flex-direction: column;
1086
- align-items: flex-start;
1087
- }
1088
-
1089
- .process-flow__arrow {
1090
- width: var(--border-width);
1091
- height: var(--space-4);
1092
- }
1093
-
1094
- .journey {
1095
- flex-direction: column;
1096
- }
1097
-
1098
- .journey__stage {
1099
- width: 100%;
1100
- }
1101
- }
1
+ /************************************************************
2
+ * VLAH DESIGN SYSTEM (VDS) - Flows & Timelines
3
+ *
4
+ * Responsibilities:
5
+ * - Provide multi-step flow architecture: horizontal/vertical steps,
6
+ * state transitions, process nodes, journeys, branching flows,
7
+ * form-flow scaffolding, and rich timelines
8
+ * - Implement progress bars (solid, striped, reversed, segmented)
9
+ * with CSS-only animation and semantic variants
10
+ * - Expose interaction patterns: clickable, disabled, upcoming,
11
+ * error/success/warning/info states, density modes, and icon variants
12
+ * - Deliver layout scaffolding for complex journeys and workflows,
13
+ * ensuring predictable spacing, sizing, and semantic signalling
14
+ *
15
+ * System Notes:
16
+ * - Fully token-driven: flow gaps, insets, radii, bullet sizes,
17
+ * timeline points, stripe sizes, and animation speeds
18
+ * - 100% CSS; reduced-motion fallbacks defined for animated stripes
19
+ * - Composable: integrates with cards, content blocks, utilities,
20
+ * and documentation previews without overrides
21
+ ************************************************************/
22
+
23
+ /* ---------------------------------------------------------
24
+ 1. FLOW TOKEN DEFINITIONS
25
+ --------------------------------------------------------- */
26
+
27
+ [data-vds-flow],
28
+ .vds-flow {
29
+ --flow-component-disabled-opacity: 0.48;
30
+
31
+ --flow-step-bullet-sm: var(--space-5);
32
+ --flow-step-bullet-md: var(--space-5_5);
33
+ --flow-step-bullet-lg: var(--space-6);
34
+
35
+ --flow-timeline-point-sm: var(--space-2);
36
+ --flow-timeline-point-md: var(--space-3);
37
+ --flow-timeline-point-xs: var(--space-1_5);
38
+
39
+ --flow-node-min-width: var(--space-40);
40
+ --flow-stage-min-width: var(--space-48);
41
+ --flow-grid-min-md: var(--flow-stage-min-width);
42
+
43
+ --flow-icon-size-sm: var(--space-3);
44
+ --flow-icon-size-md: var(--space-4);
45
+ --flow-icon-size-lg: var(--space-5);
46
+
47
+ --flow-gap-xs: var(--space-1);
48
+ --flow-gap-sm: var(--space-2);
49
+ --flow-gap-md: var(--space-3);
50
+ --flow-gap-lg: var(--space-4);
51
+ --flow-gap-xl: var(--space-8);
52
+
53
+ --flow-inset-xs: var(--space-2);
54
+ --flow-inset-sm: var(--space-3);
55
+ --flow-inset-md: var(--space-4);
56
+ --flow-inset-lg: var(--space-6);
57
+
58
+ --flow-progress-stripe-size: var(--space-3);
59
+ --flow-progress-stripe-speed: 1.2s;
60
+ }
61
+
62
+ /* ---------------------------------------------------------
63
+ 2. GLOBAL FLOW MODIFIERS
64
+ --------------------------------------------------------- */
65
+
66
+ .flow--compact .flow {
67
+ gap: var(--flow-gap-lg);
68
+ }
69
+
70
+ .flow--compact .flow__body {
71
+ gap: var(--flow-gap-md);
72
+ }
73
+
74
+ .flow--compact .steps {
75
+ gap: var(--flow-gap-sm);
76
+ }
77
+
78
+ .flow--compact .timeline {
79
+ gap: var(--flow-gap-sm);
80
+ }
81
+
82
+ .flow--compact .journey {
83
+ gap: var(--flow-gap-md);
84
+ }
85
+
86
+ .flow--compact .process-flow {
87
+ gap: var(--flow-gap-sm);
88
+ }
89
+
90
+ .flow--compact .state-flow {
91
+ gap: var(--flow-gap-xs);
92
+ }
93
+
94
+ .flow--compact .form-flow {
95
+ gap: var(--flow-gap-md);
96
+ }
97
+
98
+ .steps__item--upcoming {
99
+ color: var(--color-text-soft);
100
+ }
101
+
102
+ .journey__stage--upcoming,
103
+ .process-flow__node--upcoming,
104
+ .flow-branch__option--upcoming,
105
+ .state-flow__item--upcoming {
106
+ border-color: var(--color-border-subtle);
107
+ background-color: var(--color-surface-subtle);
108
+ color: var(--color-text-muted);
109
+ }
110
+
111
+ .steps__item:focus-visible,
112
+ .steps__item--clickable:focus-visible,
113
+ .journey__stage--clickable:focus-visible,
114
+ .process-flow__node--clickable:focus-visible,
115
+ .flow-branch__option--clickable:focus-visible {
116
+ outline: var(--focus-ring-width) solid var(--color-accent);
117
+ outline-offset: var(--focus-ring-offset);
118
+ }
119
+
120
+ .steps__item--disabled,
121
+ .steps__item[aria-disabled="true"] {
122
+ opacity: var(--flow-component-disabled-opacity);
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ .journey__stage--disabled,
127
+ .journey__stage[aria-disabled="true"],
128
+ .process-flow__node--disabled,
129
+ .process-flow__node[aria-disabled="true"],
130
+ .flow-branch__option--disabled,
131
+ .flow-branch__option[aria-disabled="true"] {
132
+ opacity: var(--flow-component-disabled-opacity);
133
+ pointer-events: none;
134
+ }
135
+
136
+ /* ---------------------------------------------------------
137
+ 3. FLOW CONTAINER / WIZARD
138
+ --------------------------------------------------------- */
139
+
140
+ .flow {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: var(--space-8);
144
+ }
145
+
146
+ .flow__header {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: var(--space-2);
150
+ }
151
+
152
+ .flow__title {
153
+ font-size: var(--text-lg);
154
+ font-weight: 600;
155
+ }
156
+
157
+ .flow__subtitle {
158
+ font-size: var(--text-sm);
159
+ color: var(--color-text-muted);
160
+ }
161
+
162
+ .flow__body {
163
+ display: flex;
164
+ flex-direction: column;
165
+ gap: var(--space-6);
166
+ }
167
+
168
+ .flow__nav {
169
+ display: flex;
170
+ justify-content: flex-end;
171
+ gap: var(--space-4);
172
+ }
173
+
174
+ /* ---------------------------------------------------------
175
+ 4. STEP INDICATOR (HORIZONTAL)
176
+ --------------------------------------------------------- */
177
+
178
+ .steps {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: var(--space-4);
182
+ }
183
+
184
+ .steps__item {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: var(--flow-gap-sm);
188
+ font-size: var(--text-xs);
189
+ color: var(--color-text-muted);
190
+ }
191
+
192
+ .steps__item--clickable {
193
+ cursor: pointer;
194
+ }
195
+
196
+ .steps__item--clickable:hover .steps__label {
197
+ color: var(--color-text);
198
+ }
199
+
200
+ .steps__item--clickable:active {
201
+ transform: translateY(1px);
202
+ opacity: 0.95;
203
+ }
204
+
205
+ .steps__item--error {
206
+ color: var(--color-danger-strong);
207
+ }
208
+
209
+ .steps__item--error .steps__bullet {
210
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
211
+ border-color: var(--danger-soft-border, var(--color-danger));
212
+ color: var(--danger-soft-on, var(--color-on-danger));
213
+ }
214
+
215
+ .steps__item--warning {
216
+ color: var(--color-warning-strong);
217
+ }
218
+
219
+ .steps__item--warning .steps__bullet {
220
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
221
+ border-color: var(--warning-soft-border, var(--color-warning));
222
+ color: var(--warning-soft-on, var(--color-on-warning));
223
+ }
224
+
225
+ .steps__item[aria-current="step"],
226
+ .steps__item[aria-current="step"] .steps__label {
227
+ color: var(--color-text);
228
+ }
229
+
230
+ .steps__bullet {
231
+ width: var(--flow-step-bullet-md);
232
+ height: var(--flow-step-bullet-md);
233
+ border-radius: 999px;
234
+
235
+ display: flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+
239
+ border: var(--border-width) solid var(--color-border-subtle);
240
+ background-color: var(--color-surface-subtle);
241
+ color: var(--color-text-muted);
242
+
243
+ font-size: var(--text-xxs);
244
+ flex-shrink: 0;
245
+ }
246
+
247
+ .steps__label {
248
+ white-space: nowrap;
249
+ }
250
+
251
+ .steps__line {
252
+ flex: 1;
253
+ height: var(--border-width);
254
+ background-color: var(--color-border-subtle);
255
+ }
256
+
257
+ .steps__item--active .steps__bullet {
258
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
259
+ border-color: var(--accent-soft-border, var(--color-accent));
260
+ color: var(--accent-soft-on, var(--color-on-accent));
261
+ }
262
+
263
+ .steps__item--complete .steps__bullet {
264
+ background-color: var(--success-soft-surface, var(--color-success-soft));
265
+ border-color: var(--success-soft-border, var(--color-success));
266
+ color: var(--success-soft-on, var(--color-on-success));
267
+ opacity: 0.7;
268
+ }
269
+
270
+ .steps__item--active,
271
+ .steps__item--complete {
272
+ color: var(--color-text);
273
+ }
274
+
275
+ .steps--a .steps__bullet {
276
+ width: var(--flow-step-bullet-lg);
277
+ height: var(--flow-step-bullet-lg);
278
+ }
279
+
280
+ .steps--c .steps__bullet {
281
+ width: var(--flow-step-bullet-sm);
282
+ height: var(--flow-step-bullet-sm);
283
+ font-size: var(--text-xxs);
284
+ }
285
+
286
+ /* ---------------------------------------------------------
287
+ 5. STEP INDICATOR (VERTICAL)
288
+ --------------------------------------------------------- */
289
+
290
+ .steps--vertical {
291
+ flex-direction: column;
292
+ align-items: flex-start;
293
+ }
294
+
295
+ .steps--vertical .steps__item {
296
+ align-items: flex-start;
297
+ }
298
+
299
+ .steps--vertical .steps__line {
300
+ width: var(--border-width);
301
+ min-height: var(--flow-gap-xl);
302
+ height: auto;
303
+ background-color: var(--color-border-subtle);
304
+ margin-left: calc(var(--flow-step-bullet-md) / 2 - var(--border-width) / 2);
305
+ flex: auto;
306
+ }
307
+
308
+ /* ---------------------------------------------------------
309
+ 6. FLOW PROGRESS BARS
310
+ --------------------------------------------------------- */
311
+
312
+ .flow-progress {
313
+ width: 100%;
314
+ height: var(--border-width-strong);
315
+ background-color: var(--color-muted-bg);
316
+ border-radius: var(--radius-sm);
317
+ overflow: hidden;
318
+ }
319
+
320
+ .flow-progress__bar {
321
+ height: 100%;
322
+ width: 0;
323
+ background-color: var(--color-muted-bg);
324
+ transition: width 0.2s ease;
325
+ }
326
+
327
+ .flow-progress--striped .flow-progress__bar {
328
+ background-image: repeating-linear-gradient(
329
+ 45deg,
330
+ var(--color-text-soft) 0,
331
+ var(--color-text-soft) var(--flow-progress-stripe-size),
332
+ var(--color-muted-bg) var(--flow-progress-stripe-size),
333
+ var(--color-muted-bg) calc(var(--flow-progress-stripe-size) * 2)
334
+ );
335
+ animation: flow-progress-stripes var(--flow-progress-stripe-speed) linear infinite;
336
+ }
337
+
338
+ .flow-progress--striped .flow-progress__bar--error {
339
+ background-image: repeating-linear-gradient(
340
+ 45deg,
341
+ var(--color-danger) 0,
342
+ var(--color-danger) var(--flow-progress-stripe-size),
343
+ var(--color-danger-soft) var(--flow-progress-stripe-size),
344
+ var(--color-danger-soft) calc(var(--flow-progress-stripe-size) * 2)
345
+ );
346
+ }
347
+
348
+ .flow-progress--striped .flow-progress__bar--warning {
349
+ background-image: repeating-linear-gradient(
350
+ 45deg,
351
+ var(--color-warning) 0,
352
+ var(--color-warning) var(--flow-progress-stripe-size),
353
+ var(--color-warning-soft) var(--flow-progress-stripe-size),
354
+ var(--color-warning-soft) calc(var(--flow-progress-stripe-size) * 2)
355
+ );
356
+ }
357
+
358
+ @keyframes flow-progress-stripes {
359
+ from {
360
+ background-position: 0 0;
361
+ }
362
+ to {
363
+ background-position: calc(var(--flow-progress-stripe-size) * -2.828) 0;
364
+ }
365
+ }
366
+
367
+ @media (prefers-reduced-motion: reduce) {
368
+ .flow-progress--striped .flow-progress__bar {
369
+ animation: none;
370
+ background-position: 0 0;
371
+ }
372
+ }
373
+
374
+ .flow-progress--striped-right .flow-progress__bar {
375
+ animation: flow-progress-stripes-right var(--flow-progress-stripe-speed) linear infinite;
376
+ }
377
+
378
+ @keyframes flow-progress-stripes-right {
379
+ from {
380
+ background-position: calc(var(--flow-progress-stripe-size) * -2.828) 0;
381
+ }
382
+ to {
383
+ background-position: 0 0;
384
+ }
385
+ }
386
+
387
+ @media (prefers-reduced-motion: reduce) {
388
+ .flow-progress--striped-right .flow-progress__bar {
389
+ animation: none;
390
+ background-position: 0 0;
391
+ }
392
+ }
393
+
394
+ .flow-progress--segments {
395
+ display: flex;
396
+ height: var(--border-width-strong);
397
+ overflow: hidden;
398
+ border-radius: var(--radius-sm);
399
+ }
400
+
401
+ .flow-progress__segment {
402
+ flex: 1;
403
+ background-color: var(--color-muted-bg);
404
+ }
405
+
406
+ .flow-progress__segment--complete {
407
+ background-color: var(--color-success);
408
+ }
409
+
410
+ .flow-progress__segment--error {
411
+ background-color: var(--color-danger);
412
+ }
413
+
414
+ .flow-progress__segment--warning {
415
+ background-color: var(--color-warning);
416
+ }
417
+
418
+ /* ---------------------------------------------------------
419
+ 7. MINIMAL TIMELINE (A)
420
+ --------------------------------------------------------- */
421
+
422
+ .timeline {
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: var(--flow-gap-md);
426
+ }
427
+
428
+ .timeline__item {
429
+ display: flex;
430
+ align-items: stretch;
431
+ gap: var(--flow-gap-sm);
432
+ }
433
+
434
+ .timeline__point-wrap {
435
+ display: flex;
436
+ flex-direction: column;
437
+ align-items: center;
438
+ gap: var(--flow-gap-xs);
439
+ }
440
+
441
+ .timeline__point {
442
+ width: var(--flow-timeline-point-sm);
443
+ height: var(--flow-timeline-point-sm);
444
+ border-radius: 999px;
445
+ border: var(--border-width-strong) solid var(--color-accent);
446
+ background-color: var(--color-surface);
447
+ flex-shrink: 0;
448
+ }
449
+
450
+ .timeline__point--upcoming {
451
+ border-color: var(--color-border-subtle);
452
+ }
453
+
454
+ .timeline__point--error {
455
+ border-color: var(--color-danger);
456
+ background-color: var(--color-danger-soft);
457
+ }
458
+
459
+ .timeline__point--warning {
460
+ border-color: var(--warning-soft-border, var(--color-warning));
461
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
462
+ }
463
+
464
+ .timeline__point--success {
465
+ border-color: var(--danger-soft-border, var(--color-danger));
466
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
467
+ }
468
+
469
+ .timeline__point--info {
470
+ border-color: var(--info-soft-border, var(--color-info));
471
+ background-color: var(--info-soft-surface, var(--color-info-soft));
472
+ }
473
+
474
+ .timeline__icon {
475
+ width: var(--flow-icon-size-md);
476
+ height: var(--flow-icon-size-md);
477
+ color: var(--color-icon-muted);
478
+ }
479
+
480
+ .timeline__icon--left {
481
+ margin-right: var(--flow-gap-xs);
482
+ }
483
+
484
+ .timeline__icon--right {
485
+ margin-left: var(--flow-gap-xs);
486
+ }
487
+
488
+ .timeline__icon--top {
489
+ margin-bottom: var(--flow-gap-xs);
490
+ }
491
+
492
+ .timeline__line {
493
+ flex: 1;
494
+ width: var(--border-width-strong);
495
+ background-color: var(--color-border-subtle);
496
+ }
497
+
498
+ .timeline__content {
499
+ flex: 1;
500
+ display: flex;
501
+ flex-direction: column;
502
+ gap: var(--flow-gap-xs);
503
+ }
504
+
505
+ .timeline__label {
506
+ font-size: var(--text-sm);
507
+ font-weight: 500;
508
+
509
+ display: flex;
510
+ align-items: center;
511
+ gap: var(--space-2);
512
+ }
513
+
514
+ .timeline__note {
515
+ font-size: var(--text-xs);
516
+ color: var(--color-text-muted);
517
+ }
518
+
519
+ .timeline--horizontal {
520
+ flex-direction: row;
521
+ align-items: flex-start;
522
+ }
523
+
524
+ .timeline--horizontal .timeline__item {
525
+ flex-direction: column;
526
+ align-items: center;
527
+ }
528
+
529
+ .timeline--horizontal .timeline__point-wrap {
530
+ flex-direction: row;
531
+ }
532
+
533
+ .timeline--horizontal .timeline__line {
534
+ width: var(--component-gap-xl);
535
+ height: var(--border-width-strong);
536
+ }
537
+
538
+ .timeline--compact .timeline__item {
539
+ gap: var(--flow-gap-xs);
540
+ }
541
+
542
+ .timeline--compact .timeline__note {
543
+ font-size: var(--text-xxs);
544
+ }
545
+
546
+ .timeline--compact .timeline__point {
547
+ width: var(--flow-timeline-point-xs);
548
+ height: var(--flow-timeline-point-xs);
549
+ }
550
+
551
+ .timeline--compact .timeline__icon {
552
+ width: var(--flow-icon-size-sm);
553
+ height: var(--flow-icon-size-sm);
554
+ }
555
+
556
+ /* ---------------------------------------------------------
557
+ 8. RICH TIMELINE (B)
558
+ --------------------------------------------------------- */
559
+
560
+ .timeline--rich {
561
+ display: flex;
562
+ flex-direction: column;
563
+ gap: var(--flow-gap-lg);
564
+ }
565
+
566
+ .timeline--rich .timeline__item {
567
+ display: flex;
568
+ align-items: stretch;
569
+ gap: var(--flow-gap-md);
570
+ border-radius: var(--radius-sm);
571
+ padding: var(--flow-inset-sm);
572
+ border: var(--border-width) solid var(--color-border-subtle);
573
+ background-color: var(--flow-zebra-bg-alt);
574
+ }
575
+
576
+ .timeline--rich .timeline__item:nth-child(even) {
577
+ background-color: var(--flow-zebra-bg);
578
+ }
579
+
580
+ .timeline--rich .timeline__item:nth-child(odd) {
581
+ background-color: var(--flow-zebra-bg-alt);
582
+ }
583
+
584
+ .timeline--rich .timeline__point-wrap {
585
+ display: flex;
586
+ flex-direction: column;
587
+ align-items: center;
588
+ gap: var(--flow-gap-xs);
589
+ flex-shrink: 0;
590
+ }
591
+
592
+ .timeline--rich .timeline__point {
593
+ width: var(--flow-timeline-point-md);
594
+ height: var(--flow-timeline-point-md);
595
+ }
596
+
597
+ .timeline--rich .timeline__line {
598
+ flex: 1;
599
+ width: var(--border-width-strong);
600
+ background-color: var(--color-border-subtle);
601
+ border-radius: var(--radius-sm);
602
+ }
603
+
604
+ .timeline--rich .timeline__item:last-child .timeline__line {
605
+ display: none;
606
+ }
607
+
608
+ .timeline-events {
609
+ display: flex;
610
+ flex-direction: column;
611
+ gap: var(--space-4);
612
+ }
613
+
614
+ .timeline-events .timeline__item {
615
+ align-items: flex-start;
616
+ gap: var(--space-4);
617
+ }
618
+
619
+ .timeline__timestamp {
620
+ font-size: var(--text-xxs);
621
+ color: var(--color-text-soft);
622
+ }
623
+
624
+ .timeline__meta {
625
+ font-size: var(--text-xs);
626
+ color: var(--color-text-muted);
627
+ }
628
+
629
+ .timeline__body {
630
+ font-size: var(--text-sm);
631
+ color: var(--color-text);
632
+ margin-top: var(--flow-gap-xs);
633
+ }
634
+
635
+ .timeline--audit .timeline__label {
636
+ font-size: var(--text-xs);
637
+ text-transform: uppercase;
638
+ letter-spacing: 0.05em;
639
+ }
640
+
641
+ .timeline--audit .timeline__body {
642
+ font-size: var(--text-xs);
643
+ }
644
+
645
+ /* ---------------------------------------------------------
646
+ 9. JOURNEY MAP (HIGH-LEVEL FLOWS)
647
+ --------------------------------------------------------- */
648
+
649
+ .journey {
650
+ display: flex;
651
+ flex-wrap: wrap;
652
+ gap: var(--flow-gap-lg);
653
+ }
654
+
655
+ .journey--compact {
656
+ gap: var(--flow-gap-md);
657
+ }
658
+
659
+ .journey__stage {
660
+ flex: 1 1 var(--flow-stage-min-width);
661
+ min-width: var(--flow-stage-min-width);
662
+
663
+ display: flex;
664
+ flex-direction: column;
665
+ gap: var(--flow-gap-sm);
666
+
667
+ padding: var(--flow-inset-md);
668
+ border-radius: var(--radius-md);
669
+ border: var(--border-width) solid var(--color-border-subtle);
670
+ background-color: var(--color-surface);
671
+ }
672
+
673
+ .journey__stage--clickable {
674
+ cursor: pointer;
675
+ }
676
+
677
+ .journey__stage--clickable:hover {
678
+ border-color: var(--color-accent);
679
+ }
680
+
681
+ .journey__stage--clickable:active {
682
+ transform: translateY(1px);
683
+ opacity: 0.96;
684
+ }
685
+
686
+ .journey__stage--disabled {
687
+ opacity: var(--flow-component-disabled-opacity);
688
+ pointer-events: none;
689
+ }
690
+
691
+ .journey__stage--active {
692
+ border-color: var(--color-accent);
693
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
694
+ color: var(--accent-soft-on, var(--color-on-accent));
695
+ }
696
+
697
+ .journey__stage--complete,
698
+ .journey__stage--success {
699
+ border-color: var(--color-success);
700
+ background-color: var(--success-soft-surface, var(--color-success-soft));
701
+ color: var(--success-soft-on, var(--color-on-success));
702
+ }
703
+
704
+ .journey__stage--error {
705
+ border-color: var(--color-danger);
706
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
707
+ color: var(--danger-soft-on, var(--color-on-danger));
708
+ }
709
+
710
+ .journey__stage--warning {
711
+ border-color: var(--color-warning);
712
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
713
+ color: var(--warning-soft-on, var(--color-on-warning));
714
+ }
715
+
716
+ .journey__stage--info {
717
+ border-color: var(--color-accent);
718
+ background-color: var(--info-soft-surface, var(--color-info-soft));
719
+ color: var(--info-soft-on, var(--color-on-info));
720
+ }
721
+
722
+ .journey__icon {
723
+ width: var(--flow-icon-size-lg);
724
+ height: var(--flow-icon-size-lg);
725
+ color: var(--color-icon-muted);
726
+ }
727
+
728
+ .journey__marker {
729
+ font-size: var(--text-xs);
730
+ font-weight: 600;
731
+ text-transform: uppercase;
732
+ letter-spacing: 0.04em;
733
+ color: var(--color-text-muted);
734
+ }
735
+
736
+ .journey__title {
737
+ font-size: var(--text-md);
738
+ font-weight: 600;
739
+ }
740
+
741
+ .journey__details {
742
+ font-size: var(--text-sm);
743
+ color: var(--color-text-muted);
744
+ }
745
+
746
+ /* ---------------------------------------------------------
747
+ 10. PROCESS FLOW (NODE-BASED)
748
+ --------------------------------------------------------- */
749
+
750
+ .process-flow {
751
+ display: flex;
752
+ flex-wrap: wrap;
753
+ align-items: center;
754
+ gap: var(--flow-gap-md);
755
+ }
756
+
757
+ .process-flow--compact {
758
+ gap: var(--flow-gap-sm);
759
+ }
760
+
761
+ .process-flow__node {
762
+ min-width: var(--flow-node-min-width);
763
+ padding: var(--flow-inset-sm) var(--flow-inset-md);
764
+ border-radius: var(--radius-md);
765
+ border: var(--border-width) solid var(--color-border-subtle);
766
+ background-color: var(--color-surface);
767
+ font-size: var(--text-sm);
768
+ display: flex;
769
+ flex-direction: column;
770
+ align-items: center;
771
+ text-align: center;
772
+ gap: var(--flow-gap-xs);
773
+ }
774
+
775
+ .process-flow__node--clickable {
776
+ cursor: pointer;
777
+ }
778
+
779
+ .process-flow__node--clickable:hover {
780
+ border-color: var(--color-accent);
781
+ }
782
+
783
+ .process-flow__node--clickable:active {
784
+ transform: translateY(1px);
785
+ opacity: 0.96;
786
+ }
787
+
788
+ .process-flow__node--disabled {
789
+ opacity: var(--flow-component-disabled-opacity);
790
+ pointer-events: none;
791
+ }
792
+
793
+ .process-flow__node--active {
794
+ border-color: var(--color-accent);
795
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
796
+ }
797
+
798
+ .process-flow__node--complete,
799
+ .process-flow__node--success {
800
+ border-color: var(--color-success);
801
+ background-color: var(--success-soft-surface, var(--color-success-soft));
802
+ }
803
+
804
+ .process-flow__node--error {
805
+ border-color: var(--color-danger);
806
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
807
+ }
808
+
809
+ .process-flow__node--warning {
810
+ border-color: var(--color-warning);
811
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
812
+ }
813
+
814
+ .process-flow__node--info {
815
+ border-color: var(--color-accent);
816
+ background-color: var(--info-soft-surface, var(--color-info-soft));
817
+ }
818
+
819
+ .process-flow__icon {
820
+ width: var(--flow-icon-size-md);
821
+ height: var(--flow-icon-size-md);
822
+ color: var(--color-icon-muted);
823
+ margin-bottom: 0;
824
+ flex-shrink: 0;
825
+ }
826
+
827
+ .process-flow__arrow {
828
+ width: var(--space-6);
829
+ height: var(--border-width);
830
+ background-color: var(--color-border-subtle);
831
+ flex-shrink: 0;
832
+ }
833
+
834
+ .process-flow__arrow--error {
835
+ background-color: var(--color-danger);
836
+ }
837
+
838
+ .process-flow__arrow--warning {
839
+ background-color: var(--color-warning);
840
+ }
841
+
842
+ .process-flow--vertical {
843
+ flex-direction: column;
844
+ align-items: flex-start;
845
+ }
846
+
847
+ .process-flow--vertical .process-flow__arrow {
848
+ width: var(--border-width);
849
+ height: var(--space-6);
850
+ margin-left: calc(
851
+ var(--flow-node-min-width) / 2 - var(--border-width) / 2
852
+ );
853
+ }
854
+
855
+ /* ---------------------------------------------------------
856
+ 11. STATE FLOW (STATUS STEPS)
857
+ --------------------------------------------------------- */
858
+
859
+ .state-flow {
860
+ display: inline-flex;
861
+ align-items: center;
862
+ gap: var(--flow-gap-sm);
863
+ flex-wrap: wrap;
864
+ }
865
+
866
+ .state-flow__item {
867
+ padding: var(--flow-inset-xs) var(--flow-inset-sm);
868
+ font-size: var(--text-xs);
869
+ border-radius: 999px;
870
+ border: var(--border-width) solid var(--color-border-subtle);
871
+ background-color: var(--color-surface-subtle);
872
+ color: var(--color-text-muted);
873
+ }
874
+
875
+ .state-flow__item--active {
876
+ border-color: var(--color-accent);
877
+ color: var(--accent-soft-on, var(--color-on-accent));
878
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
879
+ }
880
+
881
+ .state-flow__item--complete {
882
+ border-color: var(--color-success);
883
+ color: var(--success-soft-on, var(--color-on-success));
884
+ background-color: var(--success-soft-surface, var(--color-success-soft));
885
+ }
886
+
887
+ .state-flow__item--error {
888
+ border-color: var(--color-danger);
889
+ color: var(--danger-soft-on, var(--color-on-danger));
890
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
891
+ }
892
+
893
+ .state-flow__item--warning {
894
+ border-color: var(--color-warning);
895
+ color: var(--warning-soft-on, var(--color-on-warning));
896
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
897
+ }
898
+
899
+ .state-flow__item--info {
900
+ border-color: var(--color-accent);
901
+ color: var(--info-soft-on, var(--color-on-info));
902
+ background-color: var(--info-soft-surface, var(--color-info-soft));
903
+ }
904
+
905
+ /* ---------------------------------------------------------
906
+ 12. MULTI-STEP FORM SCAFFOLDING
907
+ --------------------------------------------------------- */
908
+
909
+ .form-flow {
910
+ display: flex;
911
+ flex-direction: column;
912
+ justify-content: center;
913
+ gap: var(--flow-gap-lg);
914
+ }
915
+
916
+ .form-flow__step {
917
+ display: flex;
918
+ flex-direction: column;
919
+ gap: var(--flow-gap-md);
920
+ }
921
+
922
+ .form-flow__step--error {
923
+ border-left: var(--border-width-strong) solid var(--color-danger);
924
+ padding-left: var(--flow-inset-sm);
925
+ background-color: var(--color-danger-soft);
926
+ }
927
+
928
+ .form-flow__step--warning {
929
+ border-left: var(--border-width-strong) solid var(--color-warning);
930
+ padding-left: var(--flow-inset-sm);
931
+ background-color: var(--color-warning-soft);
932
+ }
933
+
934
+ .form-flow__step--valid,
935
+ .form-flow__step--success {
936
+ border-left: var(--border-width-strong) solid var(--color-success);
937
+ padding-left: var(--flow-inset-sm);
938
+ background-color: var(--color-success-soft);
939
+ }
940
+
941
+ .form-flow__actions {
942
+ display: flex;
943
+ justify-content: space-between;
944
+ gap: var(--flow-gap-md);
945
+ }
946
+
947
+ .form-flow__actions-right {
948
+ margin-left: auto;
949
+ display: inline-flex;
950
+ gap: var(--flow-gap-md);
951
+ }
952
+
953
+ /* ---------------------------------------------------------
954
+ 13. BRANCHING FLOW CALLOUTS
955
+ --------------------------------------------------------- */
956
+
957
+ .flow-branch {
958
+ display: grid;
959
+ grid-template-columns: repeat(auto-fit, minmax(var(--flow-grid-min-md), 1fr));
960
+ grid-gap: var(--flow-gap-lg);
961
+ gap: var(--flow-gap-lg);
962
+ }
963
+
964
+ .flow-branch__icon {
965
+ width: var(--flow-icon-size-md);
966
+ height: var(--flow-icon-size-md);
967
+ color: var(--color-icon-muted);
968
+ flex-shrink: 0;
969
+ }
970
+
971
+ .flow-branch__title {
972
+ font-size: var(--text-md);
973
+ font-weight: 600;
974
+ color: var(--color-text);
975
+ }
976
+
977
+ .flow-branch__details {
978
+ font-size: var(--text-sm);
979
+ color: var(--color-text-muted);
980
+ line-height: var(--line-height-normal);
981
+ }
982
+
983
+ .flow-branch--compact {
984
+ gap: var(--flow-gap-md);
985
+ }
986
+
987
+ .flow-branch--compact .flow-branch__title {
988
+ font-size: var(--text-sm);
989
+ }
990
+
991
+ .flow-branch--compact .flow-branch__details {
992
+ font-size: var(--text-xs);
993
+ }
994
+
995
+ .flow-branch__option {
996
+ border-radius: var(--radius-md);
997
+ border: var(--border-width) solid var(--color-border-subtle);
998
+ background-color: var(--color-surface);
999
+ padding: var(--flow-inset-md);
1000
+
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ gap: var(--flow-gap-sm);
1004
+
1005
+ font-size: var(--text-sm);
1006
+ }
1007
+
1008
+ .flow-branch__option--clickable {
1009
+ cursor: pointer;
1010
+ }
1011
+
1012
+ .flow-branch__option--clickable:hover {
1013
+ border-color: var(--color-accent);
1014
+ }
1015
+
1016
+ .flow-branch__option--clickable:active {
1017
+ transform: translateY(1px);
1018
+ opacity: 0.96;
1019
+ }
1020
+
1021
+ .flow-branch__option--disabled {
1022
+ opacity: var(--flow-component-disabled-opacity);
1023
+ pointer-events: none;
1024
+ }
1025
+
1026
+ .flow-branch__option--active {
1027
+ border-color: var(--color-accent);
1028
+ background-color: var(--accent-soft-surface, var(--color-accent-soft));
1029
+ color: var(--accent-soft-on, var(--color-on-accent));
1030
+ }
1031
+
1032
+ .flow-branch__option--complete,
1033
+ .flow-branch__option--success {
1034
+ border-color: var(--color-success);
1035
+ background-color: var(--success-soft-surface, var(--color-success-soft));
1036
+ color: var(--success-soft-on, var(--color-on-success));
1037
+ }
1038
+
1039
+ .flow-branch__option--error {
1040
+ border-color: var(--color-danger);
1041
+ background-color: var(--danger-soft-surface, var(--color-danger-soft));
1042
+ color: var(--danger-soft-on, var(--color-on-danger));
1043
+ }
1044
+
1045
+ .flow-branch__option--warning {
1046
+ border-color: var(--color-warning);
1047
+ background-color: var(--warning-soft-surface, var(--color-warning-soft));
1048
+ color: var(--warning-soft-on, var(--color-on-warning));
1049
+ }
1050
+
1051
+ .flow-branch__option--info {
1052
+ border-color: var(--color-accent);
1053
+ background-color: var(--info-soft-surface, var(--color-info-soft));
1054
+ color: var(--info-soft-on, var(--color-on-info));
1055
+ }
1056
+
1057
+ .flow-branch__arrow {
1058
+ width: var(--space-6);
1059
+ height: var(--border-width);
1060
+ background-color: var(--color-border-subtle);
1061
+ margin-left: auto;
1062
+ margin-right: auto;
1063
+ flex-shrink: 0;
1064
+ }
1065
+
1066
+ .flow-branch__arrow--error {
1067
+ background-color: var(--color-danger);
1068
+ }
1069
+
1070
+ .flow-branch__arrow--warning {
1071
+ background-color: var(--color-warning);
1072
+ }
1073
+
1074
+ /* ---------------------------------------------------------
1075
+ 14. RESPONSIVE
1076
+ --------------------------------------------------------- */
1077
+
1078
+ @media (max-width: 768px) {
1079
+
1080
+ .steps {
1081
+ flex-wrap: wrap;
1082
+ }
1083
+
1084
+ .process-flow {
1085
+ flex-direction: column;
1086
+ align-items: flex-start;
1087
+ }
1088
+
1089
+ .process-flow__arrow {
1090
+ width: var(--border-width);
1091
+ height: var(--space-4);
1092
+ }
1093
+
1094
+ .journey {
1095
+ flex-direction: column;
1096
+ }
1097
+
1098
+ .journey__stage {
1099
+ width: 100%;
1100
+ }
1101
+ }