@aortl/admin-css 0.16.1 → 0.17.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/dist/admin.css +351 -11
  3. package/dist/admin.min.css +1 -1
  4. package/dist/admin.scoped.css +345 -11
  5. package/dist/admin.scoped.min.css +67 -6
  6. package/package.json +3 -2
  7. package/src/components/accordion.css +4 -13
  8. package/src/components/alert.css +38 -23
  9. package/src/components/app-shell.css +2 -4
  10. package/src/components/avatar.css +36 -0
  11. package/src/components/badge.css +37 -5
  12. package/src/components/brand-tile.css +36 -0
  13. package/src/components/breadcrumbs.css +2 -11
  14. package/src/components/button-group.css +7 -19
  15. package/src/components/button.css +7 -23
  16. package/src/components/card.css +48 -26
  17. package/src/components/chart.css +26 -83
  18. package/src/components/checkbox.css +3 -9
  19. package/src/components/code-block.css +2 -4
  20. package/src/components/container.css +3 -7
  21. package/src/components/dialog.css +11 -18
  22. package/src/components/field.css +3 -7
  23. package/src/components/footer.css +2 -3
  24. package/src/components/index.css +3 -0
  25. package/src/components/indicator.css +21 -28
  26. package/src/components/input-group.css +3 -6
  27. package/src/components/input-icon.css +46 -0
  28. package/src/components/input.css +2 -5
  29. package/src/components/kbd.css +7 -13
  30. package/src/components/link.css +2 -8
  31. package/src/components/menu.css +9 -24
  32. package/src/components/navbar.css +3 -7
  33. package/src/components/pagination.css +1 -4
  34. package/src/components/progress.css +3 -7
  35. package/src/components/property-list.css +5 -14
  36. package/src/components/prose.css +6 -24
  37. package/src/components/radio.css +3 -7
  38. package/src/components/select.css +4 -11
  39. package/src/components/separator.css +13 -0
  40. package/src/components/sidebar.css +2 -7
  41. package/src/components/spinner.css +1 -4
  42. package/src/components/stat-card.css +5 -16
  43. package/src/components/switch.css +3 -5
  44. package/src/components/table.css +25 -34
  45. package/src/components/tabs.css +14 -32
  46. package/src/components/textarea.css +3 -7
  47. package/src/components/tooltip.css +6 -16
  48. package/src/fonts.css +8 -28
  49. package/src/theme.css +32 -100
  50. package/src/utilities.css +11 -37
package/src/theme.css CHANGED
@@ -1,38 +1,15 @@
1
- /**
2
- * Design tokens — based on Flexoki (https://stephango.com/flexoki).
3
- *
4
- * Two layers, both registered with @theme so Tailwind generates utilities
5
- * (bg-blue-600, bg-primary, ...) and emits them as CSS variables you can
6
- * reference or override at runtime.
7
- *
8
- * 1. Palette — the Flexoki ramps (paper, black, base, red, orange,
9
- * yellow, green, cyan, blue, purple, magenta). Replaces Tailwind's
10
- * default colors entirely. Tones are absolute and identical in
11
- * light/dark mode — Flexoki's inverted ramp pairs (paper↔black,
12
- * base-50↔base-950, blue-600↔blue-400, …) live in the semantic
13
- * layer below.
14
- *
15
- * 2. Semantic — purpose-named aliases (primary, surface, danger, ...)
16
- * pointing at palette tones via `light-dark()`. The active value
17
- * tracks the cascaded `color-scheme` declared on :root: auto by
18
- * default (system preference), forced via `[data-theme="dark"]` or
19
- * `[data-theme="light"]`. Components only reference these aliases,
20
- * so they pick up dark mode for free.
21
- *
22
- * Reskin by remapping the alias:
23
- *
24
- * :root { --color-primary: var(--color-green-600); }
25
- *
26
- * or replacing the palette tone underneath:
27
- *
28
- * :root { --color-blue-600: oklch(0.55 0.18 250); }
1
+ /*
2
+ * Design tokens — Flexoki (https://stephango.com/flexoki), two @theme layers:
3
+ * palette ramps (absolute tones, identical in light and dark) and semantic
4
+ * aliases declared via light-dark(), which flip with the cascaded color-scheme.
5
+ * Components reference only the semantic aliases; reskin by remapping an alias
6
+ * (--color-primary) or the palette tone underneath it.
29
7
  */
30
8
 
31
9
  @theme static {
32
10
  /* Wipe Tailwind's default palette — Flexoki is the single source of truth. */
33
11
  --color-*: initial;
34
12
 
35
- /* Base */
36
13
  --color-paper: #ffffff;
37
14
  --color-black: #0f0f0f;
38
15
  --color-base-50: #fafafa;
@@ -49,7 +26,6 @@
49
26
  --color-base-900: #272727;
50
27
  --color-base-950: #1b1b1b;
51
28
 
52
- /* Red */
53
29
  --color-red-50: #ffe1d5;
54
30
  --color-red-100: #ffcabb;
55
31
  --color-red-150: #fdb2a2;
@@ -64,7 +40,6 @@
64
40
  --color-red-900: #3e1715;
65
41
  --color-red-950: #261312;
66
42
 
67
- /* Orange */
68
43
  --color-orange-50: #ffe7ce;
69
44
  --color-orange-100: #fed3af;
70
45
  --color-orange-150: #fcc192;
@@ -79,7 +54,6 @@
79
54
  --color-orange-900: #40200d;
80
55
  --color-orange-950: #27180e;
81
56
 
82
- /* Yellow */
83
57
  --color-yellow-50: #faeec6;
84
58
  --color-yellow-100: #f6e2a0;
85
59
  --color-yellow-150: #f1d67e;
@@ -94,7 +68,6 @@
94
68
  --color-yellow-900: #3a2d04;
95
69
  --color-yellow-950: #241e08;
96
70
 
97
- /* Green */
98
71
  --color-green-50: #edeecf;
99
72
  --color-green-100: #dde2b2;
100
73
  --color-green-150: #cdd597;
@@ -109,7 +82,6 @@
109
82
  --color-green-900: #252d09;
110
83
  --color-green-950: #1a1e0c;
111
84
 
112
- /* Cyan */
113
85
  --color-cyan-50: #ddf1e4;
114
86
  --color-cyan-100: #bfe8d9;
115
87
  --color-cyan-150: #a2dece;
@@ -124,7 +96,6 @@
124
96
  --color-cyan-900: #122f2c;
125
97
  --color-cyan-950: #101f1d;
126
98
 
127
- /* Blue */
128
99
  --color-blue-50: #e1eceb;
129
100
  --color-blue-100: #c6dde8;
130
101
  --color-blue-150: #abcfe2;
@@ -139,7 +110,6 @@
139
110
  --color-blue-900: #12253b;
140
111
  --color-blue-950: #101a24;
141
112
 
142
- /* Purple */
143
113
  --color-purple-50: #f0eaec;
144
114
  --color-purple-100: #e2d9e9;
145
115
  --color-purple-150: #d3cae6;
@@ -154,7 +124,6 @@
154
124
  --color-purple-900: #261c39;
155
125
  --color-purple-950: #1a1623;
156
126
 
157
- /* Magenta */
158
127
  --color-magenta-50: #fee4e5;
159
128
  --color-magenta-100: #fccfda;
160
129
  --color-magenta-150: #f9b9cf;
@@ -171,13 +140,9 @@
171
140
  }
172
141
 
173
142
  @theme static {
174
- /*
175
- * Typography only the font stack is tokenized. Sizes, weights, and
176
- * line-heights compose from Tailwind's default scale at the call site
177
- * (`text-sm`, `font-semibold`, `leading-tight`, …) — the system is
178
- * dense and small enough that an extra semantic layer would just be
179
- * indirection. Override `--font-sans` to swap the entire UI font.
180
- */
143
+ /* Only the font stack is tokenized — sizes, weights, and line-heights
144
+ compose from Tailwind's default scale at the call site; a semantic
145
+ layer there would just be indirection. */
181
146
  --font-sans:
182
147
  "IBM Plex Sans", "IBM Plex Sans Fallback", ui-sans-serif, system-ui, -apple-system, "Segoe UI",
183
148
  Roboto, sans-serif;
@@ -188,71 +153,50 @@
188
153
 
189
154
  @theme static {
190
155
  /*
191
- * Semantic tokens each declared once via `light-dark()`. The two
192
- * branches are Flexoki's symmetric ramp pairs:
193
- * - paper ↔ black, base-50 base-950, base-150 base-850,
194
- * - accent-600 ↔ accent-400, accent-50 ↔ accent-950
195
- *
196
- * On accent buttons in dark mode the base shifts to the lighter
197
- * accent-400 tone, so `content` (text on top) flips to black for
198
- * legibility — the same trade-off `warning` already makes in both
199
- * modes against bright yellow.
156
+ * Light/dark branches are Flexoki's symmetric ramp pairs (paper↔black,
157
+ * base-50↔base-950, accent-600↔accent-400). Dark mode fills with the
158
+ * lighter accent-400, so `-content` text flips to black for legibility.
200
159
  */
201
160
 
202
- /* Surfaces */
203
161
  --color-surface: light-dark(var(--color-paper), var(--color-black));
204
162
  --color-surface-muted: light-dark(var(--color-base-50), var(--color-base-950));
205
163
  --color-surface-strong: light-dark(var(--color-base-100), var(--color-base-900));
206
164
 
207
- /* Text */
208
165
  --color-text: light-dark(var(--color-black), var(--color-base-200));
209
166
  --color-text-muted: light-dark(var(--color-base-600), var(--color-base-500));
210
167
 
211
- /* Borders */
212
168
  --color-border: light-dark(var(--color-base-150), var(--color-base-850));
213
169
  --color-border-strong: light-dark(var(--color-base-300), var(--color-base-700));
214
170
 
215
- /* Code — neutral surface for <pre>-style output blocks (logs, JSON, LLM
216
- output). One step darker than `surface-strong` in light mode so the
217
- block visually carves out from regular chrome; matches `surface-muted`
218
- depth in dark mode. */
171
+ /* <pre>-style output blocks (logs, JSON). One step darker than
172
+ `surface-strong` in light mode so the block carves out from chrome. */
219
173
  --color-code-surface: light-dark(var(--color-base-150), var(--color-base-950));
220
174
  --color-code-text: light-dark(var(--color-base-800), var(--color-base-200));
221
175
 
222
- /* Modal scrim — the dimming layer behind a `<dialog>` and the mobile
223
- sidebar drawer. One tint from black so both overlays match and stay
224
- retintable from a single token. */
176
+ /* Dimming layer behind `<dialog>` and the mobile sidebar drawer — one
177
+ token so both overlays match. */
225
178
  --color-scrim: color-mix(in oklab, var(--color-black) 40%, transparent);
226
179
 
227
- /* Primary high-contrast neutral (ink). Inverts with the mode: near-black
228
- on light surfaces, near-white on dark ones, so a solid `btn-primary` fill
229
- always reads against the surface. Unlike the colored accents, `-hover`
230
- moves *toward* the surface (you can't darken past ink), and `-muted` is a
231
- neutral gray wash — `bg-primary-muted` selected/active states read as a
232
- quiet fill rather than a colored highlight. The interactive blue that used
233
- to live here now drives `--color-link` / `--color-focus` and `info`. */
180
+ /* Primary is neutral ink, inverting with the mode. Unlike the colored
181
+ accents, `-hover` moves *toward* the surface (you can't darken past ink)
182
+ and `-muted` is a gray wash, so selected/active fills read quiet rather
183
+ than colored. */
234
184
  --color-primary: light-dark(var(--color-black), var(--color-paper));
235
185
  --color-primary-hover: light-dark(var(--color-base-800), var(--color-base-200));
236
186
  --color-primary-muted: light-dark(var(--color-base-150), var(--color-base-800));
237
187
  --color-primary-content: light-dark(var(--color-paper), var(--color-black));
238
188
 
239
- /* Link / focus the interactive blue (Flexoki blue, formerly `primary`).
240
- Split into two tokens so link text and focus rings can be retinted
241
- independently of the `info` status color, even though both start blue. */
189
+ /* Separate tokens so link text and focus rings can be retinted
190
+ independently of the `info` status color, even though all start blue. */
242
191
  --color-link: light-dark(var(--color-blue-600), var(--color-blue-400));
243
192
  --color-link-hover: light-dark(var(--color-blue-700), var(--color-blue-300));
244
193
  --color-focus: light-dark(var(--color-blue-600), var(--color-blue-400));
245
194
 
246
- /* System accent — per-app brand signal. Drives the navbar's 2px bottom
247
- stripe and the footer's matching top stripe (both always on), plus
248
- `.brand-tile` backgrounds. Defaults to a neutral gray so an un-branded
249
- shell reads as chrome rather than a brand mark; override at :root (or
250
- via inline style on .app-shell) to brand-shift a whole app. The -hover,
251
- -muted, and -content siblings derive from the base via `color-mix`,
252
- so a single override propagates. Mixing toward `--color-text` and
253
- `--color-surface` (themselves `light-dark()` pairs) keeps the
254
- derivations in step with light/dark mode without nesting light-dark()
255
- inside color-mix(). Bright accents (e.g. yellow) may want a manual
195
+ /* Per-app brand signal. Defaults to neutral gray so an un-branded shell
196
+ reads as chrome; override at :root (or inline on .app-shell) to brand a
197
+ whole app. -hover/-muted derive via color-mix toward --color-text /
198
+ --color-surface (themselves light-dark() pairs), so one override
199
+ propagates and stays mode-aware. Bright accents may need a manual
256
200
  -content override for contrast. */
257
201
  --color-system-accent: light-dark(var(--color-base-600), var(--color-base-400));
258
202
  --color-system-accent-hover: color-mix(
@@ -267,38 +211,30 @@
267
211
  );
268
212
  --color-system-accent-content: light-dark(var(--color-paper), var(--color-black));
269
213
 
270
- /* Danger — red */
271
214
  --color-danger: light-dark(var(--color-red-600), var(--color-red-400));
272
215
  --color-danger-hover: light-dark(var(--color-red-700), var(--color-red-300));
273
216
  --color-danger-muted: light-dark(var(--color-red-50), var(--color-red-950));
274
217
  --color-danger-content: light-dark(var(--color-paper), var(--color-black));
275
218
 
276
- /* Success — green */
277
219
  --color-success: light-dark(var(--color-green-600), var(--color-green-400));
278
220
  --color-success-hover: light-dark(var(--color-green-700), var(--color-green-300));
279
221
  --color-success-muted: light-dark(var(--color-green-50), var(--color-green-950));
280
222
  --color-success-content: light-dark(var(--color-paper), var(--color-black));
281
223
 
282
- /* Warning — yellow (stays bright in both modes; dark text either way) */
224
+ /* Warning stays bright in both modes; content text is dark either way */
283
225
  --color-warning: var(--color-yellow-400);
284
226
  --color-warning-hover: light-dark(var(--color-yellow-500), var(--color-yellow-300));
285
227
  --color-warning-muted: light-dark(var(--color-yellow-50), var(--color-yellow-950));
286
228
  --color-warning-content: var(--color-black);
287
229
 
288
- /* Info — Flexoki blue (the calm "FYI" status color) */
289
230
  --color-info: light-dark(var(--color-blue-600), var(--color-blue-400));
290
231
  --color-info-hover: light-dark(var(--color-blue-700), var(--color-blue-300));
291
232
  --color-info-muted: light-dark(var(--color-blue-50), var(--color-blue-950));
292
233
  --color-info-content: light-dark(var(--color-paper), var(--color-black));
293
234
  }
294
235
 
295
- /*
296
- * Activate `light-dark()` resolution. `light dark` follows the OS
297
- * preference; the attribute overrides force a specific mode and also
298
- * flip native form controls, scrollbars, etc. The attribute selector
299
- * isn't scoped to :root so subtrees can opt into a different mode (e.g.
300
- * a dark hero section on an otherwise light page).
301
- */
236
+ /* `light dark` follows the OS; [data-theme] forces a mode. Deliberately not
237
+ scoped to :root so any subtree can opt into a different mode. */
302
238
  :root {
303
239
  color-scheme: light dark;
304
240
  }
@@ -309,12 +245,8 @@
309
245
  color-scheme: light;
310
246
  }
311
247
 
312
- /*
313
- * Align Tailwind's `dark:` variant with the same resolution rules so
314
- * authored utilities (`dark:shadow-lg`, …) match what the tokens do.
315
- * Default v4 uses prefers-color-scheme alone, which would ignore the
316
- * [data-theme] override.
317
- */
248
+ /* Tailwind's default `dark:` is prefers-color-scheme only; realign it so
249
+ authored utilities follow [data-theme] like the tokens do. */
318
250
  @custom-variant dark {
319
251
  &:where([data-theme="dark"], [data-theme="dark"] *) {
320
252
  @slot;
package/src/utilities.css CHANGED
@@ -6,30 +6,17 @@
6
6
  @import "tailwindcss/utilities.css" layer(utilities);
7
7
 
8
8
  /*
9
- * Pre-built utility safelist for the no-build `admin.utilities.css` bundle.
10
- *
11
- * Curated to keep wire size tight admin density rarely needs spacing
12
- * above 32, text sizes above 2xl, or interactive variants on layout
13
- * primitives. Each `@source inline(...)` is a brace-expanded class set;
14
- * Tailwind expands the same way bash does (empty branches `{,foo}`
15
- * include both the no-prefix and prefixed forms).
16
- *
17
- * Variant policy per family:
18
- * - Layout (display, spacing, sizing, grid, ...) → responsive only
19
- * - Visual (colors, borders, shadow, outline) → interactive only
20
- * - Typography (weight, leading, ...) → neither
21
- *
22
- * Adding a utility: extend the matching line. Adding a new semantic
23
- * color: update theme.css AND the color lines below.
9
+ * Pre-built utility safelist for the no-build `admin.utilities.css` bundle,
10
+ * curated for wire size. Variant policy: layout families get responsive
11
+ * variants only, visual families interactive only, typography neither.
12
+ * A new semantic color must be added to theme.css AND the color lines below.
24
13
  */
25
14
 
26
- /* Display, position, visibility — responsive */
27
15
  @source inline(
28
16
  "{,sm:,md:,lg:,xl:,2xl:}{block,inline-block,inline,flex,inline-flex,grid,inline-grid,contents,table,inline-table,table-row,table-cell,hidden,flow-root,list-item,static,fixed,absolute,relative,sticky,visible,invisible,collapse,sr-only,not-sr-only}"
29
17
  );
30
18
  @source inline("{,sm:,md:,lg:,xl:,2xl:}overflow{,-x,-y}-{auto,hidden,visible,scroll,clip}");
31
19
 
32
- /* Flex / grid — responsive */
33
20
  @source inline(
34
21
  "{,sm:,md:,lg:,xl:,2xl:}flex-{row,row-reverse,col,col-reverse,wrap,wrap-reverse,nowrap,1,auto,initial,none}"
35
22
  );
@@ -60,38 +47,32 @@
60
47
  @source inline("{,sm:,md:,lg:,xl:,2xl:}{auto-cols,auto-rows}-{auto,min,max,fr}");
61
48
  @source inline("{,sm:,md:,lg:,xl:,2xl:}order-{1,2,3,4,5,6,7,8,9,10,11,12,first,last,none}");
62
49
 
63
- /* Spacing (padding, margin, gap) — responsive */
64
50
  @source inline(
65
51
  "{,sm:,md:,lg:,xl:,2xl:}{p,px,py,pt,pr,pb,pl,ps,pe,m,mx,my,mt,mr,mb,ml,ms,me,gap,gap-x,gap-y}-{0,0.5,1,1.5,2,3,4,6,8,12,16,20,24,32}"
66
52
  );
67
53
  @source inline("{,sm:,md:,lg:,xl:,2xl:}{m,mx,my,mt,mr,mb,ml,ms,me}-auto");
68
54
 
69
- /* Sizing (w, h, min-w, max-w, min-h, max-h) — responsive */
70
55
  @source inline(
71
56
  "{,sm:,md:,lg:,xl:,2xl:}{w,h,min-w,max-w,min-h,max-h}-{0,0.5,1,1.5,2,3,4,6,8,12,16,20,24,32,px,auto,full,screen,fit,min,max}"
72
57
  );
73
58
  @source inline("{,sm:,md:,lg:,xl:,2xl:}{w,h}-{1/2,1/3,2/3,1/4,2/4,3/4}");
74
59
  @source inline("{,sm:,md:,lg:,xl:,2xl:}max-w-{xs,sm,md,lg,xl,2xl,3xl,4xl,5xl,6xl,7xl,prose,none}");
75
60
 
76
- /* Text size + align — responsive */
77
61
  @source inline("{,sm:,md:,lg:,xl:,2xl:}text-{xs,sm,base,lg,xl,2xl}");
78
62
  @source inline("{,sm:,md:,lg:,xl:,2xl:}text-{left,center,right,justify,start,end}");
79
63
 
80
- /* Aspect ratio — responsive */
81
64
  @source inline("{,sm:,md:,lg:,xl:,2xl:}aspect-{auto,square,video}");
82
65
 
83
- /* Object fit + position (avatars, thumbnails, logos) — responsive */
84
66
  @source inline("{,sm:,md:,lg:,xl:,2xl:}object-{contain,cover,fill,none,scale-down}");
85
67
  @source inline(
86
68
  "{,sm:,md:,lg:,xl:,2xl:}object-{top,bottom,left,right,center,left-top,left-bottom,right-top,right-bottom}"
87
69
  );
88
70
 
89
- /* Translate (x/y only — full transforms intentionally skipped) — responsive */
71
+ /* Translate x/y only — full transforms intentionally skipped */
90
72
  @source inline(
91
73
  "{,sm:,md:,lg:,xl:,2xl:}translate-{x,y}-{0,0.5,1,1.5,2,3,4,6,8,12,16,20,24,32,1/2,full}"
92
74
  );
93
75
 
94
- /* Typography (non-size) — no variants */
95
76
  @source inline("font-{thin,extralight,light,normal,medium,semibold,bold,extrabold,black}");
96
77
  @source inline("font-{sans,mono,serif}");
97
78
  @source inline("{italic,not-italic}");
@@ -108,7 +89,6 @@
108
89
  @source inline("list-{disc,decimal,none,inside,outside}");
109
90
  @source inline("{underline,overline,line-through,no-underline,truncate}");
110
91
 
111
- /* Borders + rounded — interactive */
112
92
  @source inline(
113
93
  "{,hover:,focus:,focus-visible:,active:}border{,-x,-y,-t,-r,-b,-l}{,-0,-2,-4,-8}"
114
94
  );
@@ -119,15 +99,13 @@
119
99
  "{,hover:,focus:,focus-visible:,active:}rounded{,-t,-r,-b,-l,-tl,-tr,-br,-bl}{,-none,-sm,-md,-lg,-xl,-2xl,-3xl,-full}"
120
100
  );
121
101
 
122
- /* Divide — borders between flex/grid children. Structural separators, so no
123
- variants (a divider rarely changes on hover or at a breakpoint). Colors are
124
- the two foundation borders only. */
102
+ /* Divide gets no variants structural separators don't change on hover or
103
+ at a breakpoint */
125
104
  @source inline("divide-{x,y}{,-0,-2,-4,-8}");
126
105
  @source inline("divide-{x,y}-reverse");
127
106
  @source inline("divide-{solid,dashed,dotted,double,none}");
128
107
  @source inline("divide-{border,border-strong}");
129
108
 
130
- /* Outline + ring — interactive */
131
109
  @source inline("{,hover:,focus:,focus-visible:,active:}outline{,-0,-1,-2,-4,-8}");
132
110
  @source inline(
133
111
  "{,hover:,focus:,focus-visible:,active:}outline-{none,dashed,dotted,double,hidden}"
@@ -136,27 +114,25 @@
136
114
  @source inline("{,hover:,focus:,focus-visible:,active:}ring{,-0,-1,-2,-4,-8}");
137
115
  @source inline("{,hover:,focus:,focus-visible:,active:}ring-inset");
138
116
 
139
- /* Shadow — interactive */
140
117
  @source inline(
141
118
  "{,hover:,focus:,focus-visible:,active:}shadow{,-2xs,-xs,-sm,-md,-lg,-xl,-2xl,-inner,-none}"
142
119
  );
143
120
 
144
- /* Foundation semantic colors — interactive (kept in sync with theme.css) */
121
+ /* Foundation semantic colors — kept in sync with theme.css */
145
122
  @source inline(
146
123
  "{,hover:,focus:,focus-visible:,active:}{bg,text,border,outline,ring,shadow}-{surface,surface-muted,surface-strong,text,text-muted,border,border-strong}"
147
124
  );
148
125
 
149
- /* Accent semantic colors — each has base + -hover + -muted + -content (kept in sync with theme.css) */
126
+ /* Accent semantic colors — kept in sync with theme.css */
150
127
  @source inline(
151
128
  "{,hover:,focus:,focus-visible:,active:}{bg,text,border,outline,ring,shadow}-{primary,system-accent,danger,success,warning,info}{,-hover,-muted,-content}"
152
129
  );
153
130
 
154
- /* Link / focus — interactive blue. Narrower shapes than the accents above:
155
- focus rings only need `outline-focus`, links only `text-link{,-hover}`. */
131
+ /* Link / focus — deliberately narrower than the accents above: focus rings
132
+ only need `outline-focus`, links only `text-link{,-hover}` */
156
133
  @source inline("{,focus-visible:}outline-focus");
157
134
  @source inline("{,hover:,focus-visible:}text-link{,-hover}");
158
135
 
159
- /* Cursor + opacity — interactive */
160
136
  @source inline(
161
137
  "{,hover:,focus:,focus-visible:,active:}cursor-{auto,default,pointer,wait,text,move,help,not-allowed,none,progress,grab,grabbing,col-resize,row-resize,zoom-in,zoom-out}"
162
138
  );
@@ -164,9 +140,7 @@
164
140
  "{,hover:,focus:,focus-visible:,active:}opacity-{0,5,10,15,20,25,30,40,50,60,70,75,80,90,95,100}"
165
141
  );
166
142
 
167
- /* Interaction primitives (select-all an ID cell, disable a layer) — no variants */
168
143
  @source inline("pointer-events-{none,auto}");
169
144
  @source inline("select-{none,text,all,auto}");
170
145
 
171
- /* Z-index — no variants */
172
146
  @source inline("z-{0,10,20,30,40,50,auto}");