@nocoo/basalt 2.0.0-rc.1

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 (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -0
  3. package/dist/charts/area.d.ts +8 -0
  4. package/dist/charts/area.js +55 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +9 -0
  7. package/dist/charts/bar.js +42 -0
  8. package/dist/charts/bar.js.map +1 -0
  9. package/dist/charts/bullet.d.ts +8 -0
  10. package/dist/charts/bullet.js +50 -0
  11. package/dist/charts/bullet.js.map +1 -0
  12. package/dist/charts/chart-colors.d.ts +1 -0
  13. package/dist/charts/chart-colors.js +3 -0
  14. package/dist/charts/charts.d.ts +6 -0
  15. package/dist/charts/charts.js +15 -0
  16. package/dist/charts/charts.js.map +1 -0
  17. package/dist/charts/config.d.ts +117 -0
  18. package/dist/charts/config.js +117 -0
  19. package/dist/charts/config.js.map +1 -0
  20. package/dist/charts/custom-chart.d.ts +6 -0
  21. package/dist/charts/custom-chart.js +15 -0
  22. package/dist/charts/custom-chart.js.map +1 -0
  23. package/dist/charts/date-navigation.d.ts +22 -0
  24. package/dist/charts/date-navigation.js +122 -0
  25. package/dist/charts/date-navigation.js.map +1 -0
  26. package/dist/charts/donut.d.ts +8 -0
  27. package/dist/charts/donut.js +36 -0
  28. package/dist/charts/donut.js.map +1 -0
  29. package/dist/charts/frame.d.ts +9 -0
  30. package/dist/charts/frame.js +22 -0
  31. package/dist/charts/frame.js.map +1 -0
  32. package/dist/charts/funnel.d.ts +7 -0
  33. package/dist/charts/funnel.js +35 -0
  34. package/dist/charts/funnel.js.map +1 -0
  35. package/dist/charts/gauge.d.ts +8 -0
  36. package/dist/charts/gauge.js +46 -0
  37. package/dist/charts/gauge.js.map +1 -0
  38. package/dist/charts/grouped-bar.d.ts +7 -0
  39. package/dist/charts/grouped-bar.js +42 -0
  40. package/dist/charts/grouped-bar.js.map +1 -0
  41. package/dist/charts/heatmap-calendar.d.ts +27 -0
  42. package/dist/charts/heatmap-calendar.js +200 -0
  43. package/dist/charts/heatmap-calendar.js.map +1 -0
  44. package/dist/charts/item-list.d.ts +9 -0
  45. package/dist/charts/item-list.js +22 -0
  46. package/dist/charts/item-list.js.map +1 -0
  47. package/dist/charts/line.d.ts +9 -0
  48. package/dist/charts/line.js +58 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/palette.d.ts +33 -0
  51. package/dist/charts/palette.js +44 -0
  52. package/dist/charts/palette.js.map +1 -0
  53. package/dist/charts/radar.d.ts +6 -0
  54. package/dist/charts/radar.js +37 -0
  55. package/dist/charts/radar.js.map +1 -0
  56. package/dist/charts/sample.d.ts +42 -0
  57. package/dist/charts/sample.js +124 -0
  58. package/dist/charts/sample.js.map +1 -0
  59. package/dist/charts/sankey.d.ts +6 -0
  60. package/dist/charts/sankey.js +51 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/slot-bar.d.ts +15 -0
  63. package/dist/charts/slot-bar.js +80 -0
  64. package/dist/charts/slot-bar.js.map +1 -0
  65. package/dist/charts/sparkline.d.ts +6 -0
  66. package/dist/charts/sparkline.js +29 -0
  67. package/dist/charts/sparkline.js.map +1 -0
  68. package/dist/charts/stacked-bar.d.ts +7 -0
  69. package/dist/charts/stacked-bar.js +51 -0
  70. package/dist/charts/stacked-bar.js.map +1 -0
  71. package/dist/charts/stat-card.d.ts +21 -0
  72. package/dist/charts/stat-card.js +66 -0
  73. package/dist/charts/stat-card.js.map +1 -0
  74. package/dist/charts/timeline.d.ts +17 -0
  75. package/dist/charts/timeline.js +79 -0
  76. package/dist/charts/timeline.js.map +1 -0
  77. package/dist/charts/timeseries.d.ts +6 -0
  78. package/dist/charts/timeseries.js +15 -0
  79. package/dist/charts/timeseries.js.map +1 -0
  80. package/dist/components/accordion.d.ts +6 -0
  81. package/dist/components/accordion.js +21 -0
  82. package/dist/components/accordion.js.map +1 -0
  83. package/dist/components/alert-dialog.d.ts +25 -0
  84. package/dist/components/alert-dialog.js +61 -0
  85. package/dist/components/alert-dialog.js.map +1 -0
  86. package/dist/components/app-header.d.ts +10 -0
  87. package/dist/components/app-header.js +35 -0
  88. package/dist/components/app-header.js.map +1 -0
  89. package/dist/components/app-shell.d.ts +4 -0
  90. package/dist/components/app-shell.js +29 -0
  91. package/dist/components/app-shell.js.map +1 -0
  92. package/dist/components/autocomplete.d.ts +47 -0
  93. package/dist/components/autocomplete.js +28 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/avatar.d.ts +5 -0
  96. package/dist/components/avatar.js +28 -0
  97. package/dist/components/avatar.js.map +1 -0
  98. package/dist/components/badge.d.ts +10 -0
  99. package/dist/components/badge.js +37 -0
  100. package/dist/components/badge.js.map +1 -0
  101. package/dist/components/banner.d.ts +22 -0
  102. package/dist/components/banner.js +88 -0
  103. package/dist/components/banner.js.map +1 -0
  104. package/dist/components/basalt-mark.d.ts +8 -0
  105. package/dist/components/basalt-mark.js +17 -0
  106. package/dist/components/basalt-mark.js.map +1 -0
  107. package/dist/components/breadcrumbs.d.ts +9 -0
  108. package/dist/components/breadcrumbs.js +38 -0
  109. package/dist/components/breadcrumbs.js.map +1 -0
  110. package/dist/components/button.d.ts +17 -0
  111. package/dist/components/button.js +73 -0
  112. package/dist/components/button.js.map +1 -0
  113. package/dist/components/checkbox.d.ts +86 -0
  114. package/dist/components/checkbox.js +107 -0
  115. package/dist/components/checkbox.js.map +1 -0
  116. package/dist/components/clipboard-text.d.ts +5 -0
  117. package/dist/components/clipboard-text.js +33 -0
  118. package/dist/components/clipboard-text.js.map +1 -0
  119. package/dist/components/code.d.ts +26 -0
  120. package/dist/components/code.js +45 -0
  121. package/dist/components/code.js.map +1 -0
  122. package/dist/components/collapsible.d.ts +33 -0
  123. package/dist/components/collapsible.js +38 -0
  124. package/dist/components/collapsible.js.map +1 -0
  125. package/dist/components/combobox.d.ts +47 -0
  126. package/dist/components/combobox.js +28 -0
  127. package/dist/components/combobox.js.map +1 -0
  128. package/dist/components/command-palette.d.ts +83 -0
  129. package/dist/components/command-palette.js +90 -0
  130. package/dist/components/command-palette.js.map +1 -0
  131. package/dist/components/confirm-dialog.d.ts +52 -0
  132. package/dist/components/confirm-dialog.js +61 -0
  133. package/dist/components/confirm-dialog.js.map +1 -0
  134. package/dist/components/context-menu.d.ts +7 -0
  135. package/dist/components/context-menu.js +23 -0
  136. package/dist/components/context-menu.js.map +1 -0
  137. package/dist/components/data-table.d.ts +76 -0
  138. package/dist/components/data-table.js +230 -0
  139. package/dist/components/data-table.js.map +1 -0
  140. package/dist/components/date-picker.d.ts +90 -0
  141. package/dist/components/date-picker.js +452 -0
  142. package/dist/components/date-picker.js.map +1 -0
  143. package/dist/components/dialog.d.ts +37 -0
  144. package/dist/components/dialog.js +67 -0
  145. package/dist/components/dialog.js.map +1 -0
  146. package/dist/components/dropdown-menu.d.ts +38 -0
  147. package/dist/components/dropdown-menu.js +24 -0
  148. package/dist/components/dropdown-menu.js.map +1 -0
  149. package/dist/components/empty.d.ts +6 -0
  150. package/dist/components/empty.js +28 -0
  151. package/dist/components/empty.js.map +1 -0
  152. package/dist/components/field.d.ts +39 -0
  153. package/dist/components/field.js +52 -0
  154. package/dist/components/field.js.map +1 -0
  155. package/dist/components/flow.d.ts +24 -0
  156. package/dist/components/flow.js +56 -0
  157. package/dist/components/flow.js.map +1 -0
  158. package/dist/components/grid.d.ts +15 -0
  159. package/dist/components/grid.js +24 -0
  160. package/dist/components/grid.js.map +1 -0
  161. package/dist/components/hover-card.d.ts +5 -0
  162. package/dist/components/hover-card.js +18 -0
  163. package/dist/components/hover-card.js.map +1 -0
  164. package/dist/components/input-area.d.ts +19 -0
  165. package/dist/components/input-area.js +27 -0
  166. package/dist/components/input-area.js.map +1 -0
  167. package/dist/components/input-group.d.ts +70 -0
  168. package/dist/components/input-group.js +78 -0
  169. package/dist/components/input-group.js.map +1 -0
  170. package/dist/components/input.d.ts +19 -0
  171. package/dist/components/input.js +28 -0
  172. package/dist/components/input.js.map +1 -0
  173. package/dist/components/label.d.ts +20 -0
  174. package/dist/components/label.js +34 -0
  175. package/dist/components/label.js.map +1 -0
  176. package/dist/components/layer-card.d.ts +69 -0
  177. package/dist/components/layer-card.js +104 -0
  178. package/dist/components/layer-card.js.map +1 -0
  179. package/dist/components/link.d.ts +8 -0
  180. package/dist/components/link.js +18 -0
  181. package/dist/components/link.js.map +1 -0
  182. package/dist/components/loader.d.ts +4 -0
  183. package/dist/components/loader.js +66 -0
  184. package/dist/components/loader.js.map +1 -0
  185. package/dist/components/loading-screen.d.ts +5 -0
  186. package/dist/components/loading-screen.js +24 -0
  187. package/dist/components/loading-screen.js.map +1 -0
  188. package/dist/components/menu-bar.d.ts +8 -0
  189. package/dist/components/menu-bar.js +42 -0
  190. package/dist/components/menu-bar.js.map +1 -0
  191. package/dist/components/meter.d.ts +8 -0
  192. package/dist/components/meter.js +26 -0
  193. package/dist/components/meter.js.map +1 -0
  194. package/dist/components/navigation-menu.d.ts +6 -0
  195. package/dist/components/navigation-menu.js +16 -0
  196. package/dist/components/navigation-menu.js.map +1 -0
  197. package/dist/components/overlay.d.ts +16 -0
  198. package/dist/components/overlay.js +14 -0
  199. package/dist/components/overlay.js.map +1 -0
  200. package/dist/components/page-header.d.ts +19 -0
  201. package/dist/components/page-header.js +43 -0
  202. package/dist/components/page-header.js.map +1 -0
  203. package/dist/components/pagination.d.ts +35 -0
  204. package/dist/components/pagination.js +68 -0
  205. package/dist/components/pagination.js.map +1 -0
  206. package/dist/components/popover.d.ts +38 -0
  207. package/dist/components/popover.js +65 -0
  208. package/dist/components/popover.js.map +1 -0
  209. package/dist/components/radio.d.ts +108 -0
  210. package/dist/components/radio.js +80 -0
  211. package/dist/components/radio.js.map +1 -0
  212. package/dist/components/scroll-area.d.ts +15 -0
  213. package/dist/components/scroll-area.js +49 -0
  214. package/dist/components/scroll-area.js.map +1 -0
  215. package/dist/components/segment-control.d.ts +35 -0
  216. package/dist/components/segment-control.js +46 -0
  217. package/dist/components/segment-control.js.map +1 -0
  218. package/dist/components/select.d.ts +99 -0
  219. package/dist/components/select.js +51 -0
  220. package/dist/components/select.js.map +1 -0
  221. package/dist/components/sensitive-input.d.ts +23 -0
  222. package/dist/components/sensitive-input.js +43 -0
  223. package/dist/components/sensitive-input.js.map +1 -0
  224. package/dist/components/separator.d.ts +26 -0
  225. package/dist/components/separator.js +18 -0
  226. package/dist/components/separator.js.map +1 -0
  227. package/dist/components/sheet.d.ts +26 -0
  228. package/dist/components/sheet.js +49 -0
  229. package/dist/components/sheet.js.map +1 -0
  230. package/dist/components/sidebar.d.ts +101 -0
  231. package/dist/components/sidebar.js +260 -0
  232. package/dist/components/sidebar.js.map +1 -0
  233. package/dist/components/skeleton-line.d.ts +6 -0
  234. package/dist/components/skeleton-line.js +22 -0
  235. package/dist/components/skeleton-line.js.map +1 -0
  236. package/dist/components/slider.d.ts +3 -0
  237. package/dist/components/slider.js +21 -0
  238. package/dist/components/slider.js.map +1 -0
  239. package/dist/components/stat-strip.d.ts +19 -0
  240. package/dist/components/stat-strip.js +27 -0
  241. package/dist/components/stat-strip.js.map +1 -0
  242. package/dist/components/switch.d.ts +85 -0
  243. package/dist/components/switch.js +94 -0
  244. package/dist/components/switch.js.map +1 -0
  245. package/dist/components/table-of-contents.d.ts +33 -0
  246. package/dist/components/table-of-contents.js +37 -0
  247. package/dist/components/table-of-contents.js.map +1 -0
  248. package/dist/components/table-pager.d.ts +26 -0
  249. package/dist/components/table-pager.js +35 -0
  250. package/dist/components/table-pager.js.map +1 -0
  251. package/dist/components/table.d.ts +45 -0
  252. package/dist/components/table.js +32 -0
  253. package/dist/components/table.js.map +1 -0
  254. package/dist/components/tabs.d.ts +65 -0
  255. package/dist/components/tabs.js +56 -0
  256. package/dist/components/tabs.js.map +1 -0
  257. package/dist/components/text.d.ts +32 -0
  258. package/dist/components/text.js +46 -0
  259. package/dist/components/text.js.map +1 -0
  260. package/dist/components/theme-toggle.d.ts +7 -0
  261. package/dist/components/theme-toggle.js +28 -0
  262. package/dist/components/theme-toggle.js.map +1 -0
  263. package/dist/components/toast.d.ts +27 -0
  264. package/dist/components/toast.js +78 -0
  265. package/dist/components/toast.js.map +1 -0
  266. package/dist/components/toggle-group.d.ts +4 -0
  267. package/dist/components/toggle-group.js +48 -0
  268. package/dist/components/toggle-group.js.map +1 -0
  269. package/dist/components/toggle.d.ts +7 -0
  270. package/dist/components/toggle.js +37 -0
  271. package/dist/components/toggle.js.map +1 -0
  272. package/dist/components/toolbar.d.ts +58 -0
  273. package/dist/components/toolbar.js +76 -0
  274. package/dist/components/toolbar.js.map +1 -0
  275. package/dist/components/tooltip.d.ts +13 -0
  276. package/dist/components/tooltip.js +18 -0
  277. package/dist/components/tooltip.js.map +1 -0
  278. package/dist/components/typeahead-field.d.ts +24 -0
  279. package/dist/components/typeahead-field.js +177 -0
  280. package/dist/components/typeahead-field.js.map +1 -0
  281. package/dist/index.d.ts +33 -0
  282. package/dist/index.js +35 -0
  283. package/dist/providers/link.d.ts +12 -0
  284. package/dist/providers/link.js +18 -0
  285. package/dist/providers/link.js.map +1 -0
  286. package/dist/providers/theme.d.ts +11 -0
  287. package/dist/providers/theme.js +43 -0
  288. package/dist/providers/theme.js.map +1 -0
  289. package/dist/styles/standalone.css +2233 -0
  290. package/dist/styles/tailwind.css +103 -0
  291. package/dist/styles/tokens.css +277 -0
  292. package/dist/utils/cn.d.ts +2 -0
  293. package/dist/utils/cn.js +11 -0
  294. package/dist/utils/cn.js.map +1 -0
  295. package/dist/utils/control-surface.d.ts +2 -0
  296. package/dist/utils/control-surface.js +11 -0
  297. package/dist/utils/control-surface.js.map +1 -0
  298. package/dist/utils/selection-indicator.d.ts +24 -0
  299. package/dist/utils/selection-indicator.js +108 -0
  300. package/dist/utils/selection-indicator.js.map +1 -0
  301. package/package.json +107 -0
@@ -0,0 +1,52 @@
1
+ import * as React from "react";
2
+ export type ConfirmDialogVariant = "default" | "destructive";
3
+ export interface ConfirmDialogProps {
4
+ /** Whether the confirmation dialog is shown. */
5
+ open: boolean;
6
+ /** Called when the dialog requests to open or close. */
7
+ onOpenChange: (open: boolean) => void;
8
+ /** Called once when the user confirms. The dialog does not close itself. */
9
+ onConfirm: () => void | Promise<void>;
10
+ /** The dialog title. */
11
+ title: React.ReactNode;
12
+ /** Supporting copy that describes the action. */
13
+ description: React.ReactNode;
14
+ /**
15
+ * Label for the confirm button.
16
+ * @default "Confirm"
17
+ */
18
+ confirmLabel?: React.ReactNode;
19
+ /**
20
+ * Label for the cancel button.
21
+ * @default "Cancel"
22
+ */
23
+ cancelLabel?: React.ReactNode;
24
+ /**
25
+ * Appearance of the confirm button.
26
+ * @default "default"
27
+ */
28
+ variant?: ConfirmDialogVariant;
29
+ /**
30
+ * Disable both actions and ignore close requests while work is pending.
31
+ * @default false
32
+ */
33
+ loading?: boolean;
34
+ }
35
+ export interface UseConfirmOptions {
36
+ /** The dialog title. */
37
+ title: React.ReactNode;
38
+ /** Supporting copy that describes the action. */
39
+ description: React.ReactNode;
40
+ /** Label for the confirm button. */
41
+ confirmLabel?: React.ReactNode;
42
+ /** Label for the cancel button. */
43
+ cancelLabel?: React.ReactNode;
44
+ /** Appearance of the confirm button. */
45
+ variant?: ConfirmDialogVariant;
46
+ }
47
+ export interface UseConfirmResult {
48
+ confirm: (options: UseConfirmOptions) => Promise<boolean>;
49
+ dialogProps: ConfirmDialogProps;
50
+ }
51
+ export declare function ConfirmDialog({ cancelLabel, confirmLabel, description, loading, onConfirm, onOpenChange, open, title, variant, }: ConfirmDialogProps): React.JSX.Element;
52
+ export declare function useConfirm(): UseConfirmResult;
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { Button as e } from "./button.js";
3
+ import { AlertDialog as t, AlertDialogContent as n, AlertDialogDescription as r, AlertDialogFooter as i, AlertDialogHeader as a, AlertDialogTitle as o } from "./alert-dialog.js";
4
+ import * as s from "react";
5
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ //#region src/components/confirm-dialog.tsx
7
+ function u({ cancelLabel: s = "Cancel", confirmLabel: u = "Confirm", description: d, loading: f = !1, onConfirm: p, onOpenChange: m, open: h, title: g, variant: _ = "default" }) {
8
+ return /* @__PURE__ */ c(t, {
9
+ open: h,
10
+ onOpenChange: (e) => {
11
+ f && !e || m(e);
12
+ },
13
+ children: /* @__PURE__ */ l(n, { children: [/* @__PURE__ */ l(a, { children: [/* @__PURE__ */ c(o, { children: g }), /* @__PURE__ */ c(r, { children: d })] }), /* @__PURE__ */ l(i, { children: [/* @__PURE__ */ c(e, {
14
+ disabled: f,
15
+ variant: "outline",
16
+ onClick: () => m(!1),
17
+ children: s
18
+ }), /* @__PURE__ */ c(e, {
19
+ loading: f,
20
+ variant: _,
21
+ onClick: () => {
22
+ f || p();
23
+ },
24
+ children: u
25
+ })] })] })
26
+ });
27
+ }
28
+ function d() {
29
+ let [e, t] = s.useState(!1), [n, r] = s.useState({
30
+ title: "",
31
+ description: ""
32
+ }), i = s.useRef(null), a = s.useCallback((e) => {
33
+ let t = i.current;
34
+ i.current = null, t?.(e);
35
+ }, []);
36
+ return s.useEffect(() => () => {
37
+ a(!1);
38
+ }, [a]), {
39
+ confirm: s.useCallback((e) => (a(!1), r(e), t(!0), new Promise((e) => {
40
+ i.current = e;
41
+ })), [a]),
42
+ dialogProps: {
43
+ open: e,
44
+ title: n.title,
45
+ description: n.description,
46
+ confirmLabel: n.confirmLabel,
47
+ cancelLabel: n.cancelLabel,
48
+ variant: n.variant,
49
+ onOpenChange: (e) => {
50
+ t(e), e || a(!1);
51
+ },
52
+ onConfirm: () => {
53
+ a(!0), t(!1);
54
+ }
55
+ }
56
+ };
57
+ }
58
+ //#endregion
59
+ export { u as ConfirmDialog, d as useConfirm };
60
+
61
+ //# sourceMappingURL=confirm-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-dialog.js","names":[],"sources":["../../src/components/confirm-dialog.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n\tAlertDialog,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"./alert-dialog\";\nimport { Button } from \"./button\";\n\nexport type ConfirmDialogVariant = \"default\" | \"destructive\";\n\nexport interface ConfirmDialogProps {\n\t/** Whether the confirmation dialog is shown. */\n\topen: boolean;\n\t/** Called when the dialog requests to open or close. */\n\tonOpenChange: (open: boolean) => void;\n\t/** Called once when the user confirms. The dialog does not close itself. */\n\tonConfirm: () => void | Promise<void>;\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/**\n\t * Label for the confirm button.\n\t * @default \"Confirm\"\n\t */\n\tconfirmLabel?: React.ReactNode;\n\t/**\n\t * Label for the cancel button.\n\t * @default \"Cancel\"\n\t */\n\tcancelLabel?: React.ReactNode;\n\t/**\n\t * Appearance of the confirm button.\n\t * @default \"default\"\n\t */\n\tvariant?: ConfirmDialogVariant;\n\t/**\n\t * Disable both actions and ignore close requests while work is pending.\n\t * @default false\n\t */\n\tloading?: boolean;\n}\n\nexport interface UseConfirmOptions {\n\t/** The dialog title. */\n\ttitle: React.ReactNode;\n\t/** Supporting copy that describes the action. */\n\tdescription: React.ReactNode;\n\t/** Label for the confirm button. */\n\tconfirmLabel?: React.ReactNode;\n\t/** Label for the cancel button. */\n\tcancelLabel?: React.ReactNode;\n\t/** Appearance of the confirm button. */\n\tvariant?: ConfirmDialogVariant;\n}\n\nexport interface UseConfirmResult {\n\tconfirm: (options: UseConfirmOptions) => Promise<boolean>;\n\tdialogProps: ConfirmDialogProps;\n}\n\nexport function ConfirmDialog({\n\tcancelLabel = \"Cancel\",\n\tconfirmLabel = \"Confirm\",\n\tdescription,\n\tloading = false,\n\tonConfirm,\n\tonOpenChange,\n\topen,\n\ttitle,\n\tvariant = \"default\",\n}: ConfirmDialogProps) {\n\treturn (\n\t\t<AlertDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={(next) => {\n\t\t\t\tif (loading && !next) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonOpenChange(next);\n\t\t\t}}\n\t\t>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>{title}</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>{description}</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<Button disabled={loading} variant=\"outline\" onClick={() => onOpenChange(false)}>\n\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\tvariant={variant}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (!loading) {\n\t\t\t\t\t\t\t\tvoid onConfirm();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{confirmLabel}\n\t\t\t\t\t</Button>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n}\n\nexport function useConfirm(): UseConfirmResult {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [options, setOptions] = React.useState<UseConfirmOptions>({\n\t\ttitle: \"\",\n\t\tdescription: \"\",\n\t});\n\tconst resolverRef = React.useRef<((value: boolean) => void) | null>(null);\n\n\tconst settle = React.useCallback((value: boolean) => {\n\t\tconst resolve = resolverRef.current;\n\t\tresolverRef.current = null;\n\t\tresolve?.(value);\n\t}, []);\n\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tsettle(false);\n\t\t};\n\t}, [settle]);\n\n\tconst confirm = React.useCallback(\n\t\t(next: UseConfirmOptions) => {\n\t\t\tsettle(false);\n\t\t\tsetOptions(next);\n\t\t\tsetOpen(true);\n\t\t\treturn new Promise<boolean>((resolve) => {\n\t\t\t\tresolverRef.current = resolve;\n\t\t\t});\n\t\t},\n\t\t[settle],\n\t);\n\n\treturn {\n\t\tconfirm,\n\t\tdialogProps: {\n\t\t\topen,\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tconfirmLabel: options.confirmLabel,\n\t\t\tcancelLabel: options.cancelLabel,\n\t\t\tvariant: options.variant,\n\t\t\tonOpenChange: (next) => {\n\t\t\t\tsetOpen(next);\n\t\t\t\tif (!next) {\n\t\t\t\t\tsettle(false);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonConfirm: () => {\n\t\t\t\tsettle(true);\n\t\t\t\tsetOpen(false);\n\t\t\t},\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;AAgEA,SAAgB,EAAc,EAC7B,iBAAc,UACd,kBAAe,WACf,gBACA,aAAU,IACV,cACA,iBACA,SACA,UACA,aAAU,aACY;CACtB,OACC,kBAAC,GAAD;EACO;EACN,eAAe,MAAS;GACnB,KAAW,CAAC,KAGhB,EAAa,CAAI;EAClB;EAEA,UAAA,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD,EAAA,UAAmB,EAAwB,CAAA,GAC3C,kBAAC,GAAD,EAAA,UAAyB,EAAoC,CAAA,CAC3C,EAAA,CAAA,GACnB,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,GAAD;GAAQ,UAAU;GAAS,SAAQ;GAAU,eAAe,EAAa,EAAK;GAC5E,UAAA;EACM,CAAA,GACR,kBAAC,GAAD;GACU;GACA;GACT,eAAe;IACd,AAAK,KACJ,EAAe;GAEjB;GAEC,UAAA;EACM,CAAA,CACU,EAAA,CAAA,CACA,EAAA,CAAA;CACR,CAAA;AAEf;AAEA,SAAgB,IAA+B;CAC9C,IAAM,CAAC,GAAM,KAAW,EAAM,SAAS,EAAK,GACtC,CAAC,GAAS,KAAc,EAAM,SAA4B;EAC/D,OAAO;EACP,aAAa;CACd,CAAC,GACK,IAAc,EAAM,OAA0C,IAAI,GAElE,IAAS,EAAM,aAAa,MAAmB;EACpD,IAAM,IAAU,EAAY;EAE5B,AADA,EAAY,UAAU,MACtB,IAAU,CAAK;CAChB,GAAG,CAAC,CAAC;CAoBL,OAlBA,EAAM,sBACQ;EACZ,EAAO,EAAK;CACb,GACE,CAAC,CAAM,CAAC,GAcJ;EACN,SAbe,EAAM,aACpB,OACA,EAAO,EAAK,GACZ,EAAW,CAAI,GACf,EAAQ,EAAI,GACL,IAAI,SAAkB,MAAY;GACxC,EAAY,UAAU;EACvB,CAAC,IAEF,CAAC,CAAM,CAIP;EACA,aAAa;GACZ;GACA,OAAO,EAAQ;GACf,aAAa,EAAQ;GACrB,cAAc,EAAQ;GACtB,aAAa,EAAQ;GACrB,SAAS,EAAQ;GACjB,eAAe,MAAS;IAEvB,AADA,EAAQ,CAAI,GACP,KACJ,EAAO,EAAK;GAEd;GACA,iBAAiB;IAEhB,AADA,EAAO,EAAI,GACX,EAAQ,EAAK;GACd;EACD;CACD;AACD"}
@@ -0,0 +1,7 @@
1
+ import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
2
+ import * as React from "react";
3
+ export declare const ContextMenu: React.FC<ContextMenuPrimitive.ContextMenuProps>;
4
+ export declare const ContextMenuTrigger: React.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuTriggerProps & React.RefAttributes<HTMLSpanElement>>;
5
+ export declare const ContextMenuContent: React.ForwardRefExoticComponent<ContextMenuPrimitive.ContextMenuContentProps & React.RefAttributes<HTMLDivElement>>;
6
+ export declare const ContextMenuItem: React.ForwardRefExoticComponent<Omit<ContextMenuPrimitive.ContextMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export declare function ContextMenuPanel({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Content>): React.JSX.Element;
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { overlayItemClass as t, overlayPanelClass as n } from "./overlay.js";
4
+ import * as r from "react";
5
+ import { jsx as i } from "react/jsx-runtime";
6
+ import * as a from "@radix-ui/react-context-menu";
7
+ //#region src/components/context-menu.tsx
8
+ var o = a.Root, s = a.Trigger, c = a.Content, l = r.forwardRef(({ className: n, ...r }, o) => /* @__PURE__ */ i(a.Item, {
9
+ ref: o,
10
+ className: t(e("relative outline-hidden focus:bg-basalt-accent data-disabled:pointer-events-none data-disabled:opacity-50", n)),
11
+ ...r
12
+ }));
13
+ l.displayName = a.Item.displayName;
14
+ function u({ className: t, ...r }) {
15
+ return /* @__PURE__ */ i(a.Portal, { children: /* @__PURE__ */ i(a.Content, {
16
+ className: n(e("min-w-40", t)),
17
+ ...r
18
+ }) });
19
+ }
20
+ //#endregion
21
+ export { o as ContextMenu, c as ContextMenuContent, l as ContextMenuItem, u as ContextMenuPanel, s as ContextMenuTrigger };
22
+
23
+ //# sourceMappingURL=context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.js","names":[],"sources":["../../src/components/context-menu.tsx"],"sourcesContent":["import * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\";\nimport * as React from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { overlayItemClass, overlayPanelClass } from \"./overlay\";\n\nexport const ContextMenu = ContextMenuPrimitive.Root;\nexport const ContextMenuTrigger = ContextMenuPrimitive.Trigger;\nexport const ContextMenuContent = ContextMenuPrimitive.Content;\n\nexport const ContextMenuItem = React.forwardRef<\n\tReact.ElementRef<typeof ContextMenuPrimitive.Item>,\n\tReact.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item>\n>(({ className, ...props }, ref) => (\n\t<ContextMenuPrimitive.Item\n\t\tref={ref}\n\t\tclassName={overlayItemClass(\n\t\t\tcn(\n\t\t\t\t\"relative outline-hidden focus:bg-basalt-accent data-disabled:pointer-events-none data-disabled:opacity-50\",\n\t\t\t\tclassName,\n\t\t\t),\n\t\t)}\n\t\t{...props}\n\t/>\n));\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;\n\nexport function ContextMenuPanel({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n\treturn (\n\t\t<ContextMenuPrimitive.Portal>\n\t\t\t<ContextMenuPrimitive.Content\n\t\t\t\tclassName={overlayPanelClass(cn(\"min-w-40\", className))}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</ContextMenuPrimitive.Portal>\n\t);\n}\n"],"mappings":";;;;;;;AAKA,IAAa,IAAc,EAAqB,MACnC,IAAqB,EAAqB,SAC1C,IAAqB,EAAqB,SAE1C,IAAkB,EAAM,YAGlC,EAAE,cAAW,GAAG,KAAS,MAC3B,kBAAC,EAAqB,MAAtB;CACM;CACL,WAAW,EACV,EACC,6GACA,CACD,CACD;CACA,GAAI;AACJ,CAAA,CACD;AACD,EAAgB,cAAc,EAAqB,KAAK;AAExD,SAAgB,EAAiB,EAChC,cACA,GAAG,KAC0D;CAC7D,OACC,kBAAC,EAAqB,QAAtB,EAAA,UACC,kBAAC,EAAqB,SAAtB;EACC,WAAW,EAAkB,EAAG,YAAY,CAAS,CAAC;EACtD,GAAI;CACJ,CAAA,EAC2B,CAAA;AAE/B"}
@@ -0,0 +1,76 @@
1
+ import { type ReactNode } from "react";
2
+ export type DataTableColumn<T> = {
3
+ id: string;
4
+ header: string;
5
+ accessor: (row: T) => ReactNode;
6
+ sortValue?: (row: T) => string | number | bigint;
7
+ filterValue?: (row: T) => string | number | bigint;
8
+ };
9
+ export type DataTableProps<T = unknown> = {
10
+ /**
11
+ * Rows to render.
12
+ */
13
+ data: T[];
14
+ /**
15
+ * Column descriptors.
16
+ */
17
+ columns: DataTableColumn<T>[];
18
+ /**
19
+ * Filter query matched against column values.
20
+ * @default ""
21
+ */
22
+ filter?: string;
23
+ /**
24
+ * Replace rows with a loading placeholder.
25
+ * @default false
26
+ */
27
+ loading?: boolean;
28
+ /**
29
+ * Copy shown when no rows remain after filtering.
30
+ * @default "No results"
31
+ */
32
+ empty?: ReactNode;
33
+ /**
34
+ * Controlled selected row ids.
35
+ */
36
+ selected?: string[];
37
+ /**
38
+ * Uncontrolled initial selected row ids.
39
+ */
40
+ defaultSelected?: string[];
41
+ /**
42
+ * Called when selected row ids change.
43
+ */
44
+ onSelectedChange?: (ids: string[]) => void;
45
+ /**
46
+ * Allow more than one selected row.
47
+ * @default false
48
+ */
49
+ multiple?: boolean;
50
+ /**
51
+ * Controlled 1-based page. Used with pageSize.
52
+ */
53
+ page?: number;
54
+ /**
55
+ * Uncontrolled initial page.
56
+ * @default 1
57
+ */
58
+ defaultPage?: number;
59
+ /**
60
+ * Rows per page. Omit to show every row.
61
+ */
62
+ pageSize?: number;
63
+ /**
64
+ * Called when the page changes.
65
+ */
66
+ onPageChange?: (page: number) => void;
67
+ /**
68
+ * Stable id for a row.
69
+ */
70
+ getRowId?: (row: T, index: number) => string;
71
+ /**
72
+ * Additional classes for the table.
73
+ */
74
+ className?: string;
75
+ };
76
+ export declare function DataTable<T>({ data, columns, filter, loading, empty, selected, defaultSelected, onSelectedChange, multiple, page, defaultPage, pageSize, onPageChange, getRowId, className, }: DataTableProps<T>): import("react").JSX.Element;
@@ -0,0 +1,230 @@
1
+ "use client";
2
+ import { cn as e } from "../utils/cn.js";
3
+ import { SkeletonLine as t } from "./skeleton-line.js";
4
+ import { Pagination as n } from "./pagination.js";
5
+ import { Table as r, TableBody as i, TableCell as a, TableHead as o, TableHeader as s, TableRow as c } from "./table.js";
6
+ import { useCallback as l, useLayoutEffect as u, useMemo as d, useRef as f, useState as p } from "react";
7
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
8
+ //#region src/components/data-table.tsx
9
+ function g(e) {
10
+ return typeof e == "bigint" ? e : typeof e == "number" && Number.isFinite(e) && Number.isInteger(e) ? BigInt(e) : null;
11
+ }
12
+ function _(e, t) {
13
+ let n = BigInt(Math.trunc(e));
14
+ return n < t ? -1 : n > t || e > Number(n) ? 1 : -1;
15
+ }
16
+ function v(e) {
17
+ return e === -Infinity ? 0 : typeof e == "bigint" || typeof e == "number" && Number.isFinite(e) ? 1 : e === Infinity ? 2 : typeof e == "number" ? 3 : typeof e == "string" ? 4 : 5;
18
+ }
19
+ function y(e, t) {
20
+ let n = v(e), r = v(t);
21
+ if (n !== r) return n - r;
22
+ if (n === 1) {
23
+ if (typeof e == "bigint" && typeof t == "bigint") return e < t ? -1 : +(e > t);
24
+ let n = g(e), r = g(t);
25
+ return n !== null && r !== null ? n < r ? -1 : +(n > r) : typeof e == "number" && typeof t == "bigint" ? _(e, t) : typeof e == "bigint" && typeof t == "number" ? -_(t, e) : e - t;
26
+ }
27
+ let i = String(e), a = String(t);
28
+ return i < a ? -1 : +(i > a);
29
+ }
30
+ function b(e, t, n, r) {
31
+ if (e === null) return "prim:null";
32
+ if (e === void 0) return "prim:undefined";
33
+ if (typeof e == "symbol") {
34
+ let t = n.get(e);
35
+ return t || (t = `prim:symbol:${r.current++}`, n.set(e, t)), t;
36
+ }
37
+ let i = typeof e;
38
+ return i === "number" ? Object.is(e, -0) ? "prim:number:-0" : `prim:number:${String(e)}` : i === "string" || i === "bigint" || i === "boolean" ? `prim:${i}:${String(e)}` : `prim:${t}`;
39
+ }
40
+ function x(e) {
41
+ return e.startsWith("dup:") || e.startsWith("gen:");
42
+ }
43
+ function ee(e) {
44
+ return e.startsWith("id:") || e.startsWith("get:");
45
+ }
46
+ function S(e) {
47
+ return typeof e == "function" || typeof e == "object" && !!e;
48
+ }
49
+ function te(e, t) {
50
+ if (e.filterValue) return String(e.filterValue(t));
51
+ if (e.sortValue) return String(e.sortValue(t));
52
+ let n = e.accessor(t);
53
+ return typeof n == "string" || typeof n == "number" || typeof n == "bigint" ? String(n) : "";
54
+ }
55
+ function C(e, t, n, r) {
56
+ let i = r?.(e, t);
57
+ return i === void 0 ? S(e) && "id" in e && e.id != null ? String(e.id) : n : i;
58
+ }
59
+ function w({ data: g, columns: _, filter: v = "", loading: w = !1, empty: T = "No results", selected: E, defaultSelected: D, onSelectedChange: O, multiple: ne = !1, page: k, defaultPage: re = 1, pageSize: A, onPageChange: j, getRowId: M, className: N }) {
60
+ let [P, F] = p(null), [ie, ae] = p(D ?? []), [I, oe] = p(re), L = f(/* @__PURE__ */ new WeakMap()), R = f(0), z = f(/* @__PURE__ */ new WeakMap()), B = f(/* @__PURE__ */ new Map()), V = f(/* @__PURE__ */ new Map()), H = f(/* @__PURE__ */ new Map()), U = f(/* @__PURE__ */ new Map()), W = f(/* @__PURE__ */ new Map()), G = v.trim().toLowerCase(), K = d(() => {
61
+ let e = (e) => {
62
+ let t = L.current.get(e);
63
+ return t || (t = `basalt-row-${R.current++}`, L.current.set(e, t)), t;
64
+ }, t = (e, t) => {
65
+ let n = M?.(e, t);
66
+ if (n !== void 0) return `get:${n}`;
67
+ if (S(e) && "id" in e) {
68
+ let t = e.id;
69
+ if (t != null) return `id:${String(t)}`;
70
+ }
71
+ }, n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), c = (e, n, c, l) => {
72
+ if (!l) return;
73
+ let u = a.get(l) ?? [];
74
+ u.push(c), a.set(l, u), o.set(c, l), ee(c) && s.set(c, l);
75
+ let d = t(e, n);
76
+ if (d && (r.set(d, c), x(c))) {
77
+ let e = i.get(d) ?? [];
78
+ e.push(c), i.set(d, e);
79
+ }
80
+ }, l = /* @__PURE__ */ new WeakMap(), u = g.map((e, t) => {
81
+ let n = S(e) ? e : null, r = n ? l.get(n) ?? 0 : 0;
82
+ return n && l.set(n, r + 1), {
83
+ row: e,
84
+ index: t,
85
+ occurrence: r,
86
+ key: void 0
87
+ };
88
+ });
89
+ for (let e of u) {
90
+ let t = S(e.row) ? e.row : null;
91
+ if (!t) continue;
92
+ let r = z.current.get(t)?.[e.occurrence];
93
+ !r || n.has(r) || V.current.get(r) === t && (e.key = r, n.add(r));
94
+ }
95
+ let d = u.map(({ row: r, index: i, occurrence: a, key: o }) => {
96
+ let s = S(r) ? r : null;
97
+ if (o) return c(r, i, o, s), {
98
+ row: r,
99
+ key: o,
100
+ selectId: C(r, i, o, M)
101
+ };
102
+ let l = a > 0, u, d = t(r, i);
103
+ if (d && (u = d), s) {
104
+ let t = e(s);
105
+ if (!u) u = l ? `gen:${t}#${a}` : `gen:${t}`;
106
+ else if (n.has(u) || l) u = (U.current.get(u) ?? []).find((e) => !n.has(e)) ?? (l ? `dup:${t}#${a}` : `dup:${t}`);
107
+ else {
108
+ let e = H.current.get(u);
109
+ e && !n.has(e) && x(e) && (u = e);
110
+ }
111
+ }
112
+ if (u ??= b(r, i, W.current, R), n.has(u)) {
113
+ let e = 0, t = `occ:${u}#${e}`;
114
+ for (; n.has(t);) e += 1, t = `occ:${u}#${e}`;
115
+ u = t;
116
+ }
117
+ return n.add(u), c(r, i, u, s), {
118
+ row: r,
119
+ key: u,
120
+ selectId: C(r, i, u, M)
121
+ };
122
+ }), f = G ? d.filter(({ row: e }) => _.some((t) => te(t, e).toLowerCase().includes(G))) : d;
123
+ return {
124
+ rows: (() => {
125
+ if (!P) return f;
126
+ let e = _.find((e) => e.id === P.id);
127
+ return e ? [...f].sort((t, n) => {
128
+ let r = y(e.sortValue?.(t.row) ?? e.accessor(t.row), e.sortValue?.(n.row) ?? e.accessor(n.row));
129
+ return P.dir === "asc" ? r : -r;
130
+ }) : f;
131
+ })(),
132
+ assigned: a,
133
+ owner: o,
134
+ canonical: s,
135
+ lastKey: r,
136
+ dups: i
137
+ };
138
+ }, [
139
+ _,
140
+ g,
141
+ M,
142
+ G,
143
+ P
144
+ ]);
145
+ u(() => {
146
+ for (let [e, t] of K.assigned) z.current.set(e, t);
147
+ V.current = K.owner, B.current = K.canonical, H.current = K.lastKey, U.current = K.dups;
148
+ }, [K]);
149
+ let q = E !== void 0 || D !== void 0 || O !== void 0, J = E ?? ie, Y = l((e) => {
150
+ E === void 0 && ae(e), O?.(e);
151
+ }, [O, E]), X = A && A > 0 ? Math.max(1, Math.ceil(K.rows.length / A)) : 1, Z = Math.min(X, Math.max(1, k ?? I)), se = l((e) => {
152
+ k === void 0 && oe(e), j?.(e);
153
+ }, [j, k]), Q = A && A > 0 ? K.rows.slice((Z - 1) * A, Z * A) : K.rows, $ = _.length + +!!q, ce = (e) => {
154
+ if (ne) {
155
+ Y(J.includes(e) ? J.filter((t) => t !== e) : [...J, e]);
156
+ return;
157
+ }
158
+ Y(J.includes(e) ? [] : [e]);
159
+ };
160
+ return /* @__PURE__ */ h("div", {
161
+ className: "flex flex-col gap-3",
162
+ children: [/* @__PURE__ */ h(r, {
163
+ className: e("w-full", N),
164
+ "aria-busy": w || void 0,
165
+ children: [/* @__PURE__ */ m(s, { children: /* @__PURE__ */ h(c, { children: [q ? /* @__PURE__ */ m(o, { children: /* @__PURE__ */ m("span", {
166
+ className: "sr-only",
167
+ children: "Select"
168
+ }) }) : null, _.map((e) => /* @__PURE__ */ m(o, {
169
+ "aria-sort": P?.id === e.id ? P.dir === "asc" ? "ascending" : "descending" : "none",
170
+ children: /* @__PURE__ */ h("button", {
171
+ type: "button",
172
+ className: "appearance-none border-0 bg-transparent p-0 font-inherit text-inherit font-medium cursor-pointer",
173
+ onClick: () => F((t) => t?.id === e.id && t.dir === "asc" ? {
174
+ id: e.id,
175
+ dir: "desc"
176
+ } : {
177
+ id: e.id,
178
+ dir: "asc"
179
+ }),
180
+ children: [e.header, P?.id === e.id ? P.dir === "asc" ? " ↑" : " ↓" : ""]
181
+ })
182
+ }, e.id))] }) }), /* @__PURE__ */ m(i, { children: w ? /* @__PURE__ */ m(c, { children: /* @__PURE__ */ m(a, {
183
+ colSpan: $,
184
+ children: /* @__PURE__ */ h("div", {
185
+ role: "status",
186
+ className: "flex flex-col gap-2 py-2",
187
+ children: [
188
+ /* @__PURE__ */ m("span", {
189
+ className: "sr-only",
190
+ children: "Loading"
191
+ }),
192
+ /* @__PURE__ */ m(t, {}),
193
+ /* @__PURE__ */ m(t, {}),
194
+ /* @__PURE__ */ m(t, {})
195
+ ]
196
+ })
197
+ }) }) : Q.length === 0 ? /* @__PURE__ */ m(c, { children: /* @__PURE__ */ m(a, {
198
+ colSpan: $,
199
+ children: /* @__PURE__ */ m("div", {
200
+ role: "status",
201
+ children: T
202
+ })
203
+ }) }) : Q.map(({ row: e, key: t, selectId: n }) => {
204
+ let r = J.includes(n);
205
+ return /* @__PURE__ */ h(c, {
206
+ variant: r ? "selected" : "default",
207
+ "aria-selected": q ? r : void 0,
208
+ children: [q ? /* @__PURE__ */ m(a, { children: /* @__PURE__ */ m("input", {
209
+ type: "checkbox",
210
+ checked: r,
211
+ "aria-label": `Select ${n}`,
212
+ onChange: () => ce(n)
213
+ }) }) : null, _.map((t) => {
214
+ let n = t.accessor(e);
215
+ return /* @__PURE__ */ m(a, { children: typeof n == "bigint" ? String(n) : n }, t.id);
216
+ })]
217
+ }, t);
218
+ }) })]
219
+ }), A && A > 0 ? /* @__PURE__ */ m(n, {
220
+ page: Z,
221
+ pageCount: X,
222
+ disabled: w,
223
+ onPageChange: se
224
+ }) : null]
225
+ });
226
+ }
227
+ //#endregion
228
+ export { w as DataTable };
229
+
230
+ //# sourceMappingURL=data-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.js","names":[],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Pagination } from \"./pagination\";\nimport { SkeletonLine } from \"./skeleton-line\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"./table\";\n\nexport type DataTableColumn<T> = {\n\tid: string;\n\theader: string;\n\taccessor: (row: T) => ReactNode;\n\tsortValue?: (row: T) => string | number | bigint;\n\tfilterValue?: (row: T) => string | number | bigint;\n};\n\nfunction asBigint(value: unknown): bigint | null {\n\tif (typeof value === \"bigint\") {\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\" && Number.isFinite(value) && Number.isInteger(value)) {\n\t\treturn BigInt(value);\n\t}\n\treturn null;\n}\n\nfunction compareNumberAndBigint(num: number, big: bigint): number {\n\tconst truncated = BigInt(Math.trunc(num));\n\tif (truncated < big) {\n\t\treturn -1;\n\t}\n\tif (truncated > big) {\n\t\treturn 1;\n\t}\n\treturn num > Number(truncated) ? 1 : -1;\n}\n\nfunction rank(value: unknown): number {\n\tif (value === Number.NEGATIVE_INFINITY) {\n\t\treturn 0;\n\t}\n\tif (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))) {\n\t\treturn 1;\n\t}\n\tif (value === Number.POSITIVE_INFINITY) {\n\t\treturn 2;\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn 3;\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn 4;\n\t}\n\treturn 5;\n}\n\nfunction compareUnknown(left: unknown, right: unknown): number {\n\tconst leftRank = rank(left);\n\tconst rightRank = rank(right);\n\tif (leftRank !== rightRank) {\n\t\treturn leftRank - rightRank;\n\t}\n\tif (leftRank === 1) {\n\t\tif (typeof left === \"bigint\" && typeof right === \"bigint\") {\n\t\t\treturn left < right ? -1 : left > right ? 1 : 0;\n\t\t}\n\t\tconst leftInt = asBigint(left);\n\t\tconst rightInt = asBigint(right);\n\t\tif (leftInt !== null && rightInt !== null) {\n\t\t\treturn leftInt < rightInt ? -1 : leftInt > rightInt ? 1 : 0;\n\t\t}\n\t\tif (typeof left === \"number\" && typeof right === \"bigint\") {\n\t\t\treturn compareNumberAndBigint(left, right);\n\t\t}\n\t\tif (typeof left === \"bigint\" && typeof right === \"number\") {\n\t\t\treturn -compareNumberAndBigint(right, left);\n\t\t}\n\t\treturn (left as number) - (right as number);\n\t}\n\tconst leftStr = String(left);\n\tconst rightStr = String(right);\n\treturn leftStr < rightStr ? -1 : leftStr > rightStr ? 1 : 0;\n}\n\nfunction primitiveKey(\n\trow: unknown,\n\tindex: number,\n\tsymbols: Map<symbol, string>,\n\tseq: { current: number },\n): string {\n\tif (row === null) {\n\t\treturn \"prim:null\";\n\t}\n\tif (row === undefined) {\n\t\treturn \"prim:undefined\";\n\t}\n\tif (typeof row === \"symbol\") {\n\t\tlet key = symbols.get(row);\n\t\tif (!key) {\n\t\t\tkey = `prim:symbol:${seq.current++}`;\n\t\t\tsymbols.set(row, key);\n\t\t}\n\t\treturn key;\n\t}\n\tconst type = typeof row;\n\tif (type === \"number\") {\n\t\tif (Object.is(row, -0)) {\n\t\t\treturn \"prim:number:-0\";\n\t\t}\n\t\treturn `prim:number:${String(row)}`;\n\t}\n\tif (type === \"string\" || type === \"bigint\" || type === \"boolean\") {\n\t\treturn `prim:${type}:${String(row)}`;\n\t}\n\treturn `prim:${index}`;\n}\n\nfunction isInstanceKey(key: string) {\n\treturn key.startsWith(\"dup:\") || key.startsWith(\"gen:\");\n}\n\nfunction isCanonicalKey(key: string) {\n\treturn key.startsWith(\"id:\") || key.startsWith(\"get:\");\n}\n\nfunction isRefRow(row: unknown): row is object {\n\treturn typeof row === \"function\" || (typeof row === \"object\" && row !== null);\n}\n\nfunction filterSource<T>(column: DataTableColumn<T>, row: T): string {\n\tif (column.filterValue) {\n\t\treturn String(column.filterValue(row));\n\t}\n\tif (column.sortValue) {\n\t\treturn String(column.sortValue(row));\n\t}\n\tconst rendered = column.accessor(row);\n\tif (\n\t\ttypeof rendered === \"string\" ||\n\t\ttypeof rendered === \"number\" ||\n\t\ttypeof rendered === \"bigint\"\n\t) {\n\t\treturn String(rendered);\n\t}\n\treturn \"\";\n}\n\nfunction publicSelectId<T>(\n\trow: T,\n\tindex: number,\n\tkey: string,\n\tgetRowId?: (row: T, index: number) => string,\n): string {\n\tconst requested = getRowId?.(row, index);\n\tif (requested !== undefined) {\n\t\treturn requested;\n\t}\n\tif (isRefRow(row) && \"id\" in row && row.id != null) {\n\t\treturn String(row.id);\n\t}\n\treturn key;\n}\n\nexport type DataTableProps<T = unknown> = {\n\t/**\n\t * Rows to render.\n\t */\n\tdata: T[];\n\t/**\n\t * Column descriptors.\n\t */\n\tcolumns: DataTableColumn<T>[];\n\t/**\n\t * Filter query matched against column values.\n\t * @default \"\"\n\t */\n\tfilter?: string;\n\t/**\n\t * Replace rows with a loading placeholder.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Copy shown when no rows remain after filtering.\n\t * @default \"No results\"\n\t */\n\tempty?: ReactNode;\n\t/**\n\t * Controlled selected row ids.\n\t */\n\tselected?: string[];\n\t/**\n\t * Uncontrolled initial selected row ids.\n\t */\n\tdefaultSelected?: string[];\n\t/**\n\t * Called when selected row ids change.\n\t */\n\tonSelectedChange?: (ids: string[]) => void;\n\t/**\n\t * Allow more than one selected row.\n\t * @default false\n\t */\n\tmultiple?: boolean;\n\t/**\n\t * Controlled 1-based page. Used with pageSize.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Rows per page. Omit to show every row.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Stable id for a row.\n\t */\n\tgetRowId?: (row: T, index: number) => string;\n\t/**\n\t * Additional classes for the table.\n\t */\n\tclassName?: string;\n};\n\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tfilter = \"\",\n\tloading = false,\n\tempty = \"No results\",\n\tselected,\n\tdefaultSelected,\n\tonSelectedChange,\n\tmultiple = false,\n\tpage,\n\tdefaultPage = 1,\n\tpageSize,\n\tonPageChange,\n\tgetRowId,\n\tclassName,\n}: DataTableProps<T>) {\n\tconst [sort, setSort] = useState<{ id: string; dir: \"asc\" | \"desc\" } | null>(null);\n\tconst [uncontrolledSelected, setUncontrolledSelected] = useState<string[]>(defaultSelected ?? []);\n\tconst [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\tconst rowIds = useRef(new WeakMap<object, string>());\n\tconst rowSeq = useRef(0);\n\tconst assignedKeys = useRef(new WeakMap<object, string[]>());\n\tconst lastCanonical = useRef(new Map<string, object>());\n\tconst lastOwner = useRef(new Map<string, object>());\n\tconst lastKeyByCanonical = useRef(new Map<string, string>());\n\tconst lastDupsByCanonical = useRef(new Map<string, string[]>());\n\tconst symbolKeys = useRef(new Map<symbol, string>());\n\tconst query = filter.trim().toLowerCase();\n\n\tconst rows = useMemo(() => {\n\t\tconst identityOf = (row: object) => {\n\t\t\tlet stored = rowIds.current.get(row);\n\t\t\tif (!stored) {\n\t\t\t\tstored = `basalt-row-${rowSeq.current++}`;\n\t\t\t\trowIds.current.set(row, stored);\n\t\t\t}\n\t\t\treturn stored;\n\t\t};\n\t\tconst canonicalOf = (row: T, index: number) => {\n\t\t\tconst requested = getRowId?.(row, index);\n\t\t\tif (requested !== undefined) {\n\t\t\t\treturn `get:${requested}`;\n\t\t\t}\n\t\t\tif (isRefRow(row) && \"id\" in row) {\n\t\t\t\tconst raw = (row as { id: unknown }).id;\n\t\t\t\tif (raw != null) {\n\t\t\t\t\treturn `id:${String(raw)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst used = new Set<string>();\n\t\tconst nextLastKey = new Map<string, string>();\n\t\tconst nextDups = new Map<string, string[]>();\n\t\tconst nextAssigned = new Map<object, string[]>();\n\t\tconst nextOwner = new Map<string, object>();\n\t\tconst nextCanonical = new Map<string, object>();\n\t\tconst rememberKey = (row: T, index: number, key: string, objectRow: object | null) => {\n\t\t\tif (!objectRow) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst list = nextAssigned.get(objectRow) ?? [];\n\t\t\tlist.push(key);\n\t\t\tnextAssigned.set(objectRow, list);\n\t\t\tnextOwner.set(key, objectRow);\n\t\t\tif (isCanonicalKey(key)) {\n\t\t\t\tnextCanonical.set(key, objectRow);\n\t\t\t}\n\t\t\tconst canonical = canonicalOf(row, index);\n\t\t\tif (!canonical) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnextLastKey.set(canonical, key);\n\t\t\tif (isInstanceKey(key)) {\n\t\t\t\tconst dups = nextDups.get(canonical) ?? [];\n\t\t\t\tdups.push(key);\n\t\t\t\tnextDups.set(canonical, dups);\n\t\t\t}\n\t\t};\n\t\tconst counts = new WeakMap<object, number>();\n\t\tconst pending = data.map((row, index) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tconst occurrence = objectRow ? (counts.get(objectRow) ?? 0) : 0;\n\t\t\tif (objectRow) {\n\t\t\t\tcounts.set(objectRow, occurrence + 1);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trow,\n\t\t\t\tindex,\n\t\t\t\toccurrence,\n\t\t\t\tkey: undefined as string | undefined,\n\t\t\t};\n\t\t});\n\t\tfor (const item of pending) {\n\t\t\tconst objectRow = isRefRow(item.row) ? item.row : null;\n\t\t\tif (!objectRow) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previous = assignedKeys.current.get(objectRow)?.[item.occurrence];\n\t\t\tif (!previous || used.has(previous)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lastOwner.current.get(previous) === objectRow) {\n\t\t\t\titem.key = previous;\n\t\t\t\tused.add(previous);\n\t\t\t}\n\t\t}\n\t\tconst keyed = pending.map(({ row, index, occurrence, key: reserved }) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tif (reserved) {\n\t\t\t\trememberKey(row, index, reserved, objectRow);\n\t\t\t\treturn {\n\t\t\t\t\trow,\n\t\t\t\t\tkey: reserved,\n\t\t\t\t\tselectId: publicSelectId(row, index, reserved, getRowId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isRepeat = occurrence > 0;\n\t\t\tlet key: string | undefined;\n\t\t\tconst requested = canonicalOf(row, index);\n\t\t\tif (requested) {\n\t\t\t\tkey = requested;\n\t\t\t}\n\t\t\tif (objectRow) {\n\t\t\t\tconst stored = identityOf(objectRow);\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = isRepeat ? `gen:${stored}#${occurrence}` : `gen:${stored}`;\n\t\t\t\t} else if (used.has(key) || isRepeat) {\n\t\t\t\t\tconst reused = (lastDupsByCanonical.current.get(key) ?? []).find(\n\t\t\t\t\t\t(candidate) => !used.has(candidate),\n\t\t\t\t\t);\n\t\t\t\t\tkey = reused ?? (isRepeat ? `dup:${stored}#${occurrence}` : `dup:${stored}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst inherited = lastKeyByCanonical.current.get(key);\n\t\t\t\t\tif (inherited && !used.has(inherited) && isInstanceKey(inherited)) {\n\t\t\t\t\t\tkey = inherited;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = key ?? primitiveKey(row, index, symbolKeys.current, rowSeq);\n\t\t\tif (used.has(key)) {\n\t\t\t\tlet n = 0;\n\t\t\t\tlet candidate = `occ:${key}#${n}`;\n\t\t\t\twhile (used.has(candidate)) {\n\t\t\t\t\tn += 1;\n\t\t\t\t\tcandidate = `occ:${key}#${n}`;\n\t\t\t\t}\n\t\t\t\tkey = candidate;\n\t\t\t}\n\t\t\tused.add(key);\n\t\t\trememberKey(row, index, key, objectRow);\n\t\t\treturn { row, key, selectId: publicSelectId(row, index, key, getRowId) };\n\t\t});\n\t\tconst filtered = query\n\t\t\t? keyed.filter(({ row }) =>\n\t\t\t\t\tcolumns.some((column) => filterSource(column, row).toLowerCase().includes(query)),\n\t\t\t\t)\n\t\t\t: keyed;\n\t\tconst sorted = (() => {\n\t\t\tif (!sort) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\tconst column = columns.find((item) => item.id === sort.id);\n\t\t\tif (!column) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\treturn [...filtered].sort((a, b) => {\n\t\t\t\tconst left = column.sortValue?.(a.row) ?? column.accessor(a.row);\n\t\t\t\tconst right = column.sortValue?.(b.row) ?? column.accessor(b.row);\n\t\t\t\tconst cmp = compareUnknown(left, right);\n\t\t\t\treturn sort.dir === \"asc\" ? cmp : -cmp;\n\t\t\t});\n\t\t})();\n\t\treturn {\n\t\t\trows: sorted,\n\t\t\tassigned: nextAssigned,\n\t\t\towner: nextOwner,\n\t\t\tcanonical: nextCanonical,\n\t\t\tlastKey: nextLastKey,\n\t\t\tdups: nextDups,\n\t\t};\n\t}, [columns, data, getRowId, query, sort]);\n\n\tuseLayoutEffect(() => {\n\t\tfor (const [objectRow, keys] of rows.assigned) {\n\t\t\tassignedKeys.current.set(objectRow, keys);\n\t\t}\n\t\tlastOwner.current = rows.owner;\n\t\tlastCanonical.current = rows.canonical;\n\t\tlastKeyByCanonical.current = rows.lastKey;\n\t\tlastDupsByCanonical.current = rows.dups;\n\t}, [rows]);\n\n\tconst selectable =\n\t\tselected !== undefined || defaultSelected !== undefined || onSelectedChange !== undefined;\n\tconst selectedIds = selected ?? uncontrolledSelected;\n\tconst setSelectedIds = useCallback(\n\t\t(next: string[]) => {\n\t\t\tif (selected === undefined) {\n\t\t\t\tsetUncontrolledSelected(next);\n\t\t\t}\n\t\t\tonSelectedChange?.(next);\n\t\t},\n\t\t[onSelectedChange, selected],\n\t);\n\tconst pageCount =\n\t\tpageSize && pageSize > 0 ? Math.max(1, Math.ceil(rows.rows.length / pageSize)) : 1;\n\tconst resolvedPage = Math.min(pageCount, Math.max(1, page ?? uncontrolledPage));\n\tconst setResolvedPage = useCallback(\n\t\t(next: number) => {\n\t\t\tif (page === undefined) {\n\t\t\t\tsetUncontrolledPage(next);\n\t\t\t}\n\t\t\tonPageChange?.(next);\n\t\t},\n\t\t[onPageChange, page],\n\t);\n\tconst paged =\n\t\tpageSize && pageSize > 0\n\t\t\t? rows.rows.slice((resolvedPage - 1) * pageSize, resolvedPage * pageSize)\n\t\t\t: rows.rows;\n\tconst colCount = columns.length + (selectable ? 1 : 0);\n\tconst toggleSelected = (id: string) => {\n\t\tif (multiple) {\n\t\t\tsetSelectedIds(\n\t\t\t\tselectedIds.includes(id) ? selectedIds.filter((item) => item !== id) : [...selectedIds, id],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedIds(selectedIds.includes(id) ? [] : [id]);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t<Table className={cn(\"w-full\", className)} aria-busy={loading || undefined}>\n\t\t\t\t<TableHeader>\n\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t<TableHead>\n\t\t\t\t\t\t\t\t<span className=\"sr-only\">Select</span>\n\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\tsort?.id === column.id\n\t\t\t\t\t\t\t\t\t\t? sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t? \"ascending\"\n\t\t\t\t\t\t\t\t\t\t\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName=\"appearance-none border-0 bg-transparent p-0 font-inherit text-inherit font-medium cursor-pointer\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetSort((current) =>\n\t\t\t\t\t\t\t\t\t\t\tcurrent?.id === column.id && current.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t? { id: column.id, dir: \"desc\" }\n\t\t\t\t\t\t\t\t\t\t\t\t: { id: column.id, dir: \"asc\" },\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{column.header}\n\t\t\t\t\t\t\t\t\t{sort?.id === column.id ? (sort.dir === \"asc\" ? \" ↑\" : \" ↓\") : \"\"}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t</TableHeader>\n\t\t\t\t<TableBody>\n\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t<div role=\"status\" className=\"flex flex-col gap-2 py-2\">\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Loading</span>\n\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tpaged.map(({ row, key, selectId }) => {\n\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Select ${selectId}`}\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={() => toggleSelected(selectId)}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\t\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell key={column.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t{typeof cell === \"bigint\" ? String(cell) : cell}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</TableBody>\n\t\t\t</Table>\n\t\t\t{pageSize && pageSize > 0 ? (\n\t\t\t\t<Pagination\n\t\t\t\t\tpage={resolvedPage}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tdisabled={loading}\n\t\t\t\t\tonPageChange={setResolvedPage}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { type ComponentProps } from "react";
2
+ export type DatePickerRange = {
3
+ from: string;
4
+ to?: string;
5
+ };
6
+ export type DatePickerPreset = {
7
+ label: string;
8
+ value: string | {
9
+ from: string;
10
+ to: string;
11
+ };
12
+ };
13
+ export type DatePickerProps = Omit<ComponentProps<"input">, "value" | "defaultValue" | "onChange" | "type" | "children" | "disabled" | "name" | "required" | "min" | "max"> & {
14
+ /**
15
+ * The controlled ISO date in single mode.
16
+ */
17
+ value?: string;
18
+ /**
19
+ * The uncontrolled initial ISO date in single mode.
20
+ */
21
+ defaultValue?: string;
22
+ /**
23
+ * Called with the ISO date in single mode.
24
+ */
25
+ onChange?: (value: string) => void;
26
+ /**
27
+ * Selection mode.
28
+ * @default single
29
+ */
30
+ mode?: "single" | "range";
31
+ /**
32
+ * The controlled range in range mode.
33
+ */
34
+ rangeValue?: DatePickerRange;
35
+ /**
36
+ * The uncontrolled initial range in range mode.
37
+ */
38
+ defaultRangeValue?: DatePickerRange;
39
+ /**
40
+ * Called when the range changes.
41
+ */
42
+ onRangeChange?: (value: DatePickerRange) => void;
43
+ /**
44
+ * Additional dates that cannot be selected.
45
+ */
46
+ isDisabledDate?: (iso: string) => boolean;
47
+ /**
48
+ * Shortcut values shown above the calendar.
49
+ */
50
+ presets?: DatePickerPreset[];
51
+ /**
52
+ * Locale used to format the trigger and weekday labels.
53
+ * @default en-US
54
+ */
55
+ locale?: string;
56
+ /**
57
+ * First day of the week. 0 is Sunday.
58
+ * @default 0
59
+ */
60
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
61
+ /**
62
+ * IANA time zone used to resolve today.
63
+ */
64
+ timeZone?: string;
65
+ /**
66
+ * Custom formatter for the trigger label.
67
+ */
68
+ formatDate?: (date: Date) => string;
69
+ /**
70
+ * Native form field name.
71
+ */
72
+ name?: string;
73
+ /**
74
+ * Native required constraint.
75
+ */
76
+ required?: boolean;
77
+ /**
78
+ * Inclusive lower ISO bound.
79
+ */
80
+ min?: string;
81
+ /**
82
+ * Inclusive upper ISO bound.
83
+ */
84
+ max?: string;
85
+ /**
86
+ * Disable the trigger and calendar.
87
+ */
88
+ disabled?: boolean;
89
+ };
90
+ export declare function DatePicker({ value, defaultValue, onChange, mode, rangeValue, defaultRangeValue, onRangeChange, isDisabledDate, presets, locale, weekStartsOn, timeZone, formatDate, name, required, min, max, disabled, className, id, "aria-label": ariaLabel, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, ...inputRest }: DatePickerProps): import("react").JSX.Element;