@aortl/admin-css 0.14.0 → 0.15.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aortl/admin-css",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Pre-built CSS design system. Drop in via <link> and use semantic class names.",
5
5
  "keywords": [
6
6
  "components",
@@ -26,7 +26,7 @@
26
26
  px-4 py-3 cursor-pointer select-none
27
27
  text-sm font-medium text-text
28
28
  hover:bg-surface-muted
29
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
29
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
30
30
  list-style: none;
31
31
  }
32
32
 
@@ -46,51 +46,33 @@
46
46
  min-width: 0;
47
47
  }
48
48
 
49
+ /* Solid status fill — the variant color carries the signal, and the title,
50
+ leading icon, and body all sit on top in the matching `-content` color
51
+ (white on the colored accents, black on bright yellow). Title/icon inherit
52
+ that content color from the root, so no per-variant text rule is needed.
53
+ The description drops to 85% opacity to read as secondary text without
54
+ introducing a second hue. */
49
55
  .alert-info {
50
- @apply bg-info-muted border-info-muted;
56
+ @apply bg-info border-info text-info-content;
51
57
  }
52
58
 
53
59
  .alert-success {
54
- @apply bg-success-muted border-success-muted;
60
+ @apply bg-success border-success text-success-content;
55
61
  }
56
62
 
57
63
  .alert-warning {
58
- @apply bg-warning-muted border-warning-muted;
64
+ @apply bg-warning border-warning text-warning-content;
59
65
  }
60
66
 
61
67
  .alert-danger {
62
- @apply bg-danger-muted border-danger-muted;
68
+ @apply bg-danger border-danger text-danger-content;
63
69
  }
64
70
 
65
71
  .alert-title {
66
72
  @apply font-medium;
67
73
  }
68
74
 
69
- .alert-info .alert-title,
70
- .alert-info > :is(i, svg):first-child {
71
- @apply text-info;
72
- }
73
-
74
- .alert-success .alert-title,
75
- .alert-success > :is(i, svg):first-child {
76
- @apply text-success;
77
- }
78
-
79
- /* Warning title/icon use `text-text` rather than `text-warning`: the warning
80
- accent is yellow-400 in both modes, which fails AA contrast against the
81
- muted yellow background in light mode. The muted bg + border still carry
82
- the warning signal. */
83
- .alert-warning .alert-title,
84
- .alert-warning > :is(i, svg):first-child {
85
- @apply text-text;
86
- }
87
-
88
- .alert-danger .alert-title,
89
- .alert-danger > :is(i, svg):first-child {
90
- @apply text-danger;
91
- }
92
-
93
75
  .alert-description {
94
- @apply text-text-muted;
76
+ opacity: 0.85;
95
77
  }
96
78
  }
@@ -12,30 +12,28 @@
12
12
  flex-shrink: 0;
13
13
  }
14
14
 
15
- /* Variants — match the alert palette so danger/success/etc. stay coherent
16
- across status indicators and chips in tables. The bare `.badge` (no
17
- modifier) renders the neutral look, now folded into the base. */
15
+ /* Variants — solid status fills, matching the alert palette so danger/
16
+ success/etc. stay coherent across status indicators and chips in tables.
17
+ Each sits on the full-strength status color with the matching `-content`
18
+ text (white on the colored accents, black on bright yellow). The bare
19
+ `.badge` (no modifier) renders the neutral look, folded into the base. */
18
20
  .badge-info {
19
- @apply bg-info-muted text-info border-info-muted;
21
+ @apply bg-info text-info-content border-info;
20
22
  }
21
23
 
22
24
  .badge-success {
23
- @apply bg-success-muted text-success border-success-muted;
25
+ @apply bg-success text-success-content border-success;
24
26
  }
25
27
 
26
- /* Warning text uses `text-text` rather than `text-warning`: the warning
27
- accent is yellow-400 in both modes, which fails AA contrast against the
28
- muted yellow background in light mode. The muted bg + border still carry
29
- the warning signal. */
30
28
  .badge-warning {
31
- @apply bg-warning-muted text-text border-warning-muted;
29
+ @apply bg-warning text-warning-content border-warning;
32
30
  }
33
31
 
34
32
  .badge-danger {
35
- @apply bg-danger-muted text-danger border-danger-muted;
33
+ @apply bg-danger text-danger-content border-danger;
36
34
  }
37
35
 
38
- /* Solid variantsfor stronger visual weight (counts on tabs, etc.) */
36
+ /* Solid neutralhigh-contrast ink fill (counts on tabs, etc.) */
39
37
  .badge-primary {
40
38
  @apply bg-primary text-primary-content;
41
39
  }
@@ -11,7 +11,7 @@
11
11
  @apply inline-flex items-center gap-1.5
12
12
  text-text-muted no-underline
13
13
  hover:text-text
14
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
14
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
15
15
  }
16
16
 
17
17
  /* `aria-current` on the last item promotes it to body text weight. Non-links
@@ -6,7 +6,7 @@
6
6
  bg-surface-muted text-text hover:bg-surface-strong
7
7
  transition-colors duration-150
8
8
  cursor-pointer select-none
9
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
9
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
10
10
  disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none;
11
11
  }
12
12
 
@@ -5,7 +5,7 @@
5
5
  border border-border
6
6
  rounded-xl
7
7
  shadow-xs
8
- overflow-hidden;
8
+ overflow-auto;
9
9
  }
10
10
 
11
11
  .card-body {
@@ -29,6 +29,14 @@
29
29
  @apply flex items-center gap-1 ml-auto -mt-0.5;
30
30
  }
31
31
 
32
+ /* Toolbar buttons run small (usually `btn-sm`, whose icons inherit `text-xs`);
33
+ bump the glyph to 1rem so the controls stay easy to scan and hit. Both
34
+ bundles size icons off `font-size` — the Tabler webfont (`<i>`) and React's
35
+ `size="1em"` SVG — so this single rule enlarges both identically. */
36
+ .card-toolbar :is(i, svg) {
37
+ font-size: 1.25rem;
38
+ }
39
+
32
40
  .card-description {
33
41
  @apply text-sm text-text-muted;
34
42
  }
@@ -15,7 +15,7 @@
15
15
  * `--donut-segments` (CSS can't sum a variable-length sibling
16
16
  * list, so the string arrives whole).
17
17
  *
18
- * Colour: single-series follows `currentColor` (default `--color-primary`,
18
+ * Colour: single-series follows `currentColor` (default `--color-info`,
19
19
  * recoloured by the `.chart-success`/etc. variants like `.progress`).
20
20
  * Multi-series colours are set inline per bar/segment (`--bar-color` /
21
21
  * `--segment-color` / legend `--legend-color`); there is no chart token
@@ -30,7 +30,7 @@
30
30
  --chart-height: 8rem; /* bar track cross-axis size (md) */
31
31
  --chart-size: 8rem; /* donut diameter (md) */
32
32
  --chart-gap: 0.25rem;
33
- color: var(--color-primary);
33
+ color: var(--color-info);
34
34
  }
35
35
 
36
36
  /* Single-series semantic variants — recolour currentColor, like progress. */
@@ -4,7 +4,7 @@
4
4
  rounded-sm border bg-surface
5
5
  cursor-pointer
6
6
  transition-colors duration-150
7
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
7
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
8
8
  disabled:opacity-50 disabled:cursor-not-allowed;
9
9
  }
10
10
 
@@ -90,6 +90,6 @@
90
90
  hover:bg-surface-strong hover:text-text
91
91
  cursor-pointer
92
92
  transition-colors duration-150
93
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
93
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
94
94
  }
95
95
  }
@@ -4,7 +4,7 @@
4
4
  bg-surface text-text
5
5
  border border-border hover:border-border-strong rounded-lg overflow-hidden
6
6
  transition-colors duration-150
7
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
7
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
8
8
  disabled:opacity-50 disabled:cursor-not-allowed
9
9
  file:px-3 file:py-2 file:mr-3
10
10
  file:text-sm file:font-medium file:leading-none
@@ -16,7 +16,7 @@
16
16
  .footer-link {
17
17
  @apply text-text-muted no-underline
18
18
  hover:text-text hover:underline
19
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
19
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
20
20
  rounded-sm;
21
21
  }
22
22
 
@@ -6,7 +6,7 @@
6
6
  border border-border hover:border-border-strong
7
7
  transition-colors duration-150
8
8
  placeholder:text-text-muted
9
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
9
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
10
10
  disabled:opacity-50 disabled:cursor-not-allowed;
11
11
  }
12
12
 
@@ -1,10 +1,10 @@
1
1
  @layer components {
2
2
  .link {
3
3
  @apply inline-flex items-center gap-1
4
- text-primary underline underline-offset-2
4
+ text-link underline underline-offset-2
5
5
  rounded-sm transition-colors duration-150
6
- hover:text-primary-hover
7
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
6
+ hover:text-link-hover
7
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
8
8
  }
9
9
 
10
10
  /* Keep a leading icon from squishing when the link text wraps. The trailing
@@ -11,7 +11,7 @@
11
11
  @apply inline-flex items-center gap-1.5
12
12
  cursor-pointer select-none
13
13
  transition-colors duration-150
14
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
14
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
15
15
  list-style: none;
16
16
  }
17
17
 
@@ -23,7 +23,7 @@
23
23
  hover:bg-surface-strong
24
24
  cursor-pointer select-none
25
25
  transition-colors duration-150
26
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
26
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
27
27
  }
28
28
 
29
29
  .navbar-item[aria-current="page"],
@@ -49,7 +49,7 @@
49
49
  rounded-md text-text bg-transparent
50
50
  hover:bg-surface-strong
51
51
  cursor-pointer
52
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
52
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
53
53
  }
54
54
 
55
55
  .navbar-mobile-toggle::before {
@@ -19,7 +19,7 @@
19
19
  hover:bg-surface-muted
20
20
  cursor-pointer select-none no-underline
21
21
  transition-colors duration-150
22
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
22
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
23
23
  disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none;
24
24
  }
25
25
 
@@ -12,7 +12,7 @@
12
12
  border-radius: 9999px;
13
13
  overflow: hidden;
14
14
  background-color: var(--color-surface-strong);
15
- color: var(--color-primary);
15
+ color: var(--color-info);
16
16
  }
17
17
 
18
18
  .progress::-webkit-progress-bar {
@@ -73,7 +73,7 @@
73
73
  ml-auto rounded
74
74
  cursor-pointer border-0 bg-transparent
75
75
  text-text-muted hover:text-text
76
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
76
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
77
77
  display: none;
78
78
  flex-shrink: 0;
79
79
  padding: 0.125rem;
@@ -4,7 +4,7 @@
4
4
  rounded-full border bg-surface
5
5
  cursor-pointer
6
6
  transition-colors duration-150
7
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
7
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
8
8
  disabled:opacity-50 disabled:cursor-not-allowed;
9
9
  }
10
10
 
@@ -6,12 +6,12 @@
6
6
  border border-border hover:border-border-strong
7
7
  cursor-pointer select-none
8
8
  transition-colors duration-150
9
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
9
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
10
10
  disabled:opacity-50 disabled:cursor-not-allowed;
11
11
  }
12
12
 
13
13
  .select[data-popup-open] {
14
- @apply outline-2 outline-offset-2 outline-primary;
14
+ @apply outline-2 outline-offset-2 outline-focus;
15
15
  }
16
16
 
17
17
  .select[data-placeholder] {
@@ -66,7 +66,7 @@
66
66
  bg-transparent hover:bg-surface-strong
67
67
  cursor-pointer select-none no-underline
68
68
  transition-colors duration-150
69
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
69
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
70
70
  }
71
71
 
72
72
  .sidebar-item[aria-current="page"],
@@ -105,7 +105,7 @@
105
105
  bg-transparent hover:bg-surface-strong
106
106
  cursor-pointer select-none
107
107
  transition-colors duration-150
108
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
108
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
109
109
  list-style: none;
110
110
  }
111
111
 
@@ -160,7 +160,7 @@
160
160
  bg-transparent hover:bg-surface-strong
161
161
  cursor-pointer select-none no-underline
162
162
  transition-colors duration-150
163
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary;
163
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus;
164
164
  }
165
165
 
166
166
  .sidebar-subitem[aria-current="page"],
@@ -182,7 +182,7 @@
182
182
  }
183
183
 
184
184
  .sidebar-collapse-toggle:has(.sidebar-toggle:focus-visible) {
185
- @apply outline-2 outline-offset-2 outline-primary;
185
+ @apply outline-2 outline-offset-2 outline-focus;
186
186
  }
187
187
 
188
188
  /* Chevron-left when expanded; flips to chevron-right when collapsed. */
@@ -4,7 +4,7 @@
4
4
  rounded-full border border-transparent
5
5
  cursor-pointer
6
6
  transition-colors duration-150
7
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
7
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
8
8
  disabled:opacity-50 disabled:cursor-not-allowed;
9
9
  }
10
10
 
@@ -119,6 +119,6 @@
119
119
  @apply absolute inset-0;
120
120
  }
121
121
  .table-row-link:focus-within {
122
- @apply outline-2 -outline-offset-2 outline-primary;
122
+ @apply outline-2 -outline-offset-2 outline-focus;
123
123
  }
124
124
  }
@@ -20,7 +20,7 @@
20
20
  text-text-muted bg-transparent
21
21
  border-0 cursor-pointer select-none
22
22
  transition-colors duration-150
23
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
23
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
24
24
  hover:text-text
25
25
  disabled:opacity-50 disabled:cursor-not-allowed;
26
26
  }
@@ -54,7 +54,7 @@
54
54
  }
55
55
 
56
56
  .tabs .tab-input:focus-visible + .tab {
57
- @apply outline-2 outline-offset-2 outline-primary;
57
+ @apply outline-2 outline-offset-2 outline-focus;
58
58
  }
59
59
 
60
60
  /* Default — underline marker on the active tab. The pseudo sits below the
@@ -6,7 +6,7 @@
6
6
  border border-border hover:border-border-strong
7
7
  transition-colors duration-150
8
8
  placeholder:text-text-muted
9
- focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary
9
+ focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus
10
10
  disabled:opacity-50 disabled:cursor-not-allowed;
11
11
  }
12
12
 
package/src/theme.css CHANGED
@@ -219,12 +219,25 @@
219
219
  --color-code-surface: light-dark(var(--color-base-150), var(--color-base-950));
220
220
  --color-code-text: light-dark(var(--color-base-800), var(--color-base-200));
221
221
 
222
- /* Primary — Flexoki blue */
223
- --color-primary: light-dark(var(--color-blue-600), var(--color-blue-400));
224
- --color-primary-hover: light-dark(var(--color-blue-700), var(--color-blue-300));
225
- --color-primary-muted: light-dark(var(--color-blue-50), var(--color-blue-950));
222
+ /* Primary — high-contrast neutral (ink). Inverts with the mode: near-black
223
+ on light surfaces, near-white on dark ones, so a solid `btn-primary` fill
224
+ always reads against the surface. Unlike the colored accents, `-hover`
225
+ moves *toward* the surface (you can't darken past ink), and `-muted` is a
226
+ neutral gray wash — `bg-primary-muted` selected/active states read as a
227
+ quiet fill rather than a colored highlight. The interactive blue that used
228
+ to live here now drives `--color-link` / `--color-focus` and `info`. */
229
+ --color-primary: light-dark(var(--color-black), var(--color-paper));
230
+ --color-primary-hover: light-dark(var(--color-base-800), var(--color-base-200));
231
+ --color-primary-muted: light-dark(var(--color-base-150), var(--color-base-800));
226
232
  --color-primary-content: light-dark(var(--color-paper), var(--color-black));
227
233
 
234
+ /* Link / focus — the interactive blue (Flexoki blue, formerly `primary`).
235
+ Split into two tokens so link text and focus rings can be retinted
236
+ independently of the `info` status color, even though both start blue. */
237
+ --color-link: light-dark(var(--color-blue-600), var(--color-blue-400));
238
+ --color-link-hover: light-dark(var(--color-blue-700), var(--color-blue-300));
239
+ --color-focus: light-dark(var(--color-blue-600), var(--color-blue-400));
240
+
228
241
  /* System accent — per-app brand signal. Drives the navbar's 2px bottom
229
242
  stripe and the footer's matching top stripe (both always on), plus
230
243
  `.brand-tile` backgrounds. Defaults to a neutral gray so an un-branded
@@ -267,10 +280,10 @@
267
280
  --color-warning-muted: light-dark(var(--color-yellow-50), var(--color-yellow-950));
268
281
  --color-warning-content: var(--color-black);
269
282
 
270
- /* Info — cyan */
271
- --color-info: light-dark(var(--color-cyan-600), var(--color-cyan-400));
272
- --color-info-hover: light-dark(var(--color-cyan-700), var(--color-cyan-300));
273
- --color-info-muted: light-dark(var(--color-cyan-50), var(--color-cyan-950));
283
+ /* Info — Flexoki blue (the calm "FYI" status color) */
284
+ --color-info: light-dark(var(--color-blue-600), var(--color-blue-400));
285
+ --color-info-hover: light-dark(var(--color-blue-700), var(--color-blue-300));
286
+ --color-info-muted: light-dark(var(--color-blue-50), var(--color-blue-950));
274
287
  --color-info-content: light-dark(var(--color-paper), var(--color-black));
275
288
  }
276
289
 
package/src/utilities.css CHANGED
@@ -151,6 +151,11 @@
151
151
  "{,hover:,focus:,focus-visible:,active:}{bg,text,border,outline,ring,shadow}-{primary,system-accent,danger,success,warning,info}{,-hover,-muted,-content}"
152
152
  );
153
153
 
154
+ /* Link / focus — interactive blue. Narrower shapes than the accents above:
155
+ focus rings only need `outline-focus`, links only `text-link{,-hover}`. */
156
+ @source inline("{,focus-visible:}outline-focus");
157
+ @source inline("{,hover:,focus-visible:}text-link{,-hover}");
158
+
154
159
  /* Cursor + opacity — interactive */
155
160
  @source inline(
156
161
  "{,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}"