@aortl/admin-react 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -13,28 +13,49 @@ let _base_ui_react_field = require("@base-ui/react/field");
13
13
  let _base_ui_react_tabs = require("@base-ui/react/tabs");
14
14
  let _base_ui_react_tooltip = require("@base-ui/react/tooltip");
15
15
  let _base_ui_react_dialog = require("@base-ui/react/dialog");
16
+ //#region src/cn.ts
17
+ /**
18
+ * Every admin class name is prefixed so the bundle can coexist with a host
19
+ * page's CSS without colliding on common names like `.btn` or `.card`. The
20
+ * matching CSS lives in `@aortl/admin-css/admin.scoped.css` (built by
21
+ * `wrap-scoped.mjs`), which carries the same prefix on every selector.
22
+ */
23
+ var PREFIX = "_ao-";
24
+ function prefixTokens(value) {
25
+ if (!value) return "";
26
+ return value.split(/\s+/).filter(Boolean).map((token) => `${PREFIX}${token}`).join(" ");
27
+ }
28
+ function join(...parts) {
29
+ return parts.filter(Boolean).join(" ");
30
+ }
31
+ function cn(base, className) {
32
+ const baseClasses = prefixTokens((0, clsx.clsx)(base));
33
+ if (typeof className === "function") return (state) => join(baseClasses, className(state) ?? void 0);
34
+ return join(baseClasses, className);
35
+ }
36
+ //#endregion
16
37
  //#region src/Accordion.tsx
17
38
  function AccordionRoot({ className, ...rest }) {
18
39
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
19
- className: (0, clsx.clsx)("accordion", className),
40
+ className: cn("accordion", className),
20
41
  ...rest
21
42
  });
22
43
  }
23
44
  function AccordionItem({ className, ...rest }) {
24
45
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("details", {
25
- className: (0, clsx.clsx)("accordion-item", className),
46
+ className: cn("accordion-item", className),
26
47
  ...rest
27
48
  });
28
49
  }
29
50
  function AccordionSummary({ className, ...rest }) {
30
51
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {
31
- className: (0, clsx.clsx)("accordion-summary", className),
52
+ className: cn("accordion-summary", className),
32
53
  ...rest
33
54
  });
34
55
  }
35
56
  function AccordionContent({ className, ...rest }) {
36
57
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
37
- className: (0, clsx.clsx)("accordion-content", className),
58
+ className: cn("accordion-content", className),
38
59
  ...rest
39
60
  });
40
61
  }
@@ -47,7 +68,7 @@ var Accordion = Object.assign(AccordionRoot, {
47
68
  //#region src/AdminRoot.tsx
48
69
  function AdminRoot({ className, ...rest }) {
49
70
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
50
- className: (0, clsx.clsx)("admin-root", className),
71
+ className: cn("admin-root", className),
51
72
  ...rest
52
73
  });
53
74
  }
@@ -74,7 +95,7 @@ function renderIcon(icon, size = 16) {
74
95
  function AlertRoot({ variant = "info", icon, title, description, className, role, children, ...rest }) {
75
96
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
76
97
  role: role ?? (variant === "danger" || variant === "warning" ? "alert" : "status"),
77
- className: (0, clsx.clsx)("alert", `alert-${variant}`, className),
98
+ className: cn(["alert", `alert-${variant}`], className),
78
99
  ...rest,
79
100
  children: [
80
101
  renderIcon(icon),
@@ -86,13 +107,13 @@ function AlertRoot({ variant = "info", icon, title, description, className, role
86
107
  }
87
108
  function AlertTitle({ className, ...rest }) {
88
109
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
89
- className: (0, clsx.clsx)("alert-title", className),
110
+ className: cn("alert-title", className),
90
111
  ...rest
91
112
  });
92
113
  }
93
114
  function AlertDescription({ className, ...rest }) {
94
115
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
95
- className: (0, clsx.clsx)("alert-description", className),
116
+ className: cn("alert-description", className),
96
117
  ...rest
97
118
  });
98
119
  }
@@ -130,7 +151,11 @@ function AppShellRoot({ hasSidebar = false, hasFooter = false, mobileDrawerOpen,
130
151
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AppShellContext.Provider, {
131
152
  value,
132
153
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
133
- className: (0, clsx.clsx)("app-shell", hasSidebar && "app-shell-with-sidebar", hasFooter && "app-shell-with-footer", className),
154
+ className: cn([
155
+ "app-shell",
156
+ hasSidebar && "app-shell-with-sidebar",
157
+ hasFooter && "app-shell-with-footer"
158
+ ], className),
134
159
  style: rootStyle,
135
160
  ...rest,
136
161
  children
@@ -139,7 +164,7 @@ function AppShellRoot({ hasSidebar = false, hasFooter = false, mobileDrawerOpen,
139
164
  }
140
165
  function AppShellMain({ className, ...rest }) {
141
166
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("main", {
142
- className: (0, clsx.clsx)("app-shell-main", className),
167
+ className: cn("app-shell-main", className),
143
168
  ...rest
144
169
  });
145
170
  }
@@ -148,7 +173,11 @@ var AppShell = Object.assign(AppShellRoot, { Main: AppShellMain });
148
173
  //#region src/Badge.tsx
149
174
  function Badge({ variant = "neutral", size = "md", icon, className, children, ...rest }) {
150
175
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
151
- className: (0, clsx.clsx)("badge", `badge-${variant}`, size !== "md" && `badge-${size}`, className),
176
+ className: cn([
177
+ "badge",
178
+ `badge-${variant}`,
179
+ size !== "md" && `badge-${size}`
180
+ ], className),
152
181
  ...rest,
153
182
  children: [renderIcon(icon, size === "sm" ? 10 : 12), children]
154
183
  });
@@ -157,26 +186,13 @@ function Badge({ variant = "neutral", size = "md", icon, className, children, ..
157
186
  //#region src/BrandTile.tsx
158
187
  function BrandTile({ monogram, icon, className, children, ...rest }) {
159
188
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
160
- className: (0, clsx.clsx)("brand-tile", className),
189
+ className: cn("brand-tile", className),
161
190
  "aria-hidden": true,
162
191
  ...rest,
163
192
  children: icon ? renderIcon(icon, 14) : children ?? monogram
164
193
  });
165
194
  }
166
195
  //#endregion
167
- //#region src/cn.ts
168
- /**
169
- * className merger that preserves Base UI's render-prop className form.
170
- *
171
- * Base UI components accept `className: string | ((state) => string | undefined)`. The plain
172
- * `clsx()` path is correct for strings, but a function form has to be deferred
173
- * until Base UI invokes it with the component state.
174
- */
175
- function cn(base, className) {
176
- if (typeof className === "function") return (state) => (0, clsx.clsx)(base, className(state));
177
- return (0, clsx.clsx)(base, className);
178
- }
179
- //#endregion
180
196
  //#region src/Button.tsx
181
197
  function Button({ variant = "primary", size = "md", fullWidth, loading, icon, iconTrailing, className, type = "button", disabled, children, ...rest }) {
182
198
  const iconOnly = children == null && (icon != null || iconTrailing != null);
@@ -205,7 +221,7 @@ function Button({ variant = "primary", size = "md", fullWidth, loading, icon, ic
205
221
  function ButtonGroup({ orientation = "horizontal", role = "group", className, ...rest }) {
206
222
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
207
223
  role,
208
- className: (0, clsx.clsx)("btn-group", orientation === "vertical" && "btn-group-vertical", className),
224
+ className: cn(["btn-group", orientation === "vertical" && "btn-group-vertical"], className),
209
225
  ...rest
210
226
  });
211
227
  }
@@ -215,7 +231,7 @@ function BreadcrumbsRoot({ separator, className, children, "aria-label": ariaLab
215
231
  const items = react.Children.toArray(children).filter(react.isValidElement);
216
232
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
217
233
  "aria-label": ariaLabel,
218
- className: (0, clsx.clsx)("breadcrumbs", className),
234
+ className: cn("breadcrumbs", className),
219
235
  ...rest,
220
236
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", { children: items.map((child, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [child, i < items.length - 1 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BreadcrumbSeparator, { children: separator }) : null] }, child.key ?? i)) })
221
237
  });
@@ -224,7 +240,7 @@ function BreadcrumbItem(props) {
224
240
  if (props.href !== void 0) {
225
241
  const { className, current, icon, children, ...rest } = props;
226
242
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
227
- className: (0, clsx.clsx)("breadcrumb-item", className),
243
+ className: cn("breadcrumb-item", className),
228
244
  "aria-current": current ? "page" : void 0,
229
245
  ...rest,
230
246
  children: [renderIcon(icon, 14), children]
@@ -232,7 +248,7 @@ function BreadcrumbItem(props) {
232
248
  }
233
249
  const { className, current, icon, children, ...rest } = props;
234
250
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
235
- className: (0, clsx.clsx)("breadcrumb-item", className),
251
+ className: cn("breadcrumb-item", className),
236
252
  "aria-current": current ? "page" : void 0,
237
253
  ...rest,
238
254
  children: [renderIcon(icon, 14), children]
@@ -241,7 +257,7 @@ function BreadcrumbItem(props) {
241
257
  function BreadcrumbSeparator({ className, children, ...rest }) {
242
258
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
243
259
  "aria-hidden": "true",
244
- className: (0, clsx.clsx)("breadcrumb-separator", className),
260
+ className: cn("breadcrumb-separator", className),
245
261
  ...rest,
246
262
  children
247
263
  });
@@ -280,13 +296,13 @@ function FileInput({ variant = "bordered", inputSize = "md", className, ...rest
280
296
  //#region src/InputGroup.tsx
281
297
  function InputGroupRoot({ className, ...rest }) {
282
298
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
283
- className: (0, clsx.clsx)("input-group", className),
299
+ className: cn("input-group", className),
284
300
  ...rest
285
301
  });
286
302
  }
287
303
  function InputGroupAddon({ className, ...rest }) {
288
304
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
289
- className: (0, clsx.clsx)("input-group-addon", className),
305
+ className: cn("input-group-addon", className),
290
306
  ...rest
291
307
  });
292
308
  }
@@ -371,10 +387,10 @@ function Pagination({ page, total, onPageChange, siblingCount = 1, boundaryCount
371
387
  const next = nextIcon !== void 0 ? renderIcon(nextIcon, 16) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronRightIcon, {});
372
388
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
373
389
  "aria-label": ariaLabel,
374
- className: (0, clsx.clsx)("pagination", className),
390
+ className: cn("pagination", className),
375
391
  ...rest,
376
392
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", { children: items.map((item, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
377
- className: "page-item",
393
+ className: cn("page-item", void 0),
378
394
  children: renderItem ? renderItem(item) : defaultRender(item, onPageChange, prev, next)
379
395
  }, paginationItemKey(item, i))) })
380
396
  });
@@ -420,7 +436,7 @@ function defaultRender(item, onPageChange, prev, next) {
420
436
  switch (item.type) {
421
437
  case "previous": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
422
438
  type: "button",
423
- className: "page-link",
439
+ className: cn("page-link", void 0),
424
440
  "aria-label": "Previous page",
425
441
  "aria-disabled": item.disabled || void 0,
426
442
  disabled: item.disabled,
@@ -429,7 +445,7 @@ function defaultRender(item, onPageChange, prev, next) {
429
445
  });
430
446
  case "next": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
431
447
  type: "button",
432
- className: "page-link",
448
+ className: cn("page-link", void 0),
433
449
  "aria-label": "Next page",
434
450
  "aria-disabled": item.disabled || void 0,
435
451
  disabled: item.disabled,
@@ -437,13 +453,13 @@ function defaultRender(item, onPageChange, prev, next) {
437
453
  children: next
438
454
  });
439
455
  case "ellipsis": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
440
- className: "page-ellipsis",
456
+ className: cn("page-ellipsis", void 0),
441
457
  "aria-hidden": "true",
442
458
  children: "…"
443
459
  });
444
460
  case "page": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
445
461
  type: "button",
446
- className: (0, clsx.clsx)("page-link", item.selected && "active"),
462
+ className: cn(["page-link", item.selected && "active"], void 0),
447
463
  "aria-current": item.selected ? "page" : void 0,
448
464
  "aria-label": `Page ${item.page}`,
449
465
  onClick: () => onPageChange(item.page),
@@ -455,7 +471,11 @@ function defaultRender(item, onPageChange, prev, next) {
455
471
  //#region src/Textarea.tsx
456
472
  function Textarea({ variant = "bordered", textareaSize = "md", className, ...rest }) {
457
473
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
458
- className: (0, clsx.clsx)("textarea", `textarea-${variant}`, textareaSize !== "md" && `textarea-${textareaSize}`, className),
474
+ className: cn([
475
+ "textarea",
476
+ `textarea-${variant}`,
477
+ textareaSize !== "md" && `textarea-${textareaSize}`
478
+ ], className),
459
479
  ...rest
460
480
  });
461
481
  }
@@ -517,7 +537,11 @@ function Progress({ value, max = 100, variant = "primary", size = "md", classNam
517
537
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("progress", {
518
538
  value,
519
539
  max,
520
- className: (0, clsx.clsx)("progress", variant !== "primary" && `progress-${variant}`, size !== "md" && `progress-${size}`, className),
540
+ className: cn([
541
+ "progress",
542
+ variant !== "primary" && `progress-${variant}`,
543
+ size !== "md" && `progress-${size}`
544
+ ], className),
521
545
  ...rest
522
546
  });
523
547
  }
@@ -526,7 +550,7 @@ function Progress({ value, max = 100, variant = "primary", size = "md", classNam
526
550
  function Spinner({ size = "md", label = "Loading", className, ...rest }) {
527
551
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("output", {
528
552
  "aria-label": label,
529
- className: (0, clsx.clsx)("spinner", size !== "md" && `spinner-${size}`, className),
553
+ className: cn(["spinner", size !== "md" && `spinner-${size}`], className),
530
554
  ...rest
531
555
  });
532
556
  }
@@ -653,7 +677,11 @@ var Select = Object.assign(SelectRoot, {
653
677
  */
654
678
  function CardContainer({ bordered, compact, className, ...rest }) {
655
679
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
656
- className: (0, clsx.clsx)("card", bordered && "card-bordered", compact && "card-compact", className),
680
+ className: cn([
681
+ "card",
682
+ bordered && "card-bordered",
683
+ compact && "card-compact"
684
+ ], className),
657
685
  ...rest
658
686
  });
659
687
  }
@@ -682,26 +710,26 @@ function CardRoot({ bordered, compact, icon, title, description, actions, classN
682
710
  }
683
711
  function CardBody({ className, ...rest }) {
684
712
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
685
- className: (0, clsx.clsx)("card-body", className),
713
+ className: cn("card-body", className),
686
714
  ...rest
687
715
  });
688
716
  }
689
717
  function CardTitle({ icon, className, children, ...rest }) {
690
718
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", {
691
- className: (0, clsx.clsx)("card-title", className),
719
+ className: cn("card-title", className),
692
720
  ...rest,
693
721
  children: [renderIcon(icon), children]
694
722
  });
695
723
  }
696
724
  function CardDescription({ className, ...rest }) {
697
725
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
698
- className: (0, clsx.clsx)("card-description", className),
726
+ className: cn("card-description", className),
699
727
  ...rest
700
728
  });
701
729
  }
702
730
  function CardActions({ className, ...rest }) {
703
731
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
704
- className: (0, clsx.clsx)("card-actions", className),
732
+ className: cn("card-actions", className),
705
733
  ...rest
706
734
  });
707
735
  }
@@ -755,7 +783,7 @@ function DialogContainer({ open, onOpenChange, size = "md", closedby = "any", cl
755
783
  value: { close: () => ref.current?.close() },
756
784
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dialog", {
757
785
  ref,
758
- className: (0, clsx.clsx)("dialog", size !== "md" && `dialog-${size}`, className),
786
+ className: cn(["dialog", size !== "md" && `dialog-${size}`], className),
759
787
  closedby,
760
788
  ...rest,
761
789
  children
@@ -764,32 +792,32 @@ function DialogContainer({ open, onOpenChange, size = "md", closedby = "any", cl
764
792
  }
765
793
  function DialogHeader({ className, ...rest }) {
766
794
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
767
- className: (0, clsx.clsx)("dialog-header", className),
795
+ className: cn("dialog-header", className),
768
796
  ...rest
769
797
  });
770
798
  }
771
799
  function DialogTitle({ icon, className, children, ...rest }) {
772
800
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h2", {
773
- className: (0, clsx.clsx)("dialog-title", className),
801
+ className: cn("dialog-title", className),
774
802
  ...rest,
775
803
  children: [renderIcon(icon), children]
776
804
  });
777
805
  }
778
806
  function DialogDescription({ className, ...rest }) {
779
807
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
780
- className: (0, clsx.clsx)("dialog-description", className),
808
+ className: cn("dialog-description", className),
781
809
  ...rest
782
810
  });
783
811
  }
784
812
  function DialogBody({ className, ...rest }) {
785
813
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
786
- className: (0, clsx.clsx)("dialog-body", className),
814
+ className: cn("dialog-body", className),
787
815
  ...rest
788
816
  });
789
817
  }
790
818
  function DialogFooter({ className, ...rest }) {
791
819
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
792
- className: (0, clsx.clsx)("dialog-footer", className),
820
+ className: cn("dialog-footer", className),
793
821
  ...rest
794
822
  });
795
823
  }
@@ -797,7 +825,7 @@ function DialogCloseButton({ icon, className, children, onClick, type = "button"
797
825
  const ctx = (0, react.useContext)(DialogContext);
798
826
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
799
827
  type,
800
- className: (0, clsx.clsx)("dialog-close", className),
828
+ className: cn("dialog-close", className),
801
829
  "aria-label": ariaLabel,
802
830
  onClick: (event) => {
803
831
  onClick?.(event);
@@ -821,7 +849,7 @@ function DialogRoot({ icon, title, description, actions, dismissible = true, clo
821
849
  showHeader ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DialogHeader, { children: [hasTitle ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogTitle, {
822
850
  icon,
823
851
  children: title
824
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "flex-1" }), dismissible ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogCloseButton, { "aria-label": closeLabel }) : null] }) : null,
852
+ }) : /* @__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,
825
853
  description !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogDescription, { children: description }) : null,
826
854
  children !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogBody, { children }) : null,
827
855
  actions !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DialogFooter, { children: actions }) : null
@@ -873,26 +901,26 @@ var Field = Object.assign(FieldRoot, {
873
901
  //#region src/Footer.tsx
874
902
  function FooterRoot({ className, ...rest }) {
875
903
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("footer", {
876
- className: (0, clsx.clsx)("footer", className),
904
+ className: cn("footer", className),
877
905
  ...rest
878
906
  });
879
907
  }
880
908
  function FooterLinks({ className, ...rest }) {
881
909
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
882
- className: (0, clsx.clsx)("footer-links", className),
910
+ className: cn("footer-links", className),
883
911
  ...rest
884
912
  });
885
913
  }
886
914
  function FooterLink({ className, children, ...rest }) {
887
915
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
888
- className: (0, clsx.clsx)("footer-link", className),
916
+ className: cn("footer-link", className),
889
917
  ...rest,
890
918
  children
891
919
  });
892
920
  }
893
921
  function FooterMeta({ className, ...rest }) {
894
922
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
895
- className: (0, clsx.clsx)("footer-meta", className),
923
+ className: cn("footer-meta", className),
896
924
  ...rest
897
925
  });
898
926
  }
@@ -905,20 +933,20 @@ var Footer = Object.assign(FooterRoot, {
905
933
  //#region src/Menu.tsx
906
934
  function MenuRoot({ className, ...rest }) {
907
935
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("details", {
908
- className: (0, clsx.clsx)("menu", className),
936
+ className: cn("menu", className),
909
937
  ...rest
910
938
  });
911
939
  }
912
940
  function MenuTrigger({ className, ...rest }) {
913
941
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {
914
- className: (0, clsx.clsx)("menu-trigger", className),
942
+ className: cn("menu-trigger", className),
915
943
  ...rest
916
944
  });
917
945
  }
918
946
  function MenuPopup({ className, role = "menu", ...rest }) {
919
947
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
920
948
  role,
921
- className: (0, clsx.clsx)("menu-popup", className),
949
+ className: cn("menu-popup", className),
922
950
  ...rest
923
951
  });
924
952
  }
@@ -927,7 +955,7 @@ function MenuItem(props) {
927
955
  const { className, role = "menuitem", icon, children, ...rest } = props;
928
956
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
929
957
  role,
930
- className: (0, clsx.clsx)("menu-item", className),
958
+ className: cn("menu-item", className),
931
959
  ...rest,
932
960
  children: [renderIcon(icon), children]
933
961
  });
@@ -936,27 +964,27 @@ function MenuItem(props) {
936
964
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
937
965
  type,
938
966
  role,
939
- className: (0, clsx.clsx)("menu-item", className),
967
+ className: cn("menu-item", className),
940
968
  ...rest,
941
969
  children: [renderIcon(icon), children]
942
970
  });
943
971
  }
944
972
  function MenuSeparator({ className, ...rest }) {
945
973
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", {
946
- className: (0, clsx.clsx)("menu-separator", className),
974
+ className: cn("menu-separator", className),
947
975
  ...rest
948
976
  });
949
977
  }
950
978
  function MenuGroup({ className, role = "group", ...rest }) {
951
979
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
952
980
  role,
953
- className: (0, clsx.clsx)("menu-group", className),
981
+ className: cn("menu-group", className),
954
982
  ...rest
955
983
  });
956
984
  }
957
985
  function MenuGroupLabel({ className, ...rest }) {
958
986
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
959
- className: (0, clsx.clsx)("menu-group-label", className),
987
+ className: cn("menu-group-label", className),
960
988
  ...rest
961
989
  });
962
990
  }
@@ -972,25 +1000,25 @@ var Menu = Object.assign(MenuRoot, {
972
1000
  //#region src/Navbar.tsx
973
1001
  function NavbarRoot({ className, ...rest }) {
974
1002
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
975
- className: (0, clsx.clsx)("navbar", className),
1003
+ className: cn("navbar", className),
976
1004
  ...rest
977
1005
  });
978
1006
  }
979
1007
  function NavbarBrand({ className, ...rest }) {
980
1008
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
981
- className: (0, clsx.clsx)("navbar-brand", className),
1009
+ className: cn("navbar-brand", className),
982
1010
  ...rest
983
1011
  });
984
1012
  }
985
1013
  function NavbarItems({ className, ...rest }) {
986
1014
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
987
- className: (0, clsx.clsx)("navbar-items", className),
1015
+ className: cn("navbar-items", className),
988
1016
  ...rest
989
1017
  });
990
1018
  }
991
1019
  function NavbarItem({ active, icon, className, children, ...rest }) {
992
1020
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
993
- className: (0, clsx.clsx)("navbar-item", className),
1021
+ className: cn("navbar-item", className),
994
1022
  "aria-current": active ? "page" : void 0,
995
1023
  ...rest,
996
1024
  children: [renderIcon(icon), children]
@@ -1001,14 +1029,14 @@ function NavbarDropdown({ label, className, children, ...rest }) {
1001
1029
  className,
1002
1030
  ...rest,
1003
1031
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Menu.Trigger, {
1004
- className: "navbar-item",
1032
+ className: cn("navbar-item", void 0),
1005
1033
  children: label
1006
1034
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Menu.Popup, { children })]
1007
1035
  });
1008
1036
  }
1009
1037
  function NavbarActions({ className, ...rest }) {
1010
1038
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1011
- className: (0, clsx.clsx)("navbar-actions", className),
1039
+ className: cn("navbar-actions", className),
1012
1040
  ...rest
1013
1041
  });
1014
1042
  }
@@ -1020,7 +1048,7 @@ function NavbarMobileToggle({ label = "Open menu", className, type = "button", .
1020
1048
  "aria-label": label,
1021
1049
  "aria-expanded": open,
1022
1050
  onClick: () => shell?.setMobileDrawerOpen(!open),
1023
- className: (0, clsx.clsx)("navbar-mobile-toggle", className),
1051
+ className: cn("navbar-mobile-toggle", className),
1024
1052
  ...rest
1025
1053
  });
1026
1054
  }
@@ -1121,38 +1149,44 @@ var Tooltip = Object.assign(TooltipShorthand, {
1121
1149
  //#region src/Table.tsx
1122
1150
  function TableRoot({ striped, bordered, relaxed, sticky, className, ...rest }) {
1123
1151
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("table", {
1124
- className: (0, clsx.clsx)("table", striped && "table-striped", bordered && "table-bordered", relaxed && "table-relaxed", sticky && "table-sticky", className),
1152
+ className: cn([
1153
+ "table",
1154
+ striped && "table-striped",
1155
+ bordered && "table-bordered",
1156
+ relaxed && "table-relaxed",
1157
+ sticky && "table-sticky"
1158
+ ], className),
1125
1159
  ...rest
1126
1160
  });
1127
1161
  }
1128
1162
  function TableHead({ className, ...rest }) {
1129
1163
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", {
1130
- className: (0, clsx.clsx)(className),
1164
+ className,
1131
1165
  ...rest
1132
1166
  });
1133
1167
  }
1134
1168
  function TableBody({ className, ...rest }) {
1135
1169
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", {
1136
- className: (0, clsx.clsx)(className),
1170
+ className,
1137
1171
  ...rest
1138
1172
  });
1139
1173
  }
1140
1174
  function TableFoot({ className, ...rest }) {
1141
1175
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tfoot", {
1142
- className: (0, clsx.clsx)(className),
1176
+ className,
1143
1177
  ...rest
1144
1178
  });
1145
1179
  }
1146
1180
  function TableRow({ selected, asLink, className, ...rest }) {
1147
1181
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", {
1148
- className: (0, clsx.clsx)(asLink && "table-row-link", className),
1182
+ className: cn(asLink && "table-row-link", className),
1149
1183
  "data-selected": selected || void 0,
1150
1184
  ...rest
1151
1185
  });
1152
1186
  }
1153
1187
  function TableHeaderCell({ align, gutter, className, scope, ...rest }) {
1154
1188
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1155
- className: (0, clsx.clsx)("table-header-cell", gutter && "table-cell-gutter", className),
1189
+ className: cn(["table-header-cell", gutter && "table-cell-gutter"], className),
1156
1190
  "data-align": align && align !== "left" ? align : void 0,
1157
1191
  scope: scope ?? "col",
1158
1192
  ...rest
@@ -1160,7 +1194,11 @@ function TableHeaderCell({ align, gutter, className, scope, ...rest }) {
1160
1194
  }
1161
1195
  function TableCell({ align, gutter, numeric, className, ...rest }) {
1162
1196
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1163
- className: (0, clsx.clsx)("table-cell", gutter && "table-cell-gutter", numeric && "table-cell-numeric", className),
1197
+ className: cn([
1198
+ "table-cell",
1199
+ gutter && "table-cell-gutter",
1200
+ numeric && "table-cell-numeric"
1201
+ ], className),
1164
1202
  "data-align": align && align !== "left" ? align : void 0,
1165
1203
  ...rest
1166
1204
  });
@@ -1186,14 +1224,14 @@ function SidebarRoot({ collapsed, defaultCollapsed, onCollapsedChange, drawerLab
1186
1224
  onCollapsedChange
1187
1225
  },
1188
1226
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("aside", {
1189
- className: (0, clsx.clsx)("sidebar", className),
1227
+ className: cn("sidebar", className),
1190
1228
  ...rest,
1191
1229
  children: drawerOpen ? null : children
1192
1230
  }), shell ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Root, {
1193
1231
  open: drawerOpen,
1194
1232
  onOpenChange: (open) => shell.setMobileDrawerOpen(open),
1195
- 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: "sidebar-drawer-backdrop" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_base_ui_react_dialog.Dialog.Popup, {
1196
- className: "sidebar-drawer",
1233
+ 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, {
1234
+ className: cn("sidebar-drawer", void 0),
1197
1235
  "aria-label": drawerLabel,
1198
1236
  onClick: (event) => {
1199
1237
  if (event.target.closest("a, [data-drawer-close]")) shell.setMobileDrawerOpen(false);
@@ -1205,31 +1243,31 @@ function SidebarRoot({ collapsed, defaultCollapsed, onCollapsedChange, drawerLab
1205
1243
  }
1206
1244
  function SidebarHeader({ className, ...rest }) {
1207
1245
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1208
- className: (0, clsx.clsx)("sidebar-header", className),
1246
+ className: cn("sidebar-header", className),
1209
1247
  ...rest
1210
1248
  });
1211
1249
  }
1212
1250
  function SidebarNav({ className, ...rest }) {
1213
1251
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
1214
- className: (0, clsx.clsx)("sidebar-nav", className),
1252
+ className: cn("sidebar-nav", className),
1215
1253
  ...rest
1216
1254
  });
1217
1255
  }
1218
1256
  function SidebarGroup({ className, ...rest }) {
1219
1257
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1220
- className: (0, clsx.clsx)("sidebar-group", className),
1258
+ className: cn("sidebar-group", className),
1221
1259
  ...rest
1222
1260
  });
1223
1261
  }
1224
1262
  function SidebarGroupLabel({ className, ...rest }) {
1225
1263
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1226
- className: (0, clsx.clsx)("sidebar-group-label", className),
1264
+ className: cn("sidebar-group-label", className),
1227
1265
  ...rest
1228
1266
  });
1229
1267
  }
1230
1268
  function SidebarItem({ active, icon, badge, className, children, ...rest }) {
1231
1269
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1232
- className: (0, clsx.clsx)("sidebar-item", className),
1270
+ className: cn("sidebar-item", className),
1233
1271
  "aria-current": active ? "page" : void 0,
1234
1272
  ...rest,
1235
1273
  children: [
@@ -1242,19 +1280,19 @@ function SidebarItem({ active, icon, badge, className, children, ...rest }) {
1242
1280
  function SidebarIcon({ className, ...rest }) {
1243
1281
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1244
1282
  "aria-hidden": true,
1245
- className: (0, clsx.clsx)("sidebar-icon", className),
1283
+ className: cn("sidebar-icon", className),
1246
1284
  ...rest
1247
1285
  });
1248
1286
  }
1249
1287
  function SidebarLabel({ className, ...rest }) {
1250
1288
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1251
- className: (0, clsx.clsx)("sidebar-label", className),
1289
+ className: cn("sidebar-label", className),
1252
1290
  ...rest
1253
1291
  });
1254
1292
  }
1255
1293
  function SidebarBadge({ className, ...rest }) {
1256
1294
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1257
- className: (0, clsx.clsx)("sidebar-badge", className),
1295
+ className: cn("sidebar-badge", className),
1258
1296
  ...rest
1259
1297
  });
1260
1298
  }
@@ -1264,7 +1302,7 @@ function SidebarCollapsible({ icon, label, trigger, children, className, open, d
1264
1302
  const isOpen = isControlled ? open : internalOpen;
1265
1303
  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] });
1266
1304
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
1267
- className: (0, clsx.clsx)("sidebar-collapsible", className),
1305
+ className: cn("sidebar-collapsible", className),
1268
1306
  open: isOpen,
1269
1307
  onToggle: (event) => {
1270
1308
  const next = event.currentTarget.open;
@@ -1273,17 +1311,17 @@ function SidebarCollapsible({ icon, label, trigger, children, className, open, d
1273
1311
  },
1274
1312
  ...rest,
1275
1313
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {
1276
- className: "sidebar-collapsible-trigger",
1314
+ className: cn("sidebar-collapsible-trigger", void 0),
1277
1315
  children: triggerContent
1278
1316
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1279
- className: "sidebar-collapsible-panel",
1317
+ className: cn("sidebar-collapsible-panel", void 0),
1280
1318
  children
1281
1319
  })]
1282
1320
  });
1283
1321
  }
1284
1322
  function SidebarSubItem({ active, icon, badge, className, children, ...rest }) {
1285
1323
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1286
- className: (0, clsx.clsx)("sidebar-subitem", className),
1324
+ className: cn("sidebar-subitem", className),
1287
1325
  "aria-current": active ? "page" : void 0,
1288
1326
  ...rest,
1289
1327
  children: [
@@ -1295,7 +1333,7 @@ function SidebarSubItem({ active, icon, badge, className, children, ...rest }) {
1295
1333
  }
1296
1334
  function SidebarFooter({ className, ...rest }) {
1297
1335
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1298
- className: (0, clsx.clsx)("sidebar-footer", className),
1336
+ className: cn("sidebar-footer", className),
1299
1337
  ...rest
1300
1338
  });
1301
1339
  }
@@ -1304,18 +1342,18 @@ function SidebarCollapseToggle({ label = "Toggle sidebar", className, children,
1304
1342
  const controlledChecked = ctx?.collapsed;
1305
1343
  const isControlled = controlledChecked !== void 0;
1306
1344
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1307
- className: (0, clsx.clsx)("sidebar-collapse-toggle", className),
1345
+ className: cn("sidebar-collapse-toggle", className),
1308
1346
  ...rest,
1309
1347
  children: [
1310
1348
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1311
1349
  type: "checkbox",
1312
- className: "sidebar-toggle",
1350
+ className: cn("sidebar-toggle", void 0),
1313
1351
  "aria-label": label,
1314
1352
  ...isControlled ? { checked: controlledChecked } : { defaultChecked: ctx?.defaultCollapsed },
1315
1353
  onChange: (event) => ctx?.onCollapsedChange?.(event.currentTarget.checked)
1316
1354
  }),
1317
1355
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1318
- className: "sr-only",
1356
+ className: cn("sr-only", void 0),
1319
1357
  children: label
1320
1358
  }),
1321
1359
  children