@customafk/lunas-ui 0.0.13 → 0.0.15

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 (217) hide show
  1. package/dist/{alert-dialog-CQa0TLlF.js → alert-dialog-0KwdjY-6.js} +1 -1
  2. package/dist/{alert-dialog-CQa0TLlF.js.map → alert-dialog-0KwdjY-6.js.map} +1 -1
  3. package/dist/{alert-dialog-D1DFrl-0.cjs → alert-dialog-BQv-ZvW9.cjs} +1 -1
  4. package/dist/{alert-dialog-D1DFrl-0.cjs.map → alert-dialog-BQv-ZvW9.cjs.map} +1 -1
  5. package/dist/{button-O7LPNFsW.d.ts → button-BxGKrlAK.d.cts} +5 -5
  6. package/dist/{button-BAqUUT0m.d.cts → button-DfO-nysU.d.ts} +4 -4
  7. package/dist/{calendar-DaYVxwJx.js → calendar-5D53vIAn.js} +1 -1
  8. package/dist/{calendar-DaYVxwJx.js.map → calendar-5D53vIAn.js.map} +1 -1
  9. package/dist/{calendar-DzAxQqFI.cjs → calendar-CPFb8F_s.cjs} +1 -1
  10. package/dist/{calendar-DzAxQqFI.cjs.map → calendar-CPFb8F_s.cjs.map} +1 -1
  11. package/dist/cards/simple-card.d.ts +2 -2
  12. package/dist/{command-DrdWHvOO.d.cts → command-BVDvol0y.d.ts} +12 -12
  13. package/dist/{command-CzvzZ5v7.d.ts → command-Bha98smQ.d.cts} +12 -12
  14. package/dist/{command-BaCe_FWz.cjs → command-CS4JXTso.cjs} +2 -2
  15. package/dist/{command-BaCe_FWz.cjs.map → command-CS4JXTso.cjs.map} +1 -1
  16. package/dist/{command-DCJja1nB.js → command-LdK9xFuR.js} +2 -2
  17. package/dist/{command-DCJja1nB.js.map → command-LdK9xFuR.js.map} +1 -1
  18. package/dist/data-display/country.d.ts +1 -1
  19. package/dist/data-display/empty.d.cts +2 -2
  20. package/dist/data-display/empty.d.ts +2 -2
  21. package/dist/data-display/role-badge.d.ts +1 -1
  22. package/dist/data-display/statistic.d.cts +2 -2
  23. package/dist/data-display/statistic.d.ts +2 -2
  24. package/dist/{dialog-CH0Dihp0.cjs → dialog-CXZOtc6v.cjs} +1 -1
  25. package/dist/{dialog-CH0Dihp0.cjs.map → dialog-CXZOtc6v.cjs.map} +1 -1
  26. package/dist/{dialog-C0AcPpDH.js → dialog-Cs7JBaly.js} +1 -1
  27. package/dist/{dialog-C0AcPpDH.js.map → dialog-Cs7JBaly.js.map} +1 -1
  28. package/dist/{dialog-DQY1Cjay.d.cts → dialog-V8vypvTg.d.ts} +12 -12
  29. package/dist/{dialog-Ch71L6oE.d.ts → dialog-or3rZjbA.d.cts} +12 -12
  30. package/dist/dialogs/confirm-dialog.cjs +1 -1
  31. package/dist/dialogs/confirm-dialog.js +1 -1
  32. package/dist/dialogs/detail-dialog/component/sidebar.cjs +1 -0
  33. package/dist/dialogs/detail-dialog/component/sidebar.d.cts +166 -0
  34. package/dist/dialogs/detail-dialog/component/sidebar.d.ts +166 -0
  35. package/dist/dialogs/detail-dialog/component/sidebar.js +1 -0
  36. package/dist/dialogs/detail-dialog/index.cjs +1 -1
  37. package/dist/dialogs/detail-dialog/index.cjs.map +1 -1
  38. package/dist/dialogs/detail-dialog/index.js +1 -1
  39. package/dist/dialogs/detail-dialog/index.js.map +1 -1
  40. package/dist/dialogs/error-dialog.cjs +1 -1
  41. package/dist/dialogs/error-dialog.js +1 -1
  42. package/dist/dialogs/form-dialog.cjs +1 -1
  43. package/dist/dialogs/form-dialog.d.cts +2 -2
  44. package/dist/dialogs/form-dialog.d.ts +2 -2
  45. package/dist/dialogs/form-dialog.js +1 -1
  46. package/dist/dialogs/loading-dialog.cjs +1 -1
  47. package/dist/dialogs/loading-dialog.js +1 -1
  48. package/dist/{error-dialog-BTjeT7x-.cjs → error-dialog-DO0Bb-pi.cjs} +2 -2
  49. package/dist/{error-dialog-BTjeT7x-.cjs.map → error-dialog-DO0Bb-pi.cjs.map} +1 -1
  50. package/dist/{error-dialog-DlhosP10.js → error-dialog-D_4WL-Hj.js} +2 -2
  51. package/dist/{error-dialog-DlhosP10.js.map → error-dialog-D_4WL-Hj.js.map} +1 -1
  52. package/dist/{form-wrapper-YPIbD8rh.js → form-wrapper-D-2Uz518.js} +2 -2
  53. package/dist/{form-wrapper-YPIbD8rh.js.map → form-wrapper-D-2Uz518.js.map} +1 -1
  54. package/dist/{form-wrapper-CCqogufb.cjs → form-wrapper-FYiHHas7.cjs} +2 -2
  55. package/dist/{form-wrapper-CCqogufb.cjs.map → form-wrapper-FYiHHas7.cjs.map} +1 -1
  56. package/dist/forms/combobox-field.cjs +2 -2
  57. package/dist/forms/combobox-field.d.cts +2 -2
  58. package/dist/forms/combobox-field.d.ts +2 -2
  59. package/dist/forms/combobox-field.js +2 -2
  60. package/dist/forms/date-field.cjs +1 -1
  61. package/dist/forms/date-field.d.cts +2 -2
  62. package/dist/forms/date-field.d.ts +2 -2
  63. package/dist/forms/date-field.js +1 -1
  64. package/dist/forms/form-wrapper.cjs +1 -1
  65. package/dist/forms/form-wrapper.d.cts +2 -2
  66. package/dist/forms/form-wrapper.d.ts +2 -2
  67. package/dist/forms/form-wrapper.js +1 -1
  68. package/dist/forms/multi-select-field.cjs +1 -1
  69. package/dist/forms/multi-select-field.cjs.map +1 -1
  70. package/dist/forms/multi-select-field.d.cts +2 -2
  71. package/dist/forms/multi-select-field.d.ts +2 -2
  72. package/dist/forms/multi-select-field.js +1 -1
  73. package/dist/forms/number-field.d.cts +2 -2
  74. package/dist/forms/password-field.d.cts +2 -2
  75. package/dist/forms/password-field.d.ts +2 -2
  76. package/dist/forms/select-field.d.cts +2 -2
  77. package/dist/forms/select-field.d.ts +2 -2
  78. package/dist/forms/switch-field.d.cts +2 -2
  79. package/dist/forms/switch-field.d.ts +2 -2
  80. package/dist/forms/text-field.d.cts +2 -2
  81. package/dist/forms/text-field.d.ts +2 -2
  82. package/dist/forms/textarea-field.d.cts +2 -2
  83. package/dist/forms/textarea-field.d.ts +2 -2
  84. package/dist/{input-DhLxB8V-.d.cts → input-D5JvA93S.d.ts} +3 -3
  85. package/dist/{input-cj6Jc1Zj.d.ts → input-DKaoxLd5.d.cts} +3 -3
  86. package/dist/layouts/flex.d.cts +5 -5
  87. package/dist/layouts/flex.d.ts +3 -3
  88. package/dist/layouts/main/index.d.cts +4 -4
  89. package/dist/layouts/main/index.d.ts +4 -4
  90. package/dist/{multi-select-C-r_XSFy.cjs → multi-select-BNh2ezg-.cjs} +2 -2
  91. package/dist/{multi-select-C-r_XSFy.cjs.map → multi-select-BNh2ezg-.cjs.map} +1 -1
  92. package/dist/{multi-select-p5ihXgWH.js → multi-select-B_fLji2s.js} +2 -2
  93. package/dist/{multi-select-p5ihXgWH.js.map → multi-select-B_fLji2s.js.map} +1 -1
  94. package/dist/{popover-tDri6Ded.js → popover-B8j86VQv.js} +1 -1
  95. package/dist/{popover-tDri6Ded.js.map → popover-B8j86VQv.js.map} +1 -1
  96. package/dist/{popover-Ce0OTSQL.cjs → popover-CAokgoc_.cjs} +1 -1
  97. package/dist/{popover-Ce0OTSQL.cjs.map → popover-CAokgoc_.cjs.map} +1 -1
  98. package/dist/{separator-D1cml8sE.d.ts → separator-3ixGRUcJ.d.ts} +3 -3
  99. package/dist/{separator-BsnCT8LX.d.cts → separator-VEGSmnjE.d.cts} +3 -3
  100. package/dist/sidebar-C5aZqfsn.js +2 -0
  101. package/dist/sidebar-C5aZqfsn.js.map +1 -0
  102. package/dist/sidebar-VJZ7s8gb.cjs +2 -0
  103. package/dist/sidebar-VJZ7s8gb.cjs.map +1 -0
  104. package/dist/table/index.d.cts +2 -2
  105. package/dist/table/index.d.ts +2 -2
  106. package/dist/{toggle-CxXbGIf5.d.ts → toggle-BDI6sPOy.d.ts} +3 -3
  107. package/dist/{toggle-DfC247hI.d.cts → toggle-BLlf4Xgl.d.cts} +3 -3
  108. package/dist/{tooltip-DZ2Shzgg.d.ts → tooltip-Bwk4PGVO.d.ts} +6 -6
  109. package/dist/{tooltip-CA4xH6Zd.d.cts → tooltip-etVeWcFC.d.cts} +6 -6
  110. package/dist/{types-CmcNT14g.d.ts → types-0rxiMXBn.d.ts} +1 -1
  111. package/dist/typography/paragraph.d.cts +2 -2
  112. package/dist/typography/paragraph.d.ts +2 -2
  113. package/dist/typography/title.d.cts +2 -2
  114. package/dist/typography/title.d.ts +2 -2
  115. package/dist/ui/alert-dialog.cjs +1 -1
  116. package/dist/ui/alert-dialog.d.cts +12 -12
  117. package/dist/ui/alert-dialog.d.ts +12 -12
  118. package/dist/ui/alert-dialog.js +1 -1
  119. package/dist/ui/alert.d.cts +6 -6
  120. package/dist/ui/alert.d.ts +6 -6
  121. package/dist/ui/aspect-ratio.d.cts +2 -2
  122. package/dist/ui/aspect-ratio.d.ts +2 -2
  123. package/dist/ui/avatar.d.cts +4 -4
  124. package/dist/ui/avatar.d.ts +4 -4
  125. package/dist/ui/badge.d.cts +4 -4
  126. package/dist/ui/badge.d.ts +4 -4
  127. package/dist/ui/breadcrumb.d.cts +8 -8
  128. package/dist/ui/breadcrumb.d.ts +8 -8
  129. package/dist/ui/button.d.cts +1 -1
  130. package/dist/ui/button.d.ts +1 -1
  131. package/dist/ui/calendar.cjs +1 -1
  132. package/dist/ui/calendar.d.cts +4 -4
  133. package/dist/ui/calendar.d.ts +4 -4
  134. package/dist/ui/calendar.js +1 -1
  135. package/dist/ui/card.d.cts +8 -8
  136. package/dist/ui/card.d.ts +8 -8
  137. package/dist/ui/carousel.d.cts +7 -7
  138. package/dist/ui/carousel.d.ts +7 -7
  139. package/dist/ui/collapsible.d.cts +4 -4
  140. package/dist/ui/collapsible.d.ts +4 -4
  141. package/dist/ui/command.cjs +1 -1
  142. package/dist/ui/command.d.cts +2 -2
  143. package/dist/ui/command.d.ts +2 -2
  144. package/dist/ui/command.js +1 -1
  145. package/dist/ui/context-menu.d.cts +16 -16
  146. package/dist/ui/context-menu.d.ts +16 -16
  147. package/dist/ui/dialog.cjs +1 -1
  148. package/dist/ui/dialog.d.cts +1 -1
  149. package/dist/ui/dialog.d.ts +1 -1
  150. package/dist/ui/dialog.js +1 -1
  151. package/dist/ui/dropdown-menu.d.cts +16 -16
  152. package/dist/ui/dropdown-menu.d.ts +16 -16
  153. package/dist/ui/file-uploader.d.cts +2 -2
  154. package/dist/ui/file-uploader.d.ts +2 -2
  155. package/dist/ui/form.d.cts +8 -8
  156. package/dist/ui/form.d.ts +7 -7
  157. package/dist/ui/hover-card.d.cts +4 -4
  158. package/dist/ui/hover-card.d.ts +4 -4
  159. package/dist/ui/input-otp.d.cts +5 -5
  160. package/dist/ui/input-otp.d.ts +5 -5
  161. package/dist/ui/input.d.cts +1 -1
  162. package/dist/ui/input.d.ts +1 -1
  163. package/dist/ui/inputs/search-input.d.cts +1 -1
  164. package/dist/ui/inputs/search-input.d.ts +3 -3
  165. package/dist/ui/label.d.cts +2 -2
  166. package/dist/ui/label.d.ts +2 -2
  167. package/dist/ui/menubar.d.cts +17 -17
  168. package/dist/ui/menubar.d.ts +17 -17
  169. package/dist/ui/multi-select.cjs +1 -1
  170. package/dist/ui/multi-select.d.cts +2 -2
  171. package/dist/ui/multi-select.d.ts +2 -2
  172. package/dist/ui/multi-select.js +1 -1
  173. package/dist/ui/navigation-menu.d.cts +11 -11
  174. package/dist/ui/navigation-menu.d.ts +11 -11
  175. package/dist/ui/pagination.d.cts +9 -9
  176. package/dist/ui/pagination.d.ts +9 -9
  177. package/dist/ui/popover.cjs +1 -1
  178. package/dist/ui/popover.d.cts +5 -5
  179. package/dist/ui/popover.d.ts +5 -5
  180. package/dist/ui/popover.js +1 -1
  181. package/dist/ui/progress.d.cts +2 -2
  182. package/dist/ui/progress.d.ts +2 -2
  183. package/dist/ui/radio-group.d.cts +3 -3
  184. package/dist/ui/radio-group.d.ts +3 -3
  185. package/dist/ui/resizable.d.cts +4 -4
  186. package/dist/ui/resizable.d.ts +4 -4
  187. package/dist/ui/scroll-area.d.cts +3 -3
  188. package/dist/ui/scroll-area.d.ts +3 -3
  189. package/dist/ui/select.d.cts +11 -11
  190. package/dist/ui/select.d.ts +11 -11
  191. package/dist/ui/separator.d.cts +1 -1
  192. package/dist/ui/separator.d.ts +1 -1
  193. package/dist/ui/sheet.d.cts +9 -9
  194. package/dist/ui/sheet.d.ts +9 -9
  195. package/dist/ui/sidebar.d.cts +30 -30
  196. package/dist/ui/sidebar.d.ts +30 -30
  197. package/dist/ui/skeleton.d.cts +2 -2
  198. package/dist/ui/skeleton.d.ts +2 -2
  199. package/dist/ui/slider.d.cts +2 -2
  200. package/dist/ui/slider.d.ts +2 -2
  201. package/dist/ui/sonner.d.cts +2 -2
  202. package/dist/ui/sonner.d.ts +2 -2
  203. package/dist/ui/switch.d.cts +2 -2
  204. package/dist/ui/switch.d.ts +2 -2
  205. package/dist/ui/table.d.cts +9 -9
  206. package/dist/ui/table.d.ts +9 -9
  207. package/dist/ui/tabs.d.cts +5 -5
  208. package/dist/ui/tabs.d.ts +5 -5
  209. package/dist/ui/textarea.d.cts +2 -2
  210. package/dist/ui/textarea.d.ts +2 -2
  211. package/dist/ui/toggle-group.d.cts +4 -4
  212. package/dist/ui/toggle-group.d.ts +4 -4
  213. package/dist/ui/toggle.d.cts +1 -1
  214. package/dist/ui/toggle.d.ts +1 -1
  215. package/dist/ui/tooltip.d.cts +1 -1
  216. package/dist/ui/tooltip.d.ts +1 -1
  217. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["DialogHeader","DialogTitle","DialogDescription","React","open","TooltipProvider","cn","Button","MenuIcon","SlotPrimitive","Tooltip","TooltipTrigger","TooltipContent","DetailDialogMain: React.FC<React.PropsWithChildren>","DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n>","Flex","Title","CalendarIcon","DateDisplay","DetailDialogWrapper: React.FC<React.PropsWithChildren>","DialogContent","DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n>","CatIcon","DetailDialog: React.FC<React.PropsWithChildren<Props>>","Dialog","Flex"],"sources":["../../../packages/components/dialogs/detail-dialog/component/header.tsx","../../../packages/components/dialogs/detail-dialog/component/sidebar.tsx","../../../packages/components/dialogs/detail-dialog/component/main.tsx","../../../packages/components/dialogs/detail-dialog/component/wrapper.tsx","../../../packages/components/dialogs/detail-dialog/index.tsx"],"sourcesContent":["import {\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nexport const DetailDialogHeader = () => {\n return (\n <DialogHeader className=\"sr-only\">\n <DialogTitle className=\"sr-only\"></DialogTitle>\n <DialogDescription className=\"sr-only\"></DialogDescription>\n </DialogHeader>\n );\n};\n","\"use client\"\nimport React from \"react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { MenuIcon } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nconst SIDEBAR_COOKIE_NAME = \"detai_dialog_sidebar_state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"p\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return setOpen((open) => !open);\n }, [setOpen]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper\",\n \"has-data-[variant=inset]:bg-sidebar\",\n \"flex min-h-svh w-full\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { state } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"absolute inset-y-0 z-10 hidden w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className={cn(\n \"flex h-full w-full flex-col\",\n \"group-data-[variant=floating]:border-sidebar-border\",\n \"group-data-[variant=floating]:rounded-lg\",\n \"group-data-[variant=floating]:border\",\n \"group-data-[variant=floating]:shadow-sm\",\n )}\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-10 rounded-full [&_svg]:!size-6\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <MenuIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear sm:flex\",\n \"after:absolute\",\n \"after:inset-y-0\",\n \"after:left-1/2 after:w-0.5\",\n \"hover:after:bg-sidebar-border\",\n \"group-data-[side=left]:-right-4\",\n \"group-data-[side=right]:left-0\",\n \"in-data-[side=left]:cursor-w-resize\",\n \"in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize\",\n \"[[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"group-data-[collapsible=offcanvas]:translate-x-0\",\n \"group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2\",\n \"md:peer-data-[variant=inset]:ml-0\",\n \"md:peer-data-[variant=inset]:rounded-xl\",\n \"md:peer-data-[variant=inset]:shadow-sm\",\n \"md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto\",\n \"group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8\",\n \"group-data-[collapsible=icon]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform\",\n \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute\",\n \"after:-inset-2\",\n \"md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button cursor-pointer flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background border shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n const { state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\"}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring\",\n \"hover:bg-sidebar-accent\",\n \"hover:text-sidebar-accent-foreground\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n showOnHover && \"$group-focus-within/menu-item:opacity-100\",\n showOnHover && \"group-hover/menu-item:opacity-100\",\n showOnHover && \"data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? SlotPrimitive.Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring\",\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden\",\n \"hover:bg-sidebar-accent\",\n \"hover:text-sidebar-accent-foreground\",\n \"active:bg-sidebar-accent\",\n \"active:text-sidebar-accent-foreground\",\n \"focus-visible:ring-2\",\n \"disabled:pointer-events-none\",\n \"disabled:opacity-50\",\n \"aria-disabled:pointer-events-none\",\n \"aria-disabled:opacity-50\",\n \"[&>span:last-child]:truncate\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n \"[&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent\",\n \"data-[active=true]:text-sidebar-accent-foreground\",\n \"group-data-[collapsible=icon]:hidden\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n // eslint-disable-next-line react-refresh/only-export-components\n useSidebar,\n};\n","import { CalendarIcon } from \"lucide-react\";\n\nimport { DateDisplay } from \"@/components/data-display/date\";\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Title } from \"@/components/typography/title\";\n\nimport { SidebarTrigger } from \"./sidebar\";\n\nexport const DetailDialogMain: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <main className=\"relative flex h-full flex-1 flex-col\">\n <div className=\"absolute inset-0 flex size-full flex-col\">{children}</div>\n </main>\n );\n};\n\nexport const DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n> = ({ title, createdAt }) => {\n return (\n <header className=\"relative flex items-start gap-x-2.5 border-b px-2 py-2.5\">\n <SidebarTrigger />\n <Flex vertical align=\"start\" padding=\"none\" className=\"flex-1\">\n <Title level={5}>{title || \"Detail Dialog\"}</Title>\n <Flex padding=\"none\" className=\"text-muted-foreground\">\n <CalendarIcon size={12} />\n {!!createdAt && (\n <DateDisplay showTime showHoliday date={createdAt} format=\"full\" />\n )}\n </Flex>\n </Flex>\n </header>\n );\n};\n","import { DialogContent } from \"@/components/ui/dialog\";\n\nexport const DetailDialogWrapper: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <DialogContent\n className=\"relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]\"\n onInteractOutside={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {children}\n </DialogContent>\n );\n};\n","import { CatIcon } from \"lucide-react\";\n\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Dialog } from \"@/components/ui/dialog\";\n\nimport { DetailDialogHeader } from \"./component/header\";\nimport { DetailDialogMain, DetailDialogMainHeader } from \"./component/main\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from \"./component/sidebar\";\nimport { DetailDialogWrapper } from \"./component/wrapper\";\n\nconst DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n> = ({ title, sidebarFooter, children }) => {\n return (\n <Sidebar collapsible=\"icon\" className=\"hidden border-r md:flex\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" tabIndex={-1}>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <CatIcon size={16} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">\n {title || \"Detail Dialog\"}\n </span>\n <span className=\"truncate text-xs\">Lunas Enterprise</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>{children}</SidebarGroup>\n </SidebarContent>\n {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}\n </Sidebar>\n );\n};\n\ntype Props = {\n open?: boolean;\n isLoading?: boolean;\n sidebarTitle?: string;\n sidebar?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n title: string;\n createdAt: string | Date | number;\n onOpenChange?: (open: boolean) => void | Promise<void>;\n};\nexport const DetailDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n isLoading = false,\n sidebarTitle,\n sidebar,\n sidebarFooter,\n title,\n createdAt,\n onOpenChange,\n children,\n}) => {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DetailDialogWrapper>\n <DetailDialogHeader />\n\n <SidebarProvider className=\"h-full min-h-[85svh] items-start\">\n <DetailDialogSidebar\n title={sidebarTitle}\n sidebarFooter={sidebarFooter}\n >\n {sidebar}\n </DetailDialogSidebar>\n <DetailDialogMain>\n <DetailDialogMainHeader title={title} createdAt={createdAt} />\n {isLoading ? (\n <Flex justify=\"center\" className=\"bg-muted/50 size-full\">\n <div className=\"loader\" />\n </Flex>\n ) : (\n <section className=\"bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm\">\n {children}\n </section>\n )}\n </DetailDialogMain>\n </SidebarProvider>\n </DetailDialogWrapper>\n </Dialog>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["DialogHeader","DialogTitle","DialogDescription","DetailDialogMain: React.FC<React.PropsWithChildren>","DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n>","SidebarTrigger","Flex","Title","CalendarIcon","DateDisplay","DetailDialogWrapper: React.FC<React.PropsWithChildren>","DialogContent","DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n>","Sidebar","SidebarHeader","SidebarMenu","SidebarMenuItem","SidebarMenuButton","CatIcon","SidebarContent","SidebarGroup","SidebarFooter","DetailDialog: React.FC<React.PropsWithChildren<Props>>","Dialog","SidebarProvider","Flex"],"sources":["../../../packages/components/dialogs/detail-dialog/component/header.tsx","../../../packages/components/dialogs/detail-dialog/component/main.tsx","../../../packages/components/dialogs/detail-dialog/component/wrapper.tsx","../../../packages/components/dialogs/detail-dialog/index.tsx"],"sourcesContent":["import {\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nexport const DetailDialogHeader = () => {\n return (\n <DialogHeader className=\"sr-only\">\n <DialogTitle className=\"sr-only\"></DialogTitle>\n <DialogDescription className=\"sr-only\"></DialogDescription>\n </DialogHeader>\n );\n};\n","import { CalendarIcon } from \"lucide-react\";\n\nimport { DateDisplay } from \"@/components/data-display/date\";\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Title } from \"@/components/typography/title\";\n\nimport { SidebarTrigger } from \"./sidebar\";\n\nexport const DetailDialogMain: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <main className=\"relative flex h-full flex-1 flex-col\">\n <div className=\"absolute inset-0 flex size-full flex-col\">{children}</div>\n </main>\n );\n};\n\nexport const DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n> = ({ title, createdAt }) => {\n return (\n <header className=\"relative flex items-start gap-x-2.5 border-b px-2 py-2.5\">\n <SidebarTrigger />\n <Flex vertical align=\"start\" padding=\"none\" className=\"flex-1\">\n <Title level={5}>{title || \"Detail Dialog\"}</Title>\n <Flex padding=\"none\" className=\"text-muted-foreground\">\n <CalendarIcon size={12} />\n {!!createdAt && (\n <DateDisplay showTime showHoliday date={createdAt} format=\"full\" />\n )}\n </Flex>\n </Flex>\n </header>\n );\n};\n","import { DialogContent } from \"@/components/ui/dialog\";\n\nexport const DetailDialogWrapper: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <DialogContent\n className=\"relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]\"\n onInteractOutside={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {children}\n </DialogContent>\n );\n};\n","import { CatIcon } from \"lucide-react\";\n\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Dialog } from \"@/components/ui/dialog\";\n\nimport { DetailDialogHeader } from \"./component/header\";\nimport { DetailDialogMain, DetailDialogMainHeader } from \"./component/main\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from \"./component/sidebar\";\nimport { DetailDialogWrapper } from \"./component/wrapper\";\n\nconst DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n> = ({ title, sidebarFooter, children }) => {\n return (\n <Sidebar collapsible=\"icon\" className=\"hidden border-r md:flex\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" tabIndex={-1}>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <CatIcon size={16} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">\n {title || \"Detail Dialog\"}\n </span>\n <span className=\"truncate text-xs\">Lunas Enterprise</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>{children}</SidebarGroup>\n </SidebarContent>\n {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}\n </Sidebar>\n );\n};\n\ntype Props = {\n open?: boolean;\n isLoading?: boolean;\n sidebarTitle?: string;\n sidebar?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n title: string;\n createdAt: string | Date | number;\n onOpenChange?: (open: boolean) => void | Promise<void>;\n};\nexport const DetailDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n isLoading = false,\n sidebarTitle,\n sidebar,\n sidebarFooter,\n title,\n createdAt,\n onOpenChange,\n children,\n}) => {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DetailDialogWrapper>\n <DetailDialogHeader />\n\n <SidebarProvider className=\"h-full min-h-[85svh] items-start\">\n <DetailDialogSidebar\n title={sidebarTitle}\n sidebarFooter={sidebarFooter}\n >\n {sidebar}\n </DetailDialogSidebar>\n <DetailDialogMain>\n <DetailDialogMainHeader title={title} createdAt={createdAt} />\n {isLoading ? (\n <Flex justify=\"center\" className=\"bg-muted/50 size-full\">\n <div className=\"loader\" />\n </Flex>\n ) : (\n <section className=\"bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm\">\n {children}\n </section>\n )}\n </DetailDialogMain>\n </SidebarProvider>\n </DetailDialogWrapper>\n </Dialog>\n );\n};\n"],"mappings":"ojBAMa,OAET,EAAA,EAAA,MAACA,EAAAA,aAAAA,CAAa,UAAU,qBACtB,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,aACvB,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,UAAU,eCFtBC,GAAuD,CAClE,eAGE,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,iDACd,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,2CAA4C,eAKpDC,GAKR,CAAE,QAAO,gBAEV,EAAA,EAAA,MAAC,SAAA,CAAO,UAAU,sEAChB,EAAA,EAAA,KAACC,EAAAA,eAAAA,KACD,EAAA,EAAA,MAACoB,EAAAA,KAAAA,CAAK,SAAA,GAAS,MAAM,QAAQ,QAAQ,OAAO,UAAU,oBACpD,EAAA,EAAA,KAAClB,EAAAA,MAAAA,CAAM,MAAO,WAAI,GAAS,mBAC3B,EAAA,EAAA,MAACkB,EAAAA,KAAAA,CAAK,QAAQ,OAAO,UAAU,mCAC7B,EAAA,EAAA,KAACjB,EAAAA,aAAAA,CAAa,KAAM,KACnB,CAAC,CAAC,IACD,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,SAAA,GAAS,YAAA,GAAY,KAAM,EAAW,OAAO,kBC9BzDC,GAA0D,CACrE,eAGE,EAAA,EAAA,KAACC,EAAAA,cAAAA,CACC,UAAU,wGACV,kBAAoB,GAAM,CACxB,EAAE,iBACF,EAAE,mBAGH,aCODC,GAED,CAAE,QAAO,gBAAe,eAEzB,EAAA,EAAA,MAACC,EAAAA,QAAAA,CAAQ,YAAY,OAAO,UAAU,qCACpC,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,gBAAAA,CAAAA,UACC,EAAA,EAAA,MAACC,EAAAA,kBAAAA,CAAkB,KAAK,KAAK,SAAU,cACrC,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,gIACb,EAAA,EAAA,KAACC,EAAAA,QAAAA,CAAQ,KAAM,QAEjB,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,yDACb,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,gCACb,GAAS,mBAEZ,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,4BAAmB,kCAM7C,EAAA,EAAA,KAACC,EAAAA,eAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAAc,eAEhB,IAAiB,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAAA,SAAe,OAe3BC,GAA0D,CACrE,OACA,YAAY,GACZ,eACA,UACA,gBACA,QACA,YACA,eACA,eAGE,EAAA,EAAA,KAACC,EAAAA,OAAAA,CAAa,OAAoB,yBAChC,EAAA,EAAA,MAAC,EAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,EAAA,KAED,EAAA,EAAA,MAACC,EAAAA,gBAAAA,CAAgB,UAAU,8CACzB,EAAA,EAAA,KAAC,EAAA,CACC,MAAO,EACQ,yBAEd,KAEH,EAAA,EAAA,MAAC,EAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,EAAA,CAA8B,QAAkB,cAChD,GACC,EAAA,EAAA,KAACC,EAAAA,KAAAA,CAAK,QAAQ,SAAS,UAAU,kCAC/B,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,cAGjB,EAAA,EAAA,KAAC,UAAA,CAAQ,UAAU,8DAChB"}
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../../utils-D9AH0PUV.js";import{Flex as t}from"../../flex-ILvQrYMJ.js";import{DateDisplay as n}from"../../date-BMq_DNsv.js";import{Tooltip as r,TooltipContent as i,TooltipProvider as a,TooltipTrigger as o}from"../../tooltip-mqfVQzkp.js";import{Button as s}from"../../button-Bku3bKv9.js";import{Dialog as c,DialogContent as l,DialogDescription as u,DialogHeader as d,DialogTitle as f}from"../../dialog-C0AcPpDH.js";import"../../input-Dmaq3fzf.js";import{Title as p}from"../../title-CA6PvqiD.js";import"../../separator-DMdqEz29.js";import"../../skeleton-D1_Brnl9.js";import m from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";import{cva as _}from"class-variance-authority";import{Slot as v}from"radix-ui";import{CalendarIcon as y,CatIcon as b,MenuIcon as x}from"lucide-react";const S=()=>g(d,{className:`sr-only`,children:[h(f,{className:`sr-only`}),h(u,{className:`sr-only`})]}),C=m.createContext(null);function w(){let e=m.useContext(C);if(!e)throw Error(`useSidebar must be used within a SidebarProvider.`);return e}function T({defaultOpen:t=!0,open:n,onOpenChange:r,className:i,style:o,children:s,...c}){let[l,u]=m.useState(!1),[d,f]=m.useState(t),p=n??d,g=m.useCallback(e=>{let t=typeof e==`function`?e(p):e;r?r(t):f(t),document.cookie=`detai_dialog_sidebar_state=${t}; path=/; max-age=604800`},[r,p]),_=m.useCallback(()=>g(e=>!e),[g]);m.useEffect(()=>{let e=e=>{e.key===`p`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),_())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[_]);let v=p?`expanded`:`collapsed`,y=m.useMemo(()=>({state:v,open:p,setOpen:g,openMobile:l,setOpenMobile:u,toggleSidebar:_}),[v,p,g,l,u,_]);return h(C.Provider,{value:y,children:h(a,{delayDuration:0,children:h(`div`,{"data-slot":`sidebar-wrapper`,style:{"--sidebar-width":`16rem`,"--sidebar-width-icon":`3rem`,...o},className:e(`group/sidebar-wrapper`,`has-data-[variant=inset]:bg-sidebar`,`flex min-h-svh w-full`,i),...c,children:s})})})}function E({side:t=`left`,variant:n=`sidebar`,collapsible:r=`offcanvas`,className:i,children:a,...o}){let{state:s}=w();return r===`none`?h(`div`,{"data-slot":`sidebar`,className:e(`bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col`,i),...o,children:a}):g(`div`,{className:`group peer text-sidebar-foreground hidden md:block`,"data-state":s,"data-collapsible":s===`collapsed`?r:``,"data-variant":n,"data-side":t,"data-slot":`sidebar`,children:[h(`div`,{"data-slot":`sidebar-gap`,className:e(`relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear`,`group-data-[collapsible=offcanvas]:w-0`,`group-data-[side=right]:rotate-180`,n===`floating`||n===`inset`?`group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon)`)}),h(`div`,{"data-slot":`sidebar-container`,className:e(`absolute inset-y-0 z-10 hidden w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex`,t===`left`?`left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]`:`right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]`,n===`floating`||n===`inset`?`p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]`:`group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l`,i),...o,children:h(`div`,{"data-sidebar":`sidebar`,"data-slot":`sidebar-inner`,className:e(`flex h-full w-full flex-col`,`group-data-[variant=floating]:border-sidebar-border`,`group-data-[variant=floating]:rounded-lg`,`group-data-[variant=floating]:border`,`group-data-[variant=floating]:shadow-sm`),children:a})})]})}function D({className:t,onClick:n,...r}){let{toggleSidebar:i}=w();return g(s,{"data-sidebar":`trigger`,"data-slot":`sidebar-trigger`,variant:`ghost`,size:`icon`,className:e(`size-10 rounded-full [&_svg]:!size-6`,t),onClick:e=>{n?.(e),i()},...r,children:[h(x,{}),h(`span`,{className:`sr-only`,children:`Toggle Sidebar`})]})}function O({className:t,...n}){return h(`div`,{"data-slot":`sidebar-header`,"data-sidebar":`header`,className:e(`flex flex-col gap-2 p-2`,t),...n})}function k({className:t,...n}){return h(`div`,{"data-slot":`sidebar-footer`,"data-sidebar":`footer`,className:e(`flex flex-col gap-2 p-2`,t),...n})}function A({className:t,...n}){return h(`div`,{"data-slot":`sidebar-content`,"data-sidebar":`content`,className:e(`flex min-h-0 flex-1 flex-col gap-2 overflow-auto`,`group-data-[collapsible=icon]:overflow-hidden`,t),...n})}function j({className:t,...n}){return h(`div`,{"data-slot":`sidebar-group`,"data-sidebar":`group`,className:e(`relative flex w-full min-w-0 flex-col p-2`,t),...n})}function M({className:t,...n}){return h(`ul`,{"data-slot":`sidebar-menu`,"data-sidebar":`menu`,className:e(`flex w-full min-w-0 flex-col gap-1`,t),...n})}function N({className:t,...n}){return h(`li`,{"data-slot":`sidebar-menu-item`,"data-sidebar":`menu-item`,className:e(`group/menu-item relative`,t),...n})}const P=_(`peer/menu-button cursor-pointer flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0`,{variants:{variant:{default:`hover:bg-sidebar-accent hover:text-sidebar-accent-foreground`,outline:`bg-background border shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]`},size:{default:`h-8 text-sm`,sm:`h-7 text-xs`,lg:`h-12 text-sm group-data-[collapsible=icon]:p-0!`}},defaultVariants:{variant:`default`,size:`default`}});function F({asChild:t=!1,isActive:n=!1,variant:a=`default`,size:s=`default`,tooltip:c,className:l,...u}){let d=t?v.Slot:`button`,{state:f}=w(),p=h(d,{"data-slot":`sidebar-menu-button`,"data-sidebar":`menu-button`,"data-size":s,"data-active":n,className:e(P({variant:a,size:s}),l),...u});return c?(typeof c==`string`&&(c={children:c}),g(r,{children:[h(o,{asChild:!0,children:p}),h(i,{side:`right`,align:`center`,hidden:f!==`collapsed`,...c})]})):p}const I=({children:e})=>h(`main`,{className:`relative flex h-full flex-1 flex-col`,children:h(`div`,{className:`absolute inset-0 flex size-full flex-col`,children:e})}),L=({title:e,createdAt:r})=>g(`header`,{className:`relative flex items-start gap-x-2.5 border-b px-2 py-2.5`,children:[h(D,{}),g(t,{vertical:!0,align:`start`,padding:`none`,className:`flex-1`,children:[h(p,{level:5,children:e||`Detail Dialog`}),g(t,{padding:`none`,className:`text-muted-foreground`,children:[h(y,{size:12}),!!r&&h(n,{showTime:!0,showHoliday:!0,date:r,format:`full`})]})]})]}),R=({children:e})=>h(l,{className:`relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]`,onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:e}),z=({title:e,sidebarFooter:t,children:n})=>g(E,{collapsible:`icon`,className:`hidden border-r md:flex`,children:[h(O,{children:h(M,{children:h(N,{children:g(F,{size:`lg`,tabIndex:-1,children:[h(`div`,{className:`bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg`,children:h(b,{size:16})}),g(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[h(`span`,{className:`truncate font-medium`,children:e||`Detail Dialog`}),h(`span`,{className:`truncate text-xs`,children:`Lunas Enterprise`})]})]})})})}),h(A,{children:h(j,{children:n})}),t&&h(k,{children:t})]}),B=({open:e,isLoading:n=!1,sidebarTitle:r,sidebar:i,sidebarFooter:a,title:o,createdAt:s,onOpenChange:l,children:u})=>h(c,{open:e,onOpenChange:l,children:g(R,{children:[h(S,{}),g(T,{className:`h-full min-h-[85svh] items-start`,children:[h(z,{title:r,sidebarFooter:a,children:i}),g(I,{children:[h(L,{title:o,createdAt:s}),n?h(t,{justify:`center`,className:`bg-muted/50 size-full`,children:h(`div`,{className:`loader`})}):h(`section`,{className:`bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm`,children:u})]})]})]})});export{B as DetailDialog};
1
+ import"../../utils-D9AH0PUV.js";import{Flex as e}from"../../flex-ILvQrYMJ.js";import{DateDisplay as t}from"../../date-BMq_DNsv.js";import"../../tooltip-mqfVQzkp.js";import"../../button-Bku3bKv9.js";import{Dialog as n,DialogContent as r,DialogDescription as i,DialogHeader as a,DialogTitle as o}from"../../dialog-Cs7JBaly.js";import"../../input-Dmaq3fzf.js";import{Title as s}from"../../title-CA6PvqiD.js";import"../../separator-DMdqEz29.js";import"../../skeleton-D1_Brnl9.js";import{Sidebar as c,SidebarContent as l,SidebarFooter as u,SidebarGroup as d,SidebarHeader as f,SidebarMenu as p,SidebarMenuButton as m,SidebarMenuItem as h,SidebarProvider as g,SidebarTrigger as _}from"../../sidebar-C5aZqfsn.js";import{jsx as v,jsxs as y}from"react/jsx-runtime";import{CalendarIcon as b,CatIcon as x}from"lucide-react";const S=()=>y(a,{className:`sr-only`,children:[v(o,{className:`sr-only`}),v(i,{className:`sr-only`})]}),C=({children:e})=>v(`main`,{className:`relative flex h-full flex-1 flex-col`,children:v(`div`,{className:`absolute inset-0 flex size-full flex-col`,children:e})}),w=({title:n,createdAt:r})=>y(`header`,{className:`relative flex items-start gap-x-2.5 border-b px-2 py-2.5`,children:[v(_,{}),y(e,{vertical:!0,align:`start`,padding:`none`,className:`flex-1`,children:[v(s,{level:5,children:n||`Detail Dialog`}),y(e,{padding:`none`,className:`text-muted-foreground`,children:[v(b,{size:12}),!!r&&v(t,{showTime:!0,showHoliday:!0,date:r,format:`full`})]})]})]}),T=({children:e})=>v(r,{className:`relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]`,onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:e}),E=({title:e,sidebarFooter:t,children:n})=>y(c,{collapsible:`icon`,className:`hidden border-r md:flex`,children:[v(f,{children:v(p,{children:v(h,{children:y(m,{size:`lg`,tabIndex:-1,children:[v(`div`,{className:`bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg`,children:v(x,{size:16})}),y(`div`,{className:`grid flex-1 text-left text-sm leading-tight`,children:[v(`span`,{className:`truncate font-medium`,children:e||`Detail Dialog`}),v(`span`,{className:`truncate text-xs`,children:`Lunas Enterprise`})]})]})})})}),v(l,{children:v(d,{children:n})}),t&&v(u,{children:t})]}),D=({open:t,isLoading:r=!1,sidebarTitle:i,sidebar:a,sidebarFooter:o,title:s,createdAt:c,onOpenChange:l,children:u})=>v(n,{open:t,onOpenChange:l,children:y(T,{children:[v(S,{}),y(g,{className:`h-full min-h-[85svh] items-start`,children:[v(E,{title:i,sidebarFooter:o,children:a}),y(C,{children:[v(w,{title:s,createdAt:c}),r?v(e,{justify:`center`,className:`bg-muted/50 size-full`,children:v(`div`,{className:`loader`})}):v(`section`,{className:`bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm`,children:u})]})]})]})});export{D as DetailDialog};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["open","SlotPrimitive","Tooltip","DetailDialogMain: React.FC<React.PropsWithChildren>","DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n>","DetailDialogWrapper: React.FC<React.PropsWithChildren>","DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n>","DetailDialog: React.FC<React.PropsWithChildren<Props>>","Dialog"],"sources":["../../../packages/components/dialogs/detail-dialog/component/header.tsx","../../../packages/components/dialogs/detail-dialog/component/sidebar.tsx","../../../packages/components/dialogs/detail-dialog/component/main.tsx","../../../packages/components/dialogs/detail-dialog/component/wrapper.tsx","../../../packages/components/dialogs/detail-dialog/index.tsx"],"sourcesContent":["import {\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nexport const DetailDialogHeader = () => {\n return (\n <DialogHeader className=\"sr-only\">\n <DialogTitle className=\"sr-only\"></DialogTitle>\n <DialogDescription className=\"sr-only\"></DialogDescription>\n </DialogHeader>\n );\n};\n","\"use client\"\nimport React from \"react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { MenuIcon } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/lib/utils\";\n\nconst SIDEBAR_COOKIE_NAME = \"detai_dialog_sidebar_state\";\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"p\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return setOpen((open) => !open);\n }, [setOpen]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper\",\n \"has-data-[variant=inset]:bg-sidebar\",\n \"flex min-h-svh w-full\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { state } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"absolute inset-y-0 z-10 hidden w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className={cn(\n \"flex h-full w-full flex-col\",\n \"group-data-[variant=floating]:border-sidebar-border\",\n \"group-data-[variant=floating]:rounded-lg\",\n \"group-data-[variant=floating]:border\",\n \"group-data-[variant=floating]:shadow-sm\",\n )}\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-10 rounded-full [&_svg]:!size-6\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <MenuIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear sm:flex\",\n \"after:absolute\",\n \"after:inset-y-0\",\n \"after:left-1/2 after:w-0.5\",\n \"hover:after:bg-sidebar-border\",\n \"group-data-[side=left]:-right-4\",\n \"group-data-[side=right]:left-0\",\n \"in-data-[side=left]:cursor-w-resize\",\n \"in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize\",\n \"[[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"group-data-[collapsible=offcanvas]:translate-x-0\",\n \"group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2\",\n \"md:peer-data-[variant=inset]:ml-0\",\n \"md:peer-data-[variant=inset]:rounded-xl\",\n \"md:peer-data-[variant=inset]:shadow-sm\",\n \"md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto\",\n \"group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8\",\n \"group-data-[collapsible=icon]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform\",\n \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute\",\n \"after:-inset-2\",\n \"md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button cursor-pointer flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background border shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n const { state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\"}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring\",\n \"hover:bg-sidebar-accent\",\n \"hover:text-sidebar-accent-foreground\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform\",\n \"focus-visible:ring-2\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n showOnHover && \"$group-focus-within/menu-item:opacity-100\",\n showOnHover && \"group-hover/menu-item:opacity-100\",\n showOnHover && \"data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? SlotPrimitive.Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring\",\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden\",\n \"hover:bg-sidebar-accent\",\n \"hover:text-sidebar-accent-foreground\",\n \"active:bg-sidebar-accent\",\n \"active:text-sidebar-accent-foreground\",\n \"focus-visible:ring-2\",\n \"disabled:pointer-events-none\",\n \"disabled:opacity-50\",\n \"aria-disabled:pointer-events-none\",\n \"aria-disabled:opacity-50\",\n \"[&>span:last-child]:truncate\",\n \"[&>svg]:size-4\",\n \"[&>svg]:shrink-0\",\n \"[&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent\",\n \"data-[active=true]:text-sidebar-accent-foreground\",\n \"group-data-[collapsible=icon]:hidden\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n // eslint-disable-next-line react-refresh/only-export-components\n useSidebar,\n};\n","import { CalendarIcon } from \"lucide-react\";\n\nimport { DateDisplay } from \"@/components/data-display/date\";\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Title } from \"@/components/typography/title\";\n\nimport { SidebarTrigger } from \"./sidebar\";\n\nexport const DetailDialogMain: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <main className=\"relative flex h-full flex-1 flex-col\">\n <div className=\"absolute inset-0 flex size-full flex-col\">{children}</div>\n </main>\n );\n};\n\nexport const DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n> = ({ title, createdAt }) => {\n return (\n <header className=\"relative flex items-start gap-x-2.5 border-b px-2 py-2.5\">\n <SidebarTrigger />\n <Flex vertical align=\"start\" padding=\"none\" className=\"flex-1\">\n <Title level={5}>{title || \"Detail Dialog\"}</Title>\n <Flex padding=\"none\" className=\"text-muted-foreground\">\n <CalendarIcon size={12} />\n {!!createdAt && (\n <DateDisplay showTime showHoliday date={createdAt} format=\"full\" />\n )}\n </Flex>\n </Flex>\n </header>\n );\n};\n","import { DialogContent } from \"@/components/ui/dialog\";\n\nexport const DetailDialogWrapper: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <DialogContent\n className=\"relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]\"\n onInteractOutside={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {children}\n </DialogContent>\n );\n};\n","import { CatIcon } from \"lucide-react\";\n\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Dialog } from \"@/components/ui/dialog\";\n\nimport { DetailDialogHeader } from \"./component/header\";\nimport { DetailDialogMain, DetailDialogMainHeader } from \"./component/main\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from \"./component/sidebar\";\nimport { DetailDialogWrapper } from \"./component/wrapper\";\n\nconst DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n> = ({ title, sidebarFooter, children }) => {\n return (\n <Sidebar collapsible=\"icon\" className=\"hidden border-r md:flex\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" tabIndex={-1}>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <CatIcon size={16} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">\n {title || \"Detail Dialog\"}\n </span>\n <span className=\"truncate text-xs\">Lunas Enterprise</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>{children}</SidebarGroup>\n </SidebarContent>\n {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}\n </Sidebar>\n );\n};\n\ntype Props = {\n open?: boolean;\n isLoading?: boolean;\n sidebarTitle?: string;\n sidebar?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n title: string;\n createdAt: string | Date | number;\n onOpenChange?: (open: boolean) => void | Promise<void>;\n};\nexport const DetailDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n isLoading = false,\n sidebarTitle,\n sidebar,\n sidebarFooter,\n title,\n createdAt,\n onOpenChange,\n children,\n}) => {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DetailDialogWrapper>\n <DetailDialogHeader />\n\n <SidebarProvider className=\"h-full min-h-[85svh] items-start\">\n <DetailDialogSidebar\n title={sidebarTitle}\n sidebarFooter={sidebarFooter}\n >\n {sidebar}\n </DetailDialogSidebar>\n <DetailDialogMain>\n <DetailDialogMainHeader title={title} createdAt={createdAt} />\n {isLoading ? (\n <Flex justify=\"center\" className=\"bg-muted/50 size-full\">\n <div className=\"loader\" />\n </Flex>\n ) : (\n <section className=\"bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm\">\n {children}\n </section>\n )}\n </DetailDialogMain>\n </SidebarProvider>\n </DetailDialogWrapper>\n </Dialog>\n );\n};\n"],"mappings":"syBAMA,MAAa,MAET,EAAC,EAAA,CAAa,UAAU,oBACtB,EAAC,EAAA,CAAY,UAAU,YACvB,EAAC,EAAA,CAAkB,UAAU,eCuB7B,EAAiB,EAAM,cAA0C,MAEvE,SAAS,GAAa,CACpB,IAAM,EAAU,EAAM,WAAW,GACjC,GAAI,CAAC,EACH,MAAU,MAAM,qDAGlB,OAAO,EAGT,SAAS,EAAgB,CACvB,cAAc,GACd,KAAM,EACN,aAAc,EACd,YACA,QACA,WACA,GAAG,GAKF,CACD,GAAM,CAAC,EAAY,GAAiB,EAAM,SAAS,IAI7C,CAAC,EAAO,GAAY,EAAM,SAAS,GACnC,EAAO,GAAY,EACnB,EAAU,EAAM,YACnB,GAAmD,CAClD,IAAM,EAAY,OAAO,GAAU,WAAa,EAAM,GAAQ,EAC1D,EACF,EAAY,GAEZ,EAAS,GAIX,SAAS,OAAS,8BAA0B,EAAU,2BAExD,CAAC,EAAa,IAIV,EAAgB,EAAM,gBACnB,EAAS,GAAS,CAACA,GACzB,CAAC,IAGJ,EAAM,cAAgB,CACpB,IAAM,EAAiB,GAAyB,CAE5C,EAAM,MAAQ,MACb,EAAM,SAAW,EAAM,WAExB,EAAM,iBACN,MAKJ,OADA,OAAO,iBAAiB,UAAW,OACtB,OAAO,oBAAoB,UAAW,IAClD,CAAC,IAIJ,IAAM,EAAQ,EAAO,WAAa,YAE5B,EAAe,EAAM,aAClB,CACL,QACA,OACA,UACA,aACA,gBACA,kBAEF,CAAC,EAAO,EAAM,EAAS,EAAY,EAAe,IAGpD,OACE,EAAC,EAAe,SAAA,CAAS,MAAO,WAC9B,EAAC,EAAA,CAAgB,cAAe,WAC9B,EAAC,MAAA,CACC,YAAU,kBACV,MACE,CACE,kBAAmB,QACnB,uBAAwB,OACxB,GAAG,GAGP,UAAW,EACT,wBACA,sCACA,wBACA,GAEF,GAAI,EAEH,iBAOX,SAAS,EAAQ,CACf,OAAO,OACP,UAAU,UACV,cAAc,YACd,YACA,WACA,GAAG,GAKF,CACD,GAAM,CAAE,SAAU,IAiBlB,OAfI,IAAgB,OAEhB,EAAC,MAAA,CACC,YAAU,UACV,UAAW,EACT,8EACA,GAEF,GAAI,EAEH,aAML,EAAC,MAAA,CACC,UAAU,qDACV,aAAY,EACZ,mBAAkB,IAAU,YAAc,EAAc,GACxD,eAAc,EACd,YAAW,EACX,YAAU,oBAGV,EAAC,MAAA,CACC,YAAU,cACV,UAAW,EACT,0FACA,yCACA,qCACA,IAAY,YAAc,IAAY,QAClC,mFACA,4DAGR,EAAC,MAAA,CACC,YAAU,oBACV,UAAW,EACT,oHACA,IAAS,OACL,iFACA,mFAEJ,IAAY,YAAc,IAAY,QAClC,2FACA,0HACJ,GAEF,GAAI,WAEJ,EAAC,MAAA,CACC,eAAa,UACb,YAAU,gBACV,UAAW,EACT,8BACA,sDACA,2CACA,uCACA,2CAGD,kBAOX,SAAS,EAAe,CACtB,YACA,UACA,GAAG,GACmC,CACtC,GAAM,CAAE,iBAAkB,IAE1B,OACE,EAAC,EAAA,CACC,eAAa,UACb,YAAU,kBACV,QAAQ,QACR,KAAK,OACL,UAAW,EAAG,uCAAwC,GACtD,QAAU,GAAU,CAClB,IAAU,GACV,KAEF,GAAI,YAEJ,EAAC,EAAA,IACD,EAAC,OAAA,CAAK,UAAU,mBAAU,sBAwEhC,SAAS,EAAc,CAAE,YAAW,GAAG,GAAsC,CAC3E,OACE,EAAC,MAAA,CACC,YAAU,iBACV,eAAa,SACb,UAAW,EAAG,0BAA2B,GACzC,GAAI,IAKV,SAAS,EAAc,CAAE,YAAW,GAAG,GAAsC,CAC3E,OACE,EAAC,MAAA,CACC,YAAU,iBACV,eAAa,SACb,UAAW,EAAG,0BAA2B,GACzC,GAAI,IAmBV,SAAS,EAAe,CAAE,YAAW,GAAG,GAAsC,CAC5E,OACE,EAAC,MAAA,CACC,YAAU,kBACV,eAAa,UACb,UAAW,EACT,mDACA,gDACA,GAEF,GAAI,IAKV,SAAS,EAAa,CAAE,YAAW,GAAG,GAAsC,CAC1E,OACE,EAAC,MAAA,CACC,YAAU,gBACV,eAAa,QACb,UAAW,EAAG,4CAA6C,GAC3D,GAAI,IAyEV,SAAS,EAAY,CAAE,YAAW,GAAG,GAAqC,CACxE,OACE,EAAC,KAAA,CACC,YAAU,eACV,eAAa,OACb,UAAW,EAAG,qCAAsC,GACpD,GAAI,IAKV,SAAS,EAAgB,CAAE,YAAW,GAAG,GAAqC,CAC5E,OACE,EAAC,KAAA,CACC,YAAU,oBACV,eAAa,YACb,UAAW,EAAG,2BAA4B,GAC1C,GAAI,IAKV,MAAM,EAA4B,EAChC,m0BACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,+DACT,QACE,wLAEJ,KAAM,CACJ,QAAS,cACT,GAAI,cACJ,GAAI,oDAGR,gBAAiB,CACf,QAAS,UACT,KAAM,aAKZ,SAAS,EAAkB,CACzB,UAAU,GACV,WAAW,GACX,UAAU,UACV,OAAO,UACP,UACA,YACA,GAAG,GAK+C,CAClD,IAAM,EAAO,EAAUC,EAAc,KAAO,SACtC,CAAE,SAAU,IAEZ,EACJ,EAAC,EAAA,CACC,YAAU,sBACV,eAAa,cACb,YAAW,EACX,cAAa,EACb,UAAW,EAAG,EAA0B,CAAE,UAAS,SAAS,GAC5D,GAAI,IAcR,OAVK,GAID,OAAO,GAAY,WACrB,EAAU,CACR,SAAU,IAKZ,EAACC,EAAAA,CAAAA,SAAAA,CACC,EAAC,EAAA,CAAe,QAAA,YAAS,IACzB,EAAC,EAAA,CACC,KAAK,QACL,MAAM,SACN,OAAQ,IAAU,YAClB,GAAI,QAhBD,EChgBX,MAAaC,GAAuD,CAClE,cAGE,EAAC,OAAA,CAAK,UAAU,gDACd,EAAC,MAAA,CAAI,UAAU,2CAA4C,eAKpDC,GAKR,CAAE,QAAO,eAEV,EAAC,SAAA,CAAO,UAAU,qEAChB,EAAC,EAAA,IACD,EAAC,EAAA,CAAK,SAAA,GAAS,MAAM,QAAQ,QAAQ,OAAO,UAAU,mBACpD,EAAC,EAAA,CAAM,MAAO,WAAI,GAAS,kBAC3B,EAAC,EAAA,CAAK,QAAQ,OAAO,UAAU,kCAC7B,EAAC,EAAA,CAAa,KAAM,KACnB,CAAC,CAAC,GACD,EAAC,EAAA,CAAY,SAAA,GAAS,YAAA,GAAY,KAAM,EAAW,OAAO,kBC9BzDC,GAA0D,CACrE,cAGE,EAAC,EAAA,CACC,UAAU,wGACV,kBAAoB,GAAM,CACxB,EAAE,iBACF,EAAE,mBAGH,aCODC,GAED,CAAE,QAAO,gBAAe,cAEzB,EAAC,EAAA,CAAQ,YAAY,OAAO,UAAU,oCACpC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,KAAK,KAAK,SAAU,aACrC,EAAC,MAAA,CAAI,UAAU,+HACb,EAAC,EAAA,CAAQ,KAAM,OAEjB,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,OAAA,CAAK,UAAU,gCACb,GAAS,kBAEZ,EAAC,OAAA,CAAK,UAAU,4BAAmB,iCAM7C,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAc,eAEhB,GAAiB,EAAC,EAAA,CAAA,SAAe,OAe3BC,GAA0D,CACrE,OACA,YAAY,GACZ,eACA,UACA,gBACA,QACA,YACA,eACA,cAGE,EAACC,EAAAA,CAAa,OAAoB,wBAChC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,IAED,EAAC,EAAA,CAAgB,UAAU,6CACzB,EAAC,EAAA,CACC,MAAO,EACQ,yBAEd,IAEH,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAA8B,QAAkB,cAChD,EACC,EAAC,EAAA,CAAK,QAAQ,SAAS,UAAU,iCAC/B,EAAC,MAAA,CAAI,UAAU,aAGjB,EAAC,UAAA,CAAQ,UAAU,8DAChB"}
1
+ {"version":3,"file":"index.js","names":["DetailDialogMain: React.FC<React.PropsWithChildren>","DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n>","DetailDialogWrapper: React.FC<React.PropsWithChildren>","DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n>","DetailDialog: React.FC<React.PropsWithChildren<Props>>"],"sources":["../../../packages/components/dialogs/detail-dialog/component/header.tsx","../../../packages/components/dialogs/detail-dialog/component/main.tsx","../../../packages/components/dialogs/detail-dialog/component/wrapper.tsx","../../../packages/components/dialogs/detail-dialog/index.tsx"],"sourcesContent":["import {\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\n\nexport const DetailDialogHeader = () => {\n return (\n <DialogHeader className=\"sr-only\">\n <DialogTitle className=\"sr-only\"></DialogTitle>\n <DialogDescription className=\"sr-only\"></DialogDescription>\n </DialogHeader>\n );\n};\n","import { CalendarIcon } from \"lucide-react\";\n\nimport { DateDisplay } from \"@/components/data-display/date\";\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Title } from \"@/components/typography/title\";\n\nimport { SidebarTrigger } from \"./sidebar\";\n\nexport const DetailDialogMain: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <main className=\"relative flex h-full flex-1 flex-col\">\n <div className=\"absolute inset-0 flex size-full flex-col\">{children}</div>\n </main>\n );\n};\n\nexport const DetailDialogMainHeader: React.FC<\n React.PropsWithChildren<{\n title: string;\n createdAt: string | Date | number;\n }>\n> = ({ title, createdAt }) => {\n return (\n <header className=\"relative flex items-start gap-x-2.5 border-b px-2 py-2.5\">\n <SidebarTrigger />\n <Flex vertical align=\"start\" padding=\"none\" className=\"flex-1\">\n <Title level={5}>{title || \"Detail Dialog\"}</Title>\n <Flex padding=\"none\" className=\"text-muted-foreground\">\n <CalendarIcon size={12} />\n {!!createdAt && (\n <DateDisplay showTime showHoliday date={createdAt} format=\"full\" />\n )}\n </Flex>\n </Flex>\n </header>\n );\n};\n","import { DialogContent } from \"@/components/ui/dialog\";\n\nexport const DetailDialogWrapper: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n return (\n <DialogContent\n className=\"relative h-full max-h-[90svh] overflow-hidden rounded-lg border-none p-0 sm:max-w-[calc(100svw-2rem)]\"\n onInteractOutside={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {children}\n </DialogContent>\n );\n};\n","import { CatIcon } from \"lucide-react\";\n\nimport { Flex } from \"@/components/layouts/flex\";\nimport { Dialog } from \"@/components/ui/dialog\";\n\nimport { DetailDialogHeader } from \"./component/header\";\nimport { DetailDialogMain, DetailDialogMainHeader } from \"./component/main\";\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from \"./component/sidebar\";\nimport { DetailDialogWrapper } from \"./component/wrapper\";\n\nconst DetailDialogSidebar: React.FC<\n React.PropsWithChildren<{ title?: string; sidebarFooter?: React.ReactNode }>\n> = ({ title, sidebarFooter, children }) => {\n return (\n <Sidebar collapsible=\"icon\" className=\"hidden border-r md:flex\">\n <SidebarHeader>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" tabIndex={-1}>\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <CatIcon size={16} />\n </div>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">\n {title || \"Detail Dialog\"}\n </span>\n <span className=\"truncate text-xs\">Lunas Enterprise</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>{children}</SidebarGroup>\n </SidebarContent>\n {sidebarFooter && <SidebarFooter>{sidebarFooter}</SidebarFooter>}\n </Sidebar>\n );\n};\n\ntype Props = {\n open?: boolean;\n isLoading?: boolean;\n sidebarTitle?: string;\n sidebar?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n title: string;\n createdAt: string | Date | number;\n onOpenChange?: (open: boolean) => void | Promise<void>;\n};\nexport const DetailDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n isLoading = false,\n sidebarTitle,\n sidebar,\n sidebarFooter,\n title,\n createdAt,\n onOpenChange,\n children,\n}) => {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DetailDialogWrapper>\n <DetailDialogHeader />\n\n <SidebarProvider className=\"h-full min-h-[85svh] items-start\">\n <DetailDialogSidebar\n title={sidebarTitle}\n sidebarFooter={sidebarFooter}\n >\n {sidebar}\n </DetailDialogSidebar>\n <DetailDialogMain>\n <DetailDialogMainHeader title={title} createdAt={createdAt} />\n {isLoading ? (\n <Flex justify=\"center\" className=\"bg-muted/50 size-full\">\n <div className=\"loader\" />\n </Flex>\n ) : (\n <section className=\"bg-muted/50 relative flex-1 overflow-y-auto inset-shadow-sm\">\n {children}\n </section>\n )}\n </DetailDialogMain>\n </SidebarProvider>\n </DetailDialogWrapper>\n </Dialog>\n );\n};\n"],"mappings":"6yBAMA,MAAa,MAET,EAAC,EAAA,CAAa,UAAU,oBACtB,EAAC,EAAA,CAAY,UAAU,YACvB,EAAC,EAAA,CAAkB,UAAU,eCFtBA,GAAuD,CAClE,cAGE,EAAC,OAAA,CAAK,UAAU,gDACd,EAAC,MAAA,CAAI,UAAU,2CAA4C,eAKpDC,GAKR,CAAE,QAAO,eAEV,EAAC,SAAA,CAAO,UAAU,qEAChB,EAAC,EAAA,IACD,EAAC,EAAA,CAAK,SAAA,GAAS,MAAM,QAAQ,QAAQ,OAAO,UAAU,mBACpD,EAAC,EAAA,CAAM,MAAO,WAAI,GAAS,kBAC3B,EAAC,EAAA,CAAK,QAAQ,OAAO,UAAU,kCAC7B,EAAC,EAAA,CAAa,KAAM,KACnB,CAAC,CAAC,GACD,EAAC,EAAA,CAAY,SAAA,GAAS,YAAA,GAAY,KAAM,EAAW,OAAO,kBC9BzDC,GAA0D,CACrE,cAGE,EAAC,EAAA,CACC,UAAU,wGACV,kBAAoB,GAAM,CACxB,EAAE,iBACF,EAAE,mBAGH,aCODC,GAED,CAAE,QAAO,gBAAe,cAEzB,EAAC,EAAA,CAAQ,YAAY,OAAO,UAAU,oCACpC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,KAAK,KAAK,SAAU,aACrC,EAAC,MAAA,CAAI,UAAU,+HACb,EAAC,EAAA,CAAQ,KAAM,OAEjB,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,OAAA,CAAK,UAAU,gCACb,GAAS,kBAEZ,EAAC,OAAA,CAAK,UAAU,4BAAmB,iCAM7C,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAc,eAEhB,GAAiB,EAAC,EAAA,CAAA,SAAe,OAe3BC,GAA0D,CACrE,OACA,YAAY,GACZ,eACA,UACA,gBACA,QACA,YACA,eACA,cAGE,EAAC,EAAA,CAAa,OAAoB,wBAChC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,IAED,EAAC,EAAA,CAAgB,UAAU,6CACzB,EAAC,EAAA,CACC,MAAO,EACQ,yBAEd,IAEH,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAA8B,QAAkB,cAChD,EACC,EAAC,EAAA,CAAK,QAAQ,SAAS,UAAU,iCAC/B,EAAC,MAAA,CAAI,UAAU,aAGjB,EAAC,UAAA,CAAQ,UAAU,8DAChB"}
@@ -1 +1 @@
1
- const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`),require(`../button-CycE0WzB.cjs`),require(`../alert-dialog-D1DFrl-0.cjs`);const t=require(`../error-dialog-BTjeT7x-.cjs`);exports.ErrorDialog=t.ErrorDialog;
1
+ const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`),require(`../button-CycE0WzB.cjs`),require(`../alert-dialog-BQv-ZvW9.cjs`);const t=require(`../error-dialog-DO0Bb-pi.cjs`);exports.ErrorDialog=t.ErrorDialog;
@@ -1 +1 @@
1
- import"../utils-D9AH0PUV.js";import"../button-Bku3bKv9.js";import"../alert-dialog-CQa0TLlF.js";import{ErrorDialog as e}from"../error-dialog-DlhosP10.js";export{e as ErrorDialog};
1
+ import"../utils-D9AH0PUV.js";import"../button-Bku3bKv9.js";import"../alert-dialog-0KwdjY-6.js";import{ErrorDialog as e}from"../error-dialog-D_4WL-Hj.js";export{e as ErrorDialog};
@@ -1,2 +1,2 @@
1
- const e=require(`../chunk-hhQzssFb.cjs`),t=require(`../utils-DaJ1XZgX.cjs`),n=require(`../button-CycE0WzB.cjs`),r=require(`../dialog-CH0Dihp0.cjs`);require(`../label-i858Jr98.cjs`),require(`../form-C_PCHrpx.cjs`),require(`../alert-dialog-D1DFrl-0.cjs`),require(`../error-dialog-BTjeT7x-.cjs`);const i=require(`../form-wrapper-CCqogufb.cjs`),a=e.__toESM(require(`react/jsx-runtime`)),o=({form:e,open:o,isSubmitting:s=!1,isResetAfterSubmit:c=!0,disableSubmit:l=!1,title:u,description:d,className:f,onOpenChange:p,onSubmit:m,onError:h,onReset:g,children:_})=>(0,a.jsx)(r.Dialog,{open:o,onOpenChange:p,children:(0,a.jsxs)(r.DialogContent,{className:t.cn(`flex flex-col gap-0 border-none p-0`,f),onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:[(0,a.jsxs)(r.DialogHeader,{className:`flex-0 gap-2 border-b px-6 pt-6 pb-4`,children:[(0,a.jsx)(r.DialogTitle,{children:u||`Form Dialog`}),(0,a.jsx)(r.DialogDescription,{children:d||`This is a form dialog where you can add your form elements.`})]}),(0,a.jsxs)(i.FormWrapper,{form:e,isResetAfterSubmit:c,className:`flex flex-1 flex-col overflow-y-auto pt-4`,onSubmit:m,onError:h,children:[(0,a.jsx)(`main`,{className:`flex-1 overflow-y-auto px-6`,children:_}),(0,a.jsxs)(r.DialogFooter,{className:`border-t px-6 pt-4 pb-6`,children:[(0,a.jsx)(n.Button,{tabIndex:-1,type:`button`,variant:`outline`,className:`w-30 rounded-full`,onClick:g,children:`Reset`}),(0,a.jsx)(n.Button,{autoFocus:!0,tabIndex:0,type:`submit`,isLoading:s,disabled:l,className:`w-30 rounded-full`,children:`Xác nhận`})]})]})]})});exports.FormDialog=o;
1
+ const e=require(`../chunk-hhQzssFb.cjs`),t=require(`../utils-DaJ1XZgX.cjs`),n=require(`../button-CycE0WzB.cjs`);require(`../alert-dialog-BQv-ZvW9.cjs`),require(`../error-dialog-DO0Bb-pi.cjs`),require(`../label-i858Jr98.cjs`),require(`../form-C_PCHrpx.cjs`);const r=require(`../form-wrapper-FYiHHas7.cjs`),i=require(`../dialog-CXZOtc6v.cjs`),a=e.__toESM(require(`react/jsx-runtime`)),o=({form:e,open:o,isSubmitting:s=!1,isResetAfterSubmit:c=!0,disableSubmit:l=!1,title:u,description:d,className:f,onOpenChange:p,onSubmit:m,onError:h,onReset:g,children:_})=>(0,a.jsx)(i.Dialog,{open:o,onOpenChange:p,children:(0,a.jsxs)(i.DialogContent,{className:t.cn(`flex flex-col gap-0 border-none p-0`,f),onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:[(0,a.jsxs)(i.DialogHeader,{className:`flex-0 gap-2 border-b px-6 pt-6 pb-4`,children:[(0,a.jsx)(i.DialogTitle,{children:u||`Form Dialog`}),(0,a.jsx)(i.DialogDescription,{children:d||`This is a form dialog where you can add your form elements.`})]}),(0,a.jsxs)(r.FormWrapper,{form:e,isResetAfterSubmit:c,className:`flex flex-1 flex-col overflow-y-auto pt-4`,onSubmit:m,onError:h,children:[(0,a.jsx)(`main`,{className:`flex-1 overflow-y-auto px-6`,children:_}),(0,a.jsxs)(i.DialogFooter,{className:`border-t px-6 pt-4 pb-6`,children:[(0,a.jsx)(n.Button,{tabIndex:-1,type:`button`,variant:`outline`,className:`w-30 rounded-full`,onClick:g,children:`Reset`}),(0,a.jsx)(n.Button,{autoFocus:!0,tabIndex:0,type:`submit`,isLoading:s,disabled:l,className:`w-30 rounded-full`,children:`Xác nhận`})]})]})]})});exports.FormDialog=o;
2
2
  //# sourceMappingURL=form-dialog.cjs.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime12 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime34 from "react/jsx-runtime";
2
2
  import { FieldValues, FormState, SubmitErrorHandler, UseFormProps } from "react-hook-form";
3
3
 
4
4
  //#region packages/components/dialogs/form-dialog.d.ts
@@ -30,7 +30,7 @@ declare const FormDialog: <TFieldValues extends FieldValues = FieldValues>({
30
30
  onError,
31
31
  onReset,
32
32
  children
33
- }: React.PropsWithChildren<Props<TFieldValues>>) => react_jsx_runtime12.JSX.Element;
33
+ }: React.PropsWithChildren<Props<TFieldValues>>) => react_jsx_runtime34.JSX.Element;
34
34
  //#endregion
35
35
  export { FormDialog };
36
36
  //# sourceMappingURL=form-dialog.d.cts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime36 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
2
2
  import { FieldValues, FormState, SubmitErrorHandler, UseFormProps } from "react-hook-form";
3
3
 
4
4
  //#region packages/components/dialogs/form-dialog.d.ts
@@ -30,7 +30,7 @@ declare const FormDialog: <TFieldValues extends FieldValues = FieldValues>({
30
30
  onError,
31
31
  onReset,
32
32
  children
33
- }: React.PropsWithChildren<Props<TFieldValues>>) => react_jsx_runtime36.JSX.Element;
33
+ }: React.PropsWithChildren<Props<TFieldValues>>) => react_jsx_runtime2.JSX.Element;
34
34
  //#endregion
35
35
  export { FormDialog };
36
36
  //# sourceMappingURL=form-dialog.d.ts.map
@@ -1,2 +1,2 @@
1
- import{cn as e}from"../utils-D9AH0PUV.js";import{Button as t}from"../button-Bku3bKv9.js";import{Dialog as n,DialogContent as r,DialogDescription as i,DialogFooter as a,DialogHeader as o,DialogTitle as s}from"../dialog-C0AcPpDH.js";import"../label-Cxbctr6x.js";import"../form-CA4hhSV5.js";import"../alert-dialog-CQa0TLlF.js";import"../error-dialog-DlhosP10.js";import{FormWrapper as c}from"../form-wrapper-YPIbD8rh.js";import{jsx as l,jsxs as u}from"react/jsx-runtime";const d=({form:d,open:f,isSubmitting:p=!1,isResetAfterSubmit:m=!0,disableSubmit:h=!1,title:g,description:_,className:v,onOpenChange:y,onSubmit:b,onError:x,onReset:S,children:C})=>l(n,{open:f,onOpenChange:y,children:u(r,{className:e(`flex flex-col gap-0 border-none p-0`,v),onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:[u(o,{className:`flex-0 gap-2 border-b px-6 pt-6 pb-4`,children:[l(s,{children:g||`Form Dialog`}),l(i,{children:_||`This is a form dialog where you can add your form elements.`})]}),u(c,{form:d,isResetAfterSubmit:m,className:`flex flex-1 flex-col overflow-y-auto pt-4`,onSubmit:b,onError:x,children:[l(`main`,{className:`flex-1 overflow-y-auto px-6`,children:C}),u(a,{className:`border-t px-6 pt-4 pb-6`,children:[l(t,{tabIndex:-1,type:`button`,variant:`outline`,className:`w-30 rounded-full`,onClick:S,children:`Reset`}),l(t,{autoFocus:!0,tabIndex:0,type:`submit`,isLoading:p,disabled:h,className:`w-30 rounded-full`,children:`Xác nhận`})]})]})]})});export{d as FormDialog};
1
+ import{cn as e}from"../utils-D9AH0PUV.js";import{Button as t}from"../button-Bku3bKv9.js";import"../alert-dialog-0KwdjY-6.js";import"../error-dialog-D_4WL-Hj.js";import"../label-Cxbctr6x.js";import"../form-CA4hhSV5.js";import{FormWrapper as n}from"../form-wrapper-D-2Uz518.js";import{Dialog as r,DialogContent as i,DialogDescription as a,DialogFooter as o,DialogHeader as s,DialogTitle as c}from"../dialog-Cs7JBaly.js";import{jsx as l,jsxs as u}from"react/jsx-runtime";const d=({form:d,open:f,isSubmitting:p=!1,isResetAfterSubmit:m=!0,disableSubmit:h=!1,title:g,description:_,className:v,onOpenChange:y,onSubmit:b,onError:x,onReset:S,children:C})=>l(r,{open:f,onOpenChange:y,children:u(i,{className:e(`flex flex-col gap-0 border-none p-0`,v),onInteractOutside:e=>{e.preventDefault(),e.stopPropagation()},children:[u(s,{className:`flex-0 gap-2 border-b px-6 pt-6 pb-4`,children:[l(c,{children:g||`Form Dialog`}),l(a,{children:_||`This is a form dialog where you can add your form elements.`})]}),u(n,{form:d,isResetAfterSubmit:m,className:`flex flex-1 flex-col overflow-y-auto pt-4`,onSubmit:b,onError:x,children:[l(`main`,{className:`flex-1 overflow-y-auto px-6`,children:C}),u(o,{className:`border-t px-6 pt-4 pb-6`,children:[l(t,{tabIndex:-1,type:`button`,variant:`outline`,className:`w-30 rounded-full`,onClick:S,children:`Reset`}),l(t,{autoFocus:!0,tabIndex:0,type:`submit`,isLoading:p,disabled:h,className:`w-30 rounded-full`,children:`Xác nhận`})]})]})]})});export{d as FormDialog};
2
2
  //# sourceMappingURL=form-dialog.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`);const t=require(`../dialog-CH0Dihp0.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=({open:e,onOpenChange:n})=>(0,r.jsx)(t.Dialog,{open:e,onOpenChange:n,children:(0,r.jsxs)(t.DialogContent,{showCloseButton:!1,className:`pointer-events-none border-none bg-transparent shadow-none outline-0 [&>div]:bg-transparent`,children:[(0,r.jsx)(t.DialogTitle,{}),(0,r.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,r.jsx)(`div`,{className:`loader opacity-60`})})]})});exports.LoadingDialog=i;
1
+ const e=require(`../chunk-hhQzssFb.cjs`);require(`../utils-DaJ1XZgX.cjs`);const t=require(`../dialog-CXZOtc6v.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=({open:e,onOpenChange:n})=>(0,r.jsx)(t.Dialog,{open:e,onOpenChange:n,children:(0,r.jsxs)(t.DialogContent,{showCloseButton:!1,className:`pointer-events-none border-none bg-transparent shadow-none outline-0 [&>div]:bg-transparent`,children:[(0,r.jsx)(t.DialogTitle,{}),(0,r.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,r.jsx)(`div`,{className:`loader opacity-60`})})]})});exports.LoadingDialog=i;
2
2
  //# sourceMappingURL=loading-dialog.cjs.map
@@ -1,2 +1,2 @@
1
- import"../utils-D9AH0PUV.js";import{Dialog as e,DialogContent as t,DialogTitle as n}from"../dialog-C0AcPpDH.js";import r from"react";import{jsx as i,jsxs as a}from"react/jsx-runtime";const o=({open:r,onOpenChange:o})=>i(e,{open:r,onOpenChange:o,children:a(t,{showCloseButton:!1,className:`pointer-events-none border-none bg-transparent shadow-none outline-0 [&>div]:bg-transparent`,children:[i(n,{}),i(`div`,{className:`flex items-center justify-center`,children:i(`div`,{className:`loader opacity-60`})})]})});export{o as LoadingDialog};
1
+ import"../utils-D9AH0PUV.js";import{Dialog as e,DialogContent as t,DialogTitle as n}from"../dialog-Cs7JBaly.js";import r from"react";import{jsx as i,jsxs as a}from"react/jsx-runtime";const o=({open:r,onOpenChange:o})=>i(e,{open:r,onOpenChange:o,children:a(t,{showCloseButton:!1,className:`pointer-events-none border-none bg-transparent shadow-none outline-0 [&>div]:bg-transparent`,children:[i(n,{}),i(`div`,{className:`flex items-center justify-center`,children:i(`div`,{className:`loader opacity-60`})})]})});export{o as LoadingDialog};
2
2
  //# sourceMappingURL=loading-dialog.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`./chunk-hhQzssFb.cjs`),t=require(`./alert-dialog-D1DFrl-0.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`lucide-react`)),a=({open:e,title:a,children:o,onOpenChange:s})=>{let c=n.default.useCallback(()=>{s?.(!1)},[s]);return(0,r.jsx)(t.AlertDialog,{open:e,onOpenChange:s,children:(0,r.jsxs)(t.AlertDialogContent,{className:`gap-8 p-4 sm:max-w-md`,children:[(0,r.jsx)(t.AlertDialogHeader,{children:(0,r.jsxs)(`div`,{className:`text-destructive flex flex-col items-center`,children:[(0,r.jsx)(i.AlertTriangleIcon,{size:42}),(0,r.jsx)(t.AlertDialogTitle,{className:`text-xl font-medium`,children:a||`An error occurred`})]})}),o,(0,r.jsx)(t.AlertDialogFooter,{children:(0,r.jsx)(t.AlertDialogAction,{className:`w-28`,onClick:c,children:`Đóng`})})]})})};Object.defineProperty(exports,`ErrorDialog`,{enumerable:!0,get:function(){return a}});
2
- //# sourceMappingURL=error-dialog-BTjeT7x-.cjs.map
1
+ const e=require(`./chunk-hhQzssFb.cjs`),t=require(`./alert-dialog-BQv-ZvW9.cjs`),n=e.__toESM(require(`react`)),r=e.__toESM(require(`react/jsx-runtime`)),i=e.__toESM(require(`lucide-react`)),a=({open:e,title:a,children:o,onOpenChange:s})=>{let c=n.default.useCallback(()=>{s?.(!1)},[s]);return(0,r.jsx)(t.AlertDialog,{open:e,onOpenChange:s,children:(0,r.jsxs)(t.AlertDialogContent,{className:`gap-8 p-4 sm:max-w-md`,children:[(0,r.jsx)(t.AlertDialogHeader,{children:(0,r.jsxs)(`div`,{className:`text-destructive flex flex-col items-center`,children:[(0,r.jsx)(i.AlertTriangleIcon,{size:42}),(0,r.jsx)(t.AlertDialogTitle,{className:`text-xl font-medium`,children:a||`An error occurred`})]})}),o,(0,r.jsx)(t.AlertDialogFooter,{children:(0,r.jsx)(t.AlertDialogAction,{className:`w-28`,onClick:c,children:`Đóng`})})]})})};Object.defineProperty(exports,`ErrorDialog`,{enumerable:!0,get:function(){return a}});
2
+ //# sourceMappingURL=error-dialog-DO0Bb-pi.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-dialog-BTjeT7x-.cjs","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>","React","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertTriangleIcon","AlertDialogTitle","AlertDialogFooter","AlertDialogAction"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { AlertTriangleIcon } from \"lucide-react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\ntype Props = {\n open?: boolean;\n title?: string;\n description?: string;\n onOpenChange?: (open: boolean) => void;\n};\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n title,\n children,\n onOpenChange,\n}) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">\n {title || \"An error occurred\"}\n </AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-28\" onClick={handleClose}>\n Đóng\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"8LAkBaA,GAAyD,CACpE,OACA,QACA,WACA,kBACI,CACJ,IAAM,EAAcC,EAAAA,QAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAkB,OAAoB,yBACrC,EAAA,EAAA,MAACC,EAAAA,mBAAAA,CAAmB,UAAU,mCAC5B,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,yDACb,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,KAAM,MACzB,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,UAAU,+BACzB,GAAS,2BAIf,GACD,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,UAAU,OAAO,QAAS,WAAa"}
1
+ {"version":3,"file":"error-dialog-DO0Bb-pi.cjs","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>","React","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertTriangleIcon","AlertDialogTitle","AlertDialogFooter","AlertDialogAction"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { AlertTriangleIcon } from \"lucide-react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\ntype Props = {\n open?: boolean;\n title?: string;\n description?: string;\n onOpenChange?: (open: boolean) => void;\n};\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n title,\n children,\n onOpenChange,\n}) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">\n {title || \"An error occurred\"}\n </AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-28\" onClick={handleClose}>\n Đóng\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"8LAkBaA,GAAyD,CACpE,OACA,QACA,WACA,kBACI,CACJ,IAAM,EAAcC,EAAAA,QAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAkB,OAAoB,yBACrC,EAAA,EAAA,MAACC,EAAAA,mBAAAA,CAAmB,UAAU,mCAC5B,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,yDACb,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,KAAM,MACzB,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,UAAU,+BACzB,GAAS,2BAIf,GACD,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,kBAAAA,CAAkB,UAAU,OAAO,QAAS,WAAa"}
@@ -1,2 +1,2 @@
1
- import{AlertDialog as e,AlertDialogAction as t,AlertDialogContent as n,AlertDialogFooter as r,AlertDialogHeader as i,AlertDialogTitle as a}from"./alert-dialog-CQa0TLlF.js";import o from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{AlertTriangleIcon as l}from"lucide-react";const u=({open:u,title:d,children:f,onOpenChange:p})=>{let m=o.useCallback(()=>{p?.(!1)},[p]);return s(e,{open:u,onOpenChange:p,children:c(n,{className:`gap-8 p-4 sm:max-w-md`,children:[s(i,{children:c(`div`,{className:`text-destructive flex flex-col items-center`,children:[s(l,{size:42}),s(a,{className:`text-xl font-medium`,children:d||`An error occurred`})]})}),f,s(r,{children:s(t,{className:`w-28`,onClick:m,children:`Đóng`})})]})})};export{u as ErrorDialog};
2
- //# sourceMappingURL=error-dialog-DlhosP10.js.map
1
+ import{AlertDialog as e,AlertDialogAction as t,AlertDialogContent as n,AlertDialogFooter as r,AlertDialogHeader as i,AlertDialogTitle as a}from"./alert-dialog-0KwdjY-6.js";import o from"react";import{jsx as s,jsxs as c}from"react/jsx-runtime";import{AlertTriangleIcon as l}from"lucide-react";const u=({open:u,title:d,children:f,onOpenChange:p})=>{let m=o.useCallback(()=>{p?.(!1)},[p]);return s(e,{open:u,onOpenChange:p,children:c(n,{className:`gap-8 p-4 sm:max-w-md`,children:[s(i,{children:c(`div`,{className:`text-destructive flex flex-col items-center`,children:[s(l,{size:42}),s(a,{className:`text-xl font-medium`,children:d||`An error occurred`})]})}),f,s(r,{children:s(t,{className:`w-28`,onClick:m,children:`Đóng`})})]})})};export{u as ErrorDialog};
2
+ //# sourceMappingURL=error-dialog-D_4WL-Hj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-dialog-DlhosP10.js","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { AlertTriangleIcon } from \"lucide-react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\ntype Props = {\n open?: boolean;\n title?: string;\n description?: string;\n onOpenChange?: (open: boolean) => void;\n};\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n title,\n children,\n onOpenChange,\n}) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">\n {title || \"An error occurred\"}\n </AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-28\" onClick={handleClose}>\n Đóng\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"oSAkBA,MAAaA,GAAyD,CACpE,OACA,QACA,WACA,kBACI,CACJ,IAAM,EAAc,EAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAC,EAAA,CAAkB,OAAoB,wBACrC,EAAC,EAAA,CAAmB,UAAU,kCAC5B,EAAC,EAAA,CAAA,SACC,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,EAAA,CAAkB,KAAM,KACzB,EAAC,EAAA,CAAiB,UAAU,+BACzB,GAAS,2BAIf,EACD,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,UAAU,OAAO,QAAS,WAAa"}
1
+ {"version":3,"file":"error-dialog-D_4WL-Hj.js","names":["ErrorDialog: React.FC<React.PropsWithChildren<Props>>"],"sources":["../packages/components/dialogs/error-dialog.tsx"],"sourcesContent":["import React from \"react\";\nimport { AlertTriangleIcon } from \"lucide-react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"../ui/alert-dialog\";\n\ntype Props = {\n open?: boolean;\n title?: string;\n description?: string;\n onOpenChange?: (open: boolean) => void;\n};\nexport const ErrorDialog: React.FC<React.PropsWithChildren<Props>> = ({\n open,\n title,\n children,\n onOpenChange,\n}) => {\n const handleClose = React.useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent className=\"gap-8 p-4 sm:max-w-md\">\n <AlertDialogHeader>\n <div className=\"text-destructive flex flex-col items-center\">\n <AlertTriangleIcon size={42} />\n <AlertDialogTitle className=\"text-xl font-medium\">\n {title || \"An error occurred\"}\n </AlertDialogTitle>\n </div>\n </AlertDialogHeader>\n {children}\n <AlertDialogFooter>\n <AlertDialogAction className=\"w-28\" onClick={handleClose}>\n Đóng\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n"],"mappings":"oSAkBA,MAAaA,GAAyD,CACpE,OACA,QACA,WACA,kBACI,CACJ,IAAM,EAAc,EAAM,gBAAkB,CAC1C,IAAe,KACd,CAAC,IACJ,OACE,EAAC,EAAA,CAAkB,OAAoB,wBACrC,EAAC,EAAA,CAAmB,UAAU,kCAC5B,EAAC,EAAA,CAAA,SACC,EAAC,MAAA,CAAI,UAAU,wDACb,EAAC,EAAA,CAAkB,KAAM,KACzB,EAAC,EAAA,CAAiB,UAAU,+BACzB,GAAS,2BAIf,EACD,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAkB,UAAU,OAAO,QAAS,WAAa"}
@@ -1,2 +1,2 @@
1
- import{Form as e}from"./form-CA4hhSV5.js";import{ErrorDialog as t}from"./error-dialog-DlhosP10.js";import n from"react";import{Fragment as r,jsx as i,jsxs as a}from"react/jsx-runtime";import{AlertCircleIcon as o}from"lucide-react";import{useForm as s}from"react-hook-form";import{ErrorMessage as c}from"@hookform/error-message";const l=({form:l,isResetAfterSubmit:u=!0,className:d,onSubmit:f,onError:p,onSubcribe:m,children:h})=>{let g=s({...l,criteriaMode:`all`}),{formState:_,reset:v,handleSubmit:y,subscribe:b}=g,{dirtyFields:x}=_,[S,C]=n.useState(!1),w=n.useCallback(e=>{f(e,_,x),u&&v()},[x,_,u,f,v]),T=n.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(p?.(e),C(!0))},[p]);return n.useEffect(()=>{if(!m)return;let e=b({formState:{values:!0},callback:({values:e})=>{m(e)}});return()=>e()},[m,b]),a(e,{...g,children:[i(`form`,{className:d,onSubmit:y(w,T),children:h}),i(t,{open:S,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:C,children:S&&i(r,{children:Object.keys(_.errors).length>0?a(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[i(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),i(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(_.errors).map(([e])=>i(c,{errors:_.errors,name:e,render:({messages:e})=>i(r,{children:e?Object.entries(e).map(([e,t])=>a(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[i(o,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),i(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):i(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};export{l as FormWrapper};
2
- //# sourceMappingURL=form-wrapper-YPIbD8rh.js.map
1
+ import{ErrorDialog as e}from"./error-dialog-D_4WL-Hj.js";import{Form as t}from"./form-CA4hhSV5.js";import n from"react";import{Fragment as r,jsx as i,jsxs as a}from"react/jsx-runtime";import{AlertCircleIcon as o}from"lucide-react";import{useForm as s}from"react-hook-form";import{ErrorMessage as c}from"@hookform/error-message";const l=({form:l,isResetAfterSubmit:u=!0,className:d,onSubmit:f,onError:p,onSubcribe:m,children:h})=>{let g=s({...l,criteriaMode:`all`}),{formState:_,reset:v,handleSubmit:y,subscribe:b}=g,{dirtyFields:x}=_,[S,C]=n.useState(!1),w=n.useCallback(e=>{f(e,_,x),u&&v()},[x,_,u,f,v]),T=n.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(p?.(e),C(!0))},[p]);return n.useEffect(()=>{if(!m)return;let e=b({formState:{values:!0},callback:({values:e})=>{m(e)}});return()=>e()},[m,b]),a(t,{...g,children:[i(`form`,{className:d,onSubmit:y(w,T),children:h}),i(e,{open:S,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:C,children:S&&i(r,{children:Object.keys(_.errors).length>0?a(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[i(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),i(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(_.errors).map(([e])=>i(c,{errors:_.errors,name:e,render:({messages:e})=>i(r,{children:e?Object.entries(e).map(([e,t])=>a(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[i(o,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),i(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):i(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};export{l as FormWrapper};
2
+ //# sourceMappingURL=form-wrapper-D-2Uz518.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-wrapper-YPIbD8rh.js","names":[],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n type FieldValues,\n type FormState,\n type SubmitErrorHandler,\n type SubmitHandler,\n useForm,\n type UseFormProps,\n} from \"react-hook-form\";\nimport { AlertCircleIcon } from \"lucide-react\";\n\nimport type { AnyEntity } from \"@/types\";\nimport { ErrorMessage } from \"@hookform/error-message\";\n\nimport { ErrorDialog } from \"../dialogs/error-dialog\";\nimport { Form } from \"../ui/form\";\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>;\n isResetAfterSubmit?: boolean;\n className?: string;\n onSubmit: (\n data: TFieldValues,\n formState: FormState<FieldValues>,\n dirtyFields: FormState<FieldValues>[\"dirtyFields\"],\n ) => void | Promise<void>;\n onError?: SubmitErrorHandler<TFieldValues>;\n onSubcribe?: (values: TFieldValues) => void;\n};\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: \"all\",\n });\n\n const { formState, reset, handleSubmit, subscribe } = form;\n const { dirtyFields } = formState;\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false);\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields);\n if (isResetAfterSubmit) {\n reset();\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n );\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors);\n if (errorKeys.length === 0) return;\n onError?.(errors);\n setErrorOpen(true);\n },\n [onError],\n );\n\n React.useEffect(() => {\n if (!onSubcribe) return;\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values);\n },\n });\n return () => callback();\n }, [onSubcribe, subscribe]);\n\n return (\n <Form {...form}>\n <form\n className={className}\n onSubmit={handleSubmit(handleFormSubmit, handleFormError)}\n >\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">\n Cảnh báo: Vui lòng kiểm tra các lỗi sau:\n </p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(\n ([type, message]) => {\n return (\n <div\n key={type}\n className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\"\n >\n <AlertCircleIcon\n size={16}\n className=\"text-destructive mt-0.5 min-w-4 flex-0\"\n />\n <p className=\"line-clamp-2 flex-1 text-wrap\">\n {message}\n </p>\n </div>\n );\n },\n )\n : null}\n </>\n );\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n );\n};\n"],"mappings":"wUA8BA,MAAa,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,EAAO,EAAQ,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgB,EAAM,SAAkB,IAEpD,EAAmB,EAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkB,EAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,IAGd,EAAC,EAAA,CAAK,GAAI,YACR,EAAC,OAAA,CACY,YACX,SAAU,EAAa,EAAkB,GAExC,aAEH,EAAC,EAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,GACC,EAAA,EAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,EACtC,EAAC,MAAA,CAAI,UAAU,+CACb,EAAC,IAAA,CAAE,UAAU,uDAA8C,6CAG3D,EAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,KACtC,EAAC,EAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,cAEP,EAAA,EAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KACtB,CAAC,EAAM,KAEJ,EAAC,MAAA,CAEC,UAAU,yFAEV,EAAC,EAAA,CACC,KAAM,GACN,UAAU,2CAEZ,EAAC,IAAA,CAAE,UAAU,yCACV,MARE,IAcb,QAzBL,SAkCb,EAAC,IAAA,CAAE,UAAU,yCAAgC"}
1
+ {"version":3,"file":"form-wrapper-D-2Uz518.js","names":[],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n type FieldValues,\n type FormState,\n type SubmitErrorHandler,\n type SubmitHandler,\n useForm,\n type UseFormProps,\n} from \"react-hook-form\";\nimport { AlertCircleIcon } from \"lucide-react\";\n\nimport type { AnyEntity } from \"@/types\";\nimport { ErrorMessage } from \"@hookform/error-message\";\n\nimport { ErrorDialog } from \"../dialogs/error-dialog\";\nimport { Form } from \"../ui/form\";\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>;\n isResetAfterSubmit?: boolean;\n className?: string;\n onSubmit: (\n data: TFieldValues,\n formState: FormState<FieldValues>,\n dirtyFields: FormState<FieldValues>[\"dirtyFields\"],\n ) => void | Promise<void>;\n onError?: SubmitErrorHandler<TFieldValues>;\n onSubcribe?: (values: TFieldValues) => void;\n};\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: \"all\",\n });\n\n const { formState, reset, handleSubmit, subscribe } = form;\n const { dirtyFields } = formState;\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false);\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields);\n if (isResetAfterSubmit) {\n reset();\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n );\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors);\n if (errorKeys.length === 0) return;\n onError?.(errors);\n setErrorOpen(true);\n },\n [onError],\n );\n\n React.useEffect(() => {\n if (!onSubcribe) return;\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values);\n },\n });\n return () => callback();\n }, [onSubcribe, subscribe]);\n\n return (\n <Form {...form}>\n <form\n className={className}\n onSubmit={handleSubmit(handleFormSubmit, handleFormError)}\n >\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">\n Cảnh báo: Vui lòng kiểm tra các lỗi sau:\n </p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(\n ([type, message]) => {\n return (\n <div\n key={type}\n className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\"\n >\n <AlertCircleIcon\n size={16}\n className=\"text-destructive mt-0.5 min-w-4 flex-0\"\n />\n <p className=\"line-clamp-2 flex-1 text-wrap\">\n {message}\n </p>\n </div>\n );\n },\n )\n : null}\n </>\n );\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n );\n};\n"],"mappings":"wUA8BA,MAAa,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,EAAO,EAAQ,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgB,EAAM,SAAkB,IAEpD,EAAmB,EAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkB,EAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,IAGd,EAAC,EAAA,CAAK,GAAI,YACR,EAAC,OAAA,CACY,YACX,SAAU,EAAa,EAAkB,GAExC,aAEH,EAAC,EAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,GACC,EAAA,EAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,EACtC,EAAC,MAAA,CAAI,UAAU,+CACb,EAAC,IAAA,CAAE,UAAU,uDAA8C,6CAG3D,EAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,KACtC,EAAC,EAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,cAEP,EAAA,EAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KACtB,CAAC,EAAM,KAEJ,EAAC,MAAA,CAEC,UAAU,yFAEV,EAAC,EAAA,CACC,KAAM,GACN,UAAU,2CAEZ,EAAC,IAAA,CAAE,UAAU,yCACV,MARE,IAcb,QAzBL,SAkCb,EAAC,IAAA,CAAE,UAAU,yCAAgC"}
@@ -1,2 +1,2 @@
1
- const e=require(`./chunk-hhQzssFb.cjs`),t=require(`./form-C_PCHrpx.cjs`),n=require(`./error-dialog-BTjeT7x-.cjs`),r=e.__toESM(require(`react`)),i=e.__toESM(require(`react/jsx-runtime`)),a=e.__toESM(require(`lucide-react`)),o=e.__toESM(require(`react-hook-form`)),s=e.__toESM(require(`@hookform/error-message`)),c=({form:e,isResetAfterSubmit:c=!0,className:l,onSubmit:u,onError:d,onSubcribe:f,children:p})=>{let m=(0,o.useForm)({...e,criteriaMode:`all`}),{formState:h,reset:g,handleSubmit:_,subscribe:v}=m,{dirtyFields:y}=h,[b,x]=r.default.useState(!1),S=r.default.useCallback(e=>{u(e,h,y),c&&g()},[y,h,c,u,g]),C=r.default.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(d?.(e),x(!0))},[d]);return r.default.useEffect(()=>{if(!f)return;let e=v({formState:{values:!0},callback:({values:e})=>{f(e)}});return()=>e()},[f,v]),(0,i.jsxs)(t.Form,{...m,children:[(0,i.jsx)(`form`,{className:l,onSubmit:_(S,C),children:p}),(0,i.jsx)(n.ErrorDialog,{open:b,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:x,children:b&&(0,i.jsx)(i.Fragment,{children:Object.keys(h.errors).length>0?(0,i.jsxs)(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),(0,i.jsx)(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(h.errors).map(([e])=>(0,i.jsx)(s.ErrorMessage,{errors:h.errors,name:e,render:({messages:e})=>(0,i.jsx)(i.Fragment,{children:e?Object.entries(e).map(([e,t])=>(0,i.jsxs)(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[(0,i.jsx)(a.AlertCircleIcon,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),(0,i.jsx)(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};Object.defineProperty(exports,`FormWrapper`,{enumerable:!0,get:function(){return c}});
2
- //# sourceMappingURL=form-wrapper-CCqogufb.cjs.map
1
+ const e=require(`./chunk-hhQzssFb.cjs`),t=require(`./error-dialog-DO0Bb-pi.cjs`),n=require(`./form-C_PCHrpx.cjs`),r=e.__toESM(require(`react`)),i=e.__toESM(require(`react/jsx-runtime`)),a=e.__toESM(require(`lucide-react`)),o=e.__toESM(require(`react-hook-form`)),s=e.__toESM(require(`@hookform/error-message`)),c=({form:e,isResetAfterSubmit:c=!0,className:l,onSubmit:u,onError:d,onSubcribe:f,children:p})=>{let m=(0,o.useForm)({...e,criteriaMode:`all`}),{formState:h,reset:g,handleSubmit:_,subscribe:v}=m,{dirtyFields:y}=h,[b,x]=r.default.useState(!1),S=r.default.useCallback(e=>{u(e,h,y),c&&g()},[y,h,c,u,g]),C=r.default.useCallback(e=>{let t=Object.keys(e);t.length!==0&&(d?.(e),x(!0))},[d]);return r.default.useEffect(()=>{if(!f)return;let e=v({formState:{values:!0},callback:({values:e})=>{f(e)}});return()=>e()},[f,v]),(0,i.jsxs)(n.Form,{...m,children:[(0,i.jsx)(`form`,{className:l,onSubmit:_(S,C),children:p}),(0,i.jsx)(t.ErrorDialog,{open:b,title:`Lỗi nhập dữ liệu`,description:`An unexpected error has occurred. Please check the errors below and try again.`,onOpenChange:x,children:b&&(0,i.jsx)(i.Fragment,{children:Object.keys(h.errors).length>0?(0,i.jsxs)(`div`,{className:`flex max-w-100 flex-col gap-2 px-4`,children:[(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm font-semibold`,children:`Cảnh báo: Vui lòng kiểm tra các lỗi sau:`}),(0,i.jsx)(`div`,{className:`flex flex-col space-y-1`,children:Object.entries(h.errors).map(([e])=>(0,i.jsx)(s.ErrorMessage,{errors:h.errors,name:e,render:({messages:e})=>(0,i.jsx)(i.Fragment,{children:e?Object.entries(e).map(([e,t])=>(0,i.jsxs)(`div`,{className:`text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal`,children:[(0,i.jsx)(a.AlertCircleIcon,{size:16,className:`text-destructive mt-0.5 min-w-4 flex-0`}),(0,i.jsx)(`p`,{className:`line-clamp-2 flex-1 text-wrap`,children:t})]},e)):null})},e))})]}):(0,i.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`No errors found.`})})})]})};Object.defineProperty(exports,`FormWrapper`,{enumerable:!0,get:function(){return c}});
2
+ //# sourceMappingURL=form-wrapper-FYiHHas7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-wrapper-CCqogufb.cjs","names":["React","Form","ErrorDialog","ErrorMessage","AlertCircleIcon"],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n type FieldValues,\n type FormState,\n type SubmitErrorHandler,\n type SubmitHandler,\n useForm,\n type UseFormProps,\n} from \"react-hook-form\";\nimport { AlertCircleIcon } from \"lucide-react\";\n\nimport type { AnyEntity } from \"@/types\";\nimport { ErrorMessage } from \"@hookform/error-message\";\n\nimport { ErrorDialog } from \"../dialogs/error-dialog\";\nimport { Form } from \"../ui/form\";\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>;\n isResetAfterSubmit?: boolean;\n className?: string;\n onSubmit: (\n data: TFieldValues,\n formState: FormState<FieldValues>,\n dirtyFields: FormState<FieldValues>[\"dirtyFields\"],\n ) => void | Promise<void>;\n onError?: SubmitErrorHandler<TFieldValues>;\n onSubcribe?: (values: TFieldValues) => void;\n};\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: \"all\",\n });\n\n const { formState, reset, handleSubmit, subscribe } = form;\n const { dirtyFields } = formState;\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false);\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields);\n if (isResetAfterSubmit) {\n reset();\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n );\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors);\n if (errorKeys.length === 0) return;\n onError?.(errors);\n setErrorOpen(true);\n },\n [onError],\n );\n\n React.useEffect(() => {\n if (!onSubcribe) return;\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values);\n },\n });\n return () => callback();\n }, [onSubcribe, subscribe]);\n\n return (\n <Form {...form}>\n <form\n className={className}\n onSubmit={handleSubmit(handleFormSubmit, handleFormError)}\n >\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">\n Cảnh báo: Vui lòng kiểm tra các lỗi sau:\n </p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(\n ([type, message]) => {\n return (\n <div\n key={type}\n className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\"\n >\n <AlertCircleIcon\n size={16}\n className=\"text-destructive mt-0.5 min-w-4 flex-0\"\n />\n <p className=\"line-clamp-2 flex-1 text-wrap\">\n {message}\n </p>\n </div>\n );\n },\n )\n : null}\n </>\n );\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n );\n};\n"],"mappings":"uTA8Ba,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,GAAA,EAAA,EAAA,SAAe,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgBA,EAAAA,QAAM,SAAkB,IAEpD,EAAmBA,EAAAA,QAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkBA,EAAAA,QAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAA,QAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,KAGd,EAAA,EAAA,MAACC,EAAAA,KAAAA,CAAK,GAAI,aACR,EAAA,EAAA,KAAC,OAAA,CACY,YACX,SAAU,EAAa,EAAkB,GAExC,cAEH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,IACC,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,GACtC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,gDACb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,uDAA8C,8CAG3D,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,MACtC,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,eAEP,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KACtB,CAAC,EAAM,MAEJ,EAAA,EAAA,MAAC,MAAA,CAEC,UAAU,0FAEV,EAAA,EAAA,KAACC,EAAAA,gBAAAA,CACC,KAAM,GACN,UAAU,4CAEZ,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCACV,MARE,IAcb,QAzBL,UAkCb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCAAgC"}
1
+ {"version":3,"file":"form-wrapper-FYiHHas7.cjs","names":["React","Form","ErrorDialog","ErrorMessage","AlertCircleIcon"],"sources":["../packages/components/forms/form-wrapper.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n type FieldValues,\n type FormState,\n type SubmitErrorHandler,\n type SubmitHandler,\n useForm,\n type UseFormProps,\n} from \"react-hook-form\";\nimport { AlertCircleIcon } from \"lucide-react\";\n\nimport type { AnyEntity } from \"@/types\";\nimport { ErrorMessage } from \"@hookform/error-message\";\n\nimport { ErrorDialog } from \"../dialogs/error-dialog\";\nimport { Form } from \"../ui/form\";\n\ntype Props<TFieldValues extends FieldValues = FieldValues> = {\n form: UseFormProps<TFieldValues>;\n isResetAfterSubmit?: boolean;\n className?: string;\n onSubmit: (\n data: TFieldValues,\n formState: FormState<FieldValues>,\n dirtyFields: FormState<FieldValues>[\"dirtyFields\"],\n ) => void | Promise<void>;\n onError?: SubmitErrorHandler<TFieldValues>;\n onSubcribe?: (values: TFieldValues) => void;\n};\n\nexport const FormWrapper = <TFieldValues extends FieldValues = FieldValues>({\n form: FormConfig,\n isResetAfterSubmit = true,\n className,\n onSubmit,\n onError,\n onSubcribe,\n children,\n}: React.PropsWithChildren<Props<TFieldValues>>) => {\n const form = useForm({\n ...FormConfig,\n criteriaMode: \"all\",\n });\n\n const { formState, reset, handleSubmit, subscribe } = form;\n const { dirtyFields } = formState;\n\n const [errorOpen, setErrorOpen] = React.useState<boolean>(false);\n\n const handleFormSubmit = React.useCallback<SubmitHandler<TFieldValues>>(\n (data) => {\n onSubmit(data, formState, dirtyFields);\n if (isResetAfterSubmit) {\n reset();\n }\n },\n [dirtyFields, formState, isResetAfterSubmit, onSubmit, reset],\n );\n\n const handleFormError = React.useCallback<SubmitErrorHandler<TFieldValues>>(\n (errors) => {\n const errorKeys = Object.keys(errors);\n if (errorKeys.length === 0) return;\n onError?.(errors);\n setErrorOpen(true);\n },\n [onError],\n );\n\n React.useEffect(() => {\n if (!onSubcribe) return;\n const callback = subscribe({\n formState: { values: true },\n callback: ({ values }) => {\n onSubcribe(values);\n },\n });\n return () => callback();\n }, [onSubcribe, subscribe]);\n\n return (\n <Form {...form}>\n <form\n className={className}\n onSubmit={handleSubmit(handleFormSubmit, handleFormError)}\n >\n {children}\n </form>\n <ErrorDialog\n open={errorOpen}\n title=\"Lỗi nhập dữ liệu\"\n description=\"An unexpected error has occurred. Please check the errors below and try again.\"\n onOpenChange={setErrorOpen}\n >\n {errorOpen && (\n <>\n {Object.keys(formState.errors).length > 0 ? (\n <div className=\"flex max-w-100 flex-col gap-2 px-4\">\n <p className=\"text-muted-foreground text-sm font-semibold\">\n Cảnh báo: Vui lòng kiểm tra các lỗi sau:\n </p>\n <div className=\"flex flex-col space-y-1\">\n {Object.entries(formState.errors).map(([key]) => (\n <ErrorMessage\n key={key}\n errors={formState.errors}\n name={key as AnyEntity}\n render={({ messages }) => {\n return (\n <>\n {messages\n ? Object.entries(messages).map(\n ([type, message]) => {\n return (\n <div\n key={type}\n className=\"text-accent-foreground flex items-start gap-x-1 truncate text-sm font-normal\"\n >\n <AlertCircleIcon\n size={16}\n className=\"text-destructive mt-0.5 min-w-4 flex-0\"\n />\n <p className=\"line-clamp-2 flex-1 text-wrap\">\n {message}\n </p>\n </div>\n );\n },\n )\n : null}\n </>\n );\n }}\n />\n ))}\n </div>\n </div>\n ) : (\n <p className=\"text-muted-foreground text-sm\">No errors found.</p>\n )}\n </>\n )}\n </ErrorDialog>\n </Form>\n );\n};\n"],"mappings":"uTA8Ba,GAA+D,CAC1E,KAAM,EACN,qBAAqB,GACrB,YACA,WACA,UACA,aACA,cACkD,CAClD,IAAM,GAAA,EAAA,EAAA,SAAe,CACnB,GAAG,EACH,aAAc,QAGV,CAAE,YAAW,QAAO,eAAc,aAAc,EAChD,CAAE,eAAgB,EAElB,CAAC,EAAW,GAAgBA,EAAAA,QAAM,SAAkB,IAEpD,EAAmBA,EAAAA,QAAM,YAC5B,GAAS,CACR,EAAS,EAAM,EAAW,GACtB,GACF,KAGJ,CAAC,EAAa,EAAW,EAAoB,EAAU,IAGnD,EAAkBA,EAAAA,QAAM,YAC3B,GAAW,CACV,IAAM,EAAY,OAAO,KAAK,GAC1B,EAAU,SAAW,IACzB,IAAU,GACV,EAAa,MAEf,CAAC,IAcH,OAXA,EAAA,QAAM,cAAgB,CACpB,GAAI,CAAC,EAAY,OACjB,IAAM,EAAW,EAAU,CACzB,UAAW,CAAE,OAAQ,IACrB,UAAW,CAAE,YAAa,CACxB,EAAW,MAGf,UAAa,KACZ,CAAC,EAAY,KAGd,EAAA,EAAA,MAACC,EAAAA,KAAAA,CAAK,GAAI,aACR,EAAA,EAAA,KAAC,OAAA,CACY,YACX,SAAU,EAAa,EAAkB,GAExC,cAEH,EAAA,EAAA,KAACC,EAAAA,YAAAA,CACC,KAAM,EACN,MAAM,mBACN,YAAY,iFACZ,aAAc,WAEb,IACC,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,OAAO,KAAK,EAAU,QAAQ,OAAS,GACtC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,gDACb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,uDAA8C,8CAG3D,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,mCACZ,OAAO,QAAQ,EAAU,QAAQ,KAAK,CAAC,MACtC,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAEC,OAAQ,EAAU,OAClB,KAAM,EACN,QAAS,CAAE,eAEP,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,SACG,EACG,OAAO,QAAQ,GAAU,KACtB,CAAC,EAAM,MAEJ,EAAA,EAAA,MAAC,MAAA,CAEC,UAAU,0FAEV,EAAA,EAAA,KAACC,EAAAA,gBAAAA,CACC,KAAM,GACN,UAAU,4CAEZ,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCACV,MARE,IAcb,QAzBL,UAkCb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,yCAAgC"}