@aortl/admin-react 0.16.2 → 0.18.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 (55) hide show
  1. package/CHANGELOG.md +37 -1
  2. package/dist/Alert.d.ts +14 -2
  3. package/dist/Alert.d.ts.map +1 -1
  4. package/dist/Avatar.d.ts +26 -0
  5. package/dist/Avatar.d.ts.map +1 -0
  6. package/dist/Badge.d.ts +8 -2
  7. package/dist/Badge.d.ts.map +1 -1
  8. package/dist/BrandTile.d.ts +16 -3
  9. package/dist/BrandTile.d.ts.map +1 -1
  10. package/dist/Card.d.ts +12 -2
  11. package/dist/Card.d.ts.map +1 -1
  12. package/dist/Dialog.d.ts +4 -1
  13. package/dist/Dialog.d.ts.map +1 -1
  14. package/dist/Drawer.d.ts +51 -0
  15. package/dist/Drawer.d.ts.map +1 -0
  16. package/dist/Field.d.ts +4 -1
  17. package/dist/Field.d.ts.map +1 -1
  18. package/dist/Indicator.d.ts +3 -1
  19. package/dist/Indicator.d.ts.map +1 -1
  20. package/dist/Input.d.ts +24 -2
  21. package/dist/Input.d.ts.map +1 -1
  22. package/dist/Item.d.ts +55 -0
  23. package/dist/Item.d.ts.map +1 -0
  24. package/dist/Menu.d.ts +7 -5
  25. package/dist/Menu.d.ts.map +1 -1
  26. package/dist/NumberInput.d.ts +28 -0
  27. package/dist/NumberInput.d.ts.map +1 -0
  28. package/dist/Pagination.d.ts +4 -1
  29. package/dist/Pagination.d.ts.map +1 -1
  30. package/dist/PropertyList.d.ts +10 -3
  31. package/dist/PropertyList.d.ts.map +1 -1
  32. package/dist/Separator.d.ts +11 -0
  33. package/dist/Separator.d.ts.map +1 -0
  34. package/dist/Sidebar.d.ts +16 -5
  35. package/dist/Sidebar.d.ts.map +1 -1
  36. package/dist/StatCard.d.ts +16 -1
  37. package/dist/StatCard.d.ts.map +1 -1
  38. package/dist/Table.d.ts +15 -1
  39. package/dist/Table.d.ts.map +1 -1
  40. package/dist/Timeline.d.ts +29 -0
  41. package/dist/Timeline.d.ts.map +1 -0
  42. package/dist/Tooltip.d.ts +4 -1
  43. package/dist/Tooltip.d.ts.map +1 -1
  44. package/dist/admin.scoped.css +1072 -127
  45. package/dist/cn.d.ts +7 -0
  46. package/dist/cn.d.ts.map +1 -1
  47. package/dist/dialog-internal.d.ts +17 -0
  48. package/dist/dialog-internal.d.ts.map +1 -0
  49. package/dist/index.cjs +758 -103
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.ts +12 -5
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.mjs +750 -104
  54. package/dist/index.mjs.map +1 -1
  55. package/package.json +2 -2
package/dist/index.cjs CHANGED
@@ -2,8 +2,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let clsx = require("clsx");
3
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
4
  let react = require("react");
5
+ let _base_ui_react_avatar = require("@base-ui/react/avatar");
5
6
  let _base_ui_react_button = require("@base-ui/react/button");
6
7
  let _base_ui_react_input = require("@base-ui/react/input");
8
+ let _base_ui_react_number_field = require("@base-ui/react/number-field");
7
9
  let _base_ui_react_field = require("@base-ui/react/field");
8
10
  let _base_ui_react_checkbox = require("@base-ui/react/checkbox");
9
11
  let _base_ui_react_radio = require("@base-ui/react/radio");
@@ -114,16 +116,47 @@ function renderIcon(icon, size = "1em") {
114
116
  }
115
117
  //#endregion
116
118
  //#region src/Alert.tsx
117
- function AlertRoot({ variant, icon, title, description, className, role, children, ...rest }) {
119
+ function DismissIcon() {
120
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
121
+ width: "1em",
122
+ height: "1em",
123
+ viewBox: "0 0 24 24",
124
+ fill: "none",
125
+ stroke: "currentColor",
126
+ strokeWidth: "2",
127
+ strokeLinecap: "round",
128
+ strokeLinejoin: "round",
129
+ "aria-hidden": "true",
130
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })]
131
+ });
132
+ }
133
+ function AlertRoot({ variant, icon, title, description, action, onDismiss, dismissLabel = "Dismiss", classNames, className, role, children, ...rest }) {
118
134
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
119
135
  role: role ?? (variant === "danger" || variant === "warning" ? "alert" : "status"),
120
136
  className: cn(["alert", `alert-${variant}`], className),
121
137
  ...rest,
122
138
  children: [
123
139
  renderIcon(icon),
124
- title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertTitle, { children: title }) : null,
125
- description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDescription, { children: description }) : null,
126
- children
140
+ title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertTitle, {
141
+ className: classNames?.title,
142
+ children: title
143
+ }) : null,
144
+ description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertDescription, {
145
+ className: classNames?.description,
146
+ children: description
147
+ }) : null,
148
+ children,
149
+ action !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlertAction, {
150
+ className: classNames?.action,
151
+ children: action
152
+ }) : null,
153
+ onDismiss ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
154
+ type: "button",
155
+ className: cn("alert-dismiss", classNames?.dismiss),
156
+ "aria-label": dismissLabel,
157
+ onClick: onDismiss,
158
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DismissIcon, {})
159
+ }) : null
127
160
  ]
128
161
  });
129
162
  }
@@ -139,9 +172,16 @@ function AlertDescription({ className, ...rest }) {
139
172
  ...rest
140
173
  });
141
174
  }
175
+ function AlertAction({ className, ...rest }) {
176
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
177
+ className: cn("alert-action", className),
178
+ ...rest
179
+ });
180
+ }
142
181
  var Alert = Object.assign(AlertRoot, {
143
182
  Title: AlertTitle,
144
- Description: AlertDescription
183
+ Description: AlertDescription,
184
+ Action: AlertAction
145
185
  });
146
186
  //#endregion
147
187
  //#region src/AppShell.tsx
@@ -189,25 +229,109 @@ function AppShellMain({ className, ...rest }) {
189
229
  var AppShell = Object.assign(AppShellRoot, { Main: AppShellMain });
190
230
  //#endregion
191
231
  //#region src/Badge.tsx
192
- function Badge({ variant = "neutral", size = "md", icon, className, children, ...rest }) {
232
+ function RemoveIcon() {
233
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
234
+ width: "1em",
235
+ height: "1em",
236
+ viewBox: "0 0 24 24",
237
+ fill: "none",
238
+ stroke: "currentColor",
239
+ strokeWidth: "2",
240
+ strokeLinecap: "round",
241
+ strokeLinejoin: "round",
242
+ "aria-hidden": "true",
243
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })]
244
+ });
245
+ }
246
+ function Badge({ variant = "neutral", size = "md", icon, soft = false, onRemove, removeLabel = "Remove", className, children, ...rest }) {
193
247
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
194
248
  className: cn([
195
249
  "badge",
196
250
  variant !== "neutral" && `badge-${variant}`,
197
- size !== "md" && `badge-${size}`
251
+ size !== "md" && `badge-${size}`,
252
+ soft && "badge-soft"
198
253
  ], className),
199
254
  ...rest,
200
- children: [renderIcon(icon), children]
255
+ children: [
256
+ renderIcon(icon),
257
+ children,
258
+ onRemove ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
259
+ type: "button",
260
+ className: cn("badge-remove", void 0),
261
+ "aria-label": removeLabel,
262
+ onClick: onRemove,
263
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RemoveIcon, {})
264
+ }) : null
265
+ ]
201
266
  });
202
267
  }
203
268
  //#endregion
204
269
  //#region src/BrandTile.tsx
205
- function BrandTile({ monogram, icon, className, children, ...rest }) {
270
+ /**
271
+ * Brand/system mark for the navbar — monogram, icon, or shop logo. Precedence
272
+ * is `src` > `icon` > `monogram`. Monogram/icon tiles are `aria-hidden`; image
273
+ * tiles expose `alt` to assistive tech instead.
274
+ */
275
+ function BrandTile({ variant = "solid", size = "md", monogram, icon, src, alt = "", className, children, ...rest }) {
276
+ const classes = cn([
277
+ "brand-tile",
278
+ variant !== "solid" && `brand-tile-${variant}`,
279
+ size === "lg" && "brand-tile-lg"
280
+ ], className);
281
+ if (src) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
282
+ className: classes,
283
+ ...rest,
284
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
285
+ src,
286
+ alt
287
+ })
288
+ });
206
289
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
207
- className: cn("brand-tile", className),
290
+ className: classes,
208
291
  "aria-hidden": true,
209
292
  ...rest,
210
- children: icon ? renderIcon(icon, 14) : children ?? monogram
293
+ children: icon ? renderIcon(icon) : children ?? monogram
294
+ });
295
+ }
296
+ //#endregion
297
+ //#region src/Avatar.tsx
298
+ /**
299
+ * Image avatar with an initials fallback. Initials show until the image loads
300
+ * (and again, React-only, if it errors); the vanilla CSS layers the `<img>`
301
+ * over the initials instead.
302
+ */
303
+ function Avatar({ src, alt, initials, size = "md", shape = "circle", className, children, ...rest }) {
304
+ const fallback = children ?? initials;
305
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_avatar.Avatar.Root, {
306
+ className: cn([
307
+ "avatar",
308
+ size !== "md" && `avatar-${size}`,
309
+ shape === "square" && "avatar-square"
310
+ ], className),
311
+ ...rest,
312
+ children: [fallback !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_avatar.Avatar.Fallback, { children: fallback }) : null, src !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_avatar.Avatar.Image, {
313
+ src,
314
+ alt
315
+ }) : null]
316
+ });
317
+ }
318
+ /** Overlapping stack of avatars; later children paint on top. `max` caps the visible count. */
319
+ function AvatarGroup({ max, size = "md", className, children, ...rest }) {
320
+ const items = react.Children.toArray(children);
321
+ const overflow = max !== void 0 && items.length > max ? items.length - max : 0;
322
+ const visible = overflow > 0 ? items.slice(0, max) : items;
323
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
324
+ className: cn("avatar-group", className),
325
+ ...rest,
326
+ children: [visible, overflow > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
327
+ className: cn([
328
+ "avatar",
329
+ size !== "md" && `avatar-${size}`,
330
+ "avatar-more"
331
+ ], void 0),
332
+ "aria-label": `+${overflow} more`,
333
+ children: ["+", overflow]
334
+ }) : null]
211
335
  });
212
336
  }
213
337
  //#endregion
@@ -535,9 +659,52 @@ var Breadcrumbs = Object.assign(BreadcrumbsRoot, {
535
659
  });
536
660
  //#endregion
537
661
  //#region src/Input.tsx
538
- function Input({ variant = "bordered", inputSize = "md", className, type = "text", ...rest }) {
539
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_input.Input, {
662
+ function ClearIcon() {
663
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
664
+ width: "1em",
665
+ height: "1em",
666
+ viewBox: "0 0 24 24",
667
+ fill: "none",
668
+ stroke: "currentColor",
669
+ strokeWidth: "2",
670
+ strokeLinecap: "round",
671
+ strokeLinejoin: "round",
672
+ "aria-hidden": "true",
673
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })]
674
+ });
675
+ }
676
+ function Input({ variant = "bordered", inputSize = "md", icon, iconTrailing, clearable = false, clearLabel = "Clear", onClear, action, className, classNames, type = "text", value, defaultValue, onChange, disabled, readOnly, ref: consumerRef, ...rest }) {
677
+ const innerRef = (0, react.useRef)(null);
678
+ const isControlled = value !== void 0;
679
+ const [uncontrolledHasValue, setUncontrolledHasValue] = (0, react.useState)(() => defaultValue != null && String(defaultValue).length > 0);
680
+ const hasValue = isControlled ? value != null && String(value).length > 0 : uncontrolledHasValue;
681
+ const setRef = (0, react.useCallback)((node) => {
682
+ innerRef.current = node;
683
+ if (typeof consumerRef === "function") consumerRef(node);
684
+ else if (consumerRef) consumerRef.current = node;
685
+ }, [consumerRef]);
686
+ function handleChange(event) {
687
+ if (!isControlled) setUncontrolledHasValue(event.target.value.length > 0);
688
+ onChange?.(event);
689
+ }
690
+ function handleClear() {
691
+ const input = innerRef.current;
692
+ if (!input) return;
693
+ (Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")?.set)?.call(input, "");
694
+ input.dispatchEvent(new Event("input", { bubbles: true }));
695
+ input.focus();
696
+ if (!isControlled) setUncontrolledHasValue(false);
697
+ onClear?.();
698
+ }
699
+ const showClear = clearable && hasValue && !disabled && !readOnly;
700
+ const inputEl = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_input.Input, {
701
+ ref: setRef,
540
702
  type,
703
+ value,
704
+ defaultValue,
705
+ onChange: handleChange,
706
+ disabled,
707
+ readOnly,
541
708
  className: cn([
542
709
  "input",
543
710
  variant !== "bordered" && `input-${variant}`,
@@ -545,6 +712,71 @@ function Input({ variant = "bordered", inputSize = "md", className, type = "text
545
712
  ], className),
546
713
  ...rest
547
714
  });
715
+ if (!(icon != null || iconTrailing != null || action != null || clearable)) return inputEl;
716
+ const trailing = showClear ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
717
+ type: "button",
718
+ className: cn("input-action", classNames?.action),
719
+ "aria-label": clearLabel,
720
+ onClick: handleClear,
721
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ClearIcon, {})
722
+ }) : action ?? renderIcon(iconTrailing);
723
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
724
+ className: cn("input-icon", classNames?.wrapper),
725
+ children: [
726
+ renderIcon(icon),
727
+ inputEl,
728
+ trailing
729
+ ]
730
+ });
731
+ }
732
+ function EyeIcon() {
733
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
734
+ width: "1em",
735
+ height: "1em",
736
+ viewBox: "0 0 24 24",
737
+ fill: "none",
738
+ stroke: "currentColor",
739
+ strokeWidth: "2",
740
+ strokeLinecap: "round",
741
+ strokeLinejoin: "round",
742
+ "aria-hidden": "true",
743
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" })]
744
+ });
745
+ }
746
+ function EyeOffIcon() {
747
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
748
+ width: "1em",
749
+ height: "1em",
750
+ viewBox: "0 0 24 24",
751
+ fill: "none",
752
+ stroke: "currentColor",
753
+ strokeWidth: "2",
754
+ strokeLinecap: "round",
755
+ strokeLinejoin: "round",
756
+ "aria-hidden": "true",
757
+ children: [
758
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10.585 10.587a2 2 0 0 0 2.829 2.828" }),
759
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" }),
760
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M3 3l18 18" })
761
+ ]
762
+ });
763
+ }
764
+ /** Password field with a trailing reveal toggle. Emits the same `.input` / `.input-action` classes. */
765
+ function PasswordInput({ revealLabel = "Show password", classNames, ...rest }) {
766
+ const [revealed, setRevealed] = (0, react.useState)(false);
767
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Input, {
768
+ type: revealed ? "text" : "password",
769
+ action: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
770
+ type: "button",
771
+ className: cn("input-action", classNames?.action),
772
+ "aria-label": revealLabel,
773
+ "aria-pressed": revealed,
774
+ onClick: () => setRevealed((v) => !v),
775
+ children: revealed ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EyeOffIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EyeIcon, {})
776
+ }),
777
+ classNames,
778
+ ...rest
779
+ });
548
780
  }
549
781
  //#endregion
550
782
  //#region src/FileInput.tsx
@@ -575,8 +807,69 @@ function InputGroupAddon({ className, ...rest }) {
575
807
  }
576
808
  var InputGroup = Object.assign(InputGroupRoot, { Addon: InputGroupAddon });
577
809
  //#endregion
810
+ //#region src/NumberInput.tsx
811
+ function MinusIcon() {
812
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
813
+ width: "1em",
814
+ height: "1em",
815
+ viewBox: "0 0 24 24",
816
+ fill: "none",
817
+ stroke: "currentColor",
818
+ strokeWidth: "2",
819
+ strokeLinecap: "round",
820
+ strokeLinejoin: "round",
821
+ "aria-hidden": "true",
822
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5 12h14" })
823
+ });
824
+ }
825
+ function PlusIcon() {
826
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
827
+ width: "1em",
828
+ height: "1em",
829
+ viewBox: "0 0 24 24",
830
+ fill: "none",
831
+ stroke: "currentColor",
832
+ strokeWidth: "2",
833
+ strokeLinecap: "round",
834
+ strokeLinejoin: "round",
835
+ "aria-hidden": "true",
836
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M12 5v14M5 12h14" })
837
+ });
838
+ }
839
+ /**
840
+ * Numeric field with stepper buttons over Base UI NumberField (clamp-on-blur,
841
+ * step, `Intl` formatting via `format`). The vanilla bundle styles a native
842
+ * `<input type="number">` and steps with `stepUp()` / `stepDown()`.
843
+ */
844
+ function NumberInput({ size = "md", classNames, placeholder, inputAriaLabel, decrementLabel = "Decrease", incrementLabel = "Increase", decrementIcon, incrementIcon, className, ...rootProps }) {
845
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_number_field.NumberField.Root, {
846
+ className: cn("number-input-root", className),
847
+ ...rootProps,
848
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_number_field.NumberField.Group, {
849
+ className: cn(["number-input", size !== "md" && `number-input-${size}`], classNames?.group),
850
+ children: [
851
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_number_field.NumberField.Decrement, {
852
+ className: cn("number-input-step", classNames?.decrement),
853
+ "aria-label": decrementLabel,
854
+ children: decrementIcon ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MinusIcon, {})
855
+ }),
856
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_number_field.NumberField.Input, {
857
+ className: cn("number-input-field", classNames?.input),
858
+ placeholder,
859
+ "aria-label": inputAriaLabel
860
+ }),
861
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_number_field.NumberField.Increment, {
862
+ className: cn("number-input-step", classNames?.increment),
863
+ "aria-label": incrementLabel,
864
+ children: incrementIcon ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {})
865
+ })
866
+ ]
867
+ })
868
+ });
869
+ }
870
+ //#endregion
578
871
  //#region src/Indicator.tsx
579
- function Indicator({ label, variant = "neutral", size = "sm", icon, placement = "top-end", offset, className, "aria-label": ariaLabel, style: styleProp, children, ...rest }) {
872
+ function Indicator({ label, variant = "neutral", size = "sm", icon, placement = "top-end", offset, max, className, "aria-label": ariaLabel, style: styleProp, children, ...rest }) {
580
873
  const [vertical, horizontal] = placement.split("-");
581
874
  const placementClasses = [
582
875
  "indicator-item",
@@ -584,6 +877,7 @@ function Indicator({ label, variant = "neutral", size = "sm", icon, placement =
584
877
  horizontal !== "end" && `indicator-${horizontal}`
585
878
  ];
586
879
  const hasContent = label !== void 0 || icon !== void 0;
880
+ const displayLabel = typeof label === "number" && max !== void 0 && label > max ? `${max}+` : label;
587
881
  const style = offset !== void 0 ? {
588
882
  ...styleProp,
589
883
  "--indicator-offset": `${offset}px`
@@ -598,7 +892,7 @@ function Indicator({ label, variant = "neutral", size = "sm", icon, placement =
598
892
  size,
599
893
  icon,
600
894
  "aria-label": ariaLabel,
601
- children: label
895
+ children: displayLabel
602
896
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
603
897
  className: cn([
604
898
  ...placementClasses,
@@ -627,6 +921,20 @@ function Link({ external, icon, iconTrailing, className, target, rel, children,
627
921
  });
628
922
  }
629
923
  //#endregion
924
+ //#region src/Separator.tsx
925
+ /**
926
+ * A styled `<hr>` (implicit `role="separator"`). Margins are zeroed — spacing
927
+ * comes from the parent's gap or margin utilities.
928
+ */
929
+ function Separator({ orientation = "horizontal", className, ...rest }) {
930
+ const vertical = orientation === "vertical";
931
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", {
932
+ className: cn(["separator", vertical && "separator-vertical"], className),
933
+ "aria-orientation": vertical ? "vertical" : void 0,
934
+ ...rest
935
+ });
936
+ }
937
+ //#endregion
630
938
  //#region src/Pagination.tsx
631
939
  /** Pure (safe during render): previous, numbers/ellipses (`boundaryCount` at each end, `siblingCount` around `page`), next. */
632
940
  function getPaginationItems({ page, total, siblingCount = 1, boundaryCount = 1 }) {
@@ -690,7 +998,7 @@ function range(start, end) {
690
998
  for (let i = start; i <= end; i++) out.push(i);
691
999
  return out;
692
1000
  }
693
- function Pagination({ page, total, onPageChange, siblingCount = 1, boundaryCount = 1, previousIcon, nextIcon, renderItem, className, "aria-label": ariaLabel = "Pagination", ...rest }) {
1001
+ function Pagination({ page, total, onPageChange, siblingCount = 1, boundaryCount = 1, previousIcon, nextIcon, renderItem, className, classNames, "aria-label": ariaLabel = "Pagination", ...rest }) {
694
1002
  const items = getPaginationItems({
695
1003
  page,
696
1004
  total,
@@ -704,8 +1012,8 @@ function Pagination({ page, total, onPageChange, siblingCount = 1, boundaryCount
704
1012
  className: cn("pagination", className),
705
1013
  ...rest,
706
1014
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", { children: items.map((item, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
707
- className: cn("page-item", void 0),
708
- children: renderItem ? renderItem(item) : defaultRender(item, onPageChange, prev, next)
1015
+ className: cn("page-item", classNames?.item),
1016
+ children: renderItem ? renderItem(item) : defaultRender(item, onPageChange, prev, next, classNames)
709
1017
  }, paginationItemKey(item, i))) })
710
1018
  });
711
1019
  }
@@ -746,11 +1054,11 @@ function paginationItemKey(item, index) {
746
1054
  default: return `${index}`;
747
1055
  }
748
1056
  }
749
- function defaultRender(item, onPageChange, prev, next) {
1057
+ function defaultRender(item, onPageChange, prev, next, classNames) {
750
1058
  switch (item.type) {
751
1059
  case "previous": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
752
1060
  type: "button",
753
- className: cn("page-link", void 0),
1061
+ className: cn("page-link", classNames?.link),
754
1062
  "aria-label": "Previous page",
755
1063
  "aria-disabled": item.disabled || void 0,
756
1064
  disabled: item.disabled,
@@ -759,7 +1067,7 @@ function defaultRender(item, onPageChange, prev, next) {
759
1067
  });
760
1068
  case "next": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
761
1069
  type: "button",
762
- className: cn("page-link", void 0),
1070
+ className: cn("page-link", classNames?.link),
763
1071
  "aria-label": "Next page",
764
1072
  "aria-disabled": item.disabled || void 0,
765
1073
  disabled: item.disabled,
@@ -767,13 +1075,13 @@ function defaultRender(item, onPageChange, prev, next) {
767
1075
  children: next
768
1076
  });
769
1077
  case "ellipsis": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
770
- className: cn("page-ellipsis", void 0),
1078
+ className: cn("page-ellipsis", classNames?.ellipsis),
771
1079
  "aria-hidden": "true",
772
1080
  children: "…"
773
1081
  });
774
1082
  case "page": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
775
1083
  type: "button",
776
- className: cn(["page-link", item.selected && "active"], void 0),
1084
+ className: cn(["page-link", item.selected && "active"], classNames?.link),
777
1085
  "aria-current": item.selected ? "page" : void 0,
778
1086
  "aria-label": `Page ${item.page}`,
779
1087
  onClick: () => onPageChange(item.page),
@@ -806,7 +1114,7 @@ function CheckboxRoot({ className, children, ...rest }) {
806
1114
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_checkbox.Checkbox.Root, {
807
1115
  className: cn("checkbox", className),
808
1116
  ...rest,
809
- children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckboxIndicator, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon$1, {}) })
1117
+ children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckboxIndicator, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon$2, {}) })
810
1118
  });
811
1119
  }
812
1120
  function CheckboxIndicator({ className, ...rest }) {
@@ -815,7 +1123,7 @@ function CheckboxIndicator({ className, ...rest }) {
815
1123
  ...rest
816
1124
  });
817
1125
  }
818
- function CheckIcon$1() {
1126
+ function CheckIcon$2() {
819
1127
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
820
1128
  viewBox: "0 0 24 24",
821
1129
  fill: "none",
@@ -944,7 +1252,7 @@ function SelectItemIndicator({ className, children, ...rest }) {
944
1252
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_select.Select.ItemIndicator, {
945
1253
  className: cn("select-item-indicator", className),
946
1254
  ...rest,
947
- children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon, {})
1255
+ children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon$1, {})
948
1256
  });
949
1257
  }
950
1258
  function SelectGroup(props) {
@@ -956,7 +1264,7 @@ function SelectGroupLabel({ className, ...rest }) {
956
1264
  ...rest
957
1265
  });
958
1266
  }
959
- function CheckIcon() {
1267
+ function CheckIcon$1() {
960
1268
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
961
1269
  viewBox: "0 0 24 24",
962
1270
  fill: "none",
@@ -1018,13 +1326,14 @@ function Container({ size = "md", compact, className, ...rest }) {
1018
1326
  * The bare `.card` container — no body, no title. Use this when you need to
1019
1327
  * compose the internals yourself (e.g. a media block above the body).
1020
1328
  */
1021
- function CardContainer({ variant = "default", bordered, compact, className, ...rest }) {
1329
+ function CardContainer({ variant = "default", bordered, compact, scroll, className, ...rest }) {
1022
1330
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1023
1331
  className: cn([
1024
1332
  "card",
1025
1333
  variant !== "default" && `card-${variant}`,
1026
1334
  bordered && "card-bordered",
1027
- compact && "card-compact"
1335
+ compact && "card-compact",
1336
+ scroll && "card-scroll"
1028
1337
  ], className),
1029
1338
  ...rest
1030
1339
  });
@@ -1034,23 +1343,48 @@ function CardContainer({ variant = "default", bordered, compact, className, ...r
1034
1343
  * an optional title (with icon), description, children, and actions. For
1035
1344
  * anything outside that shape, use `<Card.Container>` and compose by hand.
1036
1345
  */
1037
- function CardRoot({ variant, bordered, compact, icon, title, description, toolbar, actions, className, children, ...rest }) {
1346
+ function CardRoot({ variant, bordered, compact, media, icon, title, description, toolbar, actions, className, classNames, children, ...rest }) {
1038
1347
  const titleEl = icon !== void 0 || title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardTitle, {
1039
1348
  icon,
1349
+ className: classNames?.title,
1040
1350
  children: title
1041
1351
  }) : null;
1042
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardContainer, {
1352
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CardContainer, {
1043
1353
  variant,
1044
1354
  bordered,
1045
1355
  compact,
1046
1356
  className,
1047
1357
  ...rest,
1048
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CardBody, { children: [
1049
- toolbar !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CardHeader, { children: [titleEl, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardToolbar, { children: toolbar })] }) : titleEl,
1050
- description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDescription, { children: description }) : null,
1051
- children,
1052
- actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardActions, { children: actions }) : null
1053
- ] })
1358
+ children: [media !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardMedia, {
1359
+ className: classNames?.media,
1360
+ children: media
1361
+ }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CardBody, {
1362
+ className: classNames?.body,
1363
+ children: [
1364
+ toolbar !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(CardHeader, {
1365
+ className: classNames?.header,
1366
+ children: [titleEl, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardToolbar, {
1367
+ className: classNames?.toolbar,
1368
+ children: toolbar
1369
+ })]
1370
+ }) : titleEl,
1371
+ description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDescription, {
1372
+ className: classNames?.description,
1373
+ children: description
1374
+ }) : null,
1375
+ children,
1376
+ actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardActions, {
1377
+ className: classNames?.actions,
1378
+ children: actions
1379
+ }) : null
1380
+ ]
1381
+ })]
1382
+ });
1383
+ }
1384
+ function CardMedia({ className, ...rest }) {
1385
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1386
+ className: cn("card-media", className),
1387
+ ...rest
1054
1388
  });
1055
1389
  }
1056
1390
  function CardBody({ className, ...rest }) {
@@ -1092,6 +1426,7 @@ function CardActions({ className, ...rest }) {
1092
1426
  }
1093
1427
  var Card = Object.assign(CardRoot, {
1094
1428
  Container: CardContainer,
1429
+ Media: CardMedia,
1095
1430
  Body: CardBody,
1096
1431
  Header: CardHeader,
1097
1432
  Toolbar: CardToolbar,
@@ -1101,12 +1436,17 @@ var Card = Object.assign(CardRoot, {
1101
1436
  });
1102
1437
  //#endregion
1103
1438
  //#region src/StatCard.tsx
1439
+ function trendIntent(direction) {
1440
+ if (direction === "down") return "negative";
1441
+ if (direction === "flat") return "neutral";
1442
+ return "positive";
1443
+ }
1104
1444
  /**
1105
1445
  * Compact KPI tile (label / value / detail) on a `.card` shell, so it shares
1106
1446
  * every card modifier — `compact`/`bordered` map to `.card-compact`/`.card-bordered`.
1107
1447
  * Free-form tiles: `<Card>`; label/value tables: `<PropertyList>`.
1108
1448
  */
1109
- function StatCard({ variant = "default", label, value, detail, icon, compact, bordered, className, children, ...rest }) {
1449
+ function StatCard({ variant = "default", label, value, detail, trend, icon, compact, bordered, className, classNames, children, ...rest }) {
1110
1450
  const hasLabel = label !== void 0;
1111
1451
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1112
1452
  className: cn([
@@ -1119,15 +1459,21 @@ function StatCard({ variant = "default", label, value, detail, icon, compact, bo
1119
1459
  ...rest,
1120
1460
  children: [
1121
1461
  hasLabel ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
1122
- className: cn("stat-card-label", void 0),
1462
+ className: cn("stat-card-label", classNames?.label),
1123
1463
  children: [renderIcon(icon), label]
1124
1464
  }) : null,
1125
1465
  value !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1126
- className: cn("stat-card-value", void 0),
1466
+ className: cn("stat-card-value", classNames?.value),
1127
1467
  children: value
1128
1468
  }) : null,
1469
+ trend !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1470
+ className: cn("stat-card-trend", classNames?.trend),
1471
+ "data-trend": trend.direction ?? "up",
1472
+ "data-intent": trend.intent ?? trendIntent(trend.direction ?? "up"),
1473
+ children: trend.value
1474
+ }) : null,
1129
1475
  detail !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1130
- className: cn("stat-card-detail", void 0),
1476
+ className: cn("stat-card-detail", classNames?.detail),
1131
1477
  children: detail
1132
1478
  }) : null,
1133
1479
  children
@@ -1135,6 +1481,137 @@ function StatCard({ variant = "default", label, value, detail, icon, compact, bo
1135
1481
  });
1136
1482
  }
1137
1483
  //#endregion
1484
+ //#region src/Timeline.tsx
1485
+ function TimelineRoot({ numbered, className, ...rest }) {
1486
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
1487
+ className: cn(["timeline", numbered && "timeline-numbered"], className),
1488
+ ...rest
1489
+ });
1490
+ }
1491
+ function TimelineItem({ status = "default", icon, marker, title, time, description, className, classNames, children, ...rest }) {
1492
+ let indicator;
1493
+ if (marker !== void 0) indicator = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1494
+ className: cn("timeline-marker", classNames?.marker),
1495
+ children: marker
1496
+ });
1497
+ else if (icon != null) indicator = renderIcon(icon);
1498
+ else indicator = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: cn("timeline-dot", classNames?.dot) });
1499
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
1500
+ className: cn(["timeline-item", status !== "default" && `timeline-item-${status}`], className),
1501
+ ...rest,
1502
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1503
+ className: cn("timeline-indicator", classNames?.indicator),
1504
+ children: indicator
1505
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1506
+ className: cn("timeline-content", classNames?.content),
1507
+ children: [
1508
+ title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1509
+ className: cn("timeline-title", classNames?.title),
1510
+ children: title
1511
+ }) : null,
1512
+ time !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1513
+ className: cn("timeline-time", classNames?.time),
1514
+ children: time
1515
+ }) : null,
1516
+ description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1517
+ className: cn("timeline-description", classNames?.description),
1518
+ children: description
1519
+ }) : null,
1520
+ children
1521
+ ]
1522
+ })]
1523
+ });
1524
+ }
1525
+ var Timeline = Object.assign(TimelineRoot, { Item: TimelineItem });
1526
+ //#endregion
1527
+ //#region src/Item.tsx
1528
+ /** The bare row primitive — just the `.item` shell, for layouts the default `<Item>` doesn't fit. */
1529
+ function ItemContainer({ variant = "default", size = "md", asLink, className, ...rest }) {
1530
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1531
+ className: cn([
1532
+ "item",
1533
+ variant !== "default" && `item-${variant}`,
1534
+ size !== "md" && `item-${size}`,
1535
+ asLink && "item-link"
1536
+ ], className),
1537
+ ...rest
1538
+ });
1539
+ }
1540
+ function ItemMedia({ className, ...rest }) {
1541
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1542
+ className: cn("item-media", className),
1543
+ ...rest
1544
+ });
1545
+ }
1546
+ function ItemContent({ className, ...rest }) {
1547
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1548
+ className: cn("item-content", className),
1549
+ ...rest
1550
+ });
1551
+ }
1552
+ function ItemTitle({ className, ...rest }) {
1553
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1554
+ className: cn("item-title", className),
1555
+ ...rest
1556
+ });
1557
+ }
1558
+ function ItemDescription({ className, ...rest }) {
1559
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1560
+ className: cn("item-description", className),
1561
+ ...rest
1562
+ });
1563
+ }
1564
+ function ItemActions({ className, ...rest }) {
1565
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1566
+ className: cn("item-actions", className),
1567
+ ...rest
1568
+ });
1569
+ }
1570
+ /** Opinionated row with media / title+description / actions shorthand. For other shapes, compose `<Item.Container>`. */
1571
+ function ItemRoot({ media, icon, title, description, actions, classNames, children, ...rest }) {
1572
+ const leading = media ?? renderIcon(icon);
1573
+ const hasContent = title !== void 0 || description !== void 0;
1574
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ItemContainer, {
1575
+ ...rest,
1576
+ children: [
1577
+ leading != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ItemMedia, {
1578
+ className: classNames?.media,
1579
+ children: leading
1580
+ }) : null,
1581
+ hasContent ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ItemContent, {
1582
+ className: classNames?.content,
1583
+ children: [title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ItemTitle, {
1584
+ className: classNames?.title,
1585
+ children: title
1586
+ }) : null, description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ItemDescription, {
1587
+ className: classNames?.description,
1588
+ children: description
1589
+ }) : null]
1590
+ }) : null,
1591
+ children,
1592
+ actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ItemActions, {
1593
+ className: classNames?.actions,
1594
+ children: actions
1595
+ }) : null
1596
+ ]
1597
+ });
1598
+ }
1599
+ /** Divided vertical stack of items. */
1600
+ function ItemGroup({ bordered, className, ...rest }) {
1601
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1602
+ className: cn(["item-group", bordered && "item-group-bordered"], className),
1603
+ ...rest
1604
+ });
1605
+ }
1606
+ var Item = Object.assign(ItemRoot, {
1607
+ Container: ItemContainer,
1608
+ Media: ItemMedia,
1609
+ Content: ItemContent,
1610
+ Title: ItemTitle,
1611
+ Description: ItemDescription,
1612
+ Actions: ItemActions
1613
+ });
1614
+ //#endregion
1138
1615
  //#region src/chart-internal.ts
1139
1616
  /**
1140
1617
  * Multi-series palette of existing Flexoki tokens, not a new token layer. The
@@ -1378,24 +1855,15 @@ var StackedBar = Object.assign(StackedBarRoot, {
1378
1855
  Legend: ChartLegend
1379
1856
  });
1380
1857
  //#endregion
1381
- //#region src/Dialog.tsx
1858
+ //#region src/dialog-internal.ts
1382
1859
  var DialogContext = (0, react.createContext)(null);
1383
- function DefaultCloseIcon() {
1384
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1385
- width: "16",
1386
- height: "16",
1387
- viewBox: "0 0 24 24",
1388
- fill: "none",
1389
- stroke: "currentColor",
1390
- strokeWidth: "2",
1391
- strokeLinecap: "round",
1392
- strokeLinejoin: "round",
1393
- "aria-hidden": "true",
1394
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })]
1395
- });
1396
- }
1397
- /** The bare `<dialog>` primitive — for layouts the default `<Dialog>` doesn't fit. */
1398
- function DialogContainer({ open, onOpenChange, size = "md", closedby = "any", className, children, ref: consumerRef, ...rest }) {
1860
+ /**
1861
+ * Drives a native `<dialog>` from a controlled `open` prop, shared by `<Dialog>`
1862
+ * and `<Drawer>`: merges the consumer ref, calls `showModal()` / `close()` on
1863
+ * change, and reports closes (Esc, backdrop, form submit) via `onOpenChange`.
1864
+ * Returns `ref` for the portal container context.
1865
+ */
1866
+ function useDialogElement(open, onOpenChange, consumerRef) {
1399
1867
  const ref = (0, react.useRef)(null);
1400
1868
  const onOpenChangeRef = (0, react.useRef)(onOpenChange);
1401
1869
  onOpenChangeRef.current = onOpenChange;
@@ -1417,8 +1885,33 @@ function DialogContainer({ open, onOpenChange, size = "md", closedby = "any", cl
1417
1885
  el.addEventListener("close", handleClose);
1418
1886
  return () => el.removeEventListener("close", handleClose);
1419
1887
  }, []);
1888
+ return {
1889
+ setRef,
1890
+ ctx: { close: () => ref.current?.close() },
1891
+ ref
1892
+ };
1893
+ }
1894
+ //#endregion
1895
+ //#region src/Dialog.tsx
1896
+ function DefaultCloseIcon() {
1897
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1898
+ width: "16",
1899
+ height: "16",
1900
+ viewBox: "0 0 24 24",
1901
+ fill: "none",
1902
+ stroke: "currentColor",
1903
+ strokeWidth: "2",
1904
+ strokeLinecap: "round",
1905
+ strokeLinejoin: "round",
1906
+ "aria-hidden": "true",
1907
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })]
1908
+ });
1909
+ }
1910
+ /** The bare `<dialog>` primitive — for layouts the default `<Dialog>` doesn't fit. */
1911
+ function DialogContainer({ open, onOpenChange, size = "md", closedby = "any", className, children, ref: consumerRef, ...rest }) {
1912
+ const { setRef, ctx, ref } = useDialogElement(open, onOpenChange, consumerRef);
1420
1913
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogContext.Provider, {
1421
- value: { close: () => ref.current?.close() },
1914
+ value: ctx,
1422
1915
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PortalContainerContext.Provider, {
1423
1916
  value: ref,
1424
1917
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dialog", {
@@ -1477,19 +1970,35 @@ function DialogCloseButton({ icon, className, children, onClick, type = "button"
1477
1970
  });
1478
1971
  }
1479
1972
  /** Standard modal with shorthand-driven header/body/footer. For other shapes, compose `<Dialog.Container>` by hand. */
1480
- function DialogRoot({ icon, title, description, actions, dismissible = true, closeLabel = "Close", children, ...containerProps }) {
1973
+ function DialogRoot({ icon, title, description, actions, dismissible = true, closeLabel = "Close", classNames, children, ...containerProps }) {
1481
1974
  const hasTitle = title !== void 0 || icon !== void 0;
1482
1975
  const showHeader = hasTitle || dismissible;
1483
1976
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogContainer, {
1484
1977
  ...containerProps,
1485
1978
  children: [
1486
- showHeader ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogHeader, { children: [hasTitle ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogTitle, {
1487
- icon,
1488
- children: title
1489
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: cn("flex-1", void 0) }), dismissible ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogCloseButton, { "aria-label": closeLabel }) : null] }) : null,
1490
- description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogDescription, { children: description }) : null,
1491
- children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogBody, { children }) : null,
1492
- actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogFooter, { children: actions }) : null
1979
+ showHeader ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogHeader, {
1980
+ className: classNames?.header,
1981
+ children: [hasTitle ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogTitle, {
1982
+ icon,
1983
+ className: classNames?.title,
1984
+ children: title
1985
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: cn("flex-1", void 0) }), dismissible ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogCloseButton, {
1986
+ "aria-label": closeLabel,
1987
+ className: classNames?.close
1988
+ }) : null]
1989
+ }) : null,
1990
+ description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogDescription, {
1991
+ className: classNames?.description,
1992
+ children: description
1993
+ }) : null,
1994
+ children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogBody, {
1995
+ className: classNames?.body,
1996
+ children
1997
+ }) : null,
1998
+ actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogFooter, {
1999
+ className: classNames?.footer,
2000
+ children: actions
2001
+ }) : null
1493
2002
  ]
1494
2003
  });
1495
2004
  }
@@ -1503,6 +2012,73 @@ var Dialog = Object.assign(DialogRoot, {
1503
2012
  CloseButton: DialogCloseButton
1504
2013
  });
1505
2014
  //#endregion
2015
+ //#region src/Drawer.tsx
2016
+ /** The bare edge-anchored `<dialog>` primitive — for layouts the default `<Drawer>` doesn't fit. */
2017
+ function DrawerContainer({ open, onOpenChange, side = "end", size = "md", closedby = "any", className, children, ref: consumerRef, ...rest }) {
2018
+ const { setRef, ctx, ref } = useDialogElement(open, onOpenChange, consumerRef);
2019
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogContext.Provider, {
2020
+ value: ctx,
2021
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PortalContainerContext.Provider, {
2022
+ value: ref,
2023
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dialog", {
2024
+ ref: setRef,
2025
+ className: cn([
2026
+ "dialog",
2027
+ "drawer",
2028
+ side !== "end" && `drawer-${side}`,
2029
+ size !== "md" && `drawer-${size}`
2030
+ ], className),
2031
+ closedby,
2032
+ ...rest,
2033
+ children
2034
+ })
2035
+ })
2036
+ });
2037
+ }
2038
+ /** Edge-anchored panel with shorthand-driven header/body/footer. For other shapes, compose `<Drawer.Container>`. */
2039
+ function DrawerRoot({ icon, title, description, actions, dismissible = true, closeLabel = "Close", classNames, children, ...containerProps }) {
2040
+ const hasTitle = title !== void 0 || icon !== void 0;
2041
+ const showHeader = hasTitle || dismissible;
2042
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DrawerContainer, {
2043
+ ...containerProps,
2044
+ children: [
2045
+ showHeader ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Dialog.Header, {
2046
+ className: classNames?.header,
2047
+ children: [hasTitle ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog.Title, {
2048
+ icon,
2049
+ className: classNames?.title,
2050
+ children: title
2051
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: cn("flex-1", void 0) }), dismissible ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog.CloseButton, {
2052
+ "aria-label": closeLabel,
2053
+ className: classNames?.close
2054
+ }) : null]
2055
+ }) : null,
2056
+ description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog.Description, {
2057
+ className: classNames?.description,
2058
+ children: description
2059
+ }) : null,
2060
+ children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog.Body, {
2061
+ className: classNames?.body,
2062
+ children
2063
+ }) : null,
2064
+ actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Dialog.Footer, {
2065
+ className: classNames?.footer,
2066
+ children: actions
2067
+ }) : null
2068
+ ]
2069
+ });
2070
+ }
2071
+ /** Shares the Dialog header/body/footer subparts; only the container differs. */
2072
+ var Drawer = Object.assign(DrawerRoot, {
2073
+ Container: DrawerContainer,
2074
+ Header: Dialog.Header,
2075
+ Title: Dialog.Title,
2076
+ Description: Dialog.Description,
2077
+ Body: Dialog.Body,
2078
+ Footer: Dialog.Footer,
2079
+ CloseButton: Dialog.CloseButton
2080
+ });
2081
+ //#endregion
1506
2082
  //#region src/Field.tsx
1507
2083
  /** The bare `.field` container — for layouts the default `<Field>` doesn't fit. */
1508
2084
  function FieldContainer({ className, ...rest }) {
@@ -1512,14 +2088,19 @@ function FieldContainer({ className, ...rest }) {
1512
2088
  });
1513
2089
  }
1514
2090
  /** Standard field — label, control (`children`), description, error. For other shapes, compose `<Field.Container>` by hand. */
1515
- function FieldRoot({ label, description, error, required, inline, className, children, ...rest }) {
2091
+ function FieldRoot({ label, description, error, required, inline, className, classNames, children, ...rest }) {
1516
2092
  const labelEl = label !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldLabel, {
1517
2093
  required,
2094
+ className: classNames?.label,
1518
2095
  children: label
1519
2096
  }) : null;
1520
- const descriptionEl = description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldDescription, { children: description }) : null;
2097
+ const descriptionEl = description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldDescription, {
2098
+ className: classNames?.description,
2099
+ children: description
2100
+ }) : null;
1521
2101
  const errorEl = error !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FieldError, {
1522
2102
  match: true,
2103
+ className: classNames?.error,
1523
2104
  children: error
1524
2105
  }) : null;
1525
2106
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(FieldContainer, {
@@ -1610,17 +2191,41 @@ function MenuPopup({ className, role = "menu", ...rest }) {
1610
2191
  ...rest
1611
2192
  });
1612
2193
  }
2194
+ function CheckIcon() {
2195
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
2196
+ width: "1em",
2197
+ height: "1em",
2198
+ viewBox: "0 0 24 24",
2199
+ fill: "none",
2200
+ stroke: "currentColor",
2201
+ strokeWidth: "2",
2202
+ strokeLinecap: "round",
2203
+ strokeLinejoin: "round",
2204
+ "aria-hidden": "true",
2205
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5 12l5 5l10 -10" })
2206
+ });
2207
+ }
2208
+ function MenuItemIndicator() {
2209
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2210
+ className: cn("menu-item-indicator", void 0),
2211
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckIcon, {})
2212
+ });
2213
+ }
1613
2214
  function MenuItem(props) {
1614
2215
  const ref = (0, react.useRef)(null);
1615
2216
  const hotkey = props.hotkey;
2217
+ const checked = props.checked;
1616
2218
  const ariaDisabled = props["aria-disabled"];
1617
2219
  const isDisabled = "disabled" in props && props.disabled === true || ariaDisabled === true || ariaDisabled === "true";
1618
2220
  const { ariaKeyShortcuts, primaryChord } = useHotkey(hotkey, () => ref.current?.click(), { enabled: !isDisabled });
2221
+ const leading = checked !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MenuItemIndicator, {}) : renderIcon(props.icon);
2222
+ const defaultRole = checked !== void 0 ? "menuitemcheckbox" : "menuitem";
1619
2223
  if (props.href !== void 0) {
1620
- const { className, role = "menuitem", icon, children, hotkey: _hk, onClick, ...rest } = props;
2224
+ const { className, role, icon: _icon, checked: _checked, children, hotkey: _hk, onClick, ...rest } = props;
1621
2225
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1622
2226
  ref,
1623
- role,
2227
+ role: role ?? defaultRole,
2228
+ "aria-checked": checked,
1624
2229
  "aria-keyshortcuts": ariaKeyShortcuts,
1625
2230
  className: cn("menu-item", className),
1626
2231
  onClick: (event) => {
@@ -1632,22 +2237,23 @@ function MenuItem(props) {
1632
2237
  },
1633
2238
  ...rest,
1634
2239
  children: [
1635
- renderIcon(icon),
2240
+ leading,
1636
2241
  children,
1637
2242
  primaryChord !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Kbd, { keys: primaryChord }) : null
1638
2243
  ]
1639
2244
  });
1640
2245
  }
1641
- const { className, type = "button", role = "menuitem", icon, children, hotkey: _hk, ...rest } = props;
2246
+ const { className, type = "button", role, icon: _icon, checked: _checked, children, hotkey: _hk, ...rest } = props;
1642
2247
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1643
2248
  ref,
1644
2249
  type,
1645
- role,
2250
+ role: role ?? defaultRole,
2251
+ "aria-checked": checked,
1646
2252
  "aria-keyshortcuts": ariaKeyShortcuts,
1647
2253
  className: cn("menu-item", className),
1648
2254
  ...rest,
1649
2255
  children: [
1650
- renderIcon(icon),
2256
+ leading,
1651
2257
  children,
1652
2258
  primaryChord !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Kbd, { keys: primaryChord }) : null
1653
2259
  ]
@@ -1834,7 +2440,7 @@ function TooltipPopup({ size = "md", side = "top", align = "center", sideOffset
1834
2440
  })
1835
2441
  });
1836
2442
  }
1837
- function TooltipShorthand({ content, side, align, sideOffset, size, children, ...rootProps }) {
2443
+ function TooltipShorthand({ content, side, align, sideOffset, size, classNames, children, ...rootProps }) {
1838
2444
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(TooltipRoot, {
1839
2445
  ...rootProps,
1840
2446
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_tooltip.Tooltip.Trigger, { render: children }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TooltipPopup, {
@@ -1842,6 +2448,7 @@ function TooltipShorthand({ content, side, align, sideOffset, size, children, ..
1842
2448
  align,
1843
2449
  sideOffset,
1844
2450
  size,
2451
+ className: classNames?.popup,
1845
2452
  children: content
1846
2453
  })]
1847
2454
  });
@@ -1886,7 +2493,7 @@ function CheckGlyph({ className }) {
1886
2493
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5 12l5 5l10 -10" })
1887
2494
  });
1888
2495
  }
1889
- function PropertyListRoot({ striped, compact, hideIfAllEmpty, title, className, children, ...rest }) {
2496
+ function PropertyListRoot({ striped, compact, hideIfAllEmpty, title, className, classNames, children, ...rest }) {
1890
2497
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1891
2498
  className: cn([
1892
2499
  "property-list",
@@ -1896,10 +2503,10 @@ function PropertyListRoot({ striped, compact, hideIfAllEmpty, title, className,
1896
2503
  ], className),
1897
2504
  ...rest,
1898
2505
  children: [title !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
1899
- className: cn("property-list-title", void 0),
2506
+ className: cn("property-list-title", classNames?.title),
1900
2507
  children: title
1901
2508
  }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dl", {
1902
- className: cn("property-list-items", void 0),
2509
+ className: cn("property-list-items", classNames?.items),
1903
2510
  children
1904
2511
  })]
1905
2512
  });
@@ -1909,14 +2516,18 @@ function isEmptyValue(value) {
1909
2516
  if (typeof value === "string") return value.trim() === "";
1910
2517
  return false;
1911
2518
  }
1912
- function PropertyListItem({ label, value, numeric, copyable, copyValue, children, ...rest }) {
2519
+ function PropertyListItem({ label, value, numeric, copyable, copyValue, classNames, children, ...rest }) {
1913
2520
  if (children !== void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children });
1914
2521
  const empty = isEmptyValue(value);
1915
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PropertyListLabel, { children: label }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PropertyListValue, {
2522
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PropertyListLabel, {
2523
+ className: classNames?.label,
2524
+ children: label
2525
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PropertyListValue, {
1916
2526
  numeric,
1917
2527
  copyable,
1918
2528
  empty,
1919
2529
  copyValue: copyValue ?? (typeof value === "string" ? value : void 0),
2530
+ classNames: classNames?.copy ? { copy: classNames.copy } : void 0,
1920
2531
  ...rest,
1921
2532
  children: empty ? "—" : value
1922
2533
  })] });
@@ -1927,7 +2538,7 @@ function PropertyListLabel({ className, ...rest }) {
1927
2538
  ...rest
1928
2539
  });
1929
2540
  }
1930
- function PropertyListValue({ numeric, copyable, empty, copyValue, className, children, ...rest }) {
2541
+ function PropertyListValue({ numeric, copyable, empty, copyValue, className, classNames, children, ...rest }) {
1931
2542
  const ddRef = (0, react.useRef)(null);
1932
2543
  const [copied, setCopied] = (0, react.useState)(false);
1933
2544
  async function handleCopy() {
@@ -1951,7 +2562,7 @@ function PropertyListValue({ numeric, copyable, empty, copyValue, className, chi
1951
2562
  children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1952
2563
  type: "button",
1953
2564
  "aria-label": "Copy",
1954
- className: cn("property-list-copy", void 0),
2565
+ className: cn("property-list-copy", classNames?.copy),
1955
2566
  onClick: handleCopy,
1956
2567
  "data-copied": copied ? "true" : void 0,
1957
2568
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CopyGlyph, { className: cn("property-list-copy-icon", void 0) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckGlyph, { className: cn("property-list-copy-icon-copied", void 0) })]
@@ -1965,14 +2576,17 @@ var PropertyList = Object.assign(PropertyListRoot, {
1965
2576
  });
1966
2577
  //#endregion
1967
2578
  //#region src/Table.tsx
1968
- function TableRoot({ striped, bordered, relaxed, sticky, className, ...rest }) {
2579
+ function TableRoot({ striped, bordered, density, relaxed, sticky, pinCol, className, ...rest }) {
2580
+ const resolvedDensity = density ?? (relaxed ? "relaxed" : "default");
1969
2581
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("table", {
1970
2582
  className: cn([
1971
2583
  "table",
1972
2584
  striped && "table-striped",
1973
2585
  bordered && "table-bordered",
1974
- relaxed && "table-relaxed",
1975
- sticky && "table-sticky"
2586
+ resolvedDensity === "compact" && "table-compact",
2587
+ resolvedDensity === "relaxed" && "table-relaxed",
2588
+ sticky && "table-sticky",
2589
+ pinCol && "table-pin-col"
1976
2590
  ], className),
1977
2591
  ...rest
1978
2592
  });
@@ -1989,6 +2603,7 @@ function TableBody({ className, ...rest }) {
1989
2603
  ...rest
1990
2604
  });
1991
2605
  }
2606
+ /** Footer rows are semibold by default; the first row gets a strong top divider against the body. */
1992
2607
  function TableFoot({ className, ...rest }) {
1993
2608
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tfoot", {
1994
2609
  className,
@@ -2021,18 +2636,28 @@ function TableCell({ align, gutter, numeric, className, ...rest }) {
2021
2636
  ...rest
2022
2637
  });
2023
2638
  }
2639
+ /** A centered "no results" row; renders its own `<tr>`, so drop it inside `<Table.Body>`. */
2640
+ function TableEmpty({ colSpan, className, children, ...rest }) {
2641
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
2642
+ className: cn("table-empty", className),
2643
+ colSpan,
2644
+ ...rest,
2645
+ children
2646
+ }) });
2647
+ }
2024
2648
  var Table = Object.assign(TableRoot, {
2025
2649
  Head: TableHead,
2026
2650
  Body: TableBody,
2027
2651
  Foot: TableFoot,
2028
2652
  Row: TableRow,
2029
2653
  HeaderCell: TableHeaderCell,
2030
- Cell: TableCell
2654
+ Cell: TableCell,
2655
+ Empty: TableEmpty
2031
2656
  });
2032
2657
  //#endregion
2033
2658
  //#region src/Sidebar.tsx
2034
2659
  var SidebarContext = (0, react.createContext)(null);
2035
- function SidebarRoot({ collapsed, defaultCollapsed, onCollapsedChange, drawerLabel = "Navigation", className, children, ...rest }) {
2660
+ function SidebarRoot({ collapsed, defaultCollapsed, onCollapsedChange, drawerLabel = "Navigation", className, classNames, children, ...rest }) {
2036
2661
  const shell = useAppShell();
2037
2662
  const drawerOpen = shell?.mobileDrawerOpen ?? false;
2038
2663
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(SidebarContext.Provider, {
@@ -2048,8 +2673,8 @@ function SidebarRoot({ collapsed, defaultCollapsed, onCollapsedChange, drawerLab
2048
2673
  }), shell ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Root, {
2049
2674
  open: drawerOpen,
2050
2675
  onOpenChange: (open) => shell.setMobileDrawerOpen(open),
2051
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Portal, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Backdrop, { className: cn("sidebar-drawer-backdrop", void 0) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Popup, {
2052
- className: cn("sidebar-drawer", void 0),
2676
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_base_ui_react_dialog.Dialog.Portal, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Backdrop, { className: cn("sidebar-drawer-backdrop", classNames?.drawerBackdrop) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Popup, {
2677
+ className: cn("sidebar-drawer", classNames?.drawer),
2053
2678
  "aria-label": drawerLabel,
2054
2679
  onClick: (event) => {
2055
2680
  if (event.target.closest("a, [data-drawer-close]")) shell.setMobileDrawerOpen(false);
@@ -2083,15 +2708,24 @@ function SidebarGroupLabel({ className, ...rest }) {
2083
2708
  ...rest
2084
2709
  });
2085
2710
  }
2086
- function SidebarItem({ active, icon, badge, className, children, ...rest }) {
2711
+ function SidebarItem({ active, icon, badge, className, classNames, children, ...rest }) {
2087
2712
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
2088
2713
  className: cn("sidebar-item", className),
2089
2714
  "aria-current": active ? "page" : void 0,
2090
2715
  ...rest,
2091
2716
  children: [
2092
- icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, { children: renderIcon(icon) }) : null,
2093
- children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarLabel, { children }) : null,
2094
- badge !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarBadge, { children: badge }) : null
2717
+ icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, {
2718
+ className: classNames?.icon,
2719
+ children: renderIcon(icon)
2720
+ }) : null,
2721
+ children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarLabel, {
2722
+ className: classNames?.label,
2723
+ children
2724
+ }) : null,
2725
+ badge !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarBadge, {
2726
+ className: classNames?.badge,
2727
+ children: badge
2728
+ }) : null
2095
2729
  ]
2096
2730
  });
2097
2731
  }
@@ -2114,11 +2748,17 @@ function SidebarBadge({ className, ...rest }) {
2114
2748
  ...rest
2115
2749
  });
2116
2750
  }
2117
- function SidebarCollapsible({ icon, label, trigger, children, className, open, defaultOpen, onOpenChange, ...rest }) {
2751
+ function SidebarCollapsible({ icon, label, trigger, children, className, classNames, open, defaultOpen, onOpenChange, ...rest }) {
2118
2752
  const isControlled = open !== void 0;
2119
2753
  const [internalOpen, setInternalOpen] = (0, react.useState)(defaultOpen ?? false);
2120
2754
  const isOpen = isControlled ? open : internalOpen;
2121
- const triggerContent = trigger ?? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, { children: renderIcon(icon) }) : null, label !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarLabel, { children: label }) : null] });
2755
+ const triggerContent = trigger ?? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, {
2756
+ className: classNames?.icon,
2757
+ children: renderIcon(icon)
2758
+ }) : null, label !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarLabel, {
2759
+ className: classNames?.label,
2760
+ children: label
2761
+ }) : null] });
2122
2762
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
2123
2763
  className: cn("sidebar-collapsible", className),
2124
2764
  open: isOpen,
@@ -2129,23 +2769,29 @@ function SidebarCollapsible({ icon, label, trigger, children, className, open, d
2129
2769
  },
2130
2770
  ...rest,
2131
2771
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {
2132
- className: cn("sidebar-collapsible-trigger", void 0),
2772
+ className: cn("sidebar-collapsible-trigger", classNames?.trigger),
2133
2773
  children: triggerContent
2134
2774
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2135
- className: cn("sidebar-collapsible-panel", void 0),
2775
+ className: cn("sidebar-collapsible-panel", classNames?.panel),
2136
2776
  children
2137
2777
  })]
2138
2778
  });
2139
2779
  }
2140
- function SidebarSubItem({ active, icon, badge, className, children, ...rest }) {
2780
+ function SidebarSubItem({ active, icon, badge, className, classNames, children, ...rest }) {
2141
2781
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
2142
2782
  className: cn("sidebar-subitem", className),
2143
2783
  "aria-current": active ? "page" : void 0,
2144
2784
  ...rest,
2145
2785
  children: [
2146
- icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, { children: renderIcon(icon) }) : null,
2786
+ icon != null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarIcon, {
2787
+ className: classNames?.icon,
2788
+ children: renderIcon(icon)
2789
+ }) : null,
2147
2790
  children,
2148
- badge !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarBadge, { children: badge }) : null
2791
+ badge !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SidebarBadge, {
2792
+ className: classNames?.badge,
2793
+ children: badge
2794
+ }) : null
2149
2795
  ]
2150
2796
  });
2151
2797
  }
@@ -2155,7 +2801,7 @@ function SidebarFooter({ className, ...rest }) {
2155
2801
  ...rest
2156
2802
  });
2157
2803
  }
2158
- function SidebarCollapseToggle({ label = "Toggle sidebar", className, children, ...rest }) {
2804
+ function SidebarCollapseToggle({ label = "Toggle sidebar", className, classNames, children, ...rest }) {
2159
2805
  const ctx = (0, react.useContext)(SidebarContext);
2160
2806
  const controlledChecked = ctx?.collapsed;
2161
2807
  const isControlled = controlledChecked !== void 0;
@@ -2165,7 +2811,7 @@ function SidebarCollapseToggle({ label = "Toggle sidebar", className, children,
2165
2811
  children: [
2166
2812
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
2167
2813
  type: "checkbox",
2168
- className: cn("sidebar-toggle", void 0),
2814
+ className: cn("sidebar-toggle", classNames?.input),
2169
2815
  "aria-label": label,
2170
2816
  ...isControlled ? { checked: controlledChecked } : { defaultChecked: ctx?.defaultCollapsed },
2171
2817
  onChange: (event) => ctx?.onCollapsedChange?.(event.currentTarget.checked)
@@ -2197,6 +2843,8 @@ exports.Accordion = Accordion;
2197
2843
  exports.AdminRoot = AdminRoot;
2198
2844
  exports.Alert = Alert;
2199
2845
  exports.AppShell = AppShell;
2846
+ exports.Avatar = Avatar;
2847
+ exports.AvatarGroup = AvatarGroup;
2200
2848
  exports.Badge = Badge;
2201
2849
  exports.BarChart = BarChart;
2202
2850
  exports.BrandTile = BrandTile;
@@ -2210,17 +2858,22 @@ exports.CodeBlock = CodeBlock;
2210
2858
  exports.Container = Container;
2211
2859
  exports.Dialog = Dialog;
2212
2860
  exports.Donut = Donut;
2861
+ exports.Drawer = Drawer;
2213
2862
  exports.Field = Field;
2214
2863
  exports.FileInput = FileInput;
2215
2864
  exports.Footer = Footer;
2216
2865
  exports.Indicator = Indicator;
2217
2866
  exports.Input = Input;
2218
2867
  exports.InputGroup = InputGroup;
2868
+ exports.Item = Item;
2869
+ exports.ItemGroup = ItemGroup;
2219
2870
  exports.Kbd = Kbd;
2220
2871
  exports.Link = Link;
2221
2872
  exports.Menu = Menu;
2222
2873
  exports.Navbar = Navbar;
2874
+ exports.NumberInput = NumberInput;
2223
2875
  exports.Pagination = Pagination;
2876
+ exports.PasswordInput = PasswordInput;
2224
2877
  exports.Progress = Progress;
2225
2878
  exports.PropertyList = PropertyList;
2226
2879
  exports.Prose = Prose;
@@ -2228,6 +2881,7 @@ exports.Radio = Radio;
2228
2881
  exports.RadioGroup = RadioGroup;
2229
2882
  exports.SERIES = SERIES;
2230
2883
  exports.Select = Select;
2884
+ exports.Separator = Separator;
2231
2885
  exports.Sidebar = Sidebar;
2232
2886
  exports.Spinner = Spinner;
2233
2887
  exports.StackedBar = StackedBar;
@@ -2236,6 +2890,7 @@ exports.Switch = Switch;
2236
2890
  exports.Table = Table;
2237
2891
  exports.Tabs = Tabs;
2238
2892
  exports.Textarea = Textarea;
2893
+ exports.Timeline = Timeline;
2239
2894
  exports.Tooltip = Tooltip;
2240
2895
  exports.getPaginationItems = getPaginationItems;
2241
2896
  exports.useAppShell = useAppShell;