@etus/ui 0.4.0-beta.4 → 0.4.0-beta.6

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 (61) hide show
  1. package/dist/{chunk-F6ZKBK5B.js → chunk-5GE3BQA7.js} +9 -4
  2. package/dist/chunk-5GE3BQA7.js.map +1 -0
  3. package/dist/{chunk-3RJEA2MM.js → chunk-6HEURMY3.js} +102 -65
  4. package/dist/chunk-6HEURMY3.js.map +1 -0
  5. package/dist/{chunk-ZS2WS5NJ.js → chunk-AVR3LVOQ.js} +48 -3
  6. package/dist/chunk-AVR3LVOQ.js.map +1 -0
  7. package/dist/{chunk-AB3S55W5.js → chunk-HT5XM6XK.js} +3 -3
  8. package/dist/{chunk-AB3S55W5.js.map → chunk-HT5XM6XK.js.map} +1 -1
  9. package/dist/{chunk-ICM45N2K.js → chunk-JONTKXGK.js} +24 -22
  10. package/dist/chunk-JONTKXGK.js.map +1 -0
  11. package/dist/{chunk-XXFKDEFH.js → chunk-JUTPDS4E.js} +7 -11
  12. package/dist/chunk-JUTPDS4E.js.map +1 -0
  13. package/dist/{chunk-DDR24GOP.js → chunk-L3Z5FAJE.js} +67 -51
  14. package/dist/chunk-L3Z5FAJE.js.map +1 -0
  15. package/dist/{chunk-RVUO7SDG.js → chunk-LS3WD6IZ.js} +63 -28
  16. package/dist/chunk-LS3WD6IZ.js.map +1 -0
  17. package/dist/{chunk-5ZKKXLPF.js → chunk-VPNFYQBL.js} +10 -15
  18. package/dist/chunk-VPNFYQBL.js.map +1 -0
  19. package/dist/{chunk-5YDFC74M.js → chunk-XD5LE64P.js} +7 -6
  20. package/dist/chunk-XD5LE64P.js.map +1 -0
  21. package/dist/{chunk-CSXT7SKR.js → chunk-YCEZH35U.js} +18 -4
  22. package/dist/chunk-YCEZH35U.js.map +1 -0
  23. package/dist/{chunk-2D6OFVPN.js → chunk-YWA63YN3.js} +22 -2
  24. package/dist/chunk-YWA63YN3.js.map +1 -0
  25. package/dist/components/advanced/index.js +4 -4
  26. package/dist/components/data-display/ChartCard/index.js +1 -3
  27. package/dist/components/data-display/DashboardFilterbar/index.js +1 -1
  28. package/dist/components/data-display/ImageGallery/index.js +8 -1
  29. package/dist/components/data-display/index.js +15 -15
  30. package/dist/components/feedback/Modal/index.js +1 -1
  31. package/dist/components/feedback/Notification/index.js +1 -1
  32. package/dist/components/feedback/index.js +4 -4
  33. package/dist/components/forms/ColorPicker/index.js +1 -1
  34. package/dist/components/forms/DatePicker/index.js +1 -1
  35. package/dist/components/forms/DateRangePicker/index.js +1 -1
  36. package/dist/components/forms/index.js +14 -14
  37. package/dist/components/index.js +70 -70
  38. package/dist/components/layout/Panel/index.js +2 -1
  39. package/dist/components/layout/index.js +3 -3
  40. package/dist/components/navigation/Header/index.js +1 -1
  41. package/dist/components/navigation/Menu/index.js +2 -1
  42. package/dist/components/navigation/Sidebar/index.js +1 -1
  43. package/dist/components/navigation/Toolbar/index.js +1 -1
  44. package/dist/components/navigation/index.js +8 -7
  45. package/dist/components/primitives/index.js +8 -8
  46. package/dist/components/workflow/index.js +7 -7
  47. package/dist/index.d.ts +181 -64
  48. package/dist/index.js +70 -70
  49. package/dist/styles.css +26 -15
  50. package/package.json +2 -2
  51. package/dist/chunk-2D6OFVPN.js.map +0 -1
  52. package/dist/chunk-3RJEA2MM.js.map +0 -1
  53. package/dist/chunk-5YDFC74M.js.map +0 -1
  54. package/dist/chunk-5ZKKXLPF.js.map +0 -1
  55. package/dist/chunk-CSXT7SKR.js.map +0 -1
  56. package/dist/chunk-DDR24GOP.js.map +0 -1
  57. package/dist/chunk-F6ZKBK5B.js.map +0 -1
  58. package/dist/chunk-ICM45N2K.js.map +0 -1
  59. package/dist/chunk-RVUO7SDG.js.map +0 -1
  60. package/dist/chunk-XXFKDEFH.js.map +0 -1
  61. package/dist/chunk-ZS2WS5NJ.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { ScrollArea } from './chunk-CNRV2IGH.js';
1
2
  import { cn } from './chunk-HRNDJU7D.js';
2
3
  import { useRef, useCallback } from 'react';
3
4
  import { cva } from 'class-variance-authority';
@@ -5,7 +6,10 @@ import { jsx } from 'react/jsx-runtime';
5
6
 
6
7
  var menuVariants = cva(
7
8
  [
8
- "flex p-[var(--menu-root-padding)]"
9
+ "flex p-[var(--menu-root-padding)]",
10
+ // Floating chrome (DES-1281): Menu owns the popover casing — bg/border/shadow/radius —
11
+ // so consumers no longer wrap it in a `rounded-md border bg-popover shadow-md` div.
12
+ "rounded-[var(--menu-content-radius)] border border-[color:var(--menu-content-border)] bg-[color:var(--menu-content-bg)] shadow-[var(--menu-content-shadow)]"
9
13
  ],
10
14
  {
11
15
  variants: {
@@ -86,6 +90,7 @@ var menuShortcutVariants = cva([
86
90
  function Menu({
87
91
  className,
88
92
  orientation = "vertical",
93
+ maxHeight,
89
94
  children,
90
95
  ...props
91
96
  }) {
@@ -150,7 +155,7 @@ function Menu({
150
155
  role: "menu",
151
156
  onKeyDown: handleKeyDown,
152
157
  ...props,
153
- children
158
+ children: maxHeight == null ? children : /* @__PURE__ */ jsx(ScrollArea, { className: "w-full", style: { maxHeight }, children })
154
159
  }
155
160
  );
156
161
  }
@@ -261,5 +266,5 @@ function MenuShortcut({ className, children, ...props }) {
261
266
  }
262
267
 
263
268
  export { Menu, MenuGroup, MenuItem, MenuLabel, MenuSeparator, MenuShortcut, menuGroupVariants, menuItemVariants, menuLabelVariants, menuSeparatorVariants, menuShortcutVariants, menuVariants };
264
- //# sourceMappingURL=chunk-F6ZKBK5B.js.map
265
- //# sourceMappingURL=chunk-F6ZKBK5B.js.map
269
+ //# sourceMappingURL=chunk-5GE3BQA7.js.map
270
+ //# sourceMappingURL=chunk-5GE3BQA7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/Menu/Menu.variants.ts","../src/components/navigation/Menu/Menu.tsx"],"names":[],"mappings":"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","file":"chunk-5GE3BQA7.js","sourcesContent":["import { cva } from \"class-variance-authority\"\n\n/**\n * Menu root variant styles\n */\nexport const menuVariants = cva(\n [\n \"flex p-[var(--menu-root-padding)]\",\n // Floating chrome (DES-1281): Menu owns the popover casing — bg/border/shadow/radius —\n // so consumers no longer wrap it in a `rounded-md border bg-popover shadow-md` div.\n \"rounded-[var(--menu-content-radius)] border border-[color:var(--menu-content-border)] bg-[color:var(--menu-content-bg)] shadow-[var(--menu-content-shadow)]\",\n ],\n {\n variants: {\n orientation: {\n vertical: \"flex-col\",\n horizontal: \"flex-row\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\n/**\n * MenuItem variant styles\n */\nexport const menuItemVariants = cva(\n [\n // Base styles\n \"relative flex w-full cursor-pointer select-none items-center gap-[var(--menu-item-gap)]\",\n \"rounded-[var(--menu-item-radius)] px-[var(--menu-item-padding-x)] py-[var(--menu-item-padding-y)] text-[length:var(--menu-item-text-size)] outline-none\",\n // Focus styles\n \"focus:bg-accent focus:text-accent-foreground\",\n // Hover styles\n \"hover:bg-accent hover:text-accent-foreground\",\n // Transition\n \"transition-colors\",\n // Disabled styles\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n // SVG styles\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n ],\n {\n variants: {\n variant: {\n default: \"\",\n destructive: \"text-destructive focus:bg-destructive/10 focus:text-destructive hover:bg-destructive/10 hover:text-destructive\",\n },\n inset: {\n true: \"pl-8\",\n false: \"\",\n },\n selected: {\n true: \"bg-accent/50\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n inset: false,\n selected: false,\n },\n }\n)\n\n/**\n * MenuGroup variant styles\n */\nexport const menuGroupVariants = cva([\n \"flex flex-col gap-1\",\n])\n\n/**\n * MenuLabel variant styles\n */\nexport const menuLabelVariants = cva(\n [\n \"px-2 py-1.5 text-xs font-medium text-muted-foreground\",\n \"uppercase tracking-wider\",\n ],\n {\n variants: {\n inset: {\n true: \"pl-8\",\n false: \"\",\n },\n },\n defaultVariants: {\n inset: false,\n },\n }\n)\n\n/**\n * MenuSeparator variant styles\n */\nexport const menuSeparatorVariants = cva([\n \"-mx-1 my-1 h-px bg-border\",\n])\n\n/**\n * MenuShortcut variant styles\n */\nexport const menuShortcutVariants = cva([\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n])\n","\"use client\"\n\nimport type {\n MenuGroupProps,\n MenuItemProps,\n MenuLabelProps,\n MenuProps,\n MenuSeparatorProps,\n MenuShortcutProps,\n} from \"./Menu.types\"\nimport type { KeyboardEvent } from \"react\";\n\nimport { useCallback, useRef } from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { ScrollArea } from \"../../layout/ScrollArea\"\nimport {\n menuGroupVariants,\n menuItemVariants,\n menuLabelVariants,\n menuSeparatorVariants,\n menuShortcutVariants,\n menuVariants,\n} from \"./Menu.variants\"\n\n/**\n * Menu - A navigable list of options with keyboard support.\n *\n * Base component for creating custom menus with full accessibility.\n *\n * @example\n * <Menu>\n * <MenuItem onSelect={() => console.log(\"Edit\")}>Edit</MenuItem>\n * <MenuItem onSelect={() => console.log(\"Copy\")}>Copy</MenuItem>\n * <MenuSeparator />\n * <MenuItem variant=\"destructive\">Delete</MenuItem>\n * </Menu>\n */\nfunction Menu({\n className,\n orientation = \"vertical\",\n maxHeight,\n children,\n ...props\n}: MenuProps) {\n const menuRef = useRef<HTMLDivElement>(null)\n\n /* eslint-disable sonarjs/cognitive-complexity -- Keyboard navigation requires handling multiple key cases */\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const menu = menuRef.current\n if (!menu) return\n\n const items = [...menu.querySelectorAll('[role=\"menuitem\"]:not([data-disabled])')] as HTMLElement[]\n\n if (items.length === 0) return\n\n const currentIndex = items.findIndex((item) => item === document.activeElement)\n\n let nextIndex: null | number = null\n\n switch (event.key) {\n case \"ArrowDown\":\n if (orientation === \"vertical\") {\n event.preventDefault()\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0\n }\n break\n case \"ArrowUp\":\n if (orientation === \"vertical\") {\n event.preventDefault()\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1\n }\n break\n case \"ArrowRight\":\n if (orientation === \"horizontal\") {\n event.preventDefault()\n nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0\n }\n break\n case \"ArrowLeft\":\n if (orientation === \"horizontal\") {\n event.preventDefault()\n nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1\n }\n break\n case \"Home\":\n event.preventDefault()\n nextIndex = 0\n break\n case \"End\":\n event.preventDefault()\n nextIndex = items.length - 1\n break\n }\n\n if (nextIndex !== null) {\n const nextItem = items[nextIndex]\n if (nextItem) {\n nextItem.focus()\n }\n }\n },\n [orientation]\n )\n /* eslint-enable sonarjs/cognitive-complexity */\n\n return (\n <div\n ref={menuRef}\n className={cn(menuVariants({ orientation }), className)}\n data-slot=\"menu\"\n role=\"menu\"\n onKeyDown={handleKeyDown}\n {...props}\n >\n {maxHeight == null ? (\n children\n ) : (\n <ScrollArea className=\"w-full\" style={{ maxHeight }}>\n {children}\n </ScrollArea>\n )}\n </div>\n )\n}\n\n/**\n * MenuItem - Individual menu item with optional variants.\n */\nfunction MenuItem({\n className,\n variant = \"default\",\n inset = false,\n selected = false,\n onSelect,\n disabled = false,\n children,\n onClick,\n onKeyDown,\n ...props\n}: MenuItemProps) {\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return\n onClick?.(event)\n onSelect?.()\n },\n [disabled, onClick, onSelect]\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event)\n if (disabled) return\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onSelect?.()\n }\n },\n [disabled, onKeyDown, onSelect]\n )\n\n return (\n <button\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n className={cn(menuItemVariants({ variant, inset, selected }), className)}\n data-disabled={disabled || undefined}\n data-slot=\"menu-item\"\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n type=\"button\"\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {children}\n </button>\n )\n}\n\n/**\n * MenuGroup - Groups related menu items together.\n */\nfunction MenuGroup({\n className,\n label,\n children,\n ...props\n}: MenuGroupProps) {\n return (\n <div\n aria-label={label}\n className={cn(menuGroupVariants(), className)}\n data-slot=\"menu-group\"\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/**\n * MenuLabel - Label for a group of menu items.\n */\nfunction MenuLabel({\n className,\n inset = false,\n children,\n ...props\n}: MenuLabelProps) {\n return (\n <div\n className={cn(menuLabelVariants({ inset }), className)}\n data-slot=\"menu-label\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\n/**\n * MenuSeparator - Visual divider between menu items.\n */\nfunction MenuSeparator({ className, ...props }: MenuSeparatorProps) {\n return (\n <div\n className={cn(menuSeparatorVariants(), className)}\n data-slot=\"menu-separator\"\n role=\"separator\"\n {...props}\n />\n )\n}\n\n/**\n * MenuShortcut - Displays keyboard shortcut hint.\n */\nfunction MenuShortcut({ className, children, ...props }: MenuShortcutProps) {\n return (\n <span\n className={cn(menuShortcutVariants(), className)}\n data-slot=\"menu-shortcut\"\n {...props}\n >\n {children}\n </span>\n )\n}\n\nexport { Menu, MenuGroup, MenuItem, MenuLabel, MenuSeparator, MenuShortcut }\n"]}
@@ -1,7 +1,8 @@
1
+ import { Lightbox } from './chunk-KR3IVNQH.js';
2
+ import { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext } from './chunk-SJSYKUCL.js';
1
3
  import { AspectRatio } from './chunk-2UGDLAYC.js';
2
4
  import { cn } from './chunk-HRNDJU7D.js';
3
5
  import { cva } from 'class-variance-authority';
4
- import useEmblaCarousel from 'embla-carousel-react';
5
6
  import { Check } from 'lucide-react';
6
7
  import * as React from 'react';
7
8
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -89,10 +90,33 @@ var imageGalleryItemVariants = cva(
89
90
  }
90
91
  }
91
92
  );
93
+ function useInfiniteScroll(onLoadMore) {
94
+ const sentinelRef = React.useRef(null);
95
+ React.useEffect(() => {
96
+ const node = sentinelRef.current;
97
+ if (!onLoadMore || !node) return;
98
+ if (typeof IntersectionObserver === "undefined") return;
99
+ const observer = new IntersectionObserver(
100
+ (entries) => {
101
+ for (const entry of entries) {
102
+ if (entry.isIntersecting) {
103
+ onLoadMore();
104
+ }
105
+ }
106
+ },
107
+ { rootMargin: "200px" }
108
+ );
109
+ observer.observe(node);
110
+ return () => {
111
+ observer.disconnect();
112
+ };
113
+ }, [onLoadMore]);
114
+ return sentinelRef;
115
+ }
92
116
  function ImageGalleryItem({
93
117
  aspectRatio = 1,
94
118
  className,
95
- enableLightbox = true,
119
+ interactive = true,
96
120
  enableSelection = false,
97
121
  image,
98
122
  index: _index,
@@ -127,7 +151,7 @@ function ImageGalleryItem({
127
151
  className: cn(
128
152
  imageGalleryItemVariants({
129
153
  selected: isSelected,
130
- interactive: enableLightbox || enableSelection
154
+ interactive
131
155
  }),
132
156
  className
133
157
  ),
@@ -167,7 +191,6 @@ function ImageGalleryItem({
167
191
  function GridLayout({
168
192
  aspectRatio = 1,
169
193
  columns,
170
- enableLightbox = true,
171
194
  enableSelection = false,
172
195
  gap = "md",
173
196
  images,
@@ -187,7 +210,6 @@ function GridLayout({
187
210
  ImageGalleryItem,
188
211
  {
189
212
  aspectRatio,
190
- enableLightbox,
191
213
  enableSelection,
192
214
  image,
193
215
  index,
@@ -209,7 +231,6 @@ function GridLayout({
209
231
  }
210
232
  function MasonryLayout({
211
233
  columns,
212
- enableLightbox = true,
213
234
  enableSelection = false,
214
235
  gap = "md",
215
236
  images,
@@ -242,7 +263,6 @@ function MasonryLayout({
242
263
  ImageGalleryItem,
243
264
  {
244
265
  aspectRatio,
245
- enableLightbox,
246
266
  enableSelection,
247
267
  image,
248
268
  index,
@@ -267,7 +287,6 @@ function MasonryLayout({
267
287
  }
268
288
  function FeaturedLayout({
269
289
  aspectRatio = 1,
270
- enableLightbox = true,
271
290
  enableSelection = false,
272
291
  gap = "md",
273
292
  images,
@@ -299,7 +318,6 @@ function FeaturedLayout({
299
318
  {
300
319
  aspectRatio,
301
320
  className: "h-full",
302
- enableLightbox,
303
321
  enableSelection,
304
322
  image: featuredImage,
305
323
  index: featuredIndex,
@@ -329,10 +347,10 @@ function FeaturedLayout({
329
347
  {
330
348
  aspectRatio: 1,
331
349
  className: "flex-1 md:flex-none",
332
- enableLightbox: false,
333
350
  enableSelection,
334
351
  image,
335
352
  index: originalIndex,
353
+ interactive: enableSelection,
336
354
  isSelected: selectedIds.includes(image.id),
337
355
  onClick: () => {
338
356
  handleThumbnailClick(image, originalIndex);
@@ -355,66 +373,48 @@ function FeaturedLayout({
355
373
  }
356
374
  function CarouselLayout({
357
375
  aspectRatio = 1,
358
- enableLightbox = true,
359
376
  enableSelection = false,
360
- gap = "md",
361
377
  images,
362
378
  onImageError,
363
379
  onImageLoad,
364
380
  onItemClick,
365
381
  selectedIds = []
366
382
  }) {
367
- const [emblaRef] = useEmblaCarousel({
368
- align: "start",
369
- loop: false,
370
- slidesToScroll: 1
371
- });
372
- const gapValue = gap === "sm" ? "0.5rem" : gap === "lg" ? "1.5rem" : "1rem";
373
383
  return /* @__PURE__ */ jsx(
374
384
  "div",
375
385
  {
376
- ref: emblaRef,
377
- "aria-roledescription": "carousel",
378
- className: "overflow-hidden",
386
+ className: "px-[var(--carousel-button-offset)]",
379
387
  "data-layout": "carousel",
380
- children: /* @__PURE__ */ jsx(
381
- "div",
382
- {
383
- style: {
384
- gap: gapValue
385
- },
386
- className: "flex",
387
- children: images.map((image, index) => /* @__PURE__ */ jsx(
388
- "div",
389
- {
390
- "aria-roledescription": "slide",
391
- className: "min-w-0 shrink-0 basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4",
392
- role: "group",
393
- children: /* @__PURE__ */ jsx(
394
- ImageGalleryItem,
395
- {
396
- aspectRatio,
397
- enableLightbox,
398
- enableSelection,
399
- image,
400
- index,
401
- isSelected: selectedIds.includes(image.id),
402
- onClick: () => {
403
- onItemClick(image, index);
404
- },
405
- onImageError: (error) => {
406
- onImageError?.(image, error);
407
- },
408
- onImageLoad: () => {
409
- onImageLoad?.(image);
410
- }
388
+ children: /* @__PURE__ */ jsxs(Carousel, { className: "w-full", opts: { align: "start", loop: false }, children: [
389
+ /* @__PURE__ */ jsx(CarouselContent, { children: images.map((image, index) => /* @__PURE__ */ jsx(
390
+ CarouselItem,
391
+ {
392
+ className: "basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4",
393
+ children: /* @__PURE__ */ jsx(
394
+ ImageGalleryItem,
395
+ {
396
+ aspectRatio,
397
+ enableSelection,
398
+ image,
399
+ index,
400
+ isSelected: selectedIds.includes(image.id),
401
+ onClick: () => {
402
+ onItemClick(image, index);
403
+ },
404
+ onImageError: (error) => {
405
+ onImageError?.(image, error);
406
+ },
407
+ onImageLoad: () => {
408
+ onImageLoad?.(image);
411
409
  }
412
- )
413
- },
414
- image.id
415
- ))
416
- }
417
- )
410
+ }
411
+ )
412
+ },
413
+ image.id
414
+ )) }),
415
+ /* @__PURE__ */ jsx(CarouselPrevious, {}),
416
+ /* @__PURE__ */ jsx(CarouselNext, {})
417
+ ] })
418
418
  }
419
419
  );
420
420
  }
@@ -443,7 +443,7 @@ function ImageGallery({
443
443
  aspectRatio = 1,
444
444
  className,
445
445
  columns,
446
- enableLightbox = true,
446
+ enableLightbox = false,
447
447
  enableSelection = false,
448
448
  gap = "md",
449
449
  images,
@@ -453,14 +453,27 @@ function ImageGallery({
453
453
  onImageClick,
454
454
  onImageError,
455
455
  onImageLoad,
456
- _onLoadMore,
456
+ onLoadMore,
457
457
  onSelectionChange,
458
458
  ref,
459
459
  selectedIds: controlledSelectedIds,
460
460
  ...props
461
461
  }) {
462
+ const isProd = (
463
+ // eslint-disable-next-line @typescript-eslint/dot-notation -- noPropertyAccessFromIndexSignature; bracket access on process.env is required by CI tsc.
464
+ typeof process !== "undefined" && process.env["NODE_ENV"] === "production"
465
+ );
466
+ const lightboxEnabled = enableLightbox && !enableSelection;
467
+ if (enableLightbox && enableSelection && !isProd) {
468
+ console.warn(
469
+ "<ImageGallery> received both `enableLightbox` and `enableSelection`. They are mutually exclusive; `enableSelection` takes precedence and the lightbox is disabled. Enable only one."
470
+ );
471
+ }
462
472
  const [internalSelectedIds, setInternalSelectedIds] = React.useState([]);
463
473
  const selectedIds = controlledSelectedIds ?? internalSelectedIds;
474
+ const [lightboxOpen, setLightboxOpen] = React.useState(false);
475
+ const [lightboxIndex, setLightboxIndex] = React.useState(0);
476
+ const sentinelRef = useInfiniteScroll(onLoadMore);
464
477
  const handleItemClick = React.useCallback(
465
478
  (image, index) => {
466
479
  if (enableSelection) {
@@ -470,6 +483,10 @@ function ImageGallery({
470
483
  }
471
484
  onSelectionChange?.(newSelectedIds);
472
485
  }
486
+ if (lightboxEnabled) {
487
+ setLightboxIndex(index);
488
+ setLightboxOpen(true);
489
+ }
473
490
  onImageClick?.(image, index);
474
491
  },
475
492
  [
@@ -478,6 +495,7 @@ function ImageGallery({
478
495
  maxSelection,
479
496
  controlledSelectedIds,
480
497
  onSelectionChange,
498
+ lightboxEnabled,
481
499
  onImageClick
482
500
  ]
483
501
  );
@@ -524,7 +542,6 @@ function ImageGallery({
524
542
  const layoutProps = {
525
543
  aspectRatio,
526
544
  columns,
527
- enableLightbox,
528
545
  enableSelection,
529
546
  gap,
530
547
  images,
@@ -539,7 +556,7 @@ function ImageGallery({
539
556
  grid: /* @__PURE__ */ jsx(GridLayout, { ...layoutProps }),
540
557
  masonry: /* @__PURE__ */ jsx(MasonryLayout, { ...layoutProps })
541
558
  };
542
- return /* @__PURE__ */ jsx(
559
+ return /* @__PURE__ */ jsxs(
543
560
  "div",
544
561
  {
545
562
  ref,
@@ -550,11 +567,31 @@ function ImageGallery({
550
567
  "data-slot": "image-gallery",
551
568
  role: "group",
552
569
  ...props,
553
- children: layoutComponents[layout]
570
+ children: [
571
+ layoutComponents[layout],
572
+ onLoadMore && /* @__PURE__ */ jsx(
573
+ "div",
574
+ {
575
+ ref: sentinelRef,
576
+ "aria-hidden": "true",
577
+ className: "h-px w-full",
578
+ "data-slot": "image-gallery-sentinel"
579
+ }
580
+ ),
581
+ lightboxEnabled && /* @__PURE__ */ jsx(
582
+ Lightbox,
583
+ {
584
+ images,
585
+ initialIndex: lightboxIndex,
586
+ open: lightboxOpen,
587
+ onOpenChange: setLightboxOpen
588
+ }
589
+ )
590
+ ]
554
591
  }
555
592
  );
556
593
  }
557
594
 
558
595
  export { ImageGallery, ImageGalleryItem };
559
- //# sourceMappingURL=chunk-3RJEA2MM.js.map
560
- //# sourceMappingURL=chunk-3RJEA2MM.js.map
596
+ //# sourceMappingURL=chunk-6HEURMY3.js.map
597
+ //# sourceMappingURL=chunk-6HEURMY3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/ImageGallery/ImageGallery.tsx"],"names":[],"mappings":";;;;;;;;;AA2BA,IAAM,UAAA,GAA8C;AAAA,EAClD,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAGA,IAAM,aAAA,GAAwC;AAAA,EAC5C,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG,aAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAIA,SAAS,iBACP,OAAA,EACQ;AACR,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO,0DAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,aAAA,CAAc,OAAO,CAAA,IAAK,aAAA;AAAA,EACnC;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,IAAA,CAAK,gBAAgB,OAAA,CAAQ,EAAE,KAAK,gBAAgB,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,IAAA,CAAK,gBAAgB,OAAA,CAAQ,EAAE,KAAK,gBAAgB,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,IAAA,CAAK,gBAAgB,OAAA,CAAQ,EAAE,KAAK,gBAAgB,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,IAAA,CAAK,gBAAgB,OAAA,CAAQ,EAAE,KAAK,gBAAgB,CAAA;AAE5E,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,IAAK,2CAAA;AAC9B;AAGA,IAAM,wBAAA,GAA2B,GAAA;AAAA,EAC/B;AAAA,IACE,qCAAA;AAAA,IACA,qGAAA;AAAA,IACA,mCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,mCAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,oBAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,KAAA;AAAA,MACV,WAAA,EAAa;AAAA;AACf;AAEJ,CAAA;AAOA,SAAS,kBAAkB,UAAA,EAAyB;AAClD,EAAA,MAAM,WAAA,GAAoB,aAA8B,IAAI,CAAA;AAE5D,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AACzB,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,EAAM;AAC1B,IAAA,IAAI,OAAO,yBAAyB,WAAA,EAAa;AAEjD,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,EAAE,YAAY,OAAA;AAAQ,KACxB;AACA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAErB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO,WAAA;AACT;AAKA,SAAS,gBAAA,CAAiB;AAAA,EACxB,WAAA,GAAc,CAAA;AAAA,EACd,SAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,eAAA,GAAkB,KAAA;AAAA,EAClB,KAAA;AAAA,EACA,KAAA,EAAO,MAAA;AAAA,EACP,UAAA,GAAa,KAAA;AAAA,EACb,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,eAExC,SAAS,CAAA;AAEX,EAAA,MAAM,UAAA,GAAmB,kBAAY,MAAM;AACzC,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,WAAA,IAAc;AAAA,EAChB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAoB,kBAAY,MAAM;AAC1C,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,KAAA,CAAM,GAAA,EAAK,YAAY,CAAC,CAAA;AAE5B,EAAA,MAAM,aAAA,GAAsB,KAAA,CAAA,WAAA;AAAA,IAC1B,CAAC,KAAA,KAA+B;AAC9B,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,OAAA,IAAU;AAAA,MACZ;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,cACE,eAAA,IAAmB,UAAA,GACf,GAAG,KAAA,CAAM,GAAG,gBACZ,KAAA,CAAM,GAAA;AAAA,MAEZ,SAAA,EAAW,EAAA;AAAA,QACT,wBAAA,CAAyB;AAAA,UACvB,QAAA,EAAU,UAAA;AAAA,UACV;AAAA,SACD,CAAA;AAAA,QACD;AAAA,OACF;AAAA,MACA,cAAA,EAAc,kBAAkB,UAAA,GAAa,MAAA;AAAA,MAC7C,YAAA,EAAY,eAAe,OAAA,IAAW,MAAA;AAAA,MACtC,cAAA,EAAc,eAAe,SAAA,IAAa,MAAA;AAAA,MAC1C,iBAAe,UAAA,IAAc,MAAA;AAAA,MAC7B,WAAA,EAAU,oBAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MACV,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,OAAO,WAAA,EACjB,QAAA,EAAA;AAAA,UAAA,UAAA,KAAe,SAAA,oBACd,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,UAE1D,UAAA,KAAe,OAAA,mBACd,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,gBAAA,EAAc,CAAA,EAC1C,CAAA,mBAEA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,4DAAA;AAAA,gBACA,UAAA,KAAe,YAAY,WAAA,GAAc;AAAA,eAC3C;AAAA,cACA,KAAK,KAAA,CAAM,GAAA;AAAA,cACX,WAAA,EAAU,qBAAA;AAAA,cACV,OAAA,EAAQ,MAAA;AAAA,cACR,GAAA,EAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,GAAA;AAAA,cAC9B,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ;AAAA;AAAA;AACV,SAAA,EAEJ,CAAA;AAAA,QAGC,eAAA,IAAmB,UAAA,oBAClB,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA,EAC7B;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAKA,SAAS,UAAA,CAAW;AAAA,EAClB,WAAA,GAAc,CAAA;AAAA,EACd,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,GAAA,GAAM,IAAA;AAAA,EACN,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAc;AAChB,CAAA,EAUG;AAID,EAAA,MAAM,eAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,EAAE,mBAAA,EAAqB,CAAA,OAAA,EAAU,MAAA,CAAO,OAAO,CAAC,CAAA,iBAAA,CAAA,EAAoB,GACpE,MAAA;AAEN,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAG,MAAA,EAAQ,gBAAA,CAAiB,OAAO,CAAA,EAAG,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MAChE,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO,eAAA;AAAA,MAEN,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClB,GAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UAEC,WAAA;AAAA,UACA,eAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA;AAAA,UACA,UAAA,EAAY,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAAA,UACzC,SAAS,MAAM;AACb,YAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,UAC1B,CAAA;AAAA,UACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,YAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,UAC7B,CAAA;AAAA,UACA,aAAa,MAAM;AACjB,YAAA,WAAA,GAAc,KAAK,CAAA;AAAA,UACrB;AAAA,SAAA;AAAA,QAdK,KAAA,CAAM;AAAA,OAgBd;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,GAAA,GAAM,IAAA;AAAA,EACN,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAc;AAChB,CAAA,EASG;AACD,EAAA,MAAM,WAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,OAAA,EAAS,EAAA,IAAM,SAAS,EAAA,IAAM,CAAA;AAExE,EAAA,MAAM,WAAW,GAAA,KAAQ,IAAA,GAAO,QAAA,GAAW,GAAA,KAAQ,OAAO,QAAA,GAAW,MAAA;AAErE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,WAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AAAA,MACA,SAAA,EAAU,uBAAA;AAAA,MACV,aAAA,EAAY,SAAA;AAAA,MAEX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AAC5B,QAAA,MAAM,WAAA,GACJ,MAAM,KAAA,IAAS,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA;AAE7D,QAAA,uBACE,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,YAAA,EAAc;AAAA,aAChB;AAAA,YACA,SAAA,EAAU,yCAAA;AAAA,YAEV,QAAA,kBAAA,GAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,WAAA;AAAA,gBACA,eAAA;AAAA,gBACA,KAAA;AAAA,gBACA,KAAA;AAAA,gBACA,UAAA,EAAY,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAAA,gBACzC,SAAS,MAAM;AACb,kBAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,gBAC1B,CAAA;AAAA,gBACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,kBAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,gBAC7B,CAAA;AAAA,gBACA,aAAa,MAAM;AACjB,kBAAA,WAAA,GAAc,KAAK,CAAA;AAAA,gBACrB;AAAA;AAAA;AACF,WAAA;AAAA,UArBK,KAAA,CAAM;AAAA,SAsBb;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,cAAA,CAAe;AAAA,EACtB,WAAA,GAAc,CAAA;AAAA,EACd,eAAA,GAAkB,KAAA;AAAA,EAClB,GAAA,GAAM,IAAA;AAAA,EACN,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAc;AAChB,CAAA,EASG;AACD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,eAAS,CAAC,CAAA;AAE1D,EAAA,MAAM,oBAAA,GAA6B,KAAA,CAAA,WAAA;AAAA,IACjC,CAAC,OAAkB,aAAA,KAA0B;AAC3C,MAAA,gBAAA,CAAiB,aAAa,CAAA;AAC9B,MAAA,WAAA,CAAY,OAAO,aAAa,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,OAAO,aAAa,CAAA;AAC1C,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,aAAa,CAAA;AAE9D,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MAChE,aAAA,EAAY,UAAA;AAAA,MAGZ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,QAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,SAAA,EAAU,QAAA;AAAA,YACV,eAAA;AAAA,YACA,KAAA,EAAO,aAAA;AAAA,YACP,KAAA,EAAO,aAAA;AAAA,YACP,UAAA,EAAY,WAAA,CAAY,QAAA,CAAS,aAAA,CAAc,EAAE,CAAA;AAAA,YACjD,SAAS,MAAM;AACb,cAAA,WAAA,CAAY,eAAe,aAAa,CAAA;AAAA,YAC1C,CAAA;AAAA,YACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,cAAA,YAAA,GAAe,eAAe,KAAK,CAAA;AAAA,YACrC,CAAA;AAAA,YACA,aAAa,MAAM;AACjB,cAAA,WAAA,GAAc,aAAa,CAAA;AAAA,YAC7B;AAAA;AAAA,SACF,EACF,CAAA;AAAA,QAGC,UAAA,CAAW,SAAS,CAAA,oBACnB,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,kDAAA;AAAA,cACA,WAAW,GAAG;AAAA,aAChB;AAAA,YAEC,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AACzB,cAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,CAAU,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,MAAM,EAAE,CAAA;AACnE,cAAA,uBACE,GAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBAEC,WAAA,EAAa,CAAA;AAAA,kBACb,SAAA,EAAU,qBAAA;AAAA,kBACV,eAAA;AAAA,kBACA,KAAA;AAAA,kBACA,KAAA,EAAO,aAAA;AAAA,kBACP,WAAA,EAAa,eAAA;AAAA,kBACb,UAAA,EAAY,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAAA,kBACzC,SAAS,MAAM;AACb,oBAAA,oBAAA,CAAqB,OAAO,aAAa,CAAA;AAAA,kBAC3C,CAAA;AAAA,kBACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,oBAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,kBAC7B,CAAA;AAAA,kBACA,aAAa,MAAM;AACjB,oBAAA,WAAA,GAAc,KAAK,CAAA;AAAA,kBACrB;AAAA,iBAAA;AAAA,gBAhBK,KAAA,CAAM;AAAA,eAiBb;AAAA,YAEJ,CAAC;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;AASA,SAAS,cAAA,CAAe;AAAA,EACtB,WAAA,GAAc,CAAA;AAAA,EACd,eAAA,GAAkB,KAAA;AAAA,EAClB,MAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAc;AAChB,CAAA,EAQG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,aAAA,EAAY,UAAA;AAAA,MAEZ,QAAA,kBAAA,IAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM,EAC/D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,qBAClB,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,mDAAA;AAAA,YAEV,QAAA,kBAAA,GAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,WAAA;AAAA,gBACA,eAAA;AAAA,gBACA,KAAA;AAAA,gBACA,KAAA;AAAA,gBACA,UAAA,EAAY,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAAA,gBACzC,SAAS,MAAM;AACb,kBAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,gBAC1B,CAAA;AAAA,gBACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,kBAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,gBAC7B,CAAA;AAAA,gBACA,aAAa,MAAM;AACjB,kBAAA,WAAA,GAAc,KAAK,CAAA;AAAA,gBACrB;AAAA;AAAA;AACF,WAAA;AAAA,UAlBK,KAAA,CAAM;AAAA,SAoBd,CAAA,EACH,CAAA;AAAA,4BACC,gBAAA,EAAA,EAAiB,CAAA;AAAA,4BACjB,YAAA,EAAA,EAAa;AAAA,OAAA,EAChB;AAAA;AAAA,GACF;AAEJ;AAKA,SAAS,eAAA,CAAgB;AAAA,EACvB,WAAA,GAAc,CAAA;AAAA,EACd,OAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM;AACR,CAAA,EAKG;AAED,EAAA,MAAM,YAAA,GAAqB,KAAA,CAAA,OAAA;AAAA,IACzB,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,SAAA,EAAY,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACrE,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,mBAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,EAAE,mBAAA,EAAqB,CAAA,OAAA,EAAU,MAAA,CAAO,OAAO,CAAC,CAAA,iBAAA,CAAA,EAAoB,GACpE,MAAA;AAEN,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAG,MAAA,EAAQ,gBAAA,CAAiB,OAAO,CAAA,EAAG,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MAChE,cAAA,EAAa,MAAA;AAAA,MACb,KAAA,EAAO,mBAAA;AAAA,MAEN,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,GAAA,yBAChB,WAAA,EAAA,EAAsB,KAAA,EAAO,WAAA,EAC5B,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD,CAAA,EAAA,EADjD,GAElB,CACD;AAAA;AAAA,GACH;AAEJ;AAsBA,SAAS,YAAA,CAAa;AAAA,EACpB,WAAA,GAAc,CAAA;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,eAAA,GAAkB,KAAA;AAAA,EAClB,GAAA,GAAM,IAAA;AAAA,EACN,MAAA;AAAA,EACA,MAAA,GAAS,MAAA;AAAA,EACT,OAAA,GAAU,KAAA;AAAA,EACV,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA,EAAa,qBAAA;AAAA,EACb,GAAG;AACL,CAAA,EAAsB;AAIpB,EAAA,MAAM,MAAA;AAAA;AAAA,IAEJ,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,KAAM;AAAA,GAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,kBAAkB,CAAC,eAAA;AAC3C,EAAA,IAAI,cAAA,IAAkB,eAAA,IAAmB,CAAC,MAAA,EAAQ;AAEhD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAU,KAAA,CAAA,QAAA,CAE1D,EAAE,CAAA;AACJ,EAAA,MAAM,cAAc,qBAAA,IAAyB,mBAAA;AAG7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,eAAS,CAAC,CAAA;AAE1D,EAAA,MAAM,WAAA,GAAc,kBAAkB,UAAU,CAAA;AAEhD,EAAA,MAAM,eAAA,GAAwB,KAAA,CAAA,WAAA;AAAA,IAC5B,CAAC,OAAkB,KAAA,KAAkB;AAEnC,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,cAAA,GAAiB,YAAY,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA,GAChD,WAAA,CAAY,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,MAAM,EAAE,CAAA,GAC1C,YAAA,IAAgB,WAAA,CAAY,MAAA,IAAU,YAAA,GACpC,cACA,CAAC,GAAG,WAAA,EAAa,KAAA,CAAM,EAAE,CAAA;AAE/B,QAAA,IAAI,0BAA0B,MAAA,EAAW;AACvC,UAAA,sBAAA,CAAuB,cAAc,CAAA;AAAA,QACvC;AACA,QAAA,iBAAA,GAAoB,cAAc,CAAA;AAAA,MACpC;AAGA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAGA,MAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA;AAAA,MACE,eAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,qBAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA;AACF,GACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAW,uBAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,QAC1C,WAAA,EAAU,eAAA;AAAA,QACV,IAAA,EAAK,OAAA;AAAA,QACJ,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,OAAA;AAAA,YACA,KAAA,EAAO,CAAA;AAAA,YACP;AAAA;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AAGA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,0FAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,YAAA,EAAW,qBAAA;AAAA,QACX,WAAA,EAAU,eAAA;AAAA,QACV,IAAA,EAAK,OAAA;AAAA,QACJ,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAoB;AAAA;AAAA,KAC3D;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,WAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,EAAa,eAAA;AAAA,IACb;AAAA,GACF;AAEA,EAAA,MAAM,gBAAA,GAAgE;AAAA,IACpE,QAAA,kBAAU,GAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,WAAA,EAAa,CAAA;AAAA,IAC3C,QAAA,kBAAU,GAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,WAAA,EAAa,CAAA;AAAA,IAC3C,IAAA,kBAAM,GAAA,CAAC,UAAA,EAAA,EAAY,GAAG,WAAA,EAAa,CAAA;AAAA,IACnC,OAAA,kBAAS,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,WAAA,EAAa;AAAA,GAC3C;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,YAAA,EAAY,CAAA,mBAAA,EAAsB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA,OAAA,CAAA;AAAA,MACvD,sBAAA,EAAqB,SAAA;AAAA,MACrB,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAC1C,aAAA,EAAa,MAAA;AAAA,MACb,WAAA,EAAU,eAAA;AAAA,MACV,IAAA,EAAK,OAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,QAGvB,UAAA,oBACC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,WAAA;AAAA,YACL,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,aAAA;AAAA,YACV,WAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAID,eAAA,oBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,YAAA,EAAc,aAAA;AAAA,YACd,IAAA,EAAM,YAAA;AAAA,YACN,YAAA,EAAc;AAAA;AAAA;AAChB;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-6HEURMY3.js","sourcesContent":["\"use client\"\n\nimport type {\n ImageGalleryGap,\n ImageGalleryItemProps,\n ImageGalleryLayout,\n ImageGalleryProps,\n ImageItem,\n ResponsiveColumns,\n} from \"./ImageGallery.types\"\n\nimport { cva } from \"class-variance-authority\"\nimport { Check } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { AspectRatio } from \"../../primitives/AspectRatio\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"../Carousel\"\nimport { Lightbox } from \"../Lightbox\"\n\n// Gap size mapping\nconst gapClasses: Record<ImageGalleryGap, string> = {\n lg: \"gap-6\",\n md: \"gap-4\",\n sm: \"gap-2\",\n}\n\n// Static column class mappings for Tailwind v4 detection\nconst columnClasses: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n}\n\nconst smColumnClasses: Record<number, string> = {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n}\n\nconst mdColumnClasses: Record<number, string> = {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n}\n\nconst lgColumnClasses: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n}\n\nconst xlColumnClasses: Record<number, string> = {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n}\n\n\n// Generate responsive column classes using static mappings\nfunction getColumnClasses(\n columns: number | ResponsiveColumns | undefined\n): string {\n if (columns === undefined) {\n return \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n }\n\n if (typeof columns === \"number\") {\n return columnClasses[columns] ?? \"grid-cols-4\"\n }\n\n const classes: string[] = []\n if (columns.sm) classes.push(smColumnClasses[columns.sm] ?? \"sm:grid-cols-2\")\n if (columns.md) classes.push(mdColumnClasses[columns.md] ?? \"md:grid-cols-3\")\n if (columns.lg) classes.push(lgColumnClasses[columns.lg] ?? \"lg:grid-cols-4\")\n if (columns.xl) classes.push(xlColumnClasses[columns.xl] ?? \"xl:grid-cols-4\")\n\n return classes.join(\" \") || \"grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n}\n\n// Item variants for consistent styling\nconst imageGalleryItemVariants = cva(\n [\n \"relative overflow-hidden rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-transform duration-200\",\n \"cursor-pointer\",\n ],\n {\n variants: {\n selected: {\n true: \"ring-2 ring-primary ring-offset-2\",\n false: \"\",\n },\n interactive: {\n true: \"hover:scale-[1.02]\",\n false: \"\",\n },\n },\n defaultVariants: {\n selected: false,\n interactive: true,\n },\n }\n)\n\n/**\n * Subscribe an end-of-list sentinel to the viewport so that scrolling it into\n * view fires `onLoadMore`. No observer is created when `onLoadMore` is omitted\n * or when IntersectionObserver is unavailable (SSR / older runtimes).\n */\nfunction useInfiniteScroll(onLoadMore?: () => void) {\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const node = sentinelRef.current\n if (!onLoadMore || !node) return\n if (typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onLoadMore()\n }\n }\n },\n { rootMargin: \"200px\" }\n )\n observer.observe(node)\n\n return () => {\n observer.disconnect()\n }\n }, [onLoadMore])\n\n return sentinelRef\n}\n\n/**\n * Individual gallery item component\n */\nfunction ImageGalleryItem({\n aspectRatio = 1,\n className,\n interactive = true,\n enableSelection = false,\n image,\n index: _index,\n isSelected = false,\n onClick,\n onImageError,\n onImageLoad,\n ...props\n}: ImageGalleryItemProps) {\n const [imageState, setImageState] = React.useState<\n \"error\" | \"loaded\" | \"loading\"\n >(\"loading\")\n\n const handleLoad = React.useCallback(() => {\n setImageState(\"loaded\")\n onImageLoad?.()\n }, [onImageLoad])\n\n const handleError = React.useCallback(() => {\n setImageState(\"error\")\n onImageError?.(new Error(`Failed to load image: ${image.src}`))\n }, [image.src, onImageError])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n },\n [onClick]\n )\n\n return (\n <button\n aria-label={\n enableSelection && isSelected\n ? `${image.alt} (selected)`\n : image.alt\n }\n className={cn(\n imageGalleryItemVariants({\n selected: isSelected,\n interactive,\n }),\n className\n )}\n aria-pressed={enableSelection ? isSelected : undefined}\n data-error={imageState === \"error\" || undefined}\n data-loading={imageState === \"loading\" || undefined}\n data-selected={isSelected || undefined}\n data-slot=\"image-gallery-item\"\n type=\"button\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <AspectRatio ratio={aspectRatio}>\n {imageState === \"loading\" && (\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n )}\n {imageState === \"error\" ? (\n <div className=\"flex h-full w-full items-center justify-center bg-muted text-muted-foreground\">\n <span className=\"text-sm\">Failed to load</span>\n </div>\n ) : (\n <img\n className={cn(\n \"h-full w-full object-cover transition-opacity duration-200\",\n imageState === \"loading\" ? \"opacity-0\" : \"opacity-100\"\n )}\n alt={image.alt}\n data-slot=\"image-gallery-image\"\n loading=\"lazy\"\n src={image.thumbnail ?? image.src}\n onError={handleError}\n onLoad={handleLoad}\n />\n )}\n </AspectRatio>\n\n {/* Selection indicator */}\n {enableSelection && isSelected && (\n <div className=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Check className=\"h-4 w-4\" />\n </div>\n )}\n </button>\n )\n}\n\n/**\n * Grid layout component\n */\nfunction GridLayout({\n aspectRatio = 1,\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n // Only emit inline-style fallback for fixed numeric column counts.\n // For responsive ResponsiveColumns objects, Tailwind classes handle breakpoints —\n // inline style would override them and break responsiveness.\n const inlineGridStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-layout=\"grid\"\n style={inlineGridStyle}\n >\n {images.map((image, index) => (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * Masonry layout component\n * Uses CSS columns for a Pinterest-style layout\n */\nfunction MasonryLayout({\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const columnCount =\n typeof columns === \"number\" ? columns : columns?.lg ?? columns?.md ?? 3\n\n const gapValue = gap === \"sm\" ? \"0.5rem\" : gap === \"lg\" ? \"1.5rem\" : \"1rem\"\n\n return (\n <div\n style={{\n columnCount,\n columnGap: gapValue,\n }}\n className=\"[column-fill:balance]\"\n data-layout=\"masonry\"\n >\n {images.map((image, index) => {\n const aspectRatio =\n image.width && image.height ? image.width / image.height : 1\n\n return (\n <div\n key={image.id}\n style={{\n marginBottom: gapValue,\n }}\n className=\"mb-2 break-inside-avoid md:mb-4 lg:mb-6\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </div>\n )\n })}\n </div>\n )\n}\n\n/**\n * Featured layout component\n * Shows first image large with thumbnails on the side\n */\nfunction FeaturedLayout({\n aspectRatio = 1,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const [featuredIndex, setFeaturedIndex] = React.useState(0)\n\n const handleThumbnailClick = React.useCallback(\n (image: ImageItem, originalIndex: number) => {\n setFeaturedIndex(originalIndex)\n onItemClick(image, originalIndex)\n },\n [onItemClick]\n )\n\n if (images.length === 0) return null\n\n const featuredImage = images[featuredIndex]\n if (!featuredImage) return null\n\n const thumbnails = images.filter((_, i) => i !== featuredIndex)\n\n return (\n <div\n className={cn(\"flex flex-col gap-4 md:flex-row\", gapClasses[gap])}\n data-layout=\"featured\"\n >\n {/* Main featured image */}\n <div className=\"flex-1\">\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n className=\"h-full\"\n enableSelection={enableSelection}\n image={featuredImage}\n index={featuredIndex}\n isSelected={selectedIds.includes(featuredImage.id)}\n onClick={() => {\n onItemClick(featuredImage, featuredIndex)\n }}\n onImageError={(error) => {\n onImageError?.(featuredImage, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(featuredImage)\n }}\n />\n </div>\n\n {/* Thumbnails sidebar */}\n {thumbnails.length > 0 && (\n <div\n className={cn(\n \"flex w-full flex-row md:w-24 md:flex-col lg:w-32\",\n gapClasses[gap]\n )}\n >\n {thumbnails.map((image) => {\n const originalIndex = images.findIndex((img) => img.id === image.id)\n return (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={1}\n className=\"flex-1 md:flex-none\"\n enableSelection={enableSelection}\n image={image}\n index={originalIndex}\n interactive={enableSelection}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n handleThumbnailClick(image, originalIndex)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Carousel layout component\n *\n * Composes the shared Carousel primitive (drag, keyboard arrows, prev/next\n * buttons) instead of re-implementing embla. The horizontal padding leaves\n * room for the absolutely-positioned navigation buttons.\n */\nfunction CarouselLayout({\n aspectRatio = 1,\n enableSelection = false,\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n return (\n <div\n className=\"px-[var(--carousel-button-offset)]\"\n data-layout=\"carousel\"\n >\n <Carousel className=\"w-full\" opts={{ align: \"start\", loop: false }}>\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n key={image.id}\n className=\"basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n </div>\n )\n}\n\n/**\n * Loading skeleton for the gallery\n */\nfunction LoadingSkeleton({\n aspectRatio = 1,\n columns,\n count = 8,\n gap = \"md\",\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n count?: number\n gap?: ImageGalleryGap\n}) {\n // Generate stable keys for skeleton items\n const skeletonKeys = React.useMemo(\n () => Array.from({ length: count }, (_, i) => `skeleton-${String(i)}`),\n [count]\n )\n\n const skeletonInlineStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-loading=\"true\"\n style={skeletonInlineStyle}\n >\n {skeletonKeys.map((key) => (\n <AspectRatio key={key} ratio={aspectRatio}>\n <div className=\"h-full w-full animate-pulse rounded-md bg-muted\" />\n </AspectRatio>\n ))}\n </div>\n )\n}\n\n/**\n * ImageGallery - A component for displaying collections of images in various layouts\n *\n * Composes the {@link Carousel} primitive for the `carousel` layout and the\n * {@link Lightbox} for full-screen viewing (`enableLightbox`). `enableLightbox`\n * and `enableSelection` are mutually exclusive — see the prop docs.\n *\n * @example\n * ```tsx\n * <ImageGallery\n * images={[\n * { id: \"1\", src: \"/photo.jpg\", alt: \"Beach sunset\" },\n * { id: \"2\", src: \"/mountain.jpg\", alt: \"Mountain view\" },\n * ]}\n * layout=\"grid\"\n * columns={{ sm: 2, md: 3, lg: 4 }}\n * gap=\"md\"\n * />\n * ```\n */\nfunction ImageGallery({\n aspectRatio = 1,\n className,\n columns,\n enableLightbox = false,\n enableSelection = false,\n gap = \"md\",\n images,\n layout = \"grid\",\n loading = false,\n maxSelection,\n onImageClick,\n onImageError,\n onImageLoad,\n onLoadMore,\n onSelectionChange,\n ref,\n selectedIds: controlledSelectedIds,\n ...props\n}: ImageGalleryProps) {\n // `enableLightbox` and `enableSelection` are mutually exclusive: a click\n // cannot both open a viewer and toggle a selection. Selection wins; the\n // lightbox is disabled and a dev-only warning flags the misuse.\n const isProd =\n // eslint-disable-next-line @typescript-eslint/dot-notation -- noPropertyAccessFromIndexSignature; bracket access on process.env is required by CI tsc.\n typeof process !== \"undefined\" && process.env[\"NODE_ENV\"] === \"production\"\n const lightboxEnabled = enableLightbox && !enableSelection\n if (enableLightbox && enableSelection && !isProd) {\n\n console.warn(\n \"<ImageGallery> received both `enableLightbox` and `enableSelection`. They are mutually exclusive; `enableSelection` takes precedence and the lightbox is disabled. Enable only one.\"\n )\n }\n\n // Internal selection state when uncontrolled\n const [internalSelectedIds, setInternalSelectedIds] = React.useState<\n string[]\n >([])\n const selectedIds = controlledSelectedIds ?? internalSelectedIds\n\n // Lightbox state — index of the image to open in the full-screen viewer\n const [lightboxOpen, setLightboxOpen] = React.useState(false)\n const [lightboxIndex, setLightboxIndex] = React.useState(0)\n\n const sentinelRef = useInfiniteScroll(onLoadMore)\n\n const handleItemClick = React.useCallback(\n (image: ImageItem, index: number) => {\n // Handle selection mode\n if (enableSelection) {\n const newSelectedIds = selectedIds.includes(image.id)\n ? selectedIds.filter((id) => id !== image.id)\n : maxSelection && selectedIds.length >= maxSelection\n ? selectedIds // Don't add if at max\n : [...selectedIds, image.id]\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n }\n\n // Open the lightbox (mutually exclusive with selection)\n if (lightboxEnabled) {\n setLightboxIndex(index)\n setLightboxOpen(true)\n }\n\n // Always call onImageClick callback\n onImageClick?.(image, index)\n },\n [\n enableSelection,\n selectedIds,\n maxSelection,\n controlledSelectedIds,\n onSelectionChange,\n lightboxEnabled,\n onImageClick,\n ]\n )\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n aria-busy=\"true\"\n aria-label=\"Image gallery loading\"\n className={cn(\"relative w-full\", className)}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <LoadingSkeleton\n aspectRatio={aspectRatio}\n columns={columns}\n count={8}\n gap={gap}\n />\n </div>\n )\n }\n\n // Empty state\n if (images.length === 0) {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-h-52 items-center justify-center rounded-lg border-2 border-dashed border-muted\",\n className\n )}\n aria-label=\"Empty image gallery\"\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <p className=\"text-muted-foreground\">No images to display</p>\n </div>\n )\n }\n\n const layoutProps = {\n aspectRatio,\n columns,\n enableSelection,\n gap,\n images,\n onImageError,\n onImageLoad,\n onItemClick: handleItemClick,\n selectedIds,\n }\n\n const layoutComponents: Record<ImageGalleryLayout, React.ReactNode> = {\n carousel: <CarouselLayout {...layoutProps} />,\n featured: <FeaturedLayout {...layoutProps} />,\n grid: <GridLayout {...layoutProps} />,\n masonry: <MasonryLayout {...layoutProps} />,\n }\n\n return (\n <div\n ref={ref}\n aria-label={`Image gallery with ${String(images.length)} images`}\n aria-roledescription=\"gallery\"\n className={cn(\"relative w-full\", className)}\n data-layout={layout}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n {layoutComponents[layout]}\n\n {/* Infinite-scroll sentinel — observed only when onLoadMore is set */}\n {onLoadMore && (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"h-px w-full\"\n data-slot=\"image-gallery-sentinel\"\n />\n )}\n\n {/* Full-screen viewer — composed from the shared Lightbox primitive */}\n {lightboxEnabled && (\n <Lightbox\n images={images}\n initialIndex={lightboxIndex}\n open={lightboxOpen}\n onOpenChange={setLightboxOpen}\n />\n )}\n </div>\n )\n}\n\nexport { ImageGallery, ImageGalleryItem }\n"]}
@@ -146,6 +146,7 @@ function DateRangePresets({
146
146
  }
147
147
  var defaultPresets = [
148
148
  {
149
+ key: "today",
149
150
  label: "Today",
150
151
  getValue: () => {
151
152
  const today = startOfDay(/* @__PURE__ */ new Date());
@@ -153,6 +154,7 @@ var defaultPresets = [
153
154
  }
154
155
  },
155
156
  {
157
+ key: "yesterday",
156
158
  label: "Yesterday",
157
159
  getValue: () => {
158
160
  const yesterday = subDays(/* @__PURE__ */ new Date(), 1);
@@ -160,6 +162,7 @@ var defaultPresets = [
160
162
  }
161
163
  },
162
164
  {
165
+ key: "thisWeek",
163
166
  label: "This week",
164
167
  getValue: () => ({
165
168
  from: startOfWeek(/* @__PURE__ */ new Date(), { weekStartsOn: 0 }),
@@ -167,6 +170,7 @@ var defaultPresets = [
167
170
  })
168
171
  },
169
172
  {
173
+ key: "last7Days",
170
174
  label: "Last 7 days",
171
175
  getValue: () => ({
172
176
  from: startOfDay(subDays(/* @__PURE__ */ new Date(), 6)),
@@ -174,6 +178,7 @@ var defaultPresets = [
174
178
  })
175
179
  },
176
180
  {
181
+ key: "last14Days",
177
182
  label: "Last 14 days",
178
183
  getValue: () => ({
179
184
  from: startOfDay(subDays(/* @__PURE__ */ new Date(), 13)),
@@ -181,6 +186,7 @@ var defaultPresets = [
181
186
  })
182
187
  },
183
188
  {
189
+ key: "last30Days",
184
190
  label: "Last 30 days",
185
191
  getValue: () => ({
186
192
  from: startOfDay(subDays(/* @__PURE__ */ new Date(), 29)),
@@ -188,6 +194,7 @@ var defaultPresets = [
188
194
  })
189
195
  },
190
196
  {
197
+ key: "thisMonth",
191
198
  label: "This month",
192
199
  getValue: () => ({
193
200
  from: startOfMonth(/* @__PURE__ */ new Date()),
@@ -195,6 +202,7 @@ var defaultPresets = [
195
202
  })
196
203
  },
197
204
  {
205
+ key: "lastMonth",
198
206
  label: "Last month",
199
207
  getValue: () => {
200
208
  const lastMonth = subMonths(/* @__PURE__ */ new Date(), 1);
@@ -205,6 +213,7 @@ var defaultPresets = [
205
213
  }
206
214
  },
207
215
  {
216
+ key: "thisYear",
208
217
  label: "This year",
209
218
  getValue: () => ({
210
219
  from: startOfYear(/* @__PURE__ */ new Date()),
@@ -212,6 +221,7 @@ var defaultPresets = [
212
221
  })
213
222
  },
214
223
  {
224
+ key: "lastYear",
215
225
  label: "Last year",
216
226
  getValue: () => {
217
227
  const lastYear = subYears(/* @__PURE__ */ new Date(), 1);
@@ -222,13 +232,43 @@ var defaultPresets = [
222
232
  }
223
233
  },
224
234
  {
235
+ key: "allTime",
225
236
  label: "All time",
226
237
  getValue: () => ({
227
238
  from: void 0,
228
239
  to: void 0
229
240
  })
241
+ },
242
+ {
243
+ key: "custom",
244
+ label: "Custom",
245
+ getValue: () => ({
246
+ from: void 0,
247
+ to: void 0
248
+ })
230
249
  }
231
250
  ];
251
+ var presetLabels = {
252
+ pt: {
253
+ today: "Hoje",
254
+ yesterday: "Ontem",
255
+ thisWeek: "Esta semana",
256
+ last7Days: "\xDAltimos 7 dias",
257
+ last14Days: "\xDAltimos 14 dias",
258
+ last30Days: "\xDAltimos 30 dias",
259
+ thisMonth: "Este m\xEAs",
260
+ lastMonth: "M\xEAs passado",
261
+ thisYear: "Este ano",
262
+ lastYear: "Ano passado",
263
+ allTime: "Todo o per\xEDodo",
264
+ custom: "Fixo"
265
+ }
266
+ };
267
+ function resolvePresetLabel(preset, localeCode) {
268
+ const lang = localeCode?.split("-")[0];
269
+ const translated = lang && preset.key ? presetLabels[lang]?.[preset.key] : void 0;
270
+ return translated ?? preset.label;
271
+ }
232
272
  function DateRangePicker({
233
273
  ref,
234
274
  className,
@@ -360,11 +400,15 @@ function DateRangePicker({
360
400
  [minDate, maxDate, disabledDates]
361
401
  );
362
402
  const calendarMonth = month ?? displayRange?.from ?? minDate;
403
+ const localizedPresets = presets.map((preset) => ({
404
+ ...preset,
405
+ label: resolvePresetLabel(preset, locale?.code)
406
+ }));
363
407
  const calendarContent = /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row", children: [
364
408
  showPresets && presets.length > 0 && /* @__PURE__ */ jsx(
365
409
  DateRangePresets,
366
410
  {
367
- presets,
411
+ presets: localizedPresets,
368
412
  selectedPreset,
369
413
  onSelect: handlePresetSelect
370
414
  }
@@ -412,6 +456,7 @@ function DateRangePicker({
412
456
  {
413
457
  disabled: !pendingRange?.from,
414
458
  size: "sm",
459
+ variant: "primary",
415
460
  onClick: handleApply,
416
461
  children: "Apply"
417
462
  }
@@ -651,5 +696,5 @@ function DateRangeInput({
651
696
  }
652
697
 
653
698
  export { DateRangeInput, DateRangePicker, DateRangePresets, dateRangeInputContainerVariants, dateRangeInputFieldVariants, dateRangePickerFooterVariants, dateRangePickerTriggerVariants, dateRangePresetVariants, dateRangePresetsContainerVariants, defaultPresets };
654
- //# sourceMappingURL=chunk-ZS2WS5NJ.js.map
655
- //# sourceMappingURL=chunk-ZS2WS5NJ.js.map
699
+ //# sourceMappingURL=chunk-AVR3LVOQ.js.map
700
+ //# sourceMappingURL=chunk-AVR3LVOQ.js.map