@aziontech/theme 4.3.0 → 5.0.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/v4/globals.css +219 -22
- package/dist/v4/globals.scss +219 -22
- package/package.json +2 -1
- package/src/scripts/build-tokens.mjs +38 -1
- package/src/tokens/README.md +25 -1
- package/src/tokens/primitives/animations/animate.d.ts +4 -0
- package/src/tokens/primitives/animations/animate.d.ts.map +1 -1
- package/src/tokens/primitives/animations/animate.js +7 -1
- package/src/tokens/primitives/animations/keyframes.d.ts +9 -1
- package/src/tokens/primitives/animations/keyframes.d.ts.map +1 -1
- package/src/tokens/primitives/animations/keyframes.js +12 -2
- package/src/tokens/primitives/colors/colors.d.ts +4 -0
- package/src/tokens/primitives/colors/colors.d.ts.map +1 -1
- package/src/tokens/primitives/colors/colors.js +9 -0
- package/src/tokens/semantic/layouts.data.d.ts +71 -0
- package/src/tokens/semantic/layouts.data.d.ts.map +1 -0
- package/src/tokens/semantic/layouts.data.js +343 -0
- package/src/tokens/semantic/texts.data.d.ts +50 -4
- package/src/tokens/semantic/texts.data.d.ts.map +1 -1
- package/src/tokens/semantic/texts.data.js +67 -9
- package/src/tokens/semantic/z-indices.data.d.ts +1 -1
- package/src/tokens/semantic/z-indices.data.js +1 -1
- package/src/tokens/theme/border.js +26 -4
- package/src/tokens/theme/surfaces.d.ts +12 -0
- package/src/tokens/theme/surfaces.d.ts.map +1 -1
- package/src/tokens/theme/surfaces.js +4 -0
- package/src/tokens/theme.d.ts +4 -0
|
@@ -20,12 +20,16 @@ export namespace primitives {
|
|
|
20
20
|
export let gray: {
|
|
21
21
|
50: string;
|
|
22
22
|
100: string;
|
|
23
|
+
150: string;
|
|
23
24
|
200: string;
|
|
25
|
+
250: string;
|
|
24
26
|
300: string;
|
|
25
27
|
400: string;
|
|
26
28
|
500: string;
|
|
27
29
|
600: string;
|
|
28
30
|
700: string;
|
|
31
|
+
750: string;
|
|
32
|
+
775: string;
|
|
29
33
|
800: string;
|
|
30
34
|
900: string;
|
|
31
35
|
950: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["colors.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["colors.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCACuC,YAAY;sBAAZ,YAAY;sBAD7B,YAAY"}
|
|
@@ -21,15 +21,24 @@ export const primitives = {
|
|
|
21
21
|
900: '#001833',
|
|
22
22
|
950: '#000C1A'
|
|
23
23
|
},
|
|
24
|
+
// 250 / 750 / 775 fill the two widest gaps in the ramp so an OPAQUE neutral rule has a step
|
|
25
|
+
// to live on. The scale jumped 200 → 300 (229 → 178) and 700 → 800 (77 → 26), and the steps
|
|
26
|
+
// bracketing those gaps are already spoken for by background roles — which is why an opaque
|
|
27
|
+
// border landed exactly on `--bg-selected` / `--bg-disabled` and disappeared. 700 / 800 / 900
|
|
28
|
+
// are the dark background anchors and keep their values untouched.
|
|
24
29
|
gray: {
|
|
25
30
|
50: '#FAFAFA',
|
|
26
31
|
100: '#F5F5F5',
|
|
32
|
+
150: '#ECECEC',
|
|
27
33
|
200: '#E5E5E5',
|
|
34
|
+
250: '#DADADA',
|
|
28
35
|
300: '#B2B2B2',
|
|
29
36
|
400: '#999999',
|
|
30
37
|
500: '#808080',
|
|
31
38
|
600: '#666666',
|
|
32
39
|
700: '#4D4D4D',
|
|
40
|
+
750: '#2B2B2B',
|
|
41
|
+
775: '#242424',
|
|
33
42
|
800: '#1A1A1A',
|
|
34
43
|
900: '#141414',
|
|
35
44
|
950: '#0A0A0A'
|
|
@@ -0,0 +1,71 @@
|
|
|
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-content': string;
|
|
27
|
+
'layout-measure-site': string;
|
|
28
|
+
'layout-measure-site-header': string;
|
|
29
|
+
'layout-measure-control': string;
|
|
30
|
+
};
|
|
31
|
+
export const layoutsUtilities: {
|
|
32
|
+
'layout-column-site': {
|
|
33
|
+
'margin-inline': string;
|
|
34
|
+
width: string;
|
|
35
|
+
'max-width': string;
|
|
36
|
+
};
|
|
37
|
+
'layout-field-control': {
|
|
38
|
+
'&:not(#\\#)': {
|
|
39
|
+
display: string;
|
|
40
|
+
flex: string;
|
|
41
|
+
'justify-content': string;
|
|
42
|
+
'max-width': string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
'layout-boundary': {
|
|
46
|
+
'padding-inline': string;
|
|
47
|
+
'padding-block-start': string;
|
|
48
|
+
'padding-block-end': string;
|
|
49
|
+
};
|
|
50
|
+
'layout-boundary-inline': {
|
|
51
|
+
'padding-inline': string;
|
|
52
|
+
};
|
|
53
|
+
'layout-section-start': {
|
|
54
|
+
'margin-block-start': string;
|
|
55
|
+
'&:first-child': {
|
|
56
|
+
'margin-block-start': string;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
'layout-group-start': {
|
|
60
|
+
'margin-block-start': string;
|
|
61
|
+
'&:first-child': {
|
|
62
|
+
'margin-block-start': string;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
declare namespace _default {
|
|
67
|
+
export { layoutsData };
|
|
68
|
+
export { layoutsUtilities };
|
|
69
|
+
}
|
|
70
|
+
export default _default;
|
|
71
|
+
//# 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;;;;;;;;;;;;;;EAuIC;AAmDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2IC"}
|
|
@@ -0,0 +1,343 @@
|
|
|
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
|
+
* CONTENT pages are the one column capped by TYPOGRAPHY rather than by layout. Prose
|
|
79
|
+
* is read line by line, and past ~90 characters the eye loses the start of the next
|
|
80
|
+
* line on the return sweep — a limit that has nothing to do with how wide the payload
|
|
81
|
+
* is, 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 documentation page is already
|
|
83
|
+
* flanked by two rails; this caps what is between them.
|
|
84
|
+
*
|
|
85
|
+
* IT IS NAMED FOR THE PAYLOAD, NOT FOR THE SECTION. The cap is a line length, so every
|
|
86
|
+
* page whose payload is flowing copy takes it — documentation today, the blog and any
|
|
87
|
+
* other article page next — and none of them has to re-derive the same limit under a
|
|
88
|
+
* name that says "docs". By the same rule, a page inside the documentation that is NOT
|
|
89
|
+
* read line by line (its home, a directory of cards) takes a wider measure: what picks
|
|
90
|
+
* the column is the payload, never the URL.
|
|
91
|
+
*/
|
|
92
|
+
'layout-measure': 'var(--container-7xl)', // 1620px — data pages
|
|
93
|
+
'layout-measure-focused': 'var(--container-4xl)', // 1024px — home
|
|
94
|
+
'layout-measure-form': 'var(--container-4xl)', // 1024px — settings, forms
|
|
95
|
+
'layout-measure-form-create': 'var(--container-5xl)', // 1192px — create flows
|
|
96
|
+
'layout-measure-content': 'var(--container-3xl)', // 876px — prose columns (docs, blog)
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* MEASURE (site) — the marketing site's columns, and the only measures in this file
|
|
100
|
+
* that are not a console page's. There are TWO, because the page and the bar above it
|
|
101
|
+
* do not answer the same question.
|
|
102
|
+
*
|
|
103
|
+
* --layout-measure-site IS THE PAGE'S FRAME. The azion.com pages are a single
|
|
104
|
+
* vertical frame: the hero's inner column, every section below it, the docs home and
|
|
105
|
+
* the footer all sit on the SAME centred column, and the border-x that runs down the
|
|
106
|
+
* page is only continuous because they agree to the pixel. That is why this is a token
|
|
107
|
+
* rather than a width re-typed per band — the frame is one decision, and one place is
|
|
108
|
+
* where it has to live.
|
|
109
|
+
*
|
|
110
|
+
* --layout-measure-site-header IS THE BAR'S, AND IT IS DELIBERATELY ONE RUNG WIDER.
|
|
111
|
+
* A bar is chrome, not content: it carries the brand at one end of the window and the
|
|
112
|
+
* account actions at the other, held apart by a navigation region in the middle, so it
|
|
113
|
+
* wants the room a reading frame deliberately refuses. Held to the page's measure that
|
|
114
|
+
* middle region ran out of room on a laptop long before the page did. The bar is the
|
|
115
|
+
* ONE band allowed outside the frame, and it says so in a token of its own — which is
|
|
116
|
+
* also what keeps the exception reviewable in both directions: nobody widens the bar by
|
|
117
|
+
* retuning the page, and nobody widens the page by retuning the bar.
|
|
118
|
+
*
|
|
119
|
+
* The two part company only above the caps, and by a fixed step. Measured against the
|
|
120
|
+
* page frame: one shared inset up to 1280, 2px apart at 1440 (the frame has just
|
|
121
|
+
* capped), 82 at 1600, and a flat 92 from 1668 up, where the bar caps too — half the
|
|
122
|
+
* 232px between the two measures, less the boundary the bar keeps.
|
|
123
|
+
*
|
|
124
|
+
* Both are rungs of the shared container ladder (primitives/shape/container.js), not
|
|
125
|
+
* numbers chosen for a page. The page snaps to the scale, the scale does not bend to
|
|
126
|
+
* the page, which is the same rule --layout-measure follows. They are their own tokens
|
|
127
|
+
* rather than references to a console measure because the questions differ: a console
|
|
128
|
+
* measure caps a PAYLOAD (a table, a form), while these are the widths of a FRAME and
|
|
129
|
+
* of the chrome above it. Retuning any of the three must not move the others.
|
|
130
|
+
*/
|
|
131
|
+
'layout-measure-site': 'var(--container-6xl)', // 1388px — the marketing site column
|
|
132
|
+
'layout-measure-site-header': 'var(--container-7xl)', // 1620px — the site bar, one rung wider
|
|
133
|
+
/*
|
|
134
|
+
* MEASURE (control) — the widest the *right side* of an item-group field row may
|
|
135
|
+
* get. An ItemGroup row is two columns: the content names the field (title +
|
|
136
|
+
* guidance) on the left, the actions hold the control on the right. That right side
|
|
137
|
+
* is `flex-1` + `justify-end`, so this cap is what decides where the control
|
|
138
|
+
* actually sits — raise it and the control grows leftward, toward the label that
|
|
139
|
+
* names it; lower it and the control pins to the right edge with the gap opening up
|
|
140
|
+
* in between.
|
|
141
|
+
*
|
|
142
|
+
* The default is deliberately tight: a settings row reads as "name → current value",
|
|
143
|
+
* and a narrow value column keeps a scannable right edge down the whole card. A
|
|
144
|
+
* create form inverts that priority — the fields ARE the page's payload, several are
|
|
145
|
+
* radio blocks carrying their own descriptions, and the user is filling them in
|
|
146
|
+
* rather than scanning them — so the create band opens this up (see
|
|
147
|
+
* `.layout-form-create`). One token, retuned per band, instead of the cap being
|
|
148
|
+
* re-typed on every row.
|
|
149
|
+
*/
|
|
150
|
+
'layout-measure-control': 'var(--container-3xs)' // 256px — settings rows
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* --layout-column-measure is deliberately NOT a token: it is a per-class local that
|
|
155
|
+
* each column utility declares and the shared geometry below reads, so a fifth column
|
|
156
|
+
* class inherits the whole behaviour by naming one measure.
|
|
157
|
+
*/
|
|
158
|
+
const COLUMN_MEASURE = {
|
|
159
|
+
'layout-column': 'var(--layout-measure)',
|
|
160
|
+
'layout-column-focused': 'var(--layout-measure-focused)',
|
|
161
|
+
'layout-column-form': 'var(--layout-measure-form)',
|
|
162
|
+
'layout-form-create': 'var(--layout-measure-form-create)',
|
|
163
|
+
'layout-column-content': 'var(--layout-measure-content)'
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* A centered column at the measure — every page carries one of these, list pages
|
|
168
|
+
* included. Full-bleed is the absence of all five classes, not a `w-full`.
|
|
169
|
+
*
|
|
170
|
+
* THE BOUNDARY IS NOT PART OF THE MEASURE. A `padded` page gets its boundary from the
|
|
171
|
+
* app shell, on the scroll box OUTSIDE the capped block, so the measure lands as
|
|
172
|
+
* CONTENT width. A page that carries the boundary ITSELF puts it on the same block as
|
|
173
|
+
* the measure, and there `box-sizing: border-box` makes the cap swallow the inset:
|
|
174
|
+
* 1620px of cap minus 24px a side is a 1572px content column, 48px narrower than the
|
|
175
|
+
* same measure gives a padded page. That is the measure describing something other
|
|
176
|
+
* than content, which is the one job it has.
|
|
177
|
+
*
|
|
178
|
+
* So when the boundary rides along, the cap grows by exactly the inset it now
|
|
179
|
+
* contains, and both shapes resolve to the same content column at every viewport.
|
|
180
|
+
* Which means a page can gain or lose its own boundary — pick up a tab bar, drop one,
|
|
181
|
+
* move from padded to self-padded — without moving a pixel.
|
|
182
|
+
*
|
|
183
|
+
* The widening nests HERE, on the column, rather than on the boundary utilities.
|
|
184
|
+
* Specificity is (0,2,0) either way, so correctness does not decide it; three things
|
|
185
|
+
* do. Both declarations that can set `max-width` stay in one block, in reading order.
|
|
186
|
+
* `.layout-boundary` stays what its name says — three padding declarations — instead
|
|
187
|
+
* of shipping a four-way `:is()` into every consumer that uses it with no column
|
|
188
|
+
* anywhere. And a fifth column class still costs one line, because these are generated
|
|
189
|
+
* from COLUMN_MEASURE and the nested rule comes along with it.
|
|
190
|
+
*/
|
|
191
|
+
const columnUtility = (measure, extra) => ({
|
|
192
|
+
'--layout-column-measure': measure,
|
|
193
|
+
...extra,
|
|
194
|
+
'margin-inline': 'auto',
|
|
195
|
+
width: '100%',
|
|
196
|
+
'max-width': 'var(--layout-column-measure)',
|
|
197
|
+
'&:is(.layout-boundary, .layout-boundary-inline)': {
|
|
198
|
+
'max-width': 'calc(var(--layout-column-measure) + 2 * var(--layout-boundary-inline))'
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
export const layoutsUtilities = {
|
|
203
|
+
/*
|
|
204
|
+
* The page boundary. Padding, never margin: a top margin on an `h-full` child of a
|
|
205
|
+
* padded scroll box overflows by exactly the margin (h-full resolves against the
|
|
206
|
+
* parent's content box, the margin sits outside it) and the overflow lands as a
|
|
207
|
+
* silent clip at the bottom of a table.
|
|
208
|
+
*/
|
|
209
|
+
'layout-boundary': {
|
|
210
|
+
'padding-inline': 'var(--layout-boundary-inline)',
|
|
211
|
+
'padding-block-start': 'var(--layout-boundary-start)',
|
|
212
|
+
'padding-block-end': 'var(--layout-boundary-end)'
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* The inline half of the boundary, alone — for a band that takes the page's side
|
|
217
|
+
* inset but owns its own vertical padding: a create flow's sticky action bar, whose
|
|
218
|
+
* `py` is a bar height, not a page boundary. Naming it is what lets the MEASURE rule
|
|
219
|
+
* above see a self-inset band and treat it exactly like the scrolling body it sits
|
|
220
|
+
* under, which is the whole point of a sticky bar.
|
|
221
|
+
*/
|
|
222
|
+
'layout-boundary-inline': {
|
|
223
|
+
'padding-inline': 'var(--layout-boundary-inline)'
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
* The BOUNDARY step, as a margin — carried by the PARENT SECTION that sits directly
|
|
228
|
+
* below the heading. Exactly ONE element per page stack carries it. Never put it on
|
|
229
|
+
* a section INSIDE the parent: `gap` and `margin` both apply in a flex column, so
|
|
230
|
+
* the two add up and that section lands at twice the step.
|
|
231
|
+
*
|
|
232
|
+
* The `:first-child` rule zeroes the margin when the element that carries it happens
|
|
233
|
+
* to render first (a page with no heading; a stack whose opening band is
|
|
234
|
+
* conditional) — the boundary's padding is that band's top space, so the class is
|
|
235
|
+
* safe to carry unconditionally. This is what makes the margin model safe when the
|
|
236
|
+
* band ABOVE is conditional: a module list renders its controls row only when it has
|
|
237
|
+
* rows, so on an empty account the empty-state band becomes the first child and
|
|
238
|
+
* opens at exactly the boundary step. `v-if` bands are absent from the DOM, so
|
|
239
|
+
* `:first-child` reads the rendered truth.
|
|
240
|
+
*
|
|
241
|
+
* `margin-block-start` (not `margin-top`) to stay on the logical axis the boundary
|
|
242
|
+
* tokens use. Safe here because these stacks are flex containers, where a child's
|
|
243
|
+
* margin never collapses out of its parent.
|
|
244
|
+
*/
|
|
245
|
+
'layout-section-start': {
|
|
246
|
+
'margin-block-start': 'var(--layout-boundary-start)',
|
|
247
|
+
'&:first-child': { 'margin-block-start': '0' }
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
/*
|
|
251
|
+
* The GROUP step, as a margin — the fallback for a group whose parts are already
|
|
252
|
+
* direct siblings of the page stack, where a wrapper is the wrong answer. The band
|
|
253
|
+
* element normally IS that wrapper (`gap: var(--layout-group-gap)`), and that is the
|
|
254
|
+
* form to prefer: it names the group in the markup.
|
|
255
|
+
*/
|
|
256
|
+
'layout-group-start': {
|
|
257
|
+
'margin-block-start': 'var(--layout-group-gap)',
|
|
258
|
+
'&:first-child': { 'margin-block-start': '0' }
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
...Object.fromEntries(
|
|
262
|
+
Object.entries(COLUMN_MEASURE).map(([name, measure]) => [
|
|
263
|
+
name,
|
|
264
|
+
columnUtility(
|
|
265
|
+
measure,
|
|
266
|
+
// The create band retunes the control cap for everything inside it. On a
|
|
267
|
+
// 1192px column a 256px control side left every input pinned to the far right,
|
|
268
|
+
// a head-turn away from the label naming it; 472px pulls the control back
|
|
269
|
+
// toward its label and gives the radio blocks room to read.
|
|
270
|
+
name === 'layout-form-create'
|
|
271
|
+
? { '--layout-measure-control': 'var(--container-md)' }
|
|
272
|
+
: undefined
|
|
273
|
+
)
|
|
274
|
+
])
|
|
275
|
+
),
|
|
276
|
+
|
|
277
|
+
/*
|
|
278
|
+
* THE SITE FRAME — the marketing page's column, and the one column in this file whose
|
|
279
|
+
* cap is a FRAME width rather than a content width.
|
|
280
|
+
*
|
|
281
|
+
* IT IS INSET FROM THE WINDOW AT EVERY WIDTH, and that is the whole reason it exists as
|
|
282
|
+
* a utility. On a wide screen the inset is free: --layout-measure-site is narrower than
|
|
283
|
+
* the window, `margin-inline: auto` centres the column, and its rules read as the page's
|
|
284
|
+
* vertical frame with canvas either side. Below the cap that stops doing anything — the
|
|
285
|
+
* column becomes the window — and the two rules land ON the window edges, where a
|
|
286
|
+
* hairline is not a frame, it is a seam against the bezel. So the frame that organises
|
|
287
|
+
* the whole desktop layout simply ceased to exist on a phone, and the headline above it
|
|
288
|
+
* (which pads by the boundary) opened a boundary inside a rule drawn at x=0.
|
|
289
|
+
*
|
|
290
|
+
* ONE `min()` COVERS THE WHOLE RANGE, WITH NO BREAKPOINT. The cap is whichever binds
|
|
291
|
+
* first: the measure, or the window less a boundary a side. While the measure is the
|
|
292
|
+
* smaller the column is capped and centred and the boundary term is inert; once the
|
|
293
|
+
* window is narrower than the measure — precisely where the cap has stopped working —
|
|
294
|
+
* the boundary term takes over and IS the inset. The two mechanisms hand off to each
|
|
295
|
+
* other, so a phone gets the same framed column a desktop gets, one boundary in from
|
|
296
|
+
* each edge.
|
|
297
|
+
*
|
|
298
|
+
* NO PADDING, DELIBERATELY. The inset belongs to the frame, not to the copy: the bands
|
|
299
|
+
* inside are grids whose `gap-px` rules have to reach the frame's own verticals, and a
|
|
300
|
+
* padding here would pull them off it. A band that wants its content inset too adds
|
|
301
|
+
* `layout-boundary-inline` on top (that is what SectionContainer's `padded` does).
|
|
302
|
+
*
|
|
303
|
+
* This is the shape /site/pricing worked out band by band and carried in a wrapper div;
|
|
304
|
+
* as a utility it is one element, pixel-identical at every width, and every other page
|
|
305
|
+
* and the footer get it by naming the column instead of re-deriving it.
|
|
306
|
+
*/
|
|
307
|
+
'layout-column-site': {
|
|
308
|
+
'margin-inline': 'auto',
|
|
309
|
+
width: '100%',
|
|
310
|
+
'max-width': 'min(var(--layout-measure-site), 100% - 2 * var(--layout-boundary-inline))'
|
|
311
|
+
},
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
* The control side of an item-group field row: the same geometry every settings row
|
|
315
|
+
* hand-repeated, with the cap coming from --layout-measure-control so a band retunes
|
|
316
|
+
* all of its rows at once.
|
|
317
|
+
*
|
|
318
|
+
* `flex-1` + `justify-end` rather than a fixed width: the row stays two-column at
|
|
319
|
+
* every viewport (the control side yields to a long field name instead of wrapping),
|
|
320
|
+
* and controls inside still pass `w-full` to fill the cap.
|
|
321
|
+
*
|
|
322
|
+
* THE `:not(#\#)` IS LOAD-BEARING, and it is the one place in this file that needs a
|
|
323
|
+
* specificity hack. This class is applied to a component whose own root already
|
|
324
|
+
* carries `shrink-0`, and Vue merges both class lists onto one element. As plain
|
|
325
|
+
* unlayered CSS this rule won this tie; as an `@utility` it sorts BEFORE the core
|
|
326
|
+
* utilities, so `shrink-0` would win and the control side could no longer yield to a
|
|
327
|
+
* long field name. `#\#` is an id no element can carry, so the selector always
|
|
328
|
+
* matches while reading (1,1,0) — Tailwind's own important-strategy idiom. It stays
|
|
329
|
+
* variant-safe (`.md\:layout-field-control:not(#\#)`), unlike an `&:is(…)` bump.
|
|
330
|
+
* Applied to this utility ONLY: the other eight have no live conflict, and the hack
|
|
331
|
+
* would needlessly outrank legitimate consumer overrides.
|
|
332
|
+
*/
|
|
333
|
+
'layout-field-control': {
|
|
334
|
+
'&:not(#\\#)': {
|
|
335
|
+
display: 'flex',
|
|
336
|
+
flex: '1 1 0%',
|
|
337
|
+
'justify-content': 'flex-end',
|
|
338
|
+
'max-width': 'var(--layout-measure-control)'
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export default { layoutsData, layoutsUtilities }
|
|
@@ -28,6 +28,34 @@ export const textsData: {
|
|
|
28
28
|
fontWeight: number;
|
|
29
29
|
fontFamily: string;
|
|
30
30
|
};
|
|
31
|
+
'text-amount-lg': {
|
|
32
|
+
textWrapStyle: string;
|
|
33
|
+
fontSize: {
|
|
34
|
+
_: string;
|
|
35
|
+
sm: string;
|
|
36
|
+
md: string;
|
|
37
|
+
};
|
|
38
|
+
lineHeight: number;
|
|
39
|
+
fontWeight: number;
|
|
40
|
+
letterSpacing: string;
|
|
41
|
+
};
|
|
42
|
+
'text-amount-md': {
|
|
43
|
+
textWrapStyle: string;
|
|
44
|
+
fontSize: {
|
|
45
|
+
_: string;
|
|
46
|
+
sm: string;
|
|
47
|
+
md: string;
|
|
48
|
+
};
|
|
49
|
+
lineHeight: number;
|
|
50
|
+
fontWeight: number;
|
|
51
|
+
letterSpacing: string;
|
|
52
|
+
};
|
|
53
|
+
'text-amount-sm': {
|
|
54
|
+
fontSize: string;
|
|
55
|
+
lineHeight: number;
|
|
56
|
+
fontWeight: number;
|
|
57
|
+
letterSpacing: string;
|
|
58
|
+
};
|
|
31
59
|
'text-heading-2xl': {
|
|
32
60
|
fontSize: {
|
|
33
61
|
_: string;
|
|
@@ -104,6 +132,14 @@ export const textsData: {
|
|
|
104
132
|
fontWeight: number;
|
|
105
133
|
letterSpacing: string;
|
|
106
134
|
};
|
|
135
|
+
'text-body-code-sm': {
|
|
136
|
+
textWrapStyle: string;
|
|
137
|
+
fontFamily: string;
|
|
138
|
+
fontSize: string;
|
|
139
|
+
lineHeight: number;
|
|
140
|
+
fontWeight: number;
|
|
141
|
+
letterSpacing: string;
|
|
142
|
+
};
|
|
107
143
|
'text-label-code-md': {
|
|
108
144
|
fontFamily: string;
|
|
109
145
|
fontSize: string;
|
|
@@ -123,33 +159,43 @@ export const textsData: {
|
|
|
123
159
|
_: string;
|
|
124
160
|
md: string;
|
|
125
161
|
};
|
|
162
|
+
fontWeight: number;
|
|
126
163
|
lineHeight: number;
|
|
127
164
|
};
|
|
128
165
|
'text-body-md': {
|
|
129
166
|
fontSize: string;
|
|
167
|
+
fontWeight: number;
|
|
168
|
+
lineHeight: number;
|
|
169
|
+
};
|
|
170
|
+
'text-body-prose-md': {
|
|
171
|
+
fontSize: string;
|
|
172
|
+
fontWeight: number;
|
|
130
173
|
lineHeight: number;
|
|
131
174
|
};
|
|
132
175
|
'text-body-sm': {
|
|
133
176
|
fontSize: string;
|
|
177
|
+
fontWeight: number;
|
|
134
178
|
lineHeight: number;
|
|
135
179
|
};
|
|
136
180
|
'text-body-xs': {
|
|
137
181
|
fontSize: string;
|
|
182
|
+
fontWeight: number;
|
|
138
183
|
lineHeight: number;
|
|
139
184
|
};
|
|
140
|
-
'text-
|
|
185
|
+
'text-body-xxs': {
|
|
141
186
|
fontSize: string;
|
|
142
|
-
lineHeight: number;
|
|
143
187
|
fontWeight: number;
|
|
188
|
+
lineHeight: number;
|
|
144
189
|
};
|
|
145
|
-
'text-tag-
|
|
190
|
+
'text-tag-sm': {
|
|
146
191
|
fontSize: string;
|
|
147
192
|
lineHeight: number;
|
|
148
193
|
fontWeight: number;
|
|
149
194
|
};
|
|
150
|
-
'text-
|
|
195
|
+
'text-tag-md': {
|
|
151
196
|
fontSize: string;
|
|
152
197
|
lineHeight: number;
|
|
198
|
+
fontWeight: number;
|
|
153
199
|
};
|
|
154
200
|
'text-overline-md': {
|
|
155
201
|
fontFamily: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texts.data.d.ts","sourceRoot":"","sources":["texts.data.js"],"names":[],"mappings":"AAwBA
|
|
1
|
+
{"version":3,"file":"texts.data.d.ts","sourceRoot":"","sources":["texts.data.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqNE,8FAA8F;;;;;;;;;;;;;;;;;;EAkB/F"}
|