@a4ui/core 0.37.0 → 0.38.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 (105) hide show
  1. package/README.md +8 -7
  2. package/dist/Collapse-Cr5cDqAl.js +375 -0
  3. package/dist/charts/AreaChart.d.ts +38 -0
  4. package/dist/charts/BarChart.d.ts +17 -1
  5. package/dist/charts/PieChart.d.ts +29 -0
  6. package/dist/charts/RadialBarChart.d.ts +33 -0
  7. package/dist/charts/index.d.ts +5 -0
  8. package/dist/charts/shared.d.ts +111 -0
  9. package/dist/charts.js +1493 -780
  10. package/dist/commerce.js +625 -634
  11. package/dist/elements.css +1076 -8
  12. package/dist/elements.iife.js +1 -6
  13. package/dist/elements.js +7774 -9133
  14. package/dist/full.css +1076 -8
  15. package/dist/index.d.ts +30 -3
  16. package/dist/index.js +17502 -15098
  17. package/dist/layout/Aurora.d.ts +16 -0
  18. package/dist/layout/EffectsToggle.d.ts +1 -1
  19. package/dist/layout/SpaceBackground.d.ts +1 -1
  20. package/dist/lib/anchored.d.ts +16 -0
  21. package/dist/motion-CTIBwMCA.js +104 -0
  22. package/dist/styles.css +110 -3
  23. package/dist/ui/AspectRatio.d.ts +19 -0
  24. package/dist/ui/Attachment.d.ts +70 -0
  25. package/dist/ui/ButtonGroup.d.ts +37 -0
  26. package/dist/ui/ChatMarker.d.ts +20 -0
  27. package/dist/ui/ChatThread.d.ts +32 -8
  28. package/dist/ui/ContactSection.d.ts +49 -0
  29. package/dist/ui/CtaBanner.d.ts +28 -0
  30. package/dist/ui/DateField.d.ts +2 -2
  31. package/dist/ui/Drawer.d.ts +5 -2
  32. package/dist/ui/Faq.d.ts +29 -0
  33. package/dist/ui/FeatureGrid.d.ts +35 -0
  34. package/dist/ui/Field.d.ts +148 -0
  35. package/dist/ui/Hero.d.ts +48 -0
  36. package/dist/ui/InputGroup.d.ts +93 -0
  37. package/dist/ui/Item.d.ts +63 -0
  38. package/dist/ui/Label.d.ts +23 -0
  39. package/dist/ui/Menubar.d.ts +83 -0
  40. package/dist/ui/Message.d.ts +51 -5
  41. package/dist/ui/Modal.d.ts +8 -2
  42. package/dist/ui/NativeSelect.d.ts +26 -0
  43. package/dist/ui/NavigationMenu.d.ts +85 -0
  44. package/dist/ui/PromptComposer.d.ts +5 -0
  45. package/dist/ui/Prose.d.ts +21 -0
  46. package/dist/ui/Questionnaire.d.ts +71 -0
  47. package/dist/ui/ScrollArea.d.ts +30 -0
  48. package/dist/ui/Sidebar.d.ts +229 -0
  49. package/dist/ui/SiteFooter.d.ts +39 -0
  50. package/dist/ui/SiteNav.d.ts +35 -0
  51. package/dist/ui/TeamGrid.d.ts +33 -0
  52. package/dist/ui/Testimonials.d.ts +37 -0
  53. package/dist/ui/internal/sectionKit.d.ts +22 -0
  54. package/dist/ui/internal/socialIcons.d.ts +9 -0
  55. package/package.json +38 -26
  56. package/preset.d.ts +23 -0
  57. package/src/charts/AreaChart.tsx +206 -0
  58. package/src/charts/BarChart.tsx +241 -5
  59. package/src/charts/DonutChart.tsx +8 -11
  60. package/src/charts/LineChart.tsx +2 -3
  61. package/src/charts/PieChart.tsx +145 -0
  62. package/src/charts/RadialBarChart.tsx +141 -0
  63. package/src/charts/index.ts +14 -0
  64. package/src/charts/shared.tsx +304 -0
  65. package/src/index.ts +192 -3
  66. package/src/layout/Aurora.tsx +36 -7
  67. package/src/layout/sceneEffects.ts +22 -3
  68. package/src/lib/anchored.ts +57 -0
  69. package/src/ui/AspectRatio.tsx +35 -0
  70. package/src/ui/Attachment.tsx +189 -0
  71. package/src/ui/ButtonGroup.tsx +89 -0
  72. package/src/ui/ChatMarker.tsx +58 -0
  73. package/src/ui/ChatThread.tsx +115 -23
  74. package/src/ui/ContactSection.tsx +199 -0
  75. package/src/ui/CtaBanner.tsx +62 -0
  76. package/src/ui/DateField.tsx +17 -7
  77. package/src/ui/DateRangePicker.tsx +15 -5
  78. package/src/ui/Drawer.tsx +37 -4
  79. package/src/ui/Faq.tsx +57 -0
  80. package/src/ui/FeatureGrid.tsx +77 -0
  81. package/src/ui/Field.tsx +374 -0
  82. package/src/ui/Hero.tsx +146 -0
  83. package/src/ui/InputGroup.tsx +219 -0
  84. package/src/ui/Item.tsx +185 -0
  85. package/src/ui/Label.tsx +50 -0
  86. package/src/ui/Menubar.tsx +212 -0
  87. package/src/ui/Message.tsx +139 -13
  88. package/src/ui/Modal.tsx +41 -5
  89. package/src/ui/MultiSelect.tsx +15 -5
  90. package/src/ui/NativeSelect.tsx +66 -0
  91. package/src/ui/NavigationMenu.tsx +262 -0
  92. package/src/ui/PromptComposer.tsx +11 -0
  93. package/src/ui/Prose.tsx +63 -0
  94. package/src/ui/Questionnaire.tsx +331 -0
  95. package/src/ui/ScrollArea.tsx +70 -0
  96. package/src/ui/Sidebar.tsx +753 -0
  97. package/src/ui/SiteFooter.tsx +112 -0
  98. package/src/ui/SiteNav.tsx +146 -0
  99. package/src/ui/TeamGrid.tsx +81 -0
  100. package/src/ui/Testimonials.tsx +103 -0
  101. package/src/ui/TimeField.tsx +15 -5
  102. package/src/ui/internal/sectionKit.tsx +72 -0
  103. package/src/ui/internal/socialIcons.tsx +41 -0
  104. package/dist/NumberInput-Bnh2u7pp.js +0 -381
  105. package/dist/motion-jYMWmZqB.js +0 -119
package/README.md CHANGED
@@ -182,20 +182,21 @@ mode switch — a theme recolors underneath either mode.
182
182
 
183
183
  ## Components
184
184
 
185
- 75+ components across nine categories (this is a sample — see the
185
+ 75+ components across ten categories (this is a sample — see the
186
186
  **[docs site](https://a4ui.pages.dev/)** or `src/index.ts` for the
187
187
  full list):
188
188
 
189
189
  | Category | Representative components |
190
190
  | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
191
- | Forms | `Input`, `Select`, `Checkbox`, `DateField`, `Combobox`, `TagInput`, `Slider`, `NumberInput`, `PromptComposer`, `InlineSelect`, `PillSearch` |
192
- | Overlays | `Modal`, `Drawer`, `Popover`, `Tooltip`, `AlertDialog`, `ContextMenu`, `HoverCard`, `SlashMenu` |
193
- | Data & display | `Table`, `DataGrid`, `Tree`, `Calendar`, `Timeline`, `Stat`, `Descriptions`, `SpecSheet`, `RatingsSummary`, `LogoWall`, `ChatThread`, `Message`, `Citation`, `CodeTabs`, `DataView`, `BalanceCard`, `TransactionFeed`, `KpiBlock`, `BlockEditor`, `CalendarHeatmap` |
194
- | Navigation | `Tabs`, `Breadcrumb`, `Pagination`, `Command`, `Anchor`, `Stepper`, `BottomNavigation`, `CategoryStrip`, `Spaces`, `SideRail` |
191
+ | Forms | `Input`, `Select`, `Checkbox`, `DateField`, `Combobox`, `TagInput`, `Slider`, `NumberInput`, `PromptComposer`, `InlineSelect`, `PillSearch`, `Field`, `InputGroup`, `NativeSelect`, `Questionnaire` |
192
+ | Overlays | `Modal`, `Drawer`, `Popover`, `Tooltip`, `AlertDialog`, `ContextMenu`, `HoverCard`, `SlashMenu`, `Menubar` |
193
+ | Data & display | `Table`, `DataGrid`, `Tree`, `Calendar`, `Timeline`, `Stat`, `Descriptions`, `SpecSheet`, `RatingsSummary`, `LogoWall`, `ChatThread`, `Message`, `Attachment`, `Citation`, `CodeTabs`, `DataView`, `BalanceCard`, `TransactionFeed`, `KpiBlock`, `BlockEditor`, `CalendarHeatmap` |
194
+ | Navigation | `Tabs`, `Breadcrumb`, `Pagination`, `Command`, `Anchor`, `Stepper`, `BottomNavigation`, `CategoryStrip`, `Spaces`, `SideRail`, `Sidebar`, `NavigationMenu` |
195
195
  | Feedback | `Alert`, `AnnouncementBar`, `Toast`, `Progress`, `Skeleton`, `Empty`, `Result`, `NotificationCenter` |
196
- | Layout | `AppShell`, `SpaceBackground`, `ThemedScenery`, `Card`, `Splitter`, `Affix`, `NavGroup`, `FloatingToolbar`, `ArtifactPanel`, `MasterDetail` |
196
+ | Layout | `AppShell`, `SpaceBackground`, `ThemedScenery`, `Card`, `Splitter`, `Affix`, `NavGroup`, `FloatingToolbar`, `ArtifactPanel`, `MasterDetail`, `ScrollArea`, `Item`, `Prose` |
197
197
  | Commerce | `ProductCard`, `ProductGrid`, `PriceTag`, `PriceBlock`, `QuantityStepper`, `CartLine`, `CartSummary`, `FilterGroup`, `FacetSidebar`, `ConditionScale` |
198
- | Charts | `Sparkline`, `BarChart`, `DonutChart` (native SVG, theme-tinted) |
198
+ | Charts | `Sparkline`, `BarChart`, `AreaChart`, `PieChart`, `DonutChart`, `RadialBarChart` (native SVG, theme-tinted) |
199
+ | Sections | `SiteNav`, `Hero`, `FeatureGrid`, `Testimonials`, `Faq`, `CtaBanner`, `ContactSection`, `SiteFooter`, `TeamGrid` (data-driven page blocks: plain props, no JSX required) |
199
200
  | Motion | `ScrambleText`, `TextReveal`, `Typewriter`, `GradientText`, `HoldToConfirm`, `LoadingDots`, `FillText`, `Curtain`, `Parallax`, `ScrollProgress`, `Ripple`, `Magnetic`, `TiltCard`, `Spotlight`, `NotificationStack`, `MultiStateBadge`, `NowPlaying`, `Expandable`, `StreamingText`, `PageTransition`, `ScrollScene`, `StickyReveal`, `flyToCart` |
200
201
 
201
202
  Domain-specific sets ship as **subpath entries** so the base package stays lean —
@@ -0,0 +1,375 @@
1
+ import { a as e, g as t } from "./motion-CTIBwMCA.js";
2
+ import { For as n, Show as r, createSignal as i, onCleanup as a, onMount as o, splitProps as s } from "solid-js";
3
+ import { className as c, createComponent as l, delegateEvents as u, effect as d, insert as f, mergeProps as p, setAttribute as m, spread as h, template as g, use as _ } from "solid-js/web";
4
+ import { ChevronDown as v, Star as y } from "lucide-solid";
5
+ import { NumberField as b } from "@kobalte/core/number-field";
6
+ // src/ui/Badge.tsx
7
+ var x = /*#__PURE__*/ g("<span class=\"relative flex h-1.5 w-1.5\"aria-hidden=true><span class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-current opacity-75\"></span><span class=\"relative inline-flex h-1.5 w-1.5 rounded-full bg-current\">"), S = /*#__PURE__*/ g("<span>"), C = {
8
+ neutral: "bg-muted text-muted-foreground ring-border",
9
+ success: "bg-emerald-500/15 text-emerald-300 ring-emerald-500/30 light:text-emerald-700",
10
+ warning: "bg-amber-500/15 text-amber-300 ring-amber-500/30 light:text-amber-700",
11
+ danger: "bg-rose-500/15 text-rose-300 ring-rose-500/30 light:text-rose-700",
12
+ info: "bg-sky-500/15 text-sky-300 ring-sky-500/30 light:text-sky-700"
13
+ }, w = "badge inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-semibold ring-1 ring-inset whitespace-nowrap";
14
+ function T(e) {
15
+ let [n, i] = s(e, [
16
+ "tone",
17
+ "class",
18
+ "children",
19
+ "pulse"
20
+ ]);
21
+ return (() => {
22
+ var e = S();
23
+ return h(e, p({ get class() {
24
+ return t(w, C[n.tone ?? "neutral"], n.class);
25
+ } }, i), !1, !0), f(e, l(r, {
26
+ get when() {
27
+ return n.pulse;
28
+ },
29
+ get children() {
30
+ return x();
31
+ }
32
+ }), null), f(e, () => n.children, null), e;
33
+ })();
34
+ }
35
+ // src/ui/Ripple.tsx
36
+ var E = /*#__PURE__*/ g("<span>");
37
+ function D(t, n, r = {}) {
38
+ if (e()) return;
39
+ let i = t.getBoundingClientRect(), a = n.clientX - i.left, o = n.clientY - i.top, s = 2 * Math.max(Math.hypot(a, o), Math.hypot(i.width - a, o), Math.hypot(a, i.height - o), Math.hypot(i.width - a, i.height - o)), c = document.createElement("span");
40
+ c.setAttribute("aria-hidden", "true"), Object.assign(c.style, {
41
+ position: "absolute",
42
+ left: `${a}px`,
43
+ top: `${o}px`,
44
+ width: `${s}px`,
45
+ height: `${s}px`,
46
+ borderRadius: "9999px",
47
+ background: r.color ?? "currentColor",
48
+ pointerEvents: "none",
49
+ transform: "translate(-50%,-50%) scale(0)"
50
+ }), t.appendChild(c);
51
+ let l = c.animate([{
52
+ transform: "translate(-50%,-50%) scale(0)",
53
+ opacity: String(r.opacity ?? .3)
54
+ }, {
55
+ transform: "translate(-50%,-50%) scale(1)",
56
+ opacity: "0"
57
+ }], {
58
+ duration: 600,
59
+ easing: "ease-out"
60
+ }), u = () => c.remove();
61
+ l.finished.then(u).catch(u);
62
+ }
63
+ function O(e) {
64
+ let n, r = (t) => {
65
+ n && D(n, t, {
66
+ color: e.color,
67
+ opacity: e.opacity
68
+ });
69
+ };
70
+ return (() => {
71
+ var i = E();
72
+ i.$$pointerdown = r;
73
+ var a = n;
74
+ return typeof a == "function" ? _(a, i) : n = i, f(i, () => e.children), d(() => c(i, t("relative inline-block overflow-hidden", e.class))), i;
75
+ })();
76
+ }
77
+ u(["pointerdown"]);
78
+ // src/ui/Button.tsx
79
+ var k = /*#__PURE__*/ g("<a>"), A = /*#__PURE__*/ g("<button>"), j = {
80
+ primary: "bg-primary text-primary-foreground hover:bg-primary/90",
81
+ secondary: "bg-muted text-foreground hover:bg-muted/70",
82
+ outline: "border border-border bg-transparent text-foreground hover:bg-muted",
83
+ ghost: "bg-transparent text-foreground hover:bg-muted"
84
+ }, M = "inline-flex items-center justify-center rounded-md px-3 py-2 text-sm font-medium transition-[color,background-color,transform] duration-150 active:scale-[0.97] focus:outline-none focus:ring-2 focus:ring-ring disabled:pointer-events-none disabled:opacity-50";
85
+ function N(e) {
86
+ let [n, i] = s(e, [
87
+ "variant",
88
+ "class",
89
+ "type",
90
+ "children",
91
+ "ripple",
92
+ "onPointerDown",
93
+ "href",
94
+ "target",
95
+ "rel"
96
+ ]), a = () => t(M, j[n.variant ?? "primary"], n.ripple && "relative overflow-hidden", n.class), o = (e) => {
97
+ n.ripple && D(e.currentTarget, e, { opacity: .35 });
98
+ let t = n.onPointerDown;
99
+ typeof t == "function" ? t(e) : t && t[0](t[1], e);
100
+ };
101
+ return l(r, {
102
+ get when() {
103
+ return n.href !== void 0;
104
+ },
105
+ get fallback() {
106
+ return (() => {
107
+ var e = A();
108
+ return e.$$pointerdown = o, h(e, p({
109
+ get type() {
110
+ return n.type ?? "button";
111
+ },
112
+ get class() {
113
+ return a();
114
+ }
115
+ }, i), !1, !0), f(e, () => n.children), e;
116
+ })();
117
+ },
118
+ get children() {
119
+ var e = k();
120
+ return e.$$pointerdown = o, h(e, p({
121
+ get href() {
122
+ return n.href;
123
+ },
124
+ get target() {
125
+ return n.target;
126
+ },
127
+ get rel() {
128
+ return n.rel;
129
+ },
130
+ get class() {
131
+ return a();
132
+ }
133
+ }, i), !1, !0), f(e, () => n.children), e;
134
+ }
135
+ });
136
+ }
137
+ u(["pointerdown"]);
138
+ // src/ui/Spotlight.tsx
139
+ var P = /*#__PURE__*/ g("<div>");
140
+ function F(t, n = {}) {
141
+ if (e()) return () => {};
142
+ let r = document.createElement("span");
143
+ r.setAttribute("aria-hidden", "true"), r.className = "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300", t.appendChild(r);
144
+ let i = n.size ?? 180, a = n.color ?? "hsl(var(--primary))", o = (e, t) => {
145
+ r.style.background = `radial-gradient(${i}px circle at ${e}px ${t}px, color-mix(in srgb, ${a} 30%, transparent), transparent 70%)`;
146
+ }, s = (e) => {
147
+ let n = t.getBoundingClientRect();
148
+ o(e.clientX - n.left, e.clientY - n.top);
149
+ }, c = () => {
150
+ r.style.opacity = "1";
151
+ }, l = () => {
152
+ r.style.opacity = "0";
153
+ };
154
+ return t.addEventListener("pointermove", s), t.addEventListener("pointerenter", c), t.addEventListener("pointerleave", l), () => {
155
+ t.removeEventListener("pointermove", s), t.removeEventListener("pointerenter", c), t.removeEventListener("pointerleave", l), r.remove();
156
+ };
157
+ }
158
+ function I(e) {
159
+ let n;
160
+ return o(() => {
161
+ let t = F(n, {
162
+ color: e.color,
163
+ size: e.size
164
+ });
165
+ a(t);
166
+ }), (() => {
167
+ var r = P(), i = n;
168
+ return typeof i == "function" ? _(i, r) : n = r, f(r, () => e.children), d(() => c(r, t("relative overflow-hidden", e.class))), r;
169
+ })();
170
+ }
171
+ // src/ui/TiltCard.tsx
172
+ var L = /*#__PURE__*/ g("<div style=perspective:800px><div style=transform-style:preserve-3d>");
173
+ function R(t, n, r = {}) {
174
+ if (e()) return () => {};
175
+ n.style.willChange = "transform";
176
+ let i = (e) => {
177
+ let i = t.getBoundingClientRect(), a = (e.clientX - i.left) / i.width - .5, o = (e.clientY - i.top) / i.height - .5, s = r.max ?? 10;
178
+ n.style.transition = "transform 0.15s ease-out", n.style.transform = `perspective(800px) rotateX(${(o * -2 * s).toFixed(2)}deg) rotateY(${(a * 2 * s).toFixed(2)}deg) scale(1.02)`;
179
+ }, a = () => {
180
+ n.style.transition = "transform 0.4s ease", n.style.transform = "perspective(800px) rotateX(0deg) rotateY(0deg) scale(1)";
181
+ };
182
+ return t.addEventListener("pointermove", i), t.addEventListener("pointerleave", a), () => {
183
+ t.removeEventListener("pointermove", i), t.removeEventListener("pointerleave", a), n.style.transform = "", n.style.transition = "", n.style.willChange = "";
184
+ };
185
+ }
186
+ function z(e) {
187
+ let n, r;
188
+ return o(() => {
189
+ let t = R(n, r, { max: e.max });
190
+ a(t);
191
+ }), (() => {
192
+ var i = L(), a = i.firstChild, o = n;
193
+ typeof o == "function" ? _(o, i) : n = i;
194
+ var s = r;
195
+ return typeof s == "function" ? _(s, a) : r = a, f(a, () => e.children), d(() => c(i, t("inline-block", e.class))), i;
196
+ })();
197
+ }
198
+ // src/ui/Card.tsx
199
+ var B = /*#__PURE__*/ g("<div>"), V = /*#__PURE__*/ g("<h2>");
200
+ function H(e) {
201
+ let [n, r] = s(e, [
202
+ "class",
203
+ "children",
204
+ "glass",
205
+ "glow",
206
+ "tilt",
207
+ "spotlight"
208
+ ]), i = () => (n.glow ?? n.glass) === !0, c;
209
+ return o(() => {
210
+ let e = [n.tilt && c ? R(c, c) : null, n.spotlight && c ? F(c) : null].filter((e) => e !== null);
211
+ a(() => e.forEach((e) => e()));
212
+ }), (() => {
213
+ var e = B(), a = c;
214
+ return typeof a == "function" ? _(a, e) : c = e, h(e, p({ get class() {
215
+ return t(n.glass ? "card rounded-xl text-card-foreground" : "rounded-xl border border-border bg-card text-card-foreground shadow-sm", i() && "glow-edge", n.spotlight && "relative overflow-hidden", n.tilt && "will-change-transform", n.class);
216
+ } }, r), !1, !0), f(e, () => n.children), e;
217
+ })();
218
+ }
219
+ function U(e) {
220
+ let [n, r] = s(e, ["class", "children"]);
221
+ return (() => {
222
+ var e = B();
223
+ return h(e, p({ get class() {
224
+ return t("flex flex-col space-y-1.5 p-6", n.class);
225
+ } }, r), !1, !0), f(e, () => n.children), e;
226
+ })();
227
+ }
228
+ function W(e) {
229
+ let [n, r] = s(e, ["class", "children"]);
230
+ return (() => {
231
+ var e = V();
232
+ return h(e, p({ get class() {
233
+ return t("text-lg font-semibold leading-none tracking-tight", n.class);
234
+ } }, r), !1, !0), f(e, () => n.children), e;
235
+ })();
236
+ }
237
+ function G(e) {
238
+ let [n, r] = s(e, ["class", "children"]);
239
+ return (() => {
240
+ var e = B();
241
+ return h(e, p({ get class() {
242
+ return t("p-6 pt-0", n.class);
243
+ } }, r), !1, !0), f(e, () => n.children), e;
244
+ })();
245
+ }
246
+ // src/ui/Checkbox.tsx
247
+ var K = /*#__PURE__*/ g("<label><input type=checkbox class=\"h-4 w-4 rounded border-input accent-primary\">");
248
+ function q(e) {
249
+ return (() => {
250
+ var n = K(), r = n.firstChild;
251
+ return r.addEventListener("change", (t) => e.onChange(t.currentTarget.checked)), f(n, () => e.label, null), d(() => c(n, t("inline-flex items-center gap-2 text-sm text-foreground", e.class))), d(() => r.checked = e.checked), n;
252
+ })();
253
+ }
254
+ // src/ui/NumberInput.tsx
255
+ var J = "grid h-9 w-9 shrink-0 place-items-center border border-input bg-background text-foreground transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50";
256
+ function Y(e) {
257
+ return l(b, {
258
+ get rawValue() {
259
+ return e.value;
260
+ },
261
+ onRawValueChange: (t) => e.onChange(t),
262
+ get minValue() {
263
+ return e.min;
264
+ },
265
+ get maxValue() {
266
+ return e.max;
267
+ },
268
+ get class() {
269
+ return t("inline-flex items-stretch", e.class);
270
+ },
271
+ get children() {
272
+ return [
273
+ l(b.DecrementTrigger, {
274
+ get class() {
275
+ return t(J, "rounded-l-md");
276
+ },
277
+ "aria-label": "Decrement",
278
+ children: "−"
279
+ }),
280
+ l(b.Input, {
281
+ get "aria-label"() {
282
+ return e["aria-label"];
283
+ },
284
+ 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"
285
+ }),
286
+ l(b.IncrementTrigger, {
287
+ get class() {
288
+ return t(J, "rounded-r-md");
289
+ },
290
+ "aria-label": "Increment",
291
+ children: "+"
292
+ })
293
+ ];
294
+ }
295
+ });
296
+ }
297
+ // src/ui/Rating.tsx
298
+ var X = /*#__PURE__*/ g("<div role=radiogroup>"), Z = /*#__PURE__*/ g("<div role=img>"), Q = /*#__PURE__*/ g("<button type=button role=radio class=\"rounded outline-none focus-visible:ring-2 focus-visible:ring-ring/40\">");
299
+ function $(e) {
300
+ let [a, o] = i(0), s = () => e.max ?? 5, u = () => Array.from({ length: s() }, (e, t) => t + 1), p = () => a() > 0 ? a() : e.value, h = (t) => {
301
+ e.readonly || e.onChange?.(t);
302
+ }, g = (e) => t("h-5 w-5 transition-colors", e <= p() ? "fill-primary text-primary" : "fill-transparent text-muted-foreground");
303
+ return l(r, {
304
+ get when() {
305
+ return !e.readonly;
306
+ },
307
+ get fallback() {
308
+ return (() => {
309
+ var r = Z();
310
+ return f(r, l(n, {
311
+ get each() {
312
+ return u();
313
+ },
314
+ children: (e) => l(y, {
315
+ get class() {
316
+ return g(e);
317
+ },
318
+ "aria-hidden": "true"
319
+ })
320
+ })), d((n) => {
321
+ var i = t("inline-flex items-center gap-1", e.class), a = `Rating ${e.value} of ${s()}`;
322
+ return i !== n.e && c(r, n.e = i), a !== n.t && m(r, "aria-label", n.t = a), n;
323
+ }, {
324
+ e: void 0,
325
+ t: void 0
326
+ }), r;
327
+ })();
328
+ },
329
+ get children() {
330
+ var r = X();
331
+ return r.addEventListener("mouseleave", () => o(0)), f(r, l(n, {
332
+ get each() {
333
+ return u();
334
+ },
335
+ children: (t) => (() => {
336
+ var n = Q();
337
+ return n.$$keydown = (t) => {
338
+ t.key === "ArrowRight" || t.key === "ArrowUp" ? (t.preventDefault(), h(Math.min(e.value + 1, s()))) : (t.key === "ArrowLeft" || t.key === "ArrowDown") && (t.preventDefault(), h(Math.max(e.value - 1, 0)));
339
+ }, n.$$click = () => h(t), n.addEventListener("blur", () => o(0)), n.addEventListener("focus", () => o(t)), n.addEventListener("mouseenter", () => o(t)), f(n, l(y, {
340
+ get class() {
341
+ return g(t);
342
+ },
343
+ "aria-hidden": "true"
344
+ })), d((r) => {
345
+ var i = e.value === t, a = `Rate ${t} of ${s()}`;
346
+ return i !== r.e && m(n, "aria-checked", r.e = i), a !== r.t && m(n, "aria-label", r.t = a), r;
347
+ }, {
348
+ e: void 0,
349
+ t: void 0
350
+ }), n;
351
+ })()
352
+ })), d(() => c(r, t("inline-flex items-center gap-1", e.class))), r;
353
+ }
354
+ });
355
+ }
356
+ u(["click", "keydown"]);
357
+ // src/ui/Collapse.tsx
358
+ var ee = /*#__PURE__*/ g("<div><button type=button class=\"flex w-full items-center justify-between rounded-md px-3 py-2 text-sm font-medium text-foreground hover:bg-muted\"></button><div><div class=overflow-hidden><div class=\"px-3 py-2 text-sm text-muted-foreground\">");
359
+ function te(e) {
360
+ return (() => {
361
+ var n = ee(), r = n.firstChild, i = r.nextSibling, a = i.firstChild.firstChild;
362
+ return r.$$click = () => e.onOpenChange(!e.open), f(r, () => e.title, null), f(r, l(v, { get class() {
363
+ return t("h-4 w-4 shrink-0 transition-transform duration-200", e.open && "rotate-180");
364
+ } }), null), f(a, () => e.children), d((a) => {
365
+ var o = t(e.class), s = e.open, l = t("grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none", e.open ? "grid-rows-[1fr]" : "grid-rows-[0fr]");
366
+ return o !== a.e && c(n, a.e = o), s !== a.t && m(r, "aria-expanded", a.t = s), l !== a.a && c(i, a.a = l), a;
367
+ }, {
368
+ e: void 0,
369
+ t: void 0,
370
+ a: void 0
371
+ }), n;
372
+ })();
373
+ }
374
+ u(["click"]);
375
+ export { H as a, W as c, I as d, F as f, T as g, D as h, q as i, z as l, O as m, $ as n, G as o, N as p, Y as r, U as s, te as t, R as u };
@@ -0,0 +1,38 @@
1
+ import { JSX } from 'solid-js';
2
+ import { ChartSeries } from './shared';
3
+ export interface AreaDatum {
4
+ label: string;
5
+ /** Per-series values keyed by `ChartSeries.key`. */
6
+ values: Record<string, number>;
7
+ }
8
+ export interface AreaChartProps {
9
+ data: AreaDatum[];
10
+ series: ChartSeries[];
11
+ /** `overlap` (default) draws each series from the baseline; `stacked` accumulates them. */
12
+ mode?: 'overlap' | 'stacked';
13
+ /** Height of the plot area in px. Default 200. */
14
+ height?: number;
15
+ /** Hover / keyboard tooltip. Default true. */
16
+ showTooltip?: boolean;
17
+ /** Toggleable legend. Default true. */
18
+ showLegend?: boolean;
19
+ class?: string;
20
+ }
21
+ /**
22
+ * Multi-series area chart with gradient fills. Each series is tinted by a
23
+ * theme token (`color`), overlapping or stacked. The chart is focusable:
24
+ * Left / Right arrows (Home / End) move between points and show the tooltip.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <AreaChart
29
+ * mode="stacked"
30
+ * series={[{ key: 'web', label: 'Web' }, { key: 'app', label: 'App', color: 'accent' }]}
31
+ * data={[
32
+ * { label: 'Jan', values: { web: 4, app: 2 } },
33
+ * { label: 'Feb', values: { web: 6, app: 3 } },
34
+ * ]}
35
+ * />
36
+ * ```
37
+ */
38
+ export declare function AreaChart(props: AreaChartProps): JSX.Element;
@@ -1,14 +1,30 @@
1
1
  import { JSX } from 'solid-js';
2
+ import { ChartSeries } from './shared';
2
3
  export interface BarDatum {
3
4
  label: string;
4
- value: number;
5
+ /** Value for `mode="single"` (required there). */
6
+ value?: number;
7
+ /** Per-series values keyed by `ChartSeries.key`, for `stacked` / `grouped`. */
8
+ values?: Record<string, number>;
5
9
  }
10
+ export type BarChartMode = 'single' | 'stacked' | 'grouped';
6
11
  export interface BarChartProps {
7
12
  data: BarDatum[];
8
13
  /** Height of the plot area in px. Default 160. */
9
14
  height?: number;
10
15
  /** Fill color token. Default 'primary'. */
11
16
  tone?: 'primary' | 'accent';
17
+ /**
18
+ * `single` (default) draws one bar per datum from `value`; `stacked` and
19
+ * `grouped` draw one segment / bar per entry of `series` from `values`.
20
+ */
21
+ mode?: BarChartMode;
22
+ /** Series definitions, required for `stacked` / `grouped`. */
23
+ series?: ChartSeries[];
24
+ /** Hover / keyboard tooltip in the multi-series modes. Default true. */
25
+ showTooltip?: boolean;
26
+ /** Show a toggleable legend in the multi-series modes. Default true. */
27
+ showLegend?: boolean;
12
28
  class?: string;
13
29
  }
14
30
  /**
@@ -0,0 +1,29 @@
1
+ import { JSX } from 'solid-js';
2
+ import { ChartColor } from './shared';
3
+ export interface PieDatum {
4
+ label: string;
5
+ value: number;
6
+ /** Token name; defaults to cycling `chart-1..5`. */
7
+ color?: ChartColor;
8
+ }
9
+ export interface PieChartProps {
10
+ data: PieDatum[];
11
+ /** SVG width/height in px. Default 200. */
12
+ size?: number;
13
+ /** Hover / keyboard tooltip. Default true. */
14
+ showTooltip?: boolean;
15
+ /** Toggleable legend. Default true. */
16
+ showLegend?: boolean;
17
+ class?: string;
18
+ }
19
+ /**
20
+ * Pie chart whose wedge angles are proportional to the values. Left / Right
21
+ * arrows move between wedges and show the tooltip; legend entries toggle
22
+ * wedges (the rest re-share the circle).
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * <PieChart data={[{ label: 'Direct', value: 42 }, { label: 'Social', value: 28, color: 'accent' }]} />
27
+ * ```
28
+ */
29
+ export declare function PieChart(props: PieChartProps): JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { JSX } from 'solid-js';
2
+ import { ChartColor } from './shared';
3
+ export interface RadialBarDatum {
4
+ label: string;
5
+ value: number;
6
+ /** Token name; defaults to cycling `chart-1..5`. */
7
+ color?: ChartColor;
8
+ }
9
+ export interface RadialBarChartProps {
10
+ data: RadialBarDatum[];
11
+ /** Value that fills a whole ring. Default: the largest value. */
12
+ max?: number;
13
+ /** SVG width/height in px. Default 220. */
14
+ size?: number;
15
+ /** Ring thickness in px. Default 14. */
16
+ thickness?: number;
17
+ /** Hover / keyboard tooltip. Default true. */
18
+ showTooltip?: boolean;
19
+ /** Toggleable legend. Default true. */
20
+ showLegend?: boolean;
21
+ class?: string;
22
+ }
23
+ /**
24
+ * Radial bar chart: one concentric ring per datum, each filled to `value /
25
+ * max`. Arrow keys move between rings and show the tooltip; legend entries
26
+ * toggle rings.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <RadialBarChart max={100} data={[{ label: 'Move', value: 72 }, { label: 'Stand', value: 40, color: 'accent' }]} />
31
+ * ```
32
+ */
33
+ export declare function RadialBarChart(props: RadialBarChartProps): JSX.Element;
@@ -7,3 +7,8 @@ export { RadarChart, type RadarSeries, type RadarChartProps } from './RadarChart
7
7
  export { BarList, type BarListDatum, type BarListProps } from './BarList';
8
8
  export { StatusTracker, type StatusSegment, type StatusTrackerProps } from './StatusTracker';
9
9
  export { CategoryBar, type CategoryBarTone, type CategoryBarProps } from './CategoryBar';
10
+ export { AreaChart, type AreaDatum, type AreaChartProps } from './AreaChart';
11
+ export { PieChart, type PieDatum, type PieChartProps } from './PieChart';
12
+ export { RadialBarChart, type RadialBarDatum, type RadialBarChartProps } from './RadialBarChart';
13
+ export { ChartTooltip, ChartLegend, type ChartSeries, type ChartColor, type ChartTooltipProps, type ChartTooltipRow, type ChartLegendProps, type ChartLegendItem, } from './shared';
14
+ export type { BarChartMode } from './BarChart';
@@ -0,0 +1,111 @@
1
+ import { JSX } from 'solid-js';
2
+ /** Token names a series can be tinted with. `chart-1..5` cycle the theme's data hues. */
3
+ export type ChartColor = 'primary' | 'accent' | 'destructive' | 'muted' | 'chart-1' | 'chart-2' | 'chart-3' | 'chart-4' | 'chart-5';
4
+ /** Describes one series of a multi-series chart. */
5
+ export interface ChartSeries {
6
+ /** Key of the series' value inside each datum's `values` record. */
7
+ key: string;
8
+ /** Human label shown in the legend and tooltip. */
9
+ label: string;
10
+ /** Token name; defaults to cycling `chart-1..5` by index. */
11
+ color?: ChartColor;
12
+ }
13
+ /** The CSS custom property (e.g. `--primary`) for a series color or index. */
14
+ export declare function colorVar(color: ChartColor | undefined, index: number): string;
15
+ /** `hsl(var(--token) / alpha)` for a series color. */
16
+ export declare function seriesColor(color: ChartColor | undefined, index: number, alpha?: number): string;
17
+ /** Value lookup that fails loudly when a datum lacks a declared series key. */
18
+ export declare function seriesValue(values: Record<string, number> | undefined, key: string, label: string): number;
19
+ export interface ChartTooltipRow {
20
+ label: string;
21
+ value: string | number;
22
+ color: string;
23
+ }
24
+ export interface ChartTooltipProps {
25
+ title?: string;
26
+ rows: ChartTooltipRow[];
27
+ /** CSS `left` inside the (relative) chart wrapper, e.g. `42%`. */
28
+ left: string;
29
+ /** CSS `top` inside the wrapper. Default `0`. */
30
+ top?: string;
31
+ /** Horizontal anchor 0..1 used to keep the tooltip inside the chart. Default 0.5. */
32
+ anchor?: number;
33
+ }
34
+ /**
35
+ * Floating tooltip listing every series value at the active x. Position it
36
+ * inside a `relative` wrapper; it ignores pointer events and is announced
37
+ * politely to assistive tech.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <ChartTooltip title="Mon" left="20%" rows={[{ label: 'Sales', value: 12, color: 'hsl(var(--primary))' }]} />
42
+ * ```
43
+ */
44
+ export declare function ChartTooltip(props: ChartTooltipProps): JSX.Element;
45
+ export interface ChartLegendItem {
46
+ key: string;
47
+ label: string;
48
+ color: string;
49
+ }
50
+ export interface ChartLegendProps {
51
+ items: ChartLegendItem[];
52
+ /** Keys currently hidden. */
53
+ hidden?: ReadonlySet<string>;
54
+ /** When set, items become toggle buttons. */
55
+ onToggle?: (key: string) => void;
56
+ class?: string;
57
+ }
58
+ /**
59
+ * Legend with colored swatches. With `onToggle` each entry is a toggle button
60
+ * (`aria-pressed`) that hides / shows its series.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * <ChartLegend items={[{ key: 'a', label: 'Sales', color: 'hsl(var(--primary))' }]} onToggle={toggle} />
65
+ * ```
66
+ */
67
+ export declare function ChartLegend(props: ChartLegendProps): JSX.Element;
68
+ /** Signal-backed set of hidden series keys with a toggle. */
69
+ export declare function createHiddenSet(): {
70
+ hidden: import('solid-js').Accessor<ReadonlySet<string>>;
71
+ toggle: (key: string) => Set<string>;
72
+ };
73
+ /**
74
+ * Pointer + keyboard navigation over `count` categories. Arrow keys / Home /
75
+ * End move the active index, Escape clears it; keyboard focus (focus-visible)
76
+ * activates the first one.
77
+ */
78
+ export declare function createChartNav(count: () => number): {
79
+ active: import('solid-js').Accessor<number | null>;
80
+ setActive: import('solid-js').Setter<number | null>;
81
+ onKeyDown: (e: KeyboardEvent) => void;
82
+ onFocus: (e: FocusEvent) => void;
83
+ onBlur: () => null;
84
+ };
85
+ /** Common focusable-wrapper classes (visible focus ring). */
86
+ export declare const FOCUS_CLASS = "rounded outline-none focus-visible:ring-2 focus-visible:ring-ring";
87
+ export interface SliceAngle {
88
+ index: number;
89
+ value: number;
90
+ /** Start angle in degrees, clockwise from 12 o'clock. */
91
+ start: number;
92
+ /** Sweep in degrees; always `value / total * 360`. */
93
+ angle: number;
94
+ }
95
+ /** Proportional angles (degrees) for a list of values; shared by Donut, Pie and RadialBar. */
96
+ export declare function sliceAngles(values: number[]): SliceAngle[];
97
+ /** Point on a circle, angle in degrees clockwise from 12 o'clock. */
98
+ export declare function polar(cx: number, cy: number, r: number, deg: number): {
99
+ x: number;
100
+ y: number;
101
+ };
102
+ /** SVG path for a pie wedge (`inner` = 0) or ring segment; handles full circles. */
103
+ export declare function arcPath(cx: number, cy: number, outer: number, inner: number, start: number, angle: number): string;
104
+ /**
105
+ * X-axis label row aligned with points placed edge to edge (`i / (n - 1)` of the
106
+ * width). Each label sits on its point; the first and last are anchored to the
107
+ * edges so they are not clipped.
108
+ */
109
+ export declare function ChartXLabels(props: {
110
+ labels: string[];
111
+ }): JSX.Element;