@signal9/era-ui 32.0.0 → 33.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/CHANGELOG.md +24 -0
- package/dist/dev/audit-overlay.svelte +2 -2
- package/dist/era-ui.css +1 -1
- package/dist/generated-docs/utilities.json +99 -99
- package/dist/os/pane.svelte +3 -13
- package/dist/styles/index.css +2 -956
- package/dist/styles/typography.css +1 -1
- package/dist/styles/utilities/geometry.css +188 -0
- package/dist/styles/utilities/interaction.css +334 -0
- package/dist/styles/utilities/materials.css +39 -0
- package/dist/styles/utilities/public.css +391 -0
- package/dist/styles/utilities.css +5 -0
- package/dist/ui/card/card.svelte +2 -52
- package/dist/ui/card/card.svelte.d.ts +0 -43
- package/dist/ui/card/variants.d.ts +44 -0
- package/dist/ui/card/variants.js +20 -0
- package/dist/ui/context-menu/context-menu-checkbox-item.svelte +2 -4
- package/dist/ui/context-menu/context-menu-group-heading.svelte +2 -5
- package/dist/ui/context-menu/context-menu-item.svelte +2 -8
- package/dist/ui/context-menu/context-menu-radio-item.svelte +2 -8
- package/dist/ui/context-menu/context-menu-separator.svelte +2 -5
- package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -8
- package/dist/ui/dialog/dialog-header.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +2 -4
- package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +2 -5
- package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +2 -8
- package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +2 -8
- package/dist/ui/dropdown-menu/dropdown-menu-separator.svelte +2 -5
- package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -8
- package/dist/ui/menu-recipes.d.ts +6 -0
- package/dist/ui/menu-recipes.js +6 -0
- package/dist/ui/menubar/menubar-checkbox-item.svelte +2 -9
- package/dist/ui/menubar/menubar-group-heading.svelte +2 -5
- package/dist/ui/menubar/menubar-item.svelte +2 -8
- package/dist/ui/menubar/menubar-radio-item.svelte +2 -8
- package/dist/ui/menubar/menubar-separator.svelte +2 -5
- package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -8
- package/dist/ui/pane/pane-close.svelte +7 -26
- package/dist/ui/video-player/video-player.svelte +8 -8
- package/package.json +48 -12
- package/dist/docs/badge.md +0 -18
- package/dist/docs/bits-ui-audit.md +0 -58
- package/dist/docs/button.md +0 -19
- package/dist/docs/chip.md +0 -20
- package/dist/docs/component-docs-core.d.ts +0 -8
- package/dist/docs/component-docs-core.js +0 -73
- package/dist/docs/component-docs.d.ts +0 -2
- package/dist/docs/component-docs.js +0 -25
- package/dist/docs/component-source-scanners.d.ts +0 -18
- package/dist/docs/component-source-scanners.js +0 -46
- package/dist/docs/consumer-import.d.ts +0 -65
- package/dist/docs/consumer-import.js +0 -70
- package/dist/docs/css-utilities.d.ts +0 -58
- package/dist/docs/css-utilities.js +0 -317
- package/dist/docs/extract-props.d.ts +0 -13
- package/dist/docs/extract-props.js +0 -324
- package/dist/docs/generated-docs.d.ts +0 -6
- package/dist/docs/generated-docs.js +0 -30
- package/dist/docs/index.d.ts +0 -5
- package/dist/docs/index.js +0 -66
- package/dist/docs/notes.md +0 -83
- package/dist/docs/scroll-area.md +0 -7
- package/dist/docs/separator.md +0 -20
- package/dist/docs/table.md +0 -35
- package/dist/docs/utilities.d.ts +0 -4
- package/dist/docs/utilities.js +0 -15
- package/dist/generated-docs/accordion.md +0 -57
- package/dist/generated-docs/alert-dialog.md +0 -91
- package/dist/generated-docs/aspect-ratio.md +0 -17
- package/dist/generated-docs/avatar.md +0 -39
- package/dist/generated-docs/badge.md +0 -41
- package/dist/generated-docs/bar.md +0 -41
- package/dist/generated-docs/button-group.md +0 -19
- package/dist/generated-docs/button.md +0 -117
- package/dist/generated-docs/calendar.md +0 -126
- package/dist/generated-docs/card.md +0 -58
- package/dist/generated-docs/checkbox.md +0 -42
- package/dist/generated-docs/chip.md +0 -61
- package/dist/generated-docs/code-block.md +0 -20
- package/dist/generated-docs/collapsible.md +0 -30
- package/dist/generated-docs/combobox.md +0 -74
- package/dist/generated-docs/command-bar.md +0 -3
- package/dist/generated-docs/command.md +0 -126
- package/dist/generated-docs/context-menu.md +0 -104
- package/dist/generated-docs/copy-button.md +0 -29
- package/dist/generated-docs/cycle.md +0 -29
- package/dist/generated-docs/date-field.md +0 -49
- package/dist/generated-docs/date-picker.md +0 -180
- package/dist/generated-docs/date-range-field.md +0 -50
- package/dist/generated-docs/date-range-picker.md +0 -180
- package/dist/generated-docs/dialog.md +0 -94
- package/dist/generated-docs/draggable.md +0 -3
- package/dist/generated-docs/dropdown-menu.md +0 -104
- package/dist/generated-docs/file-upload.md +0 -18
- package/dist/generated-docs/getting-started.md +0 -3
- package/dist/generated-docs/input.md +0 -23
- package/dist/generated-docs/kv.md +0 -20
- package/dist/generated-docs/label.md +0 -17
- package/dist/generated-docs/link-preview.md +0 -40
- package/dist/generated-docs/llm-shell.md +0 -3
- package/dist/generated-docs/llms-full.txt +0 -5201
- package/dist/generated-docs/llms.txt +0 -138
- package/dist/generated-docs/logo.md +0 -24
- package/dist/generated-docs/manifest.json +0 -1685
- package/dist/generated-docs/measurements.md +0 -3
- package/dist/generated-docs/menu.md +0 -11
- package/dist/generated-docs/menubar.md +0 -104
- package/dist/generated-docs/meter.md +0 -101
- package/dist/generated-docs/mode.md +0 -24
- package/dist/generated-docs/nav.md +0 -73
- package/dist/generated-docs/navigation-menu.md +0 -11
- package/dist/generated-docs/notes.md +0 -87
- package/dist/generated-docs/os.md +0 -3
- package/dist/generated-docs/pagination.md +0 -55
- package/dist/generated-docs/pane.md +0 -34
- package/dist/generated-docs/pin-input.md +0 -31
- package/dist/generated-docs/popover.md +0 -43
- package/dist/generated-docs/progress.md +0 -17
- package/dist/generated-docs/radio-group.md +0 -31
- package/dist/generated-docs/range-calendar.md +0 -11
- package/dist/generated-docs/rating-group.md +0 -31
- package/dist/generated-docs/scroll-area.md +0 -65
- package/dist/generated-docs/select.md +0 -67
- package/dist/generated-docs/separator.md +0 -57
- package/dist/generated-docs/sheet.md +0 -11
- package/dist/generated-docs/skeleton.md +0 -18
- package/dist/generated-docs/slider.md +0 -71
- package/dist/generated-docs/spacing.md +0 -3
- package/dist/generated-docs/step.md +0 -51
- package/dist/generated-docs/surfaces.md +0 -3
- package/dist/generated-docs/switch.md +0 -18
- package/dist/generated-docs/table.md +0 -113
- package/dist/generated-docs/tabs.md +0 -48
- package/dist/generated-docs/text.md +0 -3
- package/dist/generated-docs/time-field.md +0 -49
- package/dist/generated-docs/time-range-field.md +0 -50
- package/dist/generated-docs/timeline.md +0 -32
- package/dist/generated-docs/todo.md +0 -3
- package/dist/generated-docs/toggle-group.md +0 -31
- package/dist/generated-docs/toggle.md +0 -20
- package/dist/generated-docs/toolbar.md +0 -11
- package/dist/generated-docs/tooltip.md +0 -40
- package/dist/generated-docs/tree.md +0 -36
- package/dist/generated-docs/utilities.md +0 -1236
- package/dist/generated-docs/video-player.md +0 -73
|
@@ -1,1685 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"entries": [
|
|
3
|
-
{
|
|
4
|
-
"slug": "getting-started",
|
|
5
|
-
"title": "Getting started",
|
|
6
|
-
"summary": "What era ui is — density, surface, corners, type, and colour as orthogonal axes.",
|
|
7
|
-
"tokenEstimate": 25,
|
|
8
|
-
"sections": [],
|
|
9
|
-
"file": "getting-started.md"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"slug": "todo",
|
|
13
|
-
"title": "Todo",
|
|
14
|
-
"summary": "An agent's plan board — a collapsible checklist whose header still shows the active item.",
|
|
15
|
-
"tokenEstimate": 25,
|
|
16
|
-
"sections": [],
|
|
17
|
-
"file": "todo.md"
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
"slug": "spacing",
|
|
21
|
-
"title": "Spacing",
|
|
22
|
-
"summary": "The sp-derived tier ladder — heights, insets, radii, concentricity.",
|
|
23
|
-
"tokenEstimate": 20,
|
|
24
|
-
"sections": [],
|
|
25
|
-
"file": "spacing.md"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"slug": "surfaces",
|
|
29
|
-
"title": "Surfaces",
|
|
30
|
-
"summary": "Every surface × corners rendered live for visual QA.",
|
|
31
|
-
"tokenEstimate": 17,
|
|
32
|
-
"sections": [],
|
|
33
|
-
"file": "surfaces.md"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"slug": "measurements",
|
|
37
|
-
"title": "Measurements",
|
|
38
|
-
"summary": "Every component measured as it renders — gaps, radii, and the laws they must obey.",
|
|
39
|
-
"tokenEstimate": 25,
|
|
40
|
-
"sections": [],
|
|
41
|
-
"file": "measurements.md"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"slug": "text",
|
|
45
|
-
"title": "Text",
|
|
46
|
-
"summary": "Copy-paste text styling — headings, prose, emphasis, and motion-aware links.",
|
|
47
|
-
"tokenEstimate": 22,
|
|
48
|
-
"sections": [],
|
|
49
|
-
"file": "text.md"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"slug": "utilities",
|
|
53
|
-
"title": "Utilities",
|
|
54
|
-
"summary": "The CSS classes era ships alongside the components — links, ink-centred text, shimmer, hidden scrollbars.",
|
|
55
|
-
"tokenEstimate": 13846,
|
|
56
|
-
"sections": [
|
|
57
|
-
"Overview",
|
|
58
|
-
"era-interactive",
|
|
59
|
-
"era-link",
|
|
60
|
-
"scrollbar-none",
|
|
61
|
-
"era-text-trim",
|
|
62
|
-
"truncate",
|
|
63
|
-
"era-text-trim-caps",
|
|
64
|
-
"era-ink-center",
|
|
65
|
-
"era-token-ink",
|
|
66
|
-
"era-label-ink",
|
|
67
|
-
"surface-backdrop",
|
|
68
|
-
"material-popover",
|
|
69
|
-
"material-panel",
|
|
70
|
-
"pressable",
|
|
71
|
-
"tier-icon · tier-pill · tier-chip · tier-control · tier-bar",
|
|
72
|
-
"h-line",
|
|
73
|
-
"era-track-well",
|
|
74
|
-
"era-skeleton-pulse",
|
|
75
|
-
"era-shimmer",
|
|
76
|
-
"era-collapse",
|
|
77
|
-
"h-icon · h-pill · h-chip · h-control · h-bar",
|
|
78
|
-
"min-h-icon · min-h-pill · min-h-chip · min-h-control · min-h-bar",
|
|
79
|
-
"w-icon · w-pill · w-chip · w-control · w-bar",
|
|
80
|
-
"min-w-icon · min-w-pill · min-w-chip · min-w-control · min-w-bar",
|
|
81
|
-
"size-icon · size-pill · size-chip · size-control · size-bar",
|
|
82
|
-
"px-pill · px-chip · pl-pill · pr-pill · pl-chip · pr-chip",
|
|
83
|
-
"p-section",
|
|
84
|
-
"duration-base",
|
|
85
|
-
"text-micro · text-lede · text-heading · text-title · text-display",
|
|
86
|
-
"text-body",
|
|
87
|
-
"leading-body",
|
|
88
|
-
"rounded-icon · rounded-pill · rounded-chip · rounded-control · rounded-bar · rounded-menu-item",
|
|
89
|
-
"shadow",
|
|
90
|
-
"shadow-sm · shadow-lg · shadow-well · shadow-pressed · shadow-highlight",
|
|
91
|
-
"bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)",
|
|
92
|
-
"p-gutter · px-gutter · py-gutter · gap-gutter · p-panel · px-panel · py-panel · gap-panel · … (24 in all)",
|
|
93
|
-
"p-inset-pill · px-inset-pill · py-inset-pill · gap-inset-pill · p-inset-chip · px-inset-chip · py-inset-chip · gap-inset-chip · … (12 in all)",
|
|
94
|
-
"p-icon-inset-pill · px-icon-inset-pill · py-icon-inset-pill · gap-icon-inset-pill · p-icon-inset-chip · px-icon-inset-chip · py-icon-inset-chip · gap-icon-inset-chip · … (40 in all)",
|
|
95
|
-
"p-glyph-icon · px-glyph-icon · py-glyph-icon · gap-glyph-icon · p-glyph-pill · px-glyph-pill · py-glyph-pill · gap-glyph-pill",
|
|
96
|
-
"bg-field · text-field · border-field · bg-field-highlight · text-field-highlight · border-field-highlight",
|
|
97
|
-
"ease-base",
|
|
98
|
-
"bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)",
|
|
99
|
-
"bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (39 in all)"
|
|
100
|
-
],
|
|
101
|
-
"file": "utilities.md"
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"slug": "draggable",
|
|
105
|
-
"title": "Draggable",
|
|
106
|
-
"summary": "Make any element draggable with @neodrag/svelte v3.",
|
|
107
|
-
"tokenEstimate": 17,
|
|
108
|
-
"sections": [],
|
|
109
|
-
"file": "draggable.md"
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"slug": "os",
|
|
113
|
-
"title": "OS Shell",
|
|
114
|
-
"summary": "Window manager, desktop, taskbar with command bar, notifications.",
|
|
115
|
-
"tokenEstimate": 20,
|
|
116
|
-
"sections": [],
|
|
117
|
-
"file": "os.md"
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"slug": "changelog",
|
|
121
|
-
"title": "Changelog",
|
|
122
|
-
"summary": "Release history — every version, grouped by change type.",
|
|
123
|
-
"tokenEstimate": 18,
|
|
124
|
-
"sections": [],
|
|
125
|
-
"file": "changelog.md"
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
"slug": "llm-shell",
|
|
129
|
-
"title": "LLM Shell",
|
|
130
|
-
"summary": "A full chat console — conversation rail, streaming, tools, swarms.",
|
|
131
|
-
"tokenEstimate": 20,
|
|
132
|
-
"sections": [],
|
|
133
|
-
"file": "llm-shell.md"
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
"slug": "notes",
|
|
137
|
-
"title": "Notes",
|
|
138
|
-
"summary": "A complete notes app — rich-text editor, slash commands, local persistence.",
|
|
139
|
-
"tokenEstimate": 1005,
|
|
140
|
-
"sections": [
|
|
141
|
-
"Usage",
|
|
142
|
-
"Peer dependencies",
|
|
143
|
-
"Props",
|
|
144
|
-
"Persistence",
|
|
145
|
-
"The heading index",
|
|
146
|
-
"Notes"
|
|
147
|
-
],
|
|
148
|
-
"file": "notes.md"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"slug": "aspect-ratio",
|
|
152
|
-
"title": "Aspect Ratio",
|
|
153
|
-
"summary": "Maintains a specified aspect ratio for content.",
|
|
154
|
-
"tokenEstimate": 84,
|
|
155
|
-
"sections": [
|
|
156
|
-
"Import",
|
|
157
|
-
"Props"
|
|
158
|
-
],
|
|
159
|
-
"file": "aspect-ratio.md"
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
"slug": "badge",
|
|
163
|
-
"title": "Badge",
|
|
164
|
-
"summary": "A small label for status or categorization.",
|
|
165
|
-
"tokenEstimate": 282,
|
|
166
|
-
"sections": [
|
|
167
|
-
"Import",
|
|
168
|
-
"Props",
|
|
169
|
-
"Usage",
|
|
170
|
-
"Notes"
|
|
171
|
-
],
|
|
172
|
-
"file": "badge.md"
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
"slug": "avatar",
|
|
176
|
-
"title": "Avatar",
|
|
177
|
-
"summary": "An image with optional initials/icon fallback.",
|
|
178
|
-
"tokenEstimate": 204,
|
|
179
|
-
"sections": [
|
|
180
|
-
"Import",
|
|
181
|
-
"Avatar.Root",
|
|
182
|
-
"Avatar.Image",
|
|
183
|
-
"Avatar.Fallback"
|
|
184
|
-
],
|
|
185
|
-
"file": "avatar.md"
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
"slug": "bar",
|
|
189
|
-
"title": "Bar",
|
|
190
|
-
"summary": "A flex container for toolbars and headers, in three heights.",
|
|
191
|
-
"tokenEstimate": 500,
|
|
192
|
-
"sections": [
|
|
193
|
-
"Import",
|
|
194
|
-
"Props"
|
|
195
|
-
],
|
|
196
|
-
"file": "bar.md"
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
"slug": "nav",
|
|
200
|
-
"title": "Nav",
|
|
201
|
-
"summary": "A navigation landmark and its items — the current one announces itself, and that announcement is what paints it.",
|
|
202
|
-
"tokenEstimate": 955,
|
|
203
|
-
"sections": [
|
|
204
|
-
"Import",
|
|
205
|
-
"Nav.Bar",
|
|
206
|
-
"Nav.Item"
|
|
207
|
-
],
|
|
208
|
-
"file": "nav.md"
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
"slug": "button",
|
|
212
|
-
"title": "Button",
|
|
213
|
-
"summary": "A flexible button or link element.",
|
|
214
|
-
"tokenEstimate": 1625,
|
|
215
|
-
"sections": [
|
|
216
|
-
"Import",
|
|
217
|
-
"Props",
|
|
218
|
-
"Usage",
|
|
219
|
-
"Notes"
|
|
220
|
-
],
|
|
221
|
-
"file": "button.md"
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
"slug": "button-group",
|
|
225
|
-
"title": "Button Group",
|
|
226
|
-
"summary": "Groups buttons with consistent spacing.",
|
|
227
|
-
"tokenEstimate": 111,
|
|
228
|
-
"sections": [
|
|
229
|
-
"Import",
|
|
230
|
-
"Props"
|
|
231
|
-
],
|
|
232
|
-
"file": "button-group.md"
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
"slug": "pane",
|
|
236
|
-
"title": "Pane",
|
|
237
|
-
"summary": "A draggable floating window with a handle bar.",
|
|
238
|
-
"tokenEstimate": 448,
|
|
239
|
-
"sections": [
|
|
240
|
-
"Import",
|
|
241
|
-
"Props"
|
|
242
|
-
],
|
|
243
|
-
"file": "pane.md"
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
"slug": "card",
|
|
247
|
-
"title": "Card",
|
|
248
|
-
"summary": "A surface container that can behave as a link or button.",
|
|
249
|
-
"tokenEstimate": 725,
|
|
250
|
-
"sections": [
|
|
251
|
-
"Import",
|
|
252
|
-
"Props"
|
|
253
|
-
],
|
|
254
|
-
"file": "card.md"
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
"slug": "chip",
|
|
258
|
-
"title": "Chip",
|
|
259
|
-
"summary": "An interactive, optionally dismissible token.",
|
|
260
|
-
"tokenEstimate": 593,
|
|
261
|
-
"sections": [
|
|
262
|
-
"Import",
|
|
263
|
-
"Props",
|
|
264
|
-
"Usage",
|
|
265
|
-
"Notes"
|
|
266
|
-
],
|
|
267
|
-
"file": "chip.md"
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
"slug": "code-block",
|
|
271
|
-
"title": "Code Block",
|
|
272
|
-
"summary": "A code snippet with optional copy button.",
|
|
273
|
-
"tokenEstimate": 110,
|
|
274
|
-
"sections": [
|
|
275
|
-
"Import",
|
|
276
|
-
"Props"
|
|
277
|
-
],
|
|
278
|
-
"file": "code-block.md"
|
|
279
|
-
},
|
|
280
|
-
{
|
|
281
|
-
"slug": "copy-button",
|
|
282
|
-
"title": "Copy Button",
|
|
283
|
-
"summary": "An icon button that copies text and cross-fades to a result glyph.",
|
|
284
|
-
"tokenEstimate": 347,
|
|
285
|
-
"sections": [
|
|
286
|
-
"Import",
|
|
287
|
-
"Props"
|
|
288
|
-
],
|
|
289
|
-
"file": "copy-button.md"
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"slug": "cycle",
|
|
293
|
-
"title": "Cycle",
|
|
294
|
-
"summary": "A single button that steps through an ordered set of states.",
|
|
295
|
-
"tokenEstimate": 315,
|
|
296
|
-
"sections": [
|
|
297
|
-
"Import",
|
|
298
|
-
"Props"
|
|
299
|
-
],
|
|
300
|
-
"file": "cycle.md"
|
|
301
|
-
},
|
|
302
|
-
{
|
|
303
|
-
"slug": "kv",
|
|
304
|
-
"title": "KV",
|
|
305
|
-
"summary": "A key-value pair display using Badge.",
|
|
306
|
-
"tokenEstimate": 113,
|
|
307
|
-
"sections": [
|
|
308
|
-
"Import",
|
|
309
|
-
"Props"
|
|
310
|
-
],
|
|
311
|
-
"file": "kv.md"
|
|
312
|
-
},
|
|
313
|
-
{
|
|
314
|
-
"slug": "separator",
|
|
315
|
-
"title": "Separator",
|
|
316
|
-
"summary": "A visual divider between content.",
|
|
317
|
-
"tokenEstimate": 531,
|
|
318
|
-
"sections": [
|
|
319
|
-
"Import",
|
|
320
|
-
"Props",
|
|
321
|
-
"Usage",
|
|
322
|
-
"Notes"
|
|
323
|
-
],
|
|
324
|
-
"file": "separator.md"
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
"slug": "sheet",
|
|
328
|
-
"title": "Sheet",
|
|
329
|
-
"summary": "A dialog anchored to a screen edge — a mobile drawer.",
|
|
330
|
-
"tokenEstimate": 51,
|
|
331
|
-
"sections": [
|
|
332
|
-
"Import"
|
|
333
|
-
],
|
|
334
|
-
"file": "sheet.md"
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
"slug": "skeleton",
|
|
338
|
-
"title": "Skeleton",
|
|
339
|
-
"summary": "A placeholder shimmer for loading states.",
|
|
340
|
-
"tokenEstimate": 98,
|
|
341
|
-
"sections": [
|
|
342
|
-
"Import",
|
|
343
|
-
"Props"
|
|
344
|
-
],
|
|
345
|
-
"file": "skeleton.md"
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
"slug": "switch",
|
|
349
|
-
"title": "Switch",
|
|
350
|
-
"summary": "A toggle switch control.",
|
|
351
|
-
"tokenEstimate": 83,
|
|
352
|
-
"sections": [
|
|
353
|
-
"Import",
|
|
354
|
-
"Props"
|
|
355
|
-
],
|
|
356
|
-
"file": "switch.md"
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
"slug": "toggle",
|
|
360
|
-
"title": "Toggle",
|
|
361
|
-
"summary": "A two-state toggle button.",
|
|
362
|
-
"tokenEstimate": 113,
|
|
363
|
-
"sections": [
|
|
364
|
-
"Import",
|
|
365
|
-
"Props"
|
|
366
|
-
],
|
|
367
|
-
"file": "toggle.md"
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
"slug": "accordion",
|
|
371
|
-
"title": "Accordion",
|
|
372
|
-
"summary": "Collapsible content sections.",
|
|
373
|
-
"tokenEstimate": 311,
|
|
374
|
-
"sections": [
|
|
375
|
-
"Import",
|
|
376
|
-
"Accordion.Root",
|
|
377
|
-
"Accordion.Item",
|
|
378
|
-
"Accordion.Header",
|
|
379
|
-
"Accordion.Trigger",
|
|
380
|
-
"Accordion.Content"
|
|
381
|
-
],
|
|
382
|
-
"file": "accordion.md"
|
|
383
|
-
},
|
|
384
|
-
{
|
|
385
|
-
"slug": "alert-dialog",
|
|
386
|
-
"title": "Alert Dialog",
|
|
387
|
-
"summary": "A modal confirmation before destructive actions.",
|
|
388
|
-
"tokenEstimate": 585,
|
|
389
|
-
"sections": [
|
|
390
|
-
"Import",
|
|
391
|
-
"AlertDialog.Root",
|
|
392
|
-
"AlertDialog.Trigger",
|
|
393
|
-
"AlertDialog.Content",
|
|
394
|
-
"AlertDialog.Overlay",
|
|
395
|
-
"AlertDialog.Title",
|
|
396
|
-
"AlertDialog.Description",
|
|
397
|
-
"AlertDialog.Cancel",
|
|
398
|
-
"AlertDialog.Action"
|
|
399
|
-
],
|
|
400
|
-
"file": "alert-dialog.md"
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
"slug": "calendar",
|
|
404
|
-
"title": "Calendar",
|
|
405
|
-
"summary": "A date picker calendar grid.",
|
|
406
|
-
"tokenEstimate": 753,
|
|
407
|
-
"sections": [
|
|
408
|
-
"Import",
|
|
409
|
-
"Calendar.Root",
|
|
410
|
-
"Calendar.Header",
|
|
411
|
-
"Calendar.Heading",
|
|
412
|
-
"Calendar.PrevButton",
|
|
413
|
-
"Calendar.NextButton",
|
|
414
|
-
"Calendar.Grid",
|
|
415
|
-
"Calendar.GridHead",
|
|
416
|
-
"Calendar.GridBody",
|
|
417
|
-
"Calendar.GridRow",
|
|
418
|
-
"Calendar.HeadCell",
|
|
419
|
-
"Calendar.Cell",
|
|
420
|
-
"Calendar.Day"
|
|
421
|
-
],
|
|
422
|
-
"file": "calendar.md"
|
|
423
|
-
},
|
|
424
|
-
{
|
|
425
|
-
"slug": "checkbox",
|
|
426
|
-
"title": "Checkbox",
|
|
427
|
-
"summary": "Toggleable check with indeterminate support.",
|
|
428
|
-
"tokenEstimate": 245,
|
|
429
|
-
"sections": [
|
|
430
|
-
"Import",
|
|
431
|
-
"Checkbox.Root",
|
|
432
|
-
"Checkbox.Group",
|
|
433
|
-
"Checkbox.GroupLabel"
|
|
434
|
-
],
|
|
435
|
-
"file": "checkbox.md"
|
|
436
|
-
},
|
|
437
|
-
{
|
|
438
|
-
"slug": "collapsible",
|
|
439
|
-
"title": "Collapsible",
|
|
440
|
-
"summary": "Show and hide content sections with a trigger.",
|
|
441
|
-
"tokenEstimate": 168,
|
|
442
|
-
"sections": [
|
|
443
|
-
"Import",
|
|
444
|
-
"Collapsible.Trigger",
|
|
445
|
-
"Collapsible.Content"
|
|
446
|
-
],
|
|
447
|
-
"file": "collapsible.md"
|
|
448
|
-
},
|
|
449
|
-
{
|
|
450
|
-
"slug": "combobox",
|
|
451
|
-
"title": "Combobox",
|
|
452
|
-
"summary": "Search and select from a filtered list of options.",
|
|
453
|
-
"tokenEstimate": 416,
|
|
454
|
-
"sections": [
|
|
455
|
-
"Import",
|
|
456
|
-
"Combobox.Input",
|
|
457
|
-
"Combobox.Trigger",
|
|
458
|
-
"Combobox.Content",
|
|
459
|
-
"Combobox.Item",
|
|
460
|
-
"Combobox.Empty",
|
|
461
|
-
"Combobox.Group",
|
|
462
|
-
"Combobox.GroupHeading"
|
|
463
|
-
],
|
|
464
|
-
"file": "combobox.md"
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
"slug": "command",
|
|
468
|
-
"title": "Command",
|
|
469
|
-
"summary": "A searchable command menu for quick navigation.",
|
|
470
|
-
"tokenEstimate": 779,
|
|
471
|
-
"sections": [
|
|
472
|
-
"Import",
|
|
473
|
-
"Command.Root",
|
|
474
|
-
"Command.Input",
|
|
475
|
-
"Command.List",
|
|
476
|
-
"Command.Viewport",
|
|
477
|
-
"Command.Empty",
|
|
478
|
-
"Command.Loading",
|
|
479
|
-
"Command.Group",
|
|
480
|
-
"Command.GroupHeading",
|
|
481
|
-
"Command.GroupItems",
|
|
482
|
-
"Command.Item",
|
|
483
|
-
"Command.LinkItem",
|
|
484
|
-
"Command.Separator"
|
|
485
|
-
],
|
|
486
|
-
"file": "command.md"
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
"slug": "command-bar",
|
|
490
|
-
"title": "Command Bar",
|
|
491
|
-
"summary": "Terminal-style prompt with ghost completion and drill-in views.",
|
|
492
|
-
"tokenEstimate": 20,
|
|
493
|
-
"sections": [],
|
|
494
|
-
"file": "command-bar.md"
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
"slug": "step",
|
|
498
|
-
"title": "Step",
|
|
499
|
-
"summary": "Expandable inline step — tool calls, thinking, agent actions.",
|
|
500
|
-
"tokenEstimate": 318,
|
|
501
|
-
"sections": [
|
|
502
|
-
"Import",
|
|
503
|
-
"Step.Root",
|
|
504
|
-
"Step.Summary",
|
|
505
|
-
"Step.Content",
|
|
506
|
-
"Step.Section"
|
|
507
|
-
],
|
|
508
|
-
"file": "step.md"
|
|
509
|
-
},
|
|
510
|
-
{
|
|
511
|
-
"slug": "context-menu",
|
|
512
|
-
"title": "Context Menu",
|
|
513
|
-
"summary": "Options and actions triggered by right-click.",
|
|
514
|
-
"tokenEstimate": 644,
|
|
515
|
-
"sections": [
|
|
516
|
-
"Import",
|
|
517
|
-
"ContextMenu.Root",
|
|
518
|
-
"ContextMenu.Trigger",
|
|
519
|
-
"ContextMenu.Content",
|
|
520
|
-
"ContextMenu.Item",
|
|
521
|
-
"ContextMenu.CheckboxItem",
|
|
522
|
-
"ContextMenu.RadioItem",
|
|
523
|
-
"ContextMenu.Separator",
|
|
524
|
-
"ContextMenu.SubTrigger",
|
|
525
|
-
"ContextMenu.SubContent",
|
|
526
|
-
"ContextMenu.GroupHeading"
|
|
527
|
-
],
|
|
528
|
-
"file": "context-menu.md"
|
|
529
|
-
},
|
|
530
|
-
{
|
|
531
|
-
"slug": "date-field",
|
|
532
|
-
"title": "Date Field",
|
|
533
|
-
"summary": "Segmented date input with keyboard navigation.",
|
|
534
|
-
"tokenEstimate": 270,
|
|
535
|
-
"sections": [
|
|
536
|
-
"Import",
|
|
537
|
-
"DateField.Root",
|
|
538
|
-
"DateField.Input",
|
|
539
|
-
"DateField.Segment",
|
|
540
|
-
"DateField.Label"
|
|
541
|
-
],
|
|
542
|
-
"file": "date-field.md"
|
|
543
|
-
},
|
|
544
|
-
{
|
|
545
|
-
"slug": "date-picker",
|
|
546
|
-
"title": "Date Picker",
|
|
547
|
-
"summary": "Date input with a calendar popover.",
|
|
548
|
-
"tokenEstimate": 1101,
|
|
549
|
-
"sections": [
|
|
550
|
-
"Import",
|
|
551
|
-
"DatePicker.Root",
|
|
552
|
-
"DatePicker.Label",
|
|
553
|
-
"DatePicker.Input",
|
|
554
|
-
"DatePicker.Segment",
|
|
555
|
-
"DatePicker.Trigger",
|
|
556
|
-
"DatePicker.Content",
|
|
557
|
-
"DatePicker.Calendar",
|
|
558
|
-
"DatePicker.Header",
|
|
559
|
-
"DatePicker.Heading",
|
|
560
|
-
"DatePicker.PrevButton",
|
|
561
|
-
"DatePicker.NextButton",
|
|
562
|
-
"DatePicker.Grid",
|
|
563
|
-
"DatePicker.GridHead",
|
|
564
|
-
"DatePicker.GridBody",
|
|
565
|
-
"DatePicker.GridRow",
|
|
566
|
-
"DatePicker.HeadCell",
|
|
567
|
-
"DatePicker.Cell",
|
|
568
|
-
"DatePicker.Day"
|
|
569
|
-
],
|
|
570
|
-
"file": "date-picker.md"
|
|
571
|
-
},
|
|
572
|
-
{
|
|
573
|
-
"slug": "date-range-field",
|
|
574
|
-
"title": "Date Range Field",
|
|
575
|
-
"summary": "Segmented start/end date input.",
|
|
576
|
-
"tokenEstimate": 298,
|
|
577
|
-
"sections": [
|
|
578
|
-
"Import",
|
|
579
|
-
"DateRangeField.Root",
|
|
580
|
-
"DateRangeField.Input",
|
|
581
|
-
"DateRangeField.Segment",
|
|
582
|
-
"DateRangeField.Label"
|
|
583
|
-
],
|
|
584
|
-
"file": "date-range-field.md"
|
|
585
|
-
},
|
|
586
|
-
{
|
|
587
|
-
"slug": "date-range-picker",
|
|
588
|
-
"title": "Date Range Picker",
|
|
589
|
-
"summary": "Date range input with a calendar popover.",
|
|
590
|
-
"tokenEstimate": 1174,
|
|
591
|
-
"sections": [
|
|
592
|
-
"Import",
|
|
593
|
-
"DateRangePicker.Root",
|
|
594
|
-
"DateRangePicker.Label",
|
|
595
|
-
"DateRangePicker.Input",
|
|
596
|
-
"DateRangePicker.Segment",
|
|
597
|
-
"DateRangePicker.Trigger",
|
|
598
|
-
"DateRangePicker.Content",
|
|
599
|
-
"DateRangePicker.Calendar",
|
|
600
|
-
"DateRangePicker.Header",
|
|
601
|
-
"DateRangePicker.Heading",
|
|
602
|
-
"DateRangePicker.PrevButton",
|
|
603
|
-
"DateRangePicker.NextButton",
|
|
604
|
-
"DateRangePicker.Grid",
|
|
605
|
-
"DateRangePicker.GridHead",
|
|
606
|
-
"DateRangePicker.GridBody",
|
|
607
|
-
"DateRangePicker.GridRow",
|
|
608
|
-
"DateRangePicker.HeadCell",
|
|
609
|
-
"DateRangePicker.Cell",
|
|
610
|
-
"DateRangePicker.Day"
|
|
611
|
-
],
|
|
612
|
-
"file": "date-range-picker.md"
|
|
613
|
-
},
|
|
614
|
-
{
|
|
615
|
-
"slug": "dialog",
|
|
616
|
-
"title": "Dialog",
|
|
617
|
-
"summary": "A modal window for content or user input.",
|
|
618
|
-
"tokenEstimate": 637,
|
|
619
|
-
"sections": [
|
|
620
|
-
"Import",
|
|
621
|
-
"Dialog.Root",
|
|
622
|
-
"Dialog.Trigger",
|
|
623
|
-
"Dialog.Content",
|
|
624
|
-
"Dialog.Overlay",
|
|
625
|
-
"Dialog.Title",
|
|
626
|
-
"Dialog.Description",
|
|
627
|
-
"Dialog.Close",
|
|
628
|
-
"Dialog.Header"
|
|
629
|
-
],
|
|
630
|
-
"file": "dialog.md"
|
|
631
|
-
},
|
|
632
|
-
{
|
|
633
|
-
"slug": "dropdown-menu",
|
|
634
|
-
"title": "Dropdown Menu",
|
|
635
|
-
"summary": "A menu of selectable items.",
|
|
636
|
-
"tokenEstimate": 652,
|
|
637
|
-
"sections": [
|
|
638
|
-
"Import",
|
|
639
|
-
"DropdownMenu.Root",
|
|
640
|
-
"DropdownMenu.Trigger",
|
|
641
|
-
"DropdownMenu.Content",
|
|
642
|
-
"DropdownMenu.Item",
|
|
643
|
-
"DropdownMenu.CheckboxItem",
|
|
644
|
-
"DropdownMenu.RadioItem",
|
|
645
|
-
"DropdownMenu.Separator",
|
|
646
|
-
"DropdownMenu.SubTrigger",
|
|
647
|
-
"DropdownMenu.SubContent",
|
|
648
|
-
"DropdownMenu.GroupHeading"
|
|
649
|
-
],
|
|
650
|
-
"file": "dropdown-menu.md"
|
|
651
|
-
},
|
|
652
|
-
{
|
|
653
|
-
"slug": "file-upload",
|
|
654
|
-
"title": "File Upload",
|
|
655
|
-
"summary": "A file input with click-to-browse and drag-and-drop.",
|
|
656
|
-
"tokenEstimate": 104,
|
|
657
|
-
"sections": [
|
|
658
|
-
"Import",
|
|
659
|
-
"Props"
|
|
660
|
-
],
|
|
661
|
-
"file": "file-upload.md"
|
|
662
|
-
},
|
|
663
|
-
{
|
|
664
|
-
"slug": "scroll-area",
|
|
665
|
-
"title": "Scroll Area",
|
|
666
|
-
"summary": "A cross-platform scroll container.",
|
|
667
|
-
"tokenEstimate": 401,
|
|
668
|
-
"sections": [
|
|
669
|
-
"Import",
|
|
670
|
-
"ScrollArea.Root",
|
|
671
|
-
"ScrollArea.Viewport",
|
|
672
|
-
"ScrollArea.Scrollbar",
|
|
673
|
-
"ScrollArea.Thumb",
|
|
674
|
-
"ScrollArea.Corner",
|
|
675
|
-
"Notes"
|
|
676
|
-
],
|
|
677
|
-
"file": "scroll-area.md"
|
|
678
|
-
},
|
|
679
|
-
{
|
|
680
|
-
"slug": "input",
|
|
681
|
-
"title": "Input",
|
|
682
|
-
"summary": "A text input field, with textarea variant.",
|
|
683
|
-
"tokenEstimate": 224,
|
|
684
|
-
"sections": [
|
|
685
|
-
"Import",
|
|
686
|
-
"Props"
|
|
687
|
-
],
|
|
688
|
-
"file": "input.md"
|
|
689
|
-
},
|
|
690
|
-
{
|
|
691
|
-
"slug": "link-preview",
|
|
692
|
-
"title": "Link Preview",
|
|
693
|
-
"summary": "Shows rich preview content when hovering a link.",
|
|
694
|
-
"tokenEstimate": 232,
|
|
695
|
-
"sections": [
|
|
696
|
-
"Import",
|
|
697
|
-
"LinkPreview.Root",
|
|
698
|
-
"LinkPreview.Trigger",
|
|
699
|
-
"LinkPreview.Content"
|
|
700
|
-
],
|
|
701
|
-
"file": "link-preview.md"
|
|
702
|
-
},
|
|
703
|
-
{
|
|
704
|
-
"slug": "label",
|
|
705
|
-
"title": "Label",
|
|
706
|
-
"summary": "Identifies or describes associated UI elements.",
|
|
707
|
-
"tokenEstimate": 77,
|
|
708
|
-
"sections": [
|
|
709
|
-
"Import",
|
|
710
|
-
"Props"
|
|
711
|
-
],
|
|
712
|
-
"file": "label.md"
|
|
713
|
-
},
|
|
714
|
-
{
|
|
715
|
-
"slug": "logo",
|
|
716
|
-
"title": "Logo",
|
|
717
|
-
"summary": "The signalnine dish mark, reactive to a state preset.",
|
|
718
|
-
"tokenEstimate": 178,
|
|
719
|
-
"sections": [
|
|
720
|
-
"Import",
|
|
721
|
-
"Props"
|
|
722
|
-
],
|
|
723
|
-
"file": "logo.md"
|
|
724
|
-
},
|
|
725
|
-
{
|
|
726
|
-
"slug": "menu",
|
|
727
|
-
"title": "Menu",
|
|
728
|
-
"summary": "Headless menu primitives re-exported from bits-ui.",
|
|
729
|
-
"tokenEstimate": 50,
|
|
730
|
-
"sections": [
|
|
731
|
-
"Import"
|
|
732
|
-
],
|
|
733
|
-
"file": "menu.md"
|
|
734
|
-
},
|
|
735
|
-
{
|
|
736
|
-
"slug": "menubar",
|
|
737
|
-
"title": "Menubar",
|
|
738
|
-
"summary": "A horizontal bar of dropdown menus.",
|
|
739
|
-
"tokenEstimate": 613,
|
|
740
|
-
"sections": [
|
|
741
|
-
"Import",
|
|
742
|
-
"Menubar.Root",
|
|
743
|
-
"Menubar.Trigger",
|
|
744
|
-
"Menubar.Content",
|
|
745
|
-
"Menubar.Item",
|
|
746
|
-
"Menubar.CheckboxItem",
|
|
747
|
-
"Menubar.RadioItem",
|
|
748
|
-
"Menubar.Separator",
|
|
749
|
-
"Menubar.SubTrigger",
|
|
750
|
-
"Menubar.SubContent",
|
|
751
|
-
"Menubar.GroupHeading"
|
|
752
|
-
],
|
|
753
|
-
"file": "menubar.md"
|
|
754
|
-
},
|
|
755
|
-
{
|
|
756
|
-
"slug": "meter",
|
|
757
|
-
"title": "Meter",
|
|
758
|
-
"summary": "Displays a value within a known range.",
|
|
759
|
-
"tokenEstimate": 1469,
|
|
760
|
-
"sections": [
|
|
761
|
-
"Import",
|
|
762
|
-
"Props"
|
|
763
|
-
],
|
|
764
|
-
"file": "meter.md"
|
|
765
|
-
},
|
|
766
|
-
{
|
|
767
|
-
"slug": "navigation-menu",
|
|
768
|
-
"title": "Navigation Menu",
|
|
769
|
-
"summary": "Headless navigation-menu primitives re-exported from bits-ui.",
|
|
770
|
-
"tokenEstimate": 60,
|
|
771
|
-
"sections": [
|
|
772
|
-
"Import"
|
|
773
|
-
],
|
|
774
|
-
"file": "navigation-menu.md"
|
|
775
|
-
},
|
|
776
|
-
{
|
|
777
|
-
"slug": "mode",
|
|
778
|
-
"title": "Mode",
|
|
779
|
-
"summary": "Scoped density / surface / corners override for any subtree.",
|
|
780
|
-
"tokenEstimate": 164,
|
|
781
|
-
"sections": [
|
|
782
|
-
"Import",
|
|
783
|
-
"Props"
|
|
784
|
-
],
|
|
785
|
-
"file": "mode.md"
|
|
786
|
-
},
|
|
787
|
-
{
|
|
788
|
-
"slug": "pagination",
|
|
789
|
-
"title": "Pagination",
|
|
790
|
-
"summary": "Enables users to navigate through a series of pages.",
|
|
791
|
-
"tokenEstimate": 374,
|
|
792
|
-
"sections": [
|
|
793
|
-
"Import",
|
|
794
|
-
"Pagination.Root",
|
|
795
|
-
"Pagination.Page",
|
|
796
|
-
"Pagination.PrevButton",
|
|
797
|
-
"Pagination.NextButton"
|
|
798
|
-
],
|
|
799
|
-
"file": "pagination.md"
|
|
800
|
-
},
|
|
801
|
-
{
|
|
802
|
-
"slug": "pin-input",
|
|
803
|
-
"title": "PIN Input",
|
|
804
|
-
"summary": "Enables users to input a sequence of one-character inputs.",
|
|
805
|
-
"tokenEstimate": 172,
|
|
806
|
-
"sections": [
|
|
807
|
-
"Import",
|
|
808
|
-
"PinInput.Root",
|
|
809
|
-
"PinInput.Cell"
|
|
810
|
-
],
|
|
811
|
-
"file": "pin-input.md"
|
|
812
|
-
},
|
|
813
|
-
{
|
|
814
|
-
"slug": "popover",
|
|
815
|
-
"title": "Popover",
|
|
816
|
-
"summary": "A floating panel anchored to a trigger.",
|
|
817
|
-
"tokenEstimate": 259,
|
|
818
|
-
"sections": [
|
|
819
|
-
"Import",
|
|
820
|
-
"Popover.Trigger",
|
|
821
|
-
"Popover.Content",
|
|
822
|
-
"Popover.Close"
|
|
823
|
-
],
|
|
824
|
-
"file": "popover.md"
|
|
825
|
-
},
|
|
826
|
-
{
|
|
827
|
-
"slug": "progress",
|
|
828
|
-
"title": "Progress",
|
|
829
|
-
"summary": "Shows the completion status of a task.",
|
|
830
|
-
"tokenEstimate": 75,
|
|
831
|
-
"sections": [
|
|
832
|
-
"Import",
|
|
833
|
-
"Props"
|
|
834
|
-
],
|
|
835
|
-
"file": "progress.md"
|
|
836
|
-
},
|
|
837
|
-
{
|
|
838
|
-
"slug": "range-calendar",
|
|
839
|
-
"title": "Range Calendar",
|
|
840
|
-
"summary": "Headless range-calendar primitives re-exported from bits-ui.",
|
|
841
|
-
"tokenEstimate": 59,
|
|
842
|
-
"sections": [
|
|
843
|
-
"Import"
|
|
844
|
-
],
|
|
845
|
-
"file": "range-calendar.md"
|
|
846
|
-
},
|
|
847
|
-
{
|
|
848
|
-
"slug": "radio-group",
|
|
849
|
-
"title": "Radio Group",
|
|
850
|
-
"summary": "Groups radio items for single selection.",
|
|
851
|
-
"tokenEstimate": 166,
|
|
852
|
-
"sections": [
|
|
853
|
-
"Import",
|
|
854
|
-
"RadioGroup.Root",
|
|
855
|
-
"RadioGroup.Item"
|
|
856
|
-
],
|
|
857
|
-
"file": "radio-group.md"
|
|
858
|
-
},
|
|
859
|
-
{
|
|
860
|
-
"slug": "rating-group",
|
|
861
|
-
"title": "Rating Group",
|
|
862
|
-
"summary": "A star-style single-choice rating input.",
|
|
863
|
-
"tokenEstimate": 168,
|
|
864
|
-
"sections": [
|
|
865
|
-
"Import",
|
|
866
|
-
"RatingGroup.Root",
|
|
867
|
-
"RatingGroup.Item"
|
|
868
|
-
],
|
|
869
|
-
"file": "rating-group.md"
|
|
870
|
-
},
|
|
871
|
-
{
|
|
872
|
-
"slug": "select",
|
|
873
|
-
"title": "Select",
|
|
874
|
-
"summary": "A dropdown select menu.",
|
|
875
|
-
"tokenEstimate": 376,
|
|
876
|
-
"sections": [
|
|
877
|
-
"Import",
|
|
878
|
-
"Select.Trigger",
|
|
879
|
-
"Select.Value",
|
|
880
|
-
"Select.Content",
|
|
881
|
-
"Select.Item",
|
|
882
|
-
"Select.Group",
|
|
883
|
-
"Select.GroupHeading"
|
|
884
|
-
],
|
|
885
|
-
"file": "select.md"
|
|
886
|
-
},
|
|
887
|
-
{
|
|
888
|
-
"slug": "slider",
|
|
889
|
-
"title": "Slider",
|
|
890
|
-
"summary": "Enables value selection from a continuous range.",
|
|
891
|
-
"tokenEstimate": 429,
|
|
892
|
-
"sections": [
|
|
893
|
-
"Import",
|
|
894
|
-
"Slider.Root",
|
|
895
|
-
"Slider.Range",
|
|
896
|
-
"Slider.Thumb",
|
|
897
|
-
"Slider.Tick",
|
|
898
|
-
"Slider.TickLabel",
|
|
899
|
-
"Slider.ThumbLabel"
|
|
900
|
-
],
|
|
901
|
-
"file": "slider.md"
|
|
902
|
-
},
|
|
903
|
-
{
|
|
904
|
-
"slug": "table",
|
|
905
|
-
"title": "Table",
|
|
906
|
-
"summary": "A tabular data display with rows, headers, and cells.",
|
|
907
|
-
"tokenEstimate": 733,
|
|
908
|
-
"sections": [
|
|
909
|
-
"Import",
|
|
910
|
-
"Table.Root",
|
|
911
|
-
"Table.Head",
|
|
912
|
-
"Table.Body",
|
|
913
|
-
"Table.Row",
|
|
914
|
-
"Table.HeadCell",
|
|
915
|
-
"Table.Cell",
|
|
916
|
-
"Usage",
|
|
917
|
-
"Notes"
|
|
918
|
-
],
|
|
919
|
-
"file": "table.md"
|
|
920
|
-
},
|
|
921
|
-
{
|
|
922
|
-
"slug": "tabs",
|
|
923
|
-
"title": "Tabs",
|
|
924
|
-
"summary": "Organizes content into tabbed sections.",
|
|
925
|
-
"tokenEstimate": 238,
|
|
926
|
-
"sections": [
|
|
927
|
-
"Import",
|
|
928
|
-
"Tabs.Root",
|
|
929
|
-
"Tabs.List",
|
|
930
|
-
"Tabs.Trigger",
|
|
931
|
-
"Tabs.Content"
|
|
932
|
-
],
|
|
933
|
-
"file": "tabs.md"
|
|
934
|
-
},
|
|
935
|
-
{
|
|
936
|
-
"slug": "time-field",
|
|
937
|
-
"title": "Time Field",
|
|
938
|
-
"summary": "Segmented time input with keyboard navigation.",
|
|
939
|
-
"tokenEstimate": 270,
|
|
940
|
-
"sections": [
|
|
941
|
-
"Import",
|
|
942
|
-
"TimeField.Root",
|
|
943
|
-
"TimeField.Input",
|
|
944
|
-
"TimeField.Segment",
|
|
945
|
-
"TimeField.Label"
|
|
946
|
-
],
|
|
947
|
-
"file": "time-field.md"
|
|
948
|
-
},
|
|
949
|
-
{
|
|
950
|
-
"slug": "time-range-field",
|
|
951
|
-
"title": "Time Range Field",
|
|
952
|
-
"summary": "Segmented start/end time input.",
|
|
953
|
-
"tokenEstimate": 298,
|
|
954
|
-
"sections": [
|
|
955
|
-
"Import",
|
|
956
|
-
"TimeRangeField.Root",
|
|
957
|
-
"TimeRangeField.Input",
|
|
958
|
-
"TimeRangeField.Segment",
|
|
959
|
-
"TimeRangeField.Label"
|
|
960
|
-
],
|
|
961
|
-
"file": "time-range-field.md"
|
|
962
|
-
},
|
|
963
|
-
{
|
|
964
|
-
"slug": "toggle-group",
|
|
965
|
-
"title": "Toggle Group",
|
|
966
|
-
"summary": "A set of toggle buttons with single or multiple selection.",
|
|
967
|
-
"tokenEstimate": 178,
|
|
968
|
-
"sections": [
|
|
969
|
-
"Import",
|
|
970
|
-
"ToggleGroup.Root",
|
|
971
|
-
"ToggleGroup.Item"
|
|
972
|
-
],
|
|
973
|
-
"file": "toggle-group.md"
|
|
974
|
-
},
|
|
975
|
-
{
|
|
976
|
-
"slug": "timeline",
|
|
977
|
-
"title": "Timeline",
|
|
978
|
-
"summary": "A staged progress bar where each segment's width is how long that step took.",
|
|
979
|
-
"tokenEstimate": 203,
|
|
980
|
-
"sections": [
|
|
981
|
-
"Import",
|
|
982
|
-
"Timeline.Root",
|
|
983
|
-
"Timeline.Step"
|
|
984
|
-
],
|
|
985
|
-
"file": "timeline.md"
|
|
986
|
-
},
|
|
987
|
-
{
|
|
988
|
-
"slug": "tree",
|
|
989
|
-
"title": "Tree",
|
|
990
|
-
"summary": "A disclosure hierarchy with real tree semantics — roving focus, and selection separate from expansion.",
|
|
991
|
-
"tokenEstimate": 303,
|
|
992
|
-
"sections": [
|
|
993
|
-
"Import",
|
|
994
|
-
"Tree.Root",
|
|
995
|
-
"Tree.Item"
|
|
996
|
-
],
|
|
997
|
-
"file": "tree.md"
|
|
998
|
-
},
|
|
999
|
-
{
|
|
1000
|
-
"slug": "toolbar",
|
|
1001
|
-
"title": "Toolbar",
|
|
1002
|
-
"summary": "Headless toolbar primitives re-exported from bits-ui.",
|
|
1003
|
-
"tokenEstimate": 53,
|
|
1004
|
-
"sections": [
|
|
1005
|
-
"Import"
|
|
1006
|
-
],
|
|
1007
|
-
"file": "toolbar.md"
|
|
1008
|
-
},
|
|
1009
|
-
{
|
|
1010
|
-
"slug": "video-player",
|
|
1011
|
-
"title": "Video Player",
|
|
1012
|
-
"summary": "A vidstack-powered player with support for MP4, HLS, and live streams.",
|
|
1013
|
-
"tokenEstimate": 1228,
|
|
1014
|
-
"sections": [
|
|
1015
|
-
"Import",
|
|
1016
|
-
"Props"
|
|
1017
|
-
],
|
|
1018
|
-
"file": "video-player.md"
|
|
1019
|
-
},
|
|
1020
|
-
{
|
|
1021
|
-
"slug": "tooltip",
|
|
1022
|
-
"title": "Tooltip",
|
|
1023
|
-
"summary": "Supplementary info on hover or focus.",
|
|
1024
|
-
"tokenEstimate": 214,
|
|
1025
|
-
"sections": [
|
|
1026
|
-
"Import",
|
|
1027
|
-
"Tooltip.Root",
|
|
1028
|
-
"Tooltip.Trigger",
|
|
1029
|
-
"Tooltip.Content"
|
|
1030
|
-
],
|
|
1031
|
-
"file": "tooltip.md"
|
|
1032
|
-
}
|
|
1033
|
-
],
|
|
1034
|
-
"utilities": [
|
|
1035
|
-
{
|
|
1036
|
-
"name": "era-interactive",
|
|
1037
|
-
"names": [
|
|
1038
|
-
"era-interactive"
|
|
1039
|
-
],
|
|
1040
|
-
"file": "index.css",
|
|
1041
|
-
"useCase": "the focus/disabled recipe every era control carries — put it on a custom interactive element instead of hand-writing focus/disabled variants.",
|
|
1042
|
-
"description": "Shared interactive-state recipe: quiet focus, disabled affordance.\nEquivalent to `focus:outline-none disabled:cursor-not-allowed disabled:opacity-50`.",
|
|
1043
|
-
"css": "@utility era-interactive {\n\t&:focus {\n\t\toutline: none;\n\t}\n\t&:disabled {\n\t\tcursor: not-allowed;\n\t\topacity: 0.5;\n\t}\n}"
|
|
1044
|
-
},
|
|
1045
|
-
{
|
|
1046
|
-
"name": "era-link",
|
|
1047
|
-
"names": [
|
|
1048
|
-
"era-link"
|
|
1049
|
-
],
|
|
1050
|
-
"file": "index.css",
|
|
1051
|
-
"useCase": "understated, motion-aware inline text link — the canonical style for a link in body copy or prose; prefer it over a hand-rolled underline or `Button variant=\"link\"` (which is a control, not running text).",
|
|
1052
|
-
"description": "Inline text link. An understated, permanent underline that darkens from\nmuted to the text colour on hover — no layout shift, no appearing/vanishing\nunderline. The colour fade rides the MOTION axis (--era-duration/-ease), so\nit snaps at data-motion=\"instant\", eases at \"normal\", and sweeps longer at\n\"extra\" — matching every other era transition. Font-agnostic: it styles\ndecoration + colour only, so it reads correctly in mono, sans, or serif, and\nthe 0.2em offset scales with the type size. Keyboard focus mirrors hover so\nthe affordance is reachable without a pointer.",
|
|
1053
|
-
"css": "@utility era-link {\n\t/* The text is bright at rest and never changes — the link reads as a link\n\t * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —\n\t * the link's own ink knocked back to 30% so it barely whispers — that\n\t * resolves to the full ink on hover.\n\t *\n\t * currentColor, not --color-muted/--color-fg: the underline belongs to the\n\t * TEXT it underlines. On themes whose link ink is a colour (signalnine's\n\t * navy, an accent-tinted bright), the neutral tokens drew a whitish line\n\t * under coloured text — a second hue where there should be one. Derived\n\t * from currentColor, the underline tracks whatever the link resolves to,\n\t * in every theme, including a caller overriding `color` locally. */\n\tcolor: var(--color-link);\n\ttext-decoration-line: underline;\n\ttext-decoration-color: color-mix(in oklch, currentColor 30%, transparent);\n\ttext-underline-offset: 0.2em;\n\ttransition: text-decoration-color var(--era-duration) var(--era-ease);\n\t&:hover,\n\t&:focus-visible {\n\t\ttext-decoration-color: currentColor;\n\t}\n}"
|
|
1054
|
-
},
|
|
1055
|
-
{
|
|
1056
|
-
"name": "scrollbar-none",
|
|
1057
|
-
"names": [
|
|
1058
|
-
"scrollbar-none"
|
|
1059
|
-
],
|
|
1060
|
-
"file": "index.css",
|
|
1061
|
-
"useCase": "hide the scrollbar on an overflowing strip or rail while keeping it scrollable — for a scroll region that should show its bar, use ScrollArea.",
|
|
1062
|
-
"description": "Scrollable but chromeless — hides the scrollbar while keeping wheel / touch /\ndrag scrolling (e.g. an overflowing tab strip in a small pane handle).",
|
|
1063
|
-
"css": "@utility scrollbar-none {\n\tscrollbar-width: none;\n\t&::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n}"
|
|
1064
|
-
},
|
|
1065
|
-
{
|
|
1066
|
-
"name": "era-text-trim",
|
|
1067
|
-
"names": [
|
|
1068
|
-
"era-text-trim"
|
|
1069
|
-
],
|
|
1070
|
-
"file": "index.css",
|
|
1071
|
-
"useCase": "vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge. Fixed-height, non-editable elements ONLY: never on an <input>/<textarea>, and never on the same element as `truncate` or any overflow clip — put it on the fixed-height ROW and let the truncating child centre inside it. See era-text-trim-caps for ALL-CAPS.",
|
|
1072
|
-
"description": "Font-agnostic vertical ink-centering for single-line control text.\nMeasured verdict (4 fonts x 2 dpr, ink from device-pixel screenshots):\nthe offset has TWO causes — a fractional line box (14px x 1.5lh = 21px in\na 24px row places ink on a half pixel, ~1px error) and font ascent/descent\nasymmetry (+-1px, sign flips per font). line-height: 1 fixes the first and\nis the Firefox fallback; text-box ex/alphabetic fixes the second by\ncentering the x-height band — the visual mass of MIXED-CASE text (caps and\ndescenders cancel above/below). cap alphabetic is the spec-example recipe\nbut is descender-blind (reads high; CSSWG #9148) — measured 4x worse here.\nWhere text-box is supported it fully determines the box, so the two\ndeclarations never fight. Worst-case residual: 0.44px (measured at 14px; the\nmechanism is font-relative, so dense's 12px inherits the same guarantee with\na proportionally smaller residual).\n\nThe hard rules concern overflow clipping, and there are TWO of them.\n\n1. NEVER on a NATIVE EDITABLE — <input>, <textarea>, <select>. These clip to\n a UA-owned inner editor box that IS the trimmed line box, so a fixed\n height does NOT hold it open: whatever you type gets its ascenders and\n descenders sliced off (a \"d\" renders as an \"o\"). This rule used to read\n the other way round — it claimed a fixed-height <input> was the trim's\n intended home — and the Input component shipped chopped text as a result.\n A tier-height input centres its own text; it needs no trim.\n\n2. NEVER on an AUTO-height element that clips — a `truncate` child, an\n auto-height box with overflow-hidden. With no height to hold it open the\n box collapses to the x-height band (~7.5px at 14px) and the clip chops the\n glyphs into a middle stripe. Put the trim on the fixed-height ROW instead\n and let the child centre via the row's items-center.\n\nA fixed-height NON-editable element is the safe home: the ink overflows the\ntrimmed LINE box but stays inside the padding box, which is what actually\nclips. Both rules are enforced at runtime by typography/collapsed-text-trim.",
|
|
1073
|
-
"css": "@utility era-text-trim {\n\tline-height: 1;\n\ttext-box: trim-both ex alphabetic;\n}"
|
|
1074
|
-
},
|
|
1075
|
-
{
|
|
1076
|
-
"name": "truncate",
|
|
1077
|
-
"names": [
|
|
1078
|
-
"truncate"
|
|
1079
|
-
],
|
|
1080
|
-
"file": "index.css",
|
|
1081
|
-
"useCase": "single-line horizontal truncation with an ellipsis — put it on the truncating CHILD inside a trimmed or leading-none row, never on the same element as era-text-trim; it will not clip ascenders or descenders.",
|
|
1082
|
-
"description": "Tailwind's `truncate`, with the vertical clip fixed at the source.\n\ntruncate is overflow:hidden, and overflow clips in BOTH axes — so whatever\nline box the element ends up with is also its ink clip. Era rows put\nera-text-trim on the fixed-height row (a Bar, a list row), and its\n`line-height: 1` INHERITS into the truncating child, which then has no fixed\nheight of its own: the child's box collapses to 1em while the font's real ink\nextent is ~1.15-1.2em, and the descenders (the \"g\" hook, the \"y\" tail) get\nsliced off at the box edge. Same bug on any `leading-none` + `truncate` pair.\n\nThe fix belongs here rather than at each call site: a horizontally-truncating\nelement must never be the thing that clips vertically. `line-height: normal`\nrestores the font's own ascent+descent box — exactly the ink extent — and\n`text-box: normal` cancels a trim if one is set alongside. Rows stay the same\nheight (they are tier-fixed and centre the child), and the child now has room\nfor its own glyphs.",
|
|
1083
|
-
"css": "@utility truncate {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tline-height: normal;\n\ttext-box: normal;\n}"
|
|
1084
|
-
},
|
|
1085
|
-
{
|
|
1086
|
-
"name": "era-text-trim-caps",
|
|
1087
|
-
"names": [
|
|
1088
|
-
"era-text-trim-caps"
|
|
1089
|
-
],
|
|
1090
|
-
"file": "index.css",
|
|
1091
|
-
"useCase": "the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never for mixed-case text (a label like \"System\" reads high; use era-text-trim), and never on the same element as `truncate`.",
|
|
1092
|
-
"description": "ALL-CAPS single-line text (kbd hints, acronym badges): the x-height band\nmisjudges caps-only strings — cap/alphabetic edges are the right box.",
|
|
1093
|
-
"css": "@utility era-text-trim-caps {\n\tline-height: 1;\n\ttext-box: trim-both cap alphabetic;\n}"
|
|
1094
|
-
},
|
|
1095
|
-
{
|
|
1096
|
-
"name": "era-ink-center",
|
|
1097
|
-
"names": [
|
|
1098
|
-
"era-ink-center"
|
|
1099
|
-
],
|
|
1100
|
-
"file": "index.css",
|
|
1101
|
-
"useCase": "on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.",
|
|
1102
|
-
"description": "The EDITABLE counterpart of era-text-trim — for native <input>s, which the\ntrim is forbidden on (it collapses the UA's inner editor box and slices the\nglyphs; see typography/collapsed-text-trim).\n\nWithout help, a tier-height input centres its text by FONT BOX, and the ui\nstacks' font box is deeply asymmetric: ascent ≈1.07em against descent\n≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em\nLOW — so a field's text sat visibly below the trimmed label beside it.\n\nThe value is OPTICAL, not the derivation's: pure x-band centring computes\nto ~0.23em of padding, but pixel-measured against real Title-Case text it\nover-lifts — the eye weighs the cap-to-baseline mass, which x-band\ncentring parks ~2px high (caps 2.75px off the top against 5.7px of air\nunder the baseline, measured at dense; the general form of that offset,\nand why era-label-ink's note about \"System\" is not a contradiction of it,\nis derived at era-label-ink below). 0.08em splits the difference\nbetween the x-band ideal and the cap-band ideal, landing caps ~3.7px in an\n18px field with ~4.7px under the baseline — the reading where neither\nband's partisans win and neither complains.\n\nThe lift is padding, not a translateY: an icon-less Input paints the field\nchrome itself, and a transform would drag the field along with the ink.\npadding-bottom shrinks the content box from below, and a single-line input\nre-centres its line box in what remains — the ink rises by exactly half the\npadding, the chrome doesn't move, and the caret and selection follow the\ntext. In em on purpose: the correction is a fraction of the type, so it\nholds across every density and text size with one value.\n\nWHEN SOMEONE REPORTS A CORRECTLY-CENTRED FIELD AS \"TOO HIGH\", check the\nSTRING before the geometry. A placeholder like \"Filter…\" has no descender and\nno cap, so its ink occupies only the x-height band — and a box that centres\nthat band exactly still reads high, because the eye centres on the mass it\ncan see and expects the space a descender would have filled. Measured at the\npill tier on the shipped mono stack, \"Filter…\" sits within half a pixel of\ncentre while looking a little high; the pill suite documents the same effect\nfrom the other side (see OFF_BAND_LOW in ink-centering.spec.ts, where \"soon\"\ncannot be symmetric and is bounded by sign instead of magnitude).\n\nThat is not a licence to ignore the report — era-ink-center IS wrong by\n1.5–2px on the sans and serif stacks (pinned in FIELD_KNOWN_SKEW) — only a\nreason to measure the ink before touching the constant.",
|
|
1103
|
-
"css": "@utility era-ink-center {\n\tpadding-bottom: 0.08em;\n}"
|
|
1104
|
-
},
|
|
1105
|
-
{
|
|
1106
|
-
"name": "era-token-ink",
|
|
1107
|
-
"names": [
|
|
1108
|
-
"era-token-ink"
|
|
1109
|
-
],
|
|
1110
|
-
"file": "index.css",
|
|
1111
|
-
"useCase": "the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there.",
|
|
1112
|
-
"description": "TOKEN INK — the ink centring for a pill whose content is a TOKEN: an id, a\ncount, a status, a tag. Font-independent, unlike everything it replaces.\n\nTHE BUG IT FIXES, which had been shipping library-wide and invisibly:\n`text-box-trim` DOES NOTHING ON A FLEX CONTAINER. Era's controls are all\nflex, and a flex container's bare text becomes an ANONYMOUS flex item — a box\nno selector can reach and no non-inherited property can touch. So\n`era-text-trim` on a Badge, a Chip, a Button or a Bar contributed exactly one\nthing: `line-height: 1`. The ink was then centred by `align-items: center`\non the LINE BOX, which is precisely the font-metric-dependent centring the\ntrim exists to eliminate. Measured on the shipped mono stack: a badge reading\n\"AC-2.1\" sat 2px high in an 18px pill, and no amount of tuning the trim's\nBAND changed it, because the trim was never running.\n\nThe mechanism here restores it: a BLOCK box (where text-box-trim does apply)\nwhose trimmed line box is then centred by `align-content` — block-container\nalignment, so no flex formatting context and no anonymous item. The browser\ncomputes the band from the font's own metrics, which is what makes it hold\nacross ui-monospace, system-ui and ui-serif instead of needing a constant\nper stack.\n\nCAP band, not the x-height band the general trim uses, because the content\nclass is different: a token is caps and digits (both cap-height), and\ncentring the x-band parks them high by (cap − x)/2. Measured on the shipped\nstacks, cap-band centring takes an id/count/status from −2.0px to 0.0.\nProse and sentence-case labels keep era-text-trim; this is for tokens.",
|
|
1113
|
-
"css": "@utility era-token-ink {\n\tdisplay: block;\n\talign-content: center;\n\ttext-align: center;\n\tline-height: 1;\n\ttext-box: trim-both cap alphabetic;\n}"
|
|
1114
|
-
},
|
|
1115
|
-
{
|
|
1116
|
-
"name": "era-label-ink",
|
|
1117
|
-
"names": [
|
|
1118
|
-
"era-label-ink"
|
|
1119
|
-
],
|
|
1120
|
-
"file": "index.css",
|
|
1121
|
-
"useCase": "the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip).",
|
|
1122
|
-
"description": "LABEL INK — era-token-ink's mixed-case sibling, and the general answer to\n\"this fixed-height control holds one line of text\".\n\nSame mechanism, same reason: `text-box-trim` needs a BLOCK box, so the row\nbecomes one and `align-content` (block-container alignment) does the\ncentring. What differs is the band and the alignment, because the content\nclass differs — a label is sentence case, so the x-height band is the visual\nmass to centre (cap-band reads low on \"System\"), and it is laid out against\nthe row's padding rather than centred in it.\n\nTHAT PARENTHESIS AND era-ink-center's \"x-band centring parks ~2px high\" READ\nAS A CONTRADICTION AND ARE NOT. Both are true, of their own example string,\nand each was generalised one step too far. Under an ex band the ink offset is\n\n (xh − ascent + descent) / 2\n\nwhich predicts a controlled A/B — one real button, one class set, only the\nSTRING changing — within 0.3px:\n\n Save asc 9 desc 0 1.28px high SAVE asc 9 desc 0 1.28px high\n Savg asc 9 desc 3 0.22px low savg asc 7 desc 3 1.22px low\n\n\"System\" has a descender and reads low under the cap band; \"Save\" has none\nand reads high under the ex band. Case is not the variable — \"Save\" and\n\"SAVE\" are identical to the hundredth of a pixel. No fixed band centres both\na descender-less and a descender-bearing label, because they differ by ~1.5px\nin the same box.\n\nWHICH IS WHY THE BAND IS FIXED ANYWAY, and this is the part that decides it.\nA band gives every label the SAME baseline whatever it spells — measured\nspread across Save/Savg/save/savg/SAVE/PDF/Cancel/\"Copy page\" is 0.00px —\nwhile ink-extent centring would move each label independently and leave a bar\nof buttons visibly ragged. A uniform offset the eye cannot see beats a local\nmisalignment it can. So the offset is accepted, not corrected, and the only\nescape is per-label and opt-in (Button's `caps`), which buys optical centring\nfor a lone label at the cost of ~1.06px against its neighbours.\n\nAND THE GUARANTEE SPANS BOTH INK PATHS. This utility and era-text-trim are\ntwo mechanisms — block+align-content here, a blockified flex item there — and\nevery measurement above was taken on the trim path. Measured since: the\ntext-only path holds the same 0.00px spread AND lands on the same baseline,\n15.22px from the button top at control tier. So an icon button and a text\nbutton put their labels on one line, and `not-has-[svg]` costs nothing but\nwhich element carries the trim.\n\nMeasured by signalnine.org and reproduced here; see label-band.spec.ts, which\npins the 0.00px spread, the cost of breaking it, and the agreement between\nthe two paths.\n\nWHY IT EXISTS AT ALL: era's controls are flex, and a flex container's bare\ntext is an ANONYMOUS flex item — a box no selector reaches and no\nnon-inherited property touches. So `era-text-trim` on a flex row is inert,\ncontributing only its `line-height: 1`, and the ink falls back to line-box\ncentring by font metrics. era-token-ink already fixed that for centred\ntokens; this fixes it for everything else.\n\nTHE ICON CASE IS NOT SOLVED, and cannot be from CSS: an icon beside the text\nneeds the box to stay flex, which re-creates the anonymous item. A component\nwhose children are an opaque slot therefore guards it —\n`not-has-[svg]:era-label-ink` — and ink-centres the text-only case while\nleaving the icon case on line-box centring. Splitting icon and label into\nseparate slots is what would close it; typography/inert-trim reports every\nsite still on the fallback.",
|
|
1123
|
-
"css": "@utility era-label-ink {\n\tdisplay: block;\n\talign-content: center;\n\tline-height: 1;\n\ttext-box: trim-both ex alphabetic;\n}"
|
|
1124
|
-
},
|
|
1125
|
-
{
|
|
1126
|
-
"name": "surface-backdrop",
|
|
1127
|
-
"names": [
|
|
1128
|
-
"surface-backdrop"
|
|
1129
|
-
],
|
|
1130
|
-
"file": "index.css",
|
|
1131
|
-
"useCase": "the surface-aware backdrop treatment without choosing a fill or relief. Prefer material-popover/material-panel when the element is a complete surface.",
|
|
1132
|
-
"description": "",
|
|
1133
|
-
"css": "@utility surface-backdrop {\n\tbackdrop-filter: var(--era-backdrop-filter);\n\t-webkit-backdrop-filter: var(--era-backdrop-filter);\n}"
|
|
1134
|
-
},
|
|
1135
|
-
{
|
|
1136
|
-
"name": "material-popover",
|
|
1137
|
-
"names": [
|
|
1138
|
-
"material-popover"
|
|
1139
|
-
],
|
|
1140
|
-
"file": "index.css",
|
|
1141
|
-
"useCase": "a floating transient surface: menus, popovers, tooltips, pickers, toasts. Binds its raised fill, floating relief, and backdrop treatment atomically.",
|
|
1142
|
-
"description": "",
|
|
1143
|
-
"css": "@utility material-popover {\n\tbackground-color: var(--era-surface-bg-elevated);\n\tbox-shadow: var(--era-shadow-lg);\n\tbackdrop-filter: var(--era-backdrop-filter);\n\t-webkit-backdrop-filter: var(--era-backdrop-filter);\n}"
|
|
1144
|
-
},
|
|
1145
|
-
{
|
|
1146
|
-
"name": "material-panel",
|
|
1147
|
-
"names": [
|
|
1148
|
-
"material-panel"
|
|
1149
|
-
],
|
|
1150
|
-
"file": "index.css",
|
|
1151
|
-
"useCase": "a floating persistent surface: dialogs, sheets, panes, inspectors. Binds its resting fill, floating relief, and backdrop treatment atomically.",
|
|
1152
|
-
"description": "",
|
|
1153
|
-
"css": "@utility material-panel {\n\tbackground-color: var(--era-surface-bg);\n\tbox-shadow: var(--era-shadow-lg);\n\tbackdrop-filter: var(--era-backdrop-filter);\n\t-webkit-backdrop-filter: var(--era-backdrop-filter);\n}"
|
|
1154
|
-
},
|
|
1155
|
-
{
|
|
1156
|
-
"name": "pressable",
|
|
1157
|
-
"names": [
|
|
1158
|
-
"pressable"
|
|
1159
|
-
],
|
|
1160
|
-
"file": "index.css",
|
|
1161
|
-
"useCase": "the physical press contract on a control whose direct content plane is marked data-era-press-content. The surface owns relief/travel; the component may scale travel with --era-press-scale.",
|
|
1162
|
-
"description": "",
|
|
1163
|
-
"css": "@utility pressable {\n\t&:active {\n\t\tbox-shadow: var(--era-shadow-pressed);\n\t}\n\n\t&:active > [data-era-press-content] {\n\t\ttranslate: var(--era-press-effective-x, var(--era-press-sink-x))\n\t\t\tvar(--era-press-effective-y, var(--era-press-sink-y));\n\t}\n}"
|
|
1164
|
-
},
|
|
1165
|
-
{
|
|
1166
|
-
"name": "tier-icon",
|
|
1167
|
-
"names": [
|
|
1168
|
-
"tier-icon",
|
|
1169
|
-
"tier-pill",
|
|
1170
|
-
"tier-chip",
|
|
1171
|
-
"tier-control",
|
|
1172
|
-
"tier-bar"
|
|
1173
|
-
],
|
|
1174
|
-
"file": "index.css",
|
|
1175
|
-
"description": "BOUNDED GEOMETRY — height and radius are one decision.\n\nA tier is a geometric type, not two classes a caller must remember to keep in\nsync. `tier-control` establishes h-control AND rd-control; the radius ladder\nthen guarantees rd_outer − rd_inner = (h_outer − h_inner)/2 for every pair.\nWidth remains the component's decision: a row stretches, a button adds\nmin-w-control, and a square control adds w-control.",
|
|
1176
|
-
"css": "@utility tier-icon {\n\theight: var(--era-h-icon);\n\tborder-radius: var(--era-rd-icon);\n}\n\n@utility tier-pill {\n\theight: var(--era-h-pill);\n\tborder-radius: var(--era-rd-pill);\n}\n\n@utility tier-chip {\n\theight: var(--era-h-chip);\n\tborder-radius: var(--era-rd-chip);\n}\n\n@utility tier-control {\n\theight: var(--era-h-control);\n\tborder-radius: var(--era-rd-control);\n}\n\n@utility tier-bar {\n\theight: var(--era-h-bar);\n\tborder-radius: var(--era-rd-bar);\n}"
|
|
1177
|
-
},
|
|
1178
|
-
{
|
|
1179
|
-
"name": "h-line",
|
|
1180
|
-
"names": [
|
|
1181
|
-
"h-line"
|
|
1182
|
-
],
|
|
1183
|
-
"file": "index.css",
|
|
1184
|
-
"useCase": "the height of one line of the element's own text — a skeleton standing in for a line, a spacer that must match a line box.",
|
|
1185
|
-
"description": "One LINE BOX tall — the height of the text this stands in for.\n\nSkeleton's `line` used h-(--era-text), which is the body FONT SIZE: never the\nheight of a rendered line (that is font-size x leading), and wrong again by\nthe ladder's ratio for any rung other than body. `1lh` resolves against the\nelement's OWN computed line-height, so putting a text-* class on the skeleton\nmakes it match that tier exactly, at every density, and it follows a leading\nchange for free.",
|
|
1186
|
-
"css": "@utility h-line {\n\theight: 1lh;\n}"
|
|
1187
|
-
},
|
|
1188
|
-
{
|
|
1189
|
-
"name": "era-track-well",
|
|
1190
|
-
"names": [
|
|
1191
|
-
"era-track-well"
|
|
1192
|
-
],
|
|
1193
|
-
"file": "index.css",
|
|
1194
|
-
"useCase": "instead of `shadow-well` on a track whose value is painted by a child that covers the box — a progress/meter/slider track, a custom gauge. For a well holding ordinary content, `shadow-well` is still right.",
|
|
1195
|
-
"description": "A WELL THAT SURVIVES BEING FILLED.\n\n`shadow-well` is an INSET shadow, and an inset shadow belongs to the\nelement's background layer — it paints under the element's own descendants.\nThat is invisible on a well holding text (a checkbox, a code block: the\nchrome runs around the content) and wrong the moment something paints the\nwhole box. Meter, Progress and the Slider track all do exactly that: an\nopaque child, `translateX`-ed to the value. So the well survived only where\nthe track was EMPTY — a half-full meter on bevel had a chisel to the right\nof the value and none to the left, which reads as a hole with a sticker\nover it rather than a level inside a well.\n\nThe fix is painting order, not geometry: the same `--era-shadow-well` on a\npseudo-element that is the element's LAST child, so it lands above the fill.\nThe fill still spans the full box — nothing is inset, no radius is\nre-derived, and 0% and 100% keep their exact ends. The `position: relative`\nis load-bearing (the overlay resolves against this box) and `inherit` on the\nradius keeps it honest under `data-corners=\"square\"`.\n\nSurface-agnostic on purpose. It reads the same token every well reads, so\nglass's hairline rim is restored by the same line that restores bevel's\nchisel, and flat — where the token is `none` — renders exactly as before.\nReported against bevel by a consumer; it was never a bevel bug.",
|
|
1196
|
-
"css": "@utility era-track-well {\n\tposition: relative;\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tborder-radius: inherit;\n\t\tbox-shadow: var(--era-shadow-well);\n\t\tpointer-events: none;\n\t}\n}"
|
|
1197
|
-
},
|
|
1198
|
-
{
|
|
1199
|
-
"name": "era-skeleton-pulse",
|
|
1200
|
-
"names": [
|
|
1201
|
-
"era-skeleton-pulse"
|
|
1202
|
-
],
|
|
1203
|
-
"file": "index.css",
|
|
1204
|
-
"description": "Skeleton's pulse, on the MOTION AXIS.\n\nIt used to be a literal `2s ease-in-out` on the component, so it neither died\nat data-motion=\"instant\" nor honoured prefers-reduced-motion — on the one\ncomponent most likely to be on screen in bulk, and animating. That is an\naccessibility defect rather than a preference: a page of pulsing blocks is\nexactly what someone with a vestibular disorder turns motion off to avoid.\n\nSame derivation as era-shimmer: 10x the axis duration, so it is a slow pulse\nat normal, slower at extra, and at instant the duration resolves to 0s and it\nfreezes on its base frame — full opacity, a plain filled block.",
|
|
1205
|
-
"css": "@utility era-skeleton-pulse {\n\tanimation: era-skeleton-pulse calc(var(--era-duration) * 10) var(--era-ease) infinite;\n}"
|
|
1206
|
-
},
|
|
1207
|
-
{
|
|
1208
|
-
"name": "era-shimmer",
|
|
1209
|
-
"names": [
|
|
1210
|
-
"era-shimmer"
|
|
1211
|
-
],
|
|
1212
|
-
"file": "index.css",
|
|
1213
|
-
"useCase": "the in-progress text treatment — put it on a \"working…\" / \"thinking…\" label while a task streams, instead of a spinner beside the text.",
|
|
1214
|
-
"description": "In-progress text shimmer — a bright sweep through muted text (the standard\n\"working…\" label treatment in streaming UIs). Timing derives from the motion\naxis (10× --era-duration ≈ 1.5s at normal, 2.6s at extra); at instant the\nduration is 0s and the sweep freezes on its base frame — plain muted text —\nso reduced-motion and data-motion=\"instant\" both kill it for free.",
|
|
1215
|
-
"css": "@utility era-shimmer {\n\tbackground: linear-gradient(\n\t\t110deg,\n\t\tvar(--color-muted) 0% 43%,\n\t\tvar(--color-bright) 50%,\n\t\tvar(--color-muted) 57% 100%\n\t);\n\tbackground-size: 200% 100%;\n\tbackground-clip: text;\n\t-webkit-text-fill-color: transparent;\n\tanimation: era-shimmer calc(var(--era-duration) * 10) cubic-bezier(0.7, 0, 1, 0.4) infinite;\n}"
|
|
1216
|
-
},
|
|
1217
|
-
{
|
|
1218
|
-
"name": "era-collapse",
|
|
1219
|
-
"names": [
|
|
1220
|
-
"era-collapse"
|
|
1221
|
-
],
|
|
1222
|
-
"file": "index.css",
|
|
1223
|
-
"useCase": "the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).",
|
|
1224
|
-
"description": "The open/close animation for a bits-ui Collapsible.Content — the height\nsweep every disclosure in the library uses (a Step's body, an error panel's\ndetail, a swarm node's children).\n\nIt has to be a keyframe animation rather than a transition because the\nnatural height is only knowable at open time: bits measures the content and\npublishes `--bits-collapsible-content-height`, which the `to` frame reads.\nThe class also owns `overflow: hidden` — animating height without it just\nspills the content out of the shrinking box.\n\nTiming rides the motion axis, so `instant` collapses it to a cut (0s) and\n`extra` stretches it, for free. Two components carried a byte-identical copy of\nthese keyframes under two different names before this existed (a Step's body\nand the error panel's detail), and the swarm tree would have made a third; the\npanel that needs different motion should override `animation`, not re-declare\nit.",
|
|
1225
|
-
"css": "@utility era-collapse {\n\toverflow: hidden;\n\t&[data-state='open'] {\n\t\tanimation: era-collapse-open var(--era-duration) var(--era-ease);\n\t}\n\t&[data-state='closed'] {\n\t\tanimation: era-collapse-close var(--era-duration) var(--era-ease);\n\t}\n}"
|
|
1226
|
-
},
|
|
1227
|
-
{
|
|
1228
|
-
"name": "h-icon",
|
|
1229
|
-
"names": [
|
|
1230
|
-
"h-icon",
|
|
1231
|
-
"h-pill",
|
|
1232
|
-
"h-chip",
|
|
1233
|
-
"h-control",
|
|
1234
|
-
"h-bar"
|
|
1235
|
-
],
|
|
1236
|
-
"file": "index.css",
|
|
1237
|
-
"useCase": "the tier-height ladder — h-icon (icon) · h-pill (nested pill) · h-chip (standalone pill) · h-control (control) · h-bar (bar); the named form of h-(--era-h-*).",
|
|
1238
|
-
"description": "",
|
|
1239
|
-
"css": "@utility h-icon {\n\theight: var(--era-h-icon);\n}\n@utility h-pill {\n\theight: var(--era-h-pill);\n}\n@utility h-chip {\n\theight: var(--era-h-chip);\n}\n@utility h-control {\n\theight: var(--era-h-control);\n}\n@utility h-bar {\n\theight: var(--era-h-bar);\n}"
|
|
1240
|
-
},
|
|
1241
|
-
{
|
|
1242
|
-
"name": "min-h-icon",
|
|
1243
|
-
"names": [
|
|
1244
|
-
"min-h-icon",
|
|
1245
|
-
"min-h-pill",
|
|
1246
|
-
"min-h-chip",
|
|
1247
|
-
"min-h-control",
|
|
1248
|
-
"min-h-bar"
|
|
1249
|
-
],
|
|
1250
|
-
"file": "index.css",
|
|
1251
|
-
"useCase": "minimum tier height for containers that may grow — a bar that is at least lg-tier but can wrap (min-h-bar).",
|
|
1252
|
-
"description": "",
|
|
1253
|
-
"css": "@utility min-h-icon {\n\tmin-height: var(--era-h-icon);\n}\n@utility min-h-pill {\n\tmin-height: var(--era-h-pill);\n}\n@utility min-h-chip {\n\tmin-height: var(--era-h-chip);\n}\n@utility min-h-control {\n\tmin-height: var(--era-h-control);\n}\n@utility min-h-bar {\n\tmin-height: var(--era-h-bar);\n}"
|
|
1254
|
-
},
|
|
1255
|
-
{
|
|
1256
|
-
"name": "w-icon",
|
|
1257
|
-
"names": [
|
|
1258
|
-
"w-icon",
|
|
1259
|
-
"w-pill",
|
|
1260
|
-
"w-chip",
|
|
1261
|
-
"w-control",
|
|
1262
|
-
"w-bar"
|
|
1263
|
-
],
|
|
1264
|
-
"file": "index.css",
|
|
1265
|
-
"useCase": "a tier-sized WIDTH — the horizontal twin of the h-* ladder, for a rail or a column measured in tiers rather than in content.",
|
|
1266
|
-
"description": "",
|
|
1267
|
-
"css": "@utility w-icon {\n\twidth: var(--era-h-icon);\n}\n@utility w-pill {\n\twidth: var(--era-h-pill);\n}\n@utility w-chip {\n\twidth: var(--era-h-chip);\n}\n@utility w-control {\n\twidth: var(--era-h-control);\n}\n@utility w-bar {\n\twidth: var(--era-h-bar);\n}"
|
|
1268
|
-
},
|
|
1269
|
-
{
|
|
1270
|
-
"name": "min-w-icon",
|
|
1271
|
-
"names": [
|
|
1272
|
-
"min-w-icon",
|
|
1273
|
-
"min-w-pill",
|
|
1274
|
-
"min-w-chip",
|
|
1275
|
-
"min-w-control",
|
|
1276
|
-
"min-w-bar"
|
|
1277
|
-
],
|
|
1278
|
-
"file": "index.css",
|
|
1279
|
-
"useCase": "a minimum tier WIDTH — the floor that makes a single-glyph control render as a square rather than a skinny pill (min-w-control on an icon button, min-w-pill on a badge). These could not exist before the ladder was renamed: the old rungs were sm/md/lg, and Tailwind's container scale already owns min-w-md and min-w-lg, so the names collided and every call site had to write min-w-(--era-h-control) by hand. icon/pill/chip/control/bar collide with nothing.",
|
|
1280
|
-
"description": "",
|
|
1281
|
-
"css": "@utility min-w-icon {\n\tmin-width: var(--era-h-icon);\n}\n@utility min-w-pill {\n\tmin-width: var(--era-h-pill);\n}\n@utility min-w-chip {\n\tmin-width: var(--era-h-chip);\n}\n@utility min-w-control {\n\tmin-width: var(--era-h-control);\n}\n@utility min-w-bar {\n\tmin-width: var(--era-h-bar);\n}"
|
|
1282
|
-
},
|
|
1283
|
-
{
|
|
1284
|
-
"name": "size-icon",
|
|
1285
|
-
"names": [
|
|
1286
|
-
"size-icon",
|
|
1287
|
-
"size-pill",
|
|
1288
|
-
"size-chip",
|
|
1289
|
-
"size-control",
|
|
1290
|
-
"size-bar"
|
|
1291
|
-
],
|
|
1292
|
-
"file": "index.css",
|
|
1293
|
-
"useCase": "a tier-sized square — size-icon is THE icon size (a Lucide glyph beside body text), size-control a square control face.",
|
|
1294
|
-
"description": "",
|
|
1295
|
-
"css": "@utility size-icon {\n\twidth: var(--era-h-icon);\n\theight: var(--era-h-icon);\n}\n@utility size-pill {\n\twidth: var(--era-h-pill);\n\theight: var(--era-h-pill);\n}\n@utility size-chip {\n\twidth: var(--era-h-chip);\n\theight: var(--era-h-chip);\n}\n@utility size-control {\n\twidth: var(--era-h-control);\n\theight: var(--era-h-control);\n}\n@utility size-bar {\n\twidth: var(--era-h-bar);\n\theight: var(--era-h-bar);\n}"
|
|
1296
|
-
},
|
|
1297
|
-
{
|
|
1298
|
-
"name": "px-pill",
|
|
1299
|
-
"names": [
|
|
1300
|
-
"px-pill",
|
|
1301
|
-
"px-chip",
|
|
1302
|
-
"pl-pill",
|
|
1303
|
-
"pr-pill",
|
|
1304
|
-
"pl-chip",
|
|
1305
|
-
"pr-chip"
|
|
1306
|
-
],
|
|
1307
|
-
"file": "index.css",
|
|
1308
|
-
"useCase": "pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).",
|
|
1309
|
-
"description": "",
|
|
1310
|
-
"css": "@utility px-pill {\n\tpadding-inline: var(--era-pill-px);\n}\n@utility px-chip {\n\tpadding-inline: var(--era-chip-px);\n}\n@utility pl-pill {\n\tpadding-left: var(--era-pill-px);\n}\n@utility pr-pill {\n\tpadding-right: var(--era-pill-px);\n}\n@utility pl-chip {\n\tpadding-left: var(--era-chip-px);\n}\n@utility pr-chip {\n\tpadding-right: var(--era-chip-px);\n}"
|
|
1311
|
-
},
|
|
1312
|
-
{
|
|
1313
|
-
"name": "p-section",
|
|
1314
|
-
"names": [
|
|
1315
|
-
"p-section"
|
|
1316
|
-
],
|
|
1317
|
-
"file": "index.css",
|
|
1318
|
-
"useCase": "padding for a content panel that sits UNDER a section header row — the even-padding exception, and the reason it is not called p-section: it deliberately under-pays the block start. For an evenly padded content panel use p-section, which is the plain token.",
|
|
1319
|
-
"description": "A content panel always follows a section header ROW, and that row already\ncontributes its own slack: the heading's text sits in an h-bar bar, so there\nis (h-bar − text)/2 of empty bar under its glyphs before the panel even\nstarts. Padding the panel evenly on top of that spends the space twice — the\nheader ends up floating between the section above and the paragraph it\nintroduces rather than binding to it.\n\nSo the block-start pays only the REMAINDER. The target is the indent: the\nspace under a heading should measure the same as the space beside the text,\nwhich is --era-pad-content. The header row already supplies (h-bar − text)/2 of\nit, so the panel adds what's left, and heading-to-paragraph reads equal to\nthe paragraph's own inset. Subtracting one --era-gap (the previous rule) left\nthe header's slack unaccounted for and the heading still detached.\n\nBoth terms are density-derived, so the equality holds at every mode; the\nmax() is the floor for a hypothetical mode where the row's slack would\nexceed the inset outright.",
|
|
1320
|
-
"css": "@utility p-section {\n\tpadding: var(--era-pad-content);\n\tpadding-top: max(0px, calc(var(--era-pad-content) - (var(--era-h-bar) - var(--era-text)) / 2));\n}"
|
|
1321
|
-
},
|
|
1322
|
-
{
|
|
1323
|
-
"name": "duration-base",
|
|
1324
|
-
"names": [
|
|
1325
|
-
"duration-base"
|
|
1326
|
-
],
|
|
1327
|
-
"file": "index.css",
|
|
1328
|
-
"useCase": "the motion axis as an explicit transition-duration — for the rare case a utility (not the transition-* default) needs to name it; 0s at data-motion=\"instant\", longer at \"extra\".",
|
|
1329
|
-
"description": "",
|
|
1330
|
-
"css": "@utility duration-base {\n\ttransition-duration: var(--era-duration);\n}"
|
|
1331
|
-
},
|
|
1332
|
-
{
|
|
1333
|
-
"name": "text-micro",
|
|
1334
|
-
"names": [
|
|
1335
|
-
"text-micro",
|
|
1336
|
-
"text-lede",
|
|
1337
|
-
"text-heading",
|
|
1338
|
-
"text-title",
|
|
1339
|
-
"text-display"
|
|
1340
|
-
],
|
|
1341
|
-
"file": "index.css",
|
|
1342
|
-
"useCase": "the type ladder — micro (eyebrow/legend) < body (controls) < lede (the paragraph under a title) < heading < title < display. Derived from --era-text, so the ratio between any two rungs holds at every density; leading and tracking ride with the size, so a rung is one class.",
|
|
1343
|
-
"description": "THE TYPE LADDER — the one axis that was not on the density system.\n\nera had exactly one size, `text-body`, so a heading had nowhere to go and\nconsumers reached for Tailwind's fixed `text-2xl` or a bare <h1>. Both are\nrem-fixed while `--era-text` re-tiers, so heading prominence DEGRADED as\ndensity increased: measured in a consumer app, an <h1> against body text\nwas 1.33x at dense and 1.14x at touch. The page title gets quieter the\ntighter you set the page, which is backwards, and it is the only place in\nera where a size relationship does not hold across the axis.\n\nNamed by ROLE, like the tier ladder and for the same reason: size names\ninvert (this library already shipped an `xxs` bigger than its `xs`), and a\nrole tells you where the rung belongs. Ratios are simple fractions of the\natom rather than a geometric scale — again like the tier ladder, whose\nrungs are sp+6, 2sp+6, 3sp, 4sp rather than a constant multiplier. They\nland on whole pixels at dense and hold their ratio at every mode.\n\n micro 5/6 10 / 11.7 / 11.7 / 11.7 an eyebrow, a legend, a tag\n body 1 12 / 14 / 14 / 14 control and UI text\n lede 5/4 15 / 17.5 the paragraph under a title\n heading 3/2 18 / 21 a section heading\n title 2 24 / 28 a page or card title\n display 3 36 / 42 a hero\n\n`micro` is not invented: the library hand-writes text-[0.625rem] ten times\nfor exactly this role, and 5/6 of dense's 12px is that value.\n\nLeading and tracking ride with the size, so a rung is one class. Both\ntighten as the rung grows, which is ordinary optical setting and matters\nmore here than usual — era's default stack is monospace, whose display\nsizes read loose without it.\n\n\nbody and micro deliberately carry NO line-height: `text-body` is worn by\nevery control in the library, where leading is owned by era-text-trim and\nleading-none. Giving it a default would re-space every control in era.\nUse `leading-body` for running text, as before.",
|
|
1344
|
-
"css": "@theme inline {\n\t--text-micro: calc(var(--era-text) * 5 / 6);\n\t--text-micro--letter-spacing: 0.04em;\n\t--text-lede: calc(var(--era-text) * 5 / 4);\n\t--text-lede--line-height: 1.5;\n\t--text-heading: calc(var(--era-text) * 3 / 2);\n\t--text-heading--line-height: 1.3;\n\t--text-heading--letter-spacing: -0.01em;\n\t--text-title: calc(var(--era-text) * 2);\n\t--text-title--line-height: 1.15;\n\t--text-title--letter-spacing: -0.02em;\n\t--text-display: calc(var(--era-text) * 3);\n\t--text-display--line-height: 1.05;\n\t--text-display--letter-spacing: -0.03em;\n}"
|
|
1345
|
-
},
|
|
1346
|
-
{
|
|
1347
|
-
"name": "text-body",
|
|
1348
|
-
"names": [
|
|
1349
|
-
"text-body"
|
|
1350
|
-
],
|
|
1351
|
-
"file": "index.css",
|
|
1352
|
-
"description": "Density-derived body size: `text-body` replaces text-[length:var(--era-text)]",
|
|
1353
|
-
"css": "@theme inline {\n\t--text-body: var(--era-text);\n}"
|
|
1354
|
-
},
|
|
1355
|
-
{
|
|
1356
|
-
"name": "leading-body",
|
|
1357
|
-
"names": [
|
|
1358
|
-
"leading-body"
|
|
1359
|
-
],
|
|
1360
|
-
"file": "index.css",
|
|
1361
|
-
"description": "Prose leading — `leading-body` is the pair to `text-body`, and every piece\nof text in the library that can wrap to a second line carries it. Enforced\nat runtime by typography/prose-leading.",
|
|
1362
|
-
"css": "@theme inline {\n\t--leading-body: var(--era-leading);\n}"
|
|
1363
|
-
},
|
|
1364
|
-
{
|
|
1365
|
-
"name": "rounded-icon",
|
|
1366
|
-
"names": [
|
|
1367
|
-
"rounded-icon",
|
|
1368
|
-
"rounded-pill",
|
|
1369
|
-
"rounded-chip",
|
|
1370
|
-
"rounded-control",
|
|
1371
|
-
"rounded-bar",
|
|
1372
|
-
"rounded-menu-item"
|
|
1373
|
-
],
|
|
1374
|
-
"file": "index.css",
|
|
1375
|
-
"description": "Radius ladder — Tailwind's own rounded-* names now walk era's concentric\nladder (rd-T = rd-xs + (h-T − h-icon)/2), ride the corners toggle, and\ncollapse to 0 on square. rounded-menu-item is the menu-row radius\n(rd-md − panel-inset) that keeps rows concentric inside a rounded-control\npanel on every surface.",
|
|
1376
|
-
"css": "@theme inline {\n\t--radius-icon: var(--era-rd-icon);\n\t--radius-pill: var(--era-rd-pill);\n\t--radius-chip: var(--era-rd-chip);\n\t--radius-control: var(--era-rd-control);\n\t--radius-bar: var(--era-rd-bar);\n\t--radius-menu-item: var(--era-item-rd);\n}"
|
|
1377
|
-
},
|
|
1378
|
-
{
|
|
1379
|
-
"name": "shadow",
|
|
1380
|
-
"names": [
|
|
1381
|
-
"shadow"
|
|
1382
|
-
],
|
|
1383
|
-
"file": "index.css",
|
|
1384
|
-
"description": "Surface chrome — bare `shadow` is the resting control edge, shadow-lg the\nfloating panel, shadow-well the recessed container, shadow-pressed the\nactive/latched face, shadow-highlight the material half of hover feedback.\nFlat renders them as none, bevel as chisels, glass as frosted rims — the\nclass stays the same.",
|
|
1385
|
-
"css": "@theme inline {\n\t--shadow: var(--era-shadow);\n}"
|
|
1386
|
-
},
|
|
1387
|
-
{
|
|
1388
|
-
"name": "shadow-sm",
|
|
1389
|
-
"names": [
|
|
1390
|
-
"shadow-sm",
|
|
1391
|
-
"shadow-lg",
|
|
1392
|
-
"shadow-well",
|
|
1393
|
-
"shadow-pressed",
|
|
1394
|
-
"shadow-highlight"
|
|
1395
|
-
],
|
|
1396
|
-
"file": "index.css",
|
|
1397
|
-
"description": "v4 marks bare `shadow` a deprecated spelling of shadow-sm, and lints\nauto-fix one to the other — alias both to the control edge so either\nspelling renders era chrome.",
|
|
1398
|
-
"css": "@theme inline {\n\t--shadow-sm: var(--era-shadow);\n\t--shadow-lg: var(--era-shadow-lg);\n\t--shadow-well: var(--era-shadow-well);\n\t--shadow-pressed: var(--era-shadow-pressed);\n\t--shadow-highlight: var(--era-highlight-shadow);\n}"
|
|
1399
|
-
},
|
|
1400
|
-
{
|
|
1401
|
-
"name": "bg-well",
|
|
1402
|
-
"names": [
|
|
1403
|
-
"bg-well",
|
|
1404
|
-
"text-well",
|
|
1405
|
-
"border-well",
|
|
1406
|
-
"bg-elevated",
|
|
1407
|
-
"text-elevated",
|
|
1408
|
-
"border-elevated",
|
|
1409
|
-
"bg-highlight",
|
|
1410
|
-
"text-highlight",
|
|
1411
|
-
"border-highlight",
|
|
1412
|
-
"bg-overlay",
|
|
1413
|
-
"text-overlay",
|
|
1414
|
-
"border-overlay"
|
|
1415
|
-
],
|
|
1416
|
-
"file": "index.css",
|
|
1417
|
-
"description": "Surface fills — bg-well is the surface's own resting fill (pairs with\nshadow-well for recessed chrome), bg-elevated the raised tier,\nbg-highlight the transient\nhover/focus/keyboard wash (pairs with shadow-highlight; latched states\nstay on opaque bg-hover), bg-overlay the modal scrim.",
|
|
1418
|
-
"css": "@theme inline {\n\t--color-well: var(--era-surface-bg);\n\t--color-elevated: var(--era-surface-bg-elevated);\n\t--color-highlight: var(--era-highlight);\n\t--color-overlay: var(--era-overlay-bg);\n}"
|
|
1419
|
-
},
|
|
1420
|
-
{
|
|
1421
|
-
"name": "p-gutter",
|
|
1422
|
-
"names": [
|
|
1423
|
-
"p-gutter",
|
|
1424
|
-
"px-gutter",
|
|
1425
|
-
"py-gutter",
|
|
1426
|
-
"gap-gutter",
|
|
1427
|
-
"p-panel",
|
|
1428
|
-
"px-panel",
|
|
1429
|
-
"py-panel",
|
|
1430
|
-
"gap-panel",
|
|
1431
|
-
"p-card",
|
|
1432
|
-
"px-card",
|
|
1433
|
-
"py-card",
|
|
1434
|
-
"gap-card",
|
|
1435
|
-
"p-content",
|
|
1436
|
-
"px-content",
|
|
1437
|
-
"py-content",
|
|
1438
|
-
"gap-content",
|
|
1439
|
-
"p-menu",
|
|
1440
|
-
"px-menu",
|
|
1441
|
-
"py-menu",
|
|
1442
|
-
"gap-menu",
|
|
1443
|
-
"p-field",
|
|
1444
|
-
"px-field",
|
|
1445
|
-
"py-field",
|
|
1446
|
-
"gap-field"
|
|
1447
|
-
],
|
|
1448
|
-
"file": "index.css",
|
|
1449
|
-
"description": "THE SPACING SCALE — one entry per token, from which Tailwind derives the\nWHOLE directional family: p/px/py/pt/pr/pb/pl/ps/pe, every margin, gap and\ngap-x/y, inset/top/right/bottom/left, translate, and the sizing prefixes.\n\nThese were hand-written `@utility` blocks, which could only ever cover the\nspellings someone remembered to write: `px-gutter` existed and `mt-gutter`\ndid not, `p-inset-control` existed and `pl-inset-control` did not, so the\nlibrary fell back to `mt-(--era-gap)` in exactly the places the named API\nwas supposed to cover. One line here replaces twenty blocks and leaves no\nspelling missing.\n\nONLY genuine spacing belongs here. The namespace is shared across\nh/w/p/m/gap, so a name registered here means the same length in ALL of\nthem — true of a gap or an inset, false of a TIER HEIGHT. Tiers stay\nhand-written per prefix below, and the two vocabularies deliberately share\nno word: icon/pill/chip/control/bar are heights; gutter, card, panel,\ncontent, menu, field and the inset-* names are spacing. Registering a tier\nname here would silently make `px-control` mean 24px of side padding.",
|
|
1450
|
-
"css": "@theme inline {\n\t--spacing-gutter: var(--era-gap);\n\t--spacing-panel: var(--era-pad-panel);\n\t--spacing-card: var(--era-pad-card);\n\t--spacing-content: var(--era-pad-content);\n\t--spacing-menu: var(--era-panel-inset);\n\t--spacing-field: var(--era-field-px);\n}"
|
|
1451
|
-
},
|
|
1452
|
-
{
|
|
1453
|
-
"name": "p-inset-pill",
|
|
1454
|
-
"names": [
|
|
1455
|
-
"p-inset-pill",
|
|
1456
|
-
"px-inset-pill",
|
|
1457
|
-
"py-inset-pill",
|
|
1458
|
-
"gap-inset-pill",
|
|
1459
|
-
"p-inset-chip",
|
|
1460
|
-
"px-inset-chip",
|
|
1461
|
-
"py-inset-chip",
|
|
1462
|
-
"gap-inset-chip",
|
|
1463
|
-
"p-inset-control",
|
|
1464
|
-
"px-inset-control",
|
|
1465
|
-
"py-inset-control",
|
|
1466
|
-
"gap-inset-control"
|
|
1467
|
-
],
|
|
1468
|
-
"file": "index.css",
|
|
1469
|
-
"useCase": "text-symmetric content padding — (tier − text)/2, the inset that vertically centres body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's.",
|
|
1470
|
-
"description": "",
|
|
1471
|
-
"css": "@theme inline {\n\t--spacing-inset-pill: var(--era-inset-pill);\n\t--spacing-inset-chip: var(--era-inset-chip);\n\t--spacing-inset-control: var(--era-inset-control);\n}"
|
|
1472
|
-
},
|
|
1473
|
-
{
|
|
1474
|
-
"name": "p-icon-inset-pill",
|
|
1475
|
-
"names": [
|
|
1476
|
-
"p-icon-inset-pill",
|
|
1477
|
-
"px-icon-inset-pill",
|
|
1478
|
-
"py-icon-inset-pill",
|
|
1479
|
-
"gap-icon-inset-pill",
|
|
1480
|
-
"p-icon-inset-chip",
|
|
1481
|
-
"px-icon-inset-chip",
|
|
1482
|
-
"py-icon-inset-chip",
|
|
1483
|
-
"gap-icon-inset-chip",
|
|
1484
|
-
"p-icon-inset-control",
|
|
1485
|
-
"px-icon-inset-control",
|
|
1486
|
-
"py-icon-inset-control",
|
|
1487
|
-
"gap-icon-inset-control",
|
|
1488
|
-
"p-icon-inset-bar",
|
|
1489
|
-
"px-icon-inset-bar",
|
|
1490
|
-
"py-icon-inset-bar",
|
|
1491
|
-
"gap-icon-inset-bar",
|
|
1492
|
-
"p-pill-inset-chip",
|
|
1493
|
-
"px-pill-inset-chip",
|
|
1494
|
-
"py-pill-inset-chip",
|
|
1495
|
-
"gap-pill-inset-chip",
|
|
1496
|
-
"p-pill-inset-control",
|
|
1497
|
-
"px-pill-inset-control",
|
|
1498
|
-
"py-pill-inset-control",
|
|
1499
|
-
"gap-pill-inset-control",
|
|
1500
|
-
"p-pill-inset-bar",
|
|
1501
|
-
"px-pill-inset-bar",
|
|
1502
|
-
"py-pill-inset-bar",
|
|
1503
|
-
"gap-pill-inset-bar",
|
|
1504
|
-
"p-chip-inset-control",
|
|
1505
|
-
"px-chip-inset-control",
|
|
1506
|
-
"py-chip-inset-control",
|
|
1507
|
-
"gap-chip-inset-control",
|
|
1508
|
-
"p-chip-inset-bar",
|
|
1509
|
-
"px-chip-inset-bar",
|
|
1510
|
-
"py-chip-inset-bar",
|
|
1511
|
-
"gap-chip-inset-bar",
|
|
1512
|
-
"p-control-inset-bar",
|
|
1513
|
-
"px-control-inset-bar",
|
|
1514
|
-
"py-control-inset-bar",
|
|
1515
|
-
"gap-control-inset-bar"
|
|
1516
|
-
],
|
|
1517
|
-
"file": "index.css",
|
|
1518
|
-
"useCase": "the concentric inset for a nested pair — (h-container − h-child)/2, the gap that makes a child control sit evenly inside its container, and the radius step that keeps their corners concentric. Named for the pair it joins: gap-icon-inset-control seats an icon in a control.",
|
|
1519
|
-
"description": "",
|
|
1520
|
-
"css": "@theme inline {\n\t--spacing-icon-inset-pill: var(--era-icon-inset-pill);\n\t--spacing-icon-inset-chip: var(--era-icon-inset-chip);\n\t--spacing-icon-inset-control: var(--era-icon-inset-control);\n\t--spacing-icon-inset-bar: var(--era-icon-inset-bar);\n\t--spacing-pill-inset-chip: var(--era-pill-inset-chip);\n\t--spacing-pill-inset-control: var(--era-pill-inset-control);\n\t--spacing-pill-inset-bar: var(--era-pill-inset-bar);\n\t--spacing-chip-inset-control: var(--era-chip-inset-control);\n\t--spacing-chip-inset-bar: var(--era-chip-inset-bar);\n\t--spacing-control-inset-bar: var(--era-control-inset-bar);\n}"
|
|
1521
|
-
},
|
|
1522
|
-
{
|
|
1523
|
-
"name": "p-glyph-icon",
|
|
1524
|
-
"names": [
|
|
1525
|
-
"p-glyph-icon",
|
|
1526
|
-
"px-glyph-icon",
|
|
1527
|
-
"py-glyph-icon",
|
|
1528
|
-
"gap-glyph-icon",
|
|
1529
|
-
"p-glyph-pill",
|
|
1530
|
-
"px-glyph-pill",
|
|
1531
|
-
"py-glyph-pill",
|
|
1532
|
-
"gap-glyph-pill"
|
|
1533
|
-
],
|
|
1534
|
-
"file": "index.css",
|
|
1535
|
-
"useCase": "the glyph size for a tier — the INK inside the box, not the box (size-glyph-pill is the dismiss × in a pill, size-pill is the pill).",
|
|
1536
|
-
"description": "",
|
|
1537
|
-
"css": "@theme inline {\n\t--spacing-glyph-icon: var(--era-glyph-icon);\n\t--spacing-glyph-pill: var(--era-glyph-pill);\n}"
|
|
1538
|
-
},
|
|
1539
|
-
{
|
|
1540
|
-
"name": "bg-field",
|
|
1541
|
-
"names": [
|
|
1542
|
-
"bg-field",
|
|
1543
|
-
"text-field",
|
|
1544
|
-
"border-field",
|
|
1545
|
-
"bg-field-highlight",
|
|
1546
|
-
"text-field-highlight",
|
|
1547
|
-
"border-field-highlight"
|
|
1548
|
-
],
|
|
1549
|
-
"file": "index.css",
|
|
1550
|
-
"useCase": "the recessed field fill — bg-field is a text input's resting well, bg-field-highlight its focused/hovered face.",
|
|
1551
|
-
"description": "",
|
|
1552
|
-
"css": "@theme inline {\n\t--color-field: var(--era-field-bg);\n\t--color-field-highlight: var(--era-field-highlight);\n}"
|
|
1553
|
-
},
|
|
1554
|
-
{
|
|
1555
|
-
"name": "ease-base",
|
|
1556
|
-
"names": [
|
|
1557
|
-
"ease-base"
|
|
1558
|
-
],
|
|
1559
|
-
"file": "index.css",
|
|
1560
|
-
"description": "Motion — bare transition utilities default to the motion axis, so\n`transition-colors` alone is on-design (0s at instant, longer at extra).\nease-base/duration-base name the axis explicitly for overrides.",
|
|
1561
|
-
"css": "@theme inline {\n\t--default-transition-duration: var(--era-duration);\n\t--default-transition-timing-function: var(--era-ease);\n\t--ease-base: var(--era-ease);\n}"
|
|
1562
|
-
},
|
|
1563
|
-
{
|
|
1564
|
-
"name": "bg-divider",
|
|
1565
|
-
"names": [
|
|
1566
|
-
"bg-divider",
|
|
1567
|
-
"text-divider",
|
|
1568
|
-
"border-divider",
|
|
1569
|
-
"bg-divider-faded",
|
|
1570
|
-
"text-divider-faded",
|
|
1571
|
-
"border-divider-faded",
|
|
1572
|
-
"bg-background",
|
|
1573
|
-
"text-background",
|
|
1574
|
-
"border-background",
|
|
1575
|
-
"bg-foreground",
|
|
1576
|
-
"text-foreground",
|
|
1577
|
-
"border-foreground",
|
|
1578
|
-
"bg-1",
|
|
1579
|
-
"text-1",
|
|
1580
|
-
"border-1",
|
|
1581
|
-
"bg-2",
|
|
1582
|
-
"text-2",
|
|
1583
|
-
"border-2",
|
|
1584
|
-
"bg-3",
|
|
1585
|
-
"text-3",
|
|
1586
|
-
"border-3",
|
|
1587
|
-
"bg-4",
|
|
1588
|
-
"text-4",
|
|
1589
|
-
"border-4",
|
|
1590
|
-
"bg-5",
|
|
1591
|
-
"text-5",
|
|
1592
|
-
"border-5",
|
|
1593
|
-
"bg-6",
|
|
1594
|
-
"text-6",
|
|
1595
|
-
"border-6",
|
|
1596
|
-
"bg-7",
|
|
1597
|
-
"text-7",
|
|
1598
|
-
"border-7",
|
|
1599
|
-
"bg-8",
|
|
1600
|
-
"text-8",
|
|
1601
|
-
"border-8",
|
|
1602
|
-
"bg-9",
|
|
1603
|
-
"text-9",
|
|
1604
|
-
"border-9",
|
|
1605
|
-
"bg-10",
|
|
1606
|
-
"text-10",
|
|
1607
|
-
"border-10",
|
|
1608
|
-
"bg-11",
|
|
1609
|
-
"text-11",
|
|
1610
|
-
"border-11",
|
|
1611
|
-
"bg-12",
|
|
1612
|
-
"text-12",
|
|
1613
|
-
"border-12",
|
|
1614
|
-
"bg-border",
|
|
1615
|
-
"text-border",
|
|
1616
|
-
"border-border",
|
|
1617
|
-
"bg-surface",
|
|
1618
|
-
"text-surface",
|
|
1619
|
-
"border-surface",
|
|
1620
|
-
"bg-hover",
|
|
1621
|
-
"text-hover",
|
|
1622
|
-
"border-hover",
|
|
1623
|
-
"bg-fg",
|
|
1624
|
-
"text-fg",
|
|
1625
|
-
"border-fg",
|
|
1626
|
-
"bg-bright",
|
|
1627
|
-
"text-bright",
|
|
1628
|
-
"border-bright",
|
|
1629
|
-
"bg-muted",
|
|
1630
|
-
"text-muted",
|
|
1631
|
-
"border-muted"
|
|
1632
|
-
],
|
|
1633
|
-
"file": "index.css",
|
|
1634
|
-
"description": "Surface divider colors: border-divider, bg-divider-faded, …",
|
|
1635
|
-
"css": "@theme inline {\n\t--color-divider: var(--era-divider-color);\n\t--color-divider-faded: var(--era-divider-faded);\n\t--color-background: var(--color-1);\n\t--color-foreground: var(--color-fg);\n\t--color-1: var(--color-1);\n\t--color-2: var(--color-2);\n\t--color-3: var(--color-3);\n\t--color-4: var(--color-4);\n\t--color-5: var(--color-5);\n\t--color-6: var(--color-6);\n\t--color-7: var(--color-7);\n\t--color-8: var(--color-8);\n\t--color-9: var(--color-9);\n\t--color-10: var(--color-10);\n\t--color-11: var(--color-11);\n\t--color-12: var(--color-12);\n\t--color-border: var(--color-border);\n\t--color-surface: var(--color-surface);\n\t--color-hover: var(--color-hover);\n\t--color-fg: var(--color-fg);\n\t--color-bright: var(--color-bright);\n\t--color-muted: var(--color-muted);\n}"
|
|
1636
|
-
},
|
|
1637
|
-
{
|
|
1638
|
-
"name": "bg-fill",
|
|
1639
|
-
"names": [
|
|
1640
|
-
"bg-fill",
|
|
1641
|
-
"text-fill",
|
|
1642
|
-
"border-fill",
|
|
1643
|
-
"bg-link",
|
|
1644
|
-
"text-link",
|
|
1645
|
-
"border-link",
|
|
1646
|
-
"bg-primary",
|
|
1647
|
-
"text-primary",
|
|
1648
|
-
"border-primary",
|
|
1649
|
-
"bg-primary-fg",
|
|
1650
|
-
"text-primary-fg",
|
|
1651
|
-
"border-primary-fg",
|
|
1652
|
-
"bg-primary-hover",
|
|
1653
|
-
"text-primary-hover",
|
|
1654
|
-
"border-primary-hover",
|
|
1655
|
-
"bg-destructive",
|
|
1656
|
-
"text-destructive",
|
|
1657
|
-
"border-destructive",
|
|
1658
|
-
"bg-destructive-fg",
|
|
1659
|
-
"text-destructive-fg",
|
|
1660
|
-
"border-destructive-fg",
|
|
1661
|
-
"bg-success",
|
|
1662
|
-
"text-success",
|
|
1663
|
-
"border-success",
|
|
1664
|
-
"bg-success-fg",
|
|
1665
|
-
"text-success-fg",
|
|
1666
|
-
"border-success-fg",
|
|
1667
|
-
"bg-warning",
|
|
1668
|
-
"text-warning",
|
|
1669
|
-
"border-warning",
|
|
1670
|
-
"bg-warning-fg",
|
|
1671
|
-
"text-warning-fg",
|
|
1672
|
-
"border-warning-fg",
|
|
1673
|
-
"bg-info",
|
|
1674
|
-
"text-info",
|
|
1675
|
-
"border-info",
|
|
1676
|
-
"bg-info-fg",
|
|
1677
|
-
"text-info-fg",
|
|
1678
|
-
"border-info-fg"
|
|
1679
|
-
],
|
|
1680
|
-
"file": "index.css",
|
|
1681
|
-
"description": "The standing pill fill — --era-fill, the latched counterpart of the\ntransient highlight. Surface-owned: a composing wash on flat/bevel, the\nopaque swatch on glass.",
|
|
1682
|
-
"css": "@theme inline {\n\t--color-fill: var(--era-fill);\n\t--color-link: var(--color-link);\n\t--color-primary: var(--color-primary);\n\t--color-primary-fg: var(--color-primary-fg);\n\t--color-primary-hover: var(--color-primary-hover);\n\t--color-destructive: var(--color-destructive);\n\t--color-destructive-fg: var(--color-destructive-fg);\n\t--color-success: var(--color-success);\n\t--color-success-fg: var(--color-success-fg);\n\t--color-warning: var(--color-warning);\n\t--color-warning-fg: var(--color-warning-fg);\n\t--color-info: var(--color-info);\n\t--color-info-fg: var(--color-info-fg);\n}"
|
|
1683
|
-
}
|
|
1684
|
-
]
|
|
1685
|
-
}
|