@dillingerstaffing/strand-ui 0.9.0 → 0.10.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 +108 -1
- package/dist/css/strand-ui.css +157 -0
- package/package.json +2 -2
- package/src/static.css +157 -0
package/HTML_REFERENCE.md
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
> **Principle 1 (Cognitive Economy):** Every element must earn its place. Test: remove an element. If the task still works, it was decoration. If you're not adding back 10% of what you delete, you're not deleting enough. See [DL L61-69](./DESIGN_LANGUAGE.md#L61).
|
|
10
10
|
|
|
11
|
-
> **Principle 2 (Biosynthetic Restraint):** Max 12 distinct visual elements per screen. See [DL L71-
|
|
11
|
+
> **Principle 2 (Biosynthetic Restraint):** Max 12 distinct visual elements per screen. Every composition must have exactly one visually dominant primary element. If all elements have equal visual weight, the composition has no focal point. An instrument without a focal point is a parts bin, not an instrument. See [DL L71-84](./DESIGN_LANGUAGE.md#L71).
|
|
12
|
+
|
|
13
|
+
> **Principle 9 (Typography Carries the Room):** The largest text and smallest text on the same screen must have at least a 3:1 size ratio. Uniform typography is a spreadsheet. Hierarchical typography is an instrument panel. See [DL L165-178](./DESIGN_LANGUAGE.md#L165).
|
|
12
14
|
|
|
13
15
|
## Required CSS
|
|
14
16
|
|
|
@@ -265,6 +267,8 @@ All container components (Grid, Stack, Card, Container) enforce boundary integri
|
|
|
265
267
|
|
|
266
268
|
> **Elevation:** Cards at rest use Level 1 shadow. On hover, Level 2. See [DESIGN_LANGUAGE.md Principle 5: Earned Elevation (L114-L125)](./DESIGN_LANGUAGE.md#L114) and [7.2: Container Elevation Contexts (L698-L708)](./DESIGN_LANGUAGE.md#L698).
|
|
267
269
|
|
|
270
|
+
> **Cards are instrument panels, not generic containers.** Before placing multiple cards in a layout, apply [Principle 2 hierarchy test (L71-84)](./DESIGN_LANGUAGE.md#L71): which card is the primary instrument? It should be visually dominant. Apply [Principle 10 (L171-196)](./DESIGN_LANGUAGE.md#L171): describe the layout in laboratory vocabulary. If it sounds generic, redesign.
|
|
271
|
+
|
|
268
272
|
---
|
|
269
273
|
|
|
270
274
|
### Badge
|
|
@@ -407,6 +411,8 @@ All container components (Grid, Stack, Card, Container) enforce boundary integri
|
|
|
407
411
|
|
|
408
412
|
> **The DataReadout pattern** is uniquely Strand: monospace overline + large light-weight value + tabular numerals. See [DESIGN_LANGUAGE.md 11.2: Data Display (L918-L955)](./DESIGN_LANGUAGE.md#L918).
|
|
409
413
|
|
|
414
|
+
> **DataReadout has three sizes for hierarchy, not preference.** Use ONE default or lg readout as the primary focal point, with sm readouts as supporting secondaries. If all readouts on a screen are the same size, apply [Principle 2 hierarchy test (L71-84)](./DESIGN_LANGUAGE.md#L71) and [Principle 9 contrast ratio test (L165-178)](./DESIGN_LANGUAGE.md#L165).
|
|
415
|
+
|
|
410
416
|
---
|
|
411
417
|
|
|
412
418
|
### CodeBlock
|
|
@@ -429,6 +435,10 @@ All container components (Grid, Stack, Card, Container) enforce boundary integri
|
|
|
429
435
|
|
|
430
436
|
> **Spacing rules:** 4px base unit, padding tiers, and the gap > padding hierarchy: [DESIGN_LANGUAGE.md Part V: Spacing (L410-L496)](./DESIGN_LANGUAGE.md#L410). Responsive breakpoints and container system: [Part X: Layout (L829-L877)](./DESIGN_LANGUAGE.md#L829).
|
|
431
437
|
|
|
438
|
+
> **Before composing a layout, apply [Principle 2 (L71-84)](./DESIGN_LANGUAGE.md#L71) and [Principle 10 (L171-196)](./DESIGN_LANGUAGE.md#L171).** Identify the primary element. Describe the layout in laboratory vocabulary. If the description sounds generic ("a grid of data cards"), the composition doesn't embody the DL. An analytical readout panel has one dominant readout and supporting secondaries -- not four equal panels.
|
|
439
|
+
|
|
440
|
+
> **Before sizing text, apply [Principle 9 (L165-178)](./DESIGN_LANGUAGE.md#L165).** Largest to smallest text on the same screen must be at least 3:1. If all text is the same size, the typography is uniform. Uniform typography is a spreadsheet, not an instrument panel.
|
|
441
|
+
|
|
432
442
|
### Stack
|
|
433
443
|
|
|
434
444
|
```html
|
|
@@ -876,3 +886,100 @@ Intro paragraph. Max 50 characters per line. Used after headlines.
|
|
|
876
886
|
Caption/description text. text-sm, gray-500, relaxed leading. The `--xs` modifier reduces to text-xs for metadata and fine print.
|
|
877
887
|
|
|
878
888
|
> **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.
|
|
889
|
+
|
|
890
|
+
---
|
|
891
|
+
|
|
892
|
+
## Composition Molecules
|
|
893
|
+
|
|
894
|
+
Named CSS classes for common compositions. Each implements one or more productions from the [DL Composition Grammar (Part XI-B)](./DESIGN_LANGUAGE.md#L1085).
|
|
895
|
+
|
|
896
|
+
> **Composition rules:** [DL 11.10 Productions](./DESIGN_LANGUAGE.md#L1144) | [DL 11.11 Containment](./DESIGN_LANGUAGE.md#L1199) | [DL 11.12 Derivation](./DESIGN_LANGUAGE.md#L1215) | [DL 11.13 Tests](./DESIGN_LANGUAGE.md#L1246)
|
|
897
|
+
|
|
898
|
+
### Card Section
|
|
899
|
+
|
|
900
|
+
Production: `section-boundary`.
|
|
901
|
+
|
|
902
|
+
```html
|
|
903
|
+
<div class="strand-card strand-card--elevated strand-card--pad-md">
|
|
904
|
+
<div class="strand-card-section">
|
|
905
|
+
<span class="strand-overline">Section Label</span>
|
|
906
|
+
</div>
|
|
907
|
+
<!-- section content -->
|
|
908
|
+
</div>
|
|
909
|
+
```
|
|
910
|
+
|
|
911
|
+
Multiple sections stack. Last section omits trailing border via `:last-child`.
|
|
912
|
+
|
|
913
|
+
### Key-Value Row
|
|
914
|
+
|
|
915
|
+
Productions: `inline-pair` + `ranked-sequence`.
|
|
916
|
+
|
|
917
|
+
```html
|
|
918
|
+
<div class="strand-kv">
|
|
919
|
+
<span class="strand-kv__label">Blend</span>
|
|
920
|
+
<span class="strand-kv__value">Ethiopian Yirgacheffe</span>
|
|
921
|
+
</div>
|
|
922
|
+
<div class="strand-kv">
|
|
923
|
+
<span class="strand-kv__label">Status</span>
|
|
924
|
+
<span class="strand-kv__value strand-kv__value--status">Active</span>
|
|
925
|
+
</div>
|
|
926
|
+
```
|
|
927
|
+
|
|
928
|
+
**Modifier:** `strand-kv__value--status` applies semantic color.
|
|
929
|
+
|
|
930
|
+
### Diagnostic Log Entry
|
|
931
|
+
|
|
932
|
+
Productions: `inline-sequence` + `ranked-sequence`.
|
|
933
|
+
|
|
934
|
+
```html
|
|
935
|
+
<div class="strand-log">
|
|
936
|
+
<span class="strand-log__time">9:15</span>
|
|
937
|
+
<span class="strand-log__status strand-log__status--complete">Brewed</span>
|
|
938
|
+
<span class="strand-text-secondary">Pour over. 18g.</span>
|
|
939
|
+
</div>
|
|
940
|
+
<div class="strand-log">
|
|
941
|
+
<span class="strand-log__time">6:30</span>
|
|
942
|
+
<span class="strand-log__status strand-log__status--process">Brewing</span>
|
|
943
|
+
<span class="strand-text-secondary">Espresso. 18g.</span>
|
|
944
|
+
</div>
|
|
945
|
+
```
|
|
946
|
+
|
|
947
|
+
**Status variants:** `--complete` (teal) | `--process` (blue) | `--warning` (amber) | `--error` (red)
|
|
948
|
+
|
|
949
|
+
### Metric Row
|
|
950
|
+
|
|
951
|
+
Production: `centered-group`.
|
|
952
|
+
|
|
953
|
+
```html
|
|
954
|
+
<div class="strand-metric-row">
|
|
955
|
+
<div class="strand-data-readout strand-data-readout--sm">
|
|
956
|
+
<span class="strand-data-readout__label">Daily</span>
|
|
957
|
+
<span class="strand-data-readout__value">36g</span>
|
|
958
|
+
</div>
|
|
959
|
+
<div class="strand-data-readout strand-data-readout--sm">
|
|
960
|
+
<span class="strand-data-readout__label">Days Left</span>
|
|
961
|
+
<span class="strand-data-readout__value">7.9</span>
|
|
962
|
+
</div>
|
|
963
|
+
</div>
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
### Bar Chart
|
|
967
|
+
|
|
968
|
+
Production: `column-array`.
|
|
969
|
+
|
|
970
|
+
```html
|
|
971
|
+
<div class="strand-bar-chart">
|
|
972
|
+
<div class="strand-bar-chart__col">
|
|
973
|
+
<span class="strand-bar-chart__amount">284</span>
|
|
974
|
+
<div class="strand-bar-chart__bar" style="height: 100%"></div>
|
|
975
|
+
<span class="strand-bar-chart__label">Thu</span>
|
|
976
|
+
</div>
|
|
977
|
+
<div class="strand-bar-chart__col">
|
|
978
|
+
<span class="strand-bar-chart__amount">248</span>
|
|
979
|
+
<div class="strand-bar-chart__bar" style="height: 87%"></div>
|
|
980
|
+
<span class="strand-bar-chart__label">Fri</span>
|
|
981
|
+
</div>
|
|
982
|
+
</div>
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
Heights are inline styles (data-driven). Place inside `.strand-instrument-viewport` for dual-surface treatment.
|
package/dist/css/strand-ui.css
CHANGED
|
@@ -2646,6 +2646,16 @@
|
|
|
2646
2646
|
letter-spacing: var(--strand-tracking-tighter);
|
|
2647
2647
|
}
|
|
2648
2648
|
|
|
2649
|
+
/* ── Title (human voice display, DL Part IV.7) ── */
|
|
2650
|
+
.strand-title {
|
|
2651
|
+
font-family: var(--strand-font-sans);
|
|
2652
|
+
font-weight: var(--strand-weight-light);
|
|
2653
|
+
letter-spacing: var(--strand-tracking-tighter);
|
|
2654
|
+
color: var(--strand-blue-midnight);
|
|
2655
|
+
font-size: clamp(1.5rem, 3vw + 0.5rem, 2.5rem);
|
|
2656
|
+
line-height: var(--strand-leading-snug);
|
|
2657
|
+
}
|
|
2658
|
+
|
|
2649
2659
|
/* ── Lead (intro paragraph, DL Part IV.6) ── */
|
|
2650
2660
|
.strand-lead {
|
|
2651
2661
|
font-size: var(--strand-text-lg);
|
|
@@ -2665,4 +2675,151 @@
|
|
|
2665
2675
|
font-size: var(--strand-text-xs);
|
|
2666
2676
|
}
|
|
2667
2677
|
|
|
2678
|
+
/* ══════════════════════════════════════════════════
|
|
2679
|
+
COMPOSITION MOLECULES (DL Part XI-B Grammar)
|
|
2680
|
+
Named derivations of DL composition primitives.
|
|
2681
|
+
Each molecule is a convenience class for a common
|
|
2682
|
+
derivation chain. See DL 11.10 Productions for the
|
|
2683
|
+
grammar rules; DL 11.12 Derivation for verification.
|
|
2684
|
+
══════════════════════════════════════════════════ */
|
|
2685
|
+
|
|
2686
|
+
/* ── Card Section ──
|
|
2687
|
+
Derivation: section-boundary production (DL 11.10).
|
|
2688
|
+
OVERLINE + border-bottom + margin-bottom + padding-bottom */
|
|
2689
|
+
.strand-card-section {
|
|
2690
|
+
margin-bottom: var(--strand-space-3);
|
|
2691
|
+
padding-bottom: var(--strand-space-2);
|
|
2692
|
+
border-bottom: 1px solid var(--strand-gray-200);
|
|
2693
|
+
}
|
|
2694
|
+
|
|
2695
|
+
/* ── Key-Value Row ──
|
|
2696
|
+
Derivation: inline-pair + ranked-sequence (DL 11.10).
|
|
2697
|
+
identifier(OVERLINE) + quantifier(MONO_VALUE) + RANK_BORDER */
|
|
2698
|
+
.strand-kv {
|
|
2699
|
+
display: flex;
|
|
2700
|
+
justify-content: space-between;
|
|
2701
|
+
align-items: center;
|
|
2702
|
+
padding-block: var(--strand-space-2);
|
|
2703
|
+
}
|
|
2704
|
+
|
|
2705
|
+
.strand-kv + .strand-kv {
|
|
2706
|
+
border-top: 1px solid var(--strand-border-subtle);
|
|
2707
|
+
}
|
|
2708
|
+
|
|
2709
|
+
.strand-kv__label {
|
|
2710
|
+
font-family: var(--strand-font-mono);
|
|
2711
|
+
font-size: var(--strand-text-xs);
|
|
2712
|
+
font-weight: var(--strand-weight-medium);
|
|
2713
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
2714
|
+
text-transform: uppercase;
|
|
2715
|
+
color: var(--strand-gray-500);
|
|
2716
|
+
}
|
|
2717
|
+
|
|
2718
|
+
.strand-kv__value {
|
|
2719
|
+
font-family: var(--strand-font-mono);
|
|
2720
|
+
font-size: var(--strand-text-xs);
|
|
2721
|
+
color: var(--strand-gray-600);
|
|
2722
|
+
font-variant-numeric: tabular-nums;
|
|
2723
|
+
}
|
|
2724
|
+
|
|
2725
|
+
.strand-kv__value--status {
|
|
2726
|
+
color: var(--strand-teal-vital);
|
|
2727
|
+
}
|
|
2728
|
+
|
|
2729
|
+
/* ── Diagnostic Log Entry ──
|
|
2730
|
+
Derivation: inline-sequence + ranked-sequence (DL 11.10).
|
|
2731
|
+
time(OVERLINE) + status(OVERLINE+COLOR_SEMANTIC) + text(SECONDARY) + RANK_BORDER */
|
|
2732
|
+
.strand-log {
|
|
2733
|
+
display: flex;
|
|
2734
|
+
gap: var(--strand-space-3);
|
|
2735
|
+
padding-block: var(--strand-space-2);
|
|
2736
|
+
}
|
|
2737
|
+
|
|
2738
|
+
.strand-log + .strand-log {
|
|
2739
|
+
border-top: 1px solid var(--strand-border-subtle);
|
|
2740
|
+
}
|
|
2741
|
+
|
|
2742
|
+
.strand-log__time {
|
|
2743
|
+
font-family: var(--strand-font-mono);
|
|
2744
|
+
font-size: var(--strand-text-xs);
|
|
2745
|
+
font-weight: var(--strand-weight-medium);
|
|
2746
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
2747
|
+
text-transform: uppercase;
|
|
2748
|
+
color: var(--strand-gray-400);
|
|
2749
|
+
font-variant-numeric: tabular-nums;
|
|
2750
|
+
white-space: nowrap;
|
|
2751
|
+
}
|
|
2752
|
+
|
|
2753
|
+
.strand-log__status {
|
|
2754
|
+
font-family: var(--strand-font-mono);
|
|
2755
|
+
font-size: var(--strand-text-xs);
|
|
2756
|
+
font-weight: var(--strand-weight-semibold);
|
|
2757
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
2758
|
+
text-transform: uppercase;
|
|
2759
|
+
white-space: nowrap;
|
|
2760
|
+
}
|
|
2761
|
+
|
|
2762
|
+
.strand-log__status--complete { color: var(--strand-teal-vital); }
|
|
2763
|
+
.strand-log__status--process { color: var(--strand-blue-primary); }
|
|
2764
|
+
.strand-log__status--warning { color: var(--strand-amber-caution); }
|
|
2765
|
+
.strand-log__status--error { color: var(--strand-red-alert); }
|
|
2766
|
+
|
|
2767
|
+
/* ── Metric Row ──
|
|
2768
|
+
Derivation: centered-group (DL 11.10).
|
|
2769
|
+
self-contained(atom)* with center distribution + responsive gap */
|
|
2770
|
+
.strand-metric-row {
|
|
2771
|
+
display: flex;
|
|
2772
|
+
justify-content: center;
|
|
2773
|
+
gap: clamp(2rem, 5vw, 4rem);
|
|
2774
|
+
text-align: center;
|
|
2775
|
+
}
|
|
2776
|
+
|
|
2777
|
+
/* ── Bar Chart ──
|
|
2778
|
+
Derivation: column-array (DL 11.10).
|
|
2779
|
+
column(amount? + bar + label)* with equal flex + flex-end alignment.
|
|
2780
|
+
Blue Discipline: one color (--strand-blue-indicator). Part XIII viz rules. */
|
|
2781
|
+
.strand-bar-chart {
|
|
2782
|
+
display: flex;
|
|
2783
|
+
gap: var(--strand-space-2);
|
|
2784
|
+
align-items: flex-end;
|
|
2785
|
+
height: var(--strand-space-24);
|
|
2786
|
+
padding: var(--strand-space-5);
|
|
2787
|
+
}
|
|
2788
|
+
|
|
2789
|
+
.strand-bar-chart__col {
|
|
2790
|
+
flex: 1;
|
|
2791
|
+
display: flex;
|
|
2792
|
+
flex-direction: column;
|
|
2793
|
+
align-items: center;
|
|
2794
|
+
gap: var(--strand-space-1);
|
|
2795
|
+
height: 100%;
|
|
2796
|
+
justify-content: flex-end;
|
|
2797
|
+
}
|
|
2798
|
+
|
|
2799
|
+
.strand-bar-chart__bar {
|
|
2800
|
+
width: 100%;
|
|
2801
|
+
background: var(--strand-blue-indicator);
|
|
2802
|
+
border-radius: var(--strand-radius-sm) var(--strand-radius-sm) 0 0;
|
|
2803
|
+
min-height: var(--strand-space-1);
|
|
2804
|
+
}
|
|
2805
|
+
|
|
2806
|
+
.strand-bar-chart__amount {
|
|
2807
|
+
font-family: var(--strand-font-mono);
|
|
2808
|
+
font-size: var(--strand-text-xs);
|
|
2809
|
+
font-weight: var(--strand-weight-medium);
|
|
2810
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
2811
|
+
text-transform: uppercase;
|
|
2812
|
+
color: var(--strand-gray-300);
|
|
2813
|
+
font-variant-numeric: tabular-nums;
|
|
2814
|
+
}
|
|
2815
|
+
|
|
2816
|
+
.strand-bar-chart__label {
|
|
2817
|
+
font-family: var(--strand-font-mono);
|
|
2818
|
+
font-size: var(--strand-text-xs);
|
|
2819
|
+
font-weight: var(--strand-weight-medium);
|
|
2820
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
2821
|
+
text-transform: uppercase;
|
|
2822
|
+
color: var(--strand-gray-400);
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2668
2825
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dillingerstaffing/strand-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.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.10.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
66
|
"@testing-library/preact": "^3.2.0",
|
package/src/static.css
CHANGED
|
@@ -77,6 +77,16 @@
|
|
|
77
77
|
letter-spacing: var(--strand-tracking-tighter);
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/* ── Title (human voice display, DL Part IV.7) ── */
|
|
81
|
+
.strand-title {
|
|
82
|
+
font-family: var(--strand-font-sans);
|
|
83
|
+
font-weight: var(--strand-weight-light);
|
|
84
|
+
letter-spacing: var(--strand-tracking-tighter);
|
|
85
|
+
color: var(--strand-blue-midnight);
|
|
86
|
+
font-size: clamp(1.5rem, 3vw + 0.5rem, 2.5rem);
|
|
87
|
+
line-height: var(--strand-leading-snug);
|
|
88
|
+
}
|
|
89
|
+
|
|
80
90
|
/* ── Lead (intro paragraph, DL Part IV.6) ── */
|
|
81
91
|
.strand-lead {
|
|
82
92
|
font-size: var(--strand-text-lg);
|
|
@@ -95,3 +105,150 @@
|
|
|
95
105
|
.strand-text-secondary--xs {
|
|
96
106
|
font-size: var(--strand-text-xs);
|
|
97
107
|
}
|
|
108
|
+
|
|
109
|
+
/* ══════════════════════════════════════════════════
|
|
110
|
+
COMPOSITION MOLECULES (DL Part XI-B Grammar)
|
|
111
|
+
Named derivations of DL composition primitives.
|
|
112
|
+
Each molecule is a convenience class for a common
|
|
113
|
+
derivation chain. See DL 11.10 Productions for the
|
|
114
|
+
grammar rules; DL 11.12 Derivation for verification.
|
|
115
|
+
══════════════════════════════════════════════════ */
|
|
116
|
+
|
|
117
|
+
/* ── Card Section ──
|
|
118
|
+
Derivation: section-boundary production (DL 11.10).
|
|
119
|
+
OVERLINE + border-bottom + margin-bottom + padding-bottom */
|
|
120
|
+
.strand-card-section {
|
|
121
|
+
margin-bottom: var(--strand-space-3);
|
|
122
|
+
padding-bottom: var(--strand-space-2);
|
|
123
|
+
border-bottom: 1px solid var(--strand-gray-200);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* ── Key-Value Row ──
|
|
127
|
+
Derivation: inline-pair + ranked-sequence (DL 11.10).
|
|
128
|
+
identifier(OVERLINE) + quantifier(MONO_VALUE) + RANK_BORDER */
|
|
129
|
+
.strand-kv {
|
|
130
|
+
display: flex;
|
|
131
|
+
justify-content: space-between;
|
|
132
|
+
align-items: center;
|
|
133
|
+
padding-block: var(--strand-space-2);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.strand-kv + .strand-kv {
|
|
137
|
+
border-top: 1px solid var(--strand-border-subtle);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.strand-kv__label {
|
|
141
|
+
font-family: var(--strand-font-mono);
|
|
142
|
+
font-size: var(--strand-text-xs);
|
|
143
|
+
font-weight: var(--strand-weight-medium);
|
|
144
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
145
|
+
text-transform: uppercase;
|
|
146
|
+
color: var(--strand-gray-500);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.strand-kv__value {
|
|
150
|
+
font-family: var(--strand-font-mono);
|
|
151
|
+
font-size: var(--strand-text-xs);
|
|
152
|
+
color: var(--strand-gray-600);
|
|
153
|
+
font-variant-numeric: tabular-nums;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.strand-kv__value--status {
|
|
157
|
+
color: var(--strand-teal-vital);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ── Diagnostic Log Entry ──
|
|
161
|
+
Derivation: inline-sequence + ranked-sequence (DL 11.10).
|
|
162
|
+
time(OVERLINE) + status(OVERLINE+COLOR_SEMANTIC) + text(SECONDARY) + RANK_BORDER */
|
|
163
|
+
.strand-log {
|
|
164
|
+
display: flex;
|
|
165
|
+
gap: var(--strand-space-3);
|
|
166
|
+
padding-block: var(--strand-space-2);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.strand-log + .strand-log {
|
|
170
|
+
border-top: 1px solid var(--strand-border-subtle);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.strand-log__time {
|
|
174
|
+
font-family: var(--strand-font-mono);
|
|
175
|
+
font-size: var(--strand-text-xs);
|
|
176
|
+
font-weight: var(--strand-weight-medium);
|
|
177
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
178
|
+
text-transform: uppercase;
|
|
179
|
+
color: var(--strand-gray-400);
|
|
180
|
+
font-variant-numeric: tabular-nums;
|
|
181
|
+
white-space: nowrap;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.strand-log__status {
|
|
185
|
+
font-family: var(--strand-font-mono);
|
|
186
|
+
font-size: var(--strand-text-xs);
|
|
187
|
+
font-weight: var(--strand-weight-semibold);
|
|
188
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
189
|
+
text-transform: uppercase;
|
|
190
|
+
white-space: nowrap;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.strand-log__status--complete { color: var(--strand-teal-vital); }
|
|
194
|
+
.strand-log__status--process { color: var(--strand-blue-primary); }
|
|
195
|
+
.strand-log__status--warning { color: var(--strand-amber-caution); }
|
|
196
|
+
.strand-log__status--error { color: var(--strand-red-alert); }
|
|
197
|
+
|
|
198
|
+
/* ── Metric Row ──
|
|
199
|
+
Derivation: centered-group (DL 11.10).
|
|
200
|
+
self-contained(atom)* with center distribution + responsive gap */
|
|
201
|
+
.strand-metric-row {
|
|
202
|
+
display: flex;
|
|
203
|
+
justify-content: center;
|
|
204
|
+
gap: clamp(2rem, 5vw, 4rem);
|
|
205
|
+
text-align: center;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* ── Bar Chart ──
|
|
209
|
+
Derivation: column-array (DL 11.10).
|
|
210
|
+
column(amount? + bar + label)* with equal flex + flex-end alignment.
|
|
211
|
+
Blue Discipline: one color (--strand-blue-indicator). Part XIII viz rules. */
|
|
212
|
+
.strand-bar-chart {
|
|
213
|
+
display: flex;
|
|
214
|
+
gap: var(--strand-space-2);
|
|
215
|
+
align-items: flex-end;
|
|
216
|
+
height: var(--strand-space-24);
|
|
217
|
+
padding: var(--strand-space-5);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.strand-bar-chart__col {
|
|
221
|
+
flex: 1;
|
|
222
|
+
display: flex;
|
|
223
|
+
flex-direction: column;
|
|
224
|
+
align-items: center;
|
|
225
|
+
gap: var(--strand-space-1);
|
|
226
|
+
height: 100%;
|
|
227
|
+
justify-content: flex-end;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.strand-bar-chart__bar {
|
|
231
|
+
width: 100%;
|
|
232
|
+
background: var(--strand-blue-indicator);
|
|
233
|
+
border-radius: var(--strand-radius-sm) var(--strand-radius-sm) 0 0;
|
|
234
|
+
min-height: var(--strand-space-1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.strand-bar-chart__amount {
|
|
238
|
+
font-family: var(--strand-font-mono);
|
|
239
|
+
font-size: var(--strand-text-xs);
|
|
240
|
+
font-weight: var(--strand-weight-medium);
|
|
241
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
242
|
+
text-transform: uppercase;
|
|
243
|
+
color: var(--strand-gray-300);
|
|
244
|
+
font-variant-numeric: tabular-nums;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.strand-bar-chart__label {
|
|
248
|
+
font-family: var(--strand-font-mono);
|
|
249
|
+
font-size: var(--strand-text-xs);
|
|
250
|
+
font-weight: var(--strand-weight-medium);
|
|
251
|
+
letter-spacing: var(--strand-tracking-wider);
|
|
252
|
+
text-transform: uppercase;
|
|
253
|
+
color: var(--strand-gray-400);
|
|
254
|
+
}
|