@dillingerstaffing/strand-ui 0.7.1 → 0.9.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.
package/HTML_REFERENCE.md
CHANGED
|
@@ -834,3 +834,45 @@ All container components (Grid, Stack, Card, Container) enforce boundary integri
|
|
|
834
834
|
> **Keyboard navigation:** Tab/Shift+Tab reaches all interactive elements. Arrow keys navigate within Tabs and menus (requires JavaScript). Escape closes overlays. Enter/Space activates buttons. Dialog must trap focus. See [DL L1197-1204](./DESIGN_LANGUAGE.md#L1197).
|
|
835
835
|
|
|
836
836
|
> **Motion anti-patterns (never do):** Never re-animate on viewport exit/re-enter. Never hijack scroll. Never animate width/height/margin/padding (use transform). Never use bounce/elastic easing. Never animate more than 3-4 elements simultaneously. Never use parallax on text. See [DL L671-680](./DESIGN_LANGUAGE.md#L671).
|
|
837
|
+
|
|
838
|
+
---
|
|
839
|
+
|
|
840
|
+
## Utility Classes
|
|
841
|
+
|
|
842
|
+
### Overline
|
|
843
|
+
|
|
844
|
+
```html
|
|
845
|
+
<span class="strand-overline">Specimen Label</span>
|
|
846
|
+
```
|
|
847
|
+
|
|
848
|
+
The monospace uppercase tracked label pattern. Used for section labels, category headers, and data annotations.
|
|
849
|
+
|
|
850
|
+
> **DL foundation:** This is the laboratory specimen label pattern from [DL Part IV.5 (L386-L396)](./DESIGN_LANGUAGE.md#L386).
|
|
851
|
+
|
|
852
|
+
### Headline
|
|
853
|
+
|
|
854
|
+
```html
|
|
855
|
+
<div class="strand-headline strand-headline--xl">STRAND</div>
|
|
856
|
+
<h2 class="strand-headline strand-headline--lg">Section Title</h2>
|
|
857
|
+
```
|
|
858
|
+
|
|
859
|
+
**Sizes:** `--xl` (hero, fluid 2.5rem-5rem) | `--lg` (section, fluid 1.5rem-2.5rem)
|
|
860
|
+
|
|
861
|
+
### Lead
|
|
862
|
+
|
|
863
|
+
```html
|
|
864
|
+
<p class="strand-lead">Design tokens + UI components. Zero-runtime CSS. Ship faster.</p>
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
Intro paragraph. Max 50 characters per line. Used after headlines.
|
|
868
|
+
|
|
869
|
+
### Secondary Text
|
|
870
|
+
|
|
871
|
+
```html
|
|
872
|
+
<p class="strand-text-secondary">Supporting description for a card, feature, or section.</p>
|
|
873
|
+
<span class="strand-text-secondary strand-text-secondary--xs">Fine print or metadata.</span>
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
Caption/description text. text-sm, gray-500, relaxed leading. The `--xs` modifier reduces to text-xs for metadata and fine print.
|
|
877
|
+
|
|
878
|
+
> **DL foundation:** [DESIGN_LANGUAGE.md Part III.8 Color Roles](./DESIGN_LANGUAGE.md#L290) defines gray-500 as the secondary text role. [Part IV.7 Named Text Patterns](./DESIGN_LANGUAGE.md#L408) specifies the Secondary pattern.
|
package/dist/css/strand-ui.css
CHANGED
|
@@ -488,6 +488,7 @@
|
|
|
488
488
|
|
|
489
489
|
/* ── Variants ── */
|
|
490
490
|
.strand-card--elevated {
|
|
491
|
+
border: 1px solid var(--strand-border-subtle);
|
|
491
492
|
box-shadow: var(--strand-elevation-1);
|
|
492
493
|
}
|
|
493
494
|
|
|
@@ -497,6 +498,7 @@
|
|
|
497
498
|
}
|
|
498
499
|
|
|
499
500
|
.strand-card--interactive {
|
|
501
|
+
border: 1px solid var(--strand-border-subtle);
|
|
500
502
|
box-shadow: var(--strand-elevation-1);
|
|
501
503
|
cursor: pointer;
|
|
502
504
|
transition:
|
|
@@ -672,7 +674,7 @@
|
|
|
672
674
|
line-height: var(--strand-leading-relaxed);
|
|
673
675
|
color: var(--strand-blue-midnight);
|
|
674
676
|
background: var(--strand-surface-recessed);
|
|
675
|
-
box-shadow:
|
|
677
|
+
box-shadow: var(--strand-shadow-inset);
|
|
676
678
|
border-radius: var(--strand-radius-lg);
|
|
677
679
|
padding: var(--strand-space-3) var(--strand-space-4);
|
|
678
680
|
overflow-x: auto;
|
|
@@ -960,11 +962,16 @@
|
|
|
960
962
|
min-width: 0;
|
|
961
963
|
}
|
|
962
964
|
|
|
963
|
-
/* ──
|
|
965
|
+
/* ── Fixed column utilities ── */
|
|
964
966
|
.strand-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
|
|
965
967
|
.strand-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
|
|
966
968
|
.strand-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
|
|
967
969
|
|
|
970
|
+
/* ── Responsive auto-fit (columns adjust to available width) ── */
|
|
971
|
+
.strand-grid--auto-sm { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
|
|
972
|
+
.strand-grid--auto-md { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
|
|
973
|
+
.strand-grid--auto-lg { grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); }
|
|
974
|
+
|
|
968
975
|
/* ── Gap utilities ── */
|
|
969
976
|
.strand-grid--gap-1 { gap: var(--strand-space-1); }
|
|
970
977
|
.strand-grid--gap-2 { gap: var(--strand-space-2); }
|
|
@@ -2603,9 +2610,59 @@
|
|
|
2603
2610
|
|
|
2604
2611
|
.strand-viewport {
|
|
2605
2612
|
background: var(--strand-surface-recessed);
|
|
2606
|
-
box-shadow: inset
|
|
2613
|
+
box-shadow: var(--strand-shadow-inset);
|
|
2607
2614
|
border-radius: var(--strand-radius-lg);
|
|
2608
2615
|
padding: var(--strand-space-6);
|
|
2609
2616
|
}
|
|
2610
2617
|
|
|
2618
|
+
/* ── Overline (specimen label pattern, DL Part IV.5) ── */
|
|
2619
|
+
.strand-overline {
|
|
2620
|
+
font-family: var(--strand-font-mono);
|
|
2621
|
+
font-size: var(--strand-text-xs);
|
|
2622
|
+
font-weight: var(--strand-weight-medium);
|
|
2623
|
+
letter-spacing: var(--strand-tracking-ultra);
|
|
2624
|
+
text-transform: uppercase;
|
|
2625
|
+
color: var(--strand-gray-500);
|
|
2626
|
+
line-height: var(--strand-leading-normal);
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
/* ── Headline (display heading, DL Part IV.5) ── */
|
|
2630
|
+
.strand-headline {
|
|
2631
|
+
font-family: var(--strand-font-mono);
|
|
2632
|
+
font-weight: var(--strand-weight-light);
|
|
2633
|
+
letter-spacing: var(--strand-tracking-widest);
|
|
2634
|
+
text-transform: uppercase;
|
|
2635
|
+
color: var(--strand-blue-midnight);
|
|
2636
|
+
line-height: var(--strand-leading-tight);
|
|
2637
|
+
}
|
|
2638
|
+
|
|
2639
|
+
.strand-headline--xl {
|
|
2640
|
+
font-size: clamp(2.5rem, 5vw + 1rem, 5rem);
|
|
2641
|
+
letter-spacing: 0.35em;
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
.strand-headline--lg {
|
|
2645
|
+
font-size: clamp(1.5rem, 3vw + 0.5rem, 2.5rem);
|
|
2646
|
+
letter-spacing: var(--strand-tracking-tighter);
|
|
2647
|
+
}
|
|
2648
|
+
|
|
2649
|
+
/* ── Lead (intro paragraph, DL Part IV.6) ── */
|
|
2650
|
+
.strand-lead {
|
|
2651
|
+
font-size: var(--strand-text-lg);
|
|
2652
|
+
color: var(--strand-gray-500);
|
|
2653
|
+
max-width: 50ch;
|
|
2654
|
+
line-height: var(--strand-leading-relaxed);
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2657
|
+
/* ── Secondary text (caption/description, DL Part III.8 Color Roles) ── */
|
|
2658
|
+
.strand-text-secondary {
|
|
2659
|
+
font-size: var(--strand-text-sm);
|
|
2660
|
+
color: var(--strand-gray-500);
|
|
2661
|
+
line-height: var(--strand-leading-relaxed);
|
|
2662
|
+
}
|
|
2663
|
+
|
|
2664
|
+
.strand-text-secondary--xs {
|
|
2665
|
+
font-size: var(--strand-text-xs);
|
|
2666
|
+
}
|
|
2667
|
+
|
|
2611
2668
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dillingerstaffing/strand-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Strand UI - Preact/React component library built on the Strand Design Language",
|
|
5
5
|
"author": "Dillinger Staffing <engineering@dillingerstaffing.com> (https://dillingerstaffing.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@dillingerstaffing/strand": "^0.
|
|
63
|
+
"@dillingerstaffing/strand": "^0.9.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@testing-library/preact": "^3.2.0",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
/* ── Variants ── */
|
|
14
14
|
.strand-card--elevated {
|
|
15
|
+
border: 1px solid var(--strand-border-subtle);
|
|
15
16
|
box-shadow: var(--strand-elevation-1);
|
|
16
17
|
}
|
|
17
18
|
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
.strand-card--interactive {
|
|
25
|
+
border: 1px solid var(--strand-border-subtle);
|
|
24
26
|
box-shadow: var(--strand-elevation-1);
|
|
25
27
|
cursor: pointer;
|
|
26
28
|
transition:
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
line-height: var(--strand-leading-relaxed);
|
|
25
25
|
color: var(--strand-blue-midnight);
|
|
26
26
|
background: var(--strand-surface-recessed);
|
|
27
|
-
box-shadow:
|
|
27
|
+
box-shadow: var(--strand-shadow-inset);
|
|
28
28
|
border-radius: var(--strand-radius-lg);
|
|
29
29
|
padding: var(--strand-space-3) var(--strand-space-4);
|
|
30
30
|
overflow-x: auto;
|
|
@@ -12,11 +12,16 @@
|
|
|
12
12
|
min-width: 0;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
/* ──
|
|
15
|
+
/* ── Fixed column utilities ── */
|
|
16
16
|
.strand-grid--cols-2 { grid-template-columns: repeat(2, 1fr); }
|
|
17
17
|
.strand-grid--cols-3 { grid-template-columns: repeat(3, 1fr); }
|
|
18
18
|
.strand-grid--cols-4 { grid-template-columns: repeat(4, 1fr); }
|
|
19
19
|
|
|
20
|
+
/* ── Responsive auto-fit (columns adjust to available width) ── */
|
|
21
|
+
.strand-grid--auto-sm { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
|
|
22
|
+
.strand-grid--auto-md { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
|
|
23
|
+
.strand-grid--auto-lg { grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); }
|
|
24
|
+
|
|
20
25
|
/* ── Gap utilities ── */
|
|
21
26
|
.strand-grid--gap-1 { gap: var(--strand-space-1); }
|
|
22
27
|
.strand-grid--gap-2 { gap: var(--strand-space-2); }
|
package/src/static.css
CHANGED
|
@@ -41,7 +41,57 @@
|
|
|
41
41
|
|
|
42
42
|
.strand-viewport {
|
|
43
43
|
background: var(--strand-surface-recessed);
|
|
44
|
-
box-shadow: inset
|
|
44
|
+
box-shadow: var(--strand-shadow-inset);
|
|
45
45
|
border-radius: var(--strand-radius-lg);
|
|
46
46
|
padding: var(--strand-space-6);
|
|
47
47
|
}
|
|
48
|
+
|
|
49
|
+
/* ── Overline (specimen label pattern, DL Part IV.5) ── */
|
|
50
|
+
.strand-overline {
|
|
51
|
+
font-family: var(--strand-font-mono);
|
|
52
|
+
font-size: var(--strand-text-xs);
|
|
53
|
+
font-weight: var(--strand-weight-medium);
|
|
54
|
+
letter-spacing: var(--strand-tracking-ultra);
|
|
55
|
+
text-transform: uppercase;
|
|
56
|
+
color: var(--strand-gray-500);
|
|
57
|
+
line-height: var(--strand-leading-normal);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* ── Headline (display heading, DL Part IV.5) ── */
|
|
61
|
+
.strand-headline {
|
|
62
|
+
font-family: var(--strand-font-mono);
|
|
63
|
+
font-weight: var(--strand-weight-light);
|
|
64
|
+
letter-spacing: var(--strand-tracking-widest);
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
color: var(--strand-blue-midnight);
|
|
67
|
+
line-height: var(--strand-leading-tight);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.strand-headline--xl {
|
|
71
|
+
font-size: clamp(2.5rem, 5vw + 1rem, 5rem);
|
|
72
|
+
letter-spacing: 0.35em;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.strand-headline--lg {
|
|
76
|
+
font-size: clamp(1.5rem, 3vw + 0.5rem, 2.5rem);
|
|
77
|
+
letter-spacing: var(--strand-tracking-tighter);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* ── Lead (intro paragraph, DL Part IV.6) ── */
|
|
81
|
+
.strand-lead {
|
|
82
|
+
font-size: var(--strand-text-lg);
|
|
83
|
+
color: var(--strand-gray-500);
|
|
84
|
+
max-width: 50ch;
|
|
85
|
+
line-height: var(--strand-leading-relaxed);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ── Secondary text (caption/description, DL Part III.8 Color Roles) ── */
|
|
89
|
+
.strand-text-secondary {
|
|
90
|
+
font-size: var(--strand-text-sm);
|
|
91
|
+
color: var(--strand-gray-500);
|
|
92
|
+
line-height: var(--strand-leading-relaxed);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.strand-text-secondary--xs {
|
|
96
|
+
font-size: var(--strand-text-xs);
|
|
97
|
+
}
|