@etus/ui 0.4.0-beta.10 → 0.4.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/{chunk-7B577M5O.js → chunk-2YSZPUQZ.js} +3 -3
  2. package/dist/{chunk-7B577M5O.js.map → chunk-2YSZPUQZ.js.map} +1 -1
  3. package/dist/{chunk-IHW6IJE5.js → chunk-3NLWCX2F.js} +3 -3
  4. package/dist/{chunk-IHW6IJE5.js.map → chunk-3NLWCX2F.js.map} +1 -1
  5. package/dist/{chunk-WOOBWQHY.js → chunk-3NSIUZGP.js} +3 -3
  6. package/dist/{chunk-WOOBWQHY.js.map → chunk-3NSIUZGP.js.map} +1 -1
  7. package/dist/{chunk-Y6ZXHHUS.js → chunk-3W7FXRO5.js} +3 -3
  8. package/dist/{chunk-Y6ZXHHUS.js.map → chunk-3W7FXRO5.js.map} +1 -1
  9. package/dist/{chunk-2TAFX4RZ.js → chunk-7GCTZEMK.js} +3 -3
  10. package/dist/{chunk-2TAFX4RZ.js.map → chunk-7GCTZEMK.js.map} +1 -1
  11. package/dist/{chunk-6TBA37U7.js → chunk-7TF5PVEU.js} +6 -6
  12. package/dist/chunk-7TF5PVEU.js.map +1 -0
  13. package/dist/{chunk-HANDVWJA.js → chunk-BS5XDYOE.js} +3 -3
  14. package/dist/{chunk-HANDVWJA.js.map → chunk-BS5XDYOE.js.map} +1 -1
  15. package/dist/{chunk-DQ43X75Q.js → chunk-EYSTEGV5.js} +4 -4
  16. package/dist/{chunk-DQ43X75Q.js.map → chunk-EYSTEGV5.js.map} +1 -1
  17. package/dist/{chunk-7SPMPMXE.js → chunk-GGUWEAYD.js} +3 -3
  18. package/dist/{chunk-7SPMPMXE.js.map → chunk-GGUWEAYD.js.map} +1 -1
  19. package/dist/{chunk-RRORYKXT.js → chunk-LLI3JFJL.js} +4 -4
  20. package/dist/{chunk-RRORYKXT.js.map → chunk-LLI3JFJL.js.map} +1 -1
  21. package/dist/{chunk-RN4WIA4D.js → chunk-OBRJXVWO.js} +3 -3
  22. package/dist/{chunk-RN4WIA4D.js.map → chunk-OBRJXVWO.js.map} +1 -1
  23. package/dist/{chunk-36LMNJKG.js → chunk-P27ERD6W.js} +4 -4
  24. package/dist/{chunk-36LMNJKG.js.map → chunk-P27ERD6W.js.map} +1 -1
  25. package/dist/{chunk-FBFP6LWC.js → chunk-P7D6S6GX.js} +3 -3
  26. package/dist/{chunk-FBFP6LWC.js.map → chunk-P7D6S6GX.js.map} +1 -1
  27. package/dist/{chunk-K3QIPEIV.js → chunk-R3HUGCGR.js} +3 -3
  28. package/dist/{chunk-K3QIPEIV.js.map → chunk-R3HUGCGR.js.map} +1 -1
  29. package/dist/{chunk-42RY5GAT.js → chunk-SUU3HNOX.js} +3 -3
  30. package/dist/{chunk-42RY5GAT.js.map → chunk-SUU3HNOX.js.map} +1 -1
  31. package/dist/{chunk-WDPGJHLV.js → chunk-SXPBKGLT.js} +3 -3
  32. package/dist/{chunk-WDPGJHLV.js.map → chunk-SXPBKGLT.js.map} +1 -1
  33. package/dist/{chunk-VNAC3RM2.js → chunk-T6XRYT6Q.js} +3 -3
  34. package/dist/{chunk-VNAC3RM2.js.map → chunk-T6XRYT6Q.js.map} +1 -1
  35. package/dist/{chunk-R52QIEJZ.js → chunk-UYC7M3FM.js} +3 -3
  36. package/dist/{chunk-R52QIEJZ.js.map → chunk-UYC7M3FM.js.map} +1 -1
  37. package/dist/{chunk-KO3R4JFH.js → chunk-VLDAHAG6.js} +3 -3
  38. package/dist/{chunk-KO3R4JFH.js.map → chunk-VLDAHAG6.js.map} +1 -1
  39. package/dist/{chunk-OWLYSN7L.js → chunk-W7S7GPU5.js} +3 -3
  40. package/dist/{chunk-OWLYSN7L.js.map → chunk-W7S7GPU5.js.map} +1 -1
  41. package/dist/{chunk-Z2RO42XL.js → chunk-WXBC3D2N.js} +4 -4
  42. package/dist/{chunk-Z2RO42XL.js.map → chunk-WXBC3D2N.js.map} +1 -1
  43. package/dist/{chunk-DCUFQJYP.js → chunk-Y4RKKQMB.js} +14 -5
  44. package/dist/chunk-Y4RKKQMB.js.map +1 -0
  45. package/dist/{chunk-ZUNG2RTQ.js → chunk-YUHPTV2A.js} +3 -3
  46. package/dist/{chunk-ZUNG2RTQ.js.map → chunk-YUHPTV2A.js.map} +1 -1
  47. package/dist/{chunk-Z46KLLW2.js → chunk-ZP4HYVDG.js} +3 -3
  48. package/dist/{chunk-Z46KLLW2.js.map → chunk-ZP4HYVDG.js.map} +1 -1
  49. package/dist/components/advanced/Calendar/index.js +2 -2
  50. package/dist/components/advanced/EventCalendar/index.js +2 -2
  51. package/dist/components/advanced/FilterBuilder/index.js +2 -2
  52. package/dist/components/advanced/index.js +8 -8
  53. package/dist/components/data-display/Carousel/index.js +2 -2
  54. package/dist/components/data-display/DashboardFilterbar/index.js +3 -3
  55. package/dist/components/data-display/DataTable/FilterBuilder/index.js +2 -2
  56. package/dist/components/data-display/DataTable/index.js +3 -3
  57. package/dist/components/data-display/ImageGallery/index.js +3 -3
  58. package/dist/components/data-display/index.js +16 -16
  59. package/dist/components/feedback/AlertDialog/index.js +2 -2
  60. package/dist/components/feedback/ConfirmModal/index.js +3 -3
  61. package/dist/components/feedback/index.js +5 -5
  62. package/dist/components/forms/DatePicker/index.js +3 -3
  63. package/dist/components/forms/DateRangePicker/index.js +3 -3
  64. package/dist/components/forms/InputGroup/index.js +2 -2
  65. package/dist/components/forms/index.js +12 -12
  66. package/dist/components/index.js +59 -59
  67. package/dist/components/layout/index.js +2 -2
  68. package/dist/components/navigation/MobileSidebar/index.js +1 -1
  69. package/dist/components/navigation/Pagination/index.js +2 -2
  70. package/dist/components/navigation/Sidebar/index.js +2 -2
  71. package/dist/components/navigation/index.js +6 -6
  72. package/dist/components/primitives/Button/index.js +1 -1
  73. package/dist/components/primitives/ConfirmButton/index.js +3 -3
  74. package/dist/components/primitives/Tag/index.js +1 -1
  75. package/dist/components/primitives/index.js +9 -9
  76. package/dist/components/workflow/ApprovalFlow/index.js +2 -2
  77. package/dist/components/workflow/CommentSystem/index.js +2 -2
  78. package/dist/components/workflow/Dashboard/index.js +2 -2
  79. package/dist/components/workflow/DashboardBuilder/index.js +2 -2
  80. package/dist/components/workflow/KanbanBoard/index.js +2 -2
  81. package/dist/components/workflow/ReportGenerator/index.js +2 -2
  82. package/dist/components/workflow/Wizard/index.js +2 -2
  83. package/dist/components/workflow/index.js +9 -9
  84. package/dist/index.d.ts +5 -2
  85. package/dist/index.js +59 -59
  86. package/dist/styles.css +151 -121
  87. package/package.json +2 -2
  88. package/dist/chunk-6TBA37U7.js.map +0 -1
  89. package/dist/chunk-DCUFQJYP.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-6TBA37U7.js';
1
+ import { Button } from './chunk-7TF5PVEU.js';
2
2
  import { cn } from './chunk-HRNDJU7D.js';
3
3
  import useEmblaCarousel from 'embla-carousel-react';
4
4
  import { ArrowLeft, ArrowRight } from 'lucide-react';
@@ -293,5 +293,5 @@ function CarouselNext({
293
293
  }
294
294
 
295
295
  export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious };
296
- //# sourceMappingURL=chunk-7B577M5O.js.map
297
- //# sourceMappingURL=chunk-7B577M5O.js.map
296
+ //# sourceMappingURL=chunk-2YSZPUQZ.js.map
297
+ //# sourceMappingURL=chunk-2YSZPUQZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/data-display/Carousel/Carousel.variants.ts","../src/components/data-display/Carousel/Carousel.tsx"],"names":["api"],"mappings":"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","file":"chunk-7B577M5O.js","sourcesContent":["// Carousel/Carousel.variants.ts\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * Carousel root container style variants using CVA\n *\n * @see https://cva.style/docs\n */\nexport const carouselVariants = cva(\n // Base styles (always applied)\n \"relative\",\n {\n variants: {\n orientation: {\n horizontal: \"\",\n vertical: \"\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\n/**\n * Carousel content container style variants\n */\nexport const carouselContentVariants = cva(\n // Base styles (always applied)\n \"flex\",\n {\n variants: {\n orientation: {\n horizontal: \"-ml-[var(--carousel-item-gap-default)]\",\n vertical: \"-mt-[var(--carousel-item-gap-default)] flex-col\",\n },\n gap: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n { gap: \"sm\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-lg)]\" },\n { gap: \"sm\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-lg)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n gap: \"default\",\n },\n }\n)\n\n/**\n * Carousel item style variants\n */\nexport const carouselItemVariants = cva(\n // Base styles (always applied)\n \"min-w-0 shrink-0 grow-0 basis-full\",\n {\n variants: {\n orientation: {\n horizontal: \"pl-[var(--carousel-item-gap-default)]\",\n vertical: \"pt-[var(--carousel-item-gap-default)]\",\n },\n gap: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n { gap: \"sm\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-lg)]\" },\n { gap: \"sm\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-lg)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n gap: \"default\",\n },\n }\n)\n\n/**\n * Carousel navigation button style variants\n */\nexport const carouselButtonVariants = cva(\n // Base styles (always applied)\n \"absolute size-[var(--carousel-button-size)] rounded-full\",\n {\n variants: {\n orientation: {\n horizontal: \"top-1/2 -translate-y-1/2\",\n vertical: \"left-1/2 -translate-x-1/2 rotate-90\",\n },\n direction: {\n prev: \"\",\n next: \"\",\n },\n },\n compoundVariants: [\n { direction: \"prev\", orientation: \"horizontal\", class: \"-left-[var(--carousel-button-offset)]\" },\n { direction: \"next\", orientation: \"horizontal\", class: \"-right-[var(--carousel-button-offset)]\" },\n { direction: \"prev\", orientation: \"vertical\", class: \"-top-[var(--carousel-button-offset)]\" },\n { direction: \"next\", orientation: \"vertical\", class: \"-bottom-[var(--carousel-button-offset)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n direction: \"prev\",\n },\n }\n)\n\n// Export variant prop types\nexport type CarouselVariantProps = VariantProps<typeof carouselVariants>\nexport type CarouselContentVariantProps = VariantProps<typeof carouselContentVariants>\nexport type CarouselItemVariantProps = VariantProps<typeof carouselItemVariants>\nexport type CarouselButtonVariantProps = VariantProps<typeof carouselButtonVariants>\n","import useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n carouselButtonVariants,\n carouselContentVariants,\n carouselItemVariants,\n} from \"./Carousel.variants\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ninterface CarouselProps {\n opts?: CarouselOptions\n orientation?: \"horizontal\" | \"vertical\"\n plugins?: CarouselPlugin\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n api: ReturnType<typeof useEmblaCarousel>[1]\n canScrollNext: boolean\n canScrollPrev: boolean\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n scrollNext: () => void\n scrollPrev: () => void\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.use(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n // Update scroll state based on carousel position - state derived from carousel events\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Callback invoked by useEffect, not direct call\n setCanScrollPrev(api.canScrollPrev())\n // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Callback invoked by useEffect, not direct call\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api) return\n if (setApi) {\n // eslint-disable-next-line react-you-might-not-need-an-effect/no-pass-data-to-parent -- Required by embla-carousel API pattern\n setApi(api)\n }\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext\n value={{\n carouselRef,\n api: api,\n opts,\n orientation,\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n aria-roledescription=\"carousel\"\n className={cn(\"relative\", className)}\n data-orientation={orientation}\n data-slot=\"carousel\"\n role=\"region\"\n onKeyDownCapture={handleKeyDown}\n {...props}\n >\n {children}\n </div>\n </CarouselContext>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n carouselContentVariants({ orientation }),\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n className={cn(\n carouselItemVariants({ orientation }),\n className\n )}\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n role=\"group\"\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n className={cn(\n carouselButtonVariants({ orientation, direction: \"prev\" }),\n className\n )}\n aria-label=\"Previous slide\"\n data-slot=\"carousel-previous\"\n disabled={!canScrollPrev}\n size={size}\n variant={variant}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n className={cn(\n carouselButtonVariants({ orientation, direction: \"next\" }),\n className\n )}\n aria-label=\"Next slide\"\n data-slot=\"carousel-next\"\n disabled={!canScrollNext}\n size={size}\n variant={variant}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n Carousel,\n type CarouselApi,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n}\n"]}
1
+ {"version":3,"sources":["../src/components/data-display/Carousel/Carousel.variants.ts","../src/components/data-display/Carousel/Carousel.tsx"],"names":["api"],"mappings":"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","file":"chunk-2YSZPUQZ.js","sourcesContent":["// Carousel/Carousel.variants.ts\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * Carousel root container style variants using CVA\n *\n * @see https://cva.style/docs\n */\nexport const carouselVariants = cva(\n // Base styles (always applied)\n \"relative\",\n {\n variants: {\n orientation: {\n horizontal: \"\",\n vertical: \"\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\n/**\n * Carousel content container style variants\n */\nexport const carouselContentVariants = cva(\n // Base styles (always applied)\n \"flex\",\n {\n variants: {\n orientation: {\n horizontal: \"-ml-[var(--carousel-item-gap-default)]\",\n vertical: \"-mt-[var(--carousel-item-gap-default)] flex-col\",\n },\n gap: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n { gap: \"sm\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"horizontal\", class: \"-ml-[var(--carousel-item-gap-lg)]\" },\n { gap: \"sm\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"vertical\", class: \"-mt-[var(--carousel-item-gap-lg)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n gap: \"default\",\n },\n }\n)\n\n/**\n * Carousel item style variants\n */\nexport const carouselItemVariants = cva(\n // Base styles (always applied)\n \"min-w-0 shrink-0 grow-0 basis-full\",\n {\n variants: {\n orientation: {\n horizontal: \"pl-[var(--carousel-item-gap-default)]\",\n vertical: \"pt-[var(--carousel-item-gap-default)]\",\n },\n gap: {\n sm: \"\",\n default: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n { gap: \"sm\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"horizontal\", class: \"pl-[var(--carousel-item-gap-lg)]\" },\n { gap: \"sm\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-sm)]\" },\n { gap: \"default\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-default)]\" },\n { gap: \"lg\", orientation: \"vertical\", class: \"pt-[var(--carousel-item-gap-lg)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n gap: \"default\",\n },\n }\n)\n\n/**\n * Carousel navigation button style variants\n */\nexport const carouselButtonVariants = cva(\n // Base styles (always applied)\n \"absolute size-[var(--carousel-button-size)] rounded-full\",\n {\n variants: {\n orientation: {\n horizontal: \"top-1/2 -translate-y-1/2\",\n vertical: \"left-1/2 -translate-x-1/2 rotate-90\",\n },\n direction: {\n prev: \"\",\n next: \"\",\n },\n },\n compoundVariants: [\n { direction: \"prev\", orientation: \"horizontal\", class: \"-left-[var(--carousel-button-offset)]\" },\n { direction: \"next\", orientation: \"horizontal\", class: \"-right-[var(--carousel-button-offset)]\" },\n { direction: \"prev\", orientation: \"vertical\", class: \"-top-[var(--carousel-button-offset)]\" },\n { direction: \"next\", orientation: \"vertical\", class: \"-bottom-[var(--carousel-button-offset)]\" },\n ],\n defaultVariants: {\n orientation: \"horizontal\",\n direction: \"prev\",\n },\n }\n)\n\n// Export variant prop types\nexport type CarouselVariantProps = VariantProps<typeof carouselVariants>\nexport type CarouselContentVariantProps = VariantProps<typeof carouselContentVariants>\nexport type CarouselItemVariantProps = VariantProps<typeof carouselItemVariants>\nexport type CarouselButtonVariantProps = VariantProps<typeof carouselButtonVariants>\n","import useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n carouselButtonVariants,\n carouselContentVariants,\n carouselItemVariants,\n} from \"./Carousel.variants\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ninterface CarouselProps {\n opts?: CarouselOptions\n orientation?: \"horizontal\" | \"vertical\"\n plugins?: CarouselPlugin\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n api: ReturnType<typeof useEmblaCarousel>[1]\n canScrollNext: boolean\n canScrollPrev: boolean\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n scrollNext: () => void\n scrollPrev: () => void\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.use(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n // Update scroll state based on carousel position - state derived from carousel events\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Callback invoked by useEffect, not direct call\n setCanScrollPrev(api.canScrollPrev())\n // eslint-disable-next-line @eslint-react/hooks-extra/no-direct-set-state-in-use-effect -- Callback invoked by useEffect, not direct call\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api) return\n if (setApi) {\n // eslint-disable-next-line react-you-might-not-need-an-effect/no-pass-data-to-parent -- Required by embla-carousel API pattern\n setApi(api)\n }\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext\n value={{\n carouselRef,\n api: api,\n opts,\n orientation,\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n aria-roledescription=\"carousel\"\n className={cn(\"relative\", className)}\n data-orientation={orientation}\n data-slot=\"carousel\"\n role=\"region\"\n onKeyDownCapture={handleKeyDown}\n {...props}\n >\n {children}\n </div>\n </CarouselContext>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n carouselContentVariants({ orientation }),\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n className={cn(\n carouselItemVariants({ orientation }),\n className\n )}\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n role=\"group\"\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n className={cn(\n carouselButtonVariants({ orientation, direction: \"prev\" }),\n className\n )}\n aria-label=\"Previous slide\"\n data-slot=\"carousel-previous\"\n disabled={!canScrollPrev}\n size={size}\n variant={variant}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n className={cn(\n carouselButtonVariants({ orientation, direction: \"next\" }),\n className\n )}\n aria-label=\"Next slide\"\n data-slot=\"carousel-next\"\n disabled={!canScrollNext}\n size={size}\n variant={variant}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n Carousel,\n type CarouselApi,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Lightbox } from './chunk-2FJJOHHH.js';
2
- import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from './chunk-7B577M5O.js';
2
+ import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from './chunk-2YSZPUQZ.js';
3
3
  import { AspectRatio } from './chunk-45D4O7RK.js';
4
4
  import { cn } from './chunk-HRNDJU7D.js';
5
5
  import { cva } from 'class-variance-authority';
@@ -593,5 +593,5 @@ function ImageGallery({
593
593
  }
594
594
 
595
595
  export { ImageGallery, ImageGalleryItem };
596
- //# sourceMappingURL=chunk-IHW6IJE5.js.map
597
- //# sourceMappingURL=chunk-IHW6IJE5.js.map
596
+ //# sourceMappingURL=chunk-3NLWCX2F.js.map
597
+ //# sourceMappingURL=chunk-3NLWCX2F.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/data-display/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":"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","file":"chunk-IHW6IJE5.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-3NLWCX2F.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,5 +1,5 @@
1
1
  import { Avatar, AvatarImage, AvatarFallback } from './chunk-3BBOSSDG.js';
2
- import { Button } from './chunk-6TBA37U7.js';
2
+ import { Button } from './chunk-7TF5PVEU.js';
3
3
  import { cn } from './chunk-HRNDJU7D.js';
4
4
  import { Check, X, User, TrendingUp, ChevronRight, Forward, Clock } from 'lucide-react';
5
5
  import { useId, useState } from 'react';
@@ -540,5 +540,5 @@ function ApprovalFlow({
540
540
  }
541
541
 
542
542
  export { ApprovalFlow, ApprovalFlowConnector, ApprovalFlowMarker, ApprovalFlowStep, approvalFlowActionsVariants, approvalFlowConnectorVariants, approvalFlowMarkerVariants, approvalFlowStepCardVariants, approvalFlowStepVariants, approvalFlowVariants };
543
- //# sourceMappingURL=chunk-WOOBWQHY.js.map
544
- //# sourceMappingURL=chunk-WOOBWQHY.js.map
543
+ //# sourceMappingURL=chunk-3NSIUZGP.js.map
544
+ //# sourceMappingURL=chunk-3NSIUZGP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/workflow/ApprovalFlow/ApprovalFlow.variants.ts","../src/components/workflow/ApprovalFlow/ApprovalFlow.tsx"],"names":[],"mappings":"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","file":"chunk-WOOBWQHY.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * ApprovalFlow container variants\n */\nexport const approvalFlowVariants = cva(\n \"relative rounded-lg border bg-card p-6 transition-all duration-300\",\n {\n variants: {\n variant: {\n linear: \"\",\n parallel: \"\",\n conditional: \"\",\n hybrid: \"\",\n },\n layout: {\n horizontal: \"flex flex-row gap-4 overflow-x-auto\",\n vertical: \"flex flex-col gap-4\",\n compact: \"flex flex-col gap-2 p-4\",\n },\n },\n defaultVariants: {\n variant: \"linear\",\n layout: \"horizontal\",\n },\n }\n)\n\n/**\n * ApprovalFlow step variants\n */\nexport const approvalFlowStepVariants = cva(\n \"relative flex transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n layout: {\n horizontal: \"flex-col items-center gap-2 min-w-40\",\n vertical: \"flex-row gap-4\",\n compact: \"flex-row gap-3\",\n },\n status: {\n pending: \"\",\n in_progress: \"\",\n awaiting: \"\",\n approved: \"\",\n rejected: \"\",\n escalated: \"\",\n skipped: \"opacity-50\",\n },\n },\n defaultVariants: {\n layout: \"horizontal\",\n status: \"pending\",\n },\n }\n)\n\n/**\n * Step marker/indicator variants based on status\n */\nexport const approvalFlowMarkerVariants = cva(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-all duration-300\",\n {\n variants: {\n status: {\n pending: \"border-muted-foreground/50 bg-muted text-muted-foreground\",\n in_progress:\n \"border-primary bg-primary text-primary-foreground animate-pulse\",\n awaiting: \"border-warning bg-warning text-warning-foreground\",\n approved: \"border-success bg-success text-success-foreground\",\n rejected: \"border-destructive bg-destructive text-destructive-foreground\",\n escalated: \"border-warning bg-warning text-warning-foreground\",\n skipped: \"border-muted-foreground/30 bg-muted/50 text-muted-foreground/50\",\n },\n size: {\n sm: \"h-8 w-8 text-xs\",\n default: \"h-10 w-10 text-sm\",\n lg: \"h-12 w-12 text-base\",\n },\n },\n defaultVariants: {\n status: \"pending\",\n size: \"default\",\n },\n }\n)\n\n/**\n * Connector line variants between steps\n */\nexport const approvalFlowConnectorVariants = cva(\n \"transition-colors duration-300\",\n {\n variants: {\n layout: {\n horizontal: \"h-0.5 flex-1 min-w-10\",\n vertical: \"w-0.5 min-h-10 ml-5\",\n compact: \"w-0.5 min-h-6 ml-4\",\n },\n status: {\n pending: \"bg-muted-foreground/30\",\n in_progress: \"bg-primary/50\",\n awaiting: \"bg-warning/50\",\n approved: \"bg-success\",\n rejected: \"bg-destructive/50\",\n escalated: \"bg-warning/50\",\n skipped: \"bg-muted-foreground/20\",\n },\n style: {\n solid: \"\",\n dashed: \"border-dashed border-2 bg-transparent\",\n },\n },\n compoundVariants: [\n {\n layout: \"horizontal\",\n style: \"dashed\",\n className: \"border-l-0 border-r-0 border-t-2 border-b-0 h-0\",\n },\n {\n layout: \"vertical\",\n style: \"dashed\",\n className: \"border-t-0 border-b-0 border-l-2 border-r-0 w-0\",\n },\n {\n layout: \"compact\",\n style: \"dashed\",\n className: \"border-t-0 border-b-0 border-l-2 border-r-0 w-0\",\n },\n ],\n defaultVariants: {\n layout: \"horizontal\",\n status: \"pending\",\n style: \"solid\",\n },\n }\n)\n\n/**\n * Step card variants\n */\nexport const approvalFlowStepCardVariants = cva(\n \"rounded-md border bg-background p-4 transition-all duration-200\",\n {\n variants: {\n status: {\n pending: \"border-muted\",\n in_progress: \"border-primary shadow-sm ring-1 ring-primary/20\",\n awaiting: \"border-warning shadow-sm\",\n approved: \"border-success/50 bg-success/5\",\n rejected: \"border-destructive/50 bg-destructive/5\",\n escalated: \"border-warning/50 bg-warning/5\",\n skipped: \"border-muted/50 bg-muted/10\",\n },\n layout: {\n horizontal: \"w-full max-w-52\",\n vertical: \"flex-1\",\n compact: \"flex-1 py-2\",\n },\n },\n defaultVariants: {\n status: \"pending\",\n layout: \"horizontal\",\n },\n }\n)\n\n/**\n * Action button group variants\n */\nexport const approvalFlowActionsVariants = cva(\n \"flex gap-2 transition-opacity duration-200\",\n {\n variants: {\n layout: {\n horizontal: \"flex-wrap justify-center mt-2\",\n vertical: \"flex-wrap\",\n compact: \"flex-wrap\",\n },\n visible: {\n true: \"opacity-100\",\n false: \"opacity-0 pointer-events-none\",\n },\n },\n defaultVariants: {\n layout: \"horizontal\",\n visible: true,\n },\n }\n)\n\nexport type ApprovalFlowVariantProps = VariantProps<typeof approvalFlowVariants>\nexport type ApprovalFlowStepVariantProps = VariantProps<\n typeof approvalFlowStepVariants\n>\nexport type ApprovalFlowMarkerVariantProps = VariantProps<\n typeof approvalFlowMarkerVariants\n>\nexport type ApprovalFlowConnectorVariantProps = VariantProps<\n typeof approvalFlowConnectorVariants\n>\nexport type ApprovalFlowStepCardVariantProps = VariantProps<\n typeof approvalFlowStepCardVariants\n>\nexport type ApprovalFlowActionsVariantProps = VariantProps<\n typeof approvalFlowActionsVariants\n>\n","import type {\n ApprovalFlowProps,\n ApprovalFlowStepProps,\n ApprovalStep,\n ApprovalStepStatus,\n Approver,\n} from \"./ApprovalFlow.types\"\nimport type { KeyboardEvent, ReactNode } from \"react\"\n\nimport {\n Check,\n ChevronRight,\n Clock,\n Forward,\n TrendingUp,\n User,\n X,\n} from \"lucide-react\"\nimport { useId, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n approvalFlowActionsVariants,\n approvalFlowConnectorVariants,\n approvalFlowMarkerVariants,\n approvalFlowStepCardVariants,\n approvalFlowStepVariants,\n approvalFlowVariants,\n} from \"./ApprovalFlow.variants\"\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Get icon for status\n */\nfunction getStatusIcon(status: ApprovalStepStatus): ReactNode {\n switch (status) {\n case \"approved\":\n return <Check className=\"h-4 w-4\" />\n case \"rejected\":\n return <X className=\"h-4 w-4\" />\n case \"in_progress\":\n case \"awaiting\":\n return <Clock className=\"h-4 w-4\" />\n case \"escalated\":\n return <TrendingUp className=\"h-4 w-4\" />\n case \"skipped\":\n return <Forward className=\"h-4 w-4\" />\n default:\n return null\n }\n}\n\n/**\n * Get accessible status label\n */\nfunction getStatusLabel(status: ApprovalStepStatus): string {\n const labels: Record<ApprovalStepStatus, string> = {\n pending: \"Pending\",\n in_progress: \"In progress\",\n awaiting: \"Awaiting approval\",\n approved: \"Approved\",\n rejected: \"Rejected\",\n escalated: \"Escalated\",\n skipped: \"Skipped\",\n }\n return labels[status]\n}\n\n/**\n * ApprovalFlowMarker component renders the status indicator\n */\nfunction ApprovalFlowMarker({\n index,\n status = \"pending\",\n}: {\n index: number\n status?: ApprovalStepStatus\n}) {\n const icon = getStatusIcon(status)\n\n return (\n <div\n aria-hidden=\"true\"\n className={approvalFlowMarkerVariants({ status })}\n data-slot=\"approval-flow-marker\"\n data-status={status}\n >\n {icon ?? (\n <span className=\"font-medium\">{index + 1}</span>\n )}\n </div>\n )\n}\n\n/**\n * ApprovalFlowConnector component renders the line between steps\n */\nfunction ApprovalFlowConnector({\n layout = \"horizontal\",\n status = \"pending\",\n isConditional = false,\n}: {\n isConditional?: boolean\n layout?: \"compact\" | \"horizontal\" | \"vertical\"\n status?: ApprovalStepStatus\n}) {\n return (\n <div\n className={approvalFlowConnectorVariants({\n layout,\n status,\n style: isConditional ? \"dashed\" : \"solid\",\n })}\n aria-hidden=\"true\"\n data-slot=\"approval-flow-connector\"\n />\n )\n}\n\n/**\n * ApproverAvatar component renders an approver's avatar\n */\nfunction ApproverAvatar({ approver }: { approver: Approver }) {\n return (\n <div className=\"flex items-center gap-2\" title={`${approver.name} (${approver.role})`}>\n <Avatar size=\"sm\">\n {approver.avatar ? (\n <AvatarImage alt={approver.name} src={approver.avatar} />\n ) : null}\n <AvatarFallback>{getInitials(approver.name)}</AvatarFallback>\n </Avatar>\n </div>\n )\n}\n\n/**\n * ApprovalFlowStepContent renders the content of a step\n */\nfunction ApprovalFlowStepContent({\n step,\n layout = \"horizontal\",\n}: {\n layout?: \"compact\" | \"horizontal\" | \"vertical\"\n step: ApprovalStep\n}) {\n const showApproversCount = step.approvers.length > 3\n const visibleApprovers = showApproversCount\n ? step.approvers.slice(0, 3)\n : step.approvers\n\n return (\n <div\n className={approvalFlowStepCardVariants({ status: step.status, layout })}\n data-slot=\"approval-flow-step-card\"\n >\n <div className=\"space-y-2\">\n <div data-slot=\"approval-flow-step-title\">\n <span className=\"text-sm font-medium text-foreground\">\n {step.title}\n </span>\n </div>\n\n {step.description && (\n <div data-slot=\"approval-flow-step-description\">\n <span className=\"text-xs text-muted-foreground\">\n {step.description}\n </span>\n </div>\n )}\n\n {step.approvers.length > 0 && (\n <div\n className=\"flex items-center gap-1\"\n data-slot=\"approval-flow-step-approvers\"\n >\n <div className=\"flex -space-x-2\">\n {visibleApprovers.map((approver) => (\n <ApproverAvatar key={approver.id} approver={approver} />\n ))}\n </div>\n {showApproversCount && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n +{step.approvers.length - 3} more\n </span>\n )}\n </div>\n )}\n\n {step.requiredApprovals && step.requiredApprovals > 1 && (\n <div\n className=\"text-xs text-muted-foreground\"\n data-slot=\"approval-flow-step-required\"\n >\n Requires {step.requiredApprovals} of {step.approvers.length} approvals\n </div>\n )}\n\n {step.deadline && (\n <div\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n data-slot=\"approval-flow-step-deadline\"\n >\n <Clock className=\"h-3 w-3\" />\n <span>Due: {step.deadline.toLocaleDateString()}</span>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * ApprovalFlowStep component renders a single approval step\n */\nfunction ApprovalFlowStep({\n step,\n index,\n isCurrent,\n isLast,\n showConnector = true,\n layout = \"horizontal\",\n readOnly = false,\n allowDelegation = true,\n allowEscalation = true,\n onApprove,\n onReject,\n onDelegate,\n onEscalate,\n className,\n ...props\n}: ApprovalFlowStepProps) {\n const stepId = useId()\n const statusLabel = getStatusLabel(step.status)\n // Normalize null to undefined for layout\n const normalizedLayout = layout ?? \"horizontal\"\n const canAct =\n isCurrent &&\n !readOnly &&\n (step.status === \"in_progress\" || step.status === \"awaiting\")\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n const parent = target.parentElement\n if (!parent) return\n\n const siblings = [\n ...parent.querySelectorAll('[data-slot=\"approval-flow-step\"]'),\n ] as HTMLDivElement[]\n const currentIndex = siblings.indexOf(target)\n\n let nextIndex = -1\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n event.preventDefault()\n nextIndex = Math.min(currentIndex + 1, siblings.length - 1)\n break\n case \"ArrowUp\":\n case \"ArrowLeft\":\n event.preventDefault()\n nextIndex = Math.max(currentIndex - 1, 0)\n break\n default:\n return\n }\n\n const nextElement = siblings[nextIndex]\n if (nextIndex !== -1 && nextElement) {\n nextElement.focus()\n }\n }\n\n return (\n <div\n className={cn(\n approvalFlowStepVariants({ layout: normalizedLayout, status: step.status }),\n className\n )}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-describedby={`${stepId}-description`}\n aria-label={`${step.title} - ${statusLabel}`}\n data-active={isCurrent ? \"\" : undefined}\n data-slot=\"approval-flow-step\"\n data-status={step.status}\n role=\"listitem\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {/* Marker and Connector for vertical/compact layouts */}\n {(normalizedLayout === \"vertical\" || normalizedLayout === \"compact\") && (\n <div className=\"relative flex flex-col items-center\">\n <ApprovalFlowMarker index={index} status={step.status} />\n {showConnector && !isLast && (\n <ApprovalFlowConnector layout={normalizedLayout} status={step.status} />\n )}\n </div>\n )}\n\n {/* Main content wrapper */}\n <div className=\"flex flex-1 flex-col gap-2\">\n {/* Marker for horizontal layout */}\n {normalizedLayout === \"horizontal\" && (\n <div className=\"flex items-center justify-center\">\n <ApprovalFlowMarker index={index} status={step.status} />\n </div>\n )}\n\n {/* Step content */}\n <ApprovalFlowStepContent layout={normalizedLayout} step={step} />\n\n {/* Actions */}\n <div\n className={approvalFlowActionsVariants({\n layout: normalizedLayout,\n visible: canAct,\n })}\n data-slot=\"approval-flow-step-actions\"\n id={`${stepId}-description`}\n >\n {canAct && (\n <>\n <Button\n aria-label={`Approve ${step.title}`}\n size=\"sm\"\n variant=\"default\"\n onClick={onApprove}\n >\n <Check className=\"h-4 w-4\" />\n Approve\n </Button>\n <Button\n aria-label={`Reject ${step.title}`}\n size=\"sm\"\n variant=\"destructive\"\n onClick={onReject}\n >\n <X className=\"h-4 w-4\" />\n Reject\n </Button>\n {allowDelegation && (\n <Button\n aria-label={`Delegate ${step.title}`}\n size=\"sm\"\n variant=\"outline\"\n onClick={onDelegate}\n >\n <User className=\"h-4 w-4\" />\n Delegate\n </Button>\n )}\n {allowEscalation && (\n <Button\n aria-label={`Escalate ${step.title}`}\n size=\"sm\"\n variant=\"outline\"\n onClick={onEscalate}\n >\n <TrendingUp className=\"h-4 w-4\" />\n Escalate\n </Button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Connector for horizontal layout */}\n {normalizedLayout === \"horizontal\" && showConnector && !isLast && (\n <div className=\"flex items-center self-start mt-5\">\n <ApprovalFlowConnector layout={normalizedLayout} status={step.status} />\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * ApprovalFlow component displays and manages an approval workflow.\n *\n * @example\n * ```tsx\n * const steps = [\n * { id: \"1\", title: \"Request\", status: \"approved\", approvers: [] },\n * { id: \"2\", title: \"Manager\", status: \"in_progress\", approvers: [{ id: \"1\", name: \"John\", email: \"john@example.com\", role: \"Manager\" }] },\n * { id: \"3\", title: \"Director\", status: \"pending\", approvers: [] },\n * ]\n *\n * <ApprovalFlow\n * steps={steps}\n * currentStep={1}\n * onApprove={({ stepId }) => console.log(\"Approved:\", stepId)}\n * onReject={({ stepId, reason }) => console.log(\"Rejected:\", stepId, reason)}\n * />\n * ```\n */\nfunction ApprovalFlow({\n \"aria-label\": ariaLabel = \"Approval workflow\",\n className,\n steps,\n currentStep = 0,\n variant = \"linear\",\n layout = \"horizontal\",\n allowDelegation = true,\n allowEscalation = true,\n showTimeline: _showTimeline = true,\n showComments: _showComments = true,\n readOnly = false,\n history: _history,\n onApprove,\n onReject,\n onDelegate,\n onEscalate,\n onStepChange: _onStepChange,\n onComplete: _onComplete,\n ...props\n}: ApprovalFlowProps) {\n const [_activeStepIndex, setActiveStepIndex] = useState(currentStep)\n\n // Determine effective layout based on screen size\n // On mobile, force vertical layout\n const effectiveLayout = layout\n\n const handleApprove = (stepId: string) => {\n onApprove?.({ stepId })\n }\n\n const handleReject = (stepId: string) => {\n // In a real implementation, this would open a dialog for the reason\n onReject?.({ stepId, reason: \"\" })\n }\n\n const handleDelegate = (stepId: string) => {\n // In a real implementation, this would open a dialog to select delegate\n onDelegate?.({\n stepId,\n delegateTo: { id: \"\", name: \"\", email: \"\", role: \"\" },\n })\n }\n\n const handleEscalate = (stepId: string) => {\n // In a real implementation, this would open a dialog to select escalation target\n onEscalate?.({\n stepId,\n escalateTo: { id: \"\", name: \"\", email: \"\", role: \"\" },\n })\n }\n\n // Handle keyboard navigation between steps\n const handleStepFocus = (index: number) => {\n setActiveStepIndex(index)\n }\n\n const hasSteps = steps.length > 0\n\n return (\n <div\n aria-label={ariaLabel}\n className={cn(approvalFlowVariants({ variant, layout: effectiveLayout }), className)}\n data-slot=\"approval-flow\"\n data-variant={variant}\n role=\"list\"\n {...props}\n >\n {hasSteps\n ? steps.map((step, index) => (\n <ApprovalFlowStep\n key={step.id}\n allowDelegation={allowDelegation}\n allowEscalation={allowEscalation}\n index={index}\n isCurrent={index === currentStep}\n isLast={index === steps.length - 1}\n layout={effectiveLayout}\n readOnly={readOnly}\n showConnector={variant !== \"conditional\"}\n step={step}\n onApprove={() => { handleApprove(step.id); }}\n onDelegate={() => { handleDelegate(step.id); }}\n onEscalate={() => { handleEscalate(step.id); }}\n onFocus={() => { handleStepFocus(index); }}\n onReject={() => { handleReject(step.id); }}\n />\n ))\n : null}\n </div>\n )\n}\n\nexport {\n ApprovalFlow,\n approvalFlowActionsVariants,\n ApprovalFlowConnector,\n approvalFlowConnectorVariants,\n ApprovalFlowMarker,\n approvalFlowMarkerVariants,\n ApprovalFlowStep,\n approvalFlowStepCardVariants,\n approvalFlowStepVariants,\n approvalFlowVariants,\n}\nexport type {\n ApprovalFlowProps,\n ApprovalFlowStepProps,\n ApprovalStep,\n ApprovalStepStatus,\n}\n"]}
1
+ {"version":3,"sources":["../src/components/workflow/ApprovalFlow/ApprovalFlow.variants.ts","../src/components/workflow/ApprovalFlow/ApprovalFlow.tsx"],"names":[],"mappings":"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","file":"chunk-3NSIUZGP.js","sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\"\n\n/**\n * ApprovalFlow container variants\n */\nexport const approvalFlowVariants = cva(\n \"relative rounded-lg border bg-card p-6 transition-all duration-300\",\n {\n variants: {\n variant: {\n linear: \"\",\n parallel: \"\",\n conditional: \"\",\n hybrid: \"\",\n },\n layout: {\n horizontal: \"flex flex-row gap-4 overflow-x-auto\",\n vertical: \"flex flex-col gap-4\",\n compact: \"flex flex-col gap-2 p-4\",\n },\n },\n defaultVariants: {\n variant: \"linear\",\n layout: \"horizontal\",\n },\n }\n)\n\n/**\n * ApprovalFlow step variants\n */\nexport const approvalFlowStepVariants = cva(\n \"relative flex transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n {\n variants: {\n layout: {\n horizontal: \"flex-col items-center gap-2 min-w-40\",\n vertical: \"flex-row gap-4\",\n compact: \"flex-row gap-3\",\n },\n status: {\n pending: \"\",\n in_progress: \"\",\n awaiting: \"\",\n approved: \"\",\n rejected: \"\",\n escalated: \"\",\n skipped: \"opacity-50\",\n },\n },\n defaultVariants: {\n layout: \"horizontal\",\n status: \"pending\",\n },\n }\n)\n\n/**\n * Step marker/indicator variants based on status\n */\nexport const approvalFlowMarkerVariants = cva(\n \"flex shrink-0 items-center justify-center rounded-full border-2 transition-all duration-300\",\n {\n variants: {\n status: {\n pending: \"border-muted-foreground/50 bg-muted text-muted-foreground\",\n in_progress:\n \"border-primary bg-primary text-primary-foreground animate-pulse\",\n awaiting: \"border-warning bg-warning text-warning-foreground\",\n approved: \"border-success bg-success text-success-foreground\",\n rejected: \"border-destructive bg-destructive text-destructive-foreground\",\n escalated: \"border-warning bg-warning text-warning-foreground\",\n skipped: \"border-muted-foreground/30 bg-muted/50 text-muted-foreground/50\",\n },\n size: {\n sm: \"h-8 w-8 text-xs\",\n default: \"h-10 w-10 text-sm\",\n lg: \"h-12 w-12 text-base\",\n },\n },\n defaultVariants: {\n status: \"pending\",\n size: \"default\",\n },\n }\n)\n\n/**\n * Connector line variants between steps\n */\nexport const approvalFlowConnectorVariants = cva(\n \"transition-colors duration-300\",\n {\n variants: {\n layout: {\n horizontal: \"h-0.5 flex-1 min-w-10\",\n vertical: \"w-0.5 min-h-10 ml-5\",\n compact: \"w-0.5 min-h-6 ml-4\",\n },\n status: {\n pending: \"bg-muted-foreground/30\",\n in_progress: \"bg-primary/50\",\n awaiting: \"bg-warning/50\",\n approved: \"bg-success\",\n rejected: \"bg-destructive/50\",\n escalated: \"bg-warning/50\",\n skipped: \"bg-muted-foreground/20\",\n },\n style: {\n solid: \"\",\n dashed: \"border-dashed border-2 bg-transparent\",\n },\n },\n compoundVariants: [\n {\n layout: \"horizontal\",\n style: \"dashed\",\n className: \"border-l-0 border-r-0 border-t-2 border-b-0 h-0\",\n },\n {\n layout: \"vertical\",\n style: \"dashed\",\n className: \"border-t-0 border-b-0 border-l-2 border-r-0 w-0\",\n },\n {\n layout: \"compact\",\n style: \"dashed\",\n className: \"border-t-0 border-b-0 border-l-2 border-r-0 w-0\",\n },\n ],\n defaultVariants: {\n layout: \"horizontal\",\n status: \"pending\",\n style: \"solid\",\n },\n }\n)\n\n/**\n * Step card variants\n */\nexport const approvalFlowStepCardVariants = cva(\n \"rounded-md border bg-background p-4 transition-all duration-200\",\n {\n variants: {\n status: {\n pending: \"border-muted\",\n in_progress: \"border-primary shadow-sm ring-1 ring-primary/20\",\n awaiting: \"border-warning shadow-sm\",\n approved: \"border-success/50 bg-success/5\",\n rejected: \"border-destructive/50 bg-destructive/5\",\n escalated: \"border-warning/50 bg-warning/5\",\n skipped: \"border-muted/50 bg-muted/10\",\n },\n layout: {\n horizontal: \"w-full max-w-52\",\n vertical: \"flex-1\",\n compact: \"flex-1 py-2\",\n },\n },\n defaultVariants: {\n status: \"pending\",\n layout: \"horizontal\",\n },\n }\n)\n\n/**\n * Action button group variants\n */\nexport const approvalFlowActionsVariants = cva(\n \"flex gap-2 transition-opacity duration-200\",\n {\n variants: {\n layout: {\n horizontal: \"flex-wrap justify-center mt-2\",\n vertical: \"flex-wrap\",\n compact: \"flex-wrap\",\n },\n visible: {\n true: \"opacity-100\",\n false: \"opacity-0 pointer-events-none\",\n },\n },\n defaultVariants: {\n layout: \"horizontal\",\n visible: true,\n },\n }\n)\n\nexport type ApprovalFlowVariantProps = VariantProps<typeof approvalFlowVariants>\nexport type ApprovalFlowStepVariantProps = VariantProps<\n typeof approvalFlowStepVariants\n>\nexport type ApprovalFlowMarkerVariantProps = VariantProps<\n typeof approvalFlowMarkerVariants\n>\nexport type ApprovalFlowConnectorVariantProps = VariantProps<\n typeof approvalFlowConnectorVariants\n>\nexport type ApprovalFlowStepCardVariantProps = VariantProps<\n typeof approvalFlowStepCardVariants\n>\nexport type ApprovalFlowActionsVariantProps = VariantProps<\n typeof approvalFlowActionsVariants\n>\n","import type {\n ApprovalFlowProps,\n ApprovalFlowStepProps,\n ApprovalStep,\n ApprovalStepStatus,\n Approver,\n} from \"./ApprovalFlow.types\"\nimport type { KeyboardEvent, ReactNode } from \"react\"\n\nimport {\n Check,\n ChevronRight,\n Clock,\n Forward,\n TrendingUp,\n User,\n X,\n} from \"lucide-react\"\nimport { useId, useState } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../primitives/Avatar\"\nimport { Button } from \"../../primitives/Button\"\nimport {\n approvalFlowActionsVariants,\n approvalFlowConnectorVariants,\n approvalFlowMarkerVariants,\n approvalFlowStepCardVariants,\n approvalFlowStepVariants,\n approvalFlowVariants,\n} from \"./ApprovalFlow.variants\"\n\n/**\n * Get initials from a name\n */\nfunction getInitials(name: string): string {\n return name\n .split(\" \")\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase()\n .slice(0, 2)\n}\n\n/**\n * Get icon for status\n */\nfunction getStatusIcon(status: ApprovalStepStatus): ReactNode {\n switch (status) {\n case \"approved\":\n return <Check className=\"h-4 w-4\" />\n case \"rejected\":\n return <X className=\"h-4 w-4\" />\n case \"in_progress\":\n case \"awaiting\":\n return <Clock className=\"h-4 w-4\" />\n case \"escalated\":\n return <TrendingUp className=\"h-4 w-4\" />\n case \"skipped\":\n return <Forward className=\"h-4 w-4\" />\n default:\n return null\n }\n}\n\n/**\n * Get accessible status label\n */\nfunction getStatusLabel(status: ApprovalStepStatus): string {\n const labels: Record<ApprovalStepStatus, string> = {\n pending: \"Pending\",\n in_progress: \"In progress\",\n awaiting: \"Awaiting approval\",\n approved: \"Approved\",\n rejected: \"Rejected\",\n escalated: \"Escalated\",\n skipped: \"Skipped\",\n }\n return labels[status]\n}\n\n/**\n * ApprovalFlowMarker component renders the status indicator\n */\nfunction ApprovalFlowMarker({\n index,\n status = \"pending\",\n}: {\n index: number\n status?: ApprovalStepStatus\n}) {\n const icon = getStatusIcon(status)\n\n return (\n <div\n aria-hidden=\"true\"\n className={approvalFlowMarkerVariants({ status })}\n data-slot=\"approval-flow-marker\"\n data-status={status}\n >\n {icon ?? (\n <span className=\"font-medium\">{index + 1}</span>\n )}\n </div>\n )\n}\n\n/**\n * ApprovalFlowConnector component renders the line between steps\n */\nfunction ApprovalFlowConnector({\n layout = \"horizontal\",\n status = \"pending\",\n isConditional = false,\n}: {\n isConditional?: boolean\n layout?: \"compact\" | \"horizontal\" | \"vertical\"\n status?: ApprovalStepStatus\n}) {\n return (\n <div\n className={approvalFlowConnectorVariants({\n layout,\n status,\n style: isConditional ? \"dashed\" : \"solid\",\n })}\n aria-hidden=\"true\"\n data-slot=\"approval-flow-connector\"\n />\n )\n}\n\n/**\n * ApproverAvatar component renders an approver's avatar\n */\nfunction ApproverAvatar({ approver }: { approver: Approver }) {\n return (\n <div className=\"flex items-center gap-2\" title={`${approver.name} (${approver.role})`}>\n <Avatar size=\"sm\">\n {approver.avatar ? (\n <AvatarImage alt={approver.name} src={approver.avatar} />\n ) : null}\n <AvatarFallback>{getInitials(approver.name)}</AvatarFallback>\n </Avatar>\n </div>\n )\n}\n\n/**\n * ApprovalFlowStepContent renders the content of a step\n */\nfunction ApprovalFlowStepContent({\n step,\n layout = \"horizontal\",\n}: {\n layout?: \"compact\" | \"horizontal\" | \"vertical\"\n step: ApprovalStep\n}) {\n const showApproversCount = step.approvers.length > 3\n const visibleApprovers = showApproversCount\n ? step.approvers.slice(0, 3)\n : step.approvers\n\n return (\n <div\n className={approvalFlowStepCardVariants({ status: step.status, layout })}\n data-slot=\"approval-flow-step-card\"\n >\n <div className=\"space-y-2\">\n <div data-slot=\"approval-flow-step-title\">\n <span className=\"text-sm font-medium text-foreground\">\n {step.title}\n </span>\n </div>\n\n {step.description && (\n <div data-slot=\"approval-flow-step-description\">\n <span className=\"text-xs text-muted-foreground\">\n {step.description}\n </span>\n </div>\n )}\n\n {step.approvers.length > 0 && (\n <div\n className=\"flex items-center gap-1\"\n data-slot=\"approval-flow-step-approvers\"\n >\n <div className=\"flex -space-x-2\">\n {visibleApprovers.map((approver) => (\n <ApproverAvatar key={approver.id} approver={approver} />\n ))}\n </div>\n {showApproversCount && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n +{step.approvers.length - 3} more\n </span>\n )}\n </div>\n )}\n\n {step.requiredApprovals && step.requiredApprovals > 1 && (\n <div\n className=\"text-xs text-muted-foreground\"\n data-slot=\"approval-flow-step-required\"\n >\n Requires {step.requiredApprovals} of {step.approvers.length} approvals\n </div>\n )}\n\n {step.deadline && (\n <div\n className=\"flex items-center gap-1 text-xs text-muted-foreground\"\n data-slot=\"approval-flow-step-deadline\"\n >\n <Clock className=\"h-3 w-3\" />\n <span>Due: {step.deadline.toLocaleDateString()}</span>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * ApprovalFlowStep component renders a single approval step\n */\nfunction ApprovalFlowStep({\n step,\n index,\n isCurrent,\n isLast,\n showConnector = true,\n layout = \"horizontal\",\n readOnly = false,\n allowDelegation = true,\n allowEscalation = true,\n onApprove,\n onReject,\n onDelegate,\n onEscalate,\n className,\n ...props\n}: ApprovalFlowStepProps) {\n const stepId = useId()\n const statusLabel = getStatusLabel(step.status)\n // Normalize null to undefined for layout\n const normalizedLayout = layout ?? \"horizontal\"\n const canAct =\n isCurrent &&\n !readOnly &&\n (step.status === \"in_progress\" || step.status === \"awaiting\")\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n const parent = target.parentElement\n if (!parent) return\n\n const siblings = [\n ...parent.querySelectorAll('[data-slot=\"approval-flow-step\"]'),\n ] as HTMLDivElement[]\n const currentIndex = siblings.indexOf(target)\n\n let nextIndex = -1\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n event.preventDefault()\n nextIndex = Math.min(currentIndex + 1, siblings.length - 1)\n break\n case \"ArrowUp\":\n case \"ArrowLeft\":\n event.preventDefault()\n nextIndex = Math.max(currentIndex - 1, 0)\n break\n default:\n return\n }\n\n const nextElement = siblings[nextIndex]\n if (nextIndex !== -1 && nextElement) {\n nextElement.focus()\n }\n }\n\n return (\n <div\n className={cn(\n approvalFlowStepVariants({ layout: normalizedLayout, status: step.status }),\n className\n )}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-describedby={`${stepId}-description`}\n aria-label={`${step.title} - ${statusLabel}`}\n data-active={isCurrent ? \"\" : undefined}\n data-slot=\"approval-flow-step\"\n data-status={step.status}\n role=\"listitem\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {/* Marker and Connector for vertical/compact layouts */}\n {(normalizedLayout === \"vertical\" || normalizedLayout === \"compact\") && (\n <div className=\"relative flex flex-col items-center\">\n <ApprovalFlowMarker index={index} status={step.status} />\n {showConnector && !isLast && (\n <ApprovalFlowConnector layout={normalizedLayout} status={step.status} />\n )}\n </div>\n )}\n\n {/* Main content wrapper */}\n <div className=\"flex flex-1 flex-col gap-2\">\n {/* Marker for horizontal layout */}\n {normalizedLayout === \"horizontal\" && (\n <div className=\"flex items-center justify-center\">\n <ApprovalFlowMarker index={index} status={step.status} />\n </div>\n )}\n\n {/* Step content */}\n <ApprovalFlowStepContent layout={normalizedLayout} step={step} />\n\n {/* Actions */}\n <div\n className={approvalFlowActionsVariants({\n layout: normalizedLayout,\n visible: canAct,\n })}\n data-slot=\"approval-flow-step-actions\"\n id={`${stepId}-description`}\n >\n {canAct && (\n <>\n <Button\n aria-label={`Approve ${step.title}`}\n size=\"sm\"\n variant=\"default\"\n onClick={onApprove}\n >\n <Check className=\"h-4 w-4\" />\n Approve\n </Button>\n <Button\n aria-label={`Reject ${step.title}`}\n size=\"sm\"\n variant=\"destructive\"\n onClick={onReject}\n >\n <X className=\"h-4 w-4\" />\n Reject\n </Button>\n {allowDelegation && (\n <Button\n aria-label={`Delegate ${step.title}`}\n size=\"sm\"\n variant=\"outline\"\n onClick={onDelegate}\n >\n <User className=\"h-4 w-4\" />\n Delegate\n </Button>\n )}\n {allowEscalation && (\n <Button\n aria-label={`Escalate ${step.title}`}\n size=\"sm\"\n variant=\"outline\"\n onClick={onEscalate}\n >\n <TrendingUp className=\"h-4 w-4\" />\n Escalate\n </Button>\n )}\n </>\n )}\n </div>\n </div>\n\n {/* Connector for horizontal layout */}\n {normalizedLayout === \"horizontal\" && showConnector && !isLast && (\n <div className=\"flex items-center self-start mt-5\">\n <ApprovalFlowConnector layout={normalizedLayout} status={step.status} />\n <ChevronRight className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * ApprovalFlow component displays and manages an approval workflow.\n *\n * @example\n * ```tsx\n * const steps = [\n * { id: \"1\", title: \"Request\", status: \"approved\", approvers: [] },\n * { id: \"2\", title: \"Manager\", status: \"in_progress\", approvers: [{ id: \"1\", name: \"John\", email: \"john@example.com\", role: \"Manager\" }] },\n * { id: \"3\", title: \"Director\", status: \"pending\", approvers: [] },\n * ]\n *\n * <ApprovalFlow\n * steps={steps}\n * currentStep={1}\n * onApprove={({ stepId }) => console.log(\"Approved:\", stepId)}\n * onReject={({ stepId, reason }) => console.log(\"Rejected:\", stepId, reason)}\n * />\n * ```\n */\nfunction ApprovalFlow({\n \"aria-label\": ariaLabel = \"Approval workflow\",\n className,\n steps,\n currentStep = 0,\n variant = \"linear\",\n layout = \"horizontal\",\n allowDelegation = true,\n allowEscalation = true,\n showTimeline: _showTimeline = true,\n showComments: _showComments = true,\n readOnly = false,\n history: _history,\n onApprove,\n onReject,\n onDelegate,\n onEscalate,\n onStepChange: _onStepChange,\n onComplete: _onComplete,\n ...props\n}: ApprovalFlowProps) {\n const [_activeStepIndex, setActiveStepIndex] = useState(currentStep)\n\n // Determine effective layout based on screen size\n // On mobile, force vertical layout\n const effectiveLayout = layout\n\n const handleApprove = (stepId: string) => {\n onApprove?.({ stepId })\n }\n\n const handleReject = (stepId: string) => {\n // In a real implementation, this would open a dialog for the reason\n onReject?.({ stepId, reason: \"\" })\n }\n\n const handleDelegate = (stepId: string) => {\n // In a real implementation, this would open a dialog to select delegate\n onDelegate?.({\n stepId,\n delegateTo: { id: \"\", name: \"\", email: \"\", role: \"\" },\n })\n }\n\n const handleEscalate = (stepId: string) => {\n // In a real implementation, this would open a dialog to select escalation target\n onEscalate?.({\n stepId,\n escalateTo: { id: \"\", name: \"\", email: \"\", role: \"\" },\n })\n }\n\n // Handle keyboard navigation between steps\n const handleStepFocus = (index: number) => {\n setActiveStepIndex(index)\n }\n\n const hasSteps = steps.length > 0\n\n return (\n <div\n aria-label={ariaLabel}\n className={cn(approvalFlowVariants({ variant, layout: effectiveLayout }), className)}\n data-slot=\"approval-flow\"\n data-variant={variant}\n role=\"list\"\n {...props}\n >\n {hasSteps\n ? steps.map((step, index) => (\n <ApprovalFlowStep\n key={step.id}\n allowDelegation={allowDelegation}\n allowEscalation={allowEscalation}\n index={index}\n isCurrent={index === currentStep}\n isLast={index === steps.length - 1}\n layout={effectiveLayout}\n readOnly={readOnly}\n showConnector={variant !== \"conditional\"}\n step={step}\n onApprove={() => { handleApprove(step.id); }}\n onDelegate={() => { handleDelegate(step.id); }}\n onEscalate={() => { handleEscalate(step.id); }}\n onFocus={() => { handleStepFocus(index); }}\n onReject={() => { handleReject(step.id); }}\n />\n ))\n : null}\n </div>\n )\n}\n\nexport {\n ApprovalFlow,\n approvalFlowActionsVariants,\n ApprovalFlowConnector,\n approvalFlowConnectorVariants,\n ApprovalFlowMarker,\n approvalFlowMarkerVariants,\n ApprovalFlowStep,\n approvalFlowStepCardVariants,\n approvalFlowStepVariants,\n approvalFlowVariants,\n}\nexport type {\n ApprovalFlowProps,\n ApprovalFlowStepProps,\n ApprovalStep,\n ApprovalStepStatus,\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WBE6VQOO.js';
2
2
  import { TextInput } from './chunk-PWCMCMDN.js';
3
- import { Button } from './chunk-6TBA37U7.js';
3
+ import { Button } from './chunk-7TF5PVEU.js';
4
4
  import { cn } from './chunk-HRNDJU7D.js';
5
5
  import { X, PlusCircle, Trash2 } from 'lucide-react';
6
6
  import * as React from 'react';
@@ -478,5 +478,5 @@ function FilterBuilder({
478
478
  FilterBuilder.displayName = "FilterBuilder";
479
479
 
480
480
  export { FilterBuilder, isFilterCondition, isFilterGroup };
481
- //# sourceMappingURL=chunk-Y6ZXHHUS.js.map
482
- //# sourceMappingURL=chunk-Y6ZXHHUS.js.map
481
+ //# sourceMappingURL=chunk-3W7FXRO5.js.map
482
+ //# sourceMappingURL=chunk-3W7FXRO5.js.map