@etus/ui 0.4.0-beta.5 → 0.4.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-2HM5Z2YP.js → chunk-2YWWZEPE.js} +3 -3
- package/dist/{chunk-2HM5Z2YP.js.map → chunk-2YWWZEPE.js.map} +1 -1
- package/dist/{chunk-F6ZKBK5B.js → chunk-5GE3BQA7.js} +9 -4
- package/dist/chunk-5GE3BQA7.js.map +1 -0
- package/dist/{chunk-QZWKXUZP.js → chunk-6ELVWWIA.js} +3 -3
- package/dist/{chunk-QZWKXUZP.js.map → chunk-6ELVWWIA.js.map} +1 -1
- package/dist/{chunk-3RJEA2MM.js → chunk-6HEURMY3.js} +102 -65
- package/dist/chunk-6HEURMY3.js.map +1 -0
- package/dist/{chunk-ZS2WS5NJ.js → chunk-AVR3LVOQ.js} +48 -3
- package/dist/chunk-AVR3LVOQ.js.map +1 -0
- package/dist/{chunk-HT5XM6XK.js → chunk-FCT6FEEZ.js} +4 -4
- package/dist/{chunk-HT5XM6XK.js.map → chunk-FCT6FEEZ.js.map} +1 -1
- package/dist/{chunk-XXFKDEFH.js → chunk-JUTPDS4E.js} +7 -11
- package/dist/chunk-JUTPDS4E.js.map +1 -0
- package/dist/{chunk-DDR24GOP.js → chunk-L3Z5FAJE.js} +67 -51
- package/dist/chunk-L3Z5FAJE.js.map +1 -0
- package/dist/{chunk-RVUO7SDG.js → chunk-LS3WD6IZ.js} +63 -28
- package/dist/chunk-LS3WD6IZ.js.map +1 -0
- package/dist/{chunk-32IJQOUV.js → chunk-OTSK2KAI.js} +3 -3
- package/dist/{chunk-32IJQOUV.js.map → chunk-OTSK2KAI.js.map} +1 -1
- package/dist/{chunk-5YDFC74M.js → chunk-XD5LE64P.js} +7 -6
- package/dist/chunk-XD5LE64P.js.map +1 -0
- package/dist/{chunk-CSXT7SKR.js → chunk-YCEZH35U.js} +18 -4
- package/dist/chunk-YCEZH35U.js.map +1 -0
- package/dist/{chunk-2D6OFVPN.js → chunk-YWA63YN3.js} +22 -2
- package/dist/chunk-YWA63YN3.js.map +1 -0
- package/dist/{chunk-CP2PEDG2.js → chunk-Z4KW5VW6.js} +3 -3
- package/dist/chunk-Z4KW5VW6.js.map +1 -0
- package/dist/components/advanced/Calendar/index.js +1 -1
- package/dist/components/advanced/EventCalendar/index.js +1 -1
- package/dist/components/advanced/FilterBuilder/index.js +1 -1
- package/dist/components/advanced/ReportBuilder/index.js +2 -2
- package/dist/components/advanced/index.js +13 -13
- package/dist/components/data-display/Carousel/index.js +1 -1
- package/dist/components/data-display/ChartCard/index.js +1 -3
- package/dist/components/data-display/DashboardFilterbar/index.js +3 -3
- package/dist/components/data-display/DataTable/FilterBuilder/index.js +1 -1
- package/dist/components/data-display/DataTable/index.js +1 -1
- package/dist/components/data-display/ImageGallery/index.js +8 -1
- package/dist/components/data-display/KPICard/index.js +2 -2
- package/dist/components/data-display/index.js +25 -25
- package/dist/components/feedback/AlertDialog/index.js +1 -1
- package/dist/components/feedback/ConfirmModal/index.js +1 -1
- package/dist/components/feedback/Modal/index.js +1 -1
- package/dist/components/feedback/index.js +5 -5
- package/dist/components/forms/ColorPicker/index.js +1 -1
- package/dist/components/forms/DatePicker/index.js +2 -2
- package/dist/components/forms/DateRangePicker/index.js +2 -2
- package/dist/components/forms/InputGroup/index.js +1 -1
- package/dist/components/forms/InputOTPField/index.js +2 -2
- package/dist/components/forms/Slider/index.js +1 -1
- package/dist/components/forms/index.js +24 -24
- package/dist/components/index.js +121 -121
- package/dist/components/layout/Panel/index.js +2 -1
- package/dist/components/layout/index.js +4 -4
- package/dist/components/navigation/Menu/index.js +2 -1
- package/dist/components/navigation/MobileSidebar/index.js +1 -1
- package/dist/components/navigation/Pagination/index.js +1 -1
- package/dist/components/navigation/Sidebar/index.js +3 -3
- package/dist/components/navigation/Toolbar/index.js +1 -1
- package/dist/components/navigation/index.js +12 -11
- package/dist/components/primitives/Button/index.js +1 -1
- package/dist/components/primitives/ConfirmButton/index.js +1 -1
- package/dist/components/primitives/index.js +10 -10
- package/dist/components/workflow/ApprovalFlow/index.js +1 -1
- package/dist/components/workflow/CommentSystem/index.js +1 -1
- package/dist/components/workflow/Dashboard/index.js +1 -1
- package/dist/components/workflow/DashboardBuilder/index.js +1 -1
- package/dist/components/workflow/KanbanBoard/index.js +1 -1
- package/dist/components/workflow/ReportGenerator/index.js +1 -1
- package/dist/components/workflow/Wizard/index.js +1 -1
- package/dist/components/workflow/index.js +9 -9
- package/dist/index.d.ts +163 -58
- package/dist/index.js +123 -123
- package/dist/styles.css +19 -9
- package/package.json +2 -2
- package/dist/chunk-2D6OFVPN.js.map +0 -1
- package/dist/chunk-3RJEA2MM.js.map +0 -1
- package/dist/chunk-5YDFC74M.js.map +0 -1
- package/dist/chunk-CP2PEDG2.js.map +0 -1
- package/dist/chunk-CSXT7SKR.js.map +0 -1
- package/dist/chunk-DDR24GOP.js.map +0 -1
- package/dist/chunk-F6ZKBK5B.js.map +0 -1
- package/dist/chunk-RVUO7SDG.js.map +0 -1
- package/dist/chunk-XXFKDEFH.js.map +0 -1
- package/dist/chunk-ZS2WS5NJ.js.map +0 -1
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
377
|
-
"aria-roledescription": "carousel",
|
|
378
|
-
className: "overflow-hidden",
|
|
386
|
+
className: "px-[var(--carousel-button-offset)]",
|
|
379
387
|
"data-layout": "carousel",
|
|
380
|
-
children: /* @__PURE__ */
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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__ */
|
|
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:
|
|
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-
|
|
560
|
-
//# sourceMappingURL=chunk-
|
|
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":"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","file":"chunk-6HEURMY3.js","sourcesContent":["\"use client\"\n\nimport type {\n ImageGalleryGap,\n ImageGalleryItemProps,\n ImageGalleryLayout,\n ImageGalleryProps,\n ImageItem,\n ResponsiveColumns,\n} from \"./ImageGallery.types\"\n\nimport { cva } from \"class-variance-authority\"\nimport { Check } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { cn } from \"../../../lib/utils\"\nimport { AspectRatio } from \"../../primitives/AspectRatio\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"../Carousel\"\nimport { Lightbox } from \"../Lightbox\"\n\n// Gap size mapping\nconst gapClasses: Record<ImageGalleryGap, string> = {\n lg: \"gap-6\",\n md: \"gap-4\",\n sm: \"gap-2\",\n}\n\n// Static column class mappings for Tailwind v4 detection\nconst columnClasses: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n}\n\nconst smColumnClasses: Record<number, string> = {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n}\n\nconst mdColumnClasses: Record<number, string> = {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n}\n\nconst lgColumnClasses: Record<number, string> = {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n}\n\nconst xlColumnClasses: Record<number, string> = {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n}\n\n\n// Generate responsive column classes using static mappings\nfunction getColumnClasses(\n columns: number | ResponsiveColumns | undefined\n): string {\n if (columns === undefined) {\n return \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n }\n\n if (typeof columns === \"number\") {\n return columnClasses[columns] ?? \"grid-cols-4\"\n }\n\n const classes: string[] = []\n if (columns.sm) classes.push(smColumnClasses[columns.sm] ?? \"sm:grid-cols-2\")\n if (columns.md) classes.push(mdColumnClasses[columns.md] ?? \"md:grid-cols-3\")\n if (columns.lg) classes.push(lgColumnClasses[columns.lg] ?? \"lg:grid-cols-4\")\n if (columns.xl) classes.push(xlColumnClasses[columns.xl] ?? \"xl:grid-cols-4\")\n\n return classes.join(\" \") || \"grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n}\n\n// Item variants for consistent styling\nconst imageGalleryItemVariants = cva(\n [\n \"relative overflow-hidden rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n \"transition-transform duration-200\",\n \"cursor-pointer\",\n ],\n {\n variants: {\n selected: {\n true: \"ring-2 ring-primary ring-offset-2\",\n false: \"\",\n },\n interactive: {\n true: \"hover:scale-[1.02]\",\n false: \"\",\n },\n },\n defaultVariants: {\n selected: false,\n interactive: true,\n },\n }\n)\n\n/**\n * Subscribe an end-of-list sentinel to the viewport so that scrolling it into\n * view fires `onLoadMore`. No observer is created when `onLoadMore` is omitted\n * or when IntersectionObserver is unavailable (SSR / older runtimes).\n */\nfunction useInfiniteScroll(onLoadMore?: () => void) {\n const sentinelRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const node = sentinelRef.current\n if (!onLoadMore || !node) return\n if (typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onLoadMore()\n }\n }\n },\n { rootMargin: \"200px\" }\n )\n observer.observe(node)\n\n return () => {\n observer.disconnect()\n }\n }, [onLoadMore])\n\n return sentinelRef\n}\n\n/**\n * Individual gallery item component\n */\nfunction ImageGalleryItem({\n aspectRatio = 1,\n className,\n interactive = true,\n enableSelection = false,\n image,\n index: _index,\n isSelected = false,\n onClick,\n onImageError,\n onImageLoad,\n ...props\n}: ImageGalleryItemProps) {\n const [imageState, setImageState] = React.useState<\n \"error\" | \"loaded\" | \"loading\"\n >(\"loading\")\n\n const handleLoad = React.useCallback(() => {\n setImageState(\"loaded\")\n onImageLoad?.()\n }, [onImageLoad])\n\n const handleError = React.useCallback(() => {\n setImageState(\"error\")\n onImageError?.(new Error(`Failed to load image: ${image.src}`))\n }, [image.src, onImageError])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault()\n onClick?.()\n }\n },\n [onClick]\n )\n\n return (\n <button\n aria-label={\n enableSelection && isSelected\n ? `${image.alt} (selected)`\n : image.alt\n }\n className={cn(\n imageGalleryItemVariants({\n selected: isSelected,\n interactive,\n }),\n className\n )}\n aria-pressed={enableSelection ? isSelected : undefined}\n data-error={imageState === \"error\" || undefined}\n data-loading={imageState === \"loading\" || undefined}\n data-selected={isSelected || undefined}\n data-slot=\"image-gallery-item\"\n type=\"button\"\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <AspectRatio ratio={aspectRatio}>\n {imageState === \"loading\" && (\n <div className=\"absolute inset-0 animate-pulse bg-muted\" />\n )}\n {imageState === \"error\" ? (\n <div className=\"flex h-full w-full items-center justify-center bg-muted text-muted-foreground\">\n <span className=\"text-sm\">Failed to load</span>\n </div>\n ) : (\n <img\n className={cn(\n \"h-full w-full object-cover transition-opacity duration-200\",\n imageState === \"loading\" ? \"opacity-0\" : \"opacity-100\"\n )}\n alt={image.alt}\n data-slot=\"image-gallery-image\"\n loading=\"lazy\"\n src={image.thumbnail ?? image.src}\n onError={handleError}\n onLoad={handleLoad}\n />\n )}\n </AspectRatio>\n\n {/* Selection indicator */}\n {enableSelection && isSelected && (\n <div className=\"absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <Check className=\"h-4 w-4\" />\n </div>\n )}\n </button>\n )\n}\n\n/**\n * Grid layout component\n */\nfunction GridLayout({\n aspectRatio = 1,\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n // Only emit inline-style fallback for fixed numeric column counts.\n // For responsive ResponsiveColumns objects, Tailwind classes handle breakpoints —\n // inline style would override them and break responsiveness.\n const inlineGridStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-layout=\"grid\"\n style={inlineGridStyle}\n >\n {images.map((image, index) => (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n ))}\n </div>\n )\n}\n\n/**\n * Masonry layout component\n * Uses CSS columns for a Pinterest-style layout\n */\nfunction MasonryLayout({\n columns,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n columns?: number | ResponsiveColumns\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const columnCount =\n typeof columns === \"number\" ? columns : columns?.lg ?? columns?.md ?? 3\n\n const gapValue = gap === \"sm\" ? \"0.5rem\" : gap === \"lg\" ? \"1.5rem\" : \"1rem\"\n\n return (\n <div\n style={{\n columnCount,\n columnGap: gapValue,\n }}\n className=\"[column-fill:balance]\"\n data-layout=\"masonry\"\n >\n {images.map((image, index) => {\n const aspectRatio =\n image.width && image.height ? image.width / image.height : 1\n\n return (\n <div\n key={image.id}\n style={{\n marginBottom: gapValue,\n }}\n className=\"mb-2 break-inside-avoid md:mb-4 lg:mb-6\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </div>\n )\n })}\n </div>\n )\n}\n\n/**\n * Featured layout component\n * Shows first image large with thumbnails on the side\n */\nfunction FeaturedLayout({\n aspectRatio = 1,\n enableSelection = false,\n gap = \"md\",\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n gap?: ImageGalleryGap\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n const [featuredIndex, setFeaturedIndex] = React.useState(0)\n\n const handleThumbnailClick = React.useCallback(\n (image: ImageItem, originalIndex: number) => {\n setFeaturedIndex(originalIndex)\n onItemClick(image, originalIndex)\n },\n [onItemClick]\n )\n\n if (images.length === 0) return null\n\n const featuredImage = images[featuredIndex]\n if (!featuredImage) return null\n\n const thumbnails = images.filter((_, i) => i !== featuredIndex)\n\n return (\n <div\n className={cn(\"flex flex-col gap-4 md:flex-row\", gapClasses[gap])}\n data-layout=\"featured\"\n >\n {/* Main featured image */}\n <div className=\"flex-1\">\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n className=\"h-full\"\n enableSelection={enableSelection}\n image={featuredImage}\n index={featuredIndex}\n isSelected={selectedIds.includes(featuredImage.id)}\n onClick={() => {\n onItemClick(featuredImage, featuredIndex)\n }}\n onImageError={(error) => {\n onImageError?.(featuredImage, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(featuredImage)\n }}\n />\n </div>\n\n {/* Thumbnails sidebar */}\n {thumbnails.length > 0 && (\n <div\n className={cn(\n \"flex w-full flex-row md:w-24 md:flex-col lg:w-32\",\n gapClasses[gap]\n )}\n >\n {thumbnails.map((image) => {\n const originalIndex = images.findIndex((img) => img.id === image.id)\n return (\n <ImageGalleryItem\n key={image.id}\n aspectRatio={1}\n className=\"flex-1 md:flex-none\"\n enableSelection={enableSelection}\n image={image}\n index={originalIndex}\n interactive={enableSelection}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n handleThumbnailClick(image, originalIndex)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Carousel layout component\n *\n * Composes the shared Carousel primitive (drag, keyboard arrows, prev/next\n * buttons) instead of re-implementing embla. The horizontal padding leaves\n * room for the absolutely-positioned navigation buttons.\n */\nfunction CarouselLayout({\n aspectRatio = 1,\n enableSelection = false,\n images,\n onImageError,\n onImageLoad,\n onItemClick,\n selectedIds = [],\n}: {\n aspectRatio?: number\n enableSelection?: boolean\n images: ImageItem[]\n onImageError?: (image: ImageItem, error: Error) => void\n onImageLoad?: (image: ImageItem) => void\n onItemClick: (image: ImageItem, index: number) => void\n selectedIds?: string[]\n}) {\n return (\n <div\n className=\"px-[var(--carousel-button-offset)]\"\n data-layout=\"carousel\"\n >\n <Carousel className=\"w-full\" opts={{ align: \"start\", loop: false }}>\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n key={image.id}\n className=\"basis-full sm:basis-1/2 md:basis-1/3 lg:basis-1/4\"\n >\n <ImageGalleryItem\n aspectRatio={aspectRatio}\n enableSelection={enableSelection}\n image={image}\n index={index}\n isSelected={selectedIds.includes(image.id)}\n onClick={() => {\n onItemClick(image, index)\n }}\n onImageError={(error) => {\n onImageError?.(image, error)\n }}\n onImageLoad={() => {\n onImageLoad?.(image)\n }}\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n </div>\n )\n}\n\n/**\n * Loading skeleton for the gallery\n */\nfunction LoadingSkeleton({\n aspectRatio = 1,\n columns,\n count = 8,\n gap = \"md\",\n}: {\n aspectRatio?: number\n columns?: number | ResponsiveColumns\n count?: number\n gap?: ImageGalleryGap\n}) {\n // Generate stable keys for skeleton items\n const skeletonKeys = React.useMemo(\n () => Array.from({ length: count }, (_, i) => `skeleton-${String(i)}`),\n [count]\n )\n\n const skeletonInlineStyle =\n typeof columns === \"number\"\n ? { gridTemplateColumns: `repeat(${String(columns)}, minmax(0, 1fr))` }\n : undefined\n\n return (\n <div\n className={cn(\"grid\", getColumnClasses(columns), gapClasses[gap])}\n data-loading=\"true\"\n style={skeletonInlineStyle}\n >\n {skeletonKeys.map((key) => (\n <AspectRatio key={key} ratio={aspectRatio}>\n <div className=\"h-full w-full animate-pulse rounded-md bg-muted\" />\n </AspectRatio>\n ))}\n </div>\n )\n}\n\n/**\n * ImageGallery - A component for displaying collections of images in various layouts\n *\n * Composes the {@link Carousel} primitive for the `carousel` layout and the\n * {@link Lightbox} for full-screen viewing (`enableLightbox`). `enableLightbox`\n * and `enableSelection` are mutually exclusive — see the prop docs.\n *\n * @example\n * ```tsx\n * <ImageGallery\n * images={[\n * { id: \"1\", src: \"/photo.jpg\", alt: \"Beach sunset\" },\n * { id: \"2\", src: \"/mountain.jpg\", alt: \"Mountain view\" },\n * ]}\n * layout=\"grid\"\n * columns={{ sm: 2, md: 3, lg: 4 }}\n * gap=\"md\"\n * />\n * ```\n */\nfunction ImageGallery({\n aspectRatio = 1,\n className,\n columns,\n enableLightbox = false,\n enableSelection = false,\n gap = \"md\",\n images,\n layout = \"grid\",\n loading = false,\n maxSelection,\n onImageClick,\n onImageError,\n onImageLoad,\n onLoadMore,\n onSelectionChange,\n ref,\n selectedIds: controlledSelectedIds,\n ...props\n}: ImageGalleryProps) {\n // `enableLightbox` and `enableSelection` are mutually exclusive: a click\n // cannot both open a viewer and toggle a selection. Selection wins; the\n // lightbox is disabled and a dev-only warning flags the misuse.\n const isProd =\n // eslint-disable-next-line @typescript-eslint/dot-notation -- noPropertyAccessFromIndexSignature; bracket access on process.env is required by CI tsc.\n typeof process !== \"undefined\" && process.env[\"NODE_ENV\"] === \"production\"\n const lightboxEnabled = enableLightbox && !enableSelection\n if (enableLightbox && enableSelection && !isProd) {\n\n console.warn(\n \"<ImageGallery> received both `enableLightbox` and `enableSelection`. They are mutually exclusive; `enableSelection` takes precedence and the lightbox is disabled. Enable only one.\"\n )\n }\n\n // Internal selection state when uncontrolled\n const [internalSelectedIds, setInternalSelectedIds] = React.useState<\n string[]\n >([])\n const selectedIds = controlledSelectedIds ?? internalSelectedIds\n\n // Lightbox state — index of the image to open in the full-screen viewer\n const [lightboxOpen, setLightboxOpen] = React.useState(false)\n const [lightboxIndex, setLightboxIndex] = React.useState(0)\n\n const sentinelRef = useInfiniteScroll(onLoadMore)\n\n const handleItemClick = React.useCallback(\n (image: ImageItem, index: number) => {\n // Handle selection mode\n if (enableSelection) {\n const newSelectedIds = selectedIds.includes(image.id)\n ? selectedIds.filter((id) => id !== image.id)\n : maxSelection && selectedIds.length >= maxSelection\n ? selectedIds // Don't add if at max\n : [...selectedIds, image.id]\n\n if (controlledSelectedIds === undefined) {\n setInternalSelectedIds(newSelectedIds)\n }\n onSelectionChange?.(newSelectedIds)\n }\n\n // Open the lightbox (mutually exclusive with selection)\n if (lightboxEnabled) {\n setLightboxIndex(index)\n setLightboxOpen(true)\n }\n\n // Always call onImageClick callback\n onImageClick?.(image, index)\n },\n [\n enableSelection,\n selectedIds,\n maxSelection,\n controlledSelectedIds,\n onSelectionChange,\n lightboxEnabled,\n onImageClick,\n ]\n )\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n aria-busy=\"true\"\n aria-label=\"Image gallery loading\"\n className={cn(\"relative w-full\", className)}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <LoadingSkeleton\n aspectRatio={aspectRatio}\n columns={columns}\n count={8}\n gap={gap}\n />\n </div>\n )\n }\n\n // Empty state\n if (images.length === 0) {\n return (\n <div\n ref={ref}\n className={cn(\n \"flex min-h-52 items-center justify-center rounded-lg border-2 border-dashed border-muted\",\n className\n )}\n aria-label=\"Empty image gallery\"\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n <p className=\"text-muted-foreground\">No images to display</p>\n </div>\n )\n }\n\n const layoutProps = {\n aspectRatio,\n columns,\n enableSelection,\n gap,\n images,\n onImageError,\n onImageLoad,\n onItemClick: handleItemClick,\n selectedIds,\n }\n\n const layoutComponents: Record<ImageGalleryLayout, React.ReactNode> = {\n carousel: <CarouselLayout {...layoutProps} />,\n featured: <FeaturedLayout {...layoutProps} />,\n grid: <GridLayout {...layoutProps} />,\n masonry: <MasonryLayout {...layoutProps} />,\n }\n\n return (\n <div\n ref={ref}\n aria-label={`Image gallery with ${String(images.length)} images`}\n aria-roledescription=\"gallery\"\n className={cn(\"relative w-full\", className)}\n data-layout={layout}\n data-slot=\"image-gallery\"\n role=\"group\"\n {...props}\n >\n {layoutComponents[layout]}\n\n {/* Infinite-scroll sentinel — observed only when onLoadMore is set */}\n {onLoadMore && (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"h-px w-full\"\n data-slot=\"image-gallery-sentinel\"\n />\n )}\n\n {/* Full-screen viewer — composed from the shared Lightbox primitive */}\n {lightboxEnabled && (\n <Lightbox\n images={images}\n initialIndex={lightboxIndex}\n open={lightboxOpen}\n onOpenChange={setLightboxOpen}\n />\n )}\n </div>\n )\n}\n\nexport { ImageGallery, ImageGalleryItem }\n"]}
|
|
@@ -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-
|
|
655
|
-
//# sourceMappingURL=chunk-
|
|
699
|
+
//# sourceMappingURL=chunk-AVR3LVOQ.js.map
|
|
700
|
+
//# sourceMappingURL=chunk-AVR3LVOQ.js.map
|