@aziontech/theme 4.3.0 → 4.3.1

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.
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Layout tokens — the console's container system.
3
+ *
4
+ * Three decisions, expressed once: how far content sits from the app chrome
5
+ * (BOUNDARY), how far things sit from each other (RHYTHM), and how wide a reading
6
+ * column may get (MEASURE).
7
+ *
8
+ * A DERIVED GROUP: every value here is a `var()` reference to `--spacing-*` /
9
+ * `--container-*`. Never write a literal length in this file. That indirection is the
10
+ * whole point — the spacing scale is already fluid (`--spacing-lg` is 1rem, then
11
+ * 1.5rem from `sm`), and `var()` is substituted at USE time on the element, so a
12
+ * layout token follows the breakpoint override without owning a breakpoint map of its
13
+ * own. Giving these their own maps would duplicate the spacing scale into layout and
14
+ * let the two drift.
15
+ */
16
+ export const layoutsData: {
17
+ 'layout-boundary-inline': string;
18
+ 'layout-boundary-end': string;
19
+ 'layout-boundary-start': string;
20
+ 'layout-section-gap': string;
21
+ 'layout-group-gap': string;
22
+ 'layout-measure': string;
23
+ 'layout-measure-focused': string;
24
+ 'layout-measure-form': string;
25
+ 'layout-measure-form-create': string;
26
+ 'layout-measure-docs': string;
27
+ 'container-site': string;
28
+ 'layout-measure-control': string;
29
+ };
30
+ export const layoutsUtilities: {
31
+ 'layout-field-control': {
32
+ '&:not(#\\#)': {
33
+ display: string;
34
+ flex: string;
35
+ 'justify-content': string;
36
+ 'max-width': string;
37
+ };
38
+ };
39
+ 'layout-boundary': {
40
+ 'padding-inline': string;
41
+ 'padding-block-start': string;
42
+ 'padding-block-end': string;
43
+ };
44
+ 'layout-boundary-inline': {
45
+ 'padding-inline': string;
46
+ };
47
+ 'layout-section-start': {
48
+ 'margin-block-start': string;
49
+ '&:first-child': {
50
+ 'margin-block-start': string;
51
+ };
52
+ };
53
+ 'layout-group-start': {
54
+ 'margin-block-start': string;
55
+ '&:first-child': {
56
+ 'margin-block-start': string;
57
+ };
58
+ };
59
+ };
60
+ declare namespace _default {
61
+ export { layoutsData };
62
+ export { layoutsUtilities };
63
+ }
64
+ export default _default;
65
+ //# sourceMappingURL=layouts.data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layouts.data.d.ts","sourceRoot":"","sources":["layouts.data.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH;;;;;;;;;;;;;EAgHC;AAmDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqGC"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Layout tokens — the console's container system.
3
+ *
4
+ * Three decisions, expressed once: how far content sits from the app chrome
5
+ * (BOUNDARY), how far things sit from each other (RHYTHM), and how wide a reading
6
+ * column may get (MEASURE).
7
+ *
8
+ * A DERIVED GROUP: every value here is a `var()` reference to `--spacing-*` /
9
+ * `--container-*`. Never write a literal length in this file. That indirection is the
10
+ * whole point — the spacing scale is already fluid (`--spacing-lg` is 1rem, then
11
+ * 1.5rem from `sm`), and `var()` is substituted at USE time on the element, so a
12
+ * layout token follows the breakpoint override without owning a breakpoint map of its
13
+ * own. Giving these their own maps would duplicate the spacing scale into layout and
14
+ * let the two drift.
15
+ */
16
+ export const layoutsData = {
17
+ // BOUNDARY — content ↔ app chrome.
18
+ 'layout-boundary-inline': 'var(--spacing-lg)',
19
+ 'layout-boundary-end': 'var(--spacing-lg)',
20
+ 'layout-boundary-start': 'var(--spacing-lg)',
21
+
22
+ /*
23
+ * RHYTHM — two levels, nothing else.
24
+ *
25
+ * THE PAGE SHAPE. The page stack never carries a vertical `gap`. It holds the
26
+ * heading and ONE element below it, and that element carries the BAND step:
27
+ *
28
+ * <div class="layout-column layout-boundary flex min-w-0 flex-col">
29
+ * <PageHeading />
30
+ * <section class="layout-section-start flex flex-col
31
+ * gap-(--layout-section-gap)"> the bands
32
+ * <section class="flex flex-col gap-(--layout-group-gap)">…</section>
33
+ * <form class="flex flex-col gap-(--layout-group-gap)">…</form>
34
+ * </section>
35
+ * </div>
36
+ *
37
+ * So there are exactly three levels, each owning one decision: the BOUNDARY sets the
38
+ * page's top inset, the PARENT SECTION spaces the sections inside it with
39
+ * --layout-section-gap, and each of those sections spaces its own parts with
40
+ * --layout-group-gap (its title over its card, its controls over the table they
41
+ * narrow). Every page carries the parent section, whether it holds one section or
42
+ * seven, so the shape is the same to read and a second section needs no rework.
43
+ *
44
+ * TWO TOKENS, TUNED SEPARATELY. The space above the first section belongs to the
45
+ * BOUNDARY (--layout-boundary-start) and the space between sections belongs to the
46
+ * PARENT (--layout-section-gap), so either moves without the other. Today the
47
+ * section step is one stop larger than the boundary step: the page opens tight under
48
+ * its heading and then separates its sections more firmly than the parts inside any
49
+ * one of them. Retune either here and every page follows — no page restates a step.
50
+ *
51
+ * A `gap` is right on the parent section and inside a section, and wrong on the page
52
+ * stack: within the parent every child IS a section, so one rule spaces them all; on
53
+ * the page stack the heading and the parent are different kinds of thing.
54
+ * `.layout-group-start` covers the one case a parent cannot: a group whose parts are
55
+ * already direct siblings of the page stack.
56
+ */
57
+ 'layout-section-gap': 'var(--spacing-xl)', // between sections of a parent
58
+ 'layout-group-gap': 'var(--spacing-md)', // within a band
59
+
60
+ /*
61
+ * MEASURE — the widest a page column may get, by context. Five values, because the
62
+ * reason a column is capped differs with how wide its payload actually is.
63
+ *
64
+ * DATA pages (lists, detail dashboards) are capped so a table that runs to the
65
+ * viewport edge on an ultrawide screen doesn't put its row actions a head-turn away
66
+ * from the name that identifies the row. They still want every pixel they can get:
67
+ * more columns visible is the point.
68
+ *
69
+ * FOCUSED pages (home, the create flows) are one task, but that task still goes
70
+ * multi-column — home is a rail plus a card grid — so they stay wide enough for
71
+ * those bands to breathe, and no wider.
72
+ *
73
+ * FORM pages (settings, in-page edit forms) are a single stacked column of fields.
74
+ * Past ~1200px the extra width lands entirely inside the controls: a label sits at
75
+ * the far left of a 1600px row from the input it names, and the eye has to travel
76
+ * the whole measure to pair them.
77
+ *
78
+ * DOCS pages are the one column capped by TYPOGRAPHY rather than by layout. Prose is
79
+ * read line by line, and past ~90 characters the eye loses the start of the next line
80
+ * on the return sweep — a limit that has nothing to do with how wide the payload is,
81
+ * which is why it is far tighter than every other measure here and why it does not
82
+ * move when a rail collapses and frees up room. A docs page is already flanked by two
83
+ * rails; this caps what is between them.
84
+ */
85
+ 'layout-measure': 'var(--container-7xl)', // 1620px — data pages
86
+ 'layout-measure-focused': 'var(--container-4xl)', // 1024px — home
87
+ 'layout-measure-form': 'var(--container-4xl)', // 1024px — settings, forms
88
+ 'layout-measure-form-create': 'var(--container-5xl)', // 1192px — create flows
89
+ 'layout-measure-docs': 'var(--container-4xl)', // 1192px — documentation prose
90
+
91
+ /*
92
+ * MEASURE (site) — the marketing site's content column, and the one measure in this
93
+ * file that is not a console page's.
94
+ *
95
+ * The azion.com pages are a single vertical frame: the nav bar, the hero's inner
96
+ * column, every section below it and the footer all sit on the SAME centred column,
97
+ * and the border-x that runs down the page is only continuous because those four
98
+ * agree to the pixel. That is why this is a token rather than a width re-typed per
99
+ * band — the frame is one decision, and one place is where it has to live.
100
+ *
101
+ * It is `5xl` (1192px) — a rung of the shared container ladder
102
+ * (primitives/shape/container.js), not a number chosen for this page. The page snaps
103
+ * to the scale, the scale does not bend to the page, which is the same rule
104
+ * --layout-measure follows. It is its own token rather than a reference to one of the
105
+ * console measures because the two answer different questions: a console measure caps
106
+ * a payload (a table, a form), while this one is the width of a FRAME whose four bands
107
+ * have to line up. Retuning either must not move the other.
108
+ */
109
+ 'container-site': 'var(--container-5xl)', // 1192px — the marketing site column
110
+ /*
111
+ * MEASURE (control) — the widest the *right side* of an item-group field row may
112
+ * get. An ItemGroup row is two columns: the content names the field (title +
113
+ * guidance) on the left, the actions hold the control on the right. That right side
114
+ * is `flex-1` + `justify-end`, so this cap is what decides where the control
115
+ * actually sits — raise it and the control grows leftward, toward the label that
116
+ * names it; lower it and the control pins to the right edge with the gap opening up
117
+ * in between.
118
+ *
119
+ * The default is deliberately tight: a settings row reads as "name → current value",
120
+ * and a narrow value column keeps a scannable right edge down the whole card. A
121
+ * create form inverts that priority — the fields ARE the page's payload, several are
122
+ * radio blocks carrying their own descriptions, and the user is filling them in
123
+ * rather than scanning them — so the create band opens this up (see
124
+ * `.layout-form-create`). One token, retuned per band, instead of the cap being
125
+ * re-typed on every row.
126
+ */
127
+ 'layout-measure-control': 'var(--container-3xs)' // 256px — settings rows
128
+ }
129
+
130
+ /*
131
+ * --layout-column-measure is deliberately NOT a token: it is a per-class local that
132
+ * each column utility declares and the shared geometry below reads, so a fifth column
133
+ * class inherits the whole behaviour by naming one measure.
134
+ */
135
+ const COLUMN_MEASURE = {
136
+ 'layout-column': 'var(--layout-measure)',
137
+ 'layout-column-focused': 'var(--layout-measure-focused)',
138
+ 'layout-column-form': 'var(--layout-measure-form)',
139
+ 'layout-form-create': 'var(--layout-measure-form-create)',
140
+ 'layout-column-docs': 'var(--layout-measure-docs)'
141
+ }
142
+
143
+ /**
144
+ * A centered column at the measure — every page carries one of these, list pages
145
+ * included. Full-bleed is the absence of all five classes, not a `w-full`.
146
+ *
147
+ * THE BOUNDARY IS NOT PART OF THE MEASURE. A `padded` page gets its boundary from the
148
+ * app shell, on the scroll box OUTSIDE the capped block, so the measure lands as
149
+ * CONTENT width. A page that carries the boundary ITSELF puts it on the same block as
150
+ * the measure, and there `box-sizing: border-box` makes the cap swallow the inset:
151
+ * 1620px of cap minus 24px a side is a 1572px content column, 48px narrower than the
152
+ * same measure gives a padded page. That is the measure describing something other
153
+ * than content, which is the one job it has.
154
+ *
155
+ * So when the boundary rides along, the cap grows by exactly the inset it now
156
+ * contains, and both shapes resolve to the same content column at every viewport.
157
+ * Which means a page can gain or lose its own boundary — pick up a tab bar, drop one,
158
+ * move from padded to self-padded — without moving a pixel.
159
+ *
160
+ * The widening nests HERE, on the column, rather than on the boundary utilities.
161
+ * Specificity is (0,2,0) either way, so correctness does not decide it; three things
162
+ * do. Both declarations that can set `max-width` stay in one block, in reading order.
163
+ * `.layout-boundary` stays what its name says — three padding declarations — instead
164
+ * of shipping a four-way `:is()` into every consumer that uses it with no column
165
+ * anywhere. And a fifth column class still costs one line, because these are generated
166
+ * from COLUMN_MEASURE and the nested rule comes along with it.
167
+ */
168
+ const columnUtility = (measure, extra) => ({
169
+ '--layout-column-measure': measure,
170
+ ...extra,
171
+ 'margin-inline': 'auto',
172
+ width: '100%',
173
+ 'max-width': 'var(--layout-column-measure)',
174
+ '&:is(.layout-boundary, .layout-boundary-inline)': {
175
+ 'max-width': 'calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline))'
176
+ }
177
+ })
178
+
179
+ export const layoutsUtilities = {
180
+ /*
181
+ * The page boundary. Padding, never margin: a top margin on an `h-full` child of a
182
+ * padded scroll box overflows by exactly the margin (h-full resolves against the
183
+ * parent's content box, the margin sits outside it) and the overflow lands as a
184
+ * silent clip at the bottom of a table.
185
+ */
186
+ 'layout-boundary': {
187
+ 'padding-inline': 'var(--layout-boundary-inline)',
188
+ 'padding-block-start': 'var(--layout-boundary-start)',
189
+ 'padding-block-end': 'var(--layout-boundary-end)'
190
+ },
191
+
192
+ /*
193
+ * The inline half of the boundary, alone — for a band that takes the page's side
194
+ * inset but owns its own vertical padding: a create flow's sticky action bar, whose
195
+ * `py` is a bar height, not a page boundary. Naming it is what lets the MEASURE rule
196
+ * above see a self-inset band and treat it exactly like the scrolling body it sits
197
+ * under, which is the whole point of a sticky bar.
198
+ */
199
+ 'layout-boundary-inline': {
200
+ 'padding-inline': 'var(--layout-boundary-inline)'
201
+ },
202
+
203
+ /*
204
+ * The BOUNDARY step, as a margin — carried by the PARENT SECTION that sits directly
205
+ * below the heading. Exactly ONE element per page stack carries it. Never put it on
206
+ * a section INSIDE the parent: `gap` and `margin` both apply in a flex column, so
207
+ * the two add up and that section lands at twice the step.
208
+ *
209
+ * The `:first-child` rule zeroes the margin when the element that carries it happens
210
+ * to render first (a page with no heading; a stack whose opening band is
211
+ * conditional) — the boundary's padding is that band's top space, so the class is
212
+ * safe to carry unconditionally. This is what makes the margin model safe when the
213
+ * band ABOVE is conditional: a module list renders its controls row only when it has
214
+ * rows, so on an empty account the empty-state band becomes the first child and
215
+ * opens at exactly the boundary step. `v-if` bands are absent from the DOM, so
216
+ * `:first-child` reads the rendered truth.
217
+ *
218
+ * `margin-block-start` (not `margin-top`) to stay on the logical axis the boundary
219
+ * tokens use. Safe here because these stacks are flex containers, where a child's
220
+ * margin never collapses out of its parent.
221
+ */
222
+ 'layout-section-start': {
223
+ 'margin-block-start': 'var(--layout-boundary-start)',
224
+ '&:first-child': { 'margin-block-start': '0' }
225
+ },
226
+
227
+ /*
228
+ * The GROUP step, as a margin — the fallback for a group whose parts are already
229
+ * direct siblings of the page stack, where a wrapper is the wrong answer. The band
230
+ * element normally IS that wrapper (`gap: var(--layout-group-gap)`), and that is the
231
+ * form to prefer: it names the group in the markup.
232
+ */
233
+ 'layout-group-start': {
234
+ 'margin-block-start': 'var(--layout-group-gap)',
235
+ '&:first-child': { 'margin-block-start': '0' }
236
+ },
237
+
238
+ ...Object.fromEntries(
239
+ Object.entries(COLUMN_MEASURE).map(([name, measure]) => [
240
+ name,
241
+ columnUtility(
242
+ measure,
243
+ // The create band retunes the control cap for everything inside it. On a
244
+ // 1192px column a 256px control side left every input pinned to the far right,
245
+ // a head-turn away from the label naming it; 472px pulls the control back
246
+ // toward its label and gives the radio blocks room to read.
247
+ name === 'layout-form-create' ? { '--layout-measure-control': 'var(--container-md)' } : undefined
248
+ )
249
+ ])
250
+ ),
251
+
252
+ /*
253
+ * The control side of an item-group field row: the same geometry every settings row
254
+ * hand-repeated, with the cap coming from --layout-measure-control so a band retunes
255
+ * all of its rows at once.
256
+ *
257
+ * `flex-1` + `justify-end` rather than a fixed width: the row stays two-column at
258
+ * every viewport (the control side yields to a long field name instead of wrapping),
259
+ * and controls inside still pass `w-full` to fill the cap.
260
+ *
261
+ * THE `:not(#\#)` IS LOAD-BEARING, and it is the one place in this file that needs a
262
+ * specificity hack. This class is applied to a component whose own root already
263
+ * carries `shrink-0`, and Vue merges both class lists onto one element. As plain
264
+ * unlayered CSS this rule won this tie; as an `@utility` it sorts BEFORE the core
265
+ * utilities, so `shrink-0` would win and the control side could no longer yield to a
266
+ * long field name. `#\#` is an id no element can carry, so the selector always
267
+ * matches while reading (1,1,0) — Tailwind's own important-strategy idiom. It stays
268
+ * variant-safe (`.md\:layout-field-control:not(#\#)`), unlike an `&:is(…)` bump.
269
+ * Applied to this utility ONLY: the other eight have no live conflict, and the hack
270
+ * would needlessly outrank legitimate consumer overrides.
271
+ */
272
+ 'layout-field-control': {
273
+ '&:not(#\\#)': {
274
+ display: 'flex',
275
+ flex: '1 1 0%',
276
+ 'justify-content': 'flex-end',
277
+ 'max-width': 'var(--layout-measure-control)'
278
+ }
279
+ }
280
+ }
281
+
282
+ export default { layoutsData, layoutsUtilities }
@@ -104,6 +104,14 @@ export const textsData: {
104
104
  fontWeight: number;
105
105
  letterSpacing: string;
106
106
  };
107
+ 'text-body-code-sm': {
108
+ textWrapStyle: string;
109
+ fontFamily: string;
110
+ fontSize: string;
111
+ lineHeight: number;
112
+ fontWeight: number;
113
+ letterSpacing: string;
114
+ };
107
115
  'text-label-code-md': {
108
116
  fontFamily: string;
109
117
  fontSize: string;
@@ -123,33 +131,43 @@ export const textsData: {
123
131
  _: string;
124
132
  md: string;
125
133
  };
134
+ fontWeight: number;
126
135
  lineHeight: number;
127
136
  };
128
137
  'text-body-md': {
129
138
  fontSize: string;
139
+ fontWeight: number;
140
+ lineHeight: number;
141
+ };
142
+ 'text-body-prose-md': {
143
+ fontSize: string;
144
+ fontWeight: number;
130
145
  lineHeight: number;
131
146
  };
132
147
  'text-body-sm': {
133
148
  fontSize: string;
149
+ fontWeight: number;
134
150
  lineHeight: number;
135
151
  };
136
152
  'text-body-xs': {
137
153
  fontSize: string;
154
+ fontWeight: number;
138
155
  lineHeight: number;
139
156
  };
140
- 'text-tag-sm': {
157
+ 'text-body-xxs': {
141
158
  fontSize: string;
142
- lineHeight: number;
143
159
  fontWeight: number;
160
+ lineHeight: number;
144
161
  };
145
- 'text-tag-md': {
162
+ 'text-tag-sm': {
146
163
  fontSize: string;
147
164
  lineHeight: number;
148
165
  fontWeight: number;
149
166
  };
150
- 'text-body-xxs': {
167
+ 'text-tag-md': {
151
168
  fontSize: string;
152
169
  lineHeight: number;
170
+ fontWeight: number;
153
171
  };
154
172
  'text-overline-md': {
155
173
  fontFamily: string;
@@ -1 +1 @@
1
- {"version":3,"file":"texts.data.d.ts","sourceRoot":"","sources":["texts.data.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2JE,8FAA8F;;;;;;;;;;;;;;;;;;EAkB/F"}
1
+ {"version":3,"file":"texts.data.d.ts","sourceRoot":"","sources":["texts.data.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6KE,8FAA8F;;;;;;;;;;;;;;;;;;EAkB/F"}
@@ -98,6 +98,14 @@ export const textsData = {
98
98
  fontWeight: fontWeight.normal,
99
99
  letterSpacing: tracking.normal
100
100
  },
101
+ 'text-body-code-sm': {
102
+ textWrapStyle: 'pretty',
103
+ fontFamily: fontFamily.code,
104
+ fontSize: fontSize.xs,
105
+ lineHeight: leading.relaxed,
106
+ fontWeight: fontWeight.normal,
107
+ letterSpacing: tracking.normal
108
+ },
101
109
  'text-label-code-md': {
102
110
  fontFamily: fontFamily.code,
103
111
  fontSize: fontSize.sm,
@@ -114,33 +122,43 @@ export const textsData = {
114
122
  },
115
123
  'text-body-lg': {
116
124
  fontSize: { _: fontSize.base, md: fontSize.lg },
117
- lineHeight: leading.normal
125
+ fontWeight: fontWeight.normal,
126
+ lineHeight: leading.snug
118
127
  },
119
128
  'text-body-md': {
120
129
  fontSize: fontSize.base,
121
- lineHeight: leading.normal
130
+ fontWeight: fontWeight.normal,
131
+ lineHeight: leading.snug
132
+ },
133
+ 'text-body-prose-md': {
134
+ fontSize: fontSize.base,
135
+ fontWeight: fontWeight.normal,
136
+ lineHeight: leading.relaxed
122
137
  },
123
138
  'text-body-sm': {
124
139
  fontSize: fontSize.sm,
125
- lineHeight: leading.normal
140
+ fontWeight: fontWeight.normal,
141
+ lineHeight: leading.snug
126
142
  },
127
143
  'text-body-xs': {
128
144
  fontSize: fontSize.xs,
145
+ fontWeight: fontWeight.normal,
146
+ lineHeight: leading.snug
147
+ },
148
+ 'text-body-xxs': {
149
+ fontSize: fontSize.xs,
150
+ fontWeight: fontWeight.normal,
129
151
  lineHeight: leading.normal
130
152
  },
131
153
  'text-tag-sm': {
132
154
  fontSize: fontSize.xs,
133
155
  lineHeight: leading.tight,
134
- fontWeight: fontWeight.semibold
156
+ fontWeight: fontWeight.normal
135
157
  },
136
158
  'text-tag-md': {
137
159
  fontSize: fontSize.xs,
138
160
  lineHeight: leading.tight,
139
- fontWeight: fontWeight.semibold
140
- },
141
- 'text-body-xxs': {
142
- fontSize: fontSize.xs,
143
- lineHeight: leading.normal
161
+ fontWeight: fontWeight.normal
144
162
  },
145
163
  'text-overline-md': {
146
164
  fontFamily: fontFamily.display,
@@ -17,7 +17,7 @@
17
17
  * such as drawers, modals, and fixed headers.
18
18
  *
19
19
  * Values are intentionally small and well-spaced to make future additions
20
- * obvious. Consume as `z-[var(--z-input-*)]` in components — do not
20
+ * obvious. Consume as `z-(--z-input-*)` in components — do not
21
21
  * introduce ad-hoc numeric z-index in input `.vue` files.
22
22
  */
23
23
  export const zIndicesData: {
@@ -17,7 +17,7 @@
17
17
  * such as drawers, modals, and fixed headers.
18
18
  *
19
19
  * Values are intentionally small and well-spaced to make future additions
20
- * obvious. Consume as `z-[var(--z-input-*)]` in components — do not
20
+ * obvious. Consume as `z-(--z-input-*)` in components — do not
21
21
  * introduce ad-hoc numeric z-index in input `.vue` files.
22
22
  */
23
23
 
@@ -1,15 +1,37 @@
1
1
  import { tokenRef } from '../../scripts/refs.js'
2
2
 
3
+ // The neutral rules are OPAQUE steps of the surface palette, not alpha.
4
+ //
5
+ // They used to be `alpha.black.100` / `alpha.white.100` / `alpha.white.50`, which meant one
6
+ // token painted a different colour on every backdrop — the same hairline read four different
7
+ // ways across canvas / surface / raised / overlay — and two rules meeting composited into a
8
+ // brighter line, so any stacked or abutting border doubled. An opaque step gives a rule one
9
+ // identity wherever it is drawn, and makes overlap a no-op.
10
+ //
11
+ // The steps are ones added to fill the ramp's gaps (`gray.150` / `gray.250` / `gray.750` /
12
+ // `gray.775`), NOT the steps that bracket them — `surface-200` (light) and `surface-800` (dark)
13
+ // are what `--bg-selected` and `--bg-disabled` already use, so a border drawn there is exactly
14
+ // its own fill and vanishes. Every pairing a component can produce now clears zero:
15
+ // light default surface-250 vs canvas 32 · surface 37 · selected/disabled 11
16
+ // light muted surface-150 vs canvas 14 · surface 19 · selected/disabled 7
17
+ // dark default surface-750 vs canvas 43 · surface 33 · raised 23 · selected 17
18
+ // dark muted surface-775 vs canvas 36 · surface 26 · raised 16 · selected 10
19
+ //
20
+ // `muted` sits closer to the background than `default` in BOTH themes — lighter in light,
21
+ // darker in dark. It is a subtler rule, not a second default; it is drawn on `--bg-surface` /
22
+ // `--bg-canvas` (the segmented-button track, the tab-view list, a flow node), never on a
23
+ // selected or disabled fill, which is what lets the light step go as light as it does. Dark
24
+ // cannot go proportionally as subtle: `--bg-surface-raised` sits at 20 and would swallow it.
3
25
  export const border = {
4
26
  light: {
5
- 'border-default': tokenRef('primitives.alpha.black.100'),
6
- 'border-muted': tokenRef('primitives.alpha.black.100'),
27
+ 'border-default': tokenRef('theme.surfaces.surface-250'),
28
+ 'border-muted': tokenRef('theme.surfaces.surface-150'),
7
29
  'border-strong': tokenRef('primitives.base.black'),
8
30
  'border-selected': tokenRef('brand.primary.primary-500')
9
31
  },
10
32
  dark: {
11
- 'border-default': tokenRef('primitives.alpha.white.100'),
12
- 'border-muted': tokenRef('primitives.alpha.white.50'),
33
+ 'border-default': tokenRef('theme.surfaces.surface-750'),
34
+ 'border-muted': tokenRef('theme.surfaces.surface-775'),
13
35
  'border-strong': tokenRef('primitives.base.white'),
14
36
  'border-selected': tokenRef('brand.primary.primary-500')
15
37
  }
@@ -16,9 +16,15 @@ declare const shared: {
16
16
  'surface-100': {
17
17
  __ref: any;
18
18
  };
19
+ 'surface-150': {
20
+ __ref: any;
21
+ };
19
22
  'surface-200': {
20
23
  __ref: any;
21
24
  };
25
+ 'surface-250': {
26
+ __ref: any;
27
+ };
22
28
  'surface-300': {
23
29
  __ref: any;
24
30
  };
@@ -34,6 +40,12 @@ declare const shared: {
34
40
  'surface-700': {
35
41
  __ref: any;
36
42
  };
43
+ 'surface-750': {
44
+ __ref: any;
45
+ };
46
+ 'surface-775': {
47
+ __ref: any;
48
+ };
37
49
  'surface-800': {
38
50
  __ref: any;
39
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["surfaces.js"],"names":[],"mappings":";;;;;;;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaC"}
1
+ {"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["surfaces.js"],"names":[],"mappings":";;;;;;;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBC"}
@@ -4,12 +4,16 @@ const shared = {
4
4
  'surface-0': tokenRef('primitives.base.white'),
5
5
  'surface-50': tokenRef('primitives.gray.50'),
6
6
  'surface-100': tokenRef('primitives.gray.100'),
7
+ 'surface-150': tokenRef('primitives.gray.150'),
7
8
  'surface-200': tokenRef('primitives.gray.200'),
9
+ 'surface-250': tokenRef('primitives.gray.250'),
8
10
  'surface-300': tokenRef('primitives.gray.300'),
9
11
  'surface-400': tokenRef('primitives.gray.400'),
10
12
  'surface-500': tokenRef('primitives.gray.500'),
11
13
  'surface-600': tokenRef('primitives.gray.600'),
12
14
  'surface-700': tokenRef('primitives.gray.700'),
15
+ 'surface-750': tokenRef('primitives.gray.750'),
16
+ 'surface-775': tokenRef('primitives.gray.775'),
13
17
  'surface-800': tokenRef('primitives.gray.800'),
14
18
  'surface-900': tokenRef('primitives.gray.900'),
15
19
  'surface-950': tokenRef('primitives.gray.950')
@@ -77,12 +77,16 @@ export namespace theme {
77
77
  let gray: {
78
78
  50: string;
79
79
  100: string;
80
+ 150: string;
80
81
  200: string;
82
+ 250: string;
81
83
  300: string;
82
84
  400: string;
83
85
  500: string;
84
86
  600: string;
85
87
  700: string;
88
+ 750: string;
89
+ 775: string;
86
90
  800: string;
87
91
  900: string;
88
92
  950: string;