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