@dillingerstaffing/strand-vue 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +4 -2
  2. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  3. package/dist/components/InstrumentViewport/InstrumentViewport.vue.d.ts +27 -0
  4. package/dist/components/InstrumentViewport/InstrumentViewport.vue.d.ts.map +1 -0
  5. package/dist/components/InstrumentViewport/index.d.ts +2 -0
  6. package/dist/components/InstrumentViewport/index.d.ts.map +1 -0
  7. package/dist/components/ScrollReveal/ScrollReveal.vue.d.ts +34 -0
  8. package/dist/components/ScrollReveal/ScrollReveal.vue.d.ts.map +1 -0
  9. package/dist/components/ScrollReveal/index.d.ts +2 -0
  10. package/dist/components/ScrollReveal/index.d.ts.map +1 -0
  11. package/dist/components/Toast/Toast.vue.d.ts.map +1 -1
  12. package/dist/components/Toast/ToastProvider.vue.d.ts.map +1 -1
  13. package/dist/css/strand-ui.css +149 -54
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +510 -433
  17. package/dist/index.js.map +1 -1
  18. package/package.json +2 -2
  19. package/src/components/Alert/Alert.test.ts +40 -0
  20. package/src/components/Alert/Alert.vue +10 -0
  21. package/src/components/InstrumentViewport/InstrumentViewport.test.ts +61 -0
  22. package/src/components/InstrumentViewport/InstrumentViewport.vue +32 -0
  23. package/src/components/InstrumentViewport/index.ts +1 -0
  24. package/src/components/ScrollReveal/ScrollReveal.test.ts +74 -0
  25. package/src/components/ScrollReveal/ScrollReveal.vue +68 -0
  26. package/src/components/ScrollReveal/index.ts +1 -0
  27. package/src/components/Toast/Toast.test.ts +36 -0
  28. package/src/components/Toast/Toast.vue +10 -0
  29. package/src/components/Toast/ToastProvider.vue +12 -0
  30. package/src/index.ts +2 -0
package/README.md CHANGED
@@ -36,13 +36,15 @@ import { Button, Card, Stack, Input } from '@dillingerstaffing/strand-vue'
36
36
 
37
37
  ## Components
38
38
 
39
- 31 components across 5 categories. Every component includes all interaction states, keyboard navigation, ARIA compliance, and `prefers-reduced-motion` support.
39
+ 34 components across 7 categories. Every component includes all interaction states, keyboard navigation, ARIA compliance, and `prefers-reduced-motion` support.
40
40
 
41
41
  **Input:** Button, Input, Textarea, Select, Checkbox, Radio, Switch, Slider, FormField
42
- **Display:** Card, Badge, Avatar, Tag, Table, DataReadout
42
+ **Display:** Card, Badge, Avatar, Tag, Table, DataReadout, CodeBlock
43
43
  **Layout:** Stack, Grid, Container, Divider, Section
44
44
  **Navigation:** Link, Tabs, Breadcrumb, Nav
45
45
  **Feedback:** Toast, Alert, Dialog, Tooltip, Progress, Spinner, Skeleton
46
+ **Surface:** InstrumentViewport
47
+ **Animation:** ScrollReveal
46
48
 
47
49
  ## Same CSS, Different Framework
48
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"Alert.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Alert/Alert.vue"],"names":[],"mappings":"AACA;AA0DA,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;IACjD,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAoCD,iBAAS,cAAc;WAoCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAaD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;YA9FV,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;iBAEnC,OAAO;wFAqGrB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"Alert.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Alert/Alert.vue"],"names":[],"mappings":"AACA;AAoEA,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;IACjD,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AA6CD,iBAAS,cAAc;WAwCT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;YA5GV,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO;iBAEnC,OAAO;wFAmHrB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -0,0 +1,27 @@
1
+ interface Props {
2
+ /** Show grid overlay lines */
3
+ grid?: boolean;
4
+ /** Additional CSS class */
5
+ className?: string;
6
+ }
7
+ declare function __VLS_template(): {
8
+ attrs: Partial<{}>;
9
+ slots: {
10
+ default?(_: {}): any;
11
+ };
12
+ refs: {};
13
+ rootEl: HTMLDivElement;
14
+ };
15
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
16
+ declare const __VLS_component: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
17
+ className: string;
18
+ grid: boolean;
19
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
20
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
21
+ export default _default;
22
+ type __VLS_WithTemplateSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
27
+ //# sourceMappingURL=InstrumentViewport.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstrumentViewport.vue.d.ts","sourceRoot":"","sources":["../../../src/components/InstrumentViewport/InstrumentViewport.vue"],"names":[],"mappings":"AACA;AAoCA,UAAU,KAAK;IACb,8BAA8B;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAwBD,iBAAS,cAAc;WAwBT,OAAO,IAA6B;;yBAXrB,GAAG;;;;EAgB/B;AAUD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;eAjEP,MAAM;UAFX,OAAO;wFA2Ed,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as InstrumentViewport } from './InstrumentViewport.vue';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/InstrumentViewport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,34 @@
1
+ interface Props {
2
+ /** Intersection threshold (0-1) to trigger reveal */
3
+ threshold?: number;
4
+ /** Only reveal once (do not hide on exit) */
5
+ once?: boolean;
6
+ /** Additional CSS class */
7
+ className?: string;
8
+ }
9
+ declare function __VLS_template(): {
10
+ attrs: Partial<{}>;
11
+ slots: {
12
+ default?(_: {}): any;
13
+ };
14
+ refs: {
15
+ elRef: HTMLDivElement;
16
+ };
17
+ rootEl: HTMLDivElement;
18
+ };
19
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
20
+ declare const __VLS_component: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
21
+ className: string;
22
+ threshold: number;
23
+ once: boolean;
24
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
25
+ elRef: HTMLDivElement;
26
+ }, HTMLDivElement>;
27
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
28
+ export default _default;
29
+ type __VLS_WithTemplateSlots<T, S> = T & {
30
+ new (): {
31
+ $slots: S;
32
+ };
33
+ };
34
+ //# sourceMappingURL=ScrollReveal.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollReveal.vue.d.ts","sourceRoot":"","sources":["../../../src/components/ScrollReveal/ScrollReveal.vue"],"names":[],"mappings":"AACA;AAwEA,UAAU,KAAK;IACb,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA2DD,iBAAS,cAAc;WA4BT,OAAO,IAA6B;;yBAZrB,GAAG;;;;;;EAiB/B;AAWD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;eAzGP,MAAM;eAJN,MAAM;UAEX,OAAO;;;kBAoHd,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as ScrollReveal } from './ScrollReveal.vue';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ScrollReveal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/Toast.vue"],"names":[],"mappings":"AACA;AAmDA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAA;CAChB;;;;;;YAHU,WAAW;;AAoFtB,wBASG"}
1
+ {"version":3,"file":"Toast.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/Toast.vue"],"names":[],"mappings":"AACA;AA6DA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAA;CAChB;;;;;;YAHU,WAAW;;AAkGtB,wBASG"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToastProvider.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/ToastProvider.vue"],"names":[],"mappings":"AACA;AA2IA,iBAAS,cAAc;WA+CT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAUD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,+QAKnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAEpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ToastProvider.vue.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/ToastProvider.vue"],"names":[],"mappings":"AACA;AAkKA,iBAAS,cAAc;WAmDT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAWD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,+QAKnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAEpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -13,34 +13,45 @@
13
13
  justify-content: space-between;
14
14
  width: 100%;
15
15
  padding: var(--strand-space-6);
16
- padding-left: var(--strand-space-5);
17
16
  border-radius: var(--strand-radius-md);
18
- border-left: 4px solid transparent;
19
17
  font-family: var(--strand-font-sans);
20
18
  font-size: var(--strand-text-sm);
19
+ background: var(--strand-surface-recessed);
21
20
  }
22
21
 
23
- /* ── Status variants ── */
22
+ /* ── Status variants (neutral background, status color on prefix only) ── */
24
23
  .strand-alert--info {
25
- background: var(--strand-blue-glow);
26
- border-left-color: var(--strand-blue-primary);
24
+ background: var(--strand-surface-recessed);
27
25
  }
28
26
 
29
27
  .strand-alert--success {
30
- background: rgba(34, 197, 94, 0.08);
31
- border-left-color: var(--strand-green-positive);
28
+ background: var(--strand-surface-recessed);
32
29
  }
33
30
 
34
31
  .strand-alert--warning {
35
- background: rgba(245, 158, 11, 0.08);
36
- border-left-color: var(--strand-amber-caution);
32
+ background: var(--strand-surface-recessed);
37
33
  }
38
34
 
39
35
  .strand-alert--error {
40
- background: rgba(239, 68, 68, 0.08);
41
- border-left-color: var(--strand-red-alert);
36
+ background: var(--strand-surface-recessed);
42
37
  }
43
38
 
39
+ /* ── Status prefix ── */
40
+ .strand-alert__status {
41
+ font-family: var(--strand-font-mono);
42
+ font-size: var(--strand-text-xs);
43
+ font-weight: var(--strand-weight-semibold);
44
+ letter-spacing: var(--strand-tracking-wider);
45
+ text-transform: uppercase;
46
+ margin-right: var(--strand-space-3);
47
+ flex-shrink: 0;
48
+ }
49
+
50
+ .strand-alert--info .strand-alert__status { color: var(--strand-blue-primary); }
51
+ .strand-alert--success .strand-alert__status { color: var(--strand-teal-vital); }
52
+ .strand-alert--warning .strand-alert__status { color: var(--strand-amber-caution); }
53
+ .strand-alert--error .strand-alert__status { color: var(--strand-red-alert); }
54
+
44
55
  /* ── Content ── */
45
56
  .strand-alert__content {
46
57
  flex: 1;
@@ -53,8 +64,8 @@
53
64
  display: inline-flex;
54
65
  align-items: center;
55
66
  justify-content: center;
56
- width: 24px;
57
- height: 24px;
67
+ width: var(--strand-space-6);
68
+ height: var(--strand-space-6);
58
69
  margin-left: var(--strand-space-4);
59
70
  padding: 0;
60
71
  border: none;
@@ -134,8 +145,8 @@
134
145
  }
135
146
 
136
147
  .strand-avatar--xl {
137
- width: 64px;
138
- height: 64px;
148
+ width: var(--strand-space-16);
149
+ height: var(--strand-space-16);
139
150
  font-size: var(--strand-text-lg);
140
151
  }
141
152
 
@@ -314,13 +325,13 @@
314
325
  .strand-btn--sm {
315
326
  padding: var(--strand-space-1) var(--strand-space-3);
316
327
  font-size: var(--strand-text-sm);
317
- min-height: 32px;
328
+ min-height: var(--strand-touch-target);
318
329
  }
319
330
 
320
331
  .strand-btn--md {
321
332
  padding: calc(var(--strand-space-2) + var(--strand-space-1) / 2) var(--strand-space-5);
322
333
  font-size: var(--strand-text-sm);
323
- min-height: 40px;
334
+ min-height: var(--strand-touch-target);
324
335
  }
325
336
 
326
337
  .strand-btn--lg {
@@ -332,12 +343,12 @@
332
343
  /* ── Icon-only ── */
333
344
  .strand-btn--icon-only.strand-btn--sm {
334
345
  padding: var(--strand-space-1);
335
- min-width: 32px;
346
+ min-width: var(--strand-touch-target);
336
347
  }
337
348
 
338
349
  .strand-btn--icon-only.strand-btn--md {
339
350
  padding: var(--strand-space-2);
340
- min-width: 40px;
351
+ min-width: var(--strand-touch-target);
341
352
  }
342
353
 
343
354
  .strand-btn--icon-only.strand-btn--lg {
@@ -555,6 +566,7 @@
555
566
  display: inline-flex;
556
567
  align-items: center;
557
568
  gap: var(--strand-space-2);
569
+ min-height: var(--strand-touch-target);
558
570
  cursor: pointer;
559
571
  user-select: none;
560
572
  font-family: var(--strand-font-sans);
@@ -581,8 +593,8 @@
581
593
  display: flex;
582
594
  align-items: center;
583
595
  justify-content: center;
584
- width: 18px;
585
- height: 18px;
596
+ width: var(--strand-control-size);
597
+ height: var(--strand-control-size);
586
598
  border: 1px solid var(--strand-gray-200);
587
599
  border-radius: var(--strand-radius-sm);
588
600
  background: var(--strand-surface-elevated);
@@ -676,7 +688,7 @@
676
688
  line-height: var(--strand-leading-relaxed);
677
689
  color: var(--strand-blue-midnight);
678
690
  background: var(--strand-surface-recessed);
679
- box-shadow: inset 0 1px 3px rgba(15, 23, 42, 0.06);
691
+ box-shadow: inset 0 1px 3px rgba(15, 23, 42, 0.06); /* strand-blue-abyss at 6% opacity */
680
692
  border-radius: var(--strand-radius-lg);
681
693
  padding: var(--strand-space-3) var(--strand-space-4);
682
694
  overflow-x: auto;
@@ -919,10 +931,12 @@
919
931
 
920
932
  /* ── Label ── */
921
933
  .strand-form-field__label {
922
- font-family: var(--strand-font-sans);
923
- font-size: var(--strand-text-sm);
934
+ font-family: var(--strand-font-mono);
935
+ font-size: var(--strand-text-xs);
924
936
  font-weight: var(--strand-weight-medium);
925
- color: var(--strand-gray-700);
937
+ letter-spacing: var(--strand-tracking-widest);
938
+ text-transform: uppercase;
939
+ color: var(--strand-gray-500);
926
940
  line-height: var(--strand-leading-snug);
927
941
  }
928
942
 
@@ -1081,6 +1095,47 @@
1081
1095
  }
1082
1096
 
1083
1097
 
1098
+ /* InstrumentViewport */
1099
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1100
+
1101
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1102
+
1103
+ .strand-instrument-viewport {
1104
+ background: var(--strand-blue-abyss);
1105
+ color: var(--strand-gray-100);
1106
+ border-radius: var(--strand-radius-lg);
1107
+ overflow: hidden;
1108
+ position: relative;
1109
+ }
1110
+
1111
+ .strand-instrument-viewport__label {
1112
+ color: var(--strand-gray-400);
1113
+ font-family: var(--strand-font-mono);
1114
+ font-size: var(--strand-text-xs);
1115
+ font-weight: var(--strand-weight-medium);
1116
+ letter-spacing: var(--strand-tracking-widest);
1117
+ text-transform: uppercase;
1118
+ }
1119
+
1120
+ .strand-instrument-viewport__value {
1121
+ color: var(--strand-on-blue-primary);
1122
+ font-family: var(--strand-font-mono);
1123
+ font-variant-numeric: tabular-nums;
1124
+ }
1125
+
1126
+ /* Optional grid overlay */
1127
+ .strand-instrument-viewport--grid::before {
1128
+ content: '';
1129
+ position: absolute;
1130
+ inset: 0;
1131
+ background:
1132
+ linear-gradient(rgba(59, 142, 246, 0.04) 1px, transparent 1px),
1133
+ linear-gradient(90deg, rgba(59, 142, 246, 0.04) 1px, transparent 1px);
1134
+ background-size: var(--strand-viewport-grid-size) var(--strand-viewport-grid-size);
1135
+ pointer-events: none;
1136
+ }
1137
+
1138
+
1084
1139
  /* Link */
1085
1140
  /*! Strand UI | MIT License | dillingerstaffing.com */
1086
1141
 
@@ -1125,7 +1180,7 @@
1125
1180
  .strand-nav {
1126
1181
  position: relative;
1127
1182
  width: 100%;
1128
- height: 64px;
1183
+ height: var(--strand-nav-height);
1129
1184
  background: var(--strand-surface-elevated);
1130
1185
  border-bottom: 1px solid var(--strand-gray-200);
1131
1186
  font-family: var(--strand-font-sans);
@@ -1286,7 +1341,7 @@
1286
1341
 
1287
1342
  .strand-nav {
1288
1343
  height: auto;
1289
- min-height: 64px;
1344
+ min-height: var(--strand-nav-height);
1290
1345
  }
1291
1346
  }
1292
1347
 
@@ -1408,6 +1463,7 @@
1408
1463
  display: inline-flex;
1409
1464
  align-items: center;
1410
1465
  gap: var(--strand-space-2);
1466
+ min-height: var(--strand-touch-target);
1411
1467
  cursor: pointer;
1412
1468
  user-select: none;
1413
1469
  font-family: var(--strand-font-sans);
@@ -1434,8 +1490,8 @@
1434
1490
  display: flex;
1435
1491
  align-items: center;
1436
1492
  justify-content: center;
1437
- width: 18px;
1438
- height: 18px;
1493
+ width: var(--strand-control-size);
1494
+ height: var(--strand-control-size);
1439
1495
  border: 1px solid var(--strand-gray-200);
1440
1496
  border-radius: var(--strand-radius-full);
1441
1497
  background: var(--strand-surface-elevated);
@@ -1501,6 +1557,40 @@
1501
1557
  }
1502
1558
 
1503
1559
 
1560
+ /* ScrollReveal */
1561
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1562
+
1563
+ /*! Strand UI | MIT License | dillingerstaffing.com */
1564
+
1565
+ .strand-reveal {
1566
+ opacity: 0;
1567
+ transform: translateY(24px);
1568
+ transition: opacity var(--strand-duration-glacial) var(--strand-ease-out-expo),
1569
+ transform var(--strand-duration-glacial) var(--strand-ease-out-expo);
1570
+ }
1571
+
1572
+ .strand-reveal--visible {
1573
+ opacity: 1;
1574
+ transform: translateY(0);
1575
+ }
1576
+
1577
+ /* Stagger children */
1578
+ .strand-reveal-group > .strand-reveal:nth-child(1) { transition-delay: 0ms; }
1579
+ .strand-reveal-group > .strand-reveal:nth-child(2) { transition-delay: var(--strand-stagger-delay); }
1580
+ .strand-reveal-group > .strand-reveal:nth-child(3) { transition-delay: calc(var(--strand-stagger-delay) * 2); }
1581
+ .strand-reveal-group > .strand-reveal:nth-child(4) { transition-delay: calc(var(--strand-stagger-delay) * 3); }
1582
+ .strand-reveal-group > .strand-reveal:nth-child(5) { transition-delay: calc(var(--strand-stagger-delay) * 4); }
1583
+ .strand-reveal-group > .strand-reveal:nth-child(6) { transition-delay: var(--strand-duration-slow); }
1584
+
1585
+ @media (prefers-reduced-motion: reduce) {
1586
+ .strand-reveal {
1587
+ opacity: 1;
1588
+ transform: none;
1589
+ transition: none;
1590
+ }
1591
+ }
1592
+
1593
+
1504
1594
  /* Section */
1505
1595
  /*! Strand UI | MIT License | dillingerstaffing.com */
1506
1596
 
@@ -1696,14 +1786,15 @@
1696
1786
  transition: background var(--strand-duration-fast) var(--strand-ease-out-quart);
1697
1787
  }
1698
1788
 
1699
- /* ── Thumb: Webkit ── */
1789
+ /* ── Thumb: Webkit (44px touch target, 20px visual) ── */
1700
1790
  .strand-slider__field::-webkit-slider-thumb {
1701
1791
  appearance: none;
1702
1792
  width: 20px;
1703
1793
  height: 20px;
1704
1794
  background: var(--strand-blue-primary);
1705
- border: 2px solid var(--strand-surface-elevated);
1795
+ border: 12px solid transparent;
1706
1796
  border-radius: var(--strand-radius-full);
1797
+ background-clip: padding-box;
1707
1798
  cursor: pointer;
1708
1799
  box-shadow: var(--strand-elevation-1);
1709
1800
  transition:
@@ -1713,21 +1804,24 @@
1713
1804
 
1714
1805
  .strand-slider__field:hover:not(:disabled)::-webkit-slider-thumb {
1715
1806
  background: var(--strand-blue-vivid);
1807
+ background-clip: padding-box;
1716
1808
  transform: scale(1.15);
1717
1809
  }
1718
1810
 
1719
1811
  .strand-slider__field:active:not(:disabled)::-webkit-slider-thumb {
1720
1812
  background: var(--strand-blue-deep);
1813
+ background-clip: padding-box;
1721
1814
  transform: scale(1.05);
1722
1815
  }
1723
1816
 
1724
- /* ── Thumb: Firefox ── */
1817
+ /* ── Thumb: Firefox (44px touch target, 20px visual) ── */
1725
1818
  .strand-slider__field::-moz-range-thumb {
1726
1819
  width: 20px;
1727
1820
  height: 20px;
1728
1821
  background: var(--strand-blue-primary);
1729
- border: 2px solid var(--strand-surface-elevated);
1822
+ border: 12px solid transparent;
1730
1823
  border-radius: var(--strand-radius-full);
1824
+ background-clip: padding-box;
1731
1825
  cursor: pointer;
1732
1826
  box-shadow: var(--strand-elevation-1);
1733
1827
  transition:
@@ -1737,11 +1831,13 @@
1737
1831
 
1738
1832
  .strand-slider__field:hover:not(:disabled)::-moz-range-thumb {
1739
1833
  background: var(--strand-blue-vivid);
1834
+ background-clip: padding-box;
1740
1835
  transform: scale(1.15);
1741
1836
  }
1742
1837
 
1743
1838
  .strand-slider__field:active:not(:disabled)::-moz-range-thumb {
1744
1839
  background: var(--strand-blue-deep);
1840
+ background-clip: padding-box;
1745
1841
  transform: scale(1.05);
1746
1842
  }
1747
1843
 
@@ -1935,6 +2031,7 @@
1935
2031
  display: inline-flex;
1936
2032
  align-items: center;
1937
2033
  gap: var(--strand-space-2);
2034
+ min-height: var(--strand-touch-target);
1938
2035
  cursor: pointer;
1939
2036
  user-select: none;
1940
2037
  font-family: var(--strand-font-sans);
@@ -2121,7 +2218,7 @@
2121
2218
  .strand-tabs [role="tablist"] {
2122
2219
  display: flex;
2123
2220
  gap: var(--strand-space-1);
2124
- border-bottom: 1px solid var(--strand-gray-400);
2221
+ border-bottom: 1px solid var(--strand-gray-200);
2125
2222
  }
2126
2223
 
2127
2224
  /* ── Tab button ── */
@@ -2195,7 +2292,7 @@
2195
2292
  }
2196
2293
 
2197
2294
  .strand-tag--solid.strand-tag--teal {
2198
- background: rgba(20, 184, 166, 0.1);
2295
+ background: var(--strand-surface-recessed);
2199
2296
  color: var(--strand-on-teal-tint);
2200
2297
  }
2201
2298
 
@@ -2205,12 +2302,12 @@
2205
2302
  }
2206
2303
 
2207
2304
  .strand-tag--solid.strand-tag--amber {
2208
- background: rgba(245, 158, 11, 0.1);
2305
+ background: var(--strand-surface-recessed);
2209
2306
  color: var(--strand-on-amber-tint);
2210
2307
  }
2211
2308
 
2212
2309
  .strand-tag--solid.strand-tag--red {
2213
- background: rgba(239, 68, 68, 0.1);
2310
+ background: var(--strand-surface-recessed);
2214
2311
  color: var(--strand-on-red-tint);
2215
2312
  }
2216
2313
 
@@ -2383,7 +2480,6 @@
2383
2480
  padding: var(--strand-space-4) var(--strand-space-5);
2384
2481
  background: var(--strand-surface-elevated);
2385
2482
  border-radius: var(--strand-radius-lg);
2386
- border-left: 4px solid transparent;
2387
2483
  box-shadow: var(--strand-elevation-3);
2388
2484
  font-family: var(--strand-font-sans);
2389
2485
  font-size: var(--strand-text-sm);
@@ -2391,22 +2487,21 @@
2391
2487
  animation: strand-toast-in var(--strand-duration-normal) var(--strand-ease-out-expo);
2392
2488
  }
2393
2489
 
2394
- /* ── Status accents ── */
2395
- .strand-toast--info {
2396
- border-left-color: var(--strand-blue-primary);
2397
- }
2398
-
2399
- .strand-toast--success {
2400
- border-left-color: var(--strand-green-positive);
2401
- }
2402
-
2403
- .strand-toast--warning {
2404
- border-left-color: var(--strand-amber-caution);
2490
+ /* ── Status prefix ── */
2491
+ .strand-toast__status {
2492
+ font-family: var(--strand-font-mono);
2493
+ font-size: var(--strand-text-xs);
2494
+ font-weight: var(--strand-weight-semibold);
2495
+ letter-spacing: var(--strand-tracking-wider);
2496
+ text-transform: uppercase;
2497
+ margin-right: var(--strand-space-3);
2498
+ flex-shrink: 0;
2405
2499
  }
2406
2500
 
2407
- .strand-toast--error {
2408
- border-left-color: var(--strand-red-alert);
2409
- }
2501
+ .strand-toast--info .strand-toast__status { color: var(--strand-blue-primary); }
2502
+ .strand-toast--success .strand-toast__status { color: var(--strand-teal-vital); }
2503
+ .strand-toast--warning .strand-toast__status { color: var(--strand-amber-caution); }
2504
+ .strand-toast--error .strand-toast__status { color: var(--strand-red-alert); }
2410
2505
 
2411
2506
  /* ── Message ── */
2412
2507
  .strand-toast__message {
@@ -2421,8 +2516,8 @@
2421
2516
  display: inline-flex;
2422
2517
  align-items: center;
2423
2518
  justify-content: center;
2424
- width: 24px;
2425
- height: 24px;
2519
+ width: var(--strand-space-6);
2520
+ height: var(--strand-space-6);
2426
2521
  margin-left: var(--strand-space-3);
2427
2522
  padding: 0;
2428
2523
  border: none;
package/dist/index.d.ts CHANGED
@@ -20,6 +20,8 @@ export { default as Grid } from './components/Grid/Grid.vue';
20
20
  export { default as Container } from './components/Container/Container.vue';
21
21
  export { default as Divider } from './components/Divider/Divider.vue';
22
22
  export { default as Section } from './components/Section/Section.vue';
23
+ export { default as InstrumentViewport } from './components/InstrumentViewport/InstrumentViewport.vue';
24
+ export { default as ScrollReveal } from './components/ScrollReveal/ScrollReveal.vue';
23
25
  export { default as Link } from './components/Link/Link.vue';
24
26
  export { default as Tabs } from './components/Tabs/Tabs.vue';
25
27
  export { default as Breadcrumb } from './components/Breadcrumb/Breadcrumb.vue';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAGtE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AACvG,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAGrF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC"}