@etus/ui 0.4.0-beta.6 → 0.4.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-2Y7PQ6ZL.js → chunk-237TQKWH.js} +4 -4
- package/dist/{chunk-2Y7PQ6ZL.js.map → chunk-237TQKWH.js.map} +1 -1
- package/dist/{chunk-KR3IVNQH.js → chunk-2FJJOHHH.js} +16 -10
- package/dist/chunk-2FJJOHHH.js.map +1 -0
- package/dist/{chunk-W4NC5CU5.js → chunk-2Q4I4VDB.js} +4 -4
- package/dist/{chunk-W4NC5CU5.js.map → chunk-2Q4I4VDB.js.map} +1 -1
- package/dist/{chunk-2HM5Z2YP.js → chunk-2YWWZEPE.js} +3 -3
- package/dist/{chunk-2HM5Z2YP.js.map → chunk-2YWWZEPE.js.map} +1 -1
- package/dist/chunk-2Z722V5K.js +231 -0
- package/dist/chunk-2Z722V5K.js.map +1 -0
- package/dist/chunk-37IIHQP4.js +233 -0
- package/dist/chunk-37IIHQP4.js.map +1 -0
- package/dist/{chunk-UFRMZ3M6.js → chunk-3JCV72FO.js} +6 -2
- package/dist/chunk-3JCV72FO.js.map +1 -0
- package/dist/{chunk-HT5XM6XK.js → chunk-43BS3PPX.js} +3 -3
- package/dist/{chunk-HT5XM6XK.js.map → chunk-43BS3PPX.js.map} +1 -1
- package/dist/{chunk-2UGDLAYC.js → chunk-45D4O7RK.js} +10 -3
- package/dist/chunk-45D4O7RK.js.map +1 -0
- package/dist/{chunk-32IJQOUV.js → chunk-4EYYCHLD.js} +4 -4
- package/dist/{chunk-32IJQOUV.js.map → chunk-4EYYCHLD.js.map} +1 -1
- package/dist/{chunk-J62TFQHR.js → chunk-5I7AXWJU.js} +13 -13
- package/dist/chunk-5I7AXWJU.js.map +1 -0
- package/dist/{chunk-65YSTUD2.js → chunk-5SUD32RK.js} +44 -14
- package/dist/chunk-5SUD32RK.js.map +1 -0
- package/dist/{chunk-23BHD62H.js → chunk-5TZDEGZN.js} +4 -4
- package/dist/chunk-5TZDEGZN.js.map +1 -0
- package/dist/{chunk-VPNFYQBL.js → chunk-6DN2UAIR.js} +3 -3
- package/dist/chunk-6DN2UAIR.js.map +1 -0
- package/dist/{chunk-EGYWK2XX.js → chunk-7CTFBOD4.js} +3 -3
- package/dist/{chunk-EGYWK2XX.js.map → chunk-7CTFBOD4.js.map} +1 -1
- package/dist/{chunk-36XTKR3B.js → chunk-BMNCNBPA.js} +3 -3
- package/dist/{chunk-36XTKR3B.js.map → chunk-BMNCNBPA.js.map} +1 -1
- package/dist/{chunk-AWYOWR5N.js → chunk-C5HSYDJC.js} +3 -3
- package/dist/{chunk-AWYOWR5N.js.map → chunk-C5HSYDJC.js.map} +1 -1
- package/dist/{chunk-VFALJSXB.js → chunk-DCUFQJYP.js} +3 -3
- package/dist/chunk-DCUFQJYP.js.map +1 -0
- package/dist/{chunk-LATTRPLQ.js → chunk-E2TI5V67.js} +3 -3
- package/dist/{chunk-LATTRPLQ.js.map → chunk-E2TI5V67.js.map} +1 -1
- package/dist/{chunk-IRKDMISK.js → chunk-G2MAGZHQ.js} +4 -3
- package/dist/chunk-G2MAGZHQ.js.map +1 -0
- package/dist/{chunk-ONQCNOLU.js → chunk-HDOR3SN3.js} +3 -3
- package/dist/{chunk-ONQCNOLU.js.map → chunk-HDOR3SN3.js.map} +1 -1
- package/dist/{chunk-PLLJNHWU.js → chunk-HI3T55XK.js} +3 -33
- package/dist/chunk-HI3T55XK.js.map +1 -0
- package/dist/chunk-HJ4E6YPW.js +236 -0
- package/dist/chunk-HJ4E6YPW.js.map +1 -0
- package/dist/{chunk-LS3WD6IZ.js → chunk-I55QJ4CU.js} +4 -4
- package/dist/{chunk-LS3WD6IZ.js.map → chunk-I55QJ4CU.js.map} +1 -1
- package/dist/{chunk-HKXQLWGR.js → chunk-IOWHM7ZY.js} +13 -11
- package/dist/chunk-IOWHM7ZY.js.map +1 -0
- package/dist/{chunk-ILAV2AZ4.js → chunk-IZC5YFGO.js} +3 -3
- package/dist/{chunk-ILAV2AZ4.js.map → chunk-IZC5YFGO.js.map} +1 -1
- package/dist/{chunk-Y7UFBSAD.js → chunk-KHOCAVQO.js} +3 -3
- package/dist/{chunk-Y7UFBSAD.js.map → chunk-KHOCAVQO.js.map} +1 -1
- package/dist/{chunk-IBVCSZCH.js → chunk-KVJOKWP4.js} +5 -4
- package/dist/chunk-KVJOKWP4.js.map +1 -0
- package/dist/{chunk-KC6CHPT3.js → chunk-KZRTQF64.js} +3 -3
- package/dist/{chunk-KC6CHPT3.js.map → chunk-KZRTQF64.js.map} +1 -1
- package/dist/{chunk-QIETN4UU.js → chunk-LEAK22ZP.js} +3 -3
- package/dist/{chunk-QIETN4UU.js.map → chunk-LEAK22ZP.js.map} +1 -1
- package/dist/{chunk-OWOVCGUZ.js → chunk-M2C7HBR5.js} +3 -3
- package/dist/{chunk-OWOVCGUZ.js.map → chunk-M2C7HBR5.js.map} +1 -1
- package/dist/{chunk-33JGPMUW.js → chunk-M7TPROVH.js} +20 -7
- package/dist/chunk-M7TPROVH.js.map +1 -0
- package/dist/{chunk-AVR3LVOQ.js → chunk-MQMRVBUL.js} +4 -4
- package/dist/{chunk-AVR3LVOQ.js.map → chunk-MQMRVBUL.js.map} +1 -1
- package/dist/{chunk-KPNNSUXM.js → chunk-O7AUE5GP.js} +5 -3
- package/dist/chunk-O7AUE5GP.js.map +1 -0
- package/dist/{chunk-6HEURMY3.js → chunk-OCXGG7UP.js} +5 -5
- package/dist/{chunk-6HEURMY3.js.map → chunk-OCXGG7UP.js.map} +1 -1
- package/dist/{chunk-V7XHE25E.js → chunk-ON7WFRYH.js} +3 -3
- package/dist/{chunk-V7XHE25E.js.map → chunk-ON7WFRYH.js.map} +1 -1
- package/dist/{chunk-FSMHI7DW.js → chunk-OXDWUKGP.js} +3 -3
- package/dist/chunk-OXDWUKGP.js.map +1 -0
- package/dist/{chunk-SJSYKUCL.js → chunk-Q335YODG.js} +3 -3
- package/dist/{chunk-SJSYKUCL.js.map → chunk-Q335YODG.js.map} +1 -1
- package/dist/{chunk-DDM2I5C6.js → chunk-R5OIL4I4.js} +3 -3
- package/dist/{chunk-DDM2I5C6.js.map → chunk-R5OIL4I4.js.map} +1 -1
- package/dist/{chunk-FYJHWYPM.js → chunk-S524YVMO.js} +3 -3
- package/dist/{chunk-FYJHWYPM.js.map → chunk-S524YVMO.js.map} +1 -1
- package/dist/{chunk-OWIFNJXZ.js → chunk-S7TVRVRU.js} +3 -3
- package/dist/chunk-S7TVRVRU.js.map +1 -0
- package/dist/{chunk-TNROOKX3.js → chunk-UDY3IDCY.js} +10 -2
- package/dist/chunk-UDY3IDCY.js.map +1 -0
- package/dist/{chunk-3WOGOTOV.js → chunk-UPYT2XM5.js} +7 -7
- package/dist/chunk-UPYT2XM5.js.map +1 -0
- package/dist/{chunk-YWA63YN3.js → chunk-VAVE4ZJF.js} +2 -2
- package/dist/chunk-VAVE4ZJF.js.map +1 -0
- package/dist/chunk-WKWLKGNI.js +643 -0
- package/dist/chunk-WKWLKGNI.js.map +1 -0
- package/dist/{chunk-Z3FL7LEK.js → chunk-X253YD45.js} +71 -6
- package/dist/chunk-X253YD45.js.map +1 -0
- package/dist/{chunk-6XY7QYVR.js → chunk-X3AXEE3S.js} +3 -3
- package/dist/{chunk-6XY7QYVR.js.map → chunk-X3AXEE3S.js.map} +1 -1
- package/dist/{chunk-R4UOT76L.js → chunk-XAIUZJOJ.js} +8 -8
- package/dist/chunk-XAIUZJOJ.js.map +1 -0
- package/dist/{chunk-ZO2EKJZM.js → chunk-XCZMJA2D.js} +7 -7
- package/dist/{chunk-ZO2EKJZM.js.map → chunk-XCZMJA2D.js.map} +1 -1
- package/dist/{chunk-XRMKL43Y.js → chunk-XOLV7G4S.js} +3 -3
- package/dist/{chunk-XRMKL43Y.js.map → chunk-XOLV7G4S.js.map} +1 -1
- package/dist/chunk-XYYOV5GW.js +186 -0
- package/dist/chunk-XYYOV5GW.js.map +1 -0
- package/dist/{chunk-4MQNDQ4O.js → chunk-YACIRNVP.js} +12 -4
- package/dist/chunk-YACIRNVP.js.map +1 -0
- package/dist/{chunk-JKYB5QAP.js → chunk-YDZBLZVZ.js} +3 -3
- package/dist/{chunk-JKYB5QAP.js.map → chunk-YDZBLZVZ.js.map} +1 -1
- package/dist/{chunk-5XQIH6WM.js → chunk-YM5YBDRM.js} +4 -4
- package/dist/{chunk-5XQIH6WM.js.map → chunk-YM5YBDRM.js.map} +1 -1
- package/dist/{chunk-AUCDXPWH.js → chunk-YQX7XZES.js} +4 -4
- package/dist/{chunk-AUCDXPWH.js.map → chunk-YQX7XZES.js.map} +1 -1
- package/dist/{chunk-CP2PEDG2.js → chunk-Z4KW5VW6.js} +3 -3
- package/dist/chunk-Z4KW5VW6.js.map +1 -0
- package/dist/{chunk-Y3BOERVB.js → chunk-ZEFK3AXP.js} +3 -3
- package/dist/{chunk-Y3BOERVB.js.map → chunk-ZEFK3AXP.js.map} +1 -1
- package/dist/{chunk-L3Z5FAJE.js → chunk-ZEYLSDSG.js} +3 -3
- package/dist/{chunk-L3Z5FAJE.js.map → chunk-ZEYLSDSG.js.map} +1 -1
- package/dist/components/advanced/Calendar/index.js +3 -3
- package/dist/components/advanced/Command/index.js +1 -1
- package/dist/components/advanced/EventCalendar/index.js +3 -3
- package/dist/components/advanced/FileDropzone/index.js +1 -1
- package/dist/components/advanced/FilterBuilder/index.js +3 -3
- package/dist/components/advanced/MarkdownEditor/index.js +2 -2
- package/dist/components/advanced/ReportBuilder/index.js +2 -2
- package/dist/components/advanced/RichTextEditor/index.js +2 -2
- package/dist/components/advanced/index.js +13 -13
- package/dist/components/data-display/AreaChart/index.js +1 -1
- package/dist/components/data-display/BarChart/index.js +1 -1
- package/dist/components/data-display/Carousel/index.js +3 -3
- package/dist/components/data-display/ChartCard/index.js +2 -2
- package/dist/components/data-display/DashboardFilterbar/index.js +5 -5
- package/dist/components/data-display/DataTable/FilterBuilder/index.js +3 -3
- package/dist/components/data-display/DataTable/index.js +6 -6
- package/dist/components/data-display/ImageGallery/index.js +6 -6
- package/dist/components/data-display/KPICard/index.js +3 -3
- package/dist/components/data-display/Lightbox/index.js +1 -1
- package/dist/components/data-display/LineChart/index.js +1 -1
- package/dist/components/data-display/List/index.js +2 -2
- package/dist/components/data-display/Table/index.js +1 -1
- package/dist/components/data-display/VirtualTable/index.js +2 -2
- package/dist/components/data-display/index.js +29 -29
- package/dist/components/feedback/Alert/index.js +1 -1
- package/dist/components/feedback/AlertDialog/index.js +3 -3
- package/dist/components/feedback/ConfirmModal/index.js +4 -4
- package/dist/components/feedback/Modal/index.js +1 -1
- package/dist/components/feedback/index.js +8 -8
- package/dist/components/forms/ColorPicker/index.js +1 -1
- package/dist/components/forms/DatePicker/index.js +4 -4
- package/dist/components/forms/DateRangePicker/index.js +4 -4
- package/dist/components/forms/IftaLabel/index.js +1 -1
- package/dist/components/forms/InputGroup/index.js +3 -3
- package/dist/components/forms/MultiSelect/index.js +2 -1
- package/dist/components/forms/RadioButton/index.js +1 -1
- package/dist/components/forms/Rating/index.js +1 -1
- package/dist/components/forms/Slider/index.js +1 -1
- package/dist/components/forms/TagsInput/index.js +2 -2
- package/dist/components/forms/ToggleGroup/index.js +1 -1
- package/dist/components/forms/index.js +19 -19
- package/dist/components/index.js +104 -104
- package/dist/components/layout/index.js +2 -2
- package/dist/components/navigation/AccountSwitch/index.js +3 -3
- package/dist/components/navigation/Drawer/index.js +1 -1
- package/dist/components/navigation/DropdownMenu/index.js +1 -1
- package/dist/components/navigation/Header/index.js +1 -1
- package/dist/components/navigation/MobileSidebar/index.js +3 -3
- package/dist/components/navigation/Pagination/index.js +3 -3
- package/dist/components/navigation/Sidebar/index.js +3 -3
- package/dist/components/navigation/UserProfileDropdown/index.js +1 -1
- package/dist/components/navigation/WorkspaceDropdown/index.js +1 -1
- package/dist/components/navigation/index.js +13 -13
- package/dist/components/primitives/AspectRatio/index.js +1 -1
- package/dist/components/primitives/Badge/index.js +1 -1
- package/dist/components/primitives/Button/index.js +2 -2
- package/dist/components/primitives/ConfirmButton/index.js +4 -4
- package/dist/components/primitives/ProgressBar/index.js +1 -1
- package/dist/components/primitives/SplitButton/index.js +2 -2
- package/dist/components/primitives/StatusIndicator/index.js +1 -1
- package/dist/components/primitives/Tag/index.js +1 -1
- package/dist/components/primitives/Toggle/index.js +1 -1
- package/dist/components/primitives/index.js +16 -16
- package/dist/components/workflow/ApprovalFlow/index.js +3 -3
- package/dist/components/workflow/CommentSystem/index.js +3 -3
- package/dist/components/workflow/Dashboard/index.js +3 -3
- package/dist/components/workflow/DashboardBuilder/index.js +3 -3
- package/dist/components/workflow/KanbanBoard/index.js +3 -3
- package/dist/components/workflow/ReportGenerator/index.js +3 -3
- package/dist/components/workflow/TaskStatus/index.js +2 -2
- package/dist/components/workflow/Wizard/index.js +3 -3
- package/dist/components/workflow/index.js +12 -12
- package/dist/index.d.ts +156 -50
- package/dist/index.js +104 -104
- package/dist/styles.css +23 -0
- package/package.json +2 -2
- package/dist/chunk-23BHD62H.js.map +0 -1
- package/dist/chunk-2UGDLAYC.js.map +0 -1
- package/dist/chunk-33JGPMUW.js.map +0 -1
- package/dist/chunk-3WOGOTOV.js.map +0 -1
- package/dist/chunk-4MQNDQ4O.js.map +0 -1
- package/dist/chunk-65YSTUD2.js.map +0 -1
- package/dist/chunk-CP2PEDG2.js.map +0 -1
- package/dist/chunk-FSMHI7DW.js.map +0 -1
- package/dist/chunk-GAP3OZR7.js +0 -223
- package/dist/chunk-GAP3OZR7.js.map +0 -1
- package/dist/chunk-HKXQLWGR.js.map +0 -1
- package/dist/chunk-IBVCSZCH.js.map +0 -1
- package/dist/chunk-ICAQYWCX.js +0 -153
- package/dist/chunk-ICAQYWCX.js.map +0 -1
- package/dist/chunk-IRKDMISK.js.map +0 -1
- package/dist/chunk-J62TFQHR.js.map +0 -1
- package/dist/chunk-KPNNSUXM.js.map +0 -1
- package/dist/chunk-KR3IVNQH.js.map +0 -1
- package/dist/chunk-OWIFNJXZ.js.map +0 -1
- package/dist/chunk-PLLJNHWU.js.map +0 -1
- package/dist/chunk-R4UOT76L.js.map +0 -1
- package/dist/chunk-SHS6EGWS.js +0 -226
- package/dist/chunk-SHS6EGWS.js.map +0 -1
- package/dist/chunk-TNROOKX3.js.map +0 -1
- package/dist/chunk-UFRMZ3M6.js.map +0 -1
- package/dist/chunk-VFALJSXB.js.map +0 -1
- package/dist/chunk-VPNFYQBL.js.map +0 -1
- package/dist/chunk-XD5LE64P.js +0 -311
- package/dist/chunk-XD5LE64P.js.map +0 -1
- package/dist/chunk-XV6NXXXP.js +0 -206
- package/dist/chunk-XV6NXXXP.js.map +0 -1
- package/dist/chunk-YWA63YN3.js.map +0 -1
- package/dist/chunk-Z3FL7LEK.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/DatePicker/DatePicker.variants.ts","../src/components/forms/DatePicker/DatePicker.tsx"],"names":["format","formatDate"],"mappings":"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","file":"chunk-LS3WD6IZ.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * DatePicker trigger variant styles using CVA\n */\nexport const datePickerTriggerVariants = cva(\n // Base styles\n [\n \"inline-flex w-full items-center justify-between gap-2 rounded-[var(--date-picker-trigger-radius)] border bg-transparent font-normal transition-[color,box-shadow] outline-none\",\n \"text-left\",\n \"placeholder:text-muted-foreground\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-[color:var(--date-picker-trigger-disabled-bg)] disabled:text-[color:var(--date-picker-trigger-disabled-fg)] disabled:border-[color:var(--date-picker-trigger-disabled-border)]\",\n \"focus-visible:border-[color:var(--date-picker-trigger-border-focus)] focus-visible:ring-[color:var(--date-picker-trigger-ring-primary)]/50 focus-visible:ring-[length:var(--date-picker-trigger-ring-width)]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n \"data-[state=open]:border-ring data-[state=open]:ring-ring/50 data-[state=open]:ring-[3px]\",\n \"min-w-[var(--date-picker-trigger-min-width)]\",\n ],\n {\n variants: {\n size: {\n sm: \"h-[var(--date-picker-trigger-height-sm)] px-[var(--date-picker-trigger-padding-x-sm)] py-[var(--date-picker-trigger-padding-y-sm)] text-[length:var(--date-picker-trigger-text-sm)]\",\n md: \"h-[var(--date-picker-trigger-height-md)] px-[var(--date-picker-trigger-padding-x-md)] py-[var(--date-picker-trigger-padding-y-md)] text-[length:var(--date-picker-trigger-text-md)]\",\n lg: \"h-[var(--date-picker-trigger-height-lg)] px-[var(--date-picker-trigger-padding-x-lg)] py-[var(--date-picker-trigger-padding-y-lg)] text-[length:var(--date-picker-trigger-text-lg)]\",\n },\n variant: {\n default: \"border-input shadow-xs dark:bg-input/30\",\n filled: \"border-transparent bg-muted\",\n flushed: \"rounded-none border-x-0 border-t-0 border-b-input px-0\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * DatePicker clear button styles using CVA.\n *\n * The clear control is a sibling of the trigger (never nested inside the\n * trigger button — button-in-button is invalid). It is absolutely positioned\n * so it overlays the trigger's trailing-icon slot, sitting at the same inset\n * as the calendar icon for each size/variant.\n */\nexport const datePickerClearButtonVariants = cva(\n [\n \"absolute top-1/2 inline-flex size-4 -translate-y-1/2 items-center justify-center rounded-sm outline-none\",\n \"text-muted-foreground opacity-70 transition-opacity\",\n \"hover:opacity-100 focus-visible:opacity-100\",\n \"focus-visible:ring-[color:var(--date-picker-trigger-ring-primary)]/50 focus-visible:ring-[length:var(--date-picker-trigger-ring-width)]\",\n ],\n {\n variants: {\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n variant: {\n default: \"\",\n filled: \"\",\n flushed: \"\",\n },\n },\n compoundVariants: [\n // Non-flushed variants inset the trailing slot by the trigger's px token\n { variant: [\"default\", \"filled\"], size: \"sm\", className: \"right-[var(--date-picker-trigger-padding-x-sm)]\" },\n { variant: [\"default\", \"filled\"], size: \"md\", className: \"right-[var(--date-picker-trigger-padding-x-md)]\" },\n { variant: [\"default\", \"filled\"], size: \"lg\", className: \"right-[var(--date-picker-trigger-padding-x-lg)]\" },\n // Flushed removes horizontal padding, so the slot sits at the edge\n { variant: \"flushed\", className: \"right-0\" },\n ],\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\nexport type DatePickerTriggerVariantProps = VariantProps<typeof datePickerTriggerVariants>\n","import type { DatePickerProps } from \"./DatePicker.types\"\n\nimport { format as formatDate, isAfter, isBefore, setHours, setMinutes, startOfDay } from \"date-fns\"\nimport { CalendarIcon, XIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Calendar } from \"../../advanced/Calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../feedback/Popover\"\nimport { ScrollArea } from \"../../layout/ScrollArea\"\nimport { Button } from \"../../primitives/Button\"\nimport { datePickerClearButtonVariants, datePickerTriggerVariants } from \"./DatePicker.variants\"\n\n/**\n * Convert 24h hours to 12h format with period\n */\nfunction to12Hour(hours: number): { hour12: number; period: \"AM\" | \"PM\" } {\n const period = hours >= 12 ? \"PM\" : \"AM\"\n let hour12 = hours % 12\n if (hour12 === 0) hour12 = 12\n return { hour12, period }\n}\n\n/**\n * Convert 12h format to 24h hours\n */\nfunction to24Hour(hour12: number, period: \"AM\" | \"PM\"): number {\n if (period === \"AM\") {\n return hour12 === 12 ? 0 : hour12\n }\n return hour12 === 12 ? 12 : hour12 + 12\n}\n\n/**\n * Generate array of hour options\n */\nfunction getHourOptions(use12Hour: boolean): number[] {\n if (use12Hour) {\n return [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n }\n return Array.from({ length: 24 }, (_, i) => i)\n}\n\n/**\n * Generate array of minute options based on step\n */\nfunction getMinuteOptions(step: number): number[] {\n const options: number[] = []\n for (let i = 0; i < 60; i += step) {\n options.push(i)\n }\n return options\n}\n\nfunction DatePicker({\n ref,\n className,\n align = \"start\",\n dialogLabel = \"Choose date\",\n value,\n defaultValue,\n placeholder = \"Select date\",\n disabled = false,\n disabledDates,\n readOnly = false,\n showTimePicker = false,\n showToday = false,\n timeLabel = \"Time\",\n timeMinuteStep = 1,\n timeUse12Hour = false,\n todayLabel = \"Today\",\n minDate,\n maxDate,\n format = \"PPP\",\n locale,\n onChange,\n onOpenChange,\n onClear,\n size = \"md\",\n variant = \"default\",\n required = false,\n invalid = false,\n clearable = false,\n calendarProps,\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n}: DatePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [internalDate, setInternalDate] = React.useState<Date | undefined>(defaultValue)\n\n // Time state for when showTimePicker is enabled\n const [internalHours, setInternalHours] = React.useState<number>(\n defaultValue ? defaultValue.getHours() : 0\n )\n const [internalMinutes, setInternalMinutes] = React.useState<number>(\n defaultValue ? defaultValue.getMinutes() : 0\n )\n const [internalPeriod, setInternalPeriod] = React.useState<\"AM\" | \"PM\">(() =>\n defaultValue ? to12Hour(defaultValue.getHours()).period : \"AM\"\n )\n\n // Refs for auto-scrolling time columns\n const hourListRef = React.useRef<HTMLDivElement>(null)\n const minuteListRef = React.useRef<HTMLDivElement>(null)\n\n // Use controlled value if provided, otherwise use internal state\n const selectedDate = value ?? internalDate\n\n // Get time from selected date or internal state\n const currentHours = selectedDate ? selectedDate.getHours() : internalHours\n const currentMinutes = selectedDate ? selectedDate.getMinutes() : internalMinutes\n const currentPeriod = selectedDate\n ? to12Hour(selectedDate.getHours()).period\n : internalPeriod\n\n // Compute defaultMonth once for clarity\n const defaultMonth = selectedDate ?? minDate\n\n // Scroll to selected time items when popover opens\n React.useEffect(() => {\n if (!open || !showTimePicker) return\n\n const timeoutId = setTimeout(() => {\n const selectedHour = hourListRef.current?.querySelector('[data-selected=\"true\"]')\n selectedHour?.scrollIntoView({ block: \"center\", behavior: \"instant\" })\n\n const selectedMinute = minuteListRef.current?.querySelector('[data-selected=\"true\"]')\n selectedMinute?.scrollIntoView({ block: \"center\", behavior: \"instant\" })\n }, 0)\n\n return () => { clearTimeout(timeoutId) }\n }, [open, showTimePicker, currentHours, currentMinutes])\n\n const applyTimeToDate = (date: Date | undefined, hours: number, minutes: number): Date | undefined => {\n if (!date) return undefined\n return setMinutes(setHours(date, hours), minutes)\n }\n\n const handleSelect = (date: Date | undefined) => {\n let finalDate = date\n if (showTimePicker && date) {\n // Apply current time to the selected date\n finalDate = applyTimeToDate(date, currentHours, currentMinutes)\n }\n\n if (value === undefined) {\n setInternalDate(finalDate)\n }\n onChange?.(finalDate)\n\n // Only close if not showing time picker, or close after date selection\n if (!showTimePicker) {\n setOpen(false)\n }\n }\n\n const handleTimeChange = (hours: number, minutes: number) => {\n if (value === undefined) {\n setInternalHours(hours)\n setInternalMinutes(minutes)\n }\n\n if (selectedDate) {\n const newDate = applyTimeToDate(selectedDate, hours, minutes)\n if (value === undefined) {\n setInternalDate(newDate)\n }\n onChange?.(newDate)\n }\n }\n\n const handleHourSelect = (hour: number) => {\n let newHours = hour\n if (timeUse12Hour) {\n newHours = to24Hour(hour, currentPeriod)\n }\n if (value === undefined) {\n setInternalHours(newHours)\n }\n handleTimeChange(newHours, currentMinutes)\n }\n\n const handleMinuteSelect = (minute: number) => {\n if (value === undefined) {\n setInternalMinutes(minute)\n }\n handleTimeChange(currentHours, minute)\n }\n\n const handlePeriodSelect = (period: \"AM\" | \"PM\") => {\n if (value === undefined) {\n setInternalPeriod(period)\n }\n const hour12 = timeUse12Hour\n ? currentHours % 12 || 12\n : to12Hour(currentHours).hour12\n const newHours = to24Hour(hour12, period)\n if (value === undefined) {\n setInternalHours(newHours)\n }\n handleTimeChange(newHours, currentMinutes)\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n // Don't open if readOnly\n if (readOnly && isOpen) return\n\n setOpen(isOpen)\n onOpenChange?.(isOpen)\n }\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) {\n setInternalDate(undefined)\n }\n onChange?.()\n onClear?.()\n }\n\n // Format display value with time if showTimePicker is enabled\n const displayValue = React.useMemo(() => {\n if (!selectedDate) return null\n\n const dateStr = formatDate(selectedDate, format, locale ? { locale } : undefined)\n\n if (showTimePicker) {\n const timeStr = timeUse12Hour\n ? `${String(to12Hour(currentHours).hour12)}:${currentMinutes.toString().padStart(2, \"0\")} ${currentPeriod}`\n : `${currentHours.toString().padStart(2, \"0\")}:${currentMinutes.toString().padStart(2, \"0\")}`\n return `${dateStr} ${timeStr}`\n }\n\n return dateStr\n }, [selectedDate, format, locale, showTimePicker, timeUse12Hour, currentHours, currentMinutes, currentPeriod])\n\n // Memoize time options\n const hourOptions = React.useMemo(() => getHourOptions(timeUse12Hour), [timeUse12Hour])\n const minuteOptions = React.useMemo(() => getMinuteOptions(timeMinuteStep), [timeMinuteStep])\n\n // Calculate display hour for matching in 12h mode\n const displayHour = timeUse12Hour\n ? to12Hour(currentHours).hour12\n : currentHours\n\n // Signal for the filled field state (date selected). The `filled` style\n // variant is independent — this is the data hook consumers/tests rely on.\n const hasValue = Boolean(selectedDate)\n\n const showClearButton = clearable && hasValue && !disabled && !readOnly\n\n // Combined date disabled check\n const isDateDisabled = React.useCallback(\n (date: Date): boolean => {\n const normalizedDate = startOfDay(date)\n if (minDate && isBefore(normalizedDate, startOfDay(minDate))) return true\n if (maxDate && isAfter(normalizedDate, startOfDay(maxDate))) return true\n if (disabledDates?.(date)) return true\n return false\n },\n [minDate, maxDate, disabledDates]\n )\n\n // Check if today is disabled\n const isTodayDisabled = React.useMemo(() => {\n return isDateDisabled(new Date())\n }, [isDateDisabled])\n\n // Handle selecting today\n const handleSelectToday = () => {\n const today = startOfDay(new Date())\n if (!isDateDisabled(today)) {\n handleSelect(today)\n }\n }\n\n return (\n <div className={cn(\"relative\", className)} data-slot=\"date-picker\" {...props}>\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n className={cn(\n datePickerTriggerVariants({ size, variant }),\n !displayValue && \"text-muted-foreground\"\n )}\n aria-describedby={ariaDescribedby}\n aria-disabled={readOnly || undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={invalid}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-required={required}\n data-has-value={hasValue}\n data-readonly={readOnly || undefined}\n data-size={size}\n data-slot=\"date-picker-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={variant}\n disabled={disabled}\n id={id}\n type=\"button\"\n >\n <span className=\"flex-1 truncate\">\n {displayValue ?? placeholder}\n </span>\n <CalendarIcon\n aria-hidden=\"true\"\n className={cn(\"size-4 shrink-0 opacity-50\", showClearButton && \"invisible\")}\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={align}\n aria-label={dialogLabel}\n className=\"w-auto p-0\"\n data-slot=\"date-picker-calendar\"\n >\n <Calendar\n autoFocus\n footer={\n showToday ? (\n <div className=\"border-t border-border p-2\" data-slot=\"date-picker-footer\">\n <Button\n className=\"w-full\"\n disabled={isTodayDisabled}\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleSelectToday}\n >\n {todayLabel}\n </Button>\n </div>\n ) : undefined\n }\n defaultMonth={defaultMonth}\n disabled={isDateDisabled}\n locale={locale}\n mode=\"single\"\n selected={selectedDate}\n onSelect={handleSelect}\n {...calendarProps}\n />\n\n {/* Time Picker Section */}\n {showTimePicker && (\n <div\n className=\"border-t border-border\"\n data-slot=\"date-picker-time\"\n >\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground\">\n {timeLabel}\n </div>\n <div\n aria-label=\"Time selection\"\n className=\"flex divide-x border-t border-border\"\n role=\"listbox\"\n >\n {/* Hours Column */}\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n {timeUse12Hour ? \"Hour\" : \"Hours\"}\n </div>\n <ScrollArea className=\"h-36\">\n <div\n ref={hourListRef}\n aria-label=\"Hours\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {hourOptions.map((hour) => {\n const isSelected = displayHour === hour\n return (\n <button\n key={hour}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handleHourSelect(hour); }}\n >\n {timeUse12Hour ? hour : hour.toString().padStart(2, \"0\")}\n </button>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n\n {/* Minutes Column */}\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n Min\n </div>\n <ScrollArea className=\"h-36\">\n <div\n ref={minuteListRef}\n aria-label=\"Minutes\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {minuteOptions.map((minute) => {\n const isSelected = currentMinutes === minute\n return (\n <button\n key={minute}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handleMinuteSelect(minute); }}\n >\n {minute.toString().padStart(2, \"0\")}\n </button>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n\n {/* AM/PM Column (12-hour mode only) */}\n {timeUse12Hour && (\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n \n </div>\n <div\n aria-label=\"Period\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {([\"AM\", \"PM\"] as const).map((period) => {\n const isSelected = currentPeriod === period\n return (\n <button\n key={period}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handlePeriodSelect(period); }}\n >\n {period}\n </button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n {showClearButton && (\n <button\n aria-label=\"Clear date\"\n className={cn(datePickerClearButtonVariants({ size, variant }))}\n data-slot=\"date-picker-clear\"\n type=\"button\"\n onClick={handleClear}\n >\n <XIcon className=\"size-4\" />\n </button>\n )}\n {name && (\n <input\n name={name}\n type=\"hidden\"\n value={selectedDate?.toISOString() ?? \"\"}\n />\n )}\n </div>\n )\n}\n\nexport { DatePicker }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/DatePicker/DatePicker.variants.ts","../src/components/forms/DatePicker/DatePicker.tsx"],"names":["format","formatDate"],"mappings":";;;;;;;;;;;AAKO,IAAM,yBAAA,GAA4B,GAAA;AAAA;AAAA,EAEvC;AAAA,IACE,gLAAA;AAAA,IACA,WAAA;AAAA,IACA,mCAAA;AAAA,IACA,qPAAA;AAAA,IACA,8MAAA;AAAA,IACA,wGAAA;AAAA,IACA,2FAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,qLAAA;AAAA,QACJ,EAAA,EAAI,qLAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,yCAAA;AAAA,QACT,MAAA,EAAQ,6BAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX;AAEJ;AAUO,IAAM,6BAAA,GAAgC,GAAA;AAAA,EAC3C;AAAA,IACE,0GAAA;AAAA,IACA,qDAAA;AAAA,IACA,6CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA;AAAA,MAEhB,EAAE,SAAS,CAAC,SAAA,EAAW,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,iDAAA,EAAkD;AAAA,MAC3G,EAAE,SAAS,CAAC,SAAA,EAAW,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,iDAAA,EAAkD;AAAA,MAC3G,EAAE,SAAS,CAAC,SAAA,EAAW,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,iDAAA,EAAkD;AAAA;AAAA,MAE3G,EAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,SAAA;AAAU,KAC7C;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAM,IAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX;AAEJ,CAAA;AC1DA,SAAS,SAAS,KAAA,EAAwD;AACxE,EAAA,MAAM,MAAA,GAAS,KAAA,IAAS,EAAA,GAAK,IAAA,GAAO,IAAA;AACpC,EAAA,IAAI,SAAS,KAAA,GAAQ,EAAA;AACrB,EAAA,IAAI,MAAA,KAAW,GAAG,MAAA,GAAS,EAAA;AAC3B,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AAKA,SAAS,QAAA,CAAS,QAAgB,MAAA,EAA6B;AAC7D,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,MAAA,KAAW,KAAK,CAAA,GAAI,MAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA,KAAW,EAAA,GAAK,EAAA,GAAK,MAAA,GAAS,EAAA;AACvC;AAKA,SAAS,eAAe,SAAA,EAA8B;AACpD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA;AAC/C;AAKA,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAK,IAAA,EAAM;AACjC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,GAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ,OAAA;AAAA,EACR,WAAA,GAAc,aAAA;AAAA,EACd,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,aAAA;AAAA,EACd,QAAA,GAAW,KAAA;AAAA,EACX,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,cAAA,GAAiB,KAAA;AAAA,EACjB,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,MAAA;AAAA,EACZ,cAAA,GAAiB,CAAA;AAAA,EACjB,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA,GAAa,OAAA;AAAA,EACb,OAAA;AAAA,EACA,OAAA;AAAA,UACAA,QAAA,GAAS,KAAA;AAAA,EACT,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,OAAA,GAAU,KAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,aAAA;AAAA,EACA,EAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,iBAAA,EAAmB,cAAA;AAAA,EACnB,kBAAA,EAAoB,eAAA;AAAA,EACpB,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,eAA2B,YAAY,CAAA;AAGrF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IAC9C,YAAA,GAAe,YAAA,CAAa,QAAA,EAAS,GAAI;AAAA,GAC3C;AACA,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IAClD,YAAA,GAAe,YAAA,CAAa,UAAA,EAAW,GAAI;AAAA,GAC7C;AACA,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,KAAA,CAAA,QAAA;AAAA,IAAsB,MACtE,YAAA,GAAe,QAAA,CAAS,aAAa,QAAA,EAAU,EAAE,MAAA,GAAS;AAAA,GAC5D;AAGA,EAAA,MAAM,WAAA,GAAoB,aAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,aAAA,GAAsB,aAAuB,IAAI,CAAA;AAGvD,EAAA,MAAM,eAAe,KAAA,IAAS,YAAA;AAG9B,EAAA,MAAM,YAAA,GAAe,YAAA,GAAe,YAAA,CAAa,QAAA,EAAS,GAAI,aAAA;AAC9D,EAAA,MAAM,cAAA,GAAiB,YAAA,GAAe,YAAA,CAAa,UAAA,EAAW,GAAI,eAAA;AAClE,EAAA,MAAM,gBAAgB,YAAA,GAClB,QAAA,CAAS,aAAa,QAAA,EAAU,EAAE,MAAA,GAClC,cAAA;AAGJ,EAAA,MAAM,eAAe,YAAA,IAAgB,OAAA;AAGrC,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,cAAA,EAAgB;AAE9B,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,EAAS,aAAA,CAAc,wBAAwB,CAAA;AAChF,MAAA,YAAA,EAAc,eAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,WAAW,CAAA;AAErE,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,OAAA,EAAS,aAAA,CAAc,wBAAwB,CAAA;AACpF,MAAA,cAAA,EAAgB,eAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,WAAW,CAAA;AAAA,IACzE,GAAG,CAAC,CAAA;AAEJ,IAAA,OAAO,MAAM;AAAE,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IAAE,CAAA;AAAA,EACzC,GAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,YAAA,EAAc,cAAc,CAAC,CAAA;AAEvD,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAwB,KAAA,EAAe,OAAA,KAAsC;AACpG,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,OAAO,UAAA,CAAW,QAAA,CAAS,IAAA,EAAM,KAAK,GAAG,OAAO,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAA2B;AAC/C,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAI,kBAAkB,IAAA,EAAM;AAE1B,MAAA,SAAA,GAAY,eAAA,CAAgB,IAAA,EAAM,YAAA,EAAc,cAAc,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,eAAA,CAAgB,SAAS,CAAA;AAAA,IAC3B;AACA,IAAA,QAAA,GAAW,SAAS,CAAA;AAGpB,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,EAAe,OAAA,KAAoB;AAC3D,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,YAAA,EAAc,KAAA,EAAO,OAAO,CAAA;AAC5D,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,MACzB;AACA,MAAA,QAAA,GAAW,OAAO,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,GAAW,QAAA,CAAS,MAAM,aAAa,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B;AACA,IAAA,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAmB;AAC7C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,gBAAA,CAAiB,cAAc,MAAM,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAwB;AAClD,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,iBAAA,CAAkB,MAAM,CAAA;AAAA,IAC1B;AACA,IAAA,MAAM,SAAS,aAAA,GACX,YAAA,GAAe,MAAM,EAAA,GACrB,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AACxC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B;AACA,IAAA,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAAA,EAC3C,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAoB;AAE5C,IAAA,IAAI,YAAY,MAAA,EAAQ;AAExB,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,YAAA,GAAe,MAAM,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA4B;AAC/C,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,eAAA,CAAgB,MAAS,CAAA;AAAA,IAC3B;AACA,IAAA,QAAA,IAAW;AACX,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA;AAGA,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,IAAA,MAAM,OAAA,GAAUC,OAAW,YAAA,EAAcD,QAAA,EAAQ,SAAS,EAAE,MAAA,KAAW,MAAS,CAAA;AAEhF,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,OAAA,GAAU,aAAA,GACZ,CAAA,EAAG,MAAA,CAAO,SAAS,YAAY,CAAA,CAAE,MAAM,CAAC,IAAI,cAAA,CAAe,QAAA,EAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAAA,EAAI,aAAa,KACvG,CAAA,EAAG,YAAA,CAAa,QAAA,EAAS,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,eAAe,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC7F,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAA,EAAcA,QAAA,EAAQ,MAAA,EAAQ,gBAAgB,aAAA,EAAe,YAAA,EAAc,cAAA,EAAgB,aAAa,CAAC,CAAA;AAG7G,EAAA,MAAM,WAAA,GAAoB,cAAQ,MAAM,cAAA,CAAe,aAAa,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AACtF,EAAA,MAAM,aAAA,GAAsB,cAAQ,MAAM,gBAAA,CAAiB,cAAc,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAG5F,EAAA,MAAM,WAAA,GAAc,aAAA,GAChB,QAAA,CAAS,YAAY,EAAE,MAAA,GACvB,YAAA;AAIJ,EAAA,MAAM,QAAA,GAAW,QAAQ,YAAY,CAAA;AAErC,EAAA,MAAM,eAAA,GAAkB,SAAA,IAAa,QAAA,IAAY,CAAC,YAAY,CAAC,QAAA;AAG/D,EAAA,MAAM,cAAA,GAAuB,KAAA,CAAA,WAAA;AAAA,IAC3B,CAAC,IAAA,KAAwB;AACvB,MAAA,MAAM,cAAA,GAAiB,WAAW,IAAI,CAAA;AACtC,MAAA,IAAI,WAAW,QAAA,CAAS,cAAA,EAAgB,WAAW,OAAO,CAAC,GAAG,OAAO,IAAA;AACrE,MAAA,IAAI,WAAW,OAAA,CAAQ,cAAA,EAAgB,WAAW,OAAO,CAAC,GAAG,OAAO,IAAA;AACpE,MAAA,IAAI,aAAA,GAAgB,IAAI,CAAA,EAAG,OAAO,IAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,OAAA,EAAS,aAAa;AAAA,GAClC;AAGA,EAAA,MAAM,eAAA,GAAwB,cAAQ,MAAM;AAC1C,IAAA,OAAO,cAAA,iBAAe,IAAI,IAAA,EAAM,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,MAAM,KAAA,GAAQ,UAAA,iBAAW,IAAI,IAAA,EAAM,CAAA;AACnC,IAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAG,WAAA,EAAU,aAAA,EAAe,GAAG,KAAA,EACrE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,gBAAA,EACjC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,yBAAA,CAA0B,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,YAC3C,CAAC,YAAA,IAAgB;AAAA,WACnB;AAAA,UACA,kBAAA,EAAkB,eAAA;AAAA,UAClB,iBAAe,QAAA,IAAY,MAAA;AAAA,UAC3B,eAAA,EAAe,IAAA;AAAA,UACf,eAAA,EAAc,QAAA;AAAA,UACd,cAAA,EAAc,OAAA;AAAA,UACd,YAAA,EAAY,SAAA;AAAA,UACZ,iBAAA,EAAiB,cAAA;AAAA,UACjB,eAAA,EAAe,QAAA;AAAA,UACf,gBAAA,EAAgB,QAAA;AAAA,UAChB,iBAAe,QAAA,IAAY,MAAA;AAAA,UAC3B,WAAA,EAAW,IAAA;AAAA,UACX,WAAA,EAAU,qBAAA;AAAA,UACV,YAAA,EAAY,OAAO,MAAA,GAAS,QAAA;AAAA,UAC5B,cAAA,EAAc,OAAA;AAAA,UACd,QAAA;AAAA,UACA,EAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UAEL,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA,YAAA,IAAgB,WAAA,EACnB,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAY,MAAA;AAAA,gBACZ,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,eAAA,IAAmB,WAAW;AAAA;AAAA;AAC5E;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBACA,IAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,YAAA,EAAY,WAAA;AAAA,UACZ,SAAA,EAAU,YAAA;AAAA,UACV,WAAA,EAAU,sBAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAS,IAAA;AAAA,gBACT,QACE,SAAA,mBACE,GAAA,CAAC,SAAI,SAAA,EAAU,4BAAA,EAA6B,aAAU,oBAAA,EACpD,QAAA,kBAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,QAAA;AAAA,oBACV,QAAA,EAAU,eAAA;AAAA,oBACV,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,OAAA,EAAS,iBAAA;AAAA,oBAER,QAAA,EAAA;AAAA;AAAA,mBAEL,CAAA,GACE,MAAA;AAAA,gBAEN,YAAA;AAAA,gBACA,QAAA,EAAU,cAAA;AAAA,gBACV,MAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,YAAA;AAAA,gBACV,QAAA,EAAU,YAAA;AAAA,gBACT,GAAG;AAAA;AAAA,aACN;AAAA,YAGC,cAAA,oBACC,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,wBAAA;AAAA,gBACV,WAAA,EAAU,kBAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACZ,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,kCACA,IAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,YAAA,EAAW,gBAAA;AAAA,sBACX,SAAA,EAAU,sCAAA;AAAA,sBACV,IAAA,EAAK,SAAA;AAAA,sBAGL,QAAA,EAAA;AAAA,wCAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACb,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,QAAA,EAAA,aAAA,GAAgB,SAAS,OAAA,EAC5B,CAAA;AAAA,0CACA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EACpB,QAAA,kBAAA,GAAA;AAAA,4BAAC,KAAA;AAAA,4BAAA;AAAA,8BACC,GAAA,EAAK,WAAA;AAAA,8BACL,YAAA,EAAW,OAAA;AAAA,8BACX,SAAA,EAAU,iCAAA;AAAA,8BACV,IAAA,EAAK,OAAA;AAAA,8BAEJ,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,gCAAA,MAAM,aAAa,WAAA,KAAgB,IAAA;AACnC,gCAAA,uBACE,GAAA;AAAA,kCAAC,QAAA;AAAA,kCAAA;AAAA,oCAEC,SAAA,EAAW,EAAA;AAAA,sCACT,8DAAA;AAAA,sCACA,8CAAA;AAAA,sCACA,iEAAA;AAAA,sCACA,UAAA,IAAc;AAAA,qCAChB;AAAA,oCACA,eAAA,EAAe,UAAA;AAAA,oCACf,eAAA,EAAe,UAAA;AAAA,oCACf,IAAA,EAAK,QAAA;AAAA,oCACL,IAAA,EAAK,QAAA;AAAA,oCACL,SAAS,MAAM;AAAE,sCAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,oCAAG,CAAA;AAAA,oCAExC,0BAAgB,IAAA,GAAO,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,mCAAA;AAAA,kCAblD;AAAA,iCAcP;AAAA,8BAEJ,CAAC;AAAA;AAAA,2BACH,EACF;AAAA,yBAAA,EACF,CAAA;AAAA,wCAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EAA6E,QAAA,EAAA,KAAA,EAE5F,CAAA;AAAA,0CACA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EACpB,QAAA,kBAAA,GAAA;AAAA,4BAAC,KAAA;AAAA,4BAAA;AAAA,8BACC,GAAA,EAAK,aAAA;AAAA,8BACL,YAAA,EAAW,SAAA;AAAA,8BACX,SAAA,EAAU,iCAAA;AAAA,8BACV,IAAA,EAAK,OAAA;AAAA,8BAEJ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,gCAAA,MAAM,aAAa,cAAA,KAAmB,MAAA;AACtC,gCAAA,uBACE,GAAA;AAAA,kCAAC,QAAA;AAAA,kCAAA;AAAA,oCAEC,SAAA,EAAW,EAAA;AAAA,sCACT,8DAAA;AAAA,sCACA,8CAAA;AAAA,sCACA,iEAAA;AAAA,sCACA,UAAA,IAAc;AAAA,qCAChB;AAAA,oCACA,eAAA,EAAe,UAAA;AAAA,oCACf,eAAA,EAAe,UAAA;AAAA,oCACf,IAAA,EAAK,QAAA;AAAA,oCACL,IAAA,EAAK,QAAA;AAAA,oCACL,SAAS,MAAM;AAAE,sCAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,oCAAG,CAAA;AAAA,oCAE5C,QAAA,EAAA,MAAA,CAAO,QAAA,EAAS,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,mCAAA;AAAA,kCAb7B;AAAA,iCAcP;AAAA,8BAEJ,CAAC;AAAA;AAAA,2BACH,EACF;AAAA,yBAAA,EACF,CAAA;AAAA,wBAGC,aAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,0CAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EAA6E,QAAA,EAAA,MAAA,EAE5F,CAAA;AAAA,0CACA,GAAA;AAAA,4BAAC,KAAA;AAAA,4BAAA;AAAA,8BACC,YAAA,EAAW,QAAA;AAAA,8BACX,SAAA,EAAU,iCAAA;AAAA,8BACV,IAAA,EAAK,OAAA;AAAA,8BAEH,WAAC,IAAA,EAAM,IAAI,CAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW;AACvC,gCAAA,MAAM,aAAa,aAAA,KAAkB,MAAA;AACrC,gCAAA,uBACE,GAAA;AAAA,kCAAC,QAAA;AAAA,kCAAA;AAAA,oCAEC,SAAA,EAAW,EAAA;AAAA,sCACT,8DAAA;AAAA,sCACA,8CAAA;AAAA,sCACA,iEAAA;AAAA,sCACA,UAAA,IAAc;AAAA,qCAChB;AAAA,oCACA,eAAA,EAAe,UAAA;AAAA,oCACf,eAAA,EAAe,UAAA;AAAA,oCACf,IAAA,EAAK,QAAA;AAAA,oCACL,IAAA,EAAK,QAAA;AAAA,oCACL,SAAS,MAAM;AAAE,sCAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,oCAAG,CAAA;AAAA,oCAE5C,QAAA,EAAA;AAAA,mCAAA;AAAA,kCAbI;AAAA,iCAcP;AAAA,8BAEJ,CAAC;AAAA;AAAA;AACH,yBAAA,EACF;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA;AACF;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,IACC,eAAA,oBACC,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,YAAA;AAAA,QACX,WAAW,EAAA,CAAG,6BAAA,CAA8B,EAAE,IAAA,EAAM,OAAA,EAAS,CAAC,CAAA;AAAA,QAC9D,WAAA,EAAU,mBAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QAET,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,KAC5B;AAAA,IAED,IAAA,oBACC,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,YAAA,EAAc,WAAA,EAAY,IAAK;AAAA;AAAA;AACxC,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-I55QJ4CU.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * DatePicker trigger variant styles using CVA\n */\nexport const datePickerTriggerVariants = cva(\n // Base styles\n [\n \"inline-flex w-full items-center justify-between gap-2 rounded-[var(--date-picker-trigger-radius)] border bg-transparent font-normal transition-[color,box-shadow] outline-none\",\n \"text-left\",\n \"placeholder:text-muted-foreground\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-[color:var(--date-picker-trigger-disabled-bg)] disabled:text-[color:var(--date-picker-trigger-disabled-fg)] disabled:border-[color:var(--date-picker-trigger-disabled-border)]\",\n \"focus-visible:border-[color:var(--date-picker-trigger-border-focus)] focus-visible:ring-[color:var(--date-picker-trigger-ring-primary)]/50 focus-visible:ring-[length:var(--date-picker-trigger-ring-width)]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n \"data-[state=open]:border-ring data-[state=open]:ring-ring/50 data-[state=open]:ring-[3px]\",\n \"min-w-[var(--date-picker-trigger-min-width)]\",\n ],\n {\n variants: {\n size: {\n sm: \"h-[var(--date-picker-trigger-height-sm)] px-[var(--date-picker-trigger-padding-x-sm)] py-[var(--date-picker-trigger-padding-y-sm)] text-[length:var(--date-picker-trigger-text-sm)]\",\n md: \"h-[var(--date-picker-trigger-height-md)] px-[var(--date-picker-trigger-padding-x-md)] py-[var(--date-picker-trigger-padding-y-md)] text-[length:var(--date-picker-trigger-text-md)]\",\n lg: \"h-[var(--date-picker-trigger-height-lg)] px-[var(--date-picker-trigger-padding-x-lg)] py-[var(--date-picker-trigger-padding-y-lg)] text-[length:var(--date-picker-trigger-text-lg)]\",\n },\n variant: {\n default: \"border-input shadow-xs dark:bg-input/30\",\n filled: \"border-transparent bg-muted\",\n flushed: \"rounded-none border-x-0 border-t-0 border-b-input px-0\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * DatePicker clear button styles using CVA.\n *\n * The clear control is a sibling of the trigger (never nested inside the\n * trigger button — button-in-button is invalid). It is absolutely positioned\n * so it overlays the trigger's trailing-icon slot, sitting at the same inset\n * as the calendar icon for each size/variant.\n */\nexport const datePickerClearButtonVariants = cva(\n [\n \"absolute top-1/2 inline-flex size-4 -translate-y-1/2 items-center justify-center rounded-sm outline-none\",\n \"text-muted-foreground opacity-70 transition-opacity\",\n \"hover:opacity-100 focus-visible:opacity-100\",\n \"focus-visible:ring-[color:var(--date-picker-trigger-ring-primary)]/50 focus-visible:ring-[length:var(--date-picker-trigger-ring-width)]\",\n ],\n {\n variants: {\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n variant: {\n default: \"\",\n filled: \"\",\n flushed: \"\",\n },\n },\n compoundVariants: [\n // Non-flushed variants inset the trailing slot by the trigger's px token\n { variant: [\"default\", \"filled\"], size: \"sm\", className: \"right-[var(--date-picker-trigger-padding-x-sm)]\" },\n { variant: [\"default\", \"filled\"], size: \"md\", className: \"right-[var(--date-picker-trigger-padding-x-md)]\" },\n { variant: [\"default\", \"filled\"], size: \"lg\", className: \"right-[var(--date-picker-trigger-padding-x-lg)]\" },\n // Flushed removes horizontal padding, so the slot sits at the edge\n { variant: \"flushed\", className: \"right-0\" },\n ],\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\nexport type DatePickerTriggerVariantProps = VariantProps<typeof datePickerTriggerVariants>\n","import type { DatePickerProps } from \"./DatePicker.types\"\n\nimport { format as formatDate, isAfter, isBefore, setHours, setMinutes, startOfDay } from \"date-fns\"\nimport { CalendarIcon, XIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Calendar } from \"../../advanced/Calendar\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../feedback/Popover\"\nimport { ScrollArea } from \"../../layout/ScrollArea\"\nimport { Button } from \"../../primitives/Button\"\nimport { datePickerClearButtonVariants, datePickerTriggerVariants } from \"./DatePicker.variants\"\n\n/**\n * Convert 24h hours to 12h format with period\n */\nfunction to12Hour(hours: number): { hour12: number; period: \"AM\" | \"PM\" } {\n const period = hours >= 12 ? \"PM\" : \"AM\"\n let hour12 = hours % 12\n if (hour12 === 0) hour12 = 12\n return { hour12, period }\n}\n\n/**\n * Convert 12h format to 24h hours\n */\nfunction to24Hour(hour12: number, period: \"AM\" | \"PM\"): number {\n if (period === \"AM\") {\n return hour12 === 12 ? 0 : hour12\n }\n return hour12 === 12 ? 12 : hour12 + 12\n}\n\n/**\n * Generate array of hour options\n */\nfunction getHourOptions(use12Hour: boolean): number[] {\n if (use12Hour) {\n return [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]\n }\n return Array.from({ length: 24 }, (_, i) => i)\n}\n\n/**\n * Generate array of minute options based on step\n */\nfunction getMinuteOptions(step: number): number[] {\n const options: number[] = []\n for (let i = 0; i < 60; i += step) {\n options.push(i)\n }\n return options\n}\n\nfunction DatePicker({\n ref,\n className,\n align = \"start\",\n dialogLabel = \"Choose date\",\n value,\n defaultValue,\n placeholder = \"Select date\",\n disabled = false,\n disabledDates,\n readOnly = false,\n showTimePicker = false,\n showToday = false,\n timeLabel = \"Time\",\n timeMinuteStep = 1,\n timeUse12Hour = false,\n todayLabel = \"Today\",\n minDate,\n maxDate,\n format = \"PPP\",\n locale,\n onChange,\n onOpenChange,\n onClear,\n size = \"md\",\n variant = \"default\",\n required = false,\n invalid = false,\n clearable = false,\n calendarProps,\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n}: DatePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [internalDate, setInternalDate] = React.useState<Date | undefined>(defaultValue)\n\n // Time state for when showTimePicker is enabled\n const [internalHours, setInternalHours] = React.useState<number>(\n defaultValue ? defaultValue.getHours() : 0\n )\n const [internalMinutes, setInternalMinutes] = React.useState<number>(\n defaultValue ? defaultValue.getMinutes() : 0\n )\n const [internalPeriod, setInternalPeriod] = React.useState<\"AM\" | \"PM\">(() =>\n defaultValue ? to12Hour(defaultValue.getHours()).period : \"AM\"\n )\n\n // Refs for auto-scrolling time columns\n const hourListRef = React.useRef<HTMLDivElement>(null)\n const minuteListRef = React.useRef<HTMLDivElement>(null)\n\n // Use controlled value if provided, otherwise use internal state\n const selectedDate = value ?? internalDate\n\n // Get time from selected date or internal state\n const currentHours = selectedDate ? selectedDate.getHours() : internalHours\n const currentMinutes = selectedDate ? selectedDate.getMinutes() : internalMinutes\n const currentPeriod = selectedDate\n ? to12Hour(selectedDate.getHours()).period\n : internalPeriod\n\n // Compute defaultMonth once for clarity\n const defaultMonth = selectedDate ?? minDate\n\n // Scroll to selected time items when popover opens\n React.useEffect(() => {\n if (!open || !showTimePicker) return\n\n const timeoutId = setTimeout(() => {\n const selectedHour = hourListRef.current?.querySelector('[data-selected=\"true\"]')\n selectedHour?.scrollIntoView({ block: \"center\", behavior: \"instant\" })\n\n const selectedMinute = minuteListRef.current?.querySelector('[data-selected=\"true\"]')\n selectedMinute?.scrollIntoView({ block: \"center\", behavior: \"instant\" })\n }, 0)\n\n return () => { clearTimeout(timeoutId) }\n }, [open, showTimePicker, currentHours, currentMinutes])\n\n const applyTimeToDate = (date: Date | undefined, hours: number, minutes: number): Date | undefined => {\n if (!date) return undefined\n return setMinutes(setHours(date, hours), minutes)\n }\n\n const handleSelect = (date: Date | undefined) => {\n let finalDate = date\n if (showTimePicker && date) {\n // Apply current time to the selected date\n finalDate = applyTimeToDate(date, currentHours, currentMinutes)\n }\n\n if (value === undefined) {\n setInternalDate(finalDate)\n }\n onChange?.(finalDate)\n\n // Only close if not showing time picker, or close after date selection\n if (!showTimePicker) {\n setOpen(false)\n }\n }\n\n const handleTimeChange = (hours: number, minutes: number) => {\n if (value === undefined) {\n setInternalHours(hours)\n setInternalMinutes(minutes)\n }\n\n if (selectedDate) {\n const newDate = applyTimeToDate(selectedDate, hours, minutes)\n if (value === undefined) {\n setInternalDate(newDate)\n }\n onChange?.(newDate)\n }\n }\n\n const handleHourSelect = (hour: number) => {\n let newHours = hour\n if (timeUse12Hour) {\n newHours = to24Hour(hour, currentPeriod)\n }\n if (value === undefined) {\n setInternalHours(newHours)\n }\n handleTimeChange(newHours, currentMinutes)\n }\n\n const handleMinuteSelect = (minute: number) => {\n if (value === undefined) {\n setInternalMinutes(minute)\n }\n handleTimeChange(currentHours, minute)\n }\n\n const handlePeriodSelect = (period: \"AM\" | \"PM\") => {\n if (value === undefined) {\n setInternalPeriod(period)\n }\n const hour12 = timeUse12Hour\n ? currentHours % 12 || 12\n : to12Hour(currentHours).hour12\n const newHours = to24Hour(hour12, period)\n if (value === undefined) {\n setInternalHours(newHours)\n }\n handleTimeChange(newHours, currentMinutes)\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n // Don't open if readOnly\n if (readOnly && isOpen) return\n\n setOpen(isOpen)\n onOpenChange?.(isOpen)\n }\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) {\n setInternalDate(undefined)\n }\n onChange?.()\n onClear?.()\n }\n\n // Format display value with time if showTimePicker is enabled\n const displayValue = React.useMemo(() => {\n if (!selectedDate) return null\n\n const dateStr = formatDate(selectedDate, format, locale ? { locale } : undefined)\n\n if (showTimePicker) {\n const timeStr = timeUse12Hour\n ? `${String(to12Hour(currentHours).hour12)}:${currentMinutes.toString().padStart(2, \"0\")} ${currentPeriod}`\n : `${currentHours.toString().padStart(2, \"0\")}:${currentMinutes.toString().padStart(2, \"0\")}`\n return `${dateStr} ${timeStr}`\n }\n\n return dateStr\n }, [selectedDate, format, locale, showTimePicker, timeUse12Hour, currentHours, currentMinutes, currentPeriod])\n\n // Memoize time options\n const hourOptions = React.useMemo(() => getHourOptions(timeUse12Hour), [timeUse12Hour])\n const minuteOptions = React.useMemo(() => getMinuteOptions(timeMinuteStep), [timeMinuteStep])\n\n // Calculate display hour for matching in 12h mode\n const displayHour = timeUse12Hour\n ? to12Hour(currentHours).hour12\n : currentHours\n\n // Signal for the filled field state (date selected). The `filled` style\n // variant is independent — this is the data hook consumers/tests rely on.\n const hasValue = Boolean(selectedDate)\n\n const showClearButton = clearable && hasValue && !disabled && !readOnly\n\n // Combined date disabled check\n const isDateDisabled = React.useCallback(\n (date: Date): boolean => {\n const normalizedDate = startOfDay(date)\n if (minDate && isBefore(normalizedDate, startOfDay(minDate))) return true\n if (maxDate && isAfter(normalizedDate, startOfDay(maxDate))) return true\n if (disabledDates?.(date)) return true\n return false\n },\n [minDate, maxDate, disabledDates]\n )\n\n // Check if today is disabled\n const isTodayDisabled = React.useMemo(() => {\n return isDateDisabled(new Date())\n }, [isDateDisabled])\n\n // Handle selecting today\n const handleSelectToday = () => {\n const today = startOfDay(new Date())\n if (!isDateDisabled(today)) {\n handleSelect(today)\n }\n }\n\n return (\n <div className={cn(\"relative\", className)} data-slot=\"date-picker\" {...props}>\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button\n ref={ref}\n className={cn(\n datePickerTriggerVariants({ size, variant }),\n !displayValue && \"text-muted-foreground\"\n )}\n aria-describedby={ariaDescribedby}\n aria-disabled={readOnly || undefined}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={invalid}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-required={required}\n data-has-value={hasValue}\n data-readonly={readOnly || undefined}\n data-size={size}\n data-slot=\"date-picker-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={variant}\n disabled={disabled}\n id={id}\n type=\"button\"\n >\n <span className=\"flex-1 truncate\">\n {displayValue ?? placeholder}\n </span>\n <CalendarIcon\n aria-hidden=\"true\"\n className={cn(\"size-4 shrink-0 opacity-50\", showClearButton && \"invisible\")}\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={align}\n aria-label={dialogLabel}\n className=\"w-auto p-0\"\n data-slot=\"date-picker-calendar\"\n >\n <Calendar\n autoFocus\n footer={\n showToday ? (\n <div className=\"border-t border-border p-2\" data-slot=\"date-picker-footer\">\n <Button\n className=\"w-full\"\n disabled={isTodayDisabled}\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleSelectToday}\n >\n {todayLabel}\n </Button>\n </div>\n ) : undefined\n }\n defaultMonth={defaultMonth}\n disabled={isDateDisabled}\n locale={locale}\n mode=\"single\"\n selected={selectedDate}\n onSelect={handleSelect}\n {...calendarProps}\n />\n\n {/* Time Picker Section */}\n {showTimePicker && (\n <div\n className=\"border-t border-border\"\n data-slot=\"date-picker-time\"\n >\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground\">\n {timeLabel}\n </div>\n <div\n aria-label=\"Time selection\"\n className=\"flex divide-x border-t border-border\"\n role=\"listbox\"\n >\n {/* Hours Column */}\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n {timeUse12Hour ? \"Hour\" : \"Hours\"}\n </div>\n <ScrollArea className=\"h-36\">\n <div\n ref={hourListRef}\n aria-label=\"Hours\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {hourOptions.map((hour) => {\n const isSelected = displayHour === hour\n return (\n <button\n key={hour}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handleHourSelect(hour); }}\n >\n {timeUse12Hour ? hour : hour.toString().padStart(2, \"0\")}\n </button>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n\n {/* Minutes Column */}\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n Min\n </div>\n <ScrollArea className=\"h-36\">\n <div\n ref={minuteListRef}\n aria-label=\"Minutes\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {minuteOptions.map((minute) => {\n const isSelected = currentMinutes === minute\n return (\n <button\n key={minute}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handleMinuteSelect(minute); }}\n >\n {minute.toString().padStart(2, \"0\")}\n </button>\n )\n })}\n </div>\n </ScrollArea>\n </div>\n\n {/* AM/PM Column (12-hour mode only) */}\n {timeUse12Hour && (\n <div className=\"flex flex-col\">\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground text-center border-b\">\n \n </div>\n <div\n aria-label=\"Period\"\n className=\"flex flex-col items-stretch p-1\"\n role=\"group\"\n >\n {([\"AM\", \"PM\"] as const).map((period) => {\n const isSelected = currentPeriod === period\n return (\n <button\n key={period}\n className={cn(\n \"flex h-8 w-12 items-center justify-center rounded-sm text-sm\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isSelected && \"bg-primary text-primary-foreground\"\n )}\n aria-selected={isSelected}\n data-selected={isSelected}\n role=\"option\"\n type=\"button\"\n onClick={() => { handlePeriodSelect(period); }}\n >\n {period}\n </button>\n )\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n {showClearButton && (\n <button\n aria-label=\"Clear date\"\n className={cn(datePickerClearButtonVariants({ size, variant }))}\n data-slot=\"date-picker-clear\"\n type=\"button\"\n onClick={handleClear}\n >\n <XIcon className=\"size-4\" />\n </button>\n )}\n {name && (\n <input\n name={name}\n type=\"hidden\"\n value={selectedDate?.toISOString() ?? \"\"}\n />\n )}\n </div>\n )\n}\n\nexport { DatePicker }\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { Checkbox } from './chunk-XETKCF73.js';
|
|
1
2
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
2
3
|
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
3
4
|
import { Command } from 'cmdk';
|
|
4
|
-
import { XIcon, ChevronDownIcon, SearchIcon
|
|
5
|
+
import { XIcon, ChevronDownIcon, SearchIcon } from 'lucide-react';
|
|
5
6
|
import * as React from 'react';
|
|
6
7
|
import { cva } from 'class-variance-authority';
|
|
7
8
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
@@ -9,7 +10,7 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
9
10
|
var multiSelectTriggerVariants = cva(
|
|
10
11
|
// Base styles
|
|
11
12
|
[
|
|
12
|
-
"flex w-[var(--multiselect-trigger-width)] items-center justify-between gap-2 rounded-[var(--multiselect-trigger-radius)] border bg-transparent",
|
|
13
|
+
"flex w-full min-w-[var(--multiselect-trigger-width)] items-center justify-between gap-2 rounded-[var(--multiselect-trigger-radius)] border bg-transparent",
|
|
13
14
|
"text-sm whitespace-normal shadow-xs transition-[color,box-shadow] outline-none",
|
|
14
15
|
"data-[placeholder]:text-muted-foreground",
|
|
15
16
|
"[&_svg:not([class*='text-'])]:text-muted-foreground",
|
|
@@ -42,7 +43,7 @@ var multiSelectContentVariants = cva(
|
|
|
42
43
|
// Base styles
|
|
43
44
|
[
|
|
44
45
|
"bg-[color:var(--multiselect-content-bg)] text-[color:var(--multiselect-content-fg)]",
|
|
45
|
-
"z-50 w-[var(--multiselect-content-width)] overflow-hidden rounded-[var(--multiselect-content-radius)] border shadow-[var(--multiselect-content-shadow)] p-0",
|
|
46
|
+
"z-50 w-[var(--radix-popper-anchor-width)] min-w-[var(--multiselect-content-width)] overflow-hidden rounded-[var(--multiselect-content-radius)] border shadow-[var(--multiselect-content-shadow)] p-0",
|
|
46
47
|
// Animation classes
|
|
47
48
|
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
48
49
|
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
@@ -305,13 +306,14 @@ function MultiSelect({
|
|
|
305
306
|
},
|
|
306
307
|
children: [
|
|
307
308
|
/* @__PURE__ */ jsx(
|
|
308
|
-
|
|
309
|
+
Checkbox,
|
|
309
310
|
{
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
311
|
+
"aria-hidden": true,
|
|
312
|
+
checked: isSelected,
|
|
313
|
+
className: "pointer-events-none",
|
|
314
|
+
disabled: isDisabled,
|
|
315
|
+
size: "sm",
|
|
316
|
+
tabIndex: -1
|
|
315
317
|
}
|
|
316
318
|
),
|
|
317
319
|
option.label
|
|
@@ -331,5 +333,5 @@ function MultiSelect({
|
|
|
331
333
|
}
|
|
332
334
|
|
|
333
335
|
export { MultiSelect };
|
|
334
|
-
//# sourceMappingURL=chunk-
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
336
|
+
//# sourceMappingURL=chunk-IOWHM7ZY.js.map
|
|
337
|
+
//# sourceMappingURL=chunk-IOWHM7ZY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/MultiSelect/MultiSelect.variants.ts","../src/components/forms/MultiSelect/MultiSelect.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-IOWHM7ZY.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * MultiSelectTrigger variant styles using CVA\n */\nexport const multiSelectTriggerVariants = cva(\n // Base styles\n [\n \"flex w-full min-w-[var(--multiselect-trigger-width)] items-center justify-between gap-2 rounded-[var(--multiselect-trigger-radius)] border bg-transparent\",\n \"text-sm whitespace-normal shadow-xs transition-[color,box-shadow] outline-none\",\n \"data-[placeholder]:text-muted-foreground\",\n \"[&_svg:not([class*='text-'])]:text-muted-foreground\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n \"dark:bg-input/30 dark:hover:bg-input/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n ],\n {\n variants: {\n size: {\n sm: \"min-h-[var(--multiselect-trigger-min-height-sm)] px-[var(--multiselect-trigger-padding-x-sm)] py-[var(--multiselect-trigger-padding-y-sm)] text-[length:var(--multiselect-trigger-text-sm)]\",\n md: \"min-h-[var(--multiselect-trigger-min-height-md)] px-[var(--multiselect-trigger-padding-x-md)] py-[var(--multiselect-trigger-padding-y-md)] text-[length:var(--multiselect-trigger-text-md)]\",\n lg: \"min-h-[var(--multiselect-trigger-min-height-lg)] px-[var(--multiselect-trigger-padding-x-lg)] py-[var(--multiselect-trigger-padding-y-lg)] text-[length:var(--multiselect-trigger-text-lg)]\",\n },\n variant: {\n default: \"border-input shadow-xs\",\n filled: \"border-transparent bg-muted\",\n flushed: \"rounded-none border-x-0 border-t-0 border-b-input px-0 shadow-none\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\n/**\n * MultiSelectContent variant styles using CVA\n */\nexport const multiSelectContentVariants = cva(\n // Base styles\n [\n \"bg-[color:var(--multiselect-content-bg)] text-[color:var(--multiselect-content-fg)]\",\n \"z-50 w-[var(--radix-popper-anchor-width)] min-w-[var(--multiselect-content-width)] overflow-hidden rounded-[var(--multiselect-content-radius)] border shadow-[var(--multiselect-content-shadow)] p-0\",\n // Animation classes\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * MultiSelectInput variant styles using CVA\n */\nexport const multiSelectInputVariants = cva(\n [\n \"flex h-[var(--multiselect-input-height)] w-full rounded-md bg-transparent py-[var(--multiselect-input-padding-y)] text-[length:var(--multiselect-input-text)] outline-none\",\n \"placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * MultiSelectItem variant styles using CVA\n */\nexport const multiSelectItemVariants = cva(\n [\n \"relative flex cursor-default items-center gap-2 rounded-[var(--multiselect-item-radius)] px-[var(--multiselect-item-padding-x)] py-[var(--multiselect-item-padding-y)] text-[length:var(--multiselect-item-text)]\",\n \"outline-none select-none\",\n \"data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50\",\n \"data-[highlighted=true]:bg-accent data-[highlighted=true]:text-accent-foreground\",\n \"[&_svg:not([class*='text-'])]:text-muted-foreground\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * MultiSelectEmpty variant styles using CVA\n */\nexport const multiSelectEmptyVariants = cva(\n [\"py-[var(--multiselect-empty-padding-y)] text-center text-[length:var(--multiselect-empty-text)] text-[color:var(--multiselect-empty-fg)]\"],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * MultiSelectTag variant styles using CVA\n */\nexport const multiSelectTagVariants = cva(\n [\n \"inline-flex items-center gap-1 rounded-[var(--multiselect-tag-radius)] bg-[color:var(--multiselect-tag-bg)] text-[color:var(--multiselect-tag-fg)]\",\n \"font-medium shrink-0\",\n \"[&_svg]:size-3 [&_svg]:shrink-0\",\n ],\n {\n variants: {\n size: {\n sm: \"text-[length:var(--multiselect-tag-text-sm)] px-[var(--multiselect-tag-padding-x-sm)] py-[var(--multiselect-tag-padding-y-sm)]\",\n md: \"text-[length:var(--multiselect-tag-text-md)] px-[var(--multiselect-tag-padding-x-md)] py-[var(--multiselect-tag-padding-y-md)]\",\n lg: \"text-[length:var(--multiselect-tag-text-lg)] px-[var(--multiselect-tag-padding-x-lg)] py-[var(--multiselect-tag-padding-y-lg)]\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type MultiSelectTriggerVariantProps = VariantProps<typeof multiSelectTriggerVariants>\nexport type MultiSelectContentVariantProps = VariantProps<typeof multiSelectContentVariants>\nexport type MultiSelectInputVariantProps = VariantProps<typeof multiSelectInputVariants>\nexport type MultiSelectItemVariantProps = VariantProps<typeof multiSelectItemVariants>\nexport type MultiSelectEmptyVariantProps = VariantProps<typeof multiSelectEmptyVariants>\nexport type MultiSelectTagVariantProps = VariantProps<typeof multiSelectTagVariants>\n","import type { MultiSelectProps } from \"./MultiSelect.types\"\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { ChevronDownIcon, SearchIcon, XIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Checkbox } from \"../Checkbox\"\nimport {\n multiSelectContentVariants,\n multiSelectEmptyVariants,\n multiSelectInputVariants,\n multiSelectItemVariants,\n multiSelectTagVariants,\n multiSelectTriggerVariants,\n} from \"./MultiSelect.variants\"\n\n/**\n * MultiSelect - A multi-selection component with tags display\n *\n * Uses Radix Popover for the dropdown container and cmdk (Command) for\n * search/filter functionality with full keyboard accessibility.\n * Selected items are displayed as removable tags.\n *\n * @example\n * ```tsx\n * <MultiSelect\n * options={[\n * { value: \"apple\", label: \"Apple\" },\n * { value: \"banana\", label: \"Banana\" },\n * ]}\n * placeholder=\"Select fruits...\"\n * onChange={(values) => console.log(values)}\n * />\n * ```\n */\nfunction MultiSelect({\n options,\n value: controlledValue,\n defaultValue = [],\n placeholder = \"Select options...\",\n searchPlaceholder = \"Search...\",\n emptyMessage = \"No results found.\",\n disabled = false,\n error = false,\n errorMessage: _errorMessage,\n icon,\n maxSelected,\n name,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n onChange,\n onSearch,\n required = false,\n size = \"md\",\n variant = \"default\",\n className,\n ...props\n}: MultiSelectProps) {\n // Handle controlled vs uncontrolled value\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue)\n const values = controlledValue ?? internalValue\n\n // Handle controlled vs uncontrolled open state\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen)\n const open = controlledOpen ?? internalOpen\n\n // Search query state\n const [searchQuery, setSearchQuery] = React.useState(\"\")\n\n // Get labels for selected values\n const selectedLabels = React.useMemo(() => {\n return values\n .map((val) => {\n const option = options.find((opt) => opt.value === val)\n return option ? { value: val, label: option.label } : null\n })\n .filter((item): item is { label: string; value: string; } => item !== null)\n }, [values, options])\n\n // Check if max selected limit is reached\n const isMaxReached = maxSelected !== undefined && values.length >= maxSelected\n\n // Handle open state changes\n const handleOpenChange = React.useCallback(\n (newOpen: boolean) => {\n // Prevent opening when disabled\n if (disabled && newOpen) {\n return\n }\n\n if (controlledOpen === undefined) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n\n // Clear search when closing\n if (!newOpen) {\n setSearchQuery(\"\")\n }\n },\n [controlledOpen, onOpenChange, disabled]\n )\n\n // Handle value toggle\n const handleToggle = React.useCallback(\n (selectedValue: string) => {\n const newValues = values.includes(selectedValue)\n ? values.filter((v) => v !== selectedValue)\n : isMaxReached\n ? values\n : [...values, selectedValue]\n\n if (controlledValue === undefined) {\n setInternalValue(newValues)\n }\n onChange?.(newValues)\n },\n [values, controlledValue, onChange, isMaxReached]\n )\n\n // Handle tag removal\n const handleRemove = React.useCallback(\n (valueToRemove: string, event?: React.MouseEvent) => {\n event?.stopPropagation()\n const newValues = values.filter((v) => v !== valueToRemove)\n if (controlledValue === undefined) {\n setInternalValue(newValues)\n }\n onChange?.(newValues)\n },\n [values, controlledValue, onChange]\n )\n\n // Handle search input changes\n const handleSearchChange = React.useCallback(\n (query: string) => {\n setSearchQuery(query)\n onSearch?.(query)\n },\n [onSearch]\n )\n\n return (\n <>\n {/* Hidden inputs for form submission */}\n {name &&\n values.map((val) => (\n <input key={val} name={name} type=\"hidden\" value={val} />\n ))}\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild disabled={disabled}>\n <div\n className={cn(\n multiSelectTriggerVariants({ size, variant }),\n \"cursor-pointer flex-wrap\",\n disabled && \"pointer-events-none\",\n className\n )}\n aria-disabled={disabled || undefined}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n data-disabled={disabled || undefined}\n data-error={error || undefined}\n data-size={size}\n data-slot=\"multi-select\"\n data-variant={variant}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n if (!disabled) {\n handleOpenChange(!open)\n }\n }\n }}\n {...props}\n >\n <div\n className=\"flex flex-1 flex-wrap items-center gap-1\"\n data-slot=\"multi-select-trigger\"\n >\n {icon && (\n <span className=\"shrink-0\" data-slot=\"multi-select-icon\">\n {icon}\n </span>\n )}\n {selectedLabels.length === 0 ? (\n <span data-placeholder className=\"text-muted-foreground\">\n {placeholder}\n </span>\n ) : (\n selectedLabels.map((item) => (\n <span\n key={item.value}\n className={cn(multiSelectTagVariants({ size }))}\n data-slot=\"multi-select-tag\"\n data-value={item.value}\n >\n {item.label}\n <button\n aria-label={`Remove ${item.label}`}\n className=\"ml-0.5 rounded-sm hover:bg-foreground/10 focus:outline-none\"\n tabIndex={-1}\n type=\"button\"\n onClick={(e) => { handleRemove(item.value, e); }}\n >\n <XIcon className=\"size-3\" />\n </button>\n </span>\n ))\n )}\n </div>\n <ChevronDownIcon className=\"size-4 shrink-0 opacity-50\" />\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n className={cn(multiSelectContentVariants())}\n data-slot=\"multi-select-content\"\n sideOffset={4}\n >\n <CommandPrimitive\n className=\"flex h-full w-full flex-col overflow-hidden\"\n shouldFilter={!onSearch}\n >\n <div className=\"flex items-center border-b px-3\">\n <SearchIcon className=\"mr-2 size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n className={cn(multiSelectInputVariants())}\n data-slot=\"multi-select-input\"\n placeholder={searchPlaceholder}\n value={searchQuery}\n onValueChange={handleSearchChange}\n />\n </div>\n\n <CommandPrimitive.List className=\"max-h-72 overflow-y-auto overflow-x-hidden p-1\">\n <CommandPrimitive.Empty className={cn(multiSelectEmptyVariants())}>\n {emptyMessage}\n </CommandPrimitive.Empty>\n\n {options.map((option) => {\n const isSelected = values.includes(option.value)\n const isDisabled = option.disabled ?? (!isSelected && isMaxReached)\n\n return (\n <CommandPrimitive.Item\n key={option.value}\n className={cn(multiSelectItemVariants())}\n data-disabled={isDisabled || undefined}\n data-selected={isSelected || undefined}\n data-slot=\"multi-select-item\"\n disabled={isDisabled}\n value={option.label}\n onSelect={() => {\n if (!isDisabled) {\n handleToggle(option.value)\n }\n }}\n >\n <Checkbox\n aria-hidden\n checked={isSelected}\n className=\"pointer-events-none\"\n disabled={isDisabled}\n size=\"sm\"\n tabIndex={-1}\n />\n {option.label}\n </CommandPrimitive.Item>\n )\n })}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n )\n}\n\nexport { MultiSelect }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-
|
|
1
|
+
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-5SUD32RK.js';
|
|
2
2
|
import { SkeletonLoader } from './chunk-QHKOBGLW.js';
|
|
3
3
|
import { Checkbox } from './chunk-XETKCF73.js';
|
|
4
4
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
@@ -222,5 +222,5 @@ function VirtualTable({
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
export { VirtualTable };
|
|
225
|
-
//# sourceMappingURL=chunk-
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
225
|
+
//# sourceMappingURL=chunk-IZC5YFGO.js.map
|
|
226
|
+
//# sourceMappingURL=chunk-IZC5YFGO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/VirtualTable/VirtualTable.tsx"],"names":["table"],"mappings":"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","file":"chunk-ILAV2AZ4.js","sourcesContent":["import type { VirtualTableProps } from \"./VirtualTable.types\"\nimport type {\n Table as ReactTable,\n Row,\n RowSelectionState,\n} from \"@tanstack/react-table\"\n\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport { useVirtualizer } from \"@tanstack/react-virtual\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Checkbox } from \"../../forms/Checkbox\"\nimport { SkeletonLoader } from \"../../primitives/SkeletonLoader\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../Table\"\n\n// Static keys for skeleton loader to avoid array index as key\nconst SKELETON_KEYS = [\n \"skeleton-row-1\",\n \"skeleton-row-2\",\n \"skeleton-row-3\",\n \"skeleton-row-4\",\n \"skeleton-row-5\",\n] as const\n\n/**\n * VirtualTable - High-performance virtualized table for large datasets.\n *\n * Renders only visible rows in the viewport, enabling smooth scrolling\n * with thousands or millions of rows. Built on TanStack Virtual and\n * TanStack Table.\n *\n * @example\n * ```tsx\n * import { VirtualTable } from '@etus/ui'\n * import { ColumnDef } from '@tanstack/react-table'\n *\n * interface LogEntry {\n * id: string\n * timestamp: Date\n * level: 'info' | 'warn' | 'error'\n * message: string\n * }\n *\n * const columns: ColumnDef<LogEntry>[] = [\n * { accessorKey: 'timestamp', header: 'Time', size: 150 },\n * { accessorKey: 'level', header: 'Level', size: 80 },\n * { accessorKey: 'message', header: 'Message' },\n * ]\n *\n * function LogViewer() {\n * const { data } = useLogs() // 100k+ entries\n *\n * return (\n * <VirtualTable\n * data={data}\n * columns={columns}\n * rowHeight={36}\n * containerHeight={600}\n * getRowId={(row) => row.id}\n * />\n * )\n * }\n * ```\n */\nfunction VirtualTable<TData>({\n data,\n columns,\n rowHeight = 40,\n overscan = 5,\n estimateSize,\n containerHeight = 400,\n enableRowSelection = false,\n onRowClick,\n getRowId,\n loading = false,\n loadingComponent,\n emptyState,\n className,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onSelectionChange,\n rowClassName,\n stickyHeader = true,\n}: VirtualTableProps<TData>) {\n const parentRef = React.useRef<HTMLDivElement>(null)\n const [internalRowSelection, setInternalRowSelection] =\n React.useState<RowSelectionState>({})\n\n const rowSelection = controlledRowSelection ?? internalRowSelection\n\n // Create wrapper for row selection change to also notify onSelectionChange\n const handleRowSelectionChange = React.useCallback(\n (\n updaterOrValue:\n | ((old: RowSelectionState) => RowSelectionState)\n | RowSelectionState\n ) => {\n const newValue =\n typeof updaterOrValue === \"function\"\n ? updaterOrValue(rowSelection)\n : updaterOrValue\n\n // Update internal or controlled state\n if (onRowSelectionChange) {\n onRowSelectionChange(newValue)\n } else {\n setInternalRowSelection(newValue)\n }\n\n // Notify parent of selected rows as TData array\n if (onSelectionChange) {\n const selectedIndices = Object.keys(newValue).filter(\n (key) => newValue[key]\n )\n const selectedRows = selectedIndices\n .map((idx) => data[Number(idx)])\n .filter(Boolean) as TData[]\n onSelectionChange(selectedRows)\n }\n },\n [rowSelection, onRowSelectionChange, onSelectionChange, data]\n )\n\n // Memoize column definitions with selection column\n const tableColumns = React.useMemo(() => {\n if (!enableRowSelection) return columns\n\n return [\n {\n id: \"select\",\n header: ({ table }: { table: ReactTable<TData> }) => (\n <Checkbox\n checked={\n table.getIsAllPageRowsSelected() ||\n (table.getIsSomePageRowsSelected() && \"indeterminate\")\n }\n aria-label=\"Select all\"\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(!!value)\n }}\n />\n ),\n cell: ({ row }: { row: Row<TData> }) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n row.toggleSelected(!!value)\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 40,\n },\n ...columns,\n ]\n }, [columns, enableRowSelection])\n\n // Initialize table\n // eslint-disable-next-line react-hooks/incompatible-library -- TanStack Table's API is required here.\n const table = useReactTable({\n data,\n columns: tableColumns,\n state: {\n rowSelection,\n },\n enableRowSelection,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n onRowSelectionChange: handleRowSelectionChange,\n })\n\n const { rows } = table.getRowModel()\n\n // Initialize virtualizer\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => parentRef.current,\n estimateSize: estimateSize ?? (() => rowHeight),\n overscan,\n })\n\n const virtualItems = virtualizer.getVirtualItems()\n const totalSize = virtualizer.getTotalSize()\n\n // Calculate container height style\n const containerStyle: React.CSSProperties = {\n height:\n typeof containerHeight === \"number\"\n ? `${String(containerHeight)}px`\n : containerHeight,\n overflow: \"auto\",\n willChange: \"transform\",\n }\n\n // Render loading state\n if (loading) {\n return (\n <div className={cn(\"space-y-4\", className)} data-slot=\"virtual-table\">\n {loadingComponent ?? (\n <div className=\"space-y-2\" data-slot=\"virtual-table-loading\">\n {SKELETON_KEYS.map((key) => (\n <SkeletonLoader key={key} className=\"h-10 w-full\" />\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // Render empty state\n if (data.length === 0) {\n return (\n <div className={cn(\"space-y-4\", className)} data-slot=\"virtual-table\">\n {emptyState ?? (\n <div\n className=\"flex flex-col items-center justify-center py-12 text-center\"\n data-slot=\"virtual-table-empty\"\n >\n <p className=\"text-muted-foreground text-sm\">No data available</p>\n </div>\n )}\n </div>\n )\n }\n\n // Calculate padding for virtual items\n const firstItem = virtualItems[0]\n const lastItem = virtualItems[virtualItems.length - 1]\n const paddingTop = firstItem ? firstItem.start : 0\n const paddingBottom = lastItem ? totalSize - lastItem.end : 0\n\n return (\n <div\n className={cn(\"rounded-md border\", className)}\n data-slot=\"virtual-table\"\n >\n <div\n ref={parentRef}\n className=\"relative\"\n data-slot=\"virtual-table-container\"\n style={containerStyle}\n >\n <Table>\n <TableHeader\n className={cn(\n stickyHeader && \"bg-[color:var(--table-header-bg)] sticky top-0 z-10\"\n )}\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n style={{\n width: header.getSize() !== 150 ? header.getSize() : undefined,\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {/* Top padding row */}\n {paddingTop > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colSpan={tableColumns.length}\n style={{ height: `${String(paddingTop)}px`, padding: 0 }}\n />\n </tr>\n )}\n\n {/* Virtual rows */}\n {virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index]\n if (!row) return null\n return (\n <TableRow\n key={row.id}\n className={cn(\n onRowClick && \"cursor-pointer\",\n rowClassName?.(row)\n )}\n style={{\n height: `${String(virtualRow.size)}px`,\n }}\n aria-rowindex={virtualRow.index + 1}\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n onClick={\n onRowClick\n ? () => {\n onRowClick(row.original)\n }\n : undefined\n }\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n style={{\n width:\n cell.column.getSize() !== 150\n ? cell.column.getSize()\n : undefined,\n }}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n\n {/* Bottom padding row */}\n {paddingBottom > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colSpan={tableColumns.length}\n style={{ height: `${String(paddingBottom)}px`, padding: 0 }}\n />\n </tr>\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n )\n}\n\nexport { VirtualTable }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/VirtualTable/VirtualTable.tsx"],"names":["table"],"mappings":";;;;;;;;;AA4BA,IAAM,aAAA,GAAgB;AAAA,EACpB,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA;AA0CA,SAAS,YAAA,CAAoB;AAAA,EAC3B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,CAAA;AAAA,EACX,YAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,kBAAA,GAAqB,KAAA;AAAA,EACrB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,EAAc,sBAAA;AAAA,EACd,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAA6B;AAC3B,EAAA,MAAM,SAAA,GAAkB,aAAuB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAC5C,KAAA,CAAA,QAAA,CAA4B,EAAE,CAAA;AAEtC,EAAA,MAAM,eAAe,sBAAA,IAA0B,oBAAA;AAG/C,EAAA,MAAM,wBAAA,GAAiC,KAAA,CAAA,WAAA;AAAA,IACrC,CACE,cAAA,KAGG;AACH,MAAA,MAAM,WACJ,OAAO,cAAA,KAAmB,UAAA,GACtB,cAAA,CAAe,YAAY,CAAA,GAC3B,cAAA;AAGN,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,uBAAA,CAAwB,QAAQ,CAAA;AAAA,MAClC;AAGA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA;AAAA,UAC5C,CAAC,GAAA,KAAQ,QAAA,CAAS,GAAG;AAAA,SACvB;AACA,QAAA,MAAM,YAAA,GAAe,eAAA,CAClB,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAC9B,MAAA,CAAO,OAAO,CAAA;AACjB,QAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,oBAAA,EAAsB,iBAAA,EAAmB,IAAI;AAAA,GAC9D;AAGA,EAAA,MAAM,YAAA,GAAqB,cAAQ,MAAM;AACvC,IAAA,IAAI,CAAC,oBAAoB,OAAO,OAAA;AAEhC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAAA,QAAM,qBACf,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SACEA,MAAAA,CAAM,wBAAA,EAAyB,IAC9BA,MAAAA,CAAM,2BAA0B,IAAK,eAAA;AAAA,YAExC,YAAA,EAAW,YAAA;AAAA,YACX,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,cAAAA,MAAAA,CAAM,yBAAA,CAA0B,CAAC,CAAC,KAAK,CAAA;AAAA,YACzC;AAAA;AAAA,SACF;AAAA,QAEF,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI,qBACX,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,YAAA;AAAA,YACX,OAAA,EAAS,IAAI,aAAA,EAAc;AAAA,YAC3B,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,cAAA,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,KAAK,CAAA;AAAA,YAC5B;AAAA;AAAA,SACF;AAAA,QAEF,aAAA,EAAe,KAAA;AAAA,QACf,YAAA,EAAc,KAAA;AAAA,QACd,IAAA,EAAM;AAAA,OACR;AAAA,MACA,GAAG;AAAA,KACL;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAkB,CAAC,CAAA;AAIhC,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO;AAAA,MACL;AAAA,KACF;AAAA,IACA,kBAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAiB,eAAA,EAAgB;AAAA,IACjC,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,KAAA,CAAM,WAAA,EAAY;AAGnC,EAAA,MAAM,cAAc,cAAA,CAAe;AAAA,IACjC,OAAO,IAAA,CAAK,MAAA;AAAA,IACZ,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA;AAAA,IAClC,YAAA,EAAc,iBAAiB,MAAM,SAAA,CAAA;AAAA,IACrC;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,YAAY,eAAA,EAAgB;AACjD,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,EAAa;AAG3C,EAAA,MAAM,cAAA,GAAsC;AAAA,IAC1C,MAAA,EACE,OAAO,eAAA,KAAoB,QAAA,GACvB,GAAG,MAAA,CAAO,eAAe,CAAC,CAAA,EAAA,CAAA,GAC1B,eAAA;AAAA,IACN,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EAAG,WAAA,EAAU,eAAA,EACnD,QAAA,EAAA,gBAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,WAAA,EAAU,uBAAA,EAClC,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,qBAClB,GAAA,CAAC,cAAA,EAAA,EAAyB,SAAA,EAAU,aAAA,EAAA,EAAf,GAA6B,CACnD,CAAA,EACH,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,aAAa,SAAS,CAAA,EAAG,WAAA,EAAU,eAAA,EACnD,QAAA,EAAA,UAAA,oBACC,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,6DAAA;AAAA,QACV,WAAA,EAAU,qBAAA;AAAA,QAEV,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,mBAAA,EAAiB;AAAA;AAAA,KAChE,EAEJ,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,SAAA,GAAY,aAAa,CAAC,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,SAAA,GAAY,SAAA,CAAU,KAAA,GAAQ,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,QAAA,GAAW,SAAA,GAAY,QAAA,CAAS,GAAA,GAAM,CAAA;AAE5D,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA;AAAA,MAC5C,WAAA,EAAU,eAAA;AAAA,MAEV,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,SAAA,EAAU,UAAA;AAAA,UACV,WAAA,EAAU,yBAAA;AAAA,UACV,KAAA,EAAO,cAAA;AAAA,UAEP,+BAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,YAAA,IAAgB;AAAA,iBAClB;AAAA,gBAEC,QAAA,EAAA,KAAA,CAAM,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,WAAA,qBAC5B,GAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACxB,GAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBAEC,KAAA,EAAO;AAAA,sBACL,OAAO,MAAA,CAAO,OAAA,OAAc,GAAA,GAAM,MAAA,CAAO,SAAQ,GAAI;AAAA,qBACvD;AAAA,oBAEC,QAAA,EAAA,MAAA,CAAO,gBACJ,IAAA,GACA,UAAA;AAAA,sBACE,MAAA,CAAO,OAAO,SAAA,CAAU,MAAA;AAAA,sBACxB,OAAO,UAAA;AAAW;AACpB,mBAAA;AAAA,kBAVC,MAAA,CAAO;AAAA,iBAYf,CAAA,EAAA,EAfY,WAAA,CAAY,EAgB3B,CACD;AAAA;AAAA,aACH;AAAA,iCACC,SAAA,EAAA,EAEE,QAAA,EAAA;AAAA,cAAA,UAAA,GAAa,CAAA,oBACZ,GAAA,CAAC,IAAA,EAAA,EAAG,aAAA,EAAY,MAAA,EACd,QAAA,kBAAA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,YAAA,CAAa,MAAA;AAAA,kBACtB,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,UAAU,CAAC,CAAA,EAAA,CAAA,EAAM,OAAA,EAAS,CAAA;AAAE;AAAA,eACzD,EACF,CAAA;AAAA,cAID,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,KAAe;AAChC,gBAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACjC,gBAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,gBAAA,uBACE,GAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAW,EAAA;AAAA,sBACT,UAAA,IAAc,gBAAA;AAAA,sBACd,eAAe,GAAG;AAAA,qBACpB;AAAA,oBACA,KAAA,EAAO;AAAA,sBACL,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA,EAAA;AAAA,qBACpC;AAAA,oBACA,eAAA,EAAe,WAAW,KAAA,GAAQ,CAAA;AAAA,oBAClC,YAAA,EAAY,GAAA,CAAI,aAAA,EAAc,GAAI,UAAA,GAAa,MAAA;AAAA,oBAC/C,OAAA,EACE,aACI,MAAM;AACJ,sBAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,oBACzB,CAAA,GACA,MAAA;AAAA,oBAGL,QAAA,EAAA,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,IAAA,qBAC1B,GAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBAEC,KAAA,EAAO;AAAA,0BACL,KAAA,EACE,KAAK,MAAA,CAAO,OAAA,OAAc,GAAA,GACtB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ,GACpB;AAAA,yBACR;AAAA,wBAEC,QAAA,EAAA,UAAA;AAAA,0BACC,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA;AAAA,0BACtB,KAAK,UAAA;AAAW;AAClB,uBAAA;AAAA,sBAXK,IAAA,CAAK;AAAA,qBAab;AAAA,mBAAA;AAAA,kBAjCI,GAAA,CAAI;AAAA,iBAkCX;AAAA,cAEJ,CAAC,CAAA;AAAA,cAGA,aAAA,GAAgB,CAAA,oBACf,GAAA,CAAC,IAAA,EAAA,EAAG,eAAY,MAAA,EACd,QAAA,kBAAA,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,YAAA,CAAa,MAAA;AAAA,kBACtB,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,aAAa,CAAC,CAAA,EAAA,CAAA,EAAM,OAAA,EAAS,CAAA;AAAE;AAAA,eAC5D,EACF;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF;AAAA;AAAA;AACF;AAAA,GACF;AAEJ","file":"chunk-IZC5YFGO.js","sourcesContent":["import type { VirtualTableProps } from \"./VirtualTable.types\"\nimport type {\n Table as ReactTable,\n Row,\n RowSelectionState,\n} from \"@tanstack/react-table\"\n\nimport {\n flexRender,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport { useVirtualizer } from \"@tanstack/react-virtual\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Checkbox } from \"../../forms/Checkbox\"\nimport { SkeletonLoader } from \"../../primitives/SkeletonLoader\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../Table\"\n\n// Static keys for skeleton loader to avoid array index as key\nconst SKELETON_KEYS = [\n \"skeleton-row-1\",\n \"skeleton-row-2\",\n \"skeleton-row-3\",\n \"skeleton-row-4\",\n \"skeleton-row-5\",\n] as const\n\n/**\n * VirtualTable - High-performance virtualized table for large datasets.\n *\n * Renders only visible rows in the viewport, enabling smooth scrolling\n * with thousands or millions of rows. Built on TanStack Virtual and\n * TanStack Table.\n *\n * @example\n * ```tsx\n * import { VirtualTable } from '@etus/ui'\n * import { ColumnDef } from '@tanstack/react-table'\n *\n * interface LogEntry {\n * id: string\n * timestamp: Date\n * level: 'info' | 'warn' | 'error'\n * message: string\n * }\n *\n * const columns: ColumnDef<LogEntry>[] = [\n * { accessorKey: 'timestamp', header: 'Time', size: 150 },\n * { accessorKey: 'level', header: 'Level', size: 80 },\n * { accessorKey: 'message', header: 'Message' },\n * ]\n *\n * function LogViewer() {\n * const { data } = useLogs() // 100k+ entries\n *\n * return (\n * <VirtualTable\n * data={data}\n * columns={columns}\n * rowHeight={36}\n * containerHeight={600}\n * getRowId={(row) => row.id}\n * />\n * )\n * }\n * ```\n */\nfunction VirtualTable<TData>({\n data,\n columns,\n rowHeight = 40,\n overscan = 5,\n estimateSize,\n containerHeight = 400,\n enableRowSelection = false,\n onRowClick,\n getRowId,\n loading = false,\n loadingComponent,\n emptyState,\n className,\n rowSelection: controlledRowSelection,\n onRowSelectionChange,\n onSelectionChange,\n rowClassName,\n stickyHeader = true,\n}: VirtualTableProps<TData>) {\n const parentRef = React.useRef<HTMLDivElement>(null)\n const [internalRowSelection, setInternalRowSelection] =\n React.useState<RowSelectionState>({})\n\n const rowSelection = controlledRowSelection ?? internalRowSelection\n\n // Create wrapper for row selection change to also notify onSelectionChange\n const handleRowSelectionChange = React.useCallback(\n (\n updaterOrValue:\n | ((old: RowSelectionState) => RowSelectionState)\n | RowSelectionState\n ) => {\n const newValue =\n typeof updaterOrValue === \"function\"\n ? updaterOrValue(rowSelection)\n : updaterOrValue\n\n // Update internal or controlled state\n if (onRowSelectionChange) {\n onRowSelectionChange(newValue)\n } else {\n setInternalRowSelection(newValue)\n }\n\n // Notify parent of selected rows as TData array\n if (onSelectionChange) {\n const selectedIndices = Object.keys(newValue).filter(\n (key) => newValue[key]\n )\n const selectedRows = selectedIndices\n .map((idx) => data[Number(idx)])\n .filter(Boolean) as TData[]\n onSelectionChange(selectedRows)\n }\n },\n [rowSelection, onRowSelectionChange, onSelectionChange, data]\n )\n\n // Memoize column definitions with selection column\n const tableColumns = React.useMemo(() => {\n if (!enableRowSelection) return columns\n\n return [\n {\n id: \"select\",\n header: ({ table }: { table: ReactTable<TData> }) => (\n <Checkbox\n checked={\n table.getIsAllPageRowsSelected() ||\n (table.getIsSomePageRowsSelected() && \"indeterminate\")\n }\n aria-label=\"Select all\"\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(!!value)\n }}\n />\n ),\n cell: ({ row }: { row: Row<TData> }) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n row.toggleSelected(!!value)\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 40,\n },\n ...columns,\n ]\n }, [columns, enableRowSelection])\n\n // Initialize table\n // eslint-disable-next-line react-hooks/incompatible-library -- TanStack Table's API is required here.\n const table = useReactTable({\n data,\n columns: tableColumns,\n state: {\n rowSelection,\n },\n enableRowSelection,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n onRowSelectionChange: handleRowSelectionChange,\n })\n\n const { rows } = table.getRowModel()\n\n // Initialize virtualizer\n const virtualizer = useVirtualizer({\n count: rows.length,\n getScrollElement: () => parentRef.current,\n estimateSize: estimateSize ?? (() => rowHeight),\n overscan,\n })\n\n const virtualItems = virtualizer.getVirtualItems()\n const totalSize = virtualizer.getTotalSize()\n\n // Calculate container height style\n const containerStyle: React.CSSProperties = {\n height:\n typeof containerHeight === \"number\"\n ? `${String(containerHeight)}px`\n : containerHeight,\n overflow: \"auto\",\n willChange: \"transform\",\n }\n\n // Render loading state\n if (loading) {\n return (\n <div className={cn(\"space-y-4\", className)} data-slot=\"virtual-table\">\n {loadingComponent ?? (\n <div className=\"space-y-2\" data-slot=\"virtual-table-loading\">\n {SKELETON_KEYS.map((key) => (\n <SkeletonLoader key={key} className=\"h-10 w-full\" />\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // Render empty state\n if (data.length === 0) {\n return (\n <div className={cn(\"space-y-4\", className)} data-slot=\"virtual-table\">\n {emptyState ?? (\n <div\n className=\"flex flex-col items-center justify-center py-12 text-center\"\n data-slot=\"virtual-table-empty\"\n >\n <p className=\"text-muted-foreground text-sm\">No data available</p>\n </div>\n )}\n </div>\n )\n }\n\n // Calculate padding for virtual items\n const firstItem = virtualItems[0]\n const lastItem = virtualItems[virtualItems.length - 1]\n const paddingTop = firstItem ? firstItem.start : 0\n const paddingBottom = lastItem ? totalSize - lastItem.end : 0\n\n return (\n <div\n className={cn(\"rounded-md border\", className)}\n data-slot=\"virtual-table\"\n >\n <div\n ref={parentRef}\n className=\"relative\"\n data-slot=\"virtual-table-container\"\n style={containerStyle}\n >\n <Table>\n <TableHeader\n className={cn(\n stickyHeader && \"bg-[color:var(--table-header-bg)] sticky top-0 z-10\"\n )}\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n style={{\n width: header.getSize() !== 150 ? header.getSize() : undefined,\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {/* Top padding row */}\n {paddingTop > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colSpan={tableColumns.length}\n style={{ height: `${String(paddingTop)}px`, padding: 0 }}\n />\n </tr>\n )}\n\n {/* Virtual rows */}\n {virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index]\n if (!row) return null\n return (\n <TableRow\n key={row.id}\n className={cn(\n onRowClick && \"cursor-pointer\",\n rowClassName?.(row)\n )}\n style={{\n height: `${String(virtualRow.size)}px`,\n }}\n aria-rowindex={virtualRow.index + 1}\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n onClick={\n onRowClick\n ? () => {\n onRowClick(row.original)\n }\n : undefined\n }\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n style={{\n width:\n cell.column.getSize() !== 150\n ? cell.column.getSize()\n : undefined,\n }}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n\n {/* Bottom padding row */}\n {paddingBottom > 0 && (\n <tr aria-hidden=\"true\">\n <td\n colSpan={tableColumns.length}\n style={{ height: `${String(paddingBottom)}px`, padding: 0 }}\n />\n </tr>\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n )\n}\n\nexport { VirtualTable }\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button } from './chunk-
|
|
1
|
+
import { Button } from './chunk-HDOR3SN3.js';
|
|
2
2
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
3
3
|
import { RefreshCw, X, LayoutGrid, Loader2 } from 'lucide-react';
|
|
4
4
|
import { useId, useRef, useCallback, useEffect } from 'react';
|
|
@@ -511,5 +511,5 @@ function Dashboard({
|
|
|
511
511
|
}
|
|
512
512
|
|
|
513
513
|
export { Dashboard, DashboardEmptyState, DashboardErrorState, DashboardHeader, DashboardLoadingState, DashboardWidget, dashboardContentVariants, dashboardEmptyVariants, dashboardGridVariants, dashboardHeaderVariants, dashboardLoadingVariants, dashboardSidebarVariants, dashboardVariants, dashboardWidgetHeaderVariants, dashboardWidgetVariants };
|
|
514
|
-
//# sourceMappingURL=chunk-
|
|
515
|
-
//# sourceMappingURL=chunk-
|
|
514
|
+
//# sourceMappingURL=chunk-KHOCAVQO.js.map
|
|
515
|
+
//# sourceMappingURL=chunk-KHOCAVQO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/workflow/Dashboard/Dashboard.variants.ts","../src/components/workflow/Dashboard/Dashboard.tsx"],"names":[],"mappings":"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","file":"chunk-Y7UFBSAD.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * Dashboard container variants\n */\nexport const dashboardVariants = cva(\n [\n \"relative\",\n \"bg-background\",\n \"text-foreground\",\n ],\n {\n variants: {\n layout: {\n default: \"p-6\",\n dense: \"p-4\",\n full: \"p-0 min-h-screen\",\n sidebar: \"flex\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard header variants\n */\nexport const dashboardHeaderVariants = cva(\n [\n \"flex\",\n \"items-start\",\n \"justify-between\",\n \"gap-4\",\n \"mb-6\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"mb-4\",\n full: \"px-6 pt-6\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard grid variants\n */\nexport const dashboardGridVariants = cva(\n [\n \"grid\",\n \"w-full\",\n ],\n {\n variants: {\n layout: {\n default: \"gap-6\",\n dense: \"gap-4\",\n full: \"gap-6 px-6 pb-6\",\n sidebar: \"gap-6\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard sidebar variants\n */\nexport const dashboardSidebarVariants = cva(\n [\n \"shrink-0\",\n \"border-r\",\n \"border-border\",\n \"bg-card\",\n ],\n {\n variants: {\n width: {\n sm: \"w-48\",\n md: \"w-64\",\n lg: \"w-80\",\n },\n },\n defaultVariants: {\n width: \"md\",\n },\n }\n)\n\n/**\n * Dashboard content variants\n */\nexport const dashboardContentVariants = cva(\n [\n \"flex-1\",\n \"min-w-0\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"\",\n full: \"\",\n sidebar: \"p-6\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard widget variants\n */\nexport const dashboardWidgetVariants = cva(\n [\n \"rounded-lg\",\n \"border\",\n \"border-border\",\n \"bg-card\",\n \"overflow-hidden\",\n \"transition-shadow\",\n \"duration-200\",\n ],\n {\n variants: {\n layout: {\n default: \"p-6\",\n dense: \"p-4\",\n full: \"p-6\",\n sidebar: \"p-6\",\n },\n state: {\n default: \"\",\n dragging: \"shadow-lg ring-2 ring-primary/20\",\n resizing: \"shadow-md\",\n },\n interactive: {\n true: \"cursor-pointer hover:shadow-md\",\n false: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n state: \"default\",\n interactive: false,\n },\n }\n)\n\n/**\n * Dashboard widget header variants\n */\nexport const dashboardWidgetHeaderVariants = cva(\n [\n \"flex\",\n \"items-start\",\n \"justify-between\",\n \"gap-2\",\n \"mb-4\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"mb-3\",\n full: \"\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard empty state variants\n */\nexport const dashboardEmptyVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"items-center\",\n \"justify-center\",\n \"text-center\",\n \"py-16\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"py-12\",\n full: \"min-h-[50vh]\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard loading state variants\n */\nexport const dashboardLoadingVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"py-16\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"py-12\",\n full: \"min-h-[50vh]\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\nexport type DashboardVariantProps = VariantProps<typeof dashboardVariants>\nexport type DashboardWidgetVariantProps = VariantProps<typeof dashboardWidgetVariants>\n","import type {\n DashboardHeaderProps,\n DashboardProps,\n DashboardWidgetData,\n DashboardWidgetProps,\n} from \"./Dashboard.types\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { LayoutGrid, Loader2, RefreshCw, X } from \"lucide-react\"\nimport { useCallback, useEffect, useId, useRef } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n dashboardContentVariants,\n dashboardEmptyVariants,\n dashboardGridVariants,\n dashboardHeaderVariants,\n dashboardLoadingVariants,\n dashboardSidebarVariants,\n dashboardVariants,\n dashboardWidgetHeaderVariants,\n dashboardWidgetVariants,\n} from \"./Dashboard.variants\"\n\n/**\n * Get icon for widget type\n */\nfunction getWidgetIcon(_type: DashboardWidgetData[\"type\"]) {\n // For now, return a generic icon - can be extended per type\n return <LayoutGrid className=\"h-4 w-4 text-muted-foreground\" />\n}\n\n/**\n * DashboardHeader displays the dashboard title and actions\n */\nfunction DashboardHeader({\n title,\n description,\n showRefresh = true,\n onRefresh,\n actions,\n}: DashboardHeaderProps) {\n return (\n <div className={dashboardHeaderVariants()} data-slot=\"dashboard-header\">\n <div className=\"space-y-1\">\n {title && (\n <h1\n className=\"text-2xl font-bold tracking-tight\"\n data-slot=\"dashboard-title\"\n >\n {title}\n </h1>\n )}\n {description && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-slot=\"dashboard-description\"\n >\n {description}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-2\" data-slot=\"dashboard-actions\">\n {showRefresh && onRefresh && (\n <Button\n aria-label=\"Refresh dashboard\"\n size=\"sm\"\n variant=\"outline\"\n onClick={onRefresh}\n >\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Atualizar\n </Button>\n )}\n {actions}\n </div>\n </div>\n )\n}\n\n/**\n * DashboardWidget renders a single widget card\n */\nfunction DashboardWidget({\n widget,\n columns = 12,\n rowHeight = 100,\n isDraggable = false,\n isResizable = false,\n onClick,\n onRemove,\n className,\n ...props\n}: DashboardWidgetProps) {\n const widgetId = useId()\n\n // Calculate grid span and position styles\n const gridStyle = {\n gridColumn: `span ${String(Math.min(widget.w, columns))}`,\n minHeight: `${String(widget.h * rowHeight)}px`,\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n }\n\n return (\n <div\n className={cn(\n dashboardWidgetVariants({\n interactive: Boolean(onClick),\n }),\n className\n )}\n aria-label={widget.title}\n data-draggable={isDraggable || undefined}\n data-resizable={isResizable || undefined}\n data-slot=\"dashboard-widget\"\n data-widget-id={widget.id}\n data-widget-type={widget.type}\n id={widgetId}\n role={onClick ? \"button\" : \"region\"}\n style={gridStyle}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n {...props}\n >\n <div className={dashboardWidgetHeaderVariants()} data-slot=\"dashboard-widget-header\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {getWidgetIcon(widget.type)}\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-semibold truncate\">{widget.title}</h2>\n {widget.description && (\n <p className=\"text-sm text-muted-foreground truncate\">\n {widget.description}\n </p>\n )}\n </div>\n </div>\n {onRemove && (\n <Button\n aria-label={`Remove ${widget.title}`}\n className=\"shrink-0\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <div className=\"flex-1\" data-slot=\"dashboard-widget-content\">\n {/* Widget content would be rendered here based on type */}\n {widget.type === \"kpi\" &&\n widget.data !== null &&\n widget.data !== undefined &&\n typeof widget.data === \"object\" &&\n \"value\" in widget.data &&\n (typeof (widget.data as Record<string, unknown>)[\"value\"] === \"string\" ||\n typeof (widget.data as Record<string, unknown>)[\"value\"] === \"number\") && (\n <div className=\"text-3xl font-bold\">\n {String((widget.data as Record<string, unknown>)[\"value\"])}\n </div>\n )}\n {widget.type === \"text\" &&\n widget.data !== null &&\n widget.data !== undefined &&\n typeof widget.data === \"string\" && (\n <div className=\"text-sm text-muted-foreground\">{widget.data}</div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * DashboardEmptyState displays when no widgets are configured\n */\nfunction DashboardEmptyState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardEmptyVariants({ layout })} data-slot=\"dashboard-empty\">\n <LayoutGrid className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-semibold mb-2\">Nenhum widget configurado</h3>\n <p className=\"text-sm text-muted-foreground max-w-md\">\n Adicione widgets para visualizar dados e métricas neste dashboard.\n </p>\n </div>\n )\n}\n\n/**\n * DashboardLoadingState displays while data is loading\n */\nfunction DashboardLoadingState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardLoadingVariants({ layout })} data-slot=\"dashboard-loading\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n )\n}\n\n/**\n * DashboardErrorState displays when an error occurs\n */\nfunction DashboardErrorState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardEmptyVariants({ layout })} data-slot=\"dashboard-error\">\n <div className=\"rounded-full bg-destructive/10 p-3 mb-4\">\n <X className=\"h-8 w-8 text-destructive\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">Erro ao carregar dashboard</h3>\n <p className=\"text-sm text-muted-foreground max-w-md\">\n Ocorreu um erro ao carregar os dados. Tente novamente mais tarde.\n </p>\n </div>\n )\n}\n\n/**\n * Dashboard component for creating control panels with widgets, metrics, and visualizations.\n *\n * @example\n * ```tsx\n * const widgets = [\n * { id: '1', type: 'kpi', title: 'Total Sales', x: 0, y: 0, w: 3, h: 2, data: { value: 'R$ 150.000' } },\n * { id: '2', type: 'chart', title: 'Sales by Month', x: 3, y: 0, w: 6, h: 4 },\n * ]\n *\n * <Dashboard\n * title=\"Sales Dashboard\"\n * description=\"Overview of commercial performance\"\n * widgets={widgets}\n * onRefresh={() => console.log('Refresh')}\n * />\n * ```\n */\nfunction Dashboard({\n \"aria-label\": ariaLabel = \"Dashboard\",\n className,\n title,\n description,\n widgets,\n layout = \"default\",\n columns = 12,\n rowHeight = 100,\n isDraggable = false,\n isResizable = false,\n showHeader = true,\n showRefresh = true,\n refreshInterval,\n sidebarContent,\n headerActions,\n state = \"ready\",\n onLayoutChange,\n onWidgetAdd: _onWidgetAdd,\n onWidgetRemove,\n onRefresh,\n onExport: _onExport,\n onWidgetClick,\n ...props\n}: DashboardProps) {\n const dashboardId = useId()\n const refreshTimerRef = useRef<null | ReturnType<typeof setInterval>>(null)\n\n // Normalize layout\n const normalizedLayout = layout ?? \"default\"\n\n // Handle refresh\n const handleRefresh = useCallback(() => {\n onRefresh?.({ timestamp: Date.now() })\n }, [onRefresh])\n\n // Handle widget remove\n const handleWidgetRemove = useCallback(\n (widgetId: string) => {\n onWidgetRemove?.({ widgetId, timestamp: Date.now() })\n // Notify layout change\n const updatedLayout = widgets\n .filter((w) => w.id !== widgetId)\n .map((w) => ({ i: w.id, x: w.x, y: w.y, w: w.w, h: w.h }))\n onLayoutChange?.({ layout: updatedLayout, timestamp: Date.now() })\n },\n [widgets, onWidgetRemove, onLayoutChange]\n )\n\n // Handle widget click\n const handleWidgetClick = useCallback(\n (widget: DashboardWidgetData) => {\n onWidgetClick?.({ widget, timestamp: Date.now() })\n },\n [onWidgetClick]\n )\n\n // Set up auto-refresh\n useEffect(() => {\n if (refreshInterval && refreshInterval > 0 && onRefresh) {\n refreshTimerRef.current = setInterval(() => {\n onRefresh({ timestamp: Date.now() })\n }, refreshInterval)\n }\n\n return () => {\n if (refreshTimerRef.current) {\n clearInterval(refreshTimerRef.current)\n }\n }\n }, [refreshInterval, onRefresh])\n\n // Generate grid template columns\n const gridTemplateColumns = `repeat(${String(columns)}, minmax(0, 1fr))`\n\n // Render content based on state\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return <DashboardLoadingState layout={normalizedLayout} />\n case \"error\":\n return <DashboardErrorState layout={normalizedLayout} />\n case \"empty\":\n return <DashboardEmptyState layout={normalizedLayout} />\n case \"ready\":\n default:\n if (widgets.length === 0) {\n return <DashboardEmptyState layout={normalizedLayout} />\n }\n return (\n <div\n className={dashboardGridVariants({ layout: normalizedLayout })}\n data-slot=\"dashboard-grid\"\n style={{ gridTemplateColumns }}\n >\n {widgets.map((widget) => (\n <DashboardWidget\n key={widget.id}\n columns={columns}\n isDraggable={isDraggable && !widget.isStatic}\n isResizable={isResizable && !widget.isStatic}\n rowHeight={rowHeight}\n widget={widget}\n onClick={\n onWidgetClick ? () => { handleWidgetClick(widget); } : undefined\n }\n onRemove={\n onWidgetRemove\n ? () => { handleWidgetRemove(widget.id); }\n : undefined\n }\n />\n ))}\n </div>\n )\n }\n }\n\n // Sidebar layout\n if (normalizedLayout === \"sidebar\") {\n return (\n <div\n aria-label={ariaLabel}\n className={cn(dashboardVariants({ layout: normalizedLayout }), className)}\n data-layout={normalizedLayout}\n data-slot=\"dashboard\"\n data-state={state}\n id={dashboardId}\n role=\"main\"\n {...props}\n >\n {sidebarContent && (\n <aside\n className={dashboardSidebarVariants()}\n data-slot=\"dashboard-sidebar\"\n >\n {sidebarContent}\n </aside>\n )}\n <div className={dashboardContentVariants({ layout: normalizedLayout })}>\n {showHeader && (title ?? description ?? headerActions) && (\n <DashboardHeader\n actions={headerActions}\n description={description}\n showRefresh={showRefresh}\n title={title}\n onRefresh={onRefresh ? handleRefresh : undefined}\n />\n )}\n {renderContent()}\n </div>\n </div>\n )\n }\n\n // Default, dense, and full layouts\n return (\n <div\n aria-label={ariaLabel}\n className={cn(dashboardVariants({ layout: normalizedLayout }), className)}\n data-layout={normalizedLayout}\n data-slot=\"dashboard\"\n data-state={state}\n id={dashboardId}\n role=\"main\"\n {...props}\n >\n {showHeader && (title ?? description ?? headerActions) && (\n <DashboardHeader\n actions={headerActions}\n description={description}\n showRefresh={showRefresh}\n title={title}\n onRefresh={onRefresh ? handleRefresh : undefined}\n />\n )}\n {renderContent()}\n </div>\n )\n}\n\nexport {\n Dashboard,\n dashboardContentVariants,\n DashboardEmptyState,\n dashboardEmptyVariants,\n DashboardErrorState,\n dashboardGridVariants,\n DashboardHeader,\n dashboardHeaderVariants,\n DashboardLoadingState,\n dashboardLoadingVariants,\n dashboardSidebarVariants,\n dashboardVariants,\n DashboardWidget,\n dashboardWidgetHeaderVariants,\n dashboardWidgetVariants,\n}\nexport type {\n DashboardHeaderProps,\n DashboardProps,\n DashboardWidgetProps,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/workflow/Dashboard/Dashboard.variants.ts","../src/components/workflow/Dashboard/Dashboard.tsx"],"names":[],"mappings":"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","file":"chunk-KHOCAVQO.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * Dashboard container variants\n */\nexport const dashboardVariants = cva(\n [\n \"relative\",\n \"bg-background\",\n \"text-foreground\",\n ],\n {\n variants: {\n layout: {\n default: \"p-6\",\n dense: \"p-4\",\n full: \"p-0 min-h-screen\",\n sidebar: \"flex\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard header variants\n */\nexport const dashboardHeaderVariants = cva(\n [\n \"flex\",\n \"items-start\",\n \"justify-between\",\n \"gap-4\",\n \"mb-6\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"mb-4\",\n full: \"px-6 pt-6\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard grid variants\n */\nexport const dashboardGridVariants = cva(\n [\n \"grid\",\n \"w-full\",\n ],\n {\n variants: {\n layout: {\n default: \"gap-6\",\n dense: \"gap-4\",\n full: \"gap-6 px-6 pb-6\",\n sidebar: \"gap-6\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard sidebar variants\n */\nexport const dashboardSidebarVariants = cva(\n [\n \"shrink-0\",\n \"border-r\",\n \"border-border\",\n \"bg-card\",\n ],\n {\n variants: {\n width: {\n sm: \"w-48\",\n md: \"w-64\",\n lg: \"w-80\",\n },\n },\n defaultVariants: {\n width: \"md\",\n },\n }\n)\n\n/**\n * Dashboard content variants\n */\nexport const dashboardContentVariants = cva(\n [\n \"flex-1\",\n \"min-w-0\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"\",\n full: \"\",\n sidebar: \"p-6\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard widget variants\n */\nexport const dashboardWidgetVariants = cva(\n [\n \"rounded-lg\",\n \"border\",\n \"border-border\",\n \"bg-card\",\n \"overflow-hidden\",\n \"transition-shadow\",\n \"duration-200\",\n ],\n {\n variants: {\n layout: {\n default: \"p-6\",\n dense: \"p-4\",\n full: \"p-6\",\n sidebar: \"p-6\",\n },\n state: {\n default: \"\",\n dragging: \"shadow-lg ring-2 ring-primary/20\",\n resizing: \"shadow-md\",\n },\n interactive: {\n true: \"cursor-pointer hover:shadow-md\",\n false: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n state: \"default\",\n interactive: false,\n },\n }\n)\n\n/**\n * Dashboard widget header variants\n */\nexport const dashboardWidgetHeaderVariants = cva(\n [\n \"flex\",\n \"items-start\",\n \"justify-between\",\n \"gap-2\",\n \"mb-4\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"mb-3\",\n full: \"\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard empty state variants\n */\nexport const dashboardEmptyVariants = cva(\n [\n \"flex\",\n \"flex-col\",\n \"items-center\",\n \"justify-center\",\n \"text-center\",\n \"py-16\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"py-12\",\n full: \"min-h-[50vh]\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\n/**\n * Dashboard loading state variants\n */\nexport const dashboardLoadingVariants = cva(\n [\n \"flex\",\n \"items-center\",\n \"justify-center\",\n \"py-16\",\n ],\n {\n variants: {\n layout: {\n default: \"\",\n dense: \"py-12\",\n full: \"min-h-[50vh]\",\n sidebar: \"\",\n },\n },\n defaultVariants: {\n layout: \"default\",\n },\n }\n)\n\nexport type DashboardVariantProps = VariantProps<typeof dashboardVariants>\nexport type DashboardWidgetVariantProps = VariantProps<typeof dashboardWidgetVariants>\n","import type {\n DashboardHeaderProps,\n DashboardProps,\n DashboardWidgetData,\n DashboardWidgetProps,\n} from \"./Dashboard.types\"\nimport type { KeyboardEvent } from \"react\"\n\nimport { LayoutGrid, Loader2, RefreshCw, X } from \"lucide-react\"\nimport { useCallback, useEffect, useId, useRef } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n dashboardContentVariants,\n dashboardEmptyVariants,\n dashboardGridVariants,\n dashboardHeaderVariants,\n dashboardLoadingVariants,\n dashboardSidebarVariants,\n dashboardVariants,\n dashboardWidgetHeaderVariants,\n dashboardWidgetVariants,\n} from \"./Dashboard.variants\"\n\n/**\n * Get icon for widget type\n */\nfunction getWidgetIcon(_type: DashboardWidgetData[\"type\"]) {\n // For now, return a generic icon - can be extended per type\n return <LayoutGrid className=\"h-4 w-4 text-muted-foreground\" />\n}\n\n/**\n * DashboardHeader displays the dashboard title and actions\n */\nfunction DashboardHeader({\n title,\n description,\n showRefresh = true,\n onRefresh,\n actions,\n}: DashboardHeaderProps) {\n return (\n <div className={dashboardHeaderVariants()} data-slot=\"dashboard-header\">\n <div className=\"space-y-1\">\n {title && (\n <h1\n className=\"text-2xl font-bold tracking-tight\"\n data-slot=\"dashboard-title\"\n >\n {title}\n </h1>\n )}\n {description && (\n <p\n className=\"text-sm text-muted-foreground\"\n data-slot=\"dashboard-description\"\n >\n {description}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-2\" data-slot=\"dashboard-actions\">\n {showRefresh && onRefresh && (\n <Button\n aria-label=\"Refresh dashboard\"\n size=\"sm\"\n variant=\"outline\"\n onClick={onRefresh}\n >\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Atualizar\n </Button>\n )}\n {actions}\n </div>\n </div>\n )\n}\n\n/**\n * DashboardWidget renders a single widget card\n */\nfunction DashboardWidget({\n widget,\n columns = 12,\n rowHeight = 100,\n isDraggable = false,\n isResizable = false,\n onClick,\n onRemove,\n className,\n ...props\n}: DashboardWidgetProps) {\n const widgetId = useId()\n\n // Calculate grid span and position styles\n const gridStyle = {\n gridColumn: `span ${String(Math.min(widget.w, columns))}`,\n minHeight: `${String(widget.h * rowHeight)}px`,\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n }\n\n return (\n <div\n className={cn(\n dashboardWidgetVariants({\n interactive: Boolean(onClick),\n }),\n className\n )}\n aria-label={widget.title}\n data-draggable={isDraggable || undefined}\n data-resizable={isResizable || undefined}\n data-slot=\"dashboard-widget\"\n data-widget-id={widget.id}\n data-widget-type={widget.type}\n id={widgetId}\n role={onClick ? \"button\" : \"region\"}\n style={gridStyle}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n {...props}\n >\n <div className={dashboardWidgetHeaderVariants()} data-slot=\"dashboard-widget-header\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {getWidgetIcon(widget.type)}\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-semibold truncate\">{widget.title}</h2>\n {widget.description && (\n <p className=\"text-sm text-muted-foreground truncate\">\n {widget.description}\n </p>\n )}\n </div>\n </div>\n {onRemove && (\n <Button\n aria-label={`Remove ${widget.title}`}\n className=\"shrink-0\"\n size=\"icon\"\n variant=\"ghost\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <div className=\"flex-1\" data-slot=\"dashboard-widget-content\">\n {/* Widget content would be rendered here based on type */}\n {widget.type === \"kpi\" &&\n widget.data !== null &&\n widget.data !== undefined &&\n typeof widget.data === \"object\" &&\n \"value\" in widget.data &&\n (typeof (widget.data as Record<string, unknown>)[\"value\"] === \"string\" ||\n typeof (widget.data as Record<string, unknown>)[\"value\"] === \"number\") && (\n <div className=\"text-3xl font-bold\">\n {String((widget.data as Record<string, unknown>)[\"value\"])}\n </div>\n )}\n {widget.type === \"text\" &&\n widget.data !== null &&\n widget.data !== undefined &&\n typeof widget.data === \"string\" && (\n <div className=\"text-sm text-muted-foreground\">{widget.data}</div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * DashboardEmptyState displays when no widgets are configured\n */\nfunction DashboardEmptyState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardEmptyVariants({ layout })} data-slot=\"dashboard-empty\">\n <LayoutGrid className=\"h-12 w-12 text-muted-foreground mb-4\" />\n <h3 className=\"text-lg font-semibold mb-2\">Nenhum widget configurado</h3>\n <p className=\"text-sm text-muted-foreground max-w-md\">\n Adicione widgets para visualizar dados e métricas neste dashboard.\n </p>\n </div>\n )\n}\n\n/**\n * DashboardLoadingState displays while data is loading\n */\nfunction DashboardLoadingState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardLoadingVariants({ layout })} data-slot=\"dashboard-loading\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n )\n}\n\n/**\n * DashboardErrorState displays when an error occurs\n */\nfunction DashboardErrorState({ layout }: { layout?: \"default\" | \"dense\" | \"full\" | \"sidebar\" | null }) {\n return (\n <div className={dashboardEmptyVariants({ layout })} data-slot=\"dashboard-error\">\n <div className=\"rounded-full bg-destructive/10 p-3 mb-4\">\n <X className=\"h-8 w-8 text-destructive\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">Erro ao carregar dashboard</h3>\n <p className=\"text-sm text-muted-foreground max-w-md\">\n Ocorreu um erro ao carregar os dados. Tente novamente mais tarde.\n </p>\n </div>\n )\n}\n\n/**\n * Dashboard component for creating control panels with widgets, metrics, and visualizations.\n *\n * @example\n * ```tsx\n * const widgets = [\n * { id: '1', type: 'kpi', title: 'Total Sales', x: 0, y: 0, w: 3, h: 2, data: { value: 'R$ 150.000' } },\n * { id: '2', type: 'chart', title: 'Sales by Month', x: 3, y: 0, w: 6, h: 4 },\n * ]\n *\n * <Dashboard\n * title=\"Sales Dashboard\"\n * description=\"Overview of commercial performance\"\n * widgets={widgets}\n * onRefresh={() => console.log('Refresh')}\n * />\n * ```\n */\nfunction Dashboard({\n \"aria-label\": ariaLabel = \"Dashboard\",\n className,\n title,\n description,\n widgets,\n layout = \"default\",\n columns = 12,\n rowHeight = 100,\n isDraggable = false,\n isResizable = false,\n showHeader = true,\n showRefresh = true,\n refreshInterval,\n sidebarContent,\n headerActions,\n state = \"ready\",\n onLayoutChange,\n onWidgetAdd: _onWidgetAdd,\n onWidgetRemove,\n onRefresh,\n onExport: _onExport,\n onWidgetClick,\n ...props\n}: DashboardProps) {\n const dashboardId = useId()\n const refreshTimerRef = useRef<null | ReturnType<typeof setInterval>>(null)\n\n // Normalize layout\n const normalizedLayout = layout ?? \"default\"\n\n // Handle refresh\n const handleRefresh = useCallback(() => {\n onRefresh?.({ timestamp: Date.now() })\n }, [onRefresh])\n\n // Handle widget remove\n const handleWidgetRemove = useCallback(\n (widgetId: string) => {\n onWidgetRemove?.({ widgetId, timestamp: Date.now() })\n // Notify layout change\n const updatedLayout = widgets\n .filter((w) => w.id !== widgetId)\n .map((w) => ({ i: w.id, x: w.x, y: w.y, w: w.w, h: w.h }))\n onLayoutChange?.({ layout: updatedLayout, timestamp: Date.now() })\n },\n [widgets, onWidgetRemove, onLayoutChange]\n )\n\n // Handle widget click\n const handleWidgetClick = useCallback(\n (widget: DashboardWidgetData) => {\n onWidgetClick?.({ widget, timestamp: Date.now() })\n },\n [onWidgetClick]\n )\n\n // Set up auto-refresh\n useEffect(() => {\n if (refreshInterval && refreshInterval > 0 && onRefresh) {\n refreshTimerRef.current = setInterval(() => {\n onRefresh({ timestamp: Date.now() })\n }, refreshInterval)\n }\n\n return () => {\n if (refreshTimerRef.current) {\n clearInterval(refreshTimerRef.current)\n }\n }\n }, [refreshInterval, onRefresh])\n\n // Generate grid template columns\n const gridTemplateColumns = `repeat(${String(columns)}, minmax(0, 1fr))`\n\n // Render content based on state\n const renderContent = () => {\n switch (state) {\n case \"loading\":\n return <DashboardLoadingState layout={normalizedLayout} />\n case \"error\":\n return <DashboardErrorState layout={normalizedLayout} />\n case \"empty\":\n return <DashboardEmptyState layout={normalizedLayout} />\n case \"ready\":\n default:\n if (widgets.length === 0) {\n return <DashboardEmptyState layout={normalizedLayout} />\n }\n return (\n <div\n className={dashboardGridVariants({ layout: normalizedLayout })}\n data-slot=\"dashboard-grid\"\n style={{ gridTemplateColumns }}\n >\n {widgets.map((widget) => (\n <DashboardWidget\n key={widget.id}\n columns={columns}\n isDraggable={isDraggable && !widget.isStatic}\n isResizable={isResizable && !widget.isStatic}\n rowHeight={rowHeight}\n widget={widget}\n onClick={\n onWidgetClick ? () => { handleWidgetClick(widget); } : undefined\n }\n onRemove={\n onWidgetRemove\n ? () => { handleWidgetRemove(widget.id); }\n : undefined\n }\n />\n ))}\n </div>\n )\n }\n }\n\n // Sidebar layout\n if (normalizedLayout === \"sidebar\") {\n return (\n <div\n aria-label={ariaLabel}\n className={cn(dashboardVariants({ layout: normalizedLayout }), className)}\n data-layout={normalizedLayout}\n data-slot=\"dashboard\"\n data-state={state}\n id={dashboardId}\n role=\"main\"\n {...props}\n >\n {sidebarContent && (\n <aside\n className={dashboardSidebarVariants()}\n data-slot=\"dashboard-sidebar\"\n >\n {sidebarContent}\n </aside>\n )}\n <div className={dashboardContentVariants({ layout: normalizedLayout })}>\n {showHeader && (title ?? description ?? headerActions) && (\n <DashboardHeader\n actions={headerActions}\n description={description}\n showRefresh={showRefresh}\n title={title}\n onRefresh={onRefresh ? handleRefresh : undefined}\n />\n )}\n {renderContent()}\n </div>\n </div>\n )\n }\n\n // Default, dense, and full layouts\n return (\n <div\n aria-label={ariaLabel}\n className={cn(dashboardVariants({ layout: normalizedLayout }), className)}\n data-layout={normalizedLayout}\n data-slot=\"dashboard\"\n data-state={state}\n id={dashboardId}\n role=\"main\"\n {...props}\n >\n {showHeader && (title ?? description ?? headerActions) && (\n <DashboardHeader\n actions={headerActions}\n description={description}\n showRefresh={showRefresh}\n title={title}\n onRefresh={onRefresh ? handleRefresh : undefined}\n />\n )}\n {renderContent()}\n </div>\n )\n}\n\nexport {\n Dashboard,\n dashboardContentVariants,\n DashboardEmptyState,\n dashboardEmptyVariants,\n DashboardErrorState,\n dashboardGridVariants,\n DashboardHeader,\n dashboardHeaderVariants,\n DashboardLoadingState,\n dashboardLoadingVariants,\n dashboardSidebarVariants,\n dashboardVariants,\n DashboardWidget,\n dashboardWidgetHeaderVariants,\n dashboardWidgetVariants,\n}\nexport type {\n DashboardHeaderProps,\n DashboardProps,\n DashboardWidgetProps,\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buttonVariants } from './chunk-
|
|
1
|
+
import { buttonVariants } from './chunk-HDOR3SN3.js';
|
|
2
2
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
3
3
|
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
4
4
|
import 'react';
|
|
@@ -112,12 +112,13 @@ function AlertDialogDescription({
|
|
|
112
112
|
}
|
|
113
113
|
function AlertDialogAction({
|
|
114
114
|
className,
|
|
115
|
+
variant = "default",
|
|
115
116
|
...props
|
|
116
117
|
}) {
|
|
117
118
|
return /* @__PURE__ */ jsx(
|
|
118
119
|
AlertDialogPrimitive.Action,
|
|
119
120
|
{
|
|
120
|
-
className: cn(buttonVariants(), className),
|
|
121
|
+
className: cn(buttonVariants({ variant }), className),
|
|
121
122
|
"data-slot": "alert-dialog-action",
|
|
122
123
|
...props
|
|
123
124
|
}
|
|
@@ -138,5 +139,5 @@ function AlertDialogCancel({
|
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger };
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
142
|
+
//# sourceMappingURL=chunk-KVJOKWP4.js.map
|
|
143
|
+
//# sourceMappingURL=chunk-KVJOKWP4.js.map
|