@livenetworks/ashlar 2.0.7 → 2.0.9
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/LICENSE +641 -641
- package/components/COMPONENTS.md +1116 -1116
- package/components/index.js +81 -81
- package/components/ln-accordion/ln-accordion-dev.scss +8 -8
- package/components/ln-accordion/ln-accordion.js +1 -1
- package/components/ln-accordion/ln-accordion.schema.json +30 -30
- package/components/ln-ajax/ln-ajax-dev.scss +8 -8
- package/components/ln-ajax/ln-ajax.js +1 -1
- package/components/ln-ajax/ln-ajax.schema.json +30 -30
- package/components/ln-api-connector/ln-api-connector.js +1 -1
- package/components/ln-api-connector/ln-api-connector.schema.json +9 -0
- package/components/ln-api-connector/src/ln-api-connector.js +2 -0
- package/components/ln-api-queue/ln-api-queue.js +1 -1
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -34
- package/components/ln-api-queue/src/ln-api-queue.js +3 -13
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -8
- package/components/ln-autoresize/ln-autoresize.js +1 -1
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -22
- package/components/ln-autosave/ln-autosave-dev.scss +13 -13
- package/components/ln-autosave/ln-autosave.js +1 -1
- package/components/ln-autosave/ln-autosave.schema.json +48 -48
- package/components/ln-autosave/src/autosave-model.js +34 -34
- package/components/ln-chart/ln-chart.js +1 -1
- package/components/ln-chart/ln-chart.schema.json +146 -146
- package/components/ln-chart/src/chart-model.js +154 -154
- package/components/ln-circular-progress/ln-circular-progress.js +1 -1
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -42
- package/components/ln-confirm/ln-confirm-dev.scss +24 -24
- package/components/ln-confirm/ln-confirm.js +1 -1
- package/components/ln-confirm/ln-confirm.schema.json +66 -66
- package/components/ln-confirm/src/ln-confirm.js +178 -178
- package/components/ln-core/attrs.js +13 -0
- package/components/ln-core/crypto.js +286 -265
- package/components/ln-core/dom.js +115 -115
- package/components/ln-core/form.js +146 -136
- package/components/ln-core/helpers.js +33 -33
- package/components/ln-core/http.js +48 -48
- package/components/ln-core/index.js +1 -1
- package/components/ln-core/lifecycle.js +5 -0
- package/components/ln-core/ln-core.schema.json +3 -2
- package/components/ln-core/locale.js +55 -55
- package/components/ln-core/matching.js +78 -78
- package/components/ln-core/number.js +125 -125
- package/components/ln-core/template.js +206 -206
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -50
- package/components/ln-couchdb-connector/src/ln-couchdb-connector.js +1 -0
- package/components/ln-data-coordinator/README.md +9 -38
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -8
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +16 -16
- package/components/ln-data-coordinator/src/data-read-policy.js +0 -7
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +432 -1308
- package/components/ln-data-store/ln-data-store-dev.scss +13 -13
- package/components/ln-data-store/ln-data-store.js +1 -1
- package/components/ln-data-store/ln-data-store.schema.json +84 -84
- package/components/ln-data-store/src/data-store-model.js +184 -184
- package/components/ln-data-store/src/ln-data-store.js +1 -1
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/ln-date.schema.json +92 -92
- package/components/ln-date/src/date-model.js +186 -186
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/console-sink.js +19 -19
- package/components/ln-debug/src/gate.js +95 -95
- package/components/ln-debug/src/generated-attributes.js +4 -2
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -13
- package/components/ln-dropdown/ln-dropdown.js +1 -1
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-editor/ln-editor.js +1 -1
- package/components/ln-editor/ln-editor.schema.json +58 -58
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +18 -18
- package/components/ln-fill/ln-fill.js +1 -1
- package/components/ln-fill/ln-fill.schema.json +23 -23
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +153 -153
- package/components/ln-filter/src/filter-model.js +185 -185
- package/components/ln-form/ln-form-dev.scss +8 -8
- package/components/ln-form/ln-form.js +1 -1
- package/components/ln-form/ln-form.schema.json +6 -0
- package/components/ln-form/src/ln-form.js +21 -0
- package/components/ln-http/ln-http.js +1 -1
- package/components/ln-http/ln-http.schema.json +6 -6
- package/components/ln-icon/ln-icon.schema.json +6 -6
- package/components/ln-include/ln-include.js +1 -1
- package/components/ln-include/ln-include.schema.json +23 -23
- package/components/ln-key/ln-key-dev.scss +18 -18
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +56 -56
- package/components/ln-key/src/ln-key.js +10 -10
- package/components/ln-link/ln-link-dev.scss +8 -8
- package/components/ln-link/ln-link.js +1 -1
- package/components/ln-link/ln-link.schema.json +22 -22
- package/components/ln-list/README.md +152 -152
- package/components/ln-list/ln-list-dev.scss +8 -8
- package/components/ln-list/ln-list.js +1 -1
- package/components/ln-list/ln-list.schema.json +166 -166
- package/components/ln-modal/ln-modal.js +1 -1
- package/components/ln-modal/ln-modal.schema.json +65 -65
- package/components/ln-nav/ln-nav.js +1 -1
- package/components/ln-nav/ln-nav.schema.json +25 -25
- package/components/ln-number/ln-number.js +1 -1
- package/components/ln-number/ln-number.schema.json +63 -63
- package/components/ln-number/src/ln-number.js +26 -0
- package/components/ln-number/src/number-model.js +31 -31
- package/components/ln-obfuscator/README.md +60 -60
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -49
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -159
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -250
- package/components/ln-options/ln-options.js +1 -1
- package/components/ln-options/ln-options.schema.json +6 -0
- package/components/ln-options/src/ln-options.js +4 -4
- package/components/ln-persist/README.md +151 -151
- package/components/ln-persist/ln-persist.js +1 -1
- package/components/ln-persist/ln-persist.schema.json +28 -28
- package/components/ln-persist/src/ln-persist.js +83 -83
- package/components/ln-picklist/README.md +230 -230
- package/components/ln-picklist/ln-picklist-dev.scss +22 -22
- package/components/ln-picklist/ln-picklist.js +1 -1
- package/components/ln-picklist/ln-picklist.schema.json +49 -49
- package/components/ln-picklist/src/ln-picklist.js +228 -228
- package/components/ln-popover/ln-popover-dev.scss +13 -13
- package/components/ln-popover/ln-popover.js +1 -1
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-progress/ln-progress-dev.scss +8 -8
- package/components/ln-progress/ln-progress.js +1 -1
- package/components/ln-progress/ln-progress.schema.json +40 -40
- package/components/ln-router/ln-router.js +1 -1
- package/components/ln-router/ln-router.schema.json +76 -76
- package/components/ln-scroll/README.md +45 -45
- package/components/ln-scroll/ln-scroll.js +1 -1
- package/components/ln-scroll/ln-scroll.schema.json +85 -85
- package/components/ln-scroll/src/ln-scroll.js +150 -150
- package/components/ln-search/README.md +188 -188
- package/components/ln-search/ln-search.js +1 -1
- package/components/ln-search/ln-search.schema.json +103 -103
- package/components/ln-slug/ln-slug.js +1 -1
- package/components/ln-slug/ln-slug.schema.json +23 -23
- package/components/ln-slug/src/ln-slug.js +25 -1
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +104 -104
- package/components/ln-sort/src/ln-sort.js +321 -321
- package/components/ln-sort/src/sort-model.js +117 -117
- package/components/ln-sortable/ln-sortable-dev.scss +13 -13
- package/components/ln-sortable/ln-sortable.js +1 -1
- package/components/ln-sortable/ln-sortable.schema.json +36 -36
- package/components/ln-stat/ln-stat-dev.scss +8 -8
- package/components/ln-stat/ln-stat.js +1 -1
- package/components/ln-stat/ln-stat.schema.json +32 -32
- package/components/ln-stat/src/stat-model.js +28 -28
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +211 -211
- package/components/ln-table/src/table-model.js +98 -98
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -93
- package/components/ln-tabs/ln-tabs.js +1 -1
- package/components/ln-tabs/ln-tabs.schema.json +75 -75
- package/components/ln-tabs/src/ln-tabs.js +208 -208
- package/components/ln-tabs/src/tabs-model.js +82 -82
- package/components/ln-time/ln-time-dev.scss +13 -13
- package/components/ln-time/ln-time.js +1 -1
- package/components/ln-time/ln-time.schema.json +38 -38
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +65 -65
- package/components/ln-toggle/ln-toggle.js +1 -1
- package/components/ln-toggle/ln-toggle.schema.json +52 -52
- package/components/ln-tooltip/ln-tooltip.js +1 -1
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -86
- package/components/ln-translations/ln-translations.js +1 -1
- package/components/ln-translations/ln-translations.schema.json +120 -120
- package/components/ln-ui-coordinator/README.md +62 -62
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -1
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +28 -28
- package/components/ln-ui-coordinator/src/ln-ui-coordinator.js +140 -140
- package/components/ln-upload/ln-upload.js +1 -1
- package/components/ln-upload/ln-upload.schema.json +193 -193
- package/components/ln-upload/src/upload-model.js +78 -78
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +50 -50
- package/components/ln-validate/src/validate-model.js +64 -64
- package/components/ln-websocket-connector/README.md +166 -166
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -1
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -29
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +283 -279
- package/ln-ashlar.html-data.json +15 -8
- package/package.json +85 -84
- package/theme/brand.css +73 -73
- package/theme/components/_confirm.scss +6 -6
- package/theme/components/_picklist.scss +3 -3
- package/theme/config/_palette.scss +274 -274
- package/theme/config/_theme.scss +292 -292
- package/theme/config/_tokens.scss +285 -285
- package/theme/config/mixins/_index.scss +62 -62
- package/theme/config/mixins/_picklist.scss +66 -66
- package/theme/ln-ashlar-dev.scss +66 -66
- package/theme/ln-ashlar-landing.scss +56 -56
- package/theme/ln-ashlar-theme.scss +63 -63
- package/theme/presentation/_bento.scss +151 -151
- package/theme/presentation/_cta.scss +111 -111
- package/theme/presentation/_effects.scss +216 -216
- package/theme/presentation/_features.scss +108 -108
- package/theme/presentation/_footer.scss +129 -129
- package/theme/presentation/_hero.scss +158 -158
- package/theme/presentation/_layout.scss +170 -170
- package/theme/presentation/_navbar.scss +140 -140
- package/theme/presentation/_pricing.scss +262 -262
- package/theme/presentation/_stats.scss +87 -87
- package/theme/presentation/_testimonials.scss +124 -124
- package/theme/presentation/_tokens.scss +39 -39
- package/theme/presentation/_typography.scss +163 -163
- package/web-types.json +26 -12
|
@@ -1,285 +1,285 @@
|
|
|
1
|
-
@use 'mixins/breakpoints' as *;
|
|
2
|
-
|
|
3
|
-
// ==========================================================================
|
|
4
|
-
// Design Tokens — ln-ashlar
|
|
5
|
-
// ==========================================================================
|
|
6
|
-
// Single source of truth for theme-invariant design values (sizes, spacing,
|
|
7
|
-
// radii, typography scales, transitions, and z-index).
|
|
8
|
-
//
|
|
9
|
-
// Color and shadow values reside in `_palette.scss` and `_theme.scss`.
|
|
10
|
-
// ==========================================================================
|
|
11
|
-
|
|
12
|
-
:root {
|
|
13
|
-
|
|
14
|
-
// -----------------------------------------------------------------------
|
|
15
|
-
// Size scale — canonical spacing primitives
|
|
16
|
-
// -----------------------------------------------------------------------
|
|
17
|
-
// Public API surface — full scale exposed. All padding, margin, gap,
|
|
18
|
-
// inset, and positional-offset spacing references one of these steps.
|
|
19
|
-
// Intermediate steps use t-shirt + `-up` suffix.
|
|
20
|
-
//
|
|
21
|
-
// Mixin bodies read --size-* only when a logical token (--padding-x,
|
|
22
|
-
// --padding-y, --gap) is not semantically appropriate. Otherwise they
|
|
23
|
-
// read the logical token, which is re-bound under density / theme /
|
|
24
|
-
// region scopes (see Logical tokens block below).
|
|
25
|
-
// -----------------------------------------------------------------------
|
|
26
|
-
--size-0: 0;
|
|
27
|
-
--size-2xs: 0.125rem; // 2px
|
|
28
|
-
--size-xs: 0.25rem; // 4px
|
|
29
|
-
--size-xs-up: 0.375rem; // 6px
|
|
30
|
-
--size-sm: 0.5rem; // 8px
|
|
31
|
-
--size-sm-up: 0.75rem; // 12px
|
|
32
|
-
--size-md: 1rem; // 16px
|
|
33
|
-
--size-md-up: 1.25rem; // 20px
|
|
34
|
-
--size-lg: 1.5rem; // 24px
|
|
35
|
-
--size-xl: 2rem; // 32px
|
|
36
|
-
--size-2xl: 3rem; // 48px
|
|
37
|
-
--size-3xl: 4rem; // 64px
|
|
38
|
-
--size-4xl: 6rem;
|
|
39
|
-
--size-5xl: 8rem;
|
|
40
|
-
|
|
41
|
-
// -----------------------------------------------------------------------
|
|
42
|
-
// Border Width
|
|
43
|
-
// -----------------------------------------------------------------------
|
|
44
|
-
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
45
|
-
--border-width: 1px;
|
|
46
|
-
--border-width-strong: 2px;
|
|
47
|
-
|
|
48
|
-
// -----------------------------------------------------------------------
|
|
49
|
-
// Content widths
|
|
50
|
-
// -----------------------------------------------------------------------
|
|
51
|
-
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
52
|
-
--max-w-prose: 65ch;
|
|
53
|
-
--max-w-form: 32rem;
|
|
54
|
-
--max-w-content: 48rem;
|
|
55
|
-
--max-w-container: 80rem;
|
|
56
|
-
|
|
57
|
-
// -----------------------------------------------------------------------
|
|
58
|
-
// Border Radius
|
|
59
|
-
// -----------------------------------------------------------------------
|
|
60
|
-
--radius-none: 0;
|
|
61
|
-
--radius-xs: 0.125rem; // 2px
|
|
62
|
-
--radius-sm: 0.25rem; // 4px
|
|
63
|
-
--radius-md: 0.375rem; // 6px
|
|
64
|
-
--radius-lg: 0.5rem; // 8px
|
|
65
|
-
--radius-xl: 0.75rem; // 12px
|
|
66
|
-
--radius-2xl: 1rem; // 16px
|
|
67
|
-
--radius-full: 9999px;
|
|
68
|
-
|
|
69
|
-
// -----------------------------------------------------------------------
|
|
70
|
-
// Transitions — durations
|
|
71
|
-
// -----------------------------------------------------------------------
|
|
72
|
-
--transition-base: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
73
|
-
--transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
74
|
-
--transition-slow: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
75
|
-
|
|
76
|
-
// -----------------------------------------------------------------------
|
|
77
|
-
// Easings — curves only (no duration)
|
|
78
|
-
// -----------------------------------------------------------------------
|
|
79
|
-
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
80
|
-
--easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
81
|
-
--easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
|
|
82
|
-
--easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
|
|
83
|
-
--easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
84
|
-
|
|
85
|
-
// -----------------------------------------------------------------------
|
|
86
|
-
// Typography
|
|
87
|
-
// -----------------------------------------------------------------------
|
|
88
|
-
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
89
|
-
--font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace;
|
|
90
|
-
--font-features: "cv02", "cv03", "cv04", "cv11", "tnum";
|
|
91
|
-
|
|
92
|
-
--text-xs: 0.75rem; // 12px
|
|
93
|
-
--text-sm: 0.875rem; // 14px
|
|
94
|
-
--text-base: 1rem; // 16px
|
|
95
|
-
--text-lg: 1.125rem; // 18px
|
|
96
|
-
--text-xl: 1.25rem; // 20px
|
|
97
|
-
--text-2xl: 1.5rem; // 24px
|
|
98
|
-
|
|
99
|
-
// -----------------------------------------------------------------------
|
|
100
|
-
// Typography — semantic role tokens (v1.1) — VOCABULARY
|
|
101
|
-
// -----------------------------------------------------------------------
|
|
102
|
-
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
103
|
-
// Vocabulary: density + themes rebind these; mixins read the
|
|
104
|
-
// --font-size/--line-height primitives via @include typography(role),
|
|
105
|
-
// never these tokens directly.
|
|
106
|
-
--text-display-lg: 3.75rem; --lh-display-lg: 1.1;
|
|
107
|
-
--text-display-md: 3rem; --lh-display-md: 1.1;
|
|
108
|
-
--text-display-sm: 1.875rem; --lh-display-sm: 1.1;
|
|
109
|
-
|
|
110
|
-
--text-heading-lg: 1.75rem; --lh-heading-lg: 1.15;
|
|
111
|
-
--text-heading-md: 1.25rem; --lh-heading-md: 1.2;
|
|
112
|
-
--text-heading-sm: 1.125rem; --lh-heading-sm: 1.25;
|
|
113
|
-
|
|
114
|
-
--text-title-md: 1rem; --lh-title-md: 1.3;
|
|
115
|
-
--text-title-sm: 0.875rem; --lh-title-sm: 1.3;
|
|
116
|
-
|
|
117
|
-
--text-body-lg: 1.125rem; --lh-body-lg: 1.6;
|
|
118
|
-
--text-body-md: 0.875rem; --lh-body-md: 1.5; // 14px / 1.5 — DocuFlow body
|
|
119
|
-
--text-body-sm: 0.8125rem; --lh-body-sm: 1.45; // 13px
|
|
120
|
-
|
|
121
|
-
--text-label-md: 0.8125rem; --lh-label-md: 1.4; // 13px
|
|
122
|
-
--text-label-sm: 0.75rem; --lh-label-sm: 1.4;
|
|
123
|
-
|
|
124
|
-
--text-caption: 0.75rem; --lh-caption: 1.4;
|
|
125
|
-
|
|
126
|
-
// -----------------------------------------------------------------------
|
|
127
|
-
// Letter spacing (optical tracking scale)
|
|
128
|
-
// -----------------------------------------------------------------------
|
|
129
|
-
--tracking-tighter: -0.035em;
|
|
130
|
-
--tracking-tight: -0.02em;
|
|
131
|
-
--tracking-normal: 0;
|
|
132
|
-
--tracking-wide: 0.025em;
|
|
133
|
-
--tracking-wider: 0.05em;
|
|
134
|
-
|
|
135
|
-
--font-normal: 400;
|
|
136
|
-
--font-medium: 500;
|
|
137
|
-
--font-semibold: 600;
|
|
138
|
-
--font-bold: 700;
|
|
139
|
-
|
|
140
|
-
// -----------------------------------------------------------------------
|
|
141
|
-
// Z-Index Scale
|
|
142
|
-
// -----------------------------------------------------------------------
|
|
143
|
-
--z-sticky: 10;
|
|
144
|
-
--z-dropdown: 20;
|
|
145
|
-
--z-overlay: 30;
|
|
146
|
-
--z-modal: 40;
|
|
147
|
-
--z-toast: 50;
|
|
148
|
-
|
|
149
|
-
// -----------------------------------------------------------------------
|
|
150
|
-
// App shell — intrinsic dimensions (not spacing rhythm)
|
|
151
|
-
// -----------------------------------------------------------------------
|
|
152
|
-
--app-header-height: 3.25rem; // 52px — DocuFlow topbar height
|
|
153
|
-
--app-sidebar-width: 14.5rem; // 232px — DocuFlow sidebar width
|
|
154
|
-
|
|
155
|
-
// -----------------------------------------------------------------------
|
|
156
|
-
// Logical tokens — the public contract mixins read
|
|
157
|
-
// -----------------------------------------------------------------------
|
|
158
|
-
// Rule: mixin bodies reference ONLY these tokens. Typography mixins read
|
|
159
|
-
// --font-size/--line-height ONLY (via @include typography(role), which
|
|
160
|
-
// rebinds the primitive per role on the consuming element's scope).
|
|
161
|
-
// --text-*/--lh-* role scale is VOCABULARY: density + themes rebind it,
|
|
162
|
-
// mixins never read it directly. --radius-*/--shadow-*/--transition-*/
|
|
163
|
-
// --easing-* role scales remain directly readable (not yet primitived).
|
|
164
|
-
// Back-end scales (--size-*, --color-neutral-*) are re-bound here and in
|
|
165
|
-
// context scopes (density, theme, region overrides) — never read directly
|
|
166
|
-
// inside a component mixin.
|
|
167
|
-
//
|
|
168
|
-
// See .claude/plans/refactor-logical-tokens-architecture.md for the
|
|
169
|
-
// full contract.
|
|
170
|
-
// -----------------------------------------------------------------------
|
|
171
|
-
|
|
172
|
-
// -- Structure & rhythm -----------------------------------------------
|
|
173
|
-
--padding-x: var(--size-sm-up);
|
|
174
|
-
--padding-y: var(--size-xs-up); // 6px — dense base (DocuFlow 7px rounds to 6px)
|
|
175
|
-
--gap: var(--size-xs-up); // 6px — dense base
|
|
176
|
-
// --radius sits with the other primitives in _palette.scss. Declared here it
|
|
177
|
-
// would resolve once at <html> and inherit frozen through every theme island.
|
|
178
|
-
|
|
179
|
-
// Accent-wash strengths. Ratios, not colors — color-mix() stays at the
|
|
180
|
-
// declaration site so --color-accent / --color-bg resolve locally and the
|
|
181
|
-
// semantic-color cascade keeps working. Ladder taken from _dropdown.scss,
|
|
182
|
-
// the only component that had all three states.
|
|
183
|
-
--tint-hover: 7%;
|
|
184
|
-
--tint-selected: 12%;
|
|
185
|
-
--tint-active: 14%;
|
|
186
|
-
|
|
187
|
-
// Translucent accent surface — companions for themes that opt in to a
|
|
188
|
-
// non-solid accent button. NO defaults — `@mixin btn` reads these via
|
|
189
|
-
// fallback to `--color-accent` / `--color-accent-fg`, so the default
|
|
190
|
-
// theme stays solid + white.
|
|
191
|
-
//
|
|
192
|
-
// IMPORTANT — declare at theme :root ONLY when the value is a literal
|
|
193
|
-
// (no nested var(--color-primary)). If a theme needs the translucent
|
|
194
|
-
// fill computed FROM --color-primary, the rebind must happen at
|
|
195
|
-
// consumer scope (e.g. `[data-skin="..."] button[type="submit"], .btn
|
|
196
|
-
// { --btn-bg: ...; }`) so the nested var() resolves at the button —
|
|
197
|
-
// otherwise the .success/.error/.warning/.info status cascade breaks on
|
|
198
|
-
// elements using semantic-color overrides. Glass uses the consumer-scope
|
|
199
|
-
// pattern; see theme/config/_theme.scss.
|
|
200
|
-
// --color-accent-bg
|
|
201
|
-
// --color-accent-bg-hover
|
|
202
|
-
// --color-accent-bg-fg
|
|
203
|
-
|
|
204
|
-
// Nav surface — companions for themes that opt in to a bordered/inset
|
|
205
|
-
// nav appearance (e.g. Glass). NO defaults — `@mixin nav` reads these
|
|
206
|
-
// via fallback to no-op values (transparent border, zero bleed), so
|
|
207
|
-
// the default theme renders unchanged. Themes rebind at theme :root.
|
|
208
|
-
// --nav-link-border-color
|
|
209
|
-
// --nav-link-border-color-hover
|
|
210
|
-
// --nav-link-border-color-active
|
|
211
|
-
// --nav-list-bleed
|
|
212
|
-
|
|
213
|
-
// Button padding tokens
|
|
214
|
-
--btn-padding-x: var(--size-sm-up);
|
|
215
|
-
--btn-padding-y: var(--size-xs-up);
|
|
216
|
-
|
|
217
|
-
// -- Typography — primitives -----------------------------------------
|
|
218
|
-
// Mixins read these two primitives ONLY (via @include typography(role),
|
|
219
|
-
// which rebinds them per role on the consuming element's scope — mirror
|
|
220
|
-
// of how @mixin card rebinds --color-bg). The --text-{role}/--lh-{role}
|
|
221
|
-
// role scale (lines ~202-220) is VOCABULARY: density + themes rebind it,
|
|
222
|
-
// mixins never read it directly. These :root values are the default for
|
|
223
|
-
// text that does not pass through a typography mixin.
|
|
224
|
-
--font-size: var(--text-body-md);
|
|
225
|
-
--line-height: var(--lh-body-md);
|
|
226
|
-
|
|
227
|
-
// -- Motion & depth --------------------------------------------------
|
|
228
|
-
--transition: var(--transition-base);
|
|
229
|
-
|
|
230
|
-
// -- Per-side borders (SOFT — no default) ----------------------------
|
|
231
|
-
// --border-block-start, --border-block-end,
|
|
232
|
-
// --border-inline-start, --border-inline-end
|
|
233
|
-
//
|
|
234
|
-
// Read by structural mixins (card, section-card, floating-panel,
|
|
235
|
-
// stat-card, app-header, app-footer, accordion items, table cells,
|
|
236
|
-
// tab-nav, sidebar edges, page-header, etc.) with a per-mixin
|
|
237
|
-
// fallback. NOT defined here — that is intentional. A scope that
|
|
238
|
-
// re-binds e.g. `--border-block-start: none` flattens the top edge
|
|
239
|
-
// of the matched element so siblings can join with a shared rule.
|
|
240
|
-
//
|
|
241
|
-
// Joining example:
|
|
242
|
-
// .joined-stack > * + * { --border-block-start: none; }
|
|
243
|
-
|
|
244
|
-
// -- Margin (SOFT — no default) --------------------------------
|
|
245
|
-
// --margin-block, --margin-inline
|
|
246
|
-
//
|
|
247
|
-
// Read by structural rhythm rules (label-to-input gap, section
|
|
248
|
-
// margin, header→body separation, sibling stacking,
|
|
249
|
-
// element-pushing horizontal offsets) with a per-mixin rebind.
|
|
250
|
-
// NOT defined here — the value varies too widely across
|
|
251
|
-
// consumers for a single :root default to be useful. Each
|
|
252
|
-
// consumer rebinds locally:
|
|
253
|
-
//
|
|
254
|
-
// @mixin section {
|
|
255
|
-
// --margin-block: var(--size-xl);
|
|
256
|
-
// margin-bottom: var(--margin-block);
|
|
257
|
-
// }
|
|
258
|
-
//
|
|
259
|
-
// NOTE: [data-density] scopes rebind type roles, logical
|
|
260
|
-
// --padding-y/--gap, and control sizing — NOT the --size-* scale.
|
|
261
|
-
// So --margin-block (reading --size-*) is constant across density
|
|
262
|
-
// tiers for now; making structural margins reactive is a Phase 3 item.
|
|
263
|
-
//
|
|
264
|
-
// --margin-inline is the horizontal companion. Used for
|
|
265
|
-
// element-pushing structural offsets (icon→text gap inside a
|
|
266
|
-
// row, sibling element offsets). NOT for flex/grid sibling
|
|
267
|
-
// spacing — that is --gap.
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// ---------------------------------------------------------------------------
|
|
271
|
-
// Mobile rhythm — logical tokens tighten at ≤ md viewport.
|
|
272
|
-
// Not the same as `[data-density]` (that's a user opt-in).
|
|
273
|
-
// This is viewport-driven structural compression: content dominates chrome
|
|
274
|
-
// at narrow widths. Components reading --padding-x/--padding-y/--gap
|
|
275
|
-
// react via the cascade.
|
|
276
|
-
//
|
|
277
|
-
// Interaction with [data-density]: stacks. Compact density + mobile viewport =
|
|
278
|
-
// both apply; the underlying --padding-y tightens further from the mobile rebind.
|
|
279
|
-
// ---------------------------------------------------------------------------
|
|
280
|
-
@include mq-down(md) {
|
|
281
|
-
:root {
|
|
282
|
-
--padding-y: var(--size-xs); // 6px → 4px
|
|
283
|
-
--gap: var(--size-xs-up); // 6px → 6px (already tight)
|
|
284
|
-
}
|
|
285
|
-
}
|
|
1
|
+
@use 'mixins/breakpoints' as *;
|
|
2
|
+
|
|
3
|
+
// ==========================================================================
|
|
4
|
+
// Design Tokens — ln-ashlar
|
|
5
|
+
// ==========================================================================
|
|
6
|
+
// Single source of truth for theme-invariant design values (sizes, spacing,
|
|
7
|
+
// radii, typography scales, transitions, and z-index).
|
|
8
|
+
//
|
|
9
|
+
// Color and shadow values reside in `_palette.scss` and `_theme.scss`.
|
|
10
|
+
// ==========================================================================
|
|
11
|
+
|
|
12
|
+
:root {
|
|
13
|
+
|
|
14
|
+
// -----------------------------------------------------------------------
|
|
15
|
+
// Size scale — canonical spacing primitives
|
|
16
|
+
// -----------------------------------------------------------------------
|
|
17
|
+
// Public API surface — full scale exposed. All padding, margin, gap,
|
|
18
|
+
// inset, and positional-offset spacing references one of these steps.
|
|
19
|
+
// Intermediate steps use t-shirt + `-up` suffix.
|
|
20
|
+
//
|
|
21
|
+
// Mixin bodies read --size-* only when a logical token (--padding-x,
|
|
22
|
+
// --padding-y, --gap) is not semantically appropriate. Otherwise they
|
|
23
|
+
// read the logical token, which is re-bound under density / theme /
|
|
24
|
+
// region scopes (see Logical tokens block below).
|
|
25
|
+
// -----------------------------------------------------------------------
|
|
26
|
+
--size-0: 0;
|
|
27
|
+
--size-2xs: 0.125rem; // 2px
|
|
28
|
+
--size-xs: 0.25rem; // 4px
|
|
29
|
+
--size-xs-up: 0.375rem; // 6px
|
|
30
|
+
--size-sm: 0.5rem; // 8px
|
|
31
|
+
--size-sm-up: 0.75rem; // 12px
|
|
32
|
+
--size-md: 1rem; // 16px
|
|
33
|
+
--size-md-up: 1.25rem; // 20px
|
|
34
|
+
--size-lg: 1.5rem; // 24px
|
|
35
|
+
--size-xl: 2rem; // 32px
|
|
36
|
+
--size-2xl: 3rem; // 48px
|
|
37
|
+
--size-3xl: 4rem; // 64px
|
|
38
|
+
--size-4xl: 6rem;
|
|
39
|
+
--size-5xl: 8rem;
|
|
40
|
+
|
|
41
|
+
// -----------------------------------------------------------------------
|
|
42
|
+
// Border Width
|
|
43
|
+
// -----------------------------------------------------------------------
|
|
44
|
+
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
45
|
+
--border-width: 1px;
|
|
46
|
+
--border-width-strong: 2px;
|
|
47
|
+
|
|
48
|
+
// -----------------------------------------------------------------------
|
|
49
|
+
// Content widths
|
|
50
|
+
// -----------------------------------------------------------------------
|
|
51
|
+
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
52
|
+
--max-w-prose: 65ch;
|
|
53
|
+
--max-w-form: 32rem;
|
|
54
|
+
--max-w-content: 48rem;
|
|
55
|
+
--max-w-container: 80rem;
|
|
56
|
+
|
|
57
|
+
// -----------------------------------------------------------------------
|
|
58
|
+
// Border Radius
|
|
59
|
+
// -----------------------------------------------------------------------
|
|
60
|
+
--radius-none: 0;
|
|
61
|
+
--radius-xs: 0.125rem; // 2px
|
|
62
|
+
--radius-sm: 0.25rem; // 4px
|
|
63
|
+
--radius-md: 0.375rem; // 6px
|
|
64
|
+
--radius-lg: 0.5rem; // 8px
|
|
65
|
+
--radius-xl: 0.75rem; // 12px
|
|
66
|
+
--radius-2xl: 1rem; // 16px
|
|
67
|
+
--radius-full: 9999px;
|
|
68
|
+
|
|
69
|
+
// -----------------------------------------------------------------------
|
|
70
|
+
// Transitions — durations
|
|
71
|
+
// -----------------------------------------------------------------------
|
|
72
|
+
--transition-base: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
73
|
+
--transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
74
|
+
--transition-slow: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
75
|
+
|
|
76
|
+
// -----------------------------------------------------------------------
|
|
77
|
+
// Easings — curves only (no duration)
|
|
78
|
+
// -----------------------------------------------------------------------
|
|
79
|
+
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
80
|
+
--easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
|
|
81
|
+
--easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
|
|
82
|
+
--easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
|
|
83
|
+
--easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
84
|
+
|
|
85
|
+
// -----------------------------------------------------------------------
|
|
86
|
+
// Typography
|
|
87
|
+
// -----------------------------------------------------------------------
|
|
88
|
+
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
89
|
+
--font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Source Code Pro', monospace;
|
|
90
|
+
--font-features: "cv02", "cv03", "cv04", "cv11", "tnum";
|
|
91
|
+
|
|
92
|
+
--text-xs: 0.75rem; // 12px
|
|
93
|
+
--text-sm: 0.875rem; // 14px
|
|
94
|
+
--text-base: 1rem; // 16px
|
|
95
|
+
--text-lg: 1.125rem; // 18px
|
|
96
|
+
--text-xl: 1.25rem; // 20px
|
|
97
|
+
--text-2xl: 1.5rem; // 24px
|
|
98
|
+
|
|
99
|
+
// -----------------------------------------------------------------------
|
|
100
|
+
// Typography — semantic role tokens (v1.1) — VOCABULARY
|
|
101
|
+
// -----------------------------------------------------------------------
|
|
102
|
+
// Public API surface — full scale exposed; internal usage may skip levels.
|
|
103
|
+
// Vocabulary: density + themes rebind these; mixins read the
|
|
104
|
+
// --font-size/--line-height primitives via @include typography(role),
|
|
105
|
+
// never these tokens directly.
|
|
106
|
+
--text-display-lg: 3.75rem; --lh-display-lg: 1.1;
|
|
107
|
+
--text-display-md: 3rem; --lh-display-md: 1.1;
|
|
108
|
+
--text-display-sm: 1.875rem; --lh-display-sm: 1.1;
|
|
109
|
+
|
|
110
|
+
--text-heading-lg: 1.75rem; --lh-heading-lg: 1.15;
|
|
111
|
+
--text-heading-md: 1.25rem; --lh-heading-md: 1.2;
|
|
112
|
+
--text-heading-sm: 1.125rem; --lh-heading-sm: 1.25;
|
|
113
|
+
|
|
114
|
+
--text-title-md: 1rem; --lh-title-md: 1.3;
|
|
115
|
+
--text-title-sm: 0.875rem; --lh-title-sm: 1.3;
|
|
116
|
+
|
|
117
|
+
--text-body-lg: 1.125rem; --lh-body-lg: 1.6;
|
|
118
|
+
--text-body-md: 0.875rem; --lh-body-md: 1.5; // 14px / 1.5 — DocuFlow body
|
|
119
|
+
--text-body-sm: 0.8125rem; --lh-body-sm: 1.45; // 13px
|
|
120
|
+
|
|
121
|
+
--text-label-md: 0.8125rem; --lh-label-md: 1.4; // 13px
|
|
122
|
+
--text-label-sm: 0.75rem; --lh-label-sm: 1.4;
|
|
123
|
+
|
|
124
|
+
--text-caption: 0.75rem; --lh-caption: 1.4;
|
|
125
|
+
|
|
126
|
+
// -----------------------------------------------------------------------
|
|
127
|
+
// Letter spacing (optical tracking scale)
|
|
128
|
+
// -----------------------------------------------------------------------
|
|
129
|
+
--tracking-tighter: -0.035em;
|
|
130
|
+
--tracking-tight: -0.02em;
|
|
131
|
+
--tracking-normal: 0;
|
|
132
|
+
--tracking-wide: 0.025em;
|
|
133
|
+
--tracking-wider: 0.05em;
|
|
134
|
+
|
|
135
|
+
--font-normal: 400;
|
|
136
|
+
--font-medium: 500;
|
|
137
|
+
--font-semibold: 600;
|
|
138
|
+
--font-bold: 700;
|
|
139
|
+
|
|
140
|
+
// -----------------------------------------------------------------------
|
|
141
|
+
// Z-Index Scale
|
|
142
|
+
// -----------------------------------------------------------------------
|
|
143
|
+
--z-sticky: 10;
|
|
144
|
+
--z-dropdown: 20;
|
|
145
|
+
--z-overlay: 30;
|
|
146
|
+
--z-modal: 40;
|
|
147
|
+
--z-toast: 50;
|
|
148
|
+
|
|
149
|
+
// -----------------------------------------------------------------------
|
|
150
|
+
// App shell — intrinsic dimensions (not spacing rhythm)
|
|
151
|
+
// -----------------------------------------------------------------------
|
|
152
|
+
--app-header-height: 3.25rem; // 52px — DocuFlow topbar height
|
|
153
|
+
--app-sidebar-width: 14.5rem; // 232px — DocuFlow sidebar width
|
|
154
|
+
|
|
155
|
+
// -----------------------------------------------------------------------
|
|
156
|
+
// Logical tokens — the public contract mixins read
|
|
157
|
+
// -----------------------------------------------------------------------
|
|
158
|
+
// Rule: mixin bodies reference ONLY these tokens. Typography mixins read
|
|
159
|
+
// --font-size/--line-height ONLY (via @include typography(role), which
|
|
160
|
+
// rebinds the primitive per role on the consuming element's scope).
|
|
161
|
+
// --text-*/--lh-* role scale is VOCABULARY: density + themes rebind it,
|
|
162
|
+
// mixins never read it directly. --radius-*/--shadow-*/--transition-*/
|
|
163
|
+
// --easing-* role scales remain directly readable (not yet primitived).
|
|
164
|
+
// Back-end scales (--size-*, --color-neutral-*) are re-bound here and in
|
|
165
|
+
// context scopes (density, theme, region overrides) — never read directly
|
|
166
|
+
// inside a component mixin.
|
|
167
|
+
//
|
|
168
|
+
// See .claude/plans/refactor-logical-tokens-architecture.md for the
|
|
169
|
+
// full contract.
|
|
170
|
+
// -----------------------------------------------------------------------
|
|
171
|
+
|
|
172
|
+
// -- Structure & rhythm -----------------------------------------------
|
|
173
|
+
--padding-x: var(--size-sm-up);
|
|
174
|
+
--padding-y: var(--size-xs-up); // 6px — dense base (DocuFlow 7px rounds to 6px)
|
|
175
|
+
--gap: var(--size-xs-up); // 6px — dense base
|
|
176
|
+
// --radius sits with the other primitives in _palette.scss. Declared here it
|
|
177
|
+
// would resolve once at <html> and inherit frozen through every theme island.
|
|
178
|
+
|
|
179
|
+
// Accent-wash strengths. Ratios, not colors — color-mix() stays at the
|
|
180
|
+
// declaration site so --color-accent / --color-bg resolve locally and the
|
|
181
|
+
// semantic-color cascade keeps working. Ladder taken from _dropdown.scss,
|
|
182
|
+
// the only component that had all three states.
|
|
183
|
+
--tint-hover: 7%;
|
|
184
|
+
--tint-selected: 12%;
|
|
185
|
+
--tint-active: 14%;
|
|
186
|
+
|
|
187
|
+
// Translucent accent surface — companions for themes that opt in to a
|
|
188
|
+
// non-solid accent button. NO defaults — `@mixin btn` reads these via
|
|
189
|
+
// fallback to `--color-accent` / `--color-accent-fg`, so the default
|
|
190
|
+
// theme stays solid + white.
|
|
191
|
+
//
|
|
192
|
+
// IMPORTANT — declare at theme :root ONLY when the value is a literal
|
|
193
|
+
// (no nested var(--color-primary)). If a theme needs the translucent
|
|
194
|
+
// fill computed FROM --color-primary, the rebind must happen at
|
|
195
|
+
// consumer scope (e.g. `[data-skin="..."] button[type="submit"], .btn
|
|
196
|
+
// { --btn-bg: ...; }`) so the nested var() resolves at the button —
|
|
197
|
+
// otherwise the .success/.error/.warning/.info status cascade breaks on
|
|
198
|
+
// elements using semantic-color overrides. Glass uses the consumer-scope
|
|
199
|
+
// pattern; see theme/config/_theme.scss.
|
|
200
|
+
// --color-accent-bg
|
|
201
|
+
// --color-accent-bg-hover
|
|
202
|
+
// --color-accent-bg-fg
|
|
203
|
+
|
|
204
|
+
// Nav surface — companions for themes that opt in to a bordered/inset
|
|
205
|
+
// nav appearance (e.g. Glass). NO defaults — `@mixin nav` reads these
|
|
206
|
+
// via fallback to no-op values (transparent border, zero bleed), so
|
|
207
|
+
// the default theme renders unchanged. Themes rebind at theme :root.
|
|
208
|
+
// --nav-link-border-color
|
|
209
|
+
// --nav-link-border-color-hover
|
|
210
|
+
// --nav-link-border-color-active
|
|
211
|
+
// --nav-list-bleed
|
|
212
|
+
|
|
213
|
+
// Button padding tokens
|
|
214
|
+
--btn-padding-x: var(--size-sm-up);
|
|
215
|
+
--btn-padding-y: var(--size-xs-up);
|
|
216
|
+
|
|
217
|
+
// -- Typography — primitives -----------------------------------------
|
|
218
|
+
// Mixins read these two primitives ONLY (via @include typography(role),
|
|
219
|
+
// which rebinds them per role on the consuming element's scope — mirror
|
|
220
|
+
// of how @mixin card rebinds --color-bg). The --text-{role}/--lh-{role}
|
|
221
|
+
// role scale (lines ~202-220) is VOCABULARY: density + themes rebind it,
|
|
222
|
+
// mixins never read it directly. These :root values are the default for
|
|
223
|
+
// text that does not pass through a typography mixin.
|
|
224
|
+
--font-size: var(--text-body-md);
|
|
225
|
+
--line-height: var(--lh-body-md);
|
|
226
|
+
|
|
227
|
+
// -- Motion & depth --------------------------------------------------
|
|
228
|
+
--transition: var(--transition-base);
|
|
229
|
+
|
|
230
|
+
// -- Per-side borders (SOFT — no default) ----------------------------
|
|
231
|
+
// --border-block-start, --border-block-end,
|
|
232
|
+
// --border-inline-start, --border-inline-end
|
|
233
|
+
//
|
|
234
|
+
// Read by structural mixins (card, section-card, floating-panel,
|
|
235
|
+
// stat-card, app-header, app-footer, accordion items, table cells,
|
|
236
|
+
// tab-nav, sidebar edges, page-header, etc.) with a per-mixin
|
|
237
|
+
// fallback. NOT defined here — that is intentional. A scope that
|
|
238
|
+
// re-binds e.g. `--border-block-start: none` flattens the top edge
|
|
239
|
+
// of the matched element so siblings can join with a shared rule.
|
|
240
|
+
//
|
|
241
|
+
// Joining example:
|
|
242
|
+
// .joined-stack > * + * { --border-block-start: none; }
|
|
243
|
+
|
|
244
|
+
// -- Margin (SOFT — no default) --------------------------------
|
|
245
|
+
// --margin-block, --margin-inline
|
|
246
|
+
//
|
|
247
|
+
// Read by structural rhythm rules (label-to-input gap, section
|
|
248
|
+
// margin, header→body separation, sibling stacking,
|
|
249
|
+
// element-pushing horizontal offsets) with a per-mixin rebind.
|
|
250
|
+
// NOT defined here — the value varies too widely across
|
|
251
|
+
// consumers for a single :root default to be useful. Each
|
|
252
|
+
// consumer rebinds locally:
|
|
253
|
+
//
|
|
254
|
+
// @mixin section {
|
|
255
|
+
// --margin-block: var(--size-xl);
|
|
256
|
+
// margin-bottom: var(--margin-block);
|
|
257
|
+
// }
|
|
258
|
+
//
|
|
259
|
+
// NOTE: [data-density] scopes rebind type roles, logical
|
|
260
|
+
// --padding-y/--gap, and control sizing — NOT the --size-* scale.
|
|
261
|
+
// So --margin-block (reading --size-*) is constant across density
|
|
262
|
+
// tiers for now; making structural margins reactive is a Phase 3 item.
|
|
263
|
+
//
|
|
264
|
+
// --margin-inline is the horizontal companion. Used for
|
|
265
|
+
// element-pushing structural offsets (icon→text gap inside a
|
|
266
|
+
// row, sibling element offsets). NOT for flex/grid sibling
|
|
267
|
+
// spacing — that is --gap.
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Mobile rhythm — logical tokens tighten at ≤ md viewport.
|
|
272
|
+
// Not the same as `[data-density]` (that's a user opt-in).
|
|
273
|
+
// This is viewport-driven structural compression: content dominates chrome
|
|
274
|
+
// at narrow widths. Components reading --padding-x/--padding-y/--gap
|
|
275
|
+
// react via the cascade.
|
|
276
|
+
//
|
|
277
|
+
// Interaction with [data-density]: stacks. Compact density + mobile viewport =
|
|
278
|
+
// both apply; the underlying --padding-y tightens further from the mobile rebind.
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
@include mq-down(md) {
|
|
281
|
+
:root {
|
|
282
|
+
--padding-y: var(--size-xs); // 6px → 4px
|
|
283
|
+
--gap: var(--size-xs-up); // 6px → 6px (already tight)
|
|
284
|
+
}
|
|
285
|
+
}
|