@etus/ui 0.4.0-beta.7 → 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-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-FCT6FEEZ.js → chunk-43BS3PPX.js} +5 -5
- package/dist/{chunk-FCT6FEEZ.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-OTSK2KAI.js → chunk-4EYYCHLD.js} +5 -5
- package/dist/{chunk-OTSK2KAI.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-6ELVWWIA.js → chunk-QZWKXUZP.js} +3 -3
- package/dist/{chunk-6ELVWWIA.js.map → chunk-QZWKXUZP.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-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 +4 -4
- package/dist/components/advanced/Command/index.js +1 -1
- package/dist/components/advanced/EventCalendar/index.js +4 -4
- package/dist/components/advanced/FileDropzone/index.js +1 -1
- package/dist/components/advanced/FilterBuilder/index.js +4 -4
- package/dist/components/advanced/MarkdownEditor/index.js +2 -2
- package/dist/components/advanced/RichTextEditor/index.js +2 -2
- package/dist/components/advanced/index.js +16 -16
- 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 +4 -4
- 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 +4 -4
- package/dist/components/data-display/DataTable/index.js +7 -7
- package/dist/components/data-display/ImageGallery/index.js +7 -7
- package/dist/components/data-display/KPICard/index.js +4 -4
- 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 +35 -35
- package/dist/components/feedback/Alert/index.js +1 -1
- package/dist/components/feedback/AlertDialog/index.js +4 -4
- package/dist/components/feedback/ConfirmModal/index.js +5 -5
- package/dist/components/feedback/Modal/index.js +1 -1
- package/dist/components/feedback/index.js +9 -9
- package/dist/components/forms/ColorPicker/index.js +1 -1
- package/dist/components/forms/DatePicker/index.js +5 -5
- package/dist/components/forms/DateRangePicker/index.js +5 -5
- package/dist/components/forms/IftaLabel/index.js +1 -1
- package/dist/components/forms/InputGroup/index.js +4 -4
- package/dist/components/forms/InputOTPField/index.js +2 -2
- 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/TagsInput/index.js +2 -2
- package/dist/components/forms/ToggleGroup/index.js +1 -1
- package/dist/components/forms/index.js +28 -28
- package/dist/components/index.js +138 -138
- package/dist/components/layout/index.js +3 -3
- 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 +4 -4
- package/dist/components/navigation/Pagination/index.js +4 -4
- package/dist/components/navigation/Sidebar/index.js +5 -5
- package/dist/components/navigation/UserProfileDropdown/index.js +1 -1
- package/dist/components/navigation/WorkspaceDropdown/index.js +1 -1
- package/dist/components/navigation/index.js +15 -15
- 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 +3 -3
- package/dist/components/primitives/ConfirmButton/index.js +5 -5
- 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 +18 -18
- package/dist/components/workflow/ApprovalFlow/index.js +4 -4
- package/dist/components/workflow/CommentSystem/index.js +4 -4
- package/dist/components/workflow/Dashboard/index.js +4 -4
- package/dist/components/workflow/DashboardBuilder/index.js +4 -4
- package/dist/components/workflow/KanbanBoard/index.js +4 -4
- package/dist/components/workflow/ReportGenerator/index.js +4 -4
- package/dist/components/workflow/TaskStatus/index.js +2 -2
- package/dist/components/workflow/Wizard/index.js +4 -4
- package/dist/components/workflow/index.js +15 -15
- package/dist/index.d.ts +156 -50
- package/dist/index.js +140 -140
- 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-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/DateRangePicker/DateRangePicker.variants.ts","../src/components/forms/DateRangePicker/DateRangePresets.tsx","../src/components/forms/DateRangePicker/presets.ts","../src/components/forms/DateRangePicker/DateRangePicker.tsx","../src/components/forms/DateRangePicker/DateRangeInput.tsx"],"names":["format","startOfMonth","formatDate","startOfDay","jsx","React2","jsxs"],"mappings":"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","file":"chunk-AVR3LVOQ.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * DateRangePicker trigger variant styles using CVA\n */\nexport const dateRangePickerTriggerVariants = 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:opacity-50\",\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 \"data-[state=open]:border-ring data-[state=open]:ring-ring/50 data-[state=open]:ring-[3px]\",\n \"min-w-[var(--date-range-picker-trigger-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 outline: \"border-input bg-transparent\",\n ghost: \"border-transparent hover:bg-accent\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\nexport type DateRangePickerTriggerVariantProps = VariantProps<typeof dateRangePickerTriggerVariants>\n\n/**\n * Preset item styles - horizontal scrollable tabs on mobile, vertical list on desktop\n */\nexport const dateRangePresetVariants = cva(\n [\n // Base - works for both orientations\n \"text-sm rounded-md transition-colors whitespace-nowrap\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"data-[selected=true]:bg-primary/10 data-[selected=true]:text-primary data-[selected=true]:font-medium\",\n // Mobile: pill-like compact tabs\n \"px-3 py-1.5 flex-shrink-0\",\n // Desktop (sm+): full-width list items\n \"sm:w-full sm:text-left sm:py-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\nexport type DateRangePresetVariantProps = VariantProps<typeof dateRangePresetVariants>\n\n/**\n * Presets container styles - horizontal scrollable on mobile, vertical sidebar on desktop\n */\nexport const dateRangePresetsContainerVariants = cva(\n [\n // Mobile: horizontal scrollable tabs\n \"flex flex-row gap-1 p-2 overflow-x-auto\",\n \"border-b border-border\",\n \"-webkit-overflow-scrolling-touch scrollbar-hide\",\n // Desktop (sm+): vertical sidebar\n \"sm:flex-col sm:overflow-x-visible sm:border-b-0 sm:border-r\",\n \"sm:min-w-[var(--date-picker-preset-min-width)]\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Footer container styles (for Apply/Cancel buttons)\n */\nexport const dateRangePickerFooterVariants = cva(\n [\n \"flex items-center justify-end gap-2 border-t border-border\",\n \"p-[var(--date-picker-footer-padding)]\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Range input container styles\n */\nexport const dateRangeInputContainerVariants = cva(\n [\n \"flex items-center gap-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Range input field styles\n */\nexport const dateRangeInputFieldVariants = cva(\n [\n \"flex-1 min-w-0 rounded-md border border-input bg-transparent px-2 py-1 text-sm\",\n \"placeholder:text-muted-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n ],\n {\n variants: {\n size: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-9 text-base\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type DateRangeInputFieldVariantProps = VariantProps<typeof dateRangeInputFieldVariants>\n","import type { DateRangePresetsProps } from \"./DateRangePicker.types\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n dateRangePresetsContainerVariants,\n dateRangePresetVariants,\n} from \"./DateRangePicker.variants\"\n\n/**\n * DateRangePresets component displays a list of quick-select preset date ranges\n */\nfunction DateRangePresets({\n presets,\n selectedPreset,\n onSelect,\n}: DateRangePresetsProps) {\n return (\n <div\n aria-label=\"Date range presets\"\n className={cn(dateRangePresetsContainerVariants())}\n data-slot=\"date-range-presets\"\n role=\"listbox\"\n >\n {presets.map((preset) => {\n const isSelected = selectedPreset === preset.label\n return (\n <button\n key={preset.label}\n aria-selected={isSelected}\n className={cn(dateRangePresetVariants())}\n data-selected={isSelected || undefined}\n role=\"option\"\n type=\"button\"\n onClick={() => { onSelect(preset.getValue(), preset.label); }}\n >\n {preset.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport { DateRangePresets }\n","import type { DateRangePreset } from \"./DateRangePicker.types\"\n\nimport {\n endOfDay,\n endOfMonth,\n endOfWeek,\n endOfYear,\n startOfDay,\n startOfMonth,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subYears,\n} from \"date-fns\"\n\n/**\n * Default preset options for quick date range selection.\n *\n * Each preset carries a canonical `key`; the visible label is resolved per locale via\n * {@link resolvePresetLabel} (DES-1263 — locale-driven, not hardcoded). The English `label`\n * here is the fallback. `custom` (pt: \"Fixo\") clears the range for manual selection.\n */\nexport const defaultPresets: DateRangePreset[] = [\n {\n key: \"today\",\n label: \"Today\",\n getValue: () => {\n const today = startOfDay(new Date())\n return { from: today, to: endOfDay(today) }\n },\n },\n {\n key: \"yesterday\",\n label: \"Yesterday\",\n getValue: () => {\n const yesterday = subDays(new Date(), 1)\n return { from: startOfDay(yesterday), to: endOfDay(yesterday) }\n },\n },\n {\n key: \"thisWeek\",\n label: \"This week\",\n getValue: () => ({\n from: startOfWeek(new Date(), { weekStartsOn: 0 }),\n to: endOfWeek(new Date(), { weekStartsOn: 0 }),\n }),\n },\n {\n key: \"last7Days\",\n label: \"Last 7 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 6)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"last14Days\",\n label: \"Last 14 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 13)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"last30Days\",\n label: \"Last 30 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 29)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"thisMonth\",\n label: \"This month\",\n getValue: () => ({\n from: startOfMonth(new Date()),\n to: endOfMonth(new Date()),\n }),\n },\n {\n key: \"lastMonth\",\n label: \"Last month\",\n getValue: () => {\n const lastMonth = subMonths(new Date(), 1)\n return {\n from: startOfMonth(lastMonth),\n to: endOfMonth(lastMonth),\n }\n },\n },\n {\n key: \"thisYear\",\n label: \"This year\",\n getValue: () => ({\n from: startOfYear(new Date()),\n to: endOfYear(new Date()),\n }),\n },\n {\n key: \"lastYear\",\n label: \"Last year\",\n getValue: () => {\n const lastYear = subYears(new Date(), 1)\n return {\n from: startOfYear(lastYear),\n to: endOfYear(lastYear),\n }\n },\n },\n {\n key: \"allTime\",\n label: \"All time\",\n getValue: () => ({\n from: undefined,\n to: undefined,\n }),\n },\n {\n key: \"custom\",\n label: \"Custom\",\n getValue: () => ({\n from: undefined,\n to: undefined,\n }),\n },\n]\n\n/**\n * Preset label translations (DES-1263). Keyed by language code (locale.code split on \"-\").\n * English labels live on the presets themselves and act as the fallback.\n */\nconst presetLabels: Record<string, Record<string, string>> = {\n pt: {\n today: \"Hoje\",\n yesterday: \"Ontem\",\n thisWeek: \"Esta semana\",\n last7Days: \"Últimos 7 dias\",\n last14Days: \"Últimos 14 dias\",\n last30Days: \"Últimos 30 dias\",\n thisMonth: \"Este mês\",\n lastMonth: \"Mês passado\",\n thisYear: \"Este ano\",\n lastYear: \"Ano passado\",\n allTime: \"Todo o período\",\n custom: \"Fixo\",\n },\n}\n\n/**\n * Resolves a preset's display label for the given locale code (e.g. \"pt-BR\").\n * Falls back to the preset's own English `label` when no translation exists.\n */\nexport function resolvePresetLabel(preset: DateRangePreset, localeCode?: string): string {\n const lang = localeCode?.split(\"-\")[0]\n const translated = lang && preset.key ? presetLabels[lang]?.[preset.key] : undefined\n return translated ?? preset.label\n}\n","import type { DateRange } from \"../../advanced/Calendar\"\nimport type { DateRangePickerProps } from \"./DateRangePicker.types\"\n\nimport { format as formatDate, isAfter, isBefore, startOfDay, startOfMonth } 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 Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../feedback/Dialog\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../feedback/Popover\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n dateRangePickerFooterVariants,\n dateRangePickerTriggerVariants,\n} from \"./DateRangePicker.variants\"\nimport { DateRangePresets } from \"./DateRangePresets\"\nimport { defaultPresets, resolvePresetLabel } from \"./presets\"\n\n/**\n * DateRangePicker component for selecting a date range with optional presets\n */\nfunction DateRangePicker({\n ref,\n className,\n value,\n defaultValue,\n placeholder = \"Select date range\",\n disabled = false,\n disabledDates,\n readOnly = false,\n minDate,\n maxDate,\n format = \"PP\",\n locale,\n onChange,\n onOpenChange,\n onClear,\n size = \"md\",\n variant = \"default\",\n displayMode = \"popover\",\n modalTitle = \"Select Date Range\",\n required = false,\n invalid = false,\n clearable = false,\n numberOfMonths = 2,\n presets = defaultPresets,\n showPresets = true,\n requireConfirmation = false,\n showTodayButton = true,\n activeDates,\n calendarProps,\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n}: DateRangePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [internalRange, setInternalRange] = React.useState<DateRange | undefined>(defaultValue)\n const [pendingRange, setPendingRange] = React.useState<DateRange | undefined>()\n const [selectedPreset, setSelectedPreset] = React.useState<string>()\n const [month, setMonth] = React.useState<Date | undefined>()\n\n // Use controlled value if provided, otherwise use internal state\n const selectedRange = value ?? internalRange\n\n // For confirmation mode, show pending changes until applied\n const displayRange = requireConfirmation && open ? (pendingRange ?? selectedRange) : selectedRange\n\n // Initialize pending range when opening in confirmation mode\n /* eslint-disable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect, react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-event-handler */\n React.useEffect(() => {\n if (open && requireConfirmation) {\n setPendingRange(selectedRange)\n }\n }, [open, requireConfirmation, selectedRange])\n /* eslint-enable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect, react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-event-handler */\n\n const handleRangeSelect = (range: DateRange | undefined) => {\n // Clear preset selection when manually selecting\n setSelectedPreset(undefined)\n\n if (requireConfirmation) {\n setPendingRange(range)\n } else {\n if (value === undefined) {\n setInternalRange(range)\n }\n onChange?.(range)\n }\n }\n\n const handlePresetSelect = (range: DateRange, label: string) => {\n setSelectedPreset(label)\n\n if (requireConfirmation) {\n setPendingRange(range)\n } else {\n if (value === undefined) {\n setInternalRange(range)\n }\n onChange?.(range)\n setOpen(false)\n }\n }\n\n const handleApply = () => {\n if (pendingRange) {\n if (value === undefined) {\n setInternalRange(pendingRange)\n }\n onChange?.(pendingRange)\n }\n setPendingRange(undefined)\n setOpen(false)\n }\n\n const handleCancel = () => {\n setPendingRange(undefined)\n setSelectedPreset(undefined)\n setOpen(false)\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n // Don't open if readOnly\n if (readOnly && isOpen) return\n\n if (!isOpen && requireConfirmation) {\n // Cancel pending changes when closing without applying\n setPendingRange(undefined)\n setSelectedPreset(undefined)\n }\n\n setOpen(isOpen)\n onOpenChange?.(isOpen)\n }\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) {\n setInternalRange(undefined)\n }\n onChange?.()\n setSelectedPreset(undefined)\n onClear?.()\n }\n\n const handleTodayClick = () => {\n setMonth(startOfMonth(new Date()))\n }\n\n // Format display value\n const formatRange = (range: DateRange | undefined): null | string => {\n if (!range?.from) return null\n\n const formatOptions = locale ? { locale } : undefined\n const formattedFrom = formatDate(range.from, format, formatOptions)\n\n if (!range.to) {\n return formattedFrom\n }\n\n const formattedTo = formatDate(range.to, format, formatOptions)\n return `${formattedFrom} - ${formattedTo}`\n }\n\n const displayValue = formatRange(selectedRange)\n const showClearButton = clearable && selectedRange?.from && !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 // Compute displayed month for calendar (controlled or derived from selection)\n const calendarMonth = month ?? displayRange?.from ?? minDate\n\n // Resolve preset labels for the active locale (DES-1263 — locale-driven, not hardcoded)\n const localizedPresets = presets.map((preset) => ({\n ...preset,\n label: resolvePresetLabel(preset, locale?.code),\n }))\n\n // Shared calendar content for both popover and modal modes\n const calendarContent = (\n <div className=\"flex flex-col sm:flex-row\">\n {showPresets && presets.length > 0 && (\n <DateRangePresets\n presets={localizedPresets}\n selectedPreset={selectedPreset}\n onSelect={handlePresetSelect}\n />\n )}\n <div className=\"flex flex-col\">\n {showTodayButton && (\n <div className=\"flex justify-end border-b px-3 py-2\" data-slot=\"date-range-picker-header\">\n <Button\n className=\"h-[var(--date-range-picker-today-button-height)] text-[length:var(--date-range-picker-today-button-text-size)]\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleTodayClick}\n >\n Today\n </Button>\n </div>\n )}\n <Calendar\n autoFocus\n activeDates={activeDates}\n className=\"gap-[var(--date-range-picker-calendar-gap)]\"\n disabled={isDateDisabled}\n locale={locale}\n mode=\"range\"\n month={calendarMonth}\n numberOfMonths={numberOfMonths}\n selected={displayRange}\n onMonthChange={setMonth}\n onSelect={handleRangeSelect as (range: DateRange | undefined) => void}\n {...calendarProps}\n />\n {requireConfirmation && (\n <div className={cn(dateRangePickerFooterVariants())} data-slot=\"date-range-picker-footer\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCancel}\n >\n Cancel\n </Button>\n <Button\n disabled={!pendingRange?.from}\n size=\"sm\"\n variant=\"primary\"\n onClick={handleApply}\n >\n Apply\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n\n // Trigger button shared between modes\n const triggerButton = (\n <button\n ref={ref}\n className={cn(\n dateRangePickerTriggerVariants({ size, variant }),\n !displayValue && \"text-muted-foreground\"\n )}\n aria-describedby={ariaDescribedby}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={invalid}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-readonly={readOnly}\n aria-required={required}\n data-readonly={readOnly || undefined}\n data-size={size}\n data-slot=\"date-range-picker-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={variant}\n disabled={disabled}\n id={id}\n role=\"combobox\"\n type=\"button\"\n onClick={displayMode === \"modal\" ? () => { handleOpenChange(true); } : undefined}\n >\n <span className=\"flex-1 truncate\">\n {displayValue ?? placeholder}\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {showClearButton && (\n <span\n aria-label=\"Clear date range\"\n className=\"rounded-sm opacity-50 hover:opacity-100 focus:outline-none\"\n data-slot=\"date-range-picker-clear\"\n role=\"button\"\n tabIndex={0}\n onClick={handleClear}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n handleClear(e as unknown as React.MouseEvent)\n }\n }}\n >\n <XIcon className=\"size-4\" />\n </span>\n )}\n <CalendarIcon className=\"size-4 opacity-50\" />\n </span>\n </button>\n )\n\n // Hidden inputs for form submission\n const hiddenInputs = (\n <>\n {name && (\n <input\n name={`${name}-from`}\n type=\"hidden\"\n value={selectedRange?.from?.toISOString() ?? \"\"}\n />\n )}\n {name && (\n <input\n name={`${name}-to`}\n type=\"hidden\"\n value={selectedRange?.to?.toISOString() ?? \"\"}\n />\n )}\n </>\n )\n\n // Modal mode\n if (displayMode === \"modal\") {\n return (\n <div className={cn(\"relative\", className)} data-mode=\"modal\" data-slot=\"date-range-picker\" {...props}>\n {triggerButton}\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n className=\"max-w-fit p-0\"\n data-slot=\"date-range-picker-content\"\n >\n <DialogHeader className=\"border-b px-4 py-3\">\n <DialogTitle>{modalTitle}</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Use the calendar to select a start and end date for your range\n </DialogDescription>\n </DialogHeader>\n <div className=\"p-0\">\n {calendarContent}\n </div>\n </DialogContent>\n </Dialog>\n {hiddenInputs}\n </div>\n )\n }\n\n // Popover mode (default)\n return (\n <div className={cn(\"relative\", className)} data-mode=\"popover\" data-slot=\"date-range-picker\" {...props}>\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n {triggerButton}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-auto p-0\"\n data-slot=\"date-range-picker-content\"\n >\n {calendarContent}\n </PopoverContent>\n </Popover>\n {hiddenInputs}\n </div>\n )\n}\n\nexport { DateRangePicker }\n","import type { DateRangeInputProps } from \"./DateRangePicker.types\"\n\nimport { format as formatDate, isValid, parse } from \"date-fns\"\nimport { ArrowRightIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n dateRangeInputContainerVariants,\n dateRangeInputFieldVariants,\n} from \"./DateRangePicker.variants\"\n\n/**\n * DateRangeInput component provides editable text inputs for date range entry\n */\nfunction DateRangeInput({\n value,\n format,\n locale,\n onChange,\n disabled = false,\n readOnly = false,\n startPlaceholder = \"Start date\",\n endPlaceholder = \"End date\",\n}: DateRangeInputProps) {\n const [startInput, setStartInput] = React.useState(\"\")\n const [endInput, setEndInput] = React.useState(\"\")\n\n // Sync input values with prop value\n /* eslint-disable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Intentional: controlled input sync requires useEffect to maintain input state separate from date state for partial input handling */\n React.useEffect(() => {\n if (value?.from) {\n setStartInput(formatDate(value.from, format, locale ? { locale } : undefined))\n } else {\n setStartInput(\"\")\n }\n if (value?.to) {\n setEndInput(formatDate(value.to, format, locale ? { locale } : undefined))\n } else {\n setEndInput(\"\")\n }\n }, [value, format, locale])\n /* eslint-enable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n const parseDate = (input: string): Date | undefined => {\n if (!input.trim()) return undefined\n try {\n const parsed = parse(input, format, new Date(), locale ? { locale } : undefined)\n return isValid(parsed) ? parsed : undefined\n } catch {\n return undefined\n }\n }\n\n const handleStartBlur = () => {\n const parsedStart = parseDate(startInput)\n const currentEnd = value?.to\n\n if (parsedStart || !startInput.trim()) {\n onChange({\n from: parsedStart,\n to: currentEnd,\n })\n } else {\n // Reset to previous value if invalid\n if (value?.from) {\n setStartInput(formatDate(value.from, format, locale ? { locale } : undefined))\n } else {\n setStartInput(\"\")\n }\n }\n }\n\n const handleEndBlur = () => {\n const parsedEnd = parseDate(endInput)\n const currentStart = value?.from\n\n if (parsedEnd || !endInput.trim()) {\n onChange({\n from: currentStart,\n to: parsedEnd,\n })\n } else {\n // Reset to previous value if invalid\n if (value?.to) {\n setEndInput(formatDate(value.to, format, locale ? { locale } : undefined))\n } else {\n setEndInput(\"\")\n }\n }\n }\n\n const handleStartKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleStartBlur()\n }\n }\n\n const handleEndKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleEndBlur()\n }\n }\n\n return (\n <div\n className={cn(dateRangeInputContainerVariants())}\n data-slot=\"date-range-input\"\n >\n <input\n aria-label=\"Start date\"\n className={cn(dateRangeInputFieldVariants())}\n data-slot=\"date-range-input-start\"\n disabled={disabled}\n placeholder={startPlaceholder}\n readOnly={readOnly}\n type=\"text\"\n value={startInput}\n onBlur={handleStartBlur}\n onChange={(e) => { setStartInput(e.target.value); }}\n onKeyDown={handleStartKeyDown}\n />\n <ArrowRightIcon aria-hidden=\"true\" className=\"size-4 text-muted-foreground shrink-0\" />\n <input\n aria-label=\"End date\"\n className={cn(dateRangeInputFieldVariants())}\n data-slot=\"date-range-input-end\"\n disabled={disabled}\n placeholder={endPlaceholder}\n readOnly={readOnly}\n type=\"text\"\n value={endInput}\n onBlur={handleEndBlur}\n onChange={(e) => { setEndInput(e.target.value); }}\n onKeyDown={handleEndKeyDown}\n />\n </div>\n )\n}\n\nexport { DateRangeInput }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/DateRangePicker/DateRangePicker.variants.ts","../src/components/forms/DateRangePicker/DateRangePresets.tsx","../src/components/forms/DateRangePicker/presets.ts","../src/components/forms/DateRangePicker/DateRangePicker.tsx","../src/components/forms/DateRangePicker/DateRangeInput.tsx"],"names":["format","startOfMonth","formatDate","startOfDay","jsx","React2","jsxs"],"mappings":"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","file":"chunk-MQMRVBUL.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * DateRangePicker trigger variant styles using CVA\n */\nexport const dateRangePickerTriggerVariants = 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:opacity-50\",\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 \"data-[state=open]:border-ring data-[state=open]:ring-ring/50 data-[state=open]:ring-[3px]\",\n \"min-w-[var(--date-range-picker-trigger-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 outline: \"border-input bg-transparent\",\n ghost: \"border-transparent hover:bg-accent\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n }\n)\n\nexport type DateRangePickerTriggerVariantProps = VariantProps<typeof dateRangePickerTriggerVariants>\n\n/**\n * Preset item styles - horizontal scrollable tabs on mobile, vertical list on desktop\n */\nexport const dateRangePresetVariants = cva(\n [\n // Base - works for both orientations\n \"text-sm rounded-md transition-colors whitespace-nowrap\",\n \"hover:bg-accent hover:text-accent-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"data-[selected=true]:bg-primary/10 data-[selected=true]:text-primary data-[selected=true]:font-medium\",\n // Mobile: pill-like compact tabs\n \"px-3 py-1.5 flex-shrink-0\",\n // Desktop (sm+): full-width list items\n \"sm:w-full sm:text-left sm:py-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\nexport type DateRangePresetVariantProps = VariantProps<typeof dateRangePresetVariants>\n\n/**\n * Presets container styles - horizontal scrollable on mobile, vertical sidebar on desktop\n */\nexport const dateRangePresetsContainerVariants = cva(\n [\n // Mobile: horizontal scrollable tabs\n \"flex flex-row gap-1 p-2 overflow-x-auto\",\n \"border-b border-border\",\n \"-webkit-overflow-scrolling-touch scrollbar-hide\",\n // Desktop (sm+): vertical sidebar\n \"sm:flex-col sm:overflow-x-visible sm:border-b-0 sm:border-r\",\n \"sm:min-w-[var(--date-picker-preset-min-width)]\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Footer container styles (for Apply/Cancel buttons)\n */\nexport const dateRangePickerFooterVariants = cva(\n [\n \"flex items-center justify-end gap-2 border-t border-border\",\n \"p-[var(--date-picker-footer-padding)]\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Range input container styles\n */\nexport const dateRangeInputContainerVariants = cva(\n [\n \"flex items-center gap-2\",\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n)\n\n/**\n * Range input field styles\n */\nexport const dateRangeInputFieldVariants = cva(\n [\n \"flex-1 min-w-0 rounded-md border border-input bg-transparent px-2 py-1 text-sm\",\n \"placeholder:text-muted-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n ],\n {\n variants: {\n size: {\n sm: \"h-7 text-xs\",\n md: \"h-8 text-sm\",\n lg: \"h-9 text-base\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n)\n\nexport type DateRangeInputFieldVariantProps = VariantProps<typeof dateRangeInputFieldVariants>\n","import type { DateRangePresetsProps } from \"./DateRangePicker.types\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n dateRangePresetsContainerVariants,\n dateRangePresetVariants,\n} from \"./DateRangePicker.variants\"\n\n/**\n * DateRangePresets component displays a list of quick-select preset date ranges\n */\nfunction DateRangePresets({\n presets,\n selectedPreset,\n onSelect,\n}: DateRangePresetsProps) {\n return (\n <div\n aria-label=\"Date range presets\"\n className={cn(dateRangePresetsContainerVariants())}\n data-slot=\"date-range-presets\"\n role=\"listbox\"\n >\n {presets.map((preset) => {\n const isSelected = selectedPreset === preset.label\n return (\n <button\n key={preset.label}\n aria-selected={isSelected}\n className={cn(dateRangePresetVariants())}\n data-selected={isSelected || undefined}\n role=\"option\"\n type=\"button\"\n onClick={() => { onSelect(preset.getValue(), preset.label); }}\n >\n {preset.label}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport { DateRangePresets }\n","import type { DateRangePreset } from \"./DateRangePicker.types\"\n\nimport {\n endOfDay,\n endOfMonth,\n endOfWeek,\n endOfYear,\n startOfDay,\n startOfMonth,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subYears,\n} from \"date-fns\"\n\n/**\n * Default preset options for quick date range selection.\n *\n * Each preset carries a canonical `key`; the visible label is resolved per locale via\n * {@link resolvePresetLabel} (DES-1263 — locale-driven, not hardcoded). The English `label`\n * here is the fallback. `custom` (pt: \"Fixo\") clears the range for manual selection.\n */\nexport const defaultPresets: DateRangePreset[] = [\n {\n key: \"today\",\n label: \"Today\",\n getValue: () => {\n const today = startOfDay(new Date())\n return { from: today, to: endOfDay(today) }\n },\n },\n {\n key: \"yesterday\",\n label: \"Yesterday\",\n getValue: () => {\n const yesterday = subDays(new Date(), 1)\n return { from: startOfDay(yesterday), to: endOfDay(yesterday) }\n },\n },\n {\n key: \"thisWeek\",\n label: \"This week\",\n getValue: () => ({\n from: startOfWeek(new Date(), { weekStartsOn: 0 }),\n to: endOfWeek(new Date(), { weekStartsOn: 0 }),\n }),\n },\n {\n key: \"last7Days\",\n label: \"Last 7 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 6)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"last14Days\",\n label: \"Last 14 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 13)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"last30Days\",\n label: \"Last 30 days\",\n getValue: () => ({\n from: startOfDay(subDays(new Date(), 29)),\n to: endOfDay(new Date()),\n }),\n },\n {\n key: \"thisMonth\",\n label: \"This month\",\n getValue: () => ({\n from: startOfMonth(new Date()),\n to: endOfMonth(new Date()),\n }),\n },\n {\n key: \"lastMonth\",\n label: \"Last month\",\n getValue: () => {\n const lastMonth = subMonths(new Date(), 1)\n return {\n from: startOfMonth(lastMonth),\n to: endOfMonth(lastMonth),\n }\n },\n },\n {\n key: \"thisYear\",\n label: \"This year\",\n getValue: () => ({\n from: startOfYear(new Date()),\n to: endOfYear(new Date()),\n }),\n },\n {\n key: \"lastYear\",\n label: \"Last year\",\n getValue: () => {\n const lastYear = subYears(new Date(), 1)\n return {\n from: startOfYear(lastYear),\n to: endOfYear(lastYear),\n }\n },\n },\n {\n key: \"allTime\",\n label: \"All time\",\n getValue: () => ({\n from: undefined,\n to: undefined,\n }),\n },\n {\n key: \"custom\",\n label: \"Custom\",\n getValue: () => ({\n from: undefined,\n to: undefined,\n }),\n },\n]\n\n/**\n * Preset label translations (DES-1263). Keyed by language code (locale.code split on \"-\").\n * English labels live on the presets themselves and act as the fallback.\n */\nconst presetLabels: Record<string, Record<string, string>> = {\n pt: {\n today: \"Hoje\",\n yesterday: \"Ontem\",\n thisWeek: \"Esta semana\",\n last7Days: \"Últimos 7 dias\",\n last14Days: \"Últimos 14 dias\",\n last30Days: \"Últimos 30 dias\",\n thisMonth: \"Este mês\",\n lastMonth: \"Mês passado\",\n thisYear: \"Este ano\",\n lastYear: \"Ano passado\",\n allTime: \"Todo o período\",\n custom: \"Fixo\",\n },\n}\n\n/**\n * Resolves a preset's display label for the given locale code (e.g. \"pt-BR\").\n * Falls back to the preset's own English `label` when no translation exists.\n */\nexport function resolvePresetLabel(preset: DateRangePreset, localeCode?: string): string {\n const lang = localeCode?.split(\"-\")[0]\n const translated = lang && preset.key ? presetLabels[lang]?.[preset.key] : undefined\n return translated ?? preset.label\n}\n","import type { DateRange } from \"../../advanced/Calendar\"\nimport type { DateRangePickerProps } from \"./DateRangePicker.types\"\n\nimport { format as formatDate, isAfter, isBefore, startOfDay, startOfMonth } 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 Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"../../feedback/Dialog\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../feedback/Popover\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n dateRangePickerFooterVariants,\n dateRangePickerTriggerVariants,\n} from \"./DateRangePicker.variants\"\nimport { DateRangePresets } from \"./DateRangePresets\"\nimport { defaultPresets, resolvePresetLabel } from \"./presets\"\n\n/**\n * DateRangePicker component for selecting a date range with optional presets\n */\nfunction DateRangePicker({\n ref,\n className,\n value,\n defaultValue,\n placeholder = \"Select date range\",\n disabled = false,\n disabledDates,\n readOnly = false,\n minDate,\n maxDate,\n format = \"PP\",\n locale,\n onChange,\n onOpenChange,\n onClear,\n size = \"md\",\n variant = \"default\",\n displayMode = \"popover\",\n modalTitle = \"Select Date Range\",\n required = false,\n invalid = false,\n clearable = false,\n numberOfMonths = 2,\n presets = defaultPresets,\n showPresets = true,\n requireConfirmation = false,\n showTodayButton = true,\n activeDates,\n calendarProps,\n id,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n}: DateRangePickerProps) {\n const [open, setOpen] = React.useState(false)\n const [internalRange, setInternalRange] = React.useState<DateRange | undefined>(defaultValue)\n const [pendingRange, setPendingRange] = React.useState<DateRange | undefined>()\n const [selectedPreset, setSelectedPreset] = React.useState<string>()\n const [month, setMonth] = React.useState<Date | undefined>()\n\n // Use controlled value if provided, otherwise use internal state\n const selectedRange = value ?? internalRange\n\n // For confirmation mode, show pending changes until applied\n const displayRange = requireConfirmation && open ? (pendingRange ?? selectedRange) : selectedRange\n\n // Initialize pending range when opening in confirmation mode\n /* eslint-disable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect, react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-event-handler */\n React.useEffect(() => {\n if (open && requireConfirmation) {\n setPendingRange(selectedRange)\n }\n }, [open, requireConfirmation, selectedRange])\n /* eslint-enable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect, react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-event-handler */\n\n const handleRangeSelect = (range: DateRange | undefined) => {\n // Clear preset selection when manually selecting\n setSelectedPreset(undefined)\n\n if (requireConfirmation) {\n setPendingRange(range)\n } else {\n if (value === undefined) {\n setInternalRange(range)\n }\n onChange?.(range)\n }\n }\n\n const handlePresetSelect = (range: DateRange, label: string) => {\n setSelectedPreset(label)\n\n if (requireConfirmation) {\n setPendingRange(range)\n } else {\n if (value === undefined) {\n setInternalRange(range)\n }\n onChange?.(range)\n setOpen(false)\n }\n }\n\n const handleApply = () => {\n if (pendingRange) {\n if (value === undefined) {\n setInternalRange(pendingRange)\n }\n onChange?.(pendingRange)\n }\n setPendingRange(undefined)\n setOpen(false)\n }\n\n const handleCancel = () => {\n setPendingRange(undefined)\n setSelectedPreset(undefined)\n setOpen(false)\n }\n\n const handleOpenChange = (isOpen: boolean) => {\n // Don't open if readOnly\n if (readOnly && isOpen) return\n\n if (!isOpen && requireConfirmation) {\n // Cancel pending changes when closing without applying\n setPendingRange(undefined)\n setSelectedPreset(undefined)\n }\n\n setOpen(isOpen)\n onOpenChange?.(isOpen)\n }\n\n const handleClear = (event: React.MouseEvent) => {\n event.stopPropagation()\n if (value === undefined) {\n setInternalRange(undefined)\n }\n onChange?.()\n setSelectedPreset(undefined)\n onClear?.()\n }\n\n const handleTodayClick = () => {\n setMonth(startOfMonth(new Date()))\n }\n\n // Format display value\n const formatRange = (range: DateRange | undefined): null | string => {\n if (!range?.from) return null\n\n const formatOptions = locale ? { locale } : undefined\n const formattedFrom = formatDate(range.from, format, formatOptions)\n\n if (!range.to) {\n return formattedFrom\n }\n\n const formattedTo = formatDate(range.to, format, formatOptions)\n return `${formattedFrom} - ${formattedTo}`\n }\n\n const displayValue = formatRange(selectedRange)\n const showClearButton = clearable && selectedRange?.from && !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 // Compute displayed month for calendar (controlled or derived from selection)\n const calendarMonth = month ?? displayRange?.from ?? minDate\n\n // Resolve preset labels for the active locale (DES-1263 — locale-driven, not hardcoded)\n const localizedPresets = presets.map((preset) => ({\n ...preset,\n label: resolvePresetLabel(preset, locale?.code),\n }))\n\n // Shared calendar content for both popover and modal modes\n const calendarContent = (\n <div className=\"flex flex-col sm:flex-row\">\n {showPresets && presets.length > 0 && (\n <DateRangePresets\n presets={localizedPresets}\n selectedPreset={selectedPreset}\n onSelect={handlePresetSelect}\n />\n )}\n <div className=\"flex flex-col\">\n {showTodayButton && (\n <div className=\"flex justify-end border-b px-3 py-2\" data-slot=\"date-range-picker-header\">\n <Button\n className=\"h-[var(--date-range-picker-today-button-height)] text-[length:var(--date-range-picker-today-button-text-size)]\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleTodayClick}\n >\n Today\n </Button>\n </div>\n )}\n <Calendar\n autoFocus\n activeDates={activeDates}\n className=\"gap-[var(--date-range-picker-calendar-gap)]\"\n disabled={isDateDisabled}\n locale={locale}\n mode=\"range\"\n month={calendarMonth}\n numberOfMonths={numberOfMonths}\n selected={displayRange}\n onMonthChange={setMonth}\n onSelect={handleRangeSelect as (range: DateRange | undefined) => void}\n {...calendarProps}\n />\n {requireConfirmation && (\n <div className={cn(dateRangePickerFooterVariants())} data-slot=\"date-range-picker-footer\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleCancel}\n >\n Cancel\n </Button>\n <Button\n disabled={!pendingRange?.from}\n size=\"sm\"\n variant=\"primary\"\n onClick={handleApply}\n >\n Apply\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n\n // Trigger button shared between modes\n const triggerButton = (\n <button\n ref={ref}\n className={cn(\n dateRangePickerTriggerVariants({ size, variant }),\n !displayValue && \"text-muted-foreground\"\n )}\n aria-describedby={ariaDescribedby}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-invalid={invalid}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-readonly={readOnly}\n aria-required={required}\n data-readonly={readOnly || undefined}\n data-size={size}\n data-slot=\"date-range-picker-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={variant}\n disabled={disabled}\n id={id}\n role=\"combobox\"\n type=\"button\"\n onClick={displayMode === \"modal\" ? () => { handleOpenChange(true); } : undefined}\n >\n <span className=\"flex-1 truncate\">\n {displayValue ?? placeholder}\n </span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {showClearButton && (\n <span\n aria-label=\"Clear date range\"\n className=\"rounded-sm opacity-50 hover:opacity-100 focus:outline-none\"\n data-slot=\"date-range-picker-clear\"\n role=\"button\"\n tabIndex={0}\n onClick={handleClear}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n handleClear(e as unknown as React.MouseEvent)\n }\n }}\n >\n <XIcon className=\"size-4\" />\n </span>\n )}\n <CalendarIcon className=\"size-4 opacity-50\" />\n </span>\n </button>\n )\n\n // Hidden inputs for form submission\n const hiddenInputs = (\n <>\n {name && (\n <input\n name={`${name}-from`}\n type=\"hidden\"\n value={selectedRange?.from?.toISOString() ?? \"\"}\n />\n )}\n {name && (\n <input\n name={`${name}-to`}\n type=\"hidden\"\n value={selectedRange?.to?.toISOString() ?? \"\"}\n />\n )}\n </>\n )\n\n // Modal mode\n if (displayMode === \"modal\") {\n return (\n <div className={cn(\"relative\", className)} data-mode=\"modal\" data-slot=\"date-range-picker\" {...props}>\n {triggerButton}\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n className=\"max-w-fit p-0\"\n data-slot=\"date-range-picker-content\"\n >\n <DialogHeader className=\"border-b px-4 py-3\">\n <DialogTitle>{modalTitle}</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Use the calendar to select a start and end date for your range\n </DialogDescription>\n </DialogHeader>\n <div className=\"p-0\">\n {calendarContent}\n </div>\n </DialogContent>\n </Dialog>\n {hiddenInputs}\n </div>\n )\n }\n\n // Popover mode (default)\n return (\n <div className={cn(\"relative\", className)} data-mode=\"popover\" data-slot=\"date-range-picker\" {...props}>\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n {triggerButton}\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"w-auto p-0\"\n data-slot=\"date-range-picker-content\"\n >\n {calendarContent}\n </PopoverContent>\n </Popover>\n {hiddenInputs}\n </div>\n )\n}\n\nexport { DateRangePicker }\n","import type { DateRangeInputProps } from \"./DateRangePicker.types\"\n\nimport { format as formatDate, isValid, parse } from \"date-fns\"\nimport { ArrowRightIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport {\n dateRangeInputContainerVariants,\n dateRangeInputFieldVariants,\n} from \"./DateRangePicker.variants\"\n\n/**\n * DateRangeInput component provides editable text inputs for date range entry\n */\nfunction DateRangeInput({\n value,\n format,\n locale,\n onChange,\n disabled = false,\n readOnly = false,\n startPlaceholder = \"Start date\",\n endPlaceholder = \"End date\",\n}: DateRangeInputProps) {\n const [startInput, setStartInput] = React.useState(\"\")\n const [endInput, setEndInput] = React.useState(\"\")\n\n // Sync input values with prop value\n /* eslint-disable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Intentional: controlled input sync requires useEffect to maintain input state separate from date state for partial input handling */\n React.useEffect(() => {\n if (value?.from) {\n setStartInput(formatDate(value.from, format, locale ? { locale } : undefined))\n } else {\n setStartInput(\"\")\n }\n if (value?.to) {\n setEndInput(formatDate(value.to, format, locale ? { locale } : undefined))\n } else {\n setEndInput(\"\")\n }\n }, [value, format, locale])\n /* eslint-enable react-you-might-not-need-an-effect/no-derived-state, react-you-might-not-need-an-effect/no-adjust-state-on-prop-change, @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */\n\n const parseDate = (input: string): Date | undefined => {\n if (!input.trim()) return undefined\n try {\n const parsed = parse(input, format, new Date(), locale ? { locale } : undefined)\n return isValid(parsed) ? parsed : undefined\n } catch {\n return undefined\n }\n }\n\n const handleStartBlur = () => {\n const parsedStart = parseDate(startInput)\n const currentEnd = value?.to\n\n if (parsedStart || !startInput.trim()) {\n onChange({\n from: parsedStart,\n to: currentEnd,\n })\n } else {\n // Reset to previous value if invalid\n if (value?.from) {\n setStartInput(formatDate(value.from, format, locale ? { locale } : undefined))\n } else {\n setStartInput(\"\")\n }\n }\n }\n\n const handleEndBlur = () => {\n const parsedEnd = parseDate(endInput)\n const currentStart = value?.from\n\n if (parsedEnd || !endInput.trim()) {\n onChange({\n from: currentStart,\n to: parsedEnd,\n })\n } else {\n // Reset to previous value if invalid\n if (value?.to) {\n setEndInput(formatDate(value.to, format, locale ? { locale } : undefined))\n } else {\n setEndInput(\"\")\n }\n }\n }\n\n const handleStartKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleStartBlur()\n }\n }\n\n const handleEndKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleEndBlur()\n }\n }\n\n return (\n <div\n className={cn(dateRangeInputContainerVariants())}\n data-slot=\"date-range-input\"\n >\n <input\n aria-label=\"Start date\"\n className={cn(dateRangeInputFieldVariants())}\n data-slot=\"date-range-input-start\"\n disabled={disabled}\n placeholder={startPlaceholder}\n readOnly={readOnly}\n type=\"text\"\n value={startInput}\n onBlur={handleStartBlur}\n onChange={(e) => { setStartInput(e.target.value); }}\n onKeyDown={handleStartKeyDown}\n />\n <ArrowRightIcon aria-hidden=\"true\" className=\"size-4 text-muted-foreground shrink-0\" />\n <input\n aria-label=\"End date\"\n className={cn(dateRangeInputFieldVariants())}\n data-slot=\"date-range-input-end\"\n disabled={disabled}\n placeholder={endPlaceholder}\n readOnly={readOnly}\n type=\"text\"\n value={endInput}\n onBlur={handleEndBlur}\n onChange={(e) => { setEndInput(e.target.value); }}\n onKeyDown={handleEndKeyDown}\n />\n </div>\n )\n}\n\nexport { DateRangeInput }\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 { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
@@ -79,6 +79,7 @@ function PaginationPrevious({
|
|
|
79
79
|
{
|
|
80
80
|
"aria-label": "Go to previous page",
|
|
81
81
|
className: cn(paginationPreviousVariants(), className),
|
|
82
|
+
"data-slot": "pagination-previous",
|
|
82
83
|
size: "default",
|
|
83
84
|
...props,
|
|
84
85
|
children: [
|
|
@@ -97,6 +98,7 @@ function PaginationNext({
|
|
|
97
98
|
{
|
|
98
99
|
"aria-label": "Go to next page",
|
|
99
100
|
className: cn(paginationNextVariants(), className),
|
|
101
|
+
"data-slot": "pagination-next",
|
|
100
102
|
size: "default",
|
|
101
103
|
...props,
|
|
102
104
|
children: [
|
|
@@ -126,5 +128,5 @@ function PaginationEllipsis({
|
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, paginationContentVariants, paginationEllipsisVariants, paginationNextVariants, paginationPreviousVariants, paginationVariants };
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
131
|
+
//# sourceMappingURL=chunk-O7AUE5GP.js.map
|
|
132
|
+
//# sourceMappingURL=chunk-O7AUE5GP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/navigation/Pagination/Pagination.variants.ts","../src/components/navigation/Pagination/Pagination.tsx"],"names":[],"mappings":"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","file":"chunk-O7AUE5GP.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/**\n * Pagination root variant styles\n */\nexport const paginationVariants = cva([\n \"mx-auto flex w-full justify-center\",\n])\n\n/**\n * PaginationContent variant styles\n */\nexport const paginationContentVariants = cva([\n \"flex flex-row items-center gap-[var(--pagination-content-gap)]\",\n])\n\n/**\n * PaginationPrevious variant styles\n */\nexport const paginationPreviousVariants = cva([\n \"gap-[var(--pagination-button-gap)] px-[var(--pagination-button-padding-x)] sm:pl-[var(--pagination-button-padding-x)]\",\n])\n\n/**\n * PaginationNext variant styles\n */\nexport const paginationNextVariants = cva([\n \"gap-[var(--pagination-button-gap)] px-[var(--pagination-button-padding-x)] sm:pr-[var(--pagination-button-padding-x)]\",\n])\n\n/**\n * PaginationEllipsis variant styles\n */\nexport const paginationEllipsisVariants = cva([\n \"flex size-[var(--pagination-ellipsis-size)] items-center justify-center\",\n])\n","import type {\n PaginationContentProps,\n PaginationEllipsisProps,\n PaginationItemProps,\n PaginationLinkProps,\n PaginationNextProps,\n PaginationPreviousProps,\n PaginationProps,\n} from \"./Pagination.types\"\n\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { buttonVariants } from \"../../primitives/Button\"\nimport {\n paginationContentVariants,\n paginationEllipsisVariants,\n paginationNextVariants,\n paginationPreviousVariants,\n paginationVariants,\n} from \"./Pagination.variants\"\n\n/**\n * Pagination - A navigation component for paginated content.\n *\n * Provides accessible navigation with previous/next buttons and page links.\n *\n * @example\n * <Pagination>\n * <PaginationContent>\n * <PaginationItem>\n * <PaginationPrevious href=\"#\" />\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\">1</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationLink href=\"#\" isActive>2</PaginationLink>\n * </PaginationItem>\n * <PaginationItem>\n * <PaginationNext href=\"#\" />\n * </PaginationItem>\n * </PaginationContent>\n * </Pagination>\n */\nfunction Pagination({ className, ...props }: PaginationProps) {\n return (\n <nav\n aria-label=\"pagination\"\n className={cn(paginationVariants(), className)}\n data-slot=\"pagination\"\n role=\"navigation\"\n {...props}\n />\n )\n}\n\n/**\n * PaginationContent - Container for pagination items.\n */\nfunction PaginationContent({\n className,\n ...props\n}: PaginationContentProps) {\n return (\n <ul\n className={cn(paginationContentVariants(), className)}\n data-slot=\"pagination-content\"\n {...props}\n />\n )\n}\n\n/**\n * PaginationItem - Wrapper for individual pagination elements.\n */\nfunction PaginationItem({ ...props }: PaginationItemProps) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\n/**\n * PaginationLink - A link to a specific page.\n *\n * Use isActive to indicate the current page.\n */\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n aria-current={isActive ? \"page\" : undefined}\n data-active={isActive}\n data-slot=\"pagination-link\"\n {...props}\n />\n )\n}\n\n/**\n * PaginationPrevious - Link to the previous page.\n *\n * Includes a chevron icon and \"Previous\" text on larger screens.\n */\nfunction PaginationPrevious({\n className,\n ...props\n}: PaginationPreviousProps) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n className={cn(paginationPreviousVariants(), className)}\n data-slot=\"pagination-previous\"\n size=\"default\"\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n )\n}\n\n/**\n * PaginationNext - Link to the next page.\n *\n * Includes a chevron icon and \"Next\" text on larger screens.\n */\nfunction PaginationNext({\n className,\n ...props\n}: PaginationNextProps) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n className={cn(paginationNextVariants(), className)}\n data-slot=\"pagination-next\"\n size=\"default\"\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n )\n}\n\n/**\n * PaginationEllipsis - Indicates more pages between visible page links.\n */\nfunction PaginationEllipsis({\n className,\n ...props\n}: PaginationEllipsisProps) {\n return (\n <span\n aria-hidden\n className={cn(paginationEllipsisVariants(), className)}\n data-slot=\"pagination-ellipsis\"\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Lightbox } from './chunk-
|
|
2
|
-
import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from './chunk-
|
|
3
|
-
import { AspectRatio } from './chunk-
|
|
1
|
+
import { Lightbox } from './chunk-2FJJOHHH.js';
|
|
2
|
+
import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from './chunk-Q335YODG.js';
|
|
3
|
+
import { AspectRatio } from './chunk-45D4O7RK.js';
|
|
4
4
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
6
6
|
import { Check } from 'lucide-react';
|
|
@@ -593,5 +593,5 @@ function ImageGallery({
|
|
|
593
593
|
}
|
|
594
594
|
|
|
595
595
|
export { ImageGallery, ImageGalleryItem };
|
|
596
|
-
//# sourceMappingURL=chunk-
|
|
597
|
-
//# sourceMappingURL=chunk-
|
|
596
|
+
//# sourceMappingURL=chunk-OCXGG7UP.js.map
|
|
597
|
+
//# sourceMappingURL=chunk-OCXGG7UP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"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","file":"chunk-6HEURMY3.js","sourcesContent":["\"use client\"\n\nimport type {\n ImageGalleryGap,\n ImageGalleryItemProps,\n ImageGalleryLayout,\n ImageGalleryProps,\n ImageItem,\n ResponsiveColumns,\n} from \"./ImageGallery.types\"\n\nimport { cva } from \"class-variance-authority\"\nimport { Check } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { AspectRatio } from \"../../primitives/AspectRatio\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"../Carousel\"\nimport { Lightbox } from \"../Lightbox\"\n\n// Gap size mapping\nconst gapClasses: Record<ImageGalleryGap, string> = {\n lg: \"gap-6\",\n md: \"gap-4\",\n sm: \"gap-2\",\n}\n\n// Static column class mappings for Tailwind v4 detection\nconst columnClasses: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n}\n\nconst smColumnClasses: Record<number, string> = {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n}\n\nconst mdColumnClasses: Record<number, string> = {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n}\n\nconst lgColumnClasses: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n}\n\nconst xlColumnClasses: Record<number, string> = {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n}\n\n\n// Generate responsive column classes using static mappings\nfunction getColumnClasses(\n columns: number | ResponsiveColumns | undefined\n): string {\n if (columns === undefined) {\n return \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n }\n\n if (typeof columns === \"number\") {\n return columnClasses[columns] ?? \"grid-cols-4\"\n }\n\n const classes: string[] = []\n if (columns.sm) classes.push(smColumnClasses[columns.sm] ?? \"sm:grid-cols-2\")\n if (columns.md) classes.push(mdColumnClasses[columns.md] ?? \"md:grid-cols-3\")\n if (columns.lg) classes.push(lgColumnClasses[columns.lg] ?? \"lg:grid-cols-4\")\n if (columns.xl) classes.push(xlColumnClasses[columns.xl] ?? \"xl:grid-cols-4\")\n\n return classes.join(\" \") || \"grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n}\n\n// Item variants for consistent styling\nconst imageGalleryItemVariants = cva(\n [\n \"relative overflow-hidden rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-transform duration-200\",\n \"cursor-pointer\",\n ],\n {\n variants: {\n selected: {\n true: \"ring-2 ring-primary ring-offset-2\",\n false: \"\",\n },\n interactive: {\n true: \"hover:scale-[1.02]\",\n false: \"\",\n },\n },\n defaultVariants: {\n selected: false,\n interactive: true,\n },\n }\n)\n\n/**\n * Subscribe an end-of-list sentinel to the viewport so that scrolling it into\n * view fires `onLoadMore`. No observer is created when `onLoadMore` is omitted\n * or when IntersectionObserver is unavailable (SSR / older runtimes).\n */\nfunction useInfiniteScroll(onLoadMore?: () => void) {\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const node = sentinelRef.current\n if (!onLoadMore || !node) return\n if (typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onLoadMore()\n }\n }\n },\n { rootMargin: \"200px\" }\n )\n observer.observe(node)\n\n return () => {\n observer.disconnect()\n }\n }, [onLoadMore])\n\n return sentinelRef\n}\n\n/**\n * Individual gallery item component\n */\nfunction ImageGalleryItem({\n aspectRatio = 1,\n className,\n interactive = true,\n enableSelection = false,\n image,\n index: _index,\n isSelected = false,\n onClick,\n onImageError,\n onImageLoad,\n ...props\n}: ImageGalleryItemProps) {\n const [imageState, setImageState] = React.useState<\n \"error\" | \"loaded\" | \"loading\"\n >(\"loading\")\n\n const handleLoad = React.useCallback(() => {\n setImageState(\"loaded\")\n onImageLoad?.()\n }, [onImageLoad])\n\n const handleError = React.useCallback(() => {\n setImageState(\"error\")\n onImageError?.(new Error(`Failed to load image: ${image.src}`))\n }, [image.src, onImageError])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n },\n [onClick]\n )\n\n return (\n <button\n aria-label={\n enableSelection && isSelected\n ? `${image.alt} (selected)`\n : image.alt\n }\n className={cn(\n imageGalleryItemVariants({\n selected: isSelected,\n interactive,\n }),\n className\n )}\n aria-pressed={enableSelection ? isSelected : undefined}\n data-error={imageState === \"error\" || undefined}\n data-loading={imageState === \"loading\" || undefined}\n data-selected={isSelected || undefined}\n data-slot=\"image-gallery-item\"\n type=\"button\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <AspectRatio ratio={aspectRatio}>\n {imageState === \"loading\" && (\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n )}\n {imageState === \"error\" ? (\n <div className=\"flex h-full w-full items-center justify-center bg-muted text-muted-foreground\">\n <span className=\"text-sm\">Failed to load</span>\n </div>\n ) : (\n <img\n className={cn(\n \"h-full w-full object-cover transition-opacity duration-200\",\n imageState === \"loading\" ? \"opacity-0\" : \"opacity-100\"\n )}\n alt={image.alt}\n data-slot=\"image-gallery-image\"\n loading=\"lazy\"\n src={image.thumbnail ?? image.src}\n onError={handleError}\n onLoad={handleLoad}\n />\n )}\n </AspectRatio>\n\n {/* Selection indicator */}\n {enableSelection && isSelected && (\n <div className=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Check className=\"h-4 w-4\" />\n </div>\n )}\n </button>\n )\n}\n\n/**\n * Grid layout component\n */\nfunction GridLayout({\n aspectRatio = 1,\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n // Only emit inline-style fallback for fixed numeric column counts.\n // For responsive ResponsiveColumns objects, Tailwind classes handle breakpoints —\n // inline style would override them and break responsiveness.\n const inlineGridStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-layout=\"grid\"\n style={inlineGridStyle}\n >\n {images.map((image, index) => (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * Masonry layout component\n * Uses CSS columns for a Pinterest-style layout\n */\nfunction MasonryLayout({\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const columnCount =\n typeof columns === \"number\" ? columns : columns?.lg ?? columns?.md ?? 3\n\n const gapValue = gap === \"sm\" ? \"0.5rem\" : gap === \"lg\" ? \"1.5rem\" : \"1rem\"\n\n return (\n <div\n style={{\n columnCount,\n columnGap: gapValue,\n }}\n className=\"[column-fill:balance]\"\n data-layout=\"masonry\"\n >\n {images.map((image, index) => {\n const aspectRatio =\n image.width && image.height ? image.width / image.height : 1\n\n return (\n <div\n key={image.id}\n style={{\n marginBottom: gapValue,\n }}\n className=\"mb-2 break-inside-avoid md:mb-4 lg:mb-6\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </div>\n )\n })}\n </div>\n )\n}\n\n/**\n * Featured layout component\n * Shows first image large with thumbnails on the side\n */\nfunction FeaturedLayout({\n aspectRatio = 1,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const [featuredIndex, setFeaturedIndex] = React.useState(0)\n\n const handleThumbnailClick = React.useCallback(\n (image: ImageItem, originalIndex: number) => {\n setFeaturedIndex(originalIndex)\n onItemClick(image, originalIndex)\n },\n [onItemClick]\n )\n\n if (images.length === 0) return null\n\n const featuredImage = images[featuredIndex]\n if (!featuredImage) return null\n\n const thumbnails = images.filter((_, i) => i !== featuredIndex)\n\n return (\n <div\n className={cn(\"flex flex-col gap-4 md:flex-row\", gapClasses[gap])}\n data-layout=\"featured\"\n >\n {/* Main featured image */}\n <div className=\"flex-1\">\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n className=\"h-full\"\n enableSelection={enableSelection}\n image={featuredImage}\n index={featuredIndex}\n isSelected={selectedIds.includes(featuredImage.id)}\n onClick={() => {\n onItemClick(featuredImage, featuredIndex)\n }}\n onImageError={(error) => {\n onImageError?.(featuredImage, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(featuredImage)\n }}\n />\n </div>\n\n {/* Thumbnails sidebar */}\n {thumbnails.length > 0 && (\n <div\n className={cn(\n \"flex w-full flex-row md:w-24 md:flex-col lg:w-32\",\n gapClasses[gap]\n )}\n >\n {thumbnails.map((image) => {\n const originalIndex = images.findIndex((img) => img.id === image.id)\n return (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={1}\n className=\"flex-1 md:flex-none\"\n enableSelection={enableSelection}\n image={image}\n index={originalIndex}\n interactive={enableSelection}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n handleThumbnailClick(image, originalIndex)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Carousel layout component\n *\n * Composes the shared Carousel primitive (drag, keyboard arrows, prev/next\n * buttons) instead of re-implementing embla. The horizontal padding leaves\n * room for the absolutely-positioned navigation buttons.\n */\nfunction CarouselLayout({\n aspectRatio = 1,\n enableSelection = false,\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n return (\n <div\n className=\"px-[var(--carousel-button-offset)]\"\n data-layout=\"carousel\"\n >\n <Carousel className=\"w-full\" opts={{ align: \"start\", loop: false }}>\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n key={image.id}\n className=\"basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n </div>\n )\n}\n\n/**\n * Loading skeleton for the gallery\n */\nfunction LoadingSkeleton({\n aspectRatio = 1,\n columns,\n count = 8,\n gap = \"md\",\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n count?: number\n gap?: ImageGalleryGap\n}) {\n // Generate stable keys for skeleton items\n const skeletonKeys = React.useMemo(\n () => Array.from({ length: count }, (_, i) => `skeleton-${String(i)}`),\n [count]\n )\n\n const skeletonInlineStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-loading=\"true\"\n style={skeletonInlineStyle}\n >\n {skeletonKeys.map((key) => (\n <AspectRatio key={key} ratio={aspectRatio}>\n <div className=\"h-full w-full animate-pulse rounded-md bg-muted\" />\n </AspectRatio>\n ))}\n </div>\n )\n}\n\n/**\n * ImageGallery - A component for displaying collections of images in various layouts\n *\n * Composes the {@link Carousel} primitive for the `carousel` layout and the\n * {@link Lightbox} for full-screen viewing (`enableLightbox`). `enableLightbox`\n * and `enableSelection` are mutually exclusive — see the prop docs.\n *\n * @example\n * ```tsx\n * <ImageGallery\n * images={[\n * { id: \"1\", src: \"/photo.jpg\", alt: \"Beach sunset\" },\n * { id: \"2\", src: \"/mountain.jpg\", alt: \"Mountain view\" },\n * ]}\n * layout=\"grid\"\n * columns={{ sm: 2, md: 3, lg: 4 }}\n * gap=\"md\"\n * />\n * ```\n */\nfunction ImageGallery({\n aspectRatio = 1,\n className,\n columns,\n enableLightbox = false,\n enableSelection = false,\n gap = \"md\",\n images,\n layout = \"grid\",\n loading = false,\n maxSelection,\n onImageClick,\n onImageError,\n onImageLoad,\n onLoadMore,\n onSelectionChange,\n ref,\n selectedIds: controlledSelectedIds,\n ...props\n}: ImageGalleryProps) {\n // `enableLightbox` and `enableSelection` are mutually exclusive: a click\n // cannot both open a viewer and toggle a selection. Selection wins; the\n // lightbox is disabled and a dev-only warning flags the misuse.\n const isProd =\n // eslint-disable-next-line @typescript-eslint/dot-notation -- noPropertyAccessFromIndexSignature; bracket access on process.env is required by CI tsc.\n typeof process !== \"undefined\" && process.env[\"NODE_ENV\"] === \"production\"\n const lightboxEnabled = enableLightbox && !enableSelection\n if (enableLightbox && enableSelection && !isProd) {\n\n console.warn(\n \"<ImageGallery> received both `enableLightbox` and `enableSelection`. They are mutually exclusive; `enableSelection` takes precedence and the lightbox is disabled. Enable only one.\"\n )\n }\n\n // Internal selection state when uncontrolled\n const [internalSelectedIds, setInternalSelectedIds] = React.useState<\n string[]\n >([])\n const selectedIds = controlledSelectedIds ?? internalSelectedIds\n\n // Lightbox state — index of the image to open in the full-screen viewer\n const [lightboxOpen, setLightboxOpen] = React.useState(false)\n const [lightboxIndex, setLightboxIndex] = React.useState(0)\n\n const sentinelRef = useInfiniteScroll(onLoadMore)\n\n const handleItemClick = React.useCallback(\n (image: ImageItem, index: number) => {\n // Handle selection mode\n if (enableSelection) {\n const newSelectedIds = selectedIds.includes(image.id)\n ? selectedIds.filter((id) => id !== image.id)\n : maxSelection && selectedIds.length >= maxSelection\n ? selectedIds // Don't add if at max\n : [...selectedIds, image.id]\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n }\n\n // Open the lightbox (mutually exclusive with selection)\n if (lightboxEnabled) {\n setLightboxIndex(index)\n setLightboxOpen(true)\n }\n\n // Always call onImageClick callback\n onImageClick?.(image, index)\n },\n [\n enableSelection,\n selectedIds,\n maxSelection,\n controlledSelectedIds,\n onSelectionChange,\n lightboxEnabled,\n onImageClick,\n ]\n )\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n aria-busy=\"true\"\n aria-label=\"Image gallery loading\"\n className={cn(\"relative w-full\", className)}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <LoadingSkeleton\n aspectRatio={aspectRatio}\n columns={columns}\n count={8}\n gap={gap}\n />\n </div>\n )\n }\n\n // Empty state\n if (images.length === 0) {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-h-52 items-center justify-center rounded-lg border-2 border-dashed border-muted\",\n className\n )}\n aria-label=\"Empty image gallery\"\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <p className=\"text-muted-foreground\">No images to display</p>\n </div>\n )\n }\n\n const layoutProps = {\n aspectRatio,\n columns,\n enableSelection,\n gap,\n images,\n onImageError,\n onImageLoad,\n onItemClick: handleItemClick,\n selectedIds,\n }\n\n const layoutComponents: Record<ImageGalleryLayout, React.ReactNode> = {\n carousel: <CarouselLayout {...layoutProps} />,\n featured: <FeaturedLayout {...layoutProps} />,\n grid: <GridLayout {...layoutProps} />,\n masonry: <MasonryLayout {...layoutProps} />,\n }\n\n return (\n <div\n ref={ref}\n aria-label={`Image gallery with ${String(images.length)} images`}\n aria-roledescription=\"gallery\"\n className={cn(\"relative w-full\", className)}\n data-layout={layout}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n {layoutComponents[layout]}\n\n {/* Infinite-scroll sentinel — observed only when onLoadMore is set */}\n {onLoadMore && (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"h-px w-full\"\n data-slot=\"image-gallery-sentinel\"\n />\n )}\n\n {/* Full-screen viewer — composed from the shared Lightbox primitive */}\n {lightboxEnabled && (\n <Lightbox\n images={images}\n initialIndex={lightboxIndex}\n open={lightboxOpen}\n onOpenChange={setLightboxOpen}\n />\n )}\n </div>\n )\n}\n\nexport { ImageGallery, ImageGalleryItem }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"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","file":"chunk-OCXGG7UP.js","sourcesContent":["\"use client\"\n\nimport type {\n ImageGalleryGap,\n ImageGalleryItemProps,\n ImageGalleryLayout,\n ImageGalleryProps,\n ImageItem,\n ResponsiveColumns,\n} from \"./ImageGallery.types\"\n\nimport { cva } from \"class-variance-authority\"\nimport { Check } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { AspectRatio } from \"../../primitives/AspectRatio\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"../Carousel\"\nimport { Lightbox } from \"../Lightbox\"\n\n// Gap size mapping\nconst gapClasses: Record<ImageGalleryGap, string> = {\n lg: \"gap-6\",\n md: \"gap-4\",\n sm: \"gap-2\",\n}\n\n// Static column class mappings for Tailwind v4 detection\nconst columnClasses: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n}\n\nconst smColumnClasses: Record<number, string> = {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n}\n\nconst mdColumnClasses: Record<number, string> = {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n}\n\nconst lgColumnClasses: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n}\n\nconst xlColumnClasses: Record<number, string> = {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n}\n\n\n// Generate responsive column classes using static mappings\nfunction getColumnClasses(\n columns: number | ResponsiveColumns | undefined\n): string {\n if (columns === undefined) {\n return \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n }\n\n if (typeof columns === \"number\") {\n return columnClasses[columns] ?? \"grid-cols-4\"\n }\n\n const classes: string[] = []\n if (columns.sm) classes.push(smColumnClasses[columns.sm] ?? \"sm:grid-cols-2\")\n if (columns.md) classes.push(mdColumnClasses[columns.md] ?? \"md:grid-cols-3\")\n if (columns.lg) classes.push(lgColumnClasses[columns.lg] ?? \"lg:grid-cols-4\")\n if (columns.xl) classes.push(xlColumnClasses[columns.xl] ?? \"xl:grid-cols-4\")\n\n return classes.join(\" \") || \"grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n}\n\n// Item variants for consistent styling\nconst imageGalleryItemVariants = cva(\n [\n \"relative overflow-hidden rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-transform duration-200\",\n \"cursor-pointer\",\n ],\n {\n variants: {\n selected: {\n true: \"ring-2 ring-primary ring-offset-2\",\n false: \"\",\n },\n interactive: {\n true: \"hover:scale-[1.02]\",\n false: \"\",\n },\n },\n defaultVariants: {\n selected: false,\n interactive: true,\n },\n }\n)\n\n/**\n * Subscribe an end-of-list sentinel to the viewport so that scrolling it into\n * view fires `onLoadMore`. No observer is created when `onLoadMore` is omitted\n * or when IntersectionObserver is unavailable (SSR / older runtimes).\n */\nfunction useInfiniteScroll(onLoadMore?: () => void) {\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const node = sentinelRef.current\n if (!onLoadMore || !node) return\n if (typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onLoadMore()\n }\n }\n },\n { rootMargin: \"200px\" }\n )\n observer.observe(node)\n\n return () => {\n observer.disconnect()\n }\n }, [onLoadMore])\n\n return sentinelRef\n}\n\n/**\n * Individual gallery item component\n */\nfunction ImageGalleryItem({\n aspectRatio = 1,\n className,\n interactive = true,\n enableSelection = false,\n image,\n index: _index,\n isSelected = false,\n onClick,\n onImageError,\n onImageLoad,\n ...props\n}: ImageGalleryItemProps) {\n const [imageState, setImageState] = React.useState<\n \"error\" | \"loaded\" | \"loading\"\n >(\"loading\")\n\n const handleLoad = React.useCallback(() => {\n setImageState(\"loaded\")\n onImageLoad?.()\n }, [onImageLoad])\n\n const handleError = React.useCallback(() => {\n setImageState(\"error\")\n onImageError?.(new Error(`Failed to load image: ${image.src}`))\n }, [image.src, onImageError])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n },\n [onClick]\n )\n\n return (\n <button\n aria-label={\n enableSelection && isSelected\n ? `${image.alt} (selected)`\n : image.alt\n }\n className={cn(\n imageGalleryItemVariants({\n selected: isSelected,\n interactive,\n }),\n className\n )}\n aria-pressed={enableSelection ? isSelected : undefined}\n data-error={imageState === \"error\" || undefined}\n data-loading={imageState === \"loading\" || undefined}\n data-selected={isSelected || undefined}\n data-slot=\"image-gallery-item\"\n type=\"button\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <AspectRatio ratio={aspectRatio}>\n {imageState === \"loading\" && (\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n )}\n {imageState === \"error\" ? (\n <div className=\"flex h-full w-full items-center justify-center bg-muted text-muted-foreground\">\n <span className=\"text-sm\">Failed to load</span>\n </div>\n ) : (\n <img\n className={cn(\n \"h-full w-full object-cover transition-opacity duration-200\",\n imageState === \"loading\" ? \"opacity-0\" : \"opacity-100\"\n )}\n alt={image.alt}\n data-slot=\"image-gallery-image\"\n loading=\"lazy\"\n src={image.thumbnail ?? image.src}\n onError={handleError}\n onLoad={handleLoad}\n />\n )}\n </AspectRatio>\n\n {/* Selection indicator */}\n {enableSelection && isSelected && (\n <div className=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Check className=\"h-4 w-4\" />\n </div>\n )}\n </button>\n )\n}\n\n/**\n * Grid layout component\n */\nfunction GridLayout({\n aspectRatio = 1,\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n // Only emit inline-style fallback for fixed numeric column counts.\n // For responsive ResponsiveColumns objects, Tailwind classes handle breakpoints —\n // inline style would override them and break responsiveness.\n const inlineGridStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-layout=\"grid\"\n style={inlineGridStyle}\n >\n {images.map((image, index) => (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * Masonry layout component\n * Uses CSS columns for a Pinterest-style layout\n */\nfunction MasonryLayout({\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const columnCount =\n typeof columns === \"number\" ? columns : columns?.lg ?? columns?.md ?? 3\n\n const gapValue = gap === \"sm\" ? \"0.5rem\" : gap === \"lg\" ? \"1.5rem\" : \"1rem\"\n\n return (\n <div\n style={{\n columnCount,\n columnGap: gapValue,\n }}\n className=\"[column-fill:balance]\"\n data-layout=\"masonry\"\n >\n {images.map((image, index) => {\n const aspectRatio =\n image.width && image.height ? image.width / image.height : 1\n\n return (\n <div\n key={image.id}\n style={{\n marginBottom: gapValue,\n }}\n className=\"mb-2 break-inside-avoid md:mb-4 lg:mb-6\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </div>\n )\n })}\n </div>\n )\n}\n\n/**\n * Featured layout component\n * Shows first image large with thumbnails on the side\n */\nfunction FeaturedLayout({\n aspectRatio = 1,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const [featuredIndex, setFeaturedIndex] = React.useState(0)\n\n const handleThumbnailClick = React.useCallback(\n (image: ImageItem, originalIndex: number) => {\n setFeaturedIndex(originalIndex)\n onItemClick(image, originalIndex)\n },\n [onItemClick]\n )\n\n if (images.length === 0) return null\n\n const featuredImage = images[featuredIndex]\n if (!featuredImage) return null\n\n const thumbnails = images.filter((_, i) => i !== featuredIndex)\n\n return (\n <div\n className={cn(\"flex flex-col gap-4 md:flex-row\", gapClasses[gap])}\n data-layout=\"featured\"\n >\n {/* Main featured image */}\n <div className=\"flex-1\">\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n className=\"h-full\"\n enableSelection={enableSelection}\n image={featuredImage}\n index={featuredIndex}\n isSelected={selectedIds.includes(featuredImage.id)}\n onClick={() => {\n onItemClick(featuredImage, featuredIndex)\n }}\n onImageError={(error) => {\n onImageError?.(featuredImage, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(featuredImage)\n }}\n />\n </div>\n\n {/* Thumbnails sidebar */}\n {thumbnails.length > 0 && (\n <div\n className={cn(\n \"flex w-full flex-row md:w-24 md:flex-col lg:w-32\",\n gapClasses[gap]\n )}\n >\n {thumbnails.map((image) => {\n const originalIndex = images.findIndex((img) => img.id === image.id)\n return (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={1}\n className=\"flex-1 md:flex-none\"\n enableSelection={enableSelection}\n image={image}\n index={originalIndex}\n interactive={enableSelection}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n handleThumbnailClick(image, originalIndex)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Carousel layout component\n *\n * Composes the shared Carousel primitive (drag, keyboard arrows, prev/next\n * buttons) instead of re-implementing embla. The horizontal padding leaves\n * room for the absolutely-positioned navigation buttons.\n */\nfunction CarouselLayout({\n aspectRatio = 1,\n enableSelection = false,\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n return (\n <div\n className=\"px-[var(--carousel-button-offset)]\"\n data-layout=\"carousel\"\n >\n <Carousel className=\"w-full\" opts={{ align: \"start\", loop: false }}>\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n key={image.id}\n className=\"basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n </div>\n )\n}\n\n/**\n * Loading skeleton for the gallery\n */\nfunction LoadingSkeleton({\n aspectRatio = 1,\n columns,\n count = 8,\n gap = \"md\",\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n count?: number\n gap?: ImageGalleryGap\n}) {\n // Generate stable keys for skeleton items\n const skeletonKeys = React.useMemo(\n () => Array.from({ length: count }, (_, i) => `skeleton-${String(i)}`),\n [count]\n )\n\n const skeletonInlineStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-loading=\"true\"\n style={skeletonInlineStyle}\n >\n {skeletonKeys.map((key) => (\n <AspectRatio key={key} ratio={aspectRatio}>\n <div className=\"h-full w-full animate-pulse rounded-md bg-muted\" />\n </AspectRatio>\n ))}\n </div>\n )\n}\n\n/**\n * ImageGallery - A component for displaying collections of images in various layouts\n *\n * Composes the {@link Carousel} primitive for the `carousel` layout and the\n * {@link Lightbox} for full-screen viewing (`enableLightbox`). `enableLightbox`\n * and `enableSelection` are mutually exclusive — see the prop docs.\n *\n * @example\n * ```tsx\n * <ImageGallery\n * images={[\n * { id: \"1\", src: \"/photo.jpg\", alt: \"Beach sunset\" },\n * { id: \"2\", src: \"/mountain.jpg\", alt: \"Mountain view\" },\n * ]}\n * layout=\"grid\"\n * columns={{ sm: 2, md: 3, lg: 4 }}\n * gap=\"md\"\n * />\n * ```\n */\nfunction ImageGallery({\n aspectRatio = 1,\n className,\n columns,\n enableLightbox = false,\n enableSelection = false,\n gap = \"md\",\n images,\n layout = \"grid\",\n loading = false,\n maxSelection,\n onImageClick,\n onImageError,\n onImageLoad,\n onLoadMore,\n onSelectionChange,\n ref,\n selectedIds: controlledSelectedIds,\n ...props\n}: ImageGalleryProps) {\n // `enableLightbox` and `enableSelection` are mutually exclusive: a click\n // cannot both open a viewer and toggle a selection. Selection wins; the\n // lightbox is disabled and a dev-only warning flags the misuse.\n const isProd =\n // eslint-disable-next-line @typescript-eslint/dot-notation -- noPropertyAccessFromIndexSignature; bracket access on process.env is required by CI tsc.\n typeof process !== \"undefined\" && process.env[\"NODE_ENV\"] === \"production\"\n const lightboxEnabled = enableLightbox && !enableSelection\n if (enableLightbox && enableSelection && !isProd) {\n\n console.warn(\n \"<ImageGallery> received both `enableLightbox` and `enableSelection`. They are mutually exclusive; `enableSelection` takes precedence and the lightbox is disabled. Enable only one.\"\n )\n }\n\n // Internal selection state when uncontrolled\n const [internalSelectedIds, setInternalSelectedIds] = React.useState<\n string[]\n >([])\n const selectedIds = controlledSelectedIds ?? internalSelectedIds\n\n // Lightbox state — index of the image to open in the full-screen viewer\n const [lightboxOpen, setLightboxOpen] = React.useState(false)\n const [lightboxIndex, setLightboxIndex] = React.useState(0)\n\n const sentinelRef = useInfiniteScroll(onLoadMore)\n\n const handleItemClick = React.useCallback(\n (image: ImageItem, index: number) => {\n // Handle selection mode\n if (enableSelection) {\n const newSelectedIds = selectedIds.includes(image.id)\n ? selectedIds.filter((id) => id !== image.id)\n : maxSelection && selectedIds.length >= maxSelection\n ? selectedIds // Don't add if at max\n : [...selectedIds, image.id]\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n }\n\n // Open the lightbox (mutually exclusive with selection)\n if (lightboxEnabled) {\n setLightboxIndex(index)\n setLightboxOpen(true)\n }\n\n // Always call onImageClick callback\n onImageClick?.(image, index)\n },\n [\n enableSelection,\n selectedIds,\n maxSelection,\n controlledSelectedIds,\n onSelectionChange,\n lightboxEnabled,\n onImageClick,\n ]\n )\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n aria-busy=\"true\"\n aria-label=\"Image gallery loading\"\n className={cn(\"relative w-full\", className)}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <LoadingSkeleton\n aspectRatio={aspectRatio}\n columns={columns}\n count={8}\n gap={gap}\n />\n </div>\n )\n }\n\n // Empty state\n if (images.length === 0) {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-h-52 items-center justify-center rounded-lg border-2 border-dashed border-muted\",\n className\n )}\n aria-label=\"Empty image gallery\"\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <p className=\"text-muted-foreground\">No images to display</p>\n </div>\n )\n }\n\n const layoutProps = {\n aspectRatio,\n columns,\n enableSelection,\n gap,\n images,\n onImageError,\n onImageLoad,\n onItemClick: handleItemClick,\n selectedIds,\n }\n\n const layoutComponents: Record<ImageGalleryLayout, React.ReactNode> = {\n carousel: <CarouselLayout {...layoutProps} />,\n featured: <FeaturedLayout {...layoutProps} />,\n grid: <GridLayout {...layoutProps} />,\n masonry: <MasonryLayout {...layoutProps} />,\n }\n\n return (\n <div\n ref={ref}\n aria-label={`Image gallery with ${String(images.length)} images`}\n aria-roledescription=\"gallery\"\n className={cn(\"relative w-full\", className)}\n data-layout={layout}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n {layoutComponents[layout]}\n\n {/* Infinite-scroll sentinel — observed only when onLoadMore is set */}\n {onLoadMore && (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"h-px w-full\"\n data-slot=\"image-gallery-sentinel\"\n />\n )}\n\n {/* Full-screen viewer — composed from the shared Lightbox primitive */}\n {lightboxEnabled && (\n <Lightbox\n images={images}\n initialIndex={lightboxIndex}\n open={lightboxOpen}\n onOpenChange={setLightboxOpen}\n />\n )}\n </div>\n )\n}\n\nexport { ImageGallery, ImageGalleryItem }\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SkeletonLoader } from './chunk-QHKOBGLW.js';
|
|
2
2
|
import { Avatar, AvatarImage, AvatarFallback } from './chunk-YP2ATSXP.js';
|
|
3
|
-
import { Badge } from './chunk-
|
|
3
|
+
import { Badge } from './chunk-UDY3IDCY.js';
|
|
4
4
|
import { cn } from './chunk-HRNDJU7D.js';
|
|
5
5
|
import { cva } from 'class-variance-authority';
|
|
6
6
|
import * as React from 'react';
|
|
@@ -350,5 +350,5 @@ function ListItemActions({
|
|
|
350
350
|
}
|
|
351
351
|
|
|
352
352
|
export { List, ListItem, ListItemActions, ListItemContent, listItemVariants, listVariants };
|
|
353
|
-
//# sourceMappingURL=chunk-
|
|
354
|
-
//# sourceMappingURL=chunk-
|
|
353
|
+
//# sourceMappingURL=chunk-ON7WFRYH.js.map
|
|
354
|
+
//# sourceMappingURL=chunk-ON7WFRYH.js.map
|