@voyantjs/ui 0.6.7

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 (262) hide show
  1. package/README.md +30 -0
  2. package/dist/components/accordion.d.ts +7 -0
  3. package/dist/components/accordion.d.ts.map +1 -0
  4. package/dist/components/accordion.js +17 -0
  5. package/dist/components/alert-dialog.d.ts +19 -0
  6. package/dist/components/alert-dialog.d.ts.map +1 -0
  7. package/dist/components/alert-dialog.js +42 -0
  8. package/dist/components/alert.d.ts +11 -0
  9. package/dist/components/alert.d.ts.map +1 -0
  10. package/dist/components/alert.js +27 -0
  11. package/dist/components/aspect-ratio.d.ts +5 -0
  12. package/dist/components/aspect-ratio.d.ts.map +1 -0
  13. package/dist/components/aspect-ratio.js +8 -0
  14. package/dist/components/avatar.d.ts +12 -0
  15. package/dist/components/avatar.d.ts.map +1 -0
  16. package/dist/components/avatar.js +22 -0
  17. package/dist/components/badge.d.ts +8 -0
  18. package/dist/components/badge.d.ts.map +1 -0
  19. package/dist/components/badge.js +33 -0
  20. package/dist/components/breadcrumb.d.ts +11 -0
  21. package/dist/components/breadcrumb.d.ts.map +1 -0
  22. package/dist/components/breadcrumb.js +36 -0
  23. package/dist/components/button-group.d.ts +11 -0
  24. package/dist/components/button-group.d.ts.map +1 -0
  25. package/dist/components/button-group.js +36 -0
  26. package/dist/components/button.d.ts +9 -0
  27. package/dist/components/button.d.ts.map +1 -0
  28. package/dist/components/button.js +34 -0
  29. package/dist/components/calendar.d.ts +11 -0
  30. package/dist/components/calendar.d.ts.map +1 -0
  31. package/dist/components/calendar.js +76 -0
  32. package/dist/components/card.d.ts +12 -0
  33. package/dist/components/card.d.ts.map +1 -0
  34. package/dist/components/card.js +24 -0
  35. package/dist/components/carousel.d.ts +29 -0
  36. package/dist/components/carousel.d.ts.map +1 -0
  37. package/dist/components/carousel.js +91 -0
  38. package/dist/components/chart.d.ts +45 -0
  39. package/dist/components/chart.d.ts.map +1 -0
  40. package/dist/components/chart.js +121 -0
  41. package/dist/components/checkbox.d.ts +4 -0
  42. package/dist/components/checkbox.d.ts.map +1 -0
  43. package/dist/components/checkbox.js +8 -0
  44. package/dist/components/collapsible.d.ts +6 -0
  45. package/dist/components/collapsible.d.ts.map +1 -0
  46. package/dist/components/collapsible.js +12 -0
  47. package/dist/components/combobox.d.ts +25 -0
  48. package/dist/components/combobox.d.ts.map +1 -0
  49. package/dist/components/combobox.js +57 -0
  50. package/dist/components/command.d.ts +20 -0
  51. package/dist/components/command.d.ts.map +1 -0
  52. package/dist/components/command.js +35 -0
  53. package/dist/components/confirm-action-button.d.ts +14 -0
  54. package/dist/components/confirm-action-button.d.ts.map +1 -0
  55. package/dist/components/confirm-action-button.js +21 -0
  56. package/dist/components/context-menu.d.ts +30 -0
  57. package/dist/components/context-menu.d.ts.map +1 -0
  58. package/dist/components/context-menu.js +50 -0
  59. package/dist/components/contract-template-authoring-help.d.ts +32 -0
  60. package/dist/components/contract-template-authoring-help.d.ts.map +1 -0
  61. package/dist/components/contract-template-authoring-help.js +37 -0
  62. package/dist/components/country-combobox.d.ts +9 -0
  63. package/dist/components/country-combobox.d.ts.map +1 -0
  64. package/dist/components/country-combobox.js +47 -0
  65. package/dist/components/currency-combobox.d.ts +14 -0
  66. package/dist/components/currency-combobox.d.ts.map +1 -0
  67. package/dist/components/currency-combobox.js +53 -0
  68. package/dist/components/dashboard-widgets.d.ts +66 -0
  69. package/dist/components/dashboard-widgets.d.ts.map +1 -0
  70. package/dist/components/dashboard-widgets.js +64 -0
  71. package/dist/components/data-table-column-header.d.ts +9 -0
  72. package/dist/components/data-table-column-header.d.ts.map +1 -0
  73. package/dist/components/data-table-column-header.js +12 -0
  74. package/dist/components/data-table-pagination.d.ts +7 -0
  75. package/dist/components/data-table-pagination.d.ts.map +1 -0
  76. package/dist/components/data-table-pagination.js +11 -0
  77. package/dist/components/data-table.d.ts +22 -0
  78. package/dist/components/data-table.d.ts.map +1 -0
  79. package/dist/components/data-table.js +55 -0
  80. package/dist/components/date-picker.d.ts +38 -0
  81. package/dist/components/date-picker.d.ts.map +1 -0
  82. package/dist/components/date-picker.js +120 -0
  83. package/dist/components/date-time-picker.d.ts +30 -0
  84. package/dist/components/date-time-picker.d.ts.map +1 -0
  85. package/dist/components/date-time-picker.js +75 -0
  86. package/dist/components/dialog.d.ts +18 -0
  87. package/dist/components/dialog.d.ts.map +1 -0
  88. package/dist/components/dialog.js +37 -0
  89. package/dist/components/direction.d.ts +2 -0
  90. package/dist/components/direction.d.ts.map +1 -0
  91. package/dist/components/direction.js +1 -0
  92. package/dist/components/drawer.d.ts +14 -0
  93. package/dist/components/drawer.d.ts.map +1 -0
  94. package/dist/components/drawer.js +34 -0
  95. package/dist/components/dropdown-menu.d.ts +30 -0
  96. package/dist/components/dropdown-menu.d.ts.map +1 -0
  97. package/dist/components/dropdown-menu.js +50 -0
  98. package/dist/components/empty.d.ts +12 -0
  99. package/dist/components/empty.d.ts.map +1 -0
  100. package/dist/components/empty.js +33 -0
  101. package/dist/components/field.d.ts +25 -0
  102. package/dist/components/field.d.ts.map +1 -0
  103. package/dist/components/field.js +65 -0
  104. package/dist/components/hover-card.d.ts +6 -0
  105. package/dist/components/hover-card.d.ts.map +1 -0
  106. package/dist/components/hover-card.js +13 -0
  107. package/dist/components/index.d.ts +86 -0
  108. package/dist/components/index.d.ts.map +1 -0
  109. package/dist/components/index.js +85 -0
  110. package/dist/components/input-group.d.ts +19 -0
  111. package/dist/components/input-group.d.ts.map +1 -0
  112. package/dist/components/input-group.js +73 -0
  113. package/dist/components/input-otp.d.ts +12 -0
  114. package/dist/components/input-otp.d.ts.map +1 -0
  115. package/dist/components/input-otp.js +20 -0
  116. package/dist/components/input.d.ts +4 -0
  117. package/dist/components/input.d.ts.map +1 -0
  118. package/dist/components/input.js +7 -0
  119. package/dist/components/item.d.ts +23 -0
  120. package/dist/components/item.d.ts.map +1 -0
  121. package/dist/components/item.js +78 -0
  122. package/dist/components/kbd.d.ts +4 -0
  123. package/dist/components/kbd.d.ts.map +1 -0
  124. package/dist/components/kbd.js +9 -0
  125. package/dist/components/label.d.ts +4 -0
  126. package/dist/components/label.d.ts.map +1 -0
  127. package/dist/components/label.js +8 -0
  128. package/dist/components/menubar.d.ts +30 -0
  129. package/dist/components/menubar.d.ts.map +1 -0
  130. package/dist/components/menubar.js +56 -0
  131. package/dist/components/native-select.d.ts +9 -0
  132. package/dist/components/native-select.d.ts.map +1 -0
  133. package/dist/components/native-select.js +13 -0
  134. package/dist/components/navigation-menu.d.ts +12 -0
  135. package/dist/components/navigation-menu.d.ts.map +1 -0
  136. package/dist/components/navigation-menu.js +31 -0
  137. package/dist/components/notification-deliveries-page.d.ts +2 -0
  138. package/dist/components/notification-deliveries-page.d.ts.map +1 -0
  139. package/dist/components/notification-deliveries-page.js +22 -0
  140. package/dist/components/notification-delivery-detail-dialog.d.ts +8 -0
  141. package/dist/components/notification-delivery-detail-dialog.d.ts.map +1 -0
  142. package/dist/components/notification-delivery-detail-dialog.js +29 -0
  143. package/dist/components/notification-reminder-rule-dialog.d.ts +10 -0
  144. package/dist/components/notification-reminder-rule-dialog.d.ts.map +1 -0
  145. package/dist/components/notification-reminder-rule-dialog.js +123 -0
  146. package/dist/components/notification-reminder-rules-page.d.ts +2 -0
  147. package/dist/components/notification-reminder-rules-page.d.ts.map +1 -0
  148. package/dist/components/notification-reminder-rules-page.js +35 -0
  149. package/dist/components/notification-reminder-runs-page.d.ts +2 -0
  150. package/dist/components/notification-reminder-runs-page.d.ts.map +1 -0
  151. package/dist/components/notification-reminder-runs-page.js +20 -0
  152. package/dist/components/notification-template-authoring-help.d.ts +11 -0
  153. package/dist/components/notification-template-authoring-help.d.ts.map +1 -0
  154. package/dist/components/notification-template-authoring-help.js +6 -0
  155. package/dist/components/notification-template-detail-page.d.ts +6 -0
  156. package/dist/components/notification-template-detail-page.d.ts.map +1 -0
  157. package/dist/components/notification-template-detail-page.js +145 -0
  158. package/dist/components/notification-template-dialog.d.ts +10 -0
  159. package/dist/components/notification-template-dialog.d.ts.map +1 -0
  160. package/dist/components/notification-template-dialog.js +296 -0
  161. package/dist/components/notification-templates-page.d.ts +2 -0
  162. package/dist/components/notification-templates-page.d.ts.map +1 -0
  163. package/dist/components/notification-templates-page.js +33 -0
  164. package/dist/components/overview-metric.d.ts +12 -0
  165. package/dist/components/overview-metric.d.ts.map +1 -0
  166. package/dist/components/overview-metric.js +6 -0
  167. package/dist/components/pagination.d.ts +18 -0
  168. package/dist/components/pagination.d.ts.map +1 -0
  169. package/dist/components/pagination.js +26 -0
  170. package/dist/components/popover.d.ts +10 -0
  171. package/dist/components/popover.d.ts.map +1 -0
  172. package/dist/components/popover.js +22 -0
  173. package/dist/components/progress.d.ts +8 -0
  174. package/dist/components/progress.d.ts.map +1 -0
  175. package/dist/components/progress.js +19 -0
  176. package/dist/components/radio-group.d.ts +6 -0
  177. package/dist/components/radio-group.d.ts.map +1 -0
  178. package/dist/components/radio-group.js +11 -0
  179. package/dist/components/resizable.d.ts +8 -0
  180. package/dist/components/resizable.d.ts.map +1 -0
  181. package/dist/components/resizable.js +13 -0
  182. package/dist/components/rich-text-editor.d.ts +13 -0
  183. package/dist/components/rich-text-editor.d.ts.map +1 -0
  184. package/dist/components/rich-text-editor.js +71 -0
  185. package/dist/components/rich-text-variable-extension.d.ts +6 -0
  186. package/dist/components/rich-text-variable-extension.d.ts.map +1 -0
  187. package/dist/components/rich-text-variable-extension.js +117 -0
  188. package/dist/components/scroll-area.d.ts +5 -0
  189. package/dist/components/scroll-area.d.ts.map +1 -0
  190. package/dist/components/scroll-area.js +10 -0
  191. package/dist/components/select.d.ts +16 -0
  192. package/dist/components/select.d.ts.map +1 -0
  193. package/dist/components/select.js +33 -0
  194. package/dist/components/selection-action-bar.d.ts +8 -0
  195. package/dist/components/selection-action-bar.d.ts.map +1 -0
  196. package/dist/components/selection-action-bar.js +7 -0
  197. package/dist/components/separator.d.ts +4 -0
  198. package/dist/components/separator.d.ts.map +1 -0
  199. package/dist/components/separator.js +7 -0
  200. package/dist/components/sheet.d.ts +15 -0
  201. package/dist/components/sheet.d.ts.map +1 -0
  202. package/dist/components/sheet.js +37 -0
  203. package/dist/components/sidebar-core.d.ts +34 -0
  204. package/dist/components/sidebar-core.d.ts.map +1 -0
  205. package/dist/components/sidebar-core.js +112 -0
  206. package/dist/components/sidebar-menu.d.ts +33 -0
  207. package/dist/components/sidebar-menu.d.ts.map +1 -0
  208. package/dist/components/sidebar-menu.js +128 -0
  209. package/dist/components/sidebar.d.ts +3 -0
  210. package/dist/components/sidebar.d.ts.map +1 -0
  211. package/dist/components/sidebar.js +2 -0
  212. package/dist/components/skeleton.d.ts +7 -0
  213. package/dist/components/skeleton.d.ts.map +1 -0
  214. package/dist/components/skeleton.js +6 -0
  215. package/dist/components/slider.d.ts +4 -0
  216. package/dist/components/slider.d.ts.map +1 -0
  217. package/dist/components/slider.js +9 -0
  218. package/dist/components/sonner.d.ts +4 -0
  219. package/dist/components/sonner.d.ts.map +1 -0
  220. package/dist/components/sonner.js +24 -0
  221. package/dist/components/spinner.d.ts +3 -0
  222. package/dist/components/spinner.d.ts.map +1 -0
  223. package/dist/components/spinner.js +7 -0
  224. package/dist/components/switch.d.ts +6 -0
  225. package/dist/components/switch.d.ts.map +1 -0
  226. package/dist/components/switch.js +7 -0
  227. package/dist/components/table.d.ts +11 -0
  228. package/dist/components/table.d.ts.map +1 -0
  229. package/dist/components/table.js +27 -0
  230. package/dist/components/tabs.d.ts +11 -0
  231. package/dist/components/tabs.d.ts.map +1 -0
  232. package/dist/components/tabs.js +28 -0
  233. package/dist/components/textarea.d.ts +4 -0
  234. package/dist/components/textarea.d.ts.map +1 -0
  235. package/dist/components/textarea.js +6 -0
  236. package/dist/components/toggle-group.d.ts +11 -0
  237. package/dist/components/toggle-group.d.ts.map +1 -0
  238. package/dist/components/toggle-group.js +24 -0
  239. package/dist/components/toggle.d.ts +9 -0
  240. package/dist/components/toggle.d.ts.map +1 -0
  241. package/dist/components/toggle.js +25 -0
  242. package/dist/components/tooltip.d.ts +7 -0
  243. package/dist/components/tooltip.d.ts.map +1 -0
  244. package/dist/components/tooltip.js +16 -0
  245. package/dist/components/typography.d.ts +18 -0
  246. package/dist/components/typography.d.ts.map +1 -0
  247. package/dist/components/typography.js +48 -0
  248. package/dist/hooks/use-mobile.d.ts +2 -0
  249. package/dist/hooks/use-mobile.d.ts.map +1 -0
  250. package/dist/hooks/use-mobile.js +15 -0
  251. package/dist/lib/crop-image.d.ts +4 -0
  252. package/dist/lib/crop-image.d.ts.map +1 -0
  253. package/dist/lib/crop-image.js +30 -0
  254. package/dist/lib/utils.d.ts +3 -0
  255. package/dist/lib/utils.d.ts.map +1 -0
  256. package/dist/lib/utils.js +5 -0
  257. package/dist/lib/zod-resolver.d.ts +4 -0
  258. package/dist/lib/zod-resolver.d.ts.map +1 -0
  259. package/dist/lib/zod-resolver.js +39 -0
  260. package/package.json +108 -0
  261. package/postcss.config.mjs +6 -0
  262. package/src/styles/globals.css +157 -0
@@ -0,0 +1,30 @@
1
+ import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu";
2
+ import type * as React from "react";
3
+ declare function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props): import("react/jsx-runtime").JSX.Element;
4
+ declare function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props): import("react/jsx-runtime").JSX.Element;
5
+ declare function ContextMenuTrigger({ className, ...props }: ContextMenuPrimitive.Trigger.Props): import("react/jsx-runtime").JSX.Element;
6
+ declare function ContextMenuContent({ className, align, alignOffset, side, sideOffset, ...props }: ContextMenuPrimitive.Popup.Props & Pick<ContextMenuPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">): import("react/jsx-runtime").JSX.Element;
7
+ declare function ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props): import("react/jsx-runtime").JSX.Element;
8
+ declare function ContextMenuLabel({ className, inset, ...props }: ContextMenuPrimitive.GroupLabel.Props & {
9
+ inset?: boolean;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ declare function ContextMenuItem({ className, inset, variant, ...props }: ContextMenuPrimitive.Item.Props & {
12
+ inset?: boolean;
13
+ variant?: "default" | "destructive";
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ declare function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props): import("react/jsx-runtime").JSX.Element;
16
+ declare function ContextMenuSubTrigger({ className, inset, children, ...props }: ContextMenuPrimitive.SubmenuTrigger.Props & {
17
+ inset?: boolean;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ declare function ContextMenuSubContent({ ...props }: React.ComponentProps<typeof ContextMenuContent>): import("react/jsx-runtime").JSX.Element;
20
+ declare function ContextMenuCheckboxItem({ className, children, checked, inset, ...props }: ContextMenuPrimitive.CheckboxItem.Props & {
21
+ inset?: boolean;
22
+ }): import("react/jsx-runtime").JSX.Element;
23
+ declare function ContextMenuRadioGroup({ ...props }: ContextMenuPrimitive.RadioGroup.Props): import("react/jsx-runtime").JSX.Element;
24
+ declare function ContextMenuRadioItem({ className, children, inset, ...props }: ContextMenuPrimitive.RadioItem.Props & {
25
+ inset?: boolean;
26
+ }): import("react/jsx-runtime").JSX.Element;
27
+ declare function ContextMenuSeparator({ className, ...props }: ContextMenuPrimitive.Separator.Props): import("react/jsx-runtime").JSX.Element;
28
+ declare function ContextMenuShortcut({ className, ...props }: React.ComponentProps<"span">): import("react/jsx-runtime").JSX.Element;
29
+ export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, };
30
+ //# sourceMappingURL=context-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../src/components/context-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEjF,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,IAAI,CAAC,KAAK,2CAEjE;AAED,iBAAS,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,2CAEzE;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,OAAO,CAAC,KAAK,2CAQtF;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,KAAe,EACf,WAAe,EACf,IAAc,EACd,UAAc,EACd,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,GACjC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,2CAqB7F;AAED,iBAAS,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,2CAEvE;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,UAAU,CAAC,KAAK,GAAG;IACzC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,2CAYA;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,KAAK,EACL,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,IAAI,CAAC,KAAK,GAAG;IACnC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;CACpC,2CAaA;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,2CAE3E;AAED,iBAAS,qBAAqB,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,cAAc,CAAC,KAAK,GAAG;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,2CAeA;AAED,iBAAS,qBAAqB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,2CAS3F;AAED,iBAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,OAAO,EACP,KAAK,EACL,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,YAAY,CAAC,KAAK,GAAG;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,2CAoBA;AAED,iBAAS,qBAAqB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,UAAU,CAAC,KAAK,2CAEjF;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,KAAK,EACL,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,SAAS,CAAC,KAAK,GAAG;IACxC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,2CAmBA;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,CAAC,SAAS,CAAC,KAAK,2CAQ1F;AAED,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,2CAWjF;AAED,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu";
3
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
4
+ import { cn } from "../lib/utils";
5
+ function ContextMenu({ ...props }) {
6
+ return _jsx(ContextMenuPrimitive.Root, { "data-slot": "context-menu", ...props });
7
+ }
8
+ function ContextMenuPortal({ ...props }) {
9
+ return _jsx(ContextMenuPrimitive.Portal, { "data-slot": "context-menu-portal", ...props });
10
+ }
11
+ function ContextMenuTrigger({ className, ...props }) {
12
+ return (_jsx(ContextMenuPrimitive.Trigger, { "data-slot": "context-menu-trigger", className: cn("select-none", className), ...props }));
13
+ }
14
+ function ContextMenuContent({ className, align = "start", alignOffset = 4, side = "right", sideOffset = 0, ...props }) {
15
+ return (_jsx(ContextMenuPrimitive.Portal, { children: _jsx(ContextMenuPrimitive.Positioner, { className: "isolate z-50 outline-none", align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, children: _jsx(ContextMenuPrimitive.Popup, { "data-slot": "context-menu-content", className: cn("z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props }) }) }));
16
+ }
17
+ function ContextMenuGroup({ ...props }) {
18
+ return _jsx(ContextMenuPrimitive.Group, { "data-slot": "context-menu-group", ...props });
19
+ }
20
+ function ContextMenuLabel({ className, inset, ...props }) {
21
+ return (_jsx(ContextMenuPrimitive.GroupLabel, { "data-slot": "context-menu-label", "data-inset": inset, className: cn("px-2 py-1.5 text-xs font-medium text-muted-foreground data-inset:pl-8", className), ...props }));
22
+ }
23
+ function ContextMenuItem({ className, inset, variant = "default", ...props }) {
24
+ return (_jsx(ContextMenuPrimitive.Item, { "data-slot": "context-menu-item", "data-inset": inset, "data-variant": variant, className: cn("group/context-menu-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive", className), ...props }));
25
+ }
26
+ function ContextMenuSub({ ...props }) {
27
+ return _jsx(ContextMenuPrimitive.SubmenuRoot, { "data-slot": "context-menu-sub", ...props });
28
+ }
29
+ function ContextMenuSubTrigger({ className, inset, children, ...props }) {
30
+ return (_jsxs(ContextMenuPrimitive.SubmenuTrigger, { "data-slot": "context-menu-sub-trigger", "data-inset": inset, className: cn("flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, _jsx(ChevronRightIcon, { className: "ml-auto" })] }));
31
+ }
32
+ function ContextMenuSubContent({ ...props }) {
33
+ return (_jsx(ContextMenuContent, { "data-slot": "context-menu-sub-content", className: "shadow-lg", side: "right", ...props }));
34
+ }
35
+ function ContextMenuCheckboxItem({ className, children, checked, inset, ...props }) {
36
+ return (_jsxs(ContextMenuPrimitive.CheckboxItem, { "data-slot": "context-menu-checkbox-item", "data-inset": inset, className: cn("relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), checked: checked, ...props, children: [_jsx("span", { className: "pointer-events-none absolute right-2", children: _jsx(ContextMenuPrimitive.CheckboxItemIndicator, { children: _jsx(CheckIcon, {}) }) }), children] }));
37
+ }
38
+ function ContextMenuRadioGroup({ ...props }) {
39
+ return _jsx(ContextMenuPrimitive.RadioGroup, { "data-slot": "context-menu-radio-group", ...props });
40
+ }
41
+ function ContextMenuRadioItem({ className, children, inset, ...props }) {
42
+ return (_jsxs(ContextMenuPrimitive.RadioItem, { "data-slot": "context-menu-radio-item", "data-inset": inset, className: cn("relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-8 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [_jsx("span", { className: "pointer-events-none absolute right-2", children: _jsx(ContextMenuPrimitive.RadioItemIndicator, { children: _jsx(CheckIcon, {}) }) }), children] }));
43
+ }
44
+ function ContextMenuSeparator({ className, ...props }) {
45
+ return (_jsx(ContextMenuPrimitive.Separator, { "data-slot": "context-menu-separator", className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
46
+ }
47
+ function ContextMenuShortcut({ className, ...props }) {
48
+ return (_jsx("span", { "data-slot": "context-menu-shortcut", className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground", className), ...props }));
49
+ }
50
+ export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, };
@@ -0,0 +1,32 @@
1
+ export type TemplateAuthoringVariable = {
2
+ key: string;
3
+ label: string;
4
+ example: string;
5
+ type: string;
6
+ description?: string;
7
+ deprecated?: boolean;
8
+ };
9
+ export type TemplateAuthoringVariableGroup = {
10
+ id: string;
11
+ label: string;
12
+ description?: string;
13
+ variables: TemplateAuthoringVariable[];
14
+ };
15
+ export type TemplateAuthoringSnippet = {
16
+ id: string;
17
+ label: string;
18
+ description: string;
19
+ code: string;
20
+ };
21
+ type ContractTemplateAuthoringHelpProps = {
22
+ variableGroups: TemplateAuthoringVariableGroup[];
23
+ snippets?: TemplateAuthoringSnippet[];
24
+ onInsertVariable?: (variable: TemplateAuthoringVariable) => void;
25
+ onInsertSnippet?: (snippet: TemplateAuthoringSnippet) => void;
26
+ className?: string;
27
+ title?: string;
28
+ description?: string;
29
+ };
30
+ export declare function ContractTemplateAuthoringHelp({ variableGroups, snippets, onInsertVariable, onInsertSnippet, className, title, description, }: ContractTemplateAuthoringHelpProps): import("react/jsx-runtime").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=contract-template-authoring-help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-template-authoring-help.d.ts","sourceRoot":"","sources":["../../src/components/contract-template-authoring-help.tsx"],"names":[],"mappings":"AAYA,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,yBAAyB,EAAE,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,KAAK,kCAAkC,GAAG;IACxC,cAAc,EAAE,8BAA8B,EAAE,CAAA;IAChD,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAA;IACrC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,yBAAyB,KAAK,IAAI,CAAA;IAChE,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,CAAA;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAMD,wBAAgB,6BAA6B,CAAC,EAC5C,cAAc,EACd,QAAa,EACb,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,KAA4B,EAC5B,WAAwH,GACzH,EAAE,kCAAkC,2CA+KpC"}
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { SearchIcon, SparklesIcon } from "lucide-react";
4
+ import * as React from "react";
5
+ import { cn } from "../lib/utils";
6
+ import { Badge } from "./badge";
7
+ import { Button } from "./button";
8
+ import { Input } from "./input";
9
+ import { ScrollArea } from "./scroll-area";
10
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "./tabs";
11
+ function matchesSearch(haystack, query) {
12
+ return haystack.toLowerCase().includes(query);
13
+ }
14
+ export function ContractTemplateAuthoringHelp({ variableGroups, snippets = [], onInsertVariable, onInsertSnippet, className, title = "Template variables", description = "Templates render with Liquid. Use output tags for variables and control tags for loops and conditionals.", }) {
15
+ const [search, setSearch] = React.useState("");
16
+ const normalizedQuery = search.trim().toLowerCase();
17
+ const filteredGroups = React.useMemo(() => {
18
+ if (!normalizedQuery) {
19
+ return variableGroups;
20
+ }
21
+ return variableGroups
22
+ .map((group) => ({
23
+ ...group,
24
+ variables: group.variables.filter((variable) => matchesSearch([variable.key, variable.label, variable.description, variable.example, variable.type]
25
+ .filter(Boolean)
26
+ .join(" "), normalizedQuery)),
27
+ }))
28
+ .filter((group) => group.variables.length > 0);
29
+ }, [normalizedQuery, variableGroups]);
30
+ const filteredSnippets = React.useMemo(() => {
31
+ if (!normalizedQuery) {
32
+ return snippets;
33
+ }
34
+ return snippets.filter((snippet) => matchesSearch([snippet.label, snippet.description, snippet.code].filter(Boolean).join(" "), normalizedQuery));
35
+ }, [normalizedQuery, snippets]);
36
+ return (_jsxs("div", { className: cn("rounded-md border bg-muted/20", className), children: [_jsxs("div", { className: "flex flex-col gap-1 border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(SparklesIcon, { className: "h-4 w-4 text-muted-foreground" }), _jsx("h3", { className: "text-sm font-medium", children: title })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: description })] }), _jsxs(Tabs, { defaultValue: "variables", className: "gap-3 p-4", children: [_jsxs(TabsList, { className: "w-full", children: [_jsx(TabsTrigger, { value: "variables", children: "Variables" }), _jsx(TabsTrigger, { value: "liquid", children: "Liquid" })] }), _jsxs("div", { className: "relative", children: [_jsx(SearchIcon, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: "Search variables or snippets...", className: "pl-9" })] }), _jsx(TabsContent, { value: "variables", children: _jsx(ScrollArea, { className: "h-80", children: _jsx("div", { className: "space-y-4 pr-3", children: filteredGroups.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "No variables match this search." })) : (filteredGroups.map((group) => (_jsxs("section", { className: "space-y-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("h4", { className: "text-sm font-medium", children: group.label }), _jsx(Badge, { variant: "outline", children: group.variables.length })] }), group.description ? (_jsx("p", { className: "text-xs text-muted-foreground", children: group.description })) : null] }), _jsx("div", { className: "space-y-2", children: group.variables.map((variable) => (_jsx("div", { className: "rounded-md border bg-background p-3 shadow-xs", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "text-sm font-medium", children: variable.label }), _jsx(Badge, { variant: "outline", className: "font-normal", children: variable.type })] }), _jsx("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-xs", children: `{{ ${variable.key} }}` }), variable.description ? (_jsx("p", { className: "text-xs text-muted-foreground", children: variable.description })) : null, _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Example:", " ", _jsx("span", { className: "font-mono text-foreground", children: variable.example })] })] }), onInsertVariable ? (_jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: () => onInsertVariable(variable), children: "Insert" })) : null] }) }, variable.key))) })] }, group.id)))) }) }) }), _jsx(TabsContent, { value: "liquid", children: _jsx(ScrollArea, { className: "h-80", children: _jsxs("div", { className: "space-y-3 pr-3", children: [_jsxs("div", { className: "rounded-md border bg-background p-3 text-xs text-muted-foreground", children: ["Use ", _jsx("code", { className: "font-mono text-foreground", children: `{{ ... }}` }), " for output and", " ", _jsx("code", { className: "font-mono text-foreground", children: `{% ... %}` }), " for control flow."] }), filteredSnippets.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "No Liquid snippets match this search." })) : (filteredSnippets.map((snippet) => (_jsxs("div", { className: "rounded-md border bg-background p-3 shadow-xs", children: [_jsxs("div", { className: "mb-2 flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: snippet.label }), _jsx("p", { className: "text-xs text-muted-foreground", children: snippet.description })] }), onInsertSnippet ? (_jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: () => onInsertSnippet(snippet), children: "Insert" })) : null] }), _jsx("pre", { className: "whitespace-pre-wrap rounded-md bg-muted p-3 font-mono text-xs text-foreground", children: snippet.code })] }, snippet.id))))] }) }) })] })] }));
37
+ }
@@ -0,0 +1,9 @@
1
+ export type CountryComboboxProps = {
2
+ value: string | null | undefined;
3
+ onChange: (code: string | null) => void;
4
+ placeholder?: string;
5
+ emptyText?: string;
6
+ disabled?: boolean;
7
+ };
8
+ export declare function CountryCombobox({ value, onChange, placeholder, emptyText, disabled, }: CountryComboboxProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=country-combobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country-combobox.d.ts","sourceRoot":"","sources":["../../src/components/country-combobox.tsx"],"names":[],"mappings":"AAqBA,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,WAAiC,EACjC,SAAiC,EACjC,QAAQ,GACT,EAAE,oBAAoB,2CA+DtB"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { countries } from "@voyantjs/utils/countries";
3
+ import * as React from "react";
4
+ import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, } from "./combobox";
5
+ const COUNTRY_LIST = countries.flat()
6
+ .slice()
7
+ .sort((a, b) => a.name.localeCompare(b.name));
8
+ const COUNTRY_BY_CODE = new Map();
9
+ for (const c of COUNTRY_LIST)
10
+ COUNTRY_BY_CODE.set(c.code, c);
11
+ export function CountryCombobox({ value, onChange, placeholder = "Search countries…", emptyText = "No countries found.", disabled, }) {
12
+ const normalized = value ? value.toUpperCase() : null;
13
+ const selectedLabel = React.useMemo(() => {
14
+ if (!normalized)
15
+ return "";
16
+ const match = COUNTRY_BY_CODE.get(normalized);
17
+ return match ? `${match.name} (${match.code})` : normalized;
18
+ }, [normalized]);
19
+ const [inputValue, setInputValue] = React.useState(selectedLabel);
20
+ React.useEffect(() => {
21
+ setInputValue(selectedLabel);
22
+ }, [selectedLabel]);
23
+ const itemCodes = React.useMemo(() => COUNTRY_LIST.map((c) => c.code), []);
24
+ return (_jsxs(Combobox, { items: itemCodes, value: normalized, inputValue: inputValue, autoHighlight: true, disabled: disabled, itemToStringValue: (code) => {
25
+ const match = COUNTRY_BY_CODE.get(code);
26
+ return match ? `${match.name} (${match.code})` : code;
27
+ }, onInputValueChange: (next) => {
28
+ setInputValue(next);
29
+ if (!next)
30
+ onChange(null);
31
+ }, onValueChange: (next) => {
32
+ const code = next ?? null;
33
+ onChange(code);
34
+ if (code) {
35
+ const match = COUNTRY_BY_CODE.get(code);
36
+ setInputValue(match ? `${match.name} (${match.code})` : code);
37
+ }
38
+ else {
39
+ setInputValue("");
40
+ }
41
+ }, children: [_jsx(ComboboxInput, { placeholder: placeholder, showClear: !!normalized }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: emptyText }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (code) => {
42
+ const country = COUNTRY_BY_CODE.get(code);
43
+ if (!country)
44
+ return null;
45
+ return (_jsx(ComboboxItem, { value: country.code, children: _jsxs("div", { className: "flex min-w-0 flex-1 items-center justify-between gap-2", children: [_jsx("span", { className: "truncate", children: country.name }), _jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: country.code })] }) }, country.code));
46
+ } }) })] })] }));
47
+ }
@@ -0,0 +1,14 @@
1
+ export interface CurrencyComboboxProps {
2
+ value: string | null | undefined;
3
+ onChange: (value: string | null) => void;
4
+ placeholder?: string;
5
+ disabled?: boolean;
6
+ className?: string;
7
+ }
8
+ /**
9
+ * Currency picker backed by the canonical `currencies` list from
10
+ * `@voyantjs/utils`. Trigger displays `CODE (symbol)`; items display
11
+ * `CODE — Name (symbol)`. Searchable across code, name, and symbol.
12
+ */
13
+ export declare function CurrencyCombobox({ value, onChange, placeholder, disabled, className, }: CurrencyComboboxProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=currency-combobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currency-combobox.d.ts","sourceRoot":"","sources":["../../src/components/currency-combobox.tsx"],"names":[],"mappings":"AAkCA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,WAAgC,EAChC,QAAQ,EACR,SAAS,GACV,EAAE,qBAAqB,2CAkEvB"}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { currencies } from "@voyantjs/utils/currencies";
4
+ import * as React from "react";
5
+ import { Combobox, ComboboxCollection, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, } from "./combobox";
6
+ const ALL_CURRENCIES = Object.values(currencies);
7
+ function triggerLabel(record) {
8
+ if (!record)
9
+ return "";
10
+ return `${record.code} (${record.symbol})`;
11
+ }
12
+ function matchesSearch(record, q) {
13
+ const needle = q.toLowerCase();
14
+ return (record.code.toLowerCase().includes(needle) ||
15
+ record.name.toLowerCase().includes(needle) ||
16
+ record.symbol.toLowerCase().includes(needle));
17
+ }
18
+ /**
19
+ * Currency picker backed by the canonical `currencies` list from
20
+ * `@voyantjs/utils`. Trigger displays `CODE (symbol)`; items display
21
+ * `CODE — Name (symbol)`. Searchable across code, name, and symbol.
22
+ */
23
+ export function CurrencyCombobox({ value, onChange, placeholder = "Select currency…", disabled, className, }) {
24
+ const [search, setSearch] = React.useState("");
25
+ const filtered = React.useMemo(() => {
26
+ const q = search.trim();
27
+ if (!q)
28
+ return ALL_CURRENCIES;
29
+ return ALL_CURRENCIES.filter((c) => matchesSearch(c, q));
30
+ }, [search]);
31
+ const selected = value ? currencies[value] : undefined;
32
+ const selectedLabel = triggerLabel(selected);
33
+ const [inputValue, setInputValue] = React.useState(selectedLabel);
34
+ // Keep the input in sync when the selected value changes from the outside.
35
+ React.useEffect(() => {
36
+ setInputValue(selectedLabel);
37
+ }, [selectedLabel]);
38
+ return (_jsxs(Combobox, { items: filtered.map((c) => c.code), value: value ?? null, inputValue: inputValue, autoHighlight: true, disabled: disabled, itemToStringValue: (code) => triggerLabel(currencies[code]), onInputValueChange: (next) => {
39
+ setInputValue(next);
40
+ setSearch(next);
41
+ if (!next)
42
+ onChange(null);
43
+ }, onValueChange: (next) => {
44
+ const code = next ?? null;
45
+ onChange(code);
46
+ setInputValue(code ? triggerLabel(currencies[code]) : "");
47
+ }, children: [_jsx(ComboboxInput, { className: className ?? "w-full", placeholder: placeholder, showClear: Boolean(value) }), _jsxs(ComboboxContent, { children: [_jsx(ComboboxEmpty, { children: "No currencies found." }), _jsx(ComboboxList, { children: _jsx(ComboboxCollection, { children: (code) => {
48
+ const record = currencies[code];
49
+ if (!record)
50
+ return null;
51
+ return (_jsx(ComboboxItem, { value: record.code, children: _jsxs("span", { className: "truncate", children: [_jsx("span", { className: "font-medium", children: record.code }), _jsxs("span", { className: "text-muted-foreground", children: [" ", "\u2014 ", record.name, " (", record.symbol, ")"] })] }) }, record.code));
52
+ } }) })] })] }));
53
+ }
@@ -0,0 +1,66 @@
1
+ import type * as React from "react";
2
+ type DashboardIcon = React.ComponentType<{
3
+ className?: string;
4
+ }>;
5
+ export interface DashboardStatusRow {
6
+ status: string;
7
+ count: number;
8
+ }
9
+ export interface DashboardMonthPoint {
10
+ month: string;
11
+ count: number;
12
+ }
13
+ export interface DashboardCurrencyBreakdown {
14
+ currency: string;
15
+ count: number;
16
+ totalCents: number;
17
+ }
18
+ export interface DashboardRevenuePoint {
19
+ month: string;
20
+ totalCents: number;
21
+ }
22
+ export interface DashboardRevenueSeries {
23
+ currency: string;
24
+ totalCents: number;
25
+ points: DashboardRevenuePoint[];
26
+ }
27
+ export declare function DashboardStatCard({ title, value, description, icon: Icon, isLoading, isError, }: {
28
+ title: string;
29
+ value: number | string | undefined;
30
+ description: string;
31
+ icon: DashboardIcon;
32
+ isLoading: boolean;
33
+ isError: boolean;
34
+ }): import("react/jsx-runtime").JSX.Element;
35
+ export declare function BookingStatusWidget({ rows, isLoading, isError, title, description, }: {
36
+ rows: DashboardStatusRow[];
37
+ isLoading: boolean;
38
+ isError: boolean;
39
+ title?: string;
40
+ description?: string;
41
+ }): import("react/jsx-runtime").JSX.Element;
42
+ export declare function MonthlyBookingsWidget({ points, isLoading, isError, title, description, }: {
43
+ points: DashboardMonthPoint[];
44
+ isLoading: boolean;
45
+ isError: boolean;
46
+ title?: string;
47
+ description?: string;
48
+ }): import("react/jsx-runtime").JSX.Element;
49
+ export declare function RevenueWidget({ series, isLoading, isError, title, description, emptyMessage, }: {
50
+ series: DashboardRevenueSeries | undefined;
51
+ isLoading: boolean;
52
+ isError: boolean;
53
+ title?: string;
54
+ description?: string;
55
+ emptyMessage?: string;
56
+ }): import("react/jsx-runtime").JSX.Element;
57
+ export declare function OutstandingInvoicesWidget({ rows, isLoading, isError, title, description, emptyMessage, }: {
58
+ rows: DashboardCurrencyBreakdown[];
59
+ isLoading: boolean;
60
+ isError: boolean;
61
+ title?: string;
62
+ description?: string;
63
+ emptyMessage?: string;
64
+ }): import("react/jsx-runtime").JSX.Element;
65
+ export {};
66
+ //# sourceMappingURL=dashboard-widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-widgets.d.ts","sourceRoot":"","sources":["../../src/components/dashboard-widgets.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAgBnC,KAAK,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEhE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAChC;AA+BD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,aAAa,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAmBA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,OAAO,EACP,KAAwB,EACxB,WAAyD,GAC1D,EAAE;IACD,IAAI,EAAE,kBAAkB,EAAE,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,2CAwCA;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAA0B,EAC1B,WAAkE,GACnE,EAAE;IACD,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,2CAiCA;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAiB,EACjB,WAA+D,EAC/D,YAAiD,GAClD,EAAE;IACD,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAA;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,2CAkDA;AAED,wBAAgB,yBAAyB,CAAC,EACxC,IAAI,EACJ,SAAS,EACT,OAAO,EACP,KAAiC,EACjC,WAA0D,EAC1D,YAAyC,GAC1C,EAAE;IACD,IAAI,EAAE,0BAA0B,EAAE,CAAA;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,2CAqCA"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Bar, BarChart, CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts";
3
+ import { Card, CardContent, CardHeader, CardTitle } from "./card";
4
+ import { ChartContainer, ChartTooltip, ChartTooltipContent } from "./chart";
5
+ import { Skeleton } from "./skeleton";
6
+ const monthLabelFormatter = new Intl.DateTimeFormat(undefined, { month: "short" });
7
+ const monthlyBookingsChartConfig = {
8
+ bookings: {
9
+ label: "Bookings",
10
+ color: "var(--color-chart-2)",
11
+ },
12
+ };
13
+ function formatMonthLabel(month) {
14
+ return monthLabelFormatter.format(new Date(`${month}-01T00:00:00Z`));
15
+ }
16
+ function formatCurrency(cents, currency) {
17
+ return new Intl.NumberFormat(undefined, {
18
+ style: "currency",
19
+ currency,
20
+ maximumFractionDigits: 0,
21
+ }).format(cents / 100);
22
+ }
23
+ function formatBookingStatus(status) {
24
+ return status.replace(/_/g, " ");
25
+ }
26
+ function buildRevenueChartConfig(currency) {
27
+ return {
28
+ revenue: {
29
+ label: currency,
30
+ color: "var(--color-chart-3)",
31
+ },
32
+ };
33
+ }
34
+ function SectionSkeleton({ height = "h-72" }) {
35
+ return _jsx(Skeleton, { className: `w-full ${height}` });
36
+ }
37
+ export function DashboardStatCard({ title, value, description, icon: Icon, isLoading, isError, }) {
38
+ return (_jsxs(Card, { size: "sm", children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between gap-3", children: [_jsx(CardTitle, { className: "text-sm text-muted-foreground", children: title }), _jsx(Icon, { className: "h-4 w-4 text-muted-foreground" })] }), _jsxs(CardContent, { className: "space-y-1", children: [isLoading ? (_jsx(Skeleton, { className: "h-8 w-20" })) : isError ? (_jsx("div", { className: "text-2xl font-semibold tracking-tight text-muted-foreground", children: "\u2014" })) : (_jsx("div", { className: "text-2xl font-semibold tracking-tight", children: value ?? 0 })), _jsx("p", { className: "text-xs text-muted-foreground", children: isError ? "Failed to load" : description })] })] }));
39
+ }
40
+ export function BookingStatusWidget({ rows, isLoading, isError, title = "Booking Status", description = "Current booking mix across the workspace.", }) {
41
+ const maxCount = rows.reduce((max, row) => Math.max(max, row.count), 0);
42
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: title }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), _jsx(CardContent, { children: isLoading ? (_jsx(SectionSkeleton, { height: "h-64" })) : isError ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load booking status aggregates." })) : (_jsx("div", { className: "space-y-4", children: rows.map((row) => {
43
+ const width = maxCount > 0 ? `${(row.count / maxCount) * 100}%` : "0%";
44
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { className: "capitalize text-muted-foreground", children: formatBookingStatus(row.status) }), _jsx("span", { className: "font-mono text-foreground", children: row.count.toLocaleString() })] }), _jsx("div", { className: "h-2 overflow-hidden rounded-full bg-muted", children: _jsx("div", { className: "h-full rounded-full bg-foreground/70 transition-[width]", style: { width } }) })] }, row.status));
45
+ }) })) })] }));
46
+ }
47
+ export function MonthlyBookingsWidget({ points, isLoading, isError, title = "Monthly Bookings", description = "Booking creation trend across the last six months.", }) {
48
+ const chartData = points.map((point) => ({
49
+ month: formatMonthLabel(point.month),
50
+ bookings: point.count,
51
+ }));
52
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: title }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), _jsx(CardContent, { children: isLoading ? (_jsx(SectionSkeleton, {})) : isError ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load monthly booking aggregates." })) : (_jsx(ChartContainer, { config: monthlyBookingsChartConfig, className: "h-72 w-full", children: _jsxs(BarChart, { data: chartData, accessibilityLayer: true, children: [_jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { allowDecimals: false, tickLine: false, axisLine: false, width: 32 }), _jsx(ChartTooltip, { cursor: false, content: _jsx(ChartTooltipContent, {}) }), _jsx(Bar, { dataKey: "bookings", fill: "var(--color-bookings)", radius: [10, 10, 4, 4] })] }) })) })] }));
53
+ }
54
+ export function RevenueWidget({ series, isLoading, isError, title = "Revenue", description = "Issued invoice totals over the last six months.", emptyMessage = "No invoice revenue recorded yet.", }) {
55
+ const chartData = series?.points.map((point) => ({
56
+ month: formatMonthLabel(point.month),
57
+ revenue: point.totalCents / 100,
58
+ })) ?? [];
59
+ const config = buildRevenueChartConfig(series?.currency ?? title);
60
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center justify-between gap-4 text-base", children: [_jsxs("span", { children: [title, " \u00B7 ", series?.currency ?? "—"] }), !isLoading && !isError && series ? (_jsx("span", { className: "font-mono text-sm text-muted-foreground", children: formatCurrency(series.totalCents, series.currency) })) : null] }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), _jsx(CardContent, { children: isLoading ? (_jsx(SectionSkeleton, { height: "h-64" })) : isError ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load revenue aggregates." })) : !series ? (_jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage })) : (_jsx(ChartContainer, { config: config, className: "h-64 w-full", children: _jsxs(LineChart, { data: chartData, accessibilityLayer: true, children: [_jsx(CartesianGrid, { vertical: false }), _jsx(XAxis, { dataKey: "month", tickLine: false, axisLine: false, tickMargin: 8 }), _jsx(YAxis, { tickLine: false, axisLine: false, width: 48 }), _jsx(ChartTooltip, { cursor: false, content: _jsx(ChartTooltipContent, {}) }), _jsx(Line, { dataKey: "revenue", type: "monotone", stroke: "var(--color-revenue)", strokeWidth: 2.5, dot: false })] }) })) })] }));
61
+ }
62
+ export function OutstandingInvoicesWidget({ rows, isLoading, isError, title = "Outstanding Receivables", description = "Open invoice balances grouped by currency.", emptyMessage = "No outstanding invoices.", }) {
63
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { className: "text-base", children: title }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), _jsx(CardContent, { children: isLoading ? (_jsx(SectionSkeleton, { height: "h-64" })) : isError ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Failed to load receivables." })) : rows.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: emptyMessage })) : (_jsx("div", { className: "space-y-3", children: rows.map((row) => (_jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border border-border/70 px-4 py-3", children: [_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "text-sm font-medium", children: row.currency }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [row.count.toLocaleString(), " open invoice", row.count === 1 ? "" : "s"] })] }), _jsx("div", { className: "text-right font-mono text-sm", children: formatCurrency(row.totalCents, row.currency) })] }, row.currency))) })) })] }));
64
+ }
@@ -0,0 +1,9 @@
1
+ import type { Column } from "@tanstack/react-table";
2
+ type DataTableColumnHeaderProps<TData, TValue> = {
3
+ column: Column<TData, TValue>;
4
+ title: string;
5
+ className?: string;
6
+ };
7
+ export declare function DataTableColumnHeader<TData, TValue>({ column, title, className, }: DataTableColumnHeaderProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=data-table-column-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-column-header.d.ts","sourceRoot":"","sources":["../../src/components/data-table-column-header.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAKnD,KAAK,0BAA0B,CAAC,KAAK,EAAE,MAAM,IAAI;IAC/C,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EACnD,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,2CAwB3C"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
4
+ import { cn } from "../lib/utils";
5
+ import { Button } from "./button";
6
+ export function DataTableColumnHeader({ column, title, className, }) {
7
+ if (!column.getCanSort()) {
8
+ return _jsx("div", { className: cn(className), children: title });
9
+ }
10
+ const sorted = column.getIsSorted();
11
+ return (_jsxs(Button, { variant: "ghost", size: "sm", className: cn("-ml-3 h-8 justify-start", className), onClick: () => column.toggleSorting(sorted === "asc"), children: [_jsx("span", { children: title }), sorted === "asc" ? (_jsx(ArrowUp, { className: "h-4 w-4" })) : sorted === "desc" ? (_jsx(ArrowDown, { className: "h-4 w-4" })) : (_jsx(ArrowUpDown, { className: "h-4 w-4" }))] }));
12
+ }
@@ -0,0 +1,7 @@
1
+ import type { Table } from "@tanstack/react-table";
2
+ type DataTablePaginationProps<TData> = {
3
+ table: Table<TData>;
4
+ };
5
+ export declare function DataTablePagination<TData>({ table }: DataTablePaginationProps<TData>): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=data-table-pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-pagination.d.ts","sourceRoot":"","sources":["../../src/components/data-table-pagination.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAKlD,KAAK,wBAAwB,CAAC,KAAK,IAAI;IACrC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CACpB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,KAAK,CAAC,2CAoCpF"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { ChevronLeft, ChevronRight } from "lucide-react";
4
+ import { Button } from "./button";
5
+ export function DataTablePagination({ table }) {
6
+ const totalRows = table.getPrePaginationRowModel().rows.length;
7
+ const { pageIndex, pageSize } = table.getState().pagination;
8
+ const start = totalRows === 0 ? 0 : pageIndex * pageSize + 1;
9
+ const end = totalRows === 0 ? 0 : Math.min((pageIndex + 1) * pageSize, totalRows);
10
+ return (_jsxs("div", { className: "flex items-center justify-between gap-3 border-t px-4 py-3", children: [_jsxs("p", { className: "text-sm text-muted-foreground", children: ["Showing ", start, "-", end, " of ", totalRows] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("p", { className: "text-sm text-muted-foreground", children: ["Page ", totalRows === 0 ? 0 : pageIndex + 1, " of ", table.getPageCount()] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => table.previousPage(), disabled: !table.getCanPreviousPage(), children: [_jsx(ChevronLeft, { className: "h-4 w-4" }), "Previous"] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => table.nextPage(), disabled: !table.getCanNextPage(), children: ["Next", _jsx(ChevronRight, { className: "h-4 w-4" })] })] })] }));
11
+ }
@@ -0,0 +1,22 @@
1
+ import { type ColumnDef, type OnChangeFn, type Row, type RowSelectionState } from "@tanstack/react-table";
2
+ import * as React from "react";
3
+ type DataTableProps<TData, TValue> = {
4
+ columns: ColumnDef<TData, TValue>[];
5
+ data: TData[];
6
+ onRowClick?: (row: Row<TData>) => void;
7
+ emptyMessage?: string;
8
+ pageSize?: number;
9
+ showPagination?: boolean;
10
+ className?: string;
11
+ enableRowSelection?: boolean;
12
+ rowSelection?: RowSelectionState;
13
+ onRowSelectionChange?: OnChangeFn<RowSelectionState>;
14
+ getRowId?: (originalRow: TData, index: number, parent?: Row<TData>) => string;
15
+ renderSelectionActions?: (context: {
16
+ selectedRows: Row<TData>[];
17
+ clearSelection: () => void;
18
+ }) => React.ReactNode;
19
+ };
20
+ export declare function DataTable<TData, TValue>({ columns, data, onRowClick, emptyMessage, pageSize, showPagination, className, enableRowSelection, rowSelection, onRowSelectionChange, getRowId, renderSelectionActions, }: DataTableProps<TData, TValue>): import("react/jsx-runtime").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=data-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../src/components/data-table.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAKd,KAAK,UAAU,EACf,KAAK,GAAG,EACR,KAAK,iBAAiB,EAGvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,KAAK,cAAc,CAAC,KAAK,EAAE,MAAM,IAAI;IACnC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAA;IACnC,IAAI,EAAE,KAAK,EAAE,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,oBAAoB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAA;IACpD,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,CAAA;IAC7E,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE;QACjC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAA;QAC1B,cAAc,EAAE,MAAM,IAAI,CAAA;KAC3B,KAAK,KAAK,CAAC,SAAS,CAAA;CACtB,CAAA;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EACvC,OAAO,EACP,IAAI,EACJ,UAAU,EACV,YAA4B,EAC5B,QAAa,EACb,cAAqB,EACrB,SAAS,EACT,kBAA0B,EAC1B,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EACR,sBAAsB,GACvB,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,2CA+H/B"}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table";
4
+ import * as React from "react";
5
+ import { cn } from "../lib/utils";
6
+ import { Checkbox } from "./checkbox";
7
+ import { DataTablePagination } from "./data-table-pagination";
8
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "./table";
9
+ export function DataTable({ columns, data, onRowClick, emptyMessage = "No results.", pageSize = 10, showPagination = true, className, enableRowSelection = false, rowSelection, onRowSelectionChange, getRowId, renderSelectionActions, }) {
10
+ const [sorting, setSorting] = React.useState([]);
11
+ const [internalRowSelection, setInternalRowSelection] = React.useState({});
12
+ const resolvedRowSelection = rowSelection ?? internalRowSelection;
13
+ const handleRowSelectionChange = React.useCallback((updater) => {
14
+ if (onRowSelectionChange) {
15
+ onRowSelectionChange(updater);
16
+ return;
17
+ }
18
+ setInternalRowSelection(updater);
19
+ }, [onRowSelectionChange]);
20
+ const selectionColumn = React.useMemo(() => ({
21
+ id: "__select__",
22
+ header: ({ table }) => (_jsx(Checkbox, { "aria-label": "Select all rows on page", checked: table.getIsAllPageRowsSelected(), indeterminate: table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected(), onClickCapture: (event) => event.stopPropagation(), onCheckedChange: (checked) => table.toggleAllPageRowsSelected(checked) })),
23
+ cell: ({ row }) => (_jsx(Checkbox, { "aria-label": "Select row", checked: row.getIsSelected(), indeterminate: row.getIsSomeSelected() && !row.getIsSelected(), onClickCapture: (event) => event.stopPropagation(), onCheckedChange: (checked) => row.toggleSelected(checked) })),
24
+ enableSorting: false,
25
+ enableHiding: false,
26
+ }), []);
27
+ const resolvedColumns = React.useMemo(() => (enableRowSelection ? [selectionColumn, ...columns] : columns), [columns, enableRowSelection, selectionColumn]);
28
+ const table = useReactTable({
29
+ data,
30
+ columns: resolvedColumns,
31
+ initialState: {
32
+ pagination: {
33
+ pageSize,
34
+ },
35
+ },
36
+ enableRowSelection,
37
+ onSortingChange: setSorting,
38
+ onRowSelectionChange: handleRowSelectionChange,
39
+ getCoreRowModel: getCoreRowModel(),
40
+ getPaginationRowModel: getPaginationRowModel(),
41
+ getSortedRowModel: getSortedRowModel(),
42
+ getRowId,
43
+ state: {
44
+ rowSelection: resolvedRowSelection,
45
+ sorting,
46
+ },
47
+ });
48
+ const selectedRows = table.getSelectedRowModel().rows;
49
+ const clearSelection = React.useCallback(() => handleRowSelectionChange({}), [handleRowSelectionChange]);
50
+ return (_jsxs("div", { className: "space-y-3", children: [enableRowSelection && selectedRows.length > 0 && renderSelectionActions
51
+ ? renderSelectionActions({ selectedRows, clearSelection })
52
+ : null, _jsxs("div", { className: cn("overflow-hidden rounded-md border", className), children: [_jsxs(Table, { children: [_jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => (_jsx(TableRow, { children: headerGroup.headers.map((header) => (_jsx(TableHead, { children: header.isPlaceholder
53
+ ? null
54
+ : flexRender(header.column.columnDef.header, header.getContext()) }, header.id))) }, headerGroup.id))) }), _jsx(TableBody, { children: table.getRowModel().rows.length ? (table.getRowModel().rows.map((row) => (_jsx(TableRow, { "data-state": row.getIsSelected() ? "selected" : undefined, onClick: () => onRowClick?.(row), className: cn(onRowClick && "cursor-pointer"), children: row.getVisibleCells().map((cell) => (_jsx(TableCell, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))) }, row.id)))) : (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: resolvedColumns.length, className: "h-24 text-center", children: emptyMessage }) })) })] }), showPagination && table.getPrePaginationRowModel().rows.length > pageSize ? (_jsx(DataTablePagination, { table: table })) : null] })] }));
55
+ }