@godxjp/ui 18.15.4 → 19.1.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/dist/app/app-provider.d.ts +1 -1
- package/dist/app/app-provider.js +3 -0
- package/dist/app/date-format-labels.d.ts +1 -1
- package/dist/app/time-format-labels.d.ts +1 -1
- package/dist/components/data-display/badge.d.ts +1 -1
- package/dist/components/data-display/card.d.ts +4 -13
- package/dist/components/data-display/card.js +2 -15
- package/dist/components/data-display/data-table.d.ts +3 -8
- package/dist/components/data-display/data-table.js +106 -68
- package/dist/components/data-display/descriptions.js +34 -5
- package/dist/components/data-display/empty-state.js +1 -1
- package/dist/components/data-display/permission-matrix.js +7 -7
- package/dist/components/data-display/popover.js +2 -9
- package/dist/components/data-display/qr-code.d.ts +1 -1
- package/dist/components/data-display/scroll-area.d.ts +3 -1
- package/dist/components/data-display/scroll-area.js +150 -16
- package/dist/components/data-display/table.js +12 -3
- package/dist/components/data-entry/branch-scope-picker.js +4 -4
- package/dist/components/data-entry/calendar.js +15 -24
- package/dist/components/data-entry/cascader.js +70 -72
- package/dist/components/data-entry/checkbox-group.js +12 -5
- package/dist/components/data-entry/checkbox.js +30 -13
- package/dist/components/data-entry/command.d.ts +6 -6
- package/dist/components/data-entry/date-picker.js +34 -17
- package/dist/components/data-entry/date-range-picker.js +19 -13
- package/dist/components/data-entry/form-field.d.ts +1 -1
- package/dist/components/data-entry/form-field.js +22 -5
- package/dist/components/data-entry/index.d.ts +2 -1
- package/dist/components/data-entry/input.js +18 -22
- package/dist/components/data-entry/label.js +4 -2
- package/dist/components/data-entry/month-picker.js +20 -17
- package/dist/components/data-entry/month-range-picker.js +26 -19
- package/dist/components/data-entry/radio.js +25 -6
- package/dist/components/data-entry/search-select.d.ts +1 -1
- package/dist/components/data-entry/search-select.js +37 -31
- package/dist/components/data-entry/select.d.ts +8 -0
- package/dist/components/data-entry/select.js +68 -26
- package/dist/components/data-entry/switch.js +16 -2
- package/dist/components/data-entry/textarea.d.ts +56 -0
- package/dist/components/data-entry/textarea.js +110 -40
- package/dist/components/data-entry/time-picker.js +52 -52
- package/dist/components/data-entry/toggle-group.d.ts +1 -0
- package/dist/components/data-entry/toggle.d.ts +1 -1
- package/dist/components/data-entry/transfer.js +14 -15
- package/dist/components/data-entry/tree-select.js +19 -23
- package/dist/components/data-entry/upload-crop-dialog.js +4 -4
- package/dist/components/data-entry/upload.d.ts +1 -1
- package/dist/components/data-entry/upload.js +46 -46
- package/dist/components/feedback/alert.js +7 -14
- package/dist/components/feedback/dialog.d.ts +23 -32
- package/dist/components/feedback/dialog.js +16 -13
- package/dist/components/feedback/sheet.d.ts +1 -1
- package/dist/components/feedback/sheet.js +14 -14
- package/dist/components/feedback/skeleton.js +13 -10
- package/dist/components/feedback/sonner.d.ts +1 -1
- package/dist/components/feedback/sonner.js +17 -8
- package/dist/components/feedback/tooltip.js +1 -1
- package/dist/components/general/activity.d.ts +44 -0
- package/dist/components/general/activity.js +65 -0
- package/dist/components/general/button.d.ts +2 -2
- package/dist/components/general/button.js +11 -24
- package/dist/components/general/index.d.ts +2 -0
- package/dist/components/general/index.js +2 -0
- package/dist/components/layout/app-shell.js +5 -3
- package/dist/components/layout/auth-divider.d.ts +9 -2
- package/dist/components/layout/auth-divider.js +7 -11
- package/dist/components/layout/index.d.ts +1 -0
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +32 -20
- package/dist/components/layout/resizable.d.ts +12 -12
- package/dist/components/layout/separator.d.ts +1 -0
- package/dist/components/layout/service-role-panel.js +47 -42
- package/dist/components/layout/sidebar.js +13 -1
- package/dist/components/layout/split-pane.d.ts +12 -1
- package/dist/components/layout/split-pane.js +13 -4
- package/dist/components/navigation/app-setting-picker.js +5 -14
- package/dist/components/navigation/dropdown-menu.js +10 -16
- package/dist/components/navigation/menubar.d.ts +3 -6
- package/dist/components/navigation/pagination-utils.d.ts +15 -2
- package/dist/components/navigation/pagination-utils.js +27 -21
- package/dist/components/navigation/pagination.d.ts +4 -4
- package/dist/components/navigation/pagination.js +2 -2
- package/dist/components/navigation/steps.js +31 -67
- package/dist/components/navigation/tabs.js +17 -5
- package/dist/components/query/infinite-query-state.js +2 -2
- package/dist/components/ui/accordion.d.ts +1 -1
- package/dist/components/ui/avatar.d.ts +1 -1
- package/dist/components/ui/avatar.js +29 -10
- package/dist/components/ui/input-otp.d.ts +8 -6
- package/dist/components/ui/rating.js +1 -1
- package/dist/components/ui/separator.d.ts +27 -2
- package/dist/components/ui/separator.js +42 -11
- package/dist/components/ui/toggle-group.d.ts +15 -5
- package/dist/components/ui/toggle-group.js +43 -18
- package/dist/components/ui/toggle.d.ts +66 -5
- package/dist/components/ui/toggle.js +64 -9
- package/dist/i18n/messages/en.json +8 -0
- package/dist/i18n/messages/ja.json +8 -0
- package/dist/i18n/messages/vi.json +8 -0
- package/dist/lib/control-styles.d.ts +14 -0
- package/dist/lib/control-styles.js +2 -0
- package/dist/lib/field-a11y.d.ts +52 -0
- package/dist/lib/field-a11y.js +17 -2
- package/dist/props/components/app.prop.d.ts +15 -0
- package/dist/props/components/data-display.prop.d.ts +85 -3
- package/dist/props/components/data-entry.prop.d.ts +35 -2
- package/dist/props/components/general.prop.d.ts +52 -1
- package/dist/props/components/layout.prop.d.ts +137 -2
- package/dist/props/registry.d.ts +116 -5
- package/dist/props/registry.js +165 -4
- package/dist/props/vocabulary/index.d.ts +2 -2
- package/dist/props/vocabulary/interaction.prop.d.ts +15 -0
- package/dist/props/vocabulary/layout.prop.d.ts +8 -0
- package/dist/styles/alert-layout.css +69 -3
- package/dist/styles/badge-layout.css +2 -2
- package/dist/styles/base.css +6 -0
- package/dist/styles/card-layout.css +25 -8
- package/dist/styles/control.css +1150 -29
- package/dist/styles/data-display-layout.css +185 -11
- package/dist/styles/data-entry-layout.css +352 -1
- package/dist/styles/density.css +2 -2
- package/dist/styles/dialog-layout.css +203 -4
- package/dist/styles/focus-ring.css +155 -0
- package/dist/styles/form-layout.css +50 -5
- package/dist/styles/index.css +1 -0
- package/dist/styles/layout.css +412 -23
- package/dist/styles/motion.css +178 -0
- package/dist/styles/navigation-layout.css +398 -22
- package/dist/styles/shell-layout.css +137 -39
- package/dist/styles/table-layout.css +153 -22
- package/dist/styles/toggle.css +59 -0
- package/dist/tokens/base.css +5 -0
- package/dist/tokens/components/activity.css +64 -0
- package/dist/tokens/components/badge.css +7 -0
- package/dist/tokens/components/card.css +14 -10
- package/dist/tokens/components/chart.css +1 -1
- package/dist/tokens/components/control.css +358 -8
- package/dist/tokens/components/data-display.css +75 -0
- package/dist/tokens/components/data-entry.css +25 -0
- package/dist/tokens/components/descriptions.css +22 -0
- package/dist/tokens/components/feedback.css +143 -4
- package/dist/tokens/components/form.css +16 -0
- package/dist/tokens/components/legal-document.css +5 -1
- package/dist/tokens/components/navigation.css +109 -0
- package/dist/tokens/components/scroll-area.css +21 -0
- package/dist/tokens/components/separator.css +52 -0
- package/dist/tokens/components/shell.css +132 -20
- package/dist/tokens/components/table.css +52 -3
- package/dist/tokens/components/toggle.css +82 -0
- package/dist/tokens/components/upload.css +107 -0
- package/dist/tokens/foundation.css +171 -10
- package/dist/tokens/semantic/layout.css +120 -1
- package/package.json +85 -68
- package/scripts/ui-audit.mjs +51 -2
|
@@ -6,6 +6,41 @@
|
|
|
6
6
|
--sidebar-section-label-font-size: var(--font-size-2xs);
|
|
7
7
|
--sidebar-product-tenant-font-size: var(--font-size-2xs);
|
|
8
8
|
--sidebar-badge-font-size: var(--font-size-2xs);
|
|
9
|
+
/* Sidebar nav count pill colours — the pill had a font-size knob and NO colour knob, so a rail
|
|
10
|
+
* that needed to tell "unread" from "mentions you" had to nest a <Badge> inside `badge` and got
|
|
11
|
+
* two pills, one inside the other. `initial` so the role defaults re-resolve at the call site
|
|
12
|
+
* under a scoped theme (a :root binding to a role var freezes at :root).
|
|
13
|
+
* Defaults = hsl(var(--secondary)) fill · hsl(var(--muted-foreground)) text. */
|
|
14
|
+
--sidebar-badge-background: initial;
|
|
15
|
+
--sidebar-badge-foreground: initial;
|
|
16
|
+
/* The EMPHASIS pair, read only by `SidebarItemProp.badgeTone="destructive"` (rule #44 — a
|
|
17
|
+
* neutral row never resolves them). Defaults = hsl(var(--destructive)) fill ·
|
|
18
|
+
* hsl(var(--destructive-foreground)) text, the canonical AA-checked pair. */
|
|
19
|
+
--sidebar-badge-destructive-background: initial;
|
|
20
|
+
--sidebar-badge-destructive-foreground: initial;
|
|
21
|
+
/* Softened focus ring on the tinted shell grounds: at full alpha the ring
|
|
22
|
+
* reads as a SELECTED item rather than a focused one (styles/focus-ring.css). */
|
|
23
|
+
--sidebar-user-focus-ring-alpha: 0.45;
|
|
24
|
+
/* Topbar glyphs. Three separate sizes, all previously baked as literals in shell-layout.css.
|
|
25
|
+
*
|
|
26
|
+
* --topbar-chip-icon-size is off the SCALE but on the pixel GRID, and those are different
|
|
27
|
+
* findings. Read the rule it styles: `display: grid; place-items: center; font-weight: 700` —
|
|
28
|
+
* it is a letter MEDALLION, not a glyph, so the half-pixel-stroke argument that made the
|
|
29
|
+
* NavigationMenu chevron snap from 14.4px to 14px does not apply here. 18px is a whole pixel
|
|
30
|
+
* sitting between --icon-size-md (16) and -lg (20); snapping it would be a visible 2px box
|
|
31
|
+
* change bought for nothing. Declared, not silently tolerated.
|
|
32
|
+
* scale-exempt: 18px letter medallion, a whole pixel between two icon steps, not a glyph */
|
|
33
|
+
--topbar-chip-icon-size: 1.125rem;
|
|
34
|
+
/* Sidebar product-switcher caret — a real glyph, previously a bare 0.875rem. */
|
|
35
|
+
--sidebar-product-caret-icon-size: var(--icon-size-sm);
|
|
36
|
+
--topbar-icon-size: var(--icon-size-md);
|
|
37
|
+
/* The caret is the eighth literal-sized icon rule in this file. The ratchet missed it because
|
|
38
|
+
* its selector says `caret` while the pattern looked for `icon|glyph` — the guard has been
|
|
39
|
+
* taught the wider vocabulary. */
|
|
40
|
+
--topbar-caret-icon-size: var(--icon-size-xs);
|
|
41
|
+
|
|
42
|
+
--topbar-icon-focus-ring-alpha: 0.45;
|
|
43
|
+
|
|
9
44
|
--sidebar-user-role-font-size: var(--font-size-2xs);
|
|
10
45
|
--org-switcher-meta-foreground: var(--muted-foreground);
|
|
11
46
|
--sidebar-nav-sub-font-size: var(--font-size-xs);
|
|
@@ -23,14 +58,35 @@
|
|
|
23
58
|
|
|
24
59
|
/* DXS application-shell geometry. These defaults mirror the checked-in
|
|
25
60
|
* Admin/Console hi-fi source while remaining themeable by consumers. */
|
|
26
|
-
--app-shell-bar-height:
|
|
61
|
+
--app-shell-bar-height: var(--band-height-2xl);
|
|
27
62
|
/* (the coarse-pointer override lives at the end of this file — Rule #24 grows
|
|
28
63
|
* controls to 44px, and a 48px bar cannot hold a 44px control plus its 3px
|
|
29
64
|
* focus ring at the very top of the viewport, where overflow cannot help.) */
|
|
30
|
-
/* Inline inset and slot gap of the AppShell top bar.
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
|
|
65
|
+
/* Inline inset and slot gap of the AppShell top bar.
|
|
66
|
+
*
|
|
67
|
+
* ONE OWNER FOR THE HORIZONTAL PAGE-INSET AXIS (gh#330). The bar sits in the SAME grid track as
|
|
68
|
+
* `.app-main`, directly above the page, so its first control and the page title are on one
|
|
69
|
+
* vertical edge — or they are supposed to be. These two knobs used to name their own values
|
|
70
|
+
* (--space-4 / --space-3) while the page named --space-page-x / --space-page-compact-x, and
|
|
71
|
+
* nothing reconciled them: measured in Chromium on /isolate/layout-app-shell the topbar's
|
|
72
|
+
* content started at x=80 while the page header's started at x=88 (1512px), and because the two
|
|
73
|
+
* sides also stepped at DIFFERENT breakpoints (shell 900px, page 720px) the error was not even
|
|
74
|
+
* constant — 8px at 1512, 12px between 720 and 900, 4px below 720. A consumer cannot correct a
|
|
75
|
+
* drift that changes with the viewport.
|
|
76
|
+
*
|
|
77
|
+
* The page gutter WINS the axis, for three reasons: it is read by seven regions (page header,
|
|
78
|
+
* toolbar, body, footer, PageContainer.Inset, the DataTable full-bleed compensation, Banner)
|
|
79
|
+
* against this knob's one element; the bar is the region that must line up with the page, not
|
|
80
|
+
* the other way round (the rail is a different track with its own inset); and moving the bar
|
|
81
|
+
* moves exactly one element in one composition, while moving --space-page-x would move every
|
|
82
|
+
* page in every consumer app.
|
|
83
|
+
*
|
|
84
|
+
* The NAMES stay — a theme that already sets `--app-shell-bar-inset` keeps working, and a bar
|
|
85
|
+
* that genuinely wants to sit tighter than its page still has its own knob. Only the DEFAULTS
|
|
86
|
+
* now point at the owner. `-compact` applies below the PAGE's 720px step (not the shell's 900px
|
|
87
|
+
* restructure), so both sides tighten on the same line — see styles/shell-layout.css. */
|
|
88
|
+
--app-shell-bar-inset: var(--space-page-x);
|
|
89
|
+
--app-shell-bar-inset-compact: var(--space-page-compact-x);
|
|
34
90
|
--app-shell-bar-gap: var(--space-3);
|
|
35
91
|
/* Docked navigation rail widths — the SINGLE most-retuned shell constant (rule #45). A service
|
|
36
92
|
* that designs on a different grid sets `--app-shell-sidebar-width: 15.9375rem` (255px) once
|
|
@@ -54,9 +110,48 @@
|
|
|
54
110
|
* generic sheet chrome inset must NOT stack on top of it (gh#211). Set it to var(--space-6) for
|
|
55
111
|
* a custom mobileNav node that wants the full sheet chrome inset. */
|
|
56
112
|
--app-shell-mobile-nav-inset: var(--space-1);
|
|
113
|
+
/* Hamburger glyph in the drawer trigger. Bigger ON PURPOSE than the trigger Button's own
|
|
114
|
+
* `size="sm"` icon step (--control-icon-size-sm, 0.875rem) — it is the ONLY navigation
|
|
115
|
+
* affordance on a phone, so it reads at the 1.25rem step. A flat rem, not a density-scaled
|
|
116
|
+
* alias: it must not move with the density axis, or the one tap target that opens navigation
|
|
117
|
+
* shrinks on a compact page. Consumed as a `size-[var(...)]` utility so it outranks
|
|
118
|
+
* `.ui-button--sm svg` (see the comment at the call site in app-shell.tsx). */
|
|
119
|
+
--app-shell-mobile-nav-icon-size: var(--icon-size-lg);
|
|
120
|
+
|
|
121
|
+
/* ServiceRolePanel (gh#319). `.ui-service-role-panel` shipped as a bare hook — the class was on
|
|
122
|
+
* the root but no rule existed anywhere, so the role rail's rhythm lived entirely as Tailwind
|
|
123
|
+
* literals inside the component and no theme could reach it (#45). The panel is a thin
|
|
124
|
+
* composition over MasterDetail, which still owns ALL the two-track geometry; these knobs cover
|
|
125
|
+
* only the role LIST inside the master rail.
|
|
126
|
+
*
|
|
127
|
+
* Flat rems, not `--space-*`: the literals they replace read Tailwind's own `--spacing` grid,
|
|
128
|
+
* which this package never remaps and which does not follow the density axis. Aliasing them
|
|
129
|
+
* would start scaling the rail inside a `.ui-density-*` subtree — a visual change, not a
|
|
130
|
+
* refactor. */
|
|
131
|
+
--service-role-panel-list-gap: 0.25rem; /* between role rows (was `gap-1`) */
|
|
132
|
+
--service-role-panel-row-gap: 0.25rem; /* select button ↔ delete button (was `gap-1`) */
|
|
133
|
+
--service-role-panel-item-title-gap: 0.375rem; /* role name ↔ lock Badge (was `gap-1.5`) */
|
|
134
|
+
/* The role row is a MULTI-LINE button (name over a description/member-count line), so it opts
|
|
135
|
+
* out of the control height grid (`h-auto`) and sets its own block padding — that is what the
|
|
136
|
+
* `py-2` literal was doing. It needs the raised `.ui-service-role-panel` ancestor specificity
|
|
137
|
+
* (0,2,0) to beat `.ui-button--md { padding-block: var(--button-space-block) }` (0,1,0):
|
|
138
|
+
* layout.css is imported BEFORE control.css and both are `@layer components`, so an equal
|
|
139
|
+
* (0,1,0) rule here would silently lose. */
|
|
140
|
+
--service-role-panel-item-padding-block: 0.5rem;
|
|
57
141
|
--sidebar-brand-mark-size: 1.375rem;
|
|
58
|
-
--sidebar-nav-item-height:
|
|
59
|
-
|
|
142
|
+
--sidebar-nav-item-height: var(--band-height-md);
|
|
143
|
+
/* ON the type scale (gh#329). This was `0.8125rem` — 13px, which is not a step: the golden scale
|
|
144
|
+
* runs …/ratio² ≈ 11.1 · /ratio ≈ 12.5 · base 14…, so 13 sat BETWEEN two steps and every nav row
|
|
145
|
+
* in the rail read off the system's type rhythm. It had no mechanical anchor either — unlike the
|
|
146
|
+
* auth field label below, which is pinned to an artboard y-coordinate and keeps its literal with
|
|
147
|
+
* a declared `scale-exempt` — only the checked-in hi-fi source's number.
|
|
148
|
+
*
|
|
149
|
+
* GEOMETRY MOVES, by 0.53px: 13px → --font-size-xs (≈12.47px), the step the sub-row
|
|
150
|
+
* (--sidebar-nav-sub-font-size) and the flyout title already take. Nothing reflows — the row is a
|
|
151
|
+
* fixed 2rem with `align-items: center`, and 1.5 × 12.47 = 18.7px sits inside it with the same
|
|
152
|
+
* headroom 19.5px had. What is gained is that a service overriding --font-size-base now moves the
|
|
153
|
+
* rail's labels with the rest of its type, instead of leaving one constant behind. */
|
|
154
|
+
--sidebar-nav-item-font-size: var(--font-size-xs);
|
|
60
155
|
/* Line box of the nav LABEL, not the row (gh#254): `.sb-label` clips, so its line box is its clip
|
|
61
156
|
* box, and the row's `line-height: 1` shears descenders and Vietnamese tone marks. Keep >= 1.2. */
|
|
62
157
|
--sidebar-nav-item-line-height: 1.5;
|
|
@@ -66,7 +161,7 @@
|
|
|
66
161
|
* tone marks exactly as the sidebar label did. Keep >= 1.2. */
|
|
67
162
|
--auth-account-summary-email-line-height: 1.5;
|
|
68
163
|
--topbar-start-truncate-line-height: 1.5;
|
|
69
|
-
--sidebar-nav-icon-size:
|
|
164
|
+
--sidebar-nav-icon-size: var(--icon-size-md);
|
|
70
165
|
--sidebar-nav-item-gap: 0.625rem;
|
|
71
166
|
--sidebar-nav-item-padding-x: 0.625rem;
|
|
72
167
|
--sidebar-nav-gap: 2px;
|
|
@@ -111,7 +206,7 @@
|
|
|
111
206
|
* search trigger, a collapsing field). A page-local media query is the anti-pattern this knob
|
|
112
207
|
* replaces. */
|
|
113
208
|
--topbar-center-compact-display: none;
|
|
114
|
-
--org-switcher-trigger-height:
|
|
209
|
+
--org-switcher-trigger-height: var(--band-height-xl);
|
|
115
210
|
--org-switcher-trigger-padding-x: var(--space-2);
|
|
116
211
|
--org-switcher-avatar-size: 1.75rem;
|
|
117
212
|
--org-switcher-menu-width: 16rem;
|
|
@@ -143,7 +238,7 @@
|
|
|
143
238
|
|
|
144
239
|
/* Canonical DXS auth preset. These are public theme knobs: consumers select the preset once on
|
|
145
240
|
* AuthShell and may retune the product theme here rather than overriding individual fields. */
|
|
146
|
-
--auth-shell-canonical-control-height:
|
|
241
|
+
--auth-shell-canonical-control-height: var(--band-height-lg);
|
|
147
242
|
--auth-shell-canonical-card-max-width: 22.5rem;
|
|
148
243
|
--auth-shell-canonical-heading-size: var(--font-size-base);
|
|
149
244
|
--auth-shell-canonical-main-padding: 1rem;
|
|
@@ -277,20 +372,27 @@
|
|
|
277
372
|
* content instead. */
|
|
278
373
|
--auth-shell-registration-identity-slot-block-size: 7rem;
|
|
279
374
|
|
|
280
|
-
/* Labelled auth divider geometry. The canonical SCR-001 divider row is 19px tall at
|
|
375
|
+
/* Labelled auth divider geometry. The canonical SCR-001 divider row is 19px tall at an 11px
|
|
281
376
|
* label (the artboard label inherits the page's line-height instead of collapsing to a 1.0 line
|
|
282
|
-
* box). 19/11
|
|
283
|
-
*
|
|
284
|
-
* whole lower half of the Login card 8px high (gh#263).
|
|
377
|
+
* box). 19/11 is that RATIO, not a pin: it holds the row proportional when the label's step
|
|
378
|
+
* moves, which is exactly what gh#329 did to it. The previous hardcoded `line-height: 1`
|
|
379
|
+
* rendered an 11px row, sitting the whole lower half of the Login card 8px high (gh#263).
|
|
380
|
+
*
|
|
381
|
+
* ON the type scale (gh#329): the label was the literal `0.6875rem` (11px) and is now
|
|
382
|
+
* --font-size-2xs, the scale's ratio⁻² step ≈ 11.107px — the same step the sidebar section
|
|
383
|
+
* label, the kbd cap and the chrome page subtitle already take. GEOMETRY MOVES by 0.11px on the
|
|
384
|
+
* label and 0.19px on the row (19 → 19.19px), i.e. a fifth of a pixel, and in exchange the auth
|
|
385
|
+
* micro-scale finally rides the service's --font-size-base like everything else. 11 was never a
|
|
386
|
+
* step; it was 2xs rounded to the nearest whole pixel and then written down as if it were. */
|
|
285
387
|
--auth-shell-divider-gap: 0.625rem;
|
|
286
|
-
--auth-shell-divider-label-font-size:
|
|
388
|
+
--auth-shell-divider-label-font-size: var(--font-size-2xs);
|
|
287
389
|
--auth-shell-divider-label-line-height: calc(19 / 11);
|
|
288
390
|
--auth-shell-divider-rule-color: var(--border);
|
|
289
391
|
--auth-shell-divider-label-color: var(--muted-foreground);
|
|
290
392
|
--auth-identity-gap: 0.375rem;
|
|
291
393
|
--auth-requester-gap: 0.375rem;
|
|
292
|
-
--auth-requester-icon-size:
|
|
293
|
-
--auth-requester-glyph-size:
|
|
394
|
+
--auth-requester-icon-size: var(--icon-size-md);
|
|
395
|
+
--auth-requester-glyph-size: var(--icon-size-2xs);
|
|
294
396
|
--auth-account-summary-min-height: var(--control-height-comfortable);
|
|
295
397
|
--auth-account-summary-gap: var(--space-2);
|
|
296
398
|
--auth-account-summary-padding: var(--space-1) var(--space-2);
|
|
@@ -299,13 +401,23 @@
|
|
|
299
401
|
--auth-account-summary-avatar-glyph-size: var(--control-icon-size-sm);
|
|
300
402
|
--auth-account-summary-email-font-size: var(--font-size-sm);
|
|
301
403
|
--auth-footer-content-gap: 0.375rem;
|
|
302
|
-
|
|
404
|
+
/* The same 11px → 2xs snap as the divider label above (gh#329); this one carried no artboard
|
|
405
|
+
* anchor at all, only the literal. GEOMETRY MOVES by 0.11px. */
|
|
406
|
+
--auth-footer-text-font-size: var(--font-size-2xs);
|
|
303
407
|
--auth-stack-gap: var(--space-3);
|
|
304
408
|
--auth-shell-field-label-gap: var(--space-1);
|
|
305
409
|
/* Canonical SCR-001 field label: a LITERAL 12px (the golden-ratio --font-size-xs ≈ 12.47px would
|
|
306
410
|
* drift the 18px line box to 18.7px and push the email input off its y=489 anchor) with a 1.5
|
|
307
411
|
* line box = 18px. The former var(--font-size-xs)/1.25 pair rendered a 14px box, sitting the
|
|
308
|
-
* email input 4px high (gh#263).
|
|
412
|
+
* email input 4px high (gh#263).
|
|
413
|
+
*
|
|
414
|
+
* gh#329 asked whether this is merely a long way of writing --font-size-xs. It is NOT: the xs
|
|
415
|
+
* step is base/ratio ≈ 12.47px, not 12. This is the system's TIER 2 — a value that is off every
|
|
416
|
+
* step because it is anchored to something outside the system (an artboard coordinate), which is
|
|
417
|
+
* a real need and must have a sanctioned route rather than becoming a fork or an !important. The
|
|
418
|
+
* route is the marker below, which the scale-bypass guard honours and PRINTS, so the exception is
|
|
419
|
+
* declared once and stays visible instead of hiding in prose. */
|
|
420
|
+
/* scale-exempt: SCR-001 pins the email input at y=489; --font-size-xs (12.47px) drifts the 18px label box to 18.7px (gh#263) */
|
|
309
421
|
--auth-shell-field-label-font-size: 0.75rem;
|
|
310
422
|
--auth-shell-field-label-line-height: 1.5;
|
|
311
423
|
|
|
@@ -367,6 +479,6 @@
|
|
|
367
479
|
* overflow setting can recover. 3.5rem gives 6px of breathing per side. */
|
|
368
480
|
@media (pointer: coarse) {
|
|
369
481
|
:root {
|
|
370
|
-
--app-shell-bar-height:
|
|
482
|
+
--app-shell-bar-height: var(--band-height-3xl);
|
|
371
483
|
}
|
|
372
484
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* Table component tokens: row height, cell padding. */
|
|
2
2
|
|
|
3
3
|
:root {
|
|
4
|
-
--table-row-height-compact:
|
|
5
|
-
--table-row-height-default:
|
|
6
|
-
--table-row-height-comfortable:
|
|
4
|
+
--table-row-height-compact: var(--band-height-sm);
|
|
5
|
+
--table-row-height-default: var(--band-height-md);
|
|
6
|
+
--table-row-height-comfortable: var(--band-height-xl);
|
|
7
7
|
--table-row-height: calc(var(--table-row-height-default) * var(--scaling));
|
|
8
8
|
--table-cell-padding-y: var(--space-2);
|
|
9
9
|
--table-cell-space-x: var(--control-padding-x);
|
|
@@ -147,4 +147,53 @@
|
|
|
147
147
|
--table-stacked-collection-card-gap: var(--space-stack-sm);
|
|
148
148
|
--table-stacked-collection-cell-padding-y: var(--space-stack-xs);
|
|
149
149
|
--table-stacked-collection-label-font-size: var(--font-size-xs);
|
|
150
|
+
|
|
151
|
+
/* DATA TABLE odds and ends that were still literal on the component (#319). The table's cell
|
|
152
|
+
* rhythm, widths and action-collection tiers were already tokenized; these are the pieces
|
|
153
|
+
* around them — the select column, sort glyphs, sticky header layer and skeleton shapes. */
|
|
154
|
+
--table-select-column-width: 2.5rem;
|
|
155
|
+
--table-sort-icon-size: var(--icon-size-xs);
|
|
156
|
+
--table-toolbar-icon-size: var(--icon-size-md);
|
|
157
|
+
--table-pagination-icon-size: var(--icon-size-md);
|
|
158
|
+
--table-pagination-font-size: var(--font-size-sm);
|
|
159
|
+
/* Skeleton placeholders mimic the real content they stand in for: a checkbox square and a
|
|
160
|
+
* text line at the row's cap height. Retune with --table-cell-padding-y to keep the loading
|
|
161
|
+
* state the same height as the loaded one. */
|
|
162
|
+
--table-skeleton-check-size: 1rem;
|
|
163
|
+
/* The skeleton bar's BLOCK SIZE. `--table-skeleton-line-height` was a length on the
|
|
164
|
+
* line-height axis, whose scale is unitless ratios (gh#324) — a mis-named height, and the
|
|
165
|
+
* only raw value on that axis, which is what kept the axis ungated. Renamed rather than
|
|
166
|
+
* left, with the old name kept as a DEPRECATED ALIAS: it is a published token a consumer
|
|
167
|
+
* theme may already override, and styles/table-layout.css still reads the old name, so an
|
|
168
|
+
* override of either spelling keeps working. Prefer the new name; the alias may be removed
|
|
169
|
+
* in a future major. */
|
|
170
|
+
--table-skeleton-line-block-size: 1rem;
|
|
171
|
+
--table-skeleton-line-height: var(--table-skeleton-line-block-size);
|
|
172
|
+
--table-skeleton-radius: var(--radius-sm);
|
|
173
|
+
|
|
174
|
+
/* The table's own base type step (gh#319). Was a `text-sm` utility on the <table>; the theme
|
|
175
|
+
* remaps `--text-sm` to `--font-size-sm`, so this default is byte-identical. */
|
|
176
|
+
--table-font-size: var(--font-size-sm);
|
|
177
|
+
/* MANDATORY companion to --table-font-size — the gh#260 trap, again. `text-sm` also set
|
|
178
|
+
* line-height from Tailwind's `--text-sm--line-height`, and styles/base.css remaps `--text-sm`
|
|
179
|
+
* but NOT that companion. Without this the table would silently inherit ambient page leading
|
|
180
|
+
* the moment the font-size moved into CSS. Same unitless ratio Tailwind ships. */
|
|
181
|
+
--table-line-height: calc(1.25 / 0.875);
|
|
182
|
+
/* Horizontal row rule (chrome, #44) — the divider between body rows AND under the header row.
|
|
183
|
+
* Owned here rather than as TableRow's `border-b` utility so the "last row draws no rule"
|
|
184
|
+
* rule in `@layer components` can actually zero it; a utility would outrank it by layer.
|
|
185
|
+
* Colour is deliberately NOT set: it inherits the global `* { border-color: hsl(var(--border)) }`
|
|
186
|
+
* so a scoped [data-tenant]/.dark override of --border still reaches every row. */
|
|
187
|
+
--table-row-border-width: var(--stroke-hairline);
|
|
188
|
+
/* Flush divider (chrome, #44/#45) — the ONE edge a full-bleed table keeps when it sits inside
|
|
189
|
+
* `<CardContent flush>`: the line between a plain CardHeader and the first row. The other three
|
|
190
|
+
* edges coincide with the card's own frame and are erased (gh#305); this one has nothing behind
|
|
191
|
+
* it, so without it the header band floats (gh#306). Scoped by construction to the case that
|
|
192
|
+
* needs it — a BANDED header, a CardBar or a headerless card already draw their own line there
|
|
193
|
+
* and never reach this token — so a service tunes only the plain-header divider: `0` for a
|
|
194
|
+
* borderless full-bleed table, heavier for a stronger band. Colour and style are NOT set here:
|
|
195
|
+
* only the width is restored, so the surface's own border declaration still owns them and a
|
|
196
|
+
* scoped [data-tenant]/.dark override of --border reaches it.
|
|
197
|
+
* Default = the same hairline the table's other rules draw. */
|
|
198
|
+
--table-flush-divider-width: var(--table-row-border-width);
|
|
150
199
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* TOGGLE — counter-pill + pressed-state knobs (gh#312).
|
|
2
|
+
*
|
|
3
|
+
* Toggle owns the pressed state; Button owns the counter-pill vocabulary (`count` /
|
|
4
|
+
* `overflowCount` / `showZero`). A counted pressed chip (a faceted filter chip "Unread 12", a
|
|
5
|
+
* reaction chip) needs both, so Toggle grew the same vocabulary — and these knobs exist so it
|
|
6
|
+
* grows it WITHOUT growing a second, drifting set of constants (cardinal rule #45).
|
|
7
|
+
*
|
|
8
|
+
* SHARE vs SPLIT — the rule this file follows, and why each half falls where it does:
|
|
9
|
+
*
|
|
10
|
+
* • GEOMETRY is genuinely the same pill — min-width, inline padding, type step, corner. Toggle
|
|
11
|
+
* keeps its OWN knob for each (rule #45) but sets it to Button's exact value off the same
|
|
12
|
+
* primitive scale token, and a test asserts the two stay equal — so a Toggle count set beside
|
|
13
|
+
* a Button count is indistinguishable and cannot drift unnoticed, while a service can still
|
|
14
|
+
* move one without the other.
|
|
15
|
+
*
|
|
16
|
+
* • COLOUR is genuinely different, and MEASURED so. Button's pill sits on a static variant
|
|
17
|
+
* surface and tints itself with a translucent foreground (`bg-primary-foreground/15`,
|
|
18
|
+
* `bg-foreground/8`). Toggle's pill sits on a surface that INVERTS when pressed, and a
|
|
19
|
+
* translucent tint over it cannot clear WCAG 1.4.3 AA at the xs step: with the shipped roles,
|
|
20
|
+
* `--primary-foreground` over `--primary-foreground/0.16` over `--primary` measures 3.82:1 in
|
|
21
|
+
* light (4.39:1 even at 0.08 — the ceiling is the chip label's own 5.04:1, and any tint can
|
|
22
|
+
* only lower it), and `--muted-foreground` over `--foreground/0.08` measures 4.32:1, dropping
|
|
23
|
+
* to 3.64:1 once the chip hovers to `--accent`. Forcing a shared colour token here would ship
|
|
24
|
+
* a known #299-class failure.
|
|
25
|
+
*
|
|
26
|
+
* So Toggle's pill uses OPAQUE role fills, which makes its contrast independent of the chip's
|
|
27
|
+
* variant and hover surface, and inverts them with the state:
|
|
28
|
+
* unpressed --foreground on --muted → 14.25:1 light · 12.40:1 dark
|
|
29
|
+
* pressed --primary on --primary-foreground → 5.04:1 light · 7.07:1 dark
|
|
30
|
+
* The pressed pair is the chip label's own pair, swapped — the pill is exactly as legible as
|
|
31
|
+
* the label it sits next to, never worse, under any theme that keeps that pair legible.
|
|
32
|
+
*
|
|
33
|
+
* Every colour knob is a ROLE-MIRROR knob: `initial` at :root with the role default at the call
|
|
34
|
+
* site (docs/TOKENS.md · "Role-mirror knobs MUST be `initial`"). A `:root` binding to
|
|
35
|
+
* `var(--primary)` would freeze at the :root value and a scoped `[data-tenant]`/`.dark` override
|
|
36
|
+
* of the role would never reach it.
|
|
37
|
+
*/
|
|
38
|
+
:root {
|
|
39
|
+
/* ── Counter pill · geometry. One knob per component (rule #45, and the repo's existing shape:
|
|
40
|
+
* --button-count-*, --tag-input-chip-font-size, --toggle-sm-font-size are all independent knobs
|
|
41
|
+
* off the same primitive scale). The VALUES are byte-identical to Button's counter pill and read
|
|
42
|
+
* the same primitive tokens, so the two pills render the same size and a Toggle count set beside
|
|
43
|
+
* a Button count is indistinguishable — asserted by
|
|
44
|
+
* src/styles/__tests__/toggle-count-token-parity.test.ts so it cannot drift silently.
|
|
45
|
+
*
|
|
46
|
+
* (They are concrete here rather than `initial` + a call-site `var(--toggle-…, var(--button-…))`
|
|
47
|
+
* fallback because check:typography requires a bare `var(--token)` for every font-size, and a
|
|
48
|
+
* split shape across the five geometry knobs would be worse than a consistent one.) */
|
|
49
|
+
--toggle-count-min-width: var(--space-4);
|
|
50
|
+
--toggle-count-space-inline: var(--space-1);
|
|
51
|
+
--toggle-count-font-size: var(--font-size-xs);
|
|
52
|
+
--toggle-count-radius: var(--radius-pill);
|
|
53
|
+
/* Quiet default (#44) — the toggle's own flex gap already separates label from pill; this knob
|
|
54
|
+
* ADDS to it for a service whose design grid wants the counter pushed further out. */
|
|
55
|
+
--toggle-count-gap: 0;
|
|
56
|
+
|
|
57
|
+
/* ── Counter pill · unpressed colours. Defaults = hsl(var(--muted)) fill (quiet: 1.09:1 against
|
|
58
|
+
* the chip's own surface, so at rest the count reads as text, #44) and hsl(var(--foreground))
|
|
59
|
+
* text (14.25:1 on that fill). Opaque on purpose — a translucent fill would take its contrast
|
|
60
|
+
* from whatever surface the chip currently has, and lose ~0.7 on hover. */
|
|
61
|
+
--toggle-count-background: initial;
|
|
62
|
+
--toggle-count-color: initial;
|
|
63
|
+
|
|
64
|
+
/* ── Counter pill · PRESSED colours. Defaults = hsl(var(--primary-foreground)) fill,
|
|
65
|
+
* hsl(var(--primary)) text — the pressed chip's OWN pair, swapped. Not `--primary` on
|
|
66
|
+
* `--primary`: the pressed chip is already filled with --primary, so a --primary pill would be
|
|
67
|
+
* invisible on it. The swap also flips the pill from near-invisible to solid, which is one of
|
|
68
|
+
* the encodings that keeps the pressed state off colour alone (WCAG 1.4.1). */
|
|
69
|
+
--toggle-pressed-count-background: initial;
|
|
70
|
+
--toggle-pressed-count-color: initial;
|
|
71
|
+
|
|
72
|
+
/* ── Pressed chrome. Default = hsl(var(--primary)), i.e. the pressed fill itself, so out of the
|
|
73
|
+
* box this border is quiet (#44) and the pressed state is carried by the fill inversion + the
|
|
74
|
+
* pill inversion + the forced-colors rule below. A service whose pressed fill is a PALE tint
|
|
75
|
+
* (where those inversions get weak) opts into a visible outline by overriding this. */
|
|
76
|
+
--toggle-pressed-border-color: initial;
|
|
77
|
+
|
|
78
|
+
/* Under forced-colors every fill is flattened to a system colour, so neither inversion encodes
|
|
79
|
+
* anything any more. This outline is the state's structural fallback there — drawn on the
|
|
80
|
+
* PRESSED pill only, and as `outline` (not `border`) so it costs no layout. */
|
|
81
|
+
--toggle-count-forced-outline-width: var(--stroke-hairline);
|
|
82
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* Upload primitive tokens — dropzone, picture tile, avatar, draft bar, file row.
|
|
2
|
+
*
|
|
3
|
+
* Upload carried 66 hard-coded geometry/chrome literals, the single worst file in the library
|
|
4
|
+
* (#319). It renders five variants (dropzone · button · picture · picture-card · avatar), and
|
|
5
|
+
* EVERY one of them baked its box straight onto the component: a service could not resize the
|
|
6
|
+
* avatar, retune the dropzone's generous 40px inset, or align the file row to its own grid
|
|
7
|
+
* without forking. That is precisely the gap cardinal rule #45 exists to close.
|
|
8
|
+
*
|
|
9
|
+
* Radius defaults mirror the utilities they replace, verified against the built CSS:
|
|
10
|
+
* rounded-lg = var(--radius) → --radius-lg
|
|
11
|
+
* rounded-md = calc(var(--radius) / var(--radius-ratio)) → --radius-md
|
|
12
|
+
* rounded-full → --radius-pill
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
:root {
|
|
16
|
+
/* DROPZONE — the large drag target. Its inset is deliberately generous; a dense service
|
|
17
|
+
* dials it back with one override instead of forking the variant. */
|
|
18
|
+
--upload-dropzone-space-inset: var(--space-10);
|
|
19
|
+
--upload-dropzone-radius: var(--radius-lg);
|
|
20
|
+
--upload-dropzone-border-width: var(--stroke-md);
|
|
21
|
+
--upload-dropzone-icon-size: var(--icon-size-3xl);
|
|
22
|
+
--upload-dropzone-hint-space-block-start: var(--space-3);
|
|
23
|
+
--upload-dropzone-hint-font-size: var(--font-size-sm);
|
|
24
|
+
--upload-dropzone-meta-space-block-start: var(--space-1);
|
|
25
|
+
--upload-dropzone-meta-font-size: var(--font-size-xs);
|
|
26
|
+
|
|
27
|
+
/* TILE — the 96px square shared by picture-card thumbnails and the "add image" button.
|
|
28
|
+
* One knob resizes the whole gallery; picture-card grids are the most common thing a service
|
|
29
|
+
* re-grids to match its own column rhythm. */
|
|
30
|
+
--upload-tile-size: 6rem;
|
|
31
|
+
--upload-tile-radius: var(--radius-md);
|
|
32
|
+
--upload-tile-space-gap: var(--space-3);
|
|
33
|
+
--upload-tile-icon-size: var(--icon-size-xl);
|
|
34
|
+
--upload-tile-label-space-block-start: var(--space-1);
|
|
35
|
+
--upload-tile-label-font-size: var(--font-size-xs);
|
|
36
|
+
--upload-tile-overlay-font-size: var(--font-size-xs);
|
|
37
|
+
/* Busy scrim over a tile/frame — role-mirror knob, `initial` so --background re-resolves at the
|
|
38
|
+
* CALL SITE under a scoped [data-tenant]/.dark theme. Default = hsl(var(--background) / 0.7). */
|
|
39
|
+
--upload-overlay-background: initial;
|
|
40
|
+
--upload-overlay-alpha: 70%;
|
|
41
|
+
|
|
42
|
+
/* REMOVE affordance — the ✕ / trash chip pinned to a tile or avatar. */
|
|
43
|
+
--upload-remove-space-inset: var(--space-1);
|
|
44
|
+
--upload-remove-offset: var(--space-1);
|
|
45
|
+
--upload-remove-icon-size: var(--icon-size-sm);
|
|
46
|
+
|
|
47
|
+
/* PICTURE — the single wide preview variant. */
|
|
48
|
+
--upload-picture-max-width: 20rem;
|
|
49
|
+
--upload-picture-radius: var(--radius-md);
|
|
50
|
+
--upload-picture-preview-max-height: 12rem;
|
|
51
|
+
--upload-picture-empty-height: 8rem;
|
|
52
|
+
--upload-picture-empty-label-space-block-start: var(--space-2);
|
|
53
|
+
--upload-picture-empty-label-font-size: var(--font-size-sm);
|
|
54
|
+
--upload-picture-overlay-font-size: var(--font-size-sm);
|
|
55
|
+
/* "Pending replace" chip. The radius previously came from a bare `rounded`, which resolves to a
|
|
56
|
+
* flat .25rem and so ignored the radius scale entirely — the exact shape of a rule #44 miss.
|
|
57
|
+
* It now follows the tile radius like every other chip in the component. */
|
|
58
|
+
--upload-picture-badge-radius: var(--radius-md);
|
|
59
|
+
--upload-picture-badge-offset: var(--space-2);
|
|
60
|
+
--upload-picture-badge-space-inline: var(--space-2);
|
|
61
|
+
--upload-picture-badge-space-block: 0.125rem;
|
|
62
|
+
--upload-picture-badge-font-size: var(--font-size-xs);
|
|
63
|
+
|
|
64
|
+
/* AVATAR — the round single-image variant. */
|
|
65
|
+
--upload-avatar-size: 6rem;
|
|
66
|
+
--upload-avatar-border-width: var(--stroke-md);
|
|
67
|
+
--upload-avatar-change-space-block: var(--space-1);
|
|
68
|
+
/* The "change" strip sits ON the photo, so its scrim is intentionally a fixed dark wash rather
|
|
69
|
+
* than a surface role — it must stay legible over an arbitrary user image in either theme. */
|
|
70
|
+
--upload-avatar-change-background: rgb(0 0 0 / 0.7);
|
|
71
|
+
--upload-avatar-change-foreground: #fff;
|
|
72
|
+
/* Alpha of an image the user has marked for deletion but not yet committed. */
|
|
73
|
+
--upload-avatar-pending-delete-alpha: 0.4;
|
|
74
|
+
|
|
75
|
+
/* DRAFT BAR — the undo strip shown after a pending remove/replace. */
|
|
76
|
+
--upload-draft-space-inline: var(--space-3);
|
|
77
|
+
--upload-draft-space-block: var(--space-2);
|
|
78
|
+
--upload-draft-space-gap: var(--space-2);
|
|
79
|
+
--upload-draft-radius: var(--radius-md);
|
|
80
|
+
--upload-draft-font-size: var(--font-size-sm);
|
|
81
|
+
--upload-draft-icon-size: var(--icon-size-sm);
|
|
82
|
+
|
|
83
|
+
/* FILE ROW — the list rendered under the dropzone/button variants. */
|
|
84
|
+
--upload-row-space-inline: var(--space-3);
|
|
85
|
+
--upload-row-space-block: var(--space-2);
|
|
86
|
+
--upload-row-space-gap: var(--space-3);
|
|
87
|
+
--upload-row-radius: var(--radius-md);
|
|
88
|
+
--upload-row-font-size: var(--font-size-sm);
|
|
89
|
+
--upload-row-icon-size: var(--icon-size-md);
|
|
90
|
+
|
|
91
|
+
/* CROP DIALOG — the 1:1 avatar cropper (`UploadCropDialog`). The 66-literal upload pass above
|
|
92
|
+
* never reached this file, so the whole cropper was still baked on the component: the dialog was
|
|
93
|
+
* pinned to `max-w-sm`, the round preview to `size-48`, the zoom row to `px-2`. An avatar is one
|
|
94
|
+
* of the most service-specific sizes there is (a 96px tile service wants a smaller crop stage
|
|
95
|
+
* than a 200px one), and the crop stage must stay in proportion with --upload-avatar-size —
|
|
96
|
+
* which is exactly the pair rule #45 exists to keep tunable together.
|
|
97
|
+
*
|
|
98
|
+
* The dialog width intentionally stays a knob of its own rather than reading
|
|
99
|
+
* --dialog-width-default: the cropper is deliberately NARROWER than a normal dialog so the round
|
|
100
|
+
* stage reads as the subject, not as a small element in a wide box. */
|
|
101
|
+
--upload-crop-dialog-max-width: 24rem;
|
|
102
|
+
--upload-crop-preview-size: 12rem;
|
|
103
|
+
--upload-crop-preview-radius: var(--radius-pill);
|
|
104
|
+
/* Zoom row inset — the slider is inset from the dialog edge so its thumb's focus ring is never
|
|
105
|
+
* flush against the dialog padding. */
|
|
106
|
+
--upload-crop-zoom-space-inline: var(--space-2);
|
|
107
|
+
}
|