@underverse-ui/underverse 0.1.4 → 0.1.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.
package/dist/index.js CHANGED
@@ -2485,7 +2485,7 @@ var variantIcons = {
2485
2485
  warning: /* @__PURE__ */ jsx18(WarningIcon, { className: "h-4 w-4 text-warning" }),
2486
2486
  error: /* @__PURE__ */ jsx18(ErrorIcon, { className: "h-4 w-4 text-destructive" })
2487
2487
  };
2488
- var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions }) => {
2488
+ var Alert = ({ title, description, variant = "default", className, icon, dismissible = false, onClose, actions, closeAriaLabel }) => {
2489
2489
  const [open, setOpen] = useState13(true);
2490
2490
  const t = useTranslations2("Common");
2491
2491
  if (!open) return null;
@@ -2511,7 +2511,7 @@ var Alert = ({ title, description, variant = "default", className, icon, dismiss
2511
2511
  {
2512
2512
  onClick: handleClose,
2513
2513
  className: "rounded-md p-1 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2514
- "aria-label": t("closeAlert"),
2514
+ "aria-label": closeAriaLabel || t("closeAlert"),
2515
2515
  children: /* @__PURE__ */ jsx18(X6, { className: "h-4 w-4" })
2516
2516
  }
2517
2517
  )
@@ -3572,7 +3572,8 @@ var Pagination = ({
3572
3572
  pageSize,
3573
3573
  pageSizeOptions,
3574
3574
  onPageSizeChange,
3575
- totalItems
3575
+ totalItems,
3576
+ labels
3576
3577
  }) => {
3577
3578
  const t = useTranslations4("Pagination");
3578
3579
  const createPageArray = () => {
@@ -3626,8 +3627,8 @@ var Pagination = ({
3626
3627
  }
3627
3628
  };
3628
3629
  if (totalPages <= 1) return null;
3629
- return /* @__PURE__ */ jsxs22("nav", { className: cn("flex flex-col gap-4", className), "aria-label": t("navigationLabel"), children: [
3630
- showInfo && totalItems && /* @__PURE__ */ jsx24("div", { className: "text-sm text-muted-foreground text-center", children: t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
3630
+ return /* @__PURE__ */ jsxs22("nav", { className: cn("flex flex-col gap-4", className), "aria-label": labels?.navigationLabel || t("navigationLabel"), children: [
3631
+ showInfo && totalItems && /* @__PURE__ */ jsx24("div", { className: "text-sm text-muted-foreground text-center", children: labels?.showingResults ? labels.showingResults({ startItem: startItem || 0, endItem: endItem || 0, totalItems }) : t("showingResults", { startItem: startItem || 0, endItem: endItem || 0, totalItems }) }),
3631
3632
  /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-1", children: [
3632
3633
  showFirstLast && /* @__PURE__ */ jsx24(
3633
3634
  Button_default,
@@ -3638,8 +3639,8 @@ var Pagination = ({
3638
3639
  onClick: () => onChange(1),
3639
3640
  disabled: disabled || page === 1,
3640
3641
  className: "hidden sm:flex",
3641
- title: t("firstPage"),
3642
- "aria-label": t("firstPage"),
3642
+ title: labels?.firstPage || t("firstPage"),
3643
+ "aria-label": labels?.firstPage || t("firstPage"),
3643
3644
  "aria-disabled": disabled || page === 1
3644
3645
  }
3645
3646
  ),
@@ -3651,10 +3652,10 @@ var Pagination = ({
3651
3652
  icon: ChevronLeft,
3652
3653
  onClick: () => onChange(Math.max(1, page - 1)),
3653
3654
  disabled: disabled || page === 1,
3654
- title: t("previousPage"),
3655
- "aria-label": t("previousPage"),
3655
+ title: labels?.previousPage || t("previousPage"),
3656
+ "aria-label": labels?.previousPage || t("previousPage"),
3656
3657
  "aria-disabled": disabled || page === 1,
3657
- children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: t("previous") })
3658
+ children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.previous || t("previous") })
3658
3659
  }
3659
3660
  ),
3660
3661
  showPageNumbers && createPageArray().map((p, i) => {
@@ -3671,7 +3672,7 @@ var Pagination = ({
3671
3672
  onClick: () => onChange(pageNumber),
3672
3673
  disabled,
3673
3674
  className: cn("min-w-[2.5rem]", isActive && "font-semibold"),
3674
- "aria-label": t("pageNumber", { page: pageNumber }),
3675
+ "aria-label": labels?.pageNumber ? labels.pageNumber(pageNumber) : t("pageNumber", { page: pageNumber }),
3675
3676
  "aria-current": isActive ? "page" : void 0,
3676
3677
  children: pageNumber
3677
3678
  },
@@ -3686,10 +3687,10 @@ var Pagination = ({
3686
3687
  iconRight: ChevronRight2,
3687
3688
  onClick: () => onChange(Math.min(totalPages, page + 1)),
3688
3689
  disabled: disabled || page === totalPages,
3689
- title: t("nextPage"),
3690
- "aria-label": t("nextPage"),
3690
+ title: labels?.nextPage || t("nextPage"),
3691
+ "aria-label": labels?.nextPage || t("nextPage"),
3691
3692
  "aria-disabled": disabled || page === totalPages,
3692
- children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: t("next") })
3693
+ children: /* @__PURE__ */ jsx24("span", { className: "hidden sm:inline", children: labels?.next || t("next") })
3693
3694
  }
3694
3695
  ),
3695
3696
  showFirstLast && /* @__PURE__ */ jsx24(
@@ -3701,15 +3702,15 @@ var Pagination = ({
3701
3702
  onClick: () => onChange(totalPages),
3702
3703
  disabled: disabled || page === totalPages,
3703
3704
  className: "hidden sm:flex",
3704
- title: t("lastPage"),
3705
- "aria-label": t("lastPage"),
3705
+ title: labels?.lastPage || t("lastPage"),
3706
+ "aria-label": labels?.lastPage || t("lastPage"),
3706
3707
  "aria-disabled": disabled || page === totalPages
3707
3708
  }
3708
3709
  )
3709
3710
  ] }),
3710
3711
  pageSizeOptions && onPageSizeChange && /* @__PURE__ */ jsxs22("div", { className: "flex items-center justify-center gap-2 text-sm", children: [
3711
3712
  /* @__PURE__ */ jsxs22("span", { className: "text-muted-foreground", children: [
3712
- t("itemsPerPage"),
3713
+ labels?.itemsPerPage || t("itemsPerPage"),
3713
3714
  ":"
3714
3715
  ] }),
3715
3716
  /* @__PURE__ */ jsx24("div", { className: "w-20", children: /* @__PURE__ */ jsx24(
@@ -3719,8 +3720,8 @@ var Pagination = ({
3719
3720
  value: pageSize?.toString() || "10",
3720
3721
  onChange: handlePageSizeChange,
3721
3722
  placeholder: "10",
3722
- searchPlaceholder: t("search"),
3723
- emptyText: t("noOptions"),
3723
+ searchPlaceholder: labels?.search || t("search"),
3724
+ emptyText: labels?.noOptions || t("noOptions"),
3724
3725
  disabled
3725
3726
  }
3726
3727
  ) })
@@ -3976,7 +3977,10 @@ var DatePicker = ({
3976
3977
  disabled = false,
3977
3978
  size = "md",
3978
3979
  label,
3979
- required
3980
+ required,
3981
+ todayLabel,
3982
+ clearLabel,
3983
+ weekdayLabels
3980
3984
  }) => {
3981
3985
  const t = useTranslations5("DatePicker");
3982
3986
  const locale = useLocale();
@@ -4117,10 +4121,10 @@ var DatePicker = ({
4117
4121
  children: [
4118
4122
  /* @__PURE__ */ jsxs23("div", { className: "flex items-center justify-between mb-4", children: [
4119
4123
  /* @__PURE__ */ jsx27(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("prev"), className: "p-1 h-auto", children: /* @__PURE__ */ jsx27(ChevronLeft2, { className: "h-4 w-4" }) }),
4120
- /* @__PURE__ */ jsx27("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString(locale === "vi" /* VI */ ? "vi-VN" : "en-US", { month: "long", year: "numeric" }) }),
4124
+ /* @__PURE__ */ jsx27("div", { className: "text-sm font-semibold", children: viewDate.toLocaleDateString("en-US", { month: "long", year: "numeric" }) }),
4121
4125
  /* @__PURE__ */ jsx27(Button_default, { variant: "ghost", size: "sm", onClick: () => navigateMonth("next"), className: "p-1 h-auto", children: /* @__PURE__ */ jsx27(ChevronRight3, { className: "h-4 w-4" }) })
4122
4126
  ] }),
4123
- /* @__PURE__ */ jsx27("div", { className: cn("grid grid-cols-7 gap-1", size === "sm" ? "mb-1" : "mb-2"), children: (locale === "vi" /* VI */ ? t("weekdays").split(",") : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]).map((day) => /* @__PURE__ */ jsx27("div", { className: cn("text-muted-foreground text-center font-medium", size === "sm" ? "text-[10px] py-0.5" : "text-xs py-1"), children: day }, day)) }),
4127
+ /* @__PURE__ */ jsx27("div", { className: cn("grid grid-cols-7 gap-1", size === "sm" ? "mb-1" : "mb-2"), children: (weekdayLabels || ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]).map((day) => /* @__PURE__ */ jsx27("div", { className: cn("text-muted-foreground text-center font-medium", size === "sm" ? "text-[10px] py-0.5" : "text-xs py-1"), children: day }, day)) }),
4124
4128
  /* @__PURE__ */ jsx27("div", { className: "grid grid-cols-7 gap-1", children: renderCalendar() })
4125
4129
  ]
4126
4130
  }
@@ -5347,199 +5351,31 @@ function ImageUpload({
5347
5351
  ] });
5348
5352
  }
5349
5353
 
5350
- // ../../components/ui/ProductImageUpload.tsx
5351
- import { useState as useState25, useRef as useRef10 } from "react";
5352
- import Image2 from "next/image";
5353
- import { Upload as Upload2, X as X9, Image as ImageIcon2 } from "lucide-react";
5354
- import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
5355
- var ProductImageUpload = ({ value, onChange, disabled = false, className }) => {
5356
- const [uploading, setUploading] = useState25(false);
5357
- const [error, setError] = useState25(null);
5358
- const [isDragging, setIsDragging] = useState25(false);
5359
- const fileInputRef = useRef10(null);
5360
- const handleFileChange = async (e) => {
5361
- const file = e.target.files?.[0];
5362
- if (!file) return;
5363
- await uploadFile(file);
5364
- };
5365
- const uploadFile = async (file) => {
5366
- const acceptedFormats = ["image/jpeg", "image/png", "image/webp", "image/gif"];
5367
- if (!acceptedFormats.includes(file.type)) {
5368
- setError(`\u0110\u1ECBnh d\u1EA1ng kh\xF4ng h\u1ED7 tr\u1EE3. Ch\u1EC9 ch\u1EA5p nh\u1EADn: JPG, PNG, WEBP, GIF`);
5369
- return;
5370
- }
5371
- const maxSizeBytes = 10 * 1024 * 1024;
5372
- if (file.size > maxSizeBytes) {
5373
- setError(`File qu\xE1 l\u1EDBn. K\xEDch th\u01B0\u1EDBc t\u1ED1i \u0111a: 10MB`);
5374
- return;
5375
- }
5376
- setError(null);
5377
- setUploading(true);
5378
- try {
5379
- const formData = new FormData();
5380
- formData.append("file", file);
5381
- const response = await fetch("/api/upload/product-image", {
5382
- method: "POST",
5383
- body: formData,
5384
- credentials: "include"
5385
- });
5386
- if (!response.ok) {
5387
- throw new Error("Upload failed");
5388
- }
5389
- const result = await response.json();
5390
- if (result.success && result.data?.path) {
5391
- onChange(result.data.path);
5392
- } else {
5393
- throw new Error(result.message || "Upload failed");
5394
- }
5395
- } catch (err) {
5396
- setError(err.message || "Kh\xF4ng th\u1EC3 upload \u1EA3nh");
5397
- console.error("Upload error:", err);
5398
- } finally {
5399
- setUploading(false);
5400
- if (fileInputRef.current) {
5401
- fileInputRef.current.value = "";
5402
- }
5403
- }
5404
- };
5405
- const handleDragOver = (e) => {
5406
- e.preventDefault();
5407
- e.stopPropagation();
5408
- if (!disabled && !uploading) {
5409
- setIsDragging(true);
5410
- }
5411
- };
5412
- const handleDragLeave = (e) => {
5413
- e.preventDefault();
5414
- e.stopPropagation();
5415
- setIsDragging(false);
5416
- };
5417
- const handleDrop = async (e) => {
5418
- e.preventDefault();
5419
- e.stopPropagation();
5420
- setIsDragging(false);
5421
- if (disabled || uploading) return;
5422
- const file = e.dataTransfer.files?.[0];
5423
- if (file) {
5424
- await uploadFile(file);
5425
- }
5426
- };
5427
- const handleRemove = () => {
5428
- onChange("");
5429
- setError(null);
5430
- };
5431
- const handleClickUpload = () => {
5432
- fileInputRef.current?.click();
5433
- };
5434
- return /* @__PURE__ */ jsxs29("div", { className: cn("space-y-4", className), children: [
5435
- /* @__PURE__ */ jsx34(
5436
- "input",
5437
- {
5438
- ref: fileInputRef,
5439
- type: "file",
5440
- accept: "image/jpeg,image/png,image/webp,image/gif",
5441
- onChange: handleFileChange,
5442
- disabled: disabled || uploading,
5443
- className: "hidden"
5444
- }
5445
- ),
5446
- value ? /* @__PURE__ */ jsxs29("div", { className: "space-y-4", children: [
5447
- /* @__PURE__ */ jsxs29("div", { className: "relative w-full aspect-square max-w-md rounded-xl overflow-hidden border-2 border-border bg-muted shadow-lg group", children: [
5448
- /* @__PURE__ */ jsx34(
5449
- Image2,
5450
- {
5451
- src: value,
5452
- alt: "Product image",
5453
- fill: true,
5454
- className: "object-cover transition-transform duration-300 group-hover:scale-105",
5455
- unoptimized: true
5456
- }
5457
- ),
5458
- /* @__PURE__ */ jsx34("div", { className: "absolute inset-0 bg-foreground/0 group-hover:bg-foreground/30 transition-colors duration-300 flex items-center justify-center opacity-0 group-hover:opacity-100", children: /* @__PURE__ */ jsxs29("div", { className: "flex gap-2", children: [
5459
- /* @__PURE__ */ jsxs29(Button_default, { type: "button", variant: "default", size: "sm", onClick: handleClickUpload, disabled: disabled || uploading, children: [
5460
- /* @__PURE__ */ jsx34(Upload2, { className: "w-4 h-4 mr-2" }),
5461
- "Thay \u0111\u1ED5i"
5462
- ] }),
5463
- /* @__PURE__ */ jsxs29(Button_default, { type: "button", variant: "danger", size: "sm", onClick: handleRemove, disabled: disabled || uploading, children: [
5464
- /* @__PURE__ */ jsx34(X9, { className: "w-4 h-4 mr-2" }),
5465
- "X\xF3a"
5466
- ] })
5467
- ] }) })
5468
- ] }),
5469
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
5470
- /* @__PURE__ */ jsx34(ImageIcon2, { className: "w-4 h-4" }),
5471
- /* @__PURE__ */ jsx34("span", { children: "\u1EA2nh s\u1EA3n ph\u1EA9m \u0111\xE3 t\u1EA3i l\xEAn th\xE0nh c\xF4ng" })
5472
- ] })
5473
- ] }) : /* @__PURE__ */ jsx34(
5474
- "div",
5475
- {
5476
- className: cn(
5477
- "w-full aspect-square max-w-md rounded-xl border-2 border-dashed transition-all duration-200",
5478
- "bg-gradient-to-br from-muted/30 to-muted/10",
5479
- "flex flex-col items-center justify-center cursor-pointer",
5480
- "hover:border-primary/60 hover:bg-primary/5 hover:shadow-lg hover:scale-[1.02]",
5481
- isDragging && "border-primary bg-primary/10 shadow-lg scale-[1.02]",
5482
- (disabled || uploading) && "opacity-50 cursor-not-allowed hover:scale-100",
5483
- !isDragging && !disabled && !uploading && "border-border"
5484
- ),
5485
- onClick: !disabled && !uploading ? handleClickUpload : void 0,
5486
- onDragOver: handleDragOver,
5487
- onDragLeave: handleDragLeave,
5488
- onDrop: handleDrop,
5489
- children: /* @__PURE__ */ jsxs29("div", { className: "flex flex-col items-center justify-center p-8 text-center", children: [
5490
- /* @__PURE__ */ jsx34(
5491
- "div",
5492
- {
5493
- className: cn(
5494
- "w-20 h-20 rounded-full flex items-center justify-center mb-4 transition-colors",
5495
- isDragging ? "bg-primary/20" : "bg-primary/10"
5496
- ),
5497
- children: /* @__PURE__ */ jsx34(Upload2, { className: cn("w-10 h-10 transition-colors", isDragging ? "text-primary" : "text-muted-foreground") })
5498
- }
5499
- ),
5500
- /* @__PURE__ */ jsx34("h3", { className: "text-lg font-semibold text-foreground mb-2", children: uploading ? "\u0110ang t\u1EA3i l\xEAn..." : isDragging ? "Th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y" : "T\u1EA3i \u1EA3nh s\u1EA3n ph\u1EA9m" }),
5501
- /* @__PURE__ */ jsx34("p", { className: "text-sm text-muted-foreground mb-3 max-w-xs", children: uploading ? "Vui l\xF2ng \u0111\u1EE3i trong gi\xE2y l\xE1t" : "Click \u0111\u1EC3 ch\u1ECDn ho\u1EB7c k\xE9o th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y" }),
5502
- /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mt-2", children: [
5503
- /* @__PURE__ */ jsx34("div", { className: "px-3 py-1.5 bg-muted rounded-full", children: "JPG, PNG, WEBP, GIF" }),
5504
- /* @__PURE__ */ jsx34("div", { className: "px-3 py-1.5 bg-muted rounded-full", children: "T\u1ED1i \u0111a 10MB" })
5505
- ] }),
5506
- uploading && /* @__PURE__ */ jsx34("div", { className: "mt-4 w-48 h-1.5 bg-muted rounded-full overflow-hidden", children: /* @__PURE__ */ jsx34("div", { className: "h-full bg-primary rounded-full animate-[progress_1s_ease-in-out_infinite]" }) })
5507
- ] })
5508
- }
5509
- ),
5510
- error && /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 p-3 rounded-lg bg-destructive/10 border border-destructive/20", children: [
5511
- /* @__PURE__ */ jsx34(X9, { className: "w-4 h-4 text-destructive flex-shrink-0" }),
5512
- /* @__PURE__ */ jsx34("p", { className: "text-sm text-destructive", children: error })
5513
- ] })
5514
- ] });
5515
- };
5516
- var ProductImageUpload_default = ProductImageUpload;
5517
-
5518
5354
  // ../../components/ui/Carousel.tsx
5519
- import * as React28 from "react";
5355
+ import * as React27 from "react";
5520
5356
  import { ArrowLeft, ArrowRight } from "lucide-react";
5521
- import { Fragment as Fragment8, jsx as jsx35, jsxs as jsxs30 } from "react/jsx-runtime";
5357
+ import { Fragment as Fragment8, jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
5522
5358
  function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
5523
- const [currentIndex, setCurrentIndex] = React28.useState(0);
5524
- const totalSlides = React28.Children.count(children);
5525
- const [isPaused, setIsPaused] = React28.useState(false);
5526
- const scrollPrev = React28.useCallback(() => {
5359
+ const [currentIndex, setCurrentIndex] = React27.useState(0);
5360
+ const totalSlides = React27.Children.count(children);
5361
+ const [isPaused, setIsPaused] = React27.useState(false);
5362
+ const scrollPrev = React27.useCallback(() => {
5527
5363
  setCurrentIndex((prev) => prev > 0 ? prev - 1 : totalSlides - 1);
5528
5364
  }, [totalSlides]);
5529
- const scrollNext = React28.useCallback(() => {
5365
+ const scrollNext = React27.useCallback(() => {
5530
5366
  setCurrentIndex((prev) => prev < totalSlides - 1 ? prev + 1 : 0);
5531
5367
  }, [totalSlides]);
5532
- React28.useEffect(() => {
5368
+ React27.useEffect(() => {
5533
5369
  if (!autoScroll || isPaused || totalSlides <= 1) return;
5534
5370
  const interval = setInterval(() => {
5535
5371
  scrollNext();
5536
5372
  }, autoScrollInterval);
5537
5373
  return () => clearInterval(interval);
5538
5374
  }, [autoScroll, isPaused, totalSlides, autoScrollInterval, scrollNext]);
5539
- return /* @__PURE__ */ jsxs30("div", { className: "relative w-full overflow-hidden", onMouseEnter: () => setIsPaused(true), onMouseLeave: () => setIsPaused(false), children: [
5540
- /* @__PURE__ */ jsx35("div", { className: "flex transition-transform duration-500 ease-in-out", style: { transform: `translateX(-${currentIndex * 100}%)` }, children: React28.Children.map(children, (child, idx) => /* @__PURE__ */ jsx35("div", { className: "flex-shrink-0 w-full h-full", children: child }, idx)) }),
5541
- totalSlides > 1 && /* @__PURE__ */ jsxs30(Fragment8, { children: [
5542
- /* @__PURE__ */ jsx35(
5375
+ return /* @__PURE__ */ jsxs29("div", { className: "relative w-full overflow-hidden", onMouseEnter: () => setIsPaused(true), onMouseLeave: () => setIsPaused(false), children: [
5376
+ /* @__PURE__ */ jsx34("div", { className: "flex transition-transform duration-500 ease-in-out", style: { transform: `translateX(-${currentIndex * 100}%)` }, children: React27.Children.map(children, (child, idx) => /* @__PURE__ */ jsx34("div", { className: "flex-shrink-0 w-full h-full", children: child }, idx)) }),
5377
+ totalSlides > 1 && /* @__PURE__ */ jsxs29(Fragment8, { children: [
5378
+ /* @__PURE__ */ jsx34(
5543
5379
  Button_default,
5544
5380
  {
5545
5381
  onClick: scrollPrev,
@@ -5549,7 +5385,7 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
5549
5385
  className: "absolute left-4 top-1/2 -translate-y-1/2 hover:-translate-y-1/2 z-10 rounded-full will-change-transform bg-background/80 hover:bg-background border-border/50 hover:border-border text-foreground"
5550
5386
  }
5551
5387
  ),
5552
- /* @__PURE__ */ jsx35(
5388
+ /* @__PURE__ */ jsx34(
5553
5389
  Button_default,
5554
5390
  {
5555
5391
  onClick: scrollNext,
@@ -5560,7 +5396,7 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
5560
5396
  }
5561
5397
  )
5562
5398
  ] }),
5563
- totalSlides > 1 && /* @__PURE__ */ jsx35("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-2", children: Array.from({ length: totalSlides }, (_, idx) => /* @__PURE__ */ jsx35(
5399
+ totalSlides > 1 && /* @__PURE__ */ jsx34("div", { className: "absolute bottom-4 left-1/2 -translate-x-1/2 flex gap-2", children: Array.from({ length: totalSlides }, (_, idx) => /* @__PURE__ */ jsx34(
5564
5400
  "button",
5565
5401
  {
5566
5402
  onClick: () => setCurrentIndex(idx),
@@ -5573,22 +5409,22 @@ function Carousel({ children, autoScroll = true, autoScrollInterval = 5e3 }) {
5573
5409
  }
5574
5410
 
5575
5411
  // ../../components/ui/ClientOnly.tsx
5576
- import { useEffect as useEffect15, useState as useState27 } from "react";
5577
- import { Fragment as Fragment9, jsx as jsx36 } from "react/jsx-runtime";
5412
+ import { useEffect as useEffect15, useState as useState26 } from "react";
5413
+ import { Fragment as Fragment9, jsx as jsx35 } from "react/jsx-runtime";
5578
5414
  function ClientOnly({ children, fallback = null }) {
5579
- const [hasMounted, setHasMounted] = useState27(false);
5415
+ const [hasMounted, setHasMounted] = useState26(false);
5580
5416
  useEffect15(() => {
5581
5417
  setHasMounted(true);
5582
5418
  }, []);
5583
5419
  if (!hasMounted) {
5584
- return /* @__PURE__ */ jsx36(Fragment9, { children: fallback });
5420
+ return /* @__PURE__ */ jsx35(Fragment9, { children: fallback });
5585
5421
  }
5586
- return /* @__PURE__ */ jsx36(Fragment9, { children });
5422
+ return /* @__PURE__ */ jsx35(Fragment9, { children });
5587
5423
  }
5588
5424
 
5589
5425
  // ../../components/ui/Loading.tsx
5590
5426
  import { Activity as Activity3 } from "lucide-react";
5591
- import { jsx as jsx37, jsxs as jsxs31 } from "react/jsx-runtime";
5427
+ import { jsx as jsx36, jsxs as jsxs30 } from "react/jsx-runtime";
5592
5428
  var LoadingSpinner = ({
5593
5429
  size = "md",
5594
5430
  className,
@@ -5604,7 +5440,7 @@ var LoadingSpinner = ({
5604
5440
  foreground: "text-foreground",
5605
5441
  muted: "text-muted-foreground"
5606
5442
  };
5607
- return /* @__PURE__ */ jsx37(
5443
+ return /* @__PURE__ */ jsx36(
5608
5444
  Activity3,
5609
5445
  {
5610
5446
  className: cn(
@@ -5625,7 +5461,7 @@ var LoadingDots = ({
5625
5461
  foreground: "bg-foreground",
5626
5462
  muted: "bg-muted-foreground"
5627
5463
  };
5628
- return /* @__PURE__ */ jsx37("div", { className: cn("flex items-center space-x-1", className), children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx37(
5464
+ return /* @__PURE__ */ jsx36("div", { className: cn("flex items-center space-x-1", className), children: [0, 1, 2].map((i) => /* @__PURE__ */ jsx36(
5629
5465
  "div",
5630
5466
  {
5631
5467
  className: cn(
@@ -5647,7 +5483,7 @@ var LoadingBar = ({
5647
5483
  label
5648
5484
  }) => {
5649
5485
  const pct = progress ? Math.min(Math.max(progress, 0), 100) : void 0;
5650
- return /* @__PURE__ */ jsx37(
5486
+ return /* @__PURE__ */ jsx36(
5651
5487
  "div",
5652
5488
  {
5653
5489
  className: cn("w-full bg-muted rounded-full h-2", className),
@@ -5656,7 +5492,7 @@ var LoadingBar = ({
5656
5492
  "aria-valuemax": pct === void 0 ? void 0 : 100,
5657
5493
  "aria-valuenow": pct === void 0 ? void 0 : Math.round(pct),
5658
5494
  "aria-label": label || "Loading",
5659
- children: /* @__PURE__ */ jsx37(
5495
+ children: /* @__PURE__ */ jsx36(
5660
5496
  "div",
5661
5497
  {
5662
5498
  className: cn(
@@ -5673,10 +5509,10 @@ var LoadingBar = ({
5673
5509
  };
5674
5510
 
5675
5511
  // ../../components/ui/Table.tsx
5676
- import React29 from "react";
5677
- import { jsx as jsx38, jsxs as jsxs32 } from "react/jsx-runtime";
5678
- var Table = React29.forwardRef(
5679
- ({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ jsx38(
5512
+ import React28 from "react";
5513
+ import { jsx as jsx37, jsxs as jsxs31 } from "react/jsx-runtime";
5514
+ var Table = React28.forwardRef(
5515
+ ({ className, containerClassName, ...props }, ref) => /* @__PURE__ */ jsx37(
5680
5516
  "div",
5681
5517
  {
5682
5518
  className: cn(
@@ -5686,7 +5522,7 @@ var Table = React29.forwardRef(
5686
5522
  "backdrop-blur-sm transition-all duration-300",
5687
5523
  containerClassName
5688
5524
  ),
5689
- children: /* @__PURE__ */ jsx38(
5525
+ children: /* @__PURE__ */ jsx37(
5690
5526
  "table",
5691
5527
  {
5692
5528
  ref,
@@ -5698,8 +5534,8 @@ var Table = React29.forwardRef(
5698
5534
  )
5699
5535
  );
5700
5536
  Table.displayName = "Table";
5701
- var TableHeader = React29.forwardRef(
5702
- ({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */ jsxs32(
5537
+ var TableHeader = React28.forwardRef(
5538
+ ({ className, children, filterRow, ...props }, ref) => /* @__PURE__ */ jsxs31(
5703
5539
  "thead",
5704
5540
  {
5705
5541
  ref,
@@ -5717,7 +5553,7 @@ var TableHeader = React29.forwardRef(
5717
5553
  )
5718
5554
  );
5719
5555
  TableHeader.displayName = "TableHeader";
5720
- var TableBody = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5556
+ var TableBody = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5721
5557
  "tbody",
5722
5558
  {
5723
5559
  ref,
@@ -5726,7 +5562,7 @@ var TableBody = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
5726
5562
  }
5727
5563
  ));
5728
5564
  TableBody.displayName = "TableBody";
5729
- var TableFooter = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5565
+ var TableFooter = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5730
5566
  "tfoot",
5731
5567
  {
5732
5568
  ref,
@@ -5738,7 +5574,7 @@ var TableFooter = React29.forwardRef(({ className, ...props }, ref) => /* @__PUR
5738
5574
  }
5739
5575
  ));
5740
5576
  TableFooter.displayName = "TableFooter";
5741
- var TableRow = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5577
+ var TableRow = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5742
5578
  "tr",
5743
5579
  {
5744
5580
  ref,
@@ -5752,7 +5588,7 @@ var TableRow = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__
5752
5588
  }
5753
5589
  ));
5754
5590
  TableRow.displayName = "TableRow";
5755
- var TableHead = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5591
+ var TableHead = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5756
5592
  "th",
5757
5593
  {
5758
5594
  ref,
@@ -5764,7 +5600,7 @@ var TableHead = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
5764
5600
  }
5765
5601
  ));
5766
5602
  TableHead.displayName = "TableHead";
5767
- var TableCell = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5603
+ var TableCell = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5768
5604
  "td",
5769
5605
  {
5770
5606
  ref,
@@ -5773,7 +5609,7 @@ var TableCell = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE_
5773
5609
  }
5774
5610
  ));
5775
5611
  TableCell.displayName = "TableCell";
5776
- var TableCaption = React29.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx38(
5612
+ var TableCaption = React28.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx37(
5777
5613
  "caption",
5778
5614
  {
5779
5615
  ref,
@@ -5785,12 +5621,12 @@ TableCaption.displayName = "TableCaption";
5785
5621
 
5786
5622
  // ../../components/ui/DataTable.tsx
5787
5623
  import { Filter as FilterIcon } from "lucide-react";
5788
- import React30 from "react";
5624
+ import React29 from "react";
5789
5625
  import { useTranslations as useTranslations7 } from "next-intl";
5790
- import { jsx as jsx39, jsxs as jsxs33 } from "react/jsx-runtime";
5626
+ import { jsx as jsx38, jsxs as jsxs32 } from "react/jsx-runtime";
5791
5627
  function useDebounced(value, delay = 300) {
5792
- const [debounced, setDebounced] = React30.useState(value);
5793
- React30.useEffect(() => {
5628
+ const [debounced, setDebounced] = React29.useState(value);
5629
+ React29.useEffect(() => {
5794
5630
  const id = setTimeout(() => setDebounced(value), delay);
5795
5631
  return () => clearTimeout(id);
5796
5632
  }, [value, delay]);
@@ -5811,17 +5647,18 @@ function DataTable({
5811
5647
  enableDensityToggle = true,
5812
5648
  striped = true,
5813
5649
  // Mặc định bật màu nền sẽn kẽ cho các dòng
5814
- className
5650
+ className,
5651
+ labels
5815
5652
  }) {
5816
5653
  const t = useTranslations7("Common");
5817
- const [visibleCols, setVisibleCols] = React30.useState(() => columns.filter((c) => c.visible !== false).map((c) => c.key));
5818
- const [filters, setFilters] = React30.useState({});
5819
- const [sort, setSort] = React30.useState(null);
5820
- const [density, setDensity] = React30.useState("normal");
5821
- const [curPage, setCurPage] = React30.useState(page);
5822
- const [curPageSize, setCurPageSize] = React30.useState(pageSize);
5654
+ const [visibleCols, setVisibleCols] = React29.useState(() => columns.filter((c) => c.visible !== false).map((c) => c.key));
5655
+ const [filters, setFilters] = React29.useState({});
5656
+ const [sort, setSort] = React29.useState(null);
5657
+ const [density, setDensity] = React29.useState("normal");
5658
+ const [curPage, setCurPage] = React29.useState(page);
5659
+ const [curPageSize, setCurPageSize] = React29.useState(pageSize);
5823
5660
  const debouncedFilters = useDebounced(filters, 350);
5824
- React30.useEffect(() => {
5661
+ React29.useEffect(() => {
5825
5662
  if (!onQueryChange) return;
5826
5663
  onQueryChange({ filters: debouncedFilters, sort, page: curPage, pageSize: curPageSize });
5827
5664
  }, [debouncedFilters, sort, curPage, curPageSize]);
@@ -5840,7 +5677,7 @@ function DataTable({
5840
5677
  className: "h-8 w-full text-sm"
5841
5678
  };
5842
5679
  if (col.filter.type === "text") {
5843
- return /* @__PURE__ */ jsx39(
5680
+ return /* @__PURE__ */ jsx38(
5844
5681
  Input_default,
5845
5682
  {
5846
5683
  ...commonProps,
@@ -5855,7 +5692,7 @@ function DataTable({
5855
5692
  }
5856
5693
  if (col.filter.type === "select") {
5857
5694
  const options = col.filter.options || [];
5858
- return /* @__PURE__ */ jsx39(
5695
+ return /* @__PURE__ */ jsx38(
5859
5696
  Combobox,
5860
5697
  {
5861
5698
  options: ["", ...options],
@@ -5871,7 +5708,7 @@ function DataTable({
5871
5708
  );
5872
5709
  }
5873
5710
  if (col.filter.type === "date") {
5874
- return /* @__PURE__ */ jsx39(
5711
+ return /* @__PURE__ */ jsx38(
5875
5712
  DatePicker,
5876
5713
  {
5877
5714
  placeholder: col.filter.placeholder || `Select ${String(col.title)}`,
@@ -5885,15 +5722,15 @@ function DataTable({
5885
5722
  }
5886
5723
  return null;
5887
5724
  };
5888
- const renderHeader = /* @__PURE__ */ jsx39(TableRow, { children: visibleColumns.map((col) => /* @__PURE__ */ jsx39(
5725
+ const renderHeader = /* @__PURE__ */ jsx38(TableRow, { children: visibleColumns.map((col) => /* @__PURE__ */ jsx38(
5889
5726
  TableHead,
5890
5727
  {
5891
5728
  style: { width: col.width },
5892
5729
  className: cn(col.align === "right" && "text-right", col.align === "center" && "text-center"),
5893
- children: /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between gap-2 select-none min-h-[2.5rem]", children: [
5894
- /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-1 min-w-0 flex-1", children: [
5895
- /* @__PURE__ */ jsx39("span", { className: "truncate font-medium text-sm", children: col.title }),
5896
- col.sortable && /* @__PURE__ */ jsx39(
5730
+ children: /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between gap-2 select-none min-h-[2.5rem]", children: [
5731
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-1 min-w-0 flex-1", children: [
5732
+ /* @__PURE__ */ jsx38("span", { className: "truncate font-medium text-sm", children: col.title }),
5733
+ col.sortable && /* @__PURE__ */ jsx38(
5897
5734
  "button",
5898
5735
  {
5899
5736
  className: cn(
@@ -5910,8 +5747,8 @@ function DataTable({
5910
5747
  },
5911
5748
  "aria-label": "Sort",
5912
5749
  title: `Sort by ${String(col.title)}`,
5913
- children: /* @__PURE__ */ jsxs33("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", className: "inline-block", children: [
5914
- /* @__PURE__ */ jsx39(
5750
+ children: /* @__PURE__ */ jsxs32("svg", { width: "14", height: "14", viewBox: "0 0 20 20", fill: "none", className: "inline-block", children: [
5751
+ /* @__PURE__ */ jsx38(
5915
5752
  "path",
5916
5753
  {
5917
5754
  d: "M7 8l3-3 3 3",
@@ -5922,7 +5759,7 @@ function DataTable({
5922
5759
  opacity: sort?.key === col.key && sort.order === "asc" ? 1 : 0.4
5923
5760
  }
5924
5761
  ),
5925
- /* @__PURE__ */ jsx39(
5762
+ /* @__PURE__ */ jsx38(
5926
5763
  "path",
5927
5764
  {
5928
5765
  d: "M7 12l3 3 3-3",
@@ -5937,11 +5774,11 @@ function DataTable({
5937
5774
  }
5938
5775
  )
5939
5776
  ] }),
5940
- col.filter && /* @__PURE__ */ jsx39(
5777
+ col.filter && /* @__PURE__ */ jsx38(
5941
5778
  Popover,
5942
5779
  {
5943
5780
  placement: "bottom-start",
5944
- trigger: /* @__PURE__ */ jsx39(
5781
+ trigger: /* @__PURE__ */ jsx38(
5945
5782
  "button",
5946
5783
  {
5947
5784
  className: cn(
@@ -5951,16 +5788,16 @@ function DataTable({
5951
5788
  ),
5952
5789
  "aria-label": "Filter",
5953
5790
  title: "Filter",
5954
- children: /* @__PURE__ */ jsx39(FilterIcon, { className: "h-4 w-4" })
5791
+ children: /* @__PURE__ */ jsx38(FilterIcon, { className: "h-4 w-4" })
5955
5792
  }
5956
5793
  ),
5957
- children: /* @__PURE__ */ jsxs33("div", { className: "w-48 p-2 space-y-2", children: [
5958
- /* @__PURE__ */ jsxs33("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: [
5794
+ children: /* @__PURE__ */ jsxs32("div", { className: "w-48 p-2 space-y-2", children: [
5795
+ /* @__PURE__ */ jsxs32("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: [
5959
5796
  "Filter ",
5960
5797
  col.title
5961
5798
  ] }),
5962
5799
  renderFilterControl(col),
5963
- filters[col.key] && /* @__PURE__ */ jsx39(
5800
+ filters[col.key] && /* @__PURE__ */ jsx38(
5964
5801
  "button",
5965
5802
  {
5966
5803
  onClick: () => {
@@ -5982,29 +5819,29 @@ function DataTable({
5982
5819
  },
5983
5820
  col.key
5984
5821
  )) });
5985
- return /* @__PURE__ */ jsxs33("div", { className: cn("space-y-2", className), children: [
5986
- /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between gap-4 mb-1", children: [
5987
- /* @__PURE__ */ jsx39("div", { className: "text-sm text-muted-foreground", children: caption }),
5988
- /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2", children: [
5989
- enableDensityToggle && /* @__PURE__ */ jsx39(
5822
+ return /* @__PURE__ */ jsxs32("div", { className: cn("space-y-2", className), children: [
5823
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between gap-4 mb-1", children: [
5824
+ /* @__PURE__ */ jsx38("div", { className: "text-sm text-muted-foreground", children: caption }),
5825
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
5826
+ enableDensityToggle && /* @__PURE__ */ jsx38(
5990
5827
  DropdownMenu_default,
5991
5828
  {
5992
- trigger: /* @__PURE__ */ jsxs33(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
5993
- /* @__PURE__ */ jsx39("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx39("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 10h16M4 14h16M4 18h16" }) }),
5994
- t("density")
5829
+ trigger: /* @__PURE__ */ jsxs32(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
5830
+ /* @__PURE__ */ jsx38("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx38("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 10h16M4 14h16M4 18h16" }) }),
5831
+ labels?.density || t("density")
5995
5832
  ] }),
5996
5833
  items: [
5997
- { label: t("compact"), onClick: () => setDensity("compact") },
5998
- { label: t("normal"), onClick: () => setDensity("normal") },
5999
- { label: t("comfortable"), onClick: () => setDensity("comfortable") }
5834
+ { label: labels?.compact || t("compact"), onClick: () => setDensity("compact") },
5835
+ { label: labels?.normal || t("normal"), onClick: () => setDensity("normal") },
5836
+ { label: labels?.comfortable || t("comfortable"), onClick: () => setDensity("comfortable") }
6000
5837
  ]
6001
5838
  }
6002
5839
  ),
6003
- enableColumnVisibilityToggle && /* @__PURE__ */ jsx39(
5840
+ enableColumnVisibilityToggle && /* @__PURE__ */ jsx38(
6004
5841
  DropdownMenu_default,
6005
5842
  {
6006
- trigger: /* @__PURE__ */ jsxs33(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
6007
- /* @__PURE__ */ jsx39("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx39(
5843
+ trigger: /* @__PURE__ */ jsxs32(Button_default, { variant: "ghost", size: "sm", className: "h-8 px-2", children: [
5844
+ /* @__PURE__ */ jsx38("svg", { className: "w-4 h-4 mr-1", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx38(
6008
5845
  "path",
6009
5846
  {
6010
5847
  strokeLinecap: "round",
@@ -6013,17 +5850,17 @@ function DataTable({
6013
5850
  d: "M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2"
6014
5851
  }
6015
5852
  ) }),
6016
- t("columns")
5853
+ labels?.columns || t("columns")
6017
5854
  ] }),
6018
- children: columns.map((c) => /* @__PURE__ */ jsxs33(
5855
+ children: columns.map((c) => /* @__PURE__ */ jsxs32(
6019
5856
  DropdownMenuItem,
6020
5857
  {
6021
5858
  onClick: () => {
6022
5859
  setVisibleCols((prev) => prev.includes(c.key) ? prev.filter((k) => k !== c.key) : [...prev, c.key]);
6023
5860
  },
6024
5861
  children: [
6025
- /* @__PURE__ */ jsx39("input", { type: "checkbox", className: "mr-2 rounded border-border", readOnly: true, checked: visibleCols.includes(c.key) }),
6026
- /* @__PURE__ */ jsx39("span", { className: "truncate", children: c.title })
5862
+ /* @__PURE__ */ jsx38("input", { type: "checkbox", className: "mr-2 rounded border-border", readOnly: true, checked: visibleCols.includes(c.key) }),
5863
+ /* @__PURE__ */ jsx38("span", { className: "truncate", children: c.title })
6027
5864
  ]
6028
5865
  },
6029
5866
  c.key
@@ -6033,17 +5870,17 @@ function DataTable({
6033
5870
  toolbar
6034
5871
  ] })
6035
5872
  ] }),
6036
- /* @__PURE__ */ jsx39("div", { className: cn("relative rounded-lg border border-border/50 overflow-hidden", loading2 && "opacity-60 pointer-events-none"), children: /* @__PURE__ */ jsxs33(
5873
+ /* @__PURE__ */ jsx38("div", { className: cn("relative rounded-lg border border-border/50 overflow-hidden", loading2 && "opacity-60 pointer-events-none"), children: /* @__PURE__ */ jsxs32(
6037
5874
  Table,
6038
5875
  {
6039
5876
  containerClassName: "border-0 rounded-none shadow-none",
6040
5877
  className: "[&_thead]:sticky [&_thead]:top-0 [&_thead]:z-[5] [&_thead]:bg-background [&_thead]:backdrop-blur-sm",
6041
5878
  children: [
6042
- /* @__PURE__ */ jsx39(TableHeader, { children: renderHeader }),
6043
- /* @__PURE__ */ jsx39(TableBody, { children: loading2 ? /* @__PURE__ */ jsx39(TableRow, { children: /* @__PURE__ */ jsx39(TableCell, { colSpan: visibleColumns.length, className: "text-center py-8", children: /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-center gap-2 text-muted-foreground", children: [
6044
- /* @__PURE__ */ jsxs33("svg", { className: "animate-spin h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
6045
- /* @__PURE__ */ jsx39("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
6046
- /* @__PURE__ */ jsx39(
5879
+ /* @__PURE__ */ jsx38(TableHeader, { children: renderHeader }),
5880
+ /* @__PURE__ */ jsx38(TableBody, { children: loading2 ? /* @__PURE__ */ jsx38(TableRow, { children: /* @__PURE__ */ jsx38(TableCell, { colSpan: visibleColumns.length, className: "text-center py-8", children: /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-center gap-2 text-muted-foreground", children: [
5881
+ /* @__PURE__ */ jsxs32("svg", { className: "animate-spin h-4 w-4", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
5882
+ /* @__PURE__ */ jsx38("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
5883
+ /* @__PURE__ */ jsx38(
6047
5884
  "path",
6048
5885
  {
6049
5886
  className: "opacity-75",
@@ -6052,10 +5889,10 @@ function DataTable({
6052
5889
  }
6053
5890
  )
6054
5891
  ] }),
6055
- /* @__PURE__ */ jsx39("span", { className: "text-sm", children: "Loading..." })
6056
- ] }) }) }) : !data || data.length === 0 ? /* @__PURE__ */ jsx39(TableRow, { children: /* @__PURE__ */ jsx39(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : data.map((row, idx) => /* @__PURE__ */ jsx39(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col) => {
5892
+ /* @__PURE__ */ jsx38("span", { className: "text-sm", children: "Loading..." })
5893
+ ] }) }) }) : !data || data.length === 0 ? /* @__PURE__ */ jsx38(TableRow, { children: /* @__PURE__ */ jsx38(TableCell, { colSpan: visibleColumns.length, className: "text-center py-6 text-muted-foreground", children: "No data" }) }) : data.map((row, idx) => /* @__PURE__ */ jsx38(TableRow, { className: cn(densityRowClass, striped && idx % 2 === 0 && "bg-muted/30"), children: visibleColumns.map((col) => {
6057
5894
  const value = col.dataIndex ? row[col.dataIndex] : void 0;
6058
- return /* @__PURE__ */ jsx39(
5895
+ return /* @__PURE__ */ jsx38(
6059
5896
  TableCell,
6060
5897
  {
6061
5898
  className: cn(
@@ -6073,7 +5910,7 @@ function DataTable({
6073
5910
  ]
6074
5911
  }
6075
5912
  ) }),
6076
- total > 0 && /* @__PURE__ */ jsx39("div", { className: "border-t bg-muted/30 p-4 rounded-b-lg", children: /* @__PURE__ */ jsx39(
5913
+ total > 0 && /* @__PURE__ */ jsx38("div", { className: "border-t bg-muted/30 p-4 rounded-b-lg", children: /* @__PURE__ */ jsx38(
6077
5914
  Pagination,
6078
5915
  {
6079
5916
  page: curPage,
@@ -6092,8 +5929,8 @@ var DataTable_default = DataTable;
6092
5929
  // ../../components/ui/NotificationModal.tsx
6093
5930
  import { ExternalLink } from "lucide-react";
6094
5931
  import { useTranslations as useTranslations8 } from "next-intl";
6095
- import { jsx as jsx40, jsxs as jsxs34 } from "react/jsx-runtime";
6096
- function NotificationModal({ isOpen, onClose, notification }) {
5932
+ import { jsx as jsx39, jsxs as jsxs33 } from "react/jsx-runtime";
5933
+ function NotificationModal({ isOpen, onClose, notification, titleText, openLinkText, closeText }) {
6097
5934
  const t = useTranslations8("Common");
6098
5935
  if (!notification) return null;
6099
5936
  const formatTime2 = (dateString) => {
@@ -6113,26 +5950,26 @@ function NotificationModal({ isOpen, onClose, notification }) {
6113
5950
  onClose();
6114
5951
  }
6115
5952
  };
6116
- return /* @__PURE__ */ jsx40(
5953
+ return /* @__PURE__ */ jsx39(
6117
5954
  Modal_default,
6118
5955
  {
6119
5956
  isOpen,
6120
5957
  onClose,
6121
- title: t("notifications"),
5958
+ title: titleText || t("notifications"),
6122
5959
  size: "md",
6123
- children: /* @__PURE__ */ jsxs34("div", { className: "space-y-4", children: [
6124
- /* @__PURE__ */ jsxs34("div", { className: "flex items-center gap-2 pb-2 border-b border-border", children: [
6125
- /* @__PURE__ */ jsx40("div", { className: cn(
5960
+ children: /* @__PURE__ */ jsxs33("div", { className: "space-y-4", children: [
5961
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-2 pb-2 border-b border-border", children: [
5962
+ /* @__PURE__ */ jsx39("div", { className: cn(
6126
5963
  "w-2 h-2 rounded-full",
6127
5964
  !notification.is_read ? "bg-primary" : "bg-border"
6128
5965
  ) }),
6129
- /* @__PURE__ */ jsx40("span", { className: "text-xs text-muted-foreground", children: !notification.is_read ? t("newNotification") : t("readStatus") })
5966
+ /* @__PURE__ */ jsx39("span", { className: "text-xs text-muted-foreground", children: !notification.is_read ? t("newNotification") : t("readStatus") })
6130
5967
  ] }),
6131
- notification.title && /* @__PURE__ */ jsx40("h3", { className: "text-lg font-semibold text-foreground", children: notification.title }),
6132
- notification.body && /* @__PURE__ */ jsx40("div", { className: "text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed", children: notification.body }),
6133
- /* @__PURE__ */ jsx40("div", { className: "text-xs text-muted-foreground border-t border-border pt-2", children: formatTime2(notification.created_at) }),
6134
- /* @__PURE__ */ jsxs34("div", { className: "flex gap-2 justify-end pt-2", children: [
6135
- hasLink && /* @__PURE__ */ jsxs34(
5968
+ notification.title && /* @__PURE__ */ jsx39("h3", { className: "text-lg font-semibold text-foreground", children: notification.title }),
5969
+ notification.body && /* @__PURE__ */ jsx39("div", { className: "text-sm text-muted-foreground whitespace-pre-wrap leading-relaxed", children: notification.body }),
5970
+ /* @__PURE__ */ jsx39("div", { className: "text-xs text-muted-foreground border-t border-border pt-2", children: formatTime2(notification.created_at) }),
5971
+ /* @__PURE__ */ jsxs33("div", { className: "flex gap-2 justify-end pt-2", children: [
5972
+ hasLink && /* @__PURE__ */ jsxs33(
6136
5973
  Button_default,
6137
5974
  {
6138
5975
  variant: "primary",
@@ -6140,18 +5977,18 @@ function NotificationModal({ isOpen, onClose, notification }) {
6140
5977
  onClick: handleLinkClick,
6141
5978
  className: "gap-2",
6142
5979
  children: [
6143
- /* @__PURE__ */ jsx40(ExternalLink, { className: "w-4 h-4" }),
6144
- t("openLink")
5980
+ /* @__PURE__ */ jsx39(ExternalLink, { className: "w-4 h-4" }),
5981
+ openLinkText || t("openLink")
6145
5982
  ]
6146
5983
  }
6147
5984
  ),
6148
- /* @__PURE__ */ jsx40(
5985
+ /* @__PURE__ */ jsx39(
6149
5986
  Button_default,
6150
5987
  {
6151
5988
  variant: "ghost",
6152
5989
  size: "sm",
6153
5990
  onClick: onClose,
6154
- children: t("close")
5991
+ children: closeText || t("close")
6155
5992
  }
6156
5993
  )
6157
5994
  ] })
@@ -6167,10 +6004,10 @@ import { usePathname } from "next/navigation";
6167
6004
  import { Phone } from "lucide-react";
6168
6005
 
6169
6006
  // ../../node_modules/react-icons/lib/iconBase.mjs
6170
- import React32 from "react";
6007
+ import React31 from "react";
6171
6008
 
6172
6009
  // ../../node_modules/react-icons/lib/iconContext.mjs
6173
- import React31 from "react";
6010
+ import React30 from "react";
6174
6011
  var DefaultContext = {
6175
6012
  color: void 0,
6176
6013
  size: void 0,
@@ -6178,7 +6015,7 @@ var DefaultContext = {
6178
6015
  style: void 0,
6179
6016
  attr: void 0
6180
6017
  };
6181
- var IconContext = React31.createContext && /* @__PURE__ */ React31.createContext(DefaultContext);
6018
+ var IconContext = React30.createContext && /* @__PURE__ */ React30.createContext(DefaultContext);
6182
6019
 
6183
6020
  // ../../node_modules/react-icons/lib/iconBase.mjs
6184
6021
  var _excluded = ["attr", "size", "title"];
@@ -6267,12 +6104,12 @@ function _toPrimitive(t, r) {
6267
6104
  return ("string" === r ? String : Number)(t);
6268
6105
  }
6269
6106
  function Tree2Element(tree) {
6270
- return tree && tree.map((node, i) => /* @__PURE__ */ React32.createElement(node.tag, _objectSpread({
6107
+ return tree && tree.map((node, i) => /* @__PURE__ */ React31.createElement(node.tag, _objectSpread({
6271
6108
  key: i
6272
6109
  }, node.attr), Tree2Element(node.child)));
6273
6110
  }
6274
6111
  function GenIcon(data) {
6275
- return (props) => /* @__PURE__ */ React32.createElement(IconBase, _extends({
6112
+ return (props) => /* @__PURE__ */ React31.createElement(IconBase, _extends({
6276
6113
  attr: _objectSpread({}, data.attr)
6277
6114
  }, props), Tree2Element(data.child));
6278
6115
  }
@@ -6287,7 +6124,7 @@ function IconBase(props) {
6287
6124
  var className;
6288
6125
  if (conf.className) className = conf.className;
6289
6126
  if (props.className) className = (className ? className + " " : "") + props.className;
6290
- return /* @__PURE__ */ React32.createElement("svg", _extends({
6127
+ return /* @__PURE__ */ React31.createElement("svg", _extends({
6291
6128
  stroke: "currentColor",
6292
6129
  fill: "currentColor",
6293
6130
  strokeWidth: "0"
@@ -6299,9 +6136,9 @@ function IconBase(props) {
6299
6136
  height: computedSize,
6300
6137
  width: computedSize,
6301
6138
  xmlns: "http://www.w3.org/2000/svg"
6302
- }), title && /* @__PURE__ */ React32.createElement("title", null, title), props.children);
6139
+ }), title && /* @__PURE__ */ React31.createElement("title", null, title), props.children);
6303
6140
  };
6304
- return IconContext !== void 0 ? /* @__PURE__ */ React32.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
6141
+ return IconContext !== void 0 ? /* @__PURE__ */ React31.createElement(IconContext.Consumer, null, (conf) => elem(conf)) : elem(DefaultContext);
6305
6142
  }
6306
6143
 
6307
6144
  // ../../node_modules/react-icons/fa/index.mjs
@@ -6315,9 +6152,9 @@ function SiZalo(props) {
6315
6152
  }
6316
6153
 
6317
6154
  // ../../components/ui/FloatingContacts.tsx
6318
- import { jsx as jsx41, jsxs as jsxs35 } from "react/jsx-runtime";
6155
+ import { jsx as jsx40, jsxs as jsxs34 } from "react/jsx-runtime";
6319
6156
  function MessengerIcon(props) {
6320
- return /* @__PURE__ */ jsx41("svg", { viewBox: "0 0 24 24", width: 24, height: 24, "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx41(
6157
+ return /* @__PURE__ */ jsx40("svg", { viewBox: "0 0 24 24", width: 24, height: 24, "aria-hidden": "true", ...props, children: /* @__PURE__ */ jsx40(
6321
6158
  "path",
6322
6159
  {
6323
6160
  d: "M12 2C6.477 2 2 6.145 2 11.235c0 2.93 1.35 5.542 3.464 7.25v3.515l3.344-1.836c.894.247 1.843.375 2.192.375 5.523 0 10-4.145 10-9.235S17.523 2 12 2zm.994 12.444l-2.563-2.73-5.004 2.73 5.507-5.84 2.626 2.729 4.942-2.729-5.508 5.84z",
@@ -6326,10 +6163,10 @@ function MessengerIcon(props) {
6326
6163
  ) });
6327
6164
  }
6328
6165
  function ZaloIcon(props) {
6329
- return /* @__PURE__ */ jsx41(SiZalo, { size: 20, ...props });
6166
+ return /* @__PURE__ */ jsx40(SiZalo, { size: 20, ...props });
6330
6167
  }
6331
6168
  function InstagramIcon(props) {
6332
- return /* @__PURE__ */ jsx41(FaInstagram, { size: 20, ...props });
6169
+ return /* @__PURE__ */ jsx40(FaInstagram, { size: 20, ...props });
6333
6170
  }
6334
6171
  function FloatingContacts({ className }) {
6335
6172
  const pathname = usePathname();
@@ -6364,8 +6201,8 @@ function FloatingContacts({ className }) {
6364
6201
  external: true
6365
6202
  }
6366
6203
  ];
6367
- return /* @__PURE__ */ jsxs35("div", { className: cn("fixed bottom-6 right-4 z-[100000]", "flex flex-col items-end gap-3", className), "aria-label": "Quick contacts", children: [
6368
- /* @__PURE__ */ jsx41(
6204
+ return /* @__PURE__ */ jsxs34("div", { className: cn("fixed bottom-6 right-4 z-[100000]", "flex flex-col items-end gap-3", className), "aria-label": "Quick contacts", children: [
6205
+ /* @__PURE__ */ jsx40(
6369
6206
  Link2,
6370
6207
  {
6371
6208
  href: `tel:${hotline.replace(/\D/g, "")}`,
@@ -6376,10 +6213,10 @@ function FloatingContacts({ className }) {
6376
6213
  "hover:scale-105 active:scale-95 transition-transform",
6377
6214
  "bg-[#22c55e]"
6378
6215
  ),
6379
- children: /* @__PURE__ */ jsx41(Phone, { className: "w-6 h-6" })
6216
+ children: /* @__PURE__ */ jsx40(Phone, { className: "w-6 h-6" })
6380
6217
  }
6381
6218
  ),
6382
- moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */ jsx41(
6219
+ moreItems.map(({ key, href, label, bg, Icon, external }) => /* @__PURE__ */ jsx40(
6383
6220
  Link2,
6384
6221
  {
6385
6222
  href,
@@ -6391,7 +6228,7 @@ function FloatingContacts({ className }) {
6391
6228
  "hover:scale-105 active:scale-95 transition-transform",
6392
6229
  bg
6393
6230
  ),
6394
- children: /* @__PURE__ */ jsx41(Icon, { className: "w-6 h-6" })
6231
+ children: /* @__PURE__ */ jsx40(Icon, { className: "w-6 h-6" })
6395
6232
  },
6396
6233
  key
6397
6234
  ))
@@ -6400,7 +6237,7 @@ function FloatingContacts({ className }) {
6400
6237
 
6401
6238
  // ../../components/ui/AccessDenied.tsx
6402
6239
  import { Lock, ShieldAlert, Ban } from "lucide-react";
6403
- import { jsx as jsx42, jsxs as jsxs36 } from "react/jsx-runtime";
6240
+ import { jsx as jsx41, jsxs as jsxs35 } from "react/jsx-runtime";
6404
6241
  var VARIANT_STYLES = {
6405
6242
  destructive: { bg: "bg-destructive/5", border: "border-destructive/20", text: "text-destructive" },
6406
6243
  warning: { bg: "bg-warning/5", border: "border-warning/20", text: "text-warning" },
@@ -6421,15 +6258,147 @@ function AccessDenied({
6421
6258
  }) {
6422
6259
  const styles = VARIANT_STYLES[variant];
6423
6260
  const UsedIcon = Icon || DEFAULT_ICONS[variant];
6424
- return /* @__PURE__ */ jsx42(Card_default, { className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className), children: /* @__PURE__ */ jsxs36("div", { className: "flex flex-col items-center gap-4", children: [
6425
- /* @__PURE__ */ jsx42("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ jsx42(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
6426
- /* @__PURE__ */ jsxs36("div", { children: [
6427
- /* @__PURE__ */ jsx42("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
6428
- /* @__PURE__ */ jsx42("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
6261
+ return /* @__PURE__ */ jsx41(Card_default, { className: cn("p-8 text-center shadow-sm", styles.bg, styles.border, className), children: /* @__PURE__ */ jsxs35("div", { className: "flex flex-col items-center gap-4", children: [
6262
+ /* @__PURE__ */ jsx41("div", { className: cn("p-3 rounded-lg", styles.bg.replace("/5", "/10")), children: /* @__PURE__ */ jsx41(UsedIcon, { className: cn("w-8 h-8", styles.text) }) }),
6263
+ /* @__PURE__ */ jsxs35("div", { children: [
6264
+ /* @__PURE__ */ jsx41("h3", { className: cn("font-semibold mb-2", styles.text), children: title }),
6265
+ /* @__PURE__ */ jsx41("p", { className: cn(styles.text.replace("text-", "text-") + "/80", "text-sm"), children: description })
6429
6266
  ] }),
6430
- children && /* @__PURE__ */ jsx42("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
6267
+ children && /* @__PURE__ */ jsx41("div", { className: "mt-2 flex flex-wrap gap-2 justify-center", children })
6431
6268
  ] }) });
6432
6269
  }
6270
+
6271
+ // locales/en.json
6272
+ var en_default = {
6273
+ Common: {
6274
+ close: "Close",
6275
+ closeAlert: "Close alert",
6276
+ notifications: "Notifications",
6277
+ newNotification: "New",
6278
+ readStatus: "Read",
6279
+ openLink: "Open link",
6280
+ theme: "Theme",
6281
+ lightTheme: "Light",
6282
+ darkTheme: "Dark",
6283
+ systemTheme: "System",
6284
+ density: "Density",
6285
+ compact: "Compact",
6286
+ normal: "Normal",
6287
+ comfortable: "Comfortable",
6288
+ columns: "Columns"
6289
+ },
6290
+ ValidationInput: {
6291
+ required: "This field is required",
6292
+ typeMismatch: "Invalid format",
6293
+ pattern: "Invalid pattern",
6294
+ tooShort: "Too short",
6295
+ tooLong: "Too long",
6296
+ rangeUnderflow: "Below minimum",
6297
+ rangeOverflow: "Above maximum",
6298
+ stepMismatch: "Step mismatch",
6299
+ badInput: "Bad input",
6300
+ invalid: "Invalid value"
6301
+ },
6302
+ Loading: {
6303
+ loadingPage: "Loading page",
6304
+ pleaseWait: "Please wait"
6305
+ },
6306
+ DatePicker: {
6307
+ placeholder: "Select date",
6308
+ today: "Today",
6309
+ clear: "Clear"
6310
+ },
6311
+ Pagination: {
6312
+ navigationLabel: "Pagination navigation",
6313
+ showingResults: "Showing {startItem}\u2013{endItem} of {totalItems}",
6314
+ firstPage: "First page",
6315
+ previousPage: "Previous page",
6316
+ previous: "Previous",
6317
+ nextPage: "Next page",
6318
+ next: "Next",
6319
+ lastPage: "Last page",
6320
+ pageNumber: "Page {page}",
6321
+ itemsPerPage: "Items per page",
6322
+ search: "Search",
6323
+ noOptions: "No options"
6324
+ },
6325
+ OCR: {
6326
+ imageUpload: {
6327
+ dragDropText: "Drag & drop files here",
6328
+ browseFiles: "Browse files",
6329
+ supportedFormats: "Supported formats: images"
6330
+ }
6331
+ }
6332
+ };
6333
+
6334
+ // locales/vi.json
6335
+ var vi_default = {
6336
+ Common: {
6337
+ close: "\u0110\xF3ng",
6338
+ closeAlert: "\u0110\xF3ng c\u1EA3nh b\xE1o",
6339
+ notifications: "Th\xF4ng b\xE1o",
6340
+ newNotification: "M\u1EDBi",
6341
+ readStatus: "\u0110\xE3 \u0111\u1ECDc",
6342
+ openLink: "M\u1EDF li\xEAn k\u1EBFt",
6343
+ theme: "Ch\u1EE7 \u0111\u1EC1",
6344
+ lightTheme: "Giao di\u1EC7n s\xE1ng",
6345
+ darkTheme: "Giao di\u1EC7n t\u1ED1i",
6346
+ systemTheme: "Theo h\u1EC7 th\u1ED1ng",
6347
+ density: "M\u1EADt \u0111\u1ED9",
6348
+ compact: "G\u1ECDn",
6349
+ normal: "Th\u01B0\u1EDDng",
6350
+ comfortable: "Tho\u1EA3i m\xE1i",
6351
+ columns: "C\u1ED9t"
6352
+ },
6353
+ ValidationInput: {
6354
+ required: "Tr\u01B0\u1EDDng n\xE0y l\xE0 b\u1EAFt bu\u1ED9c",
6355
+ typeMismatch: "\u0110\u1ECBnh d\u1EA1ng kh\xF4ng h\u1EE3p l\u1EC7",
6356
+ pattern: "Sai m\u1EABu",
6357
+ tooShort: "Qu\xE1 ng\u1EAFn",
6358
+ tooLong: "Qu\xE1 d\xE0i",
6359
+ rangeUnderflow: "Nh\u1ECF h\u01A1n gi\xE1 tr\u1ECB t\u1ED1i thi\u1EC3u",
6360
+ rangeOverflow: "L\u1EDBn h\u01A1n gi\xE1 tr\u1ECB t\u1ED1i \u0111a",
6361
+ stepMismatch: "Sai b\u01B0\u1EDBc",
6362
+ badInput: "Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7",
6363
+ invalid: "Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7"
6364
+ },
6365
+ Loading: {
6366
+ loadingPage: "\u0110ang t\u1EA3i trang",
6367
+ pleaseWait: "Vui l\xF2ng ch\u1EDD"
6368
+ },
6369
+ DatePicker: {
6370
+ placeholder: "Ch\u1ECDn ng\xE0y",
6371
+ today: "H\xF4m nay",
6372
+ clear: "X\xF3a"
6373
+ },
6374
+ Pagination: {
6375
+ navigationLabel: "\u0110i\u1EC1u h\u01B0\u1EDBng ph\xE2n trang",
6376
+ showingResults: "Hi\u1EC3n th\u1ECB {startItem}\u2013{endItem} trong t\u1ED5ng {totalItems}",
6377
+ firstPage: "Trang \u0111\u1EA7u",
6378
+ previousPage: "Trang tr\u01B0\u1EDBc",
6379
+ previous: "Tr\u01B0\u1EDBc",
6380
+ nextPage: "Trang sau",
6381
+ next: "Sau",
6382
+ lastPage: "Trang cu\u1ED1i",
6383
+ pageNumber: "Trang {page}",
6384
+ itemsPerPage: "S\u1ED1 m\u1EE5c/trang",
6385
+ search: "T\xECm ki\u1EBFm",
6386
+ noOptions: "Kh\xF4ng c\xF3 l\u1EF1a ch\u1ECDn"
6387
+ },
6388
+ OCR: {
6389
+ imageUpload: {
6390
+ dragDropText: "K\xE9o & th\u1EA3 \u1EA3nh v\xE0o \u0111\xE2y",
6391
+ browseFiles: "Ch\u1ECDn t\u1EC7p",
6392
+ supportedFormats: "H\u1ED7 tr\u1EE3 c\xE1c \u0111\u1ECBnh d\u1EA1ng \u1EA3nh"
6393
+ }
6394
+ }
6395
+ };
6396
+
6397
+ // src/index.ts
6398
+ var underverseMessages = { en: en_default, vi: vi_default };
6399
+ function getUnderverseMessages(locale = "en") {
6400
+ return underverseMessages[locale] || underverseMessages.en;
6401
+ }
6433
6402
  export {
6434
6403
  AccessDenied,
6435
6404
  Alert_default as Alert,
@@ -6470,7 +6439,6 @@ export {
6470
6439
  Pagination,
6471
6440
  PillTabs,
6472
6441
  Popover,
6473
- ProductImageUpload_default as ProductImageUpload,
6474
6442
  Progress_default as Progress,
6475
6443
  PulseBadge,
6476
6444
  RadioGroup_default as RadioGroup,
@@ -6503,6 +6471,8 @@ export {
6503
6471
  VARIANT_STYLES_BTN,
6504
6472
  VerticalTabs,
6505
6473
  cn,
6474
+ getUnderverseMessages,
6475
+ underverseMessages,
6506
6476
  useToast
6507
6477
  };
6508
6478
  //# sourceMappingURL=index.js.map