@a4ui/core 0.24.0 → 0.24.2

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/README.md CHANGED
@@ -206,6 +206,16 @@ import { ProductCard, CartSummary } from '@a4ui/core/commerce'
206
206
  import { DonutChart, Sparkline } from '@a4ui/core/charts'
207
207
  ```
208
208
 
209
+ ## Example pages
210
+
211
+ Full-page templates built entirely with the components above — browse the whole
212
+ gallery at **[a4ui.pages.dev/#/examples](https://a4ui.pages.dev/#/examples)**. Each
213
+ one reskins under every theme.
214
+
215
+ [![Boutique — a faceted product catalog with a filter sidebar, three switchable product-card styles, and a cart drawer](https://a4ui.pages.dev/showcase-boutique.png)](https://a4ui.pages.dev/#/examples/boutique)
216
+
217
+ [![Showpiece — a product detail page with a gallery lightbox, price/coupon/financing block, a condition meter, and a spec sheet](https://a4ui.pages.dev/showcase-showpiece.png)](https://a4ui.pages.dev/#/examples/showpiece)
218
+
209
219
  ## Why A4ui
210
220
 
211
221
  | | **A4ui** | Kobalte | shadcn-solid | Hope UI |
@@ -447,6 +447,9 @@ function He(e) {
447
447
  "aria-label": "Decrement",
448
448
  children: "−"
449
449
  }), h(_.Input, {
450
+ get "aria-label"() {
451
+ return e["aria-label"];
452
+ },
450
453
  class: "w-16 border-y border-input bg-background px-3 py-2 text-center text-sm text-foreground outline-none transition-colors a4-field"
451
454
  }), h(_.IncrementTrigger, {
452
455
  get class() {
package/dist/commerce.js CHANGED
@@ -1,7 +1,7 @@
1
- import { insert as n, createComponent as c, memo as k, effect as b, className as C, template as v, delegateEvents as A, setAttribute as w, setStyleProperty as j } from "solid-js/web";
2
- import { Show as $, For as S, createSignal as B, createMemo as R } from "solid-js";
1
+ import { insert as n, createComponent as c, memo as k, effect as $, className as C, template as v, delegateEvents as A, setAttribute as w, setStyleProperty as j } from "solid-js/web";
2
+ import { Show as b, For as S, createSignal as B, createMemo as R } from "solid-js";
3
3
  import { c as _ } from "./cn-B6yFEsav.js";
4
- import { B as D, C as O, R as G, a as M, b as z, N as U, c as K } from "./NumberInput-enx_0iVh.js";
4
+ import { B as D, C as O, R as G, a as M, b as z, N as U, c as K } from "./NumberInput-DcJlXNKq.js";
5
5
  import { Minus as Q, Plus as V, Trash2 as X, X as Z, CreditCard as H } from "lucide-solid";
6
6
  var J = /* @__PURE__ */ v('<span class="text-muted-foreground line-through">'), W = /* @__PURE__ */ v("<div><span>");
7
7
  const Y = {
@@ -16,7 +16,7 @@ function L(e) {
16
16
  }).format(s), o = () => (e.compareAt ?? 0) > e.amount, r = () => Math.round((1 - e.amount / e.compareAt) * 100);
17
17
  return (() => {
18
18
  var s = W(), d = s.firstChild;
19
- return n(d, () => i(e.amount)), n(s, c($, {
19
+ return n(d, () => i(e.amount)), n(s, c(b, {
20
20
  get when() {
21
21
  return o();
22
22
  },
@@ -31,7 +31,7 @@ function L(e) {
31
31
  }
32
32
  })];
33
33
  }
34
- }), null), b((a) => {
34
+ }), null), $((a) => {
35
35
  var t = _("inline-flex items-center gap-2", e.class), u = _("font-bold text-foreground", Y[e.size ?? "md"]);
36
36
  return t !== a.e && C(s, a.e = t), u !== a.t && C(d, a.t = u), a;
37
37
  }, {
@@ -49,7 +49,7 @@ function ee(e) {
49
49
  class: "h-4 w-4"
50
50
  })), n(u, () => e.value), f.$$click = d, n(f, c(V, {
51
51
  class: "h-4 w-4"
52
- })), b((l) => {
52
+ })), $((l) => {
53
53
  var g = _("inline-flex items-stretch rounded-md border border-input", e.class), h = e.disabled || e.value <= i(), m = e.disabled || e.value >= o();
54
54
  return g !== l.e && C(a, l.e = g), h !== l.t && (t.disabled = l.t = h), m !== l.a && (f.disabled = l.a = m), l;
55
55
  }, {
@@ -87,15 +87,15 @@ function De(e) {
87
87
  get children() {
88
88
  return [(() => {
89
89
  var i = ne(), o = i.firstChild;
90
- return n(i, c($, {
90
+ return n(i, c(b, {
91
91
  get when() {
92
92
  return e.badge;
93
93
  },
94
94
  get children() {
95
95
  var r = te();
96
- return n(r, () => e.badge), b(() => C(r, _("absolute -right-9 top-3.5 w-32 rotate-45 py-1 text-center text-[11px] font-semibold uppercase tracking-wide shadow-md", ie[ue(e.badge, e.badgeTone)]))), r;
96
+ return n(r, () => e.badge), $(() => C(r, _("absolute -right-9 top-3.5 w-32 rotate-45 py-1 text-center text-[11px] font-semibold uppercase tracking-wide shadow-md", ie[ue(e.badge, e.badgeTone)]))), r;
97
97
  }
98
- }), null), b((r) => {
98
+ }), null), $((r) => {
99
99
  var s = e.image, d = e.title;
100
100
  return s !== r.e && w(o, "src", r.e = s), d !== r.t && w(o, "alt", r.t = d), r;
101
101
  }, {
@@ -104,7 +104,7 @@ function De(e) {
104
104
  }), i;
105
105
  })(), (() => {
106
106
  var i = ae(), o = i.firstChild;
107
- return n(i, c($, {
107
+ return n(i, c(b, {
108
108
  get when() {
109
109
  return e.brand;
110
110
  },
@@ -112,7 +112,7 @@ function De(e) {
112
112
  var r = le();
113
113
  return n(r, () => e.brand), r;
114
114
  }
115
- }), o), n(o, () => e.title), n(i, c($, {
115
+ }), o), n(o, () => e.title), n(i, c(b, {
116
116
  get when() {
117
117
  return e.category;
118
118
  },
@@ -120,7 +120,7 @@ function De(e) {
120
120
  var r = re();
121
121
  return n(r, () => e.category), r;
122
122
  }
123
- }), null), n(i, c($, {
123
+ }), null), n(i, c(b, {
124
124
  get when() {
125
125
  return e.rating !== void 0;
126
126
  },
@@ -146,7 +146,7 @@ function De(e) {
146
146
  get locale() {
147
147
  return e.locale;
148
148
  }
149
- }), null), n(i, c($, {
149
+ }), null), n(i, c(b, {
150
150
  get when() {
151
151
  return e.onAddToCart;
152
152
  },
@@ -169,7 +169,7 @@ var ce = /* @__PURE__ */ v("<div>");
169
169
  function Le(e) {
170
170
  return (() => {
171
171
  var i = ce();
172
- return n(i, () => e.children), b(() => C(i, _("grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4", e.class))), i;
172
+ return n(i, () => e.children), $(() => C(i, _("grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4", e.class))), i;
173
173
  })();
174
174
  }
175
175
  var de = /* @__PURE__ */ v('<img class="h-16 w-16 shrink-0 rounded-md bg-muted object-cover">'), oe = /* @__PURE__ */ v('<button type=button aria-label="Remove item"class="text-muted-foreground hover:text-foreground">'), se = /* @__PURE__ */ v('<div><div class="min-w-[8rem] flex-1"><p class="line-clamp-1 font-medium text-foreground"></p></div><span class="min-w-[4rem] text-right font-medium tabular-nums text-foreground">');
@@ -180,13 +180,13 @@ function Oe(e) {
180
180
  }).format(r);
181
181
  return (() => {
182
182
  var r = se(), s = r.firstChild, d = s.firstChild, a = s.nextSibling;
183
- return n(r, c($, {
183
+ return n(r, c(b, {
184
184
  get when() {
185
185
  return e.image;
186
186
  },
187
187
  get children() {
188
188
  var t = de();
189
- return b((u) => {
189
+ return $((u) => {
190
190
  var f = e.image, l = e.title;
191
191
  return f !== u.e && w(t, "src", u.e = f), l !== u.t && w(t, "alt", u.t = l), u;
192
192
  }, {
@@ -214,7 +214,7 @@ function Oe(e) {
214
214
  return (u = e.onQuantityChange) == null ? void 0 : u.call(e, t);
215
215
  },
216
216
  min: 1
217
- }), a), n(a, () => o(i())), n(r, c($, {
217
+ }), a), n(a, () => o(i())), n(r, c(b, {
218
218
  get when() {
219
219
  return e.onRemove;
220
220
  },
@@ -227,7 +227,7 @@ function Oe(e) {
227
227
  class: "h-4 w-4"
228
228
  })), t;
229
229
  }
230
- }), null), b(() => C(r, _("flex flex-wrap items-center gap-4", e.class))), r;
230
+ }), null), $(() => C(r, _("flex flex-wrap items-center gap-4", e.class))), r;
231
231
  })();
232
232
  }
233
233
  A(["click"]);
@@ -247,7 +247,7 @@ function Ge(e) {
247
247
  var u = ge(), f = u.firstChild, l = f.nextSibling;
248
248
  return n(f, () => t.label), n(l, () => i(t.amount)), u;
249
249
  })()
250
- }), r), n(a, () => i(e.total)), n(o, c($, {
250
+ }), r), n(a, () => i(e.total)), n(o, c(b, {
251
251
  get when() {
252
252
  return e.onCheckout;
253
253
  },
@@ -263,7 +263,7 @@ function Ge(e) {
263
263
  }
264
264
  });
265
265
  }
266
- }), null), b(() => C(o, _("card glow-edge rounded-xl p-5 text-card-foreground", e.class))), o;
266
+ }), null), $(() => C(o, _("card glow-edge rounded-xl p-5 text-card-foreground", e.class))), o;
267
267
  })();
268
268
  }
269
269
  var fe = /* @__PURE__ */ v('<div><p class="text-sm font-semibold text-foreground"></p><div class=space-y-1.5>'), ve = /* @__PURE__ */ v('<span class="text-xs text-muted-foreground">'), he = /* @__PURE__ */ v('<div class="flex items-center justify-between gap-2">');
@@ -288,7 +288,7 @@ function q(e) {
288
288
  get label() {
289
289
  return d.label;
290
290
  }
291
- }), null), n(a, c($, {
291
+ }), null), n(a, c(b, {
292
292
  get when() {
293
293
  return d.count != null;
294
294
  },
@@ -298,13 +298,13 @@ function q(e) {
298
298
  }
299
299
  }), null), a;
300
300
  })()
301
- })), b(() => C(o, _("space-y-2", e.class))), o;
301
+ })), $(() => C(o, _("space-y-2", e.class))), o;
302
302
  })();
303
303
  }
304
- var xe = /* @__PURE__ */ v('<div class=space-y-2><p class="text-sm font-semibold text-foreground">'), $e = /* @__PURE__ */ v('<p class="text-sm text-muted-foreground"> results'), be = /* @__PURE__ */ v('<div class="flex flex-wrap gap-2">'), _e = /* @__PURE__ */ v('<div><div class="flex items-center justify-between gap-2">'), Ce = /* @__PURE__ */ v('<span class="inline-flex items-center gap-1 rounded-full border border-border bg-muted px-2 py-0.5 text-xs"><button type=button class="text-muted-foreground hover:text-foreground">'), we = /* @__PURE__ */ v('<div class=space-y-2><div class="flex items-center justify-between"><p class="text-sm font-semibold text-foreground">Price</p><p class="text-xs text-muted-foreground">$<!> – $</p></div><div class="flex items-center gap-2"><span class="text-sm text-muted-foreground">–');
304
+ var xe = /* @__PURE__ */ v('<div class=space-y-2><p class="text-sm font-semibold text-foreground">'), be = /* @__PURE__ */ v('<p class="text-sm text-muted-foreground"> results'), $e = /* @__PURE__ */ v('<div class="flex flex-wrap gap-2">'), _e = /* @__PURE__ */ v('<div><div class="flex items-center justify-between gap-2">'), Ce = /* @__PURE__ */ v('<span class="inline-flex items-center gap-1 rounded-full border border-border bg-muted px-2 py-0.5 text-xs"><button type=button class="text-muted-foreground hover:text-foreground">'), we = /* @__PURE__ */ v('<div class=space-y-2><div class="flex items-center justify-between"><p class="text-sm font-semibold text-foreground">Price</p><p class="text-xs text-muted-foreground">$<!> – $</p></div><div class="flex items-center gap-2"><span class="text-sm text-muted-foreground">–');
305
305
  function ye(e) {
306
306
  const [i, o] = B(e.section.defaultOpen ?? !0);
307
- return c($, {
307
+ return c(b, {
308
308
  get when() {
309
309
  return e.section.collapsible ?? !0;
310
310
  },
@@ -381,15 +381,15 @@ function ze(e) {
381
381
  };
382
382
  return (() => {
383
383
  var d = _e(), a = d.firstChild;
384
- return n(a, c($, {
384
+ return n(a, c(b, {
385
385
  get when() {
386
386
  return e.resultCount != null;
387
387
  },
388
388
  get children() {
389
- var t = $e(), u = t.firstChild;
389
+ var t = be(), u = t.firstChild;
390
390
  return n(t, () => e.resultCount, u), t;
391
391
  }
392
- }), null), n(a, c($, {
392
+ }), null), n(a, c(b, {
393
393
  get when() {
394
394
  return e.onClearAll;
395
395
  },
@@ -404,12 +404,12 @@ function ze(e) {
404
404
  children: "Clear all"
405
405
  });
406
406
  }
407
- }), null), n(d, c($, {
407
+ }), null), n(d, c(b, {
408
408
  get when() {
409
409
  return i().length > 0;
410
410
  },
411
411
  get children() {
412
- var t = be();
412
+ var t = $e();
413
413
  return n(t, c(S, {
414
414
  get each() {
415
415
  return i();
@@ -418,11 +418,11 @@ function ze(e) {
418
418
  var f = Ce(), l = f.firstChild;
419
419
  return n(f, () => u.label, l), l.$$click = () => o(u), n(l, c(Z, {
420
420
  class: "h-3 w-3"
421
- })), b(() => w(l, "aria-label", `Remove ${u.label}`)), f;
421
+ })), $(() => w(l, "aria-label", `Remove ${u.label}`)), f;
422
422
  })()
423
423
  })), t;
424
424
  }
425
- }), null), n(d, c($, {
425
+ }), null), n(d, c(b, {
426
426
  get when() {
427
427
  return e.price;
428
428
  },
@@ -440,7 +440,8 @@ function ze(e) {
440
440
  },
441
441
  get max() {
442
442
  return t().value[1];
443
- }
443
+ },
444
+ "aria-label": "Minimum price"
444
445
  }), y), n(x, c(U, {
445
446
  get value() {
446
447
  return t().value[1];
@@ -451,7 +452,8 @@ function ze(e) {
451
452
  },
452
453
  get max() {
453
454
  return t().max;
454
- }
455
+ },
456
+ "aria-label": "Maximum price"
455
457
  }), null), u;
456
458
  })()
457
459
  }), null), n(d, c(S, {
@@ -465,11 +467,11 @@ function ze(e) {
465
467
  },
466
468
  onChange: (u) => e.onChange(t.key, u)
467
469
  })
468
- }), null), b(() => C(d, _("space-y-5", e.class))), d;
470
+ }), null), $(() => C(d, _("space-y-5", e.class))), d;
469
471
  })();
470
472
  }
471
473
  A(["click"]);
472
- var Se = /* @__PURE__ */ v('<span class="text-muted-foreground line-through">'), ke = /* @__PURE__ */ v('<span class="inline-flex items-center gap-1 text-sm text-muted-foreground">As low as <!>/mo'), Ae = /* @__PURE__ */ v('<div><div class="flex flex-wrap items-center gap-2"><span>'), Me = /* @__PURE__ */ v('<span class="text-sm text-muted-foreground"> after code '), Pe = /* @__PURE__ */ v('<div class="flex flex-wrap items-center gap-2"><span class="inline-flex items-center gap-1 rounded-md border border-dashed border-primary/50 px-2 py-0.5 text-xs font-mono text-primary"> ');
474
+ var Se = /* @__PURE__ */ v('<span class="text-muted-foreground line-through">'), ke = /* @__PURE__ */ v('<span class="inline-flex items-center gap-1 text-sm text-muted-foreground">As low as <!>/mo'), Ae = /* @__PURE__ */ v('<div><div class="flex flex-wrap items-center gap-2"><span>'), Me = /* @__PURE__ */ v('<span class="text-sm text-muted-foreground"> after code '), Pe = /* @__PURE__ */ v('<div class="flex flex-wrap items-center gap-2"><span class="inline-flex items-center gap-1 rounded-md border border-dashed border-primary/50 px-2 py-0.5 text-xs font-mono text-foreground"> ');
473
475
  const Te = {
474
476
  md: "text-xl",
475
477
  lg: "text-3xl"
@@ -492,7 +494,7 @@ function Ke(e) {
492
494
  };
493
495
  return (() => {
494
496
  var t = Ae(), u = t.firstChild, f = u.firstChild;
495
- return n(f, () => i(e.amount)), n(u, c($, {
497
+ return n(f, () => i(e.amount)), n(u, c(b, {
496
498
  get when() {
497
499
  return o();
498
500
  },
@@ -507,13 +509,13 @@ function Ke(e) {
507
509
  }
508
510
  })];
509
511
  }
510
- }), null), n(t, c($, {
512
+ }), null), n(t, c(b, {
511
513
  get when() {
512
514
  return e.coupon;
513
515
  },
514
516
  children: (l) => (() => {
515
517
  var g = Pe(), h = g.firstChild, m = h.firstChild;
516
- return n(h, () => l().label ?? "Coupon", m), n(h, () => l().code, null), n(g, c($, {
518
+ return n(h, () => l().label ?? "Coupon", m), n(h, () => l().code, null), n(g, c(b, {
517
519
  get when() {
518
520
  return l().amount !== void 0;
519
521
  },
@@ -523,7 +525,7 @@ function Ke(e) {
523
525
  }
524
526
  }), null), g;
525
527
  })()
526
- }), null), n(t, c($, {
528
+ }), null), n(t, c(b, {
527
529
  get when() {
528
530
  return e.financing;
529
531
  },
@@ -533,14 +535,14 @@ function Ke(e) {
533
535
  class: "h-4 w-4"
534
536
  }), g), n(l, () => i(a()), h), l;
535
537
  }
536
- }), null), n(t, c($, {
538
+ }), null), n(t, c(b, {
537
539
  get when() {
538
540
  return e.note;
539
541
  },
540
542
  get children() {
541
543
  return e.note;
542
544
  }
543
- }), null), b((l) => {
545
+ }), null), $((l) => {
544
546
  var g = _("flex flex-col gap-1", e.class), h = _("font-bold text-foreground", Te[e.size ?? "lg"]);
545
547
  return g !== l.e && C(t, l.e = g), h !== l.t && C(f, l.t = h), l;
546
548
  }, {
@@ -582,7 +584,7 @@ function Qe(e) {
582
584
  return n(u, () => {
583
585
  var m;
584
586
  return (m = d()) == null ? void 0 : m.label;
585
- }), n(t, c($, {
587
+ }), n(t, c(b, {
586
588
  get when() {
587
589
  return e.showValue ?? !0;
588
590
  },
@@ -598,7 +600,7 @@ function Qe(e) {
598
600
  var x = Ne();
599
601
  return n(x, () => m == null ? void 0 : m.label), x;
600
602
  })()
601
- })), b((m) => {
603
+ })), $((m) => {
602
604
  var F;
603
605
  var x = _("flex flex-col gap-2", e.class), y = i(), P = o(), T = e.value, E = ((F = d()) == null ? void 0 : F.label) ?? "Condition", I = `${s()}%`, N = `${s()}%`;
604
606
  return x !== m.e && C(a, m.e = x), y !== m.t && w(f, "aria-valuemin", m.t = y), P !== m.a && w(f, "aria-valuemax", m.a = P), T !== m.o && w(f, "aria-valuenow", m.o = T), E !== m.i && w(f, "aria-label", m.i = E), I !== m.n && j(l, "width", m.n = I), N !== m.s && j(g, "left", m.s = N), m;
package/dist/elements.css CHANGED
@@ -22,7 +22,7 @@
22
22
  --primary: 217 91% 52%;
23
23
  --primary-foreground: 0 0% 100%;
24
24
  --accent: 199 89% 55%;
25
- --accent-foreground: 0 0% 100%;
25
+ --accent-foreground: 199 45% 12%;
26
26
  --ring: 217 91% 52%;
27
27
  --destructive: 0 72% 52%;
28
28
  --destructive-foreground: 0 0% 100%;
@@ -58,7 +58,7 @@
58
58
  --primary: 217 91% 52%;
59
59
  --primary-foreground: 0 0% 100%;
60
60
  --accent: 199 89% 48%;
61
- --accent-foreground: 0 0% 100%;
61
+ --accent-foreground: 199 45% 12%;
62
62
  --ring: 217 91% 52%;
63
63
  --destructive: 0 72% 50%;
64
64
  --destructive-foreground: 0 0% 100%;
@@ -3450,6 +3450,10 @@ html.calm .tile-glass {
3450
3450
  --tw-bg-opacity: 1;
3451
3451
  background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));
3452
3452
  }
3453
+ .data-\[checked\]\:text-primary-foreground[data-checked] {
3454
+ --tw-text-opacity: 1;
3455
+ color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
3456
+ }
3453
3457
  .data-\[pressed\]\:text-primary-foreground[data-pressed] {
3454
3458
  --tw-text-opacity: 1;
3455
3459
  color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
@@ -3458,10 +3462,6 @@ html.calm .tile-glass {
3458
3462
  --tw-text-opacity: 1;
3459
3463
  color: hsl(var(--foreground) / var(--tw-text-opacity, 1));
3460
3464
  }
3461
- .data-\[selected\]\:text-primary-foreground[data-selected] {
3462
- --tw-text-opacity: 1;
3463
- color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
3464
- }
3465
3465
  .data-\[disabled\]\:opacity-50[data-disabled] {
3466
3466
  opacity: 0.5;
3467
3467
  }
package/dist/full.css CHANGED
@@ -22,7 +22,7 @@
22
22
  --primary: 217 91% 52%;
23
23
  --primary-foreground: 0 0% 100%;
24
24
  --accent: 199 89% 55%;
25
- --accent-foreground: 0 0% 100%;
25
+ --accent-foreground: 199 45% 12%;
26
26
  --ring: 217 91% 52%;
27
27
  --destructive: 0 72% 52%;
28
28
  --destructive-foreground: 0 0% 100%;
@@ -58,7 +58,7 @@
58
58
  --primary: 217 91% 52%;
59
59
  --primary-foreground: 0 0% 100%;
60
60
  --accent: 199 89% 48%;
61
- --accent-foreground: 0 0% 100%;
61
+ --accent-foreground: 199 45% 12%;
62
62
  --ring: 217 91% 52%;
63
63
  --destructive: 0 72% 50%;
64
64
  --destructive-foreground: 0 0% 100%;
@@ -3450,6 +3450,10 @@ html.calm .tile-glass {
3450
3450
  --tw-bg-opacity: 1;
3451
3451
  background-color: hsl(var(--primary) / var(--tw-bg-opacity, 1));
3452
3452
  }
3453
+ .data-\[checked\]\:text-primary-foreground[data-checked] {
3454
+ --tw-text-opacity: 1;
3455
+ color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
3456
+ }
3453
3457
  .data-\[pressed\]\:text-primary-foreground[data-pressed] {
3454
3458
  --tw-text-opacity: 1;
3455
3459
  color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
@@ -3458,10 +3462,6 @@ html.calm .tile-glass {
3458
3462
  --tw-text-opacity: 1;
3459
3463
  color: hsl(var(--foreground) / var(--tw-text-opacity, 1));
3460
3464
  }
3461
- .data-\[selected\]\:text-primary-foreground[data-selected] {
3462
- --tw-text-opacity: 1;
3463
- color: hsl(var(--primary-foreground) / var(--tw-text-opacity, 1));
3464
- }
3465
3465
  .data-\[disabled\]\:opacity-50[data-disabled] {
3466
3466
  opacity: 0.5;
3467
3467
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const A4UI_VERSION = "0.24.0";
1
+ export declare const A4UI_VERSION = "0.24.2";
2
2
  export { cn } from './lib/cn';
3
3
  export { useTheme, toggleTheme, setTheme, storedTheme, applyTheme, toggled, type Theme } from './lib/theme';
4
4
  export { useEffects, isCalm, setEffects } from './lib/effects';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { c as p } from "./cn-B6yFEsav.js";
2
2
  import { createSignal as z, onCleanup as q, onMount as G, For as A, createMemo as Q, Show as S, createEffect as re, createUniqueId as vr, useContext as br, createContext as xr, splitProps as ie, Index as Re, on as Ht, Switch as $r, Match as We, ErrorBoundary as yr, Suspense as wr } from "solid-js";
3
- import { a as se, d as pr, C as Vt, e as Kt, f as Ut, m as X, B as _r, g as kr, h as Cr, s as Ue, i as Sr, u as Er } from "./NumberInput-enx_0iVh.js";
4
- import { b as bf, c as xf, N as $f, R as yf, j as wf, S as pf, T as _f, k as kf, l as Cf, n as Sf, p as Ef, r as Mf, o as Tf, q as Lf } from "./NumberInput-enx_0iVh.js";
3
+ import { a as se, d as pr, C as Vt, e as Kt, f as Ut, m as X, B as _r, g as kr, h as Cr, s as Ue, i as Sr, u as Er } from "./NumberInput-DcJlXNKq.js";
4
+ import { b as bf, c as xf, N as $f, R as yf, j as wf, S as pf, T as _f, k as kf, l as Cf, n as Sf, p as Ef, r as Mf, o as Tf, q as Lf } from "./NumberInput-DcJlXNKq.js";
5
5
  import { createComponent as o, memo as V, insert as s, template as v, effect as _, setAttribute as T, className as M, delegateEvents as Y, Portal as me, setStyleProperty as O, use as R, classList as qt, spread as ce, mergeProps as de, Dynamic as Gt, addEventListener as Ke, style as ue } from "solid-js/web";
6
6
  import { Accordion as _e } from "@kobalte/core/accordion";
7
7
  import { ChevronsLeft as Mr, ChevronLeft as Oe, ChevronRight as fe, ChevronsRight as Tr, CalendarDays as Wt, Clock as Lr, File as mt, Check as xe, X as ge, ChevronDown as qe, UploadCloud as Dr, CircleX as Jt, TriangleAlert as Zt, CircleCheck as Qt, Info as er, Copy as Ir, ChevronsUpDown as tr, ChevronsLeftRight as Ar, Inbox as Fr, Star as zr, ServerCrash as Pr, Compass as Rr, ArrowUp as Or, Plus as Br, ChevronUp as jr, Bell as Nr, GripVertical as ht, Loader2 as Yr, Satellite as Xr, Moon as Hr, Sun as Vr, Sparkles as Kr } from "lucide-solid";
@@ -2262,7 +2262,7 @@ function Hu(e) {
2262
2262
  get value() {
2263
2263
  return t.value;
2264
2264
  },
2265
- class: "relative z-10 flex cursor-pointer items-center px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors data-[selected]:text-primary-foreground",
2265
+ class: "relative z-10 flex cursor-pointer items-center px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors data-[checked]:text-primary-foreground",
2266
2266
  get children() {
2267
2267
  return [o(Ie.ItemInput, {}), o(Ie.ItemLabel, {
2268
2268
  get children() {
@@ -6918,7 +6918,7 @@ const wd = [
6918
6918
  primary: "217 91% 52%",
6919
6919
  "primary-foreground": "0 0% 100%",
6920
6920
  accent: "199 89% 55%",
6921
- "accent-foreground": "0 0% 100%",
6921
+ "accent-foreground": "199 45% 12%",
6922
6922
  ring: "217 91% 52%",
6923
6923
  destructive: "0 72% 52%",
6924
6924
  "destructive-foreground": "0 0% 100%"
@@ -6935,7 +6935,7 @@ const wd = [
6935
6935
  primary: "217 91% 52%",
6936
6936
  "primary-foreground": "0 0% 100%",
6937
6937
  accent: "199 89% 48%",
6938
- "accent-foreground": "0 0% 100%",
6938
+ "accent-foreground": "199 45% 12%",
6939
6939
  ring: "217 91% 52%",
6940
6940
  destructive: "0 72% 50%",
6941
6941
  "destructive-foreground": "0 0% 100%"
@@ -7222,7 +7222,7 @@ function ff() {
7222
7222
  }
7223
7223
  Id(e && hr(e) || gt);
7224
7224
  }
7225
- const mf = "0.24.0";
7225
+ const mf = "0.24.2";
7226
7226
  export {
7227
7227
  mf as A4UI_VERSION,
7228
7228
  du as Accordion,
package/dist/styles.css CHANGED
@@ -21,7 +21,7 @@
21
21
  --primary: 217 91% 52%;
22
22
  --primary-foreground: 0 0% 100%;
23
23
  --accent: 199 89% 55%;
24
- --accent-foreground: 0 0% 100%;
24
+ --accent-foreground: 199 45% 12%;
25
25
  --ring: 217 91% 52%;
26
26
  --destructive: 0 72% 52%;
27
27
  --destructive-foreground: 0 0% 100%;
@@ -57,7 +57,7 @@
57
57
  --primary: 217 91% 52%;
58
58
  --primary-foreground: 0 0% 100%;
59
59
  --accent: 199 89% 48%;
60
- --accent-foreground: 0 0% 100%;
60
+ --accent-foreground: 199 45% 12%;
61
61
  --ring: 217 91% 52%;
62
62
  --destructive: 0 72% 50%;
63
63
  --destructive-foreground: 0 0% 100%;
@@ -6,6 +6,8 @@ interface NumberInputProps {
6
6
  min?: number;
7
7
  /** Upper bound; the increment trigger disables itself at this value. */
8
8
  max?: number;
9
+ /** Accessible name applied to the input as its `aria-label` (no visible label is rendered). */
10
+ 'aria-label'?: string;
9
11
  class?: string;
10
12
  }
11
13
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a4ui/core",
3
- "version": "0.24.0",
3
+ "version": "0.24.2",
4
4
  "description": "A4ui — Spatial Glass design system & component library for SolidJS (Kobalte behavior + Tailwind glass tokens + motion).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -195,6 +195,7 @@ export function FacetSidebar(props: FacetSidebarProps): JSX.Element {
195
195
  onChange={setMin}
196
196
  min={price().min}
197
197
  max={price().value[1]}
198
+ aria-label="Minimum price"
198
199
  />
199
200
  <span class="text-sm text-muted-foreground">–</span>
200
201
  <NumberInput
@@ -202,6 +203,7 @@ export function FacetSidebar(props: FacetSidebarProps): JSX.Element {
202
203
  onChange={setMax}
203
204
  min={price().value[0]}
204
205
  max={price().max}
206
+ aria-label="Maximum price"
205
207
  />
206
208
  </div>
207
209
  </div>
@@ -110,7 +110,7 @@ export function PriceBlock(props: PriceBlockProps): JSX.Element {
110
110
  <Show when={props.coupon}>
111
111
  {(coupon) => (
112
112
  <div class="flex flex-wrap items-center gap-2">
113
- <span class="inline-flex items-center gap-1 rounded-md border border-dashed border-primary/50 px-2 py-0.5 text-xs font-mono text-primary">
113
+ <span class="inline-flex items-center gap-1 rounded-md border border-dashed border-primary/50 px-2 py-0.5 text-xs font-mono text-foreground">
114
114
  {coupon().label ?? 'Coupon'} {coupon().code}
115
115
  </span>
116
116
  <Show when={coupon().amount !== undefined}>
package/src/index.ts CHANGED
@@ -8,7 +8,7 @@
8
8
  // import '@a4ui/core/styles.css'
9
9
  // import { Button, Card, Modal } from '@a4ui/core'
10
10
 
11
- export const A4UI_VERSION = '0.24.0'
11
+ export const A4UI_VERSION = '0.24.2'
12
12
 
13
13
  // Helpers (src/lib) — generic, framework-level utilities.
14
14
  export { cn } from './lib/cn'
@@ -82,7 +82,7 @@ export const space: ThemeDefinition = {
82
82
  primary: '217 91% 52%',
83
83
  'primary-foreground': '0 0% 100%',
84
84
  accent: '199 89% 55%',
85
- 'accent-foreground': '0 0% 100%',
85
+ 'accent-foreground': '199 45% 12%',
86
86
  ring: '217 91% 52%',
87
87
  destructive: '0 72% 52%',
88
88
  'destructive-foreground': '0 0% 100%',
@@ -99,7 +99,7 @@ export const space: ThemeDefinition = {
99
99
  primary: '217 91% 52%',
100
100
  'primary-foreground': '0 0% 100%',
101
101
  accent: '199 89% 48%',
102
- 'accent-foreground': '0 0% 100%',
102
+ 'accent-foreground': '199 45% 12%',
103
103
  ring: '217 91% 52%',
104
104
  destructive: '0 72% 50%',
105
105
  'destructive-foreground': '0 0% 100%',
@@ -11,6 +11,8 @@ interface NumberInputProps {
11
11
  min?: number
12
12
  /** Upper bound; the increment trigger disables itself at this value. */
13
13
  max?: number
14
+ /** Accessible name applied to the input as its `aria-label` (no visible label is rendered). */
15
+ 'aria-label'?: string
14
16
  class?: string
15
17
  }
16
18
 
@@ -39,7 +41,10 @@ export function NumberInput(props: NumberInputProps): JSX.Element {
39
41
  <KNumberField.DecrementTrigger class={cn(TRIGGER_CLASS, 'rounded-l-md')} aria-label="Decrement">
40
42
 
41
43
  </KNumberField.DecrementTrigger>
42
- <KNumberField.Input class="w-16 border-y border-input bg-background px-3 py-2 text-center text-sm text-foreground outline-none transition-colors a4-field" />
44
+ <KNumberField.Input
45
+ aria-label={props['aria-label']}
46
+ class="w-16 border-y border-input bg-background px-3 py-2 text-center text-sm text-foreground outline-none transition-colors a4-field"
47
+ />
43
48
  <KNumberField.IncrementTrigger class={cn(TRIGGER_CLASS, 'rounded-r-md')} aria-label="Increment">
44
49
  +
45
50
  </KNumberField.IncrementTrigger>
@@ -49,7 +49,7 @@ export function SegmentedControl(props: SegmentedControlProps): JSX.Element {
49
49
  {(option) => (
50
50
  <KSegmentedControl.Item
51
51
  value={option.value}
52
- class="relative z-10 flex cursor-pointer items-center px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors data-[selected]:text-primary-foreground"
52
+ class="relative z-10 flex cursor-pointer items-center px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors data-[checked]:text-primary-foreground"
53
53
  >
54
54
  <KSegmentedControl.ItemInput />
55
55
  <KSegmentedControl.ItemLabel>{option.label}</KSegmentedControl.ItemLabel>