@underverse-ui/underverse 0.2.63 → 0.2.65

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../lib/constants/constants-ui/button.ts","../../../lib/utils/cn.ts","../../../components/ui/Button.tsx","../../../components/ui/CheckBox.tsx","../../../lib/i18n/translation-adapter.tsx","../../../components/ui/Input.tsx","../../../components/ui/label.tsx"],"sourcesContent":["export const VARIANT_STYLES_BTN = {\n // Mặc định: tối giản, rõ ràng, dùng tokens hệ màu\n default:\n \"bg-background/80 backdrop-blur-sm text-foreground border border-border hover:bg-accent/50 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Viền: trong suốt, viền tinh tế, hover nhẹ\n outline:\n \"bg-transparent backdrop-blur-sm border border-input hover:bg-accent/40 hover:text-accent-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Primary: dùng brand, bỏ hiệu ứng scale/shadow mạnh\n primary:\n \"bg-primary text-primary-foreground hover:bg-primary/90 shadow-sm border border-primary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/90 shadow-sm border border-secondary/20 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n success:\n \"bg-success text-success-foreground hover:bg-success/90 shadow-sm border border-success/20 focus-visible:ring-2 focus-visible:ring-success/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n danger:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Alias for shadcn-style prop naming used in some components\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm border border-destructive/20 focus-visible:ring-2 focus-visible:ring-destructive/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n warning:\n \"bg-warning text-warning-foreground hover:bg-warning/90 shadow-sm border border-warning/20 focus-visible:ring-2 focus-visible:ring-warning/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n info: \"bg-info text-info-foreground hover:bg-info/90 shadow-sm border border-info/20 focus-visible:ring-2 focus-visible:ring-info/60 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n\n // Ghost: minimal\n ghost: \"bg-transparent hover:bg-accent/20 hover:text-accent-foreground backdrop-blur-sm transition-colors\",\n\n // Link: chỉ văn bản\n link: \"text-primary bg-transparent underline-offset-4 hover:underline hover:text-primary/85 transition-colors\",\n\n // Gradient: smooth gradient từ primary → secondary (cùng tone)\n gradient: \"bg-linear-to-r from-primary via-primary/80 to-secondary text-primary-foreground hover:opacity-90 shadow-md border-0\",\n};\n\nexport const SIZE_STYLES_BTN = {\n sm: \"px-3 py-1.5 text-sm h-8 min-w-8 md:px-2.5 md:py-1 md:h-7 md:text-xs\",\n md: \"px-4 py-2 text-sm h-10 min-w-10 md:px-3 md:py-1.5 md:h-9\",\n lg: \"px-6 py-3 text-base h-12 min-w-12 md:px-4 md:py-2 md:h-10 md:text-sm\",\n smx: \"px-3.5 py-1.5 text-[13px] h-9 min-w-9 md:px-3 md:py-1 md:h-8 md:text-xs\",\n icon: \"w-11 h-11 p-0 rounded-full flex items-center justify-center md:w-10 md:h-10\",\n};\n","import { clsx, type ClassValue } from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(...inputs));\r\n}\r\n","\"use client\";\n\nimport React, { forwardRef, useCallback, useRef, useState } from \"react\";\nimport { VARIANT_STYLES_BTN, SIZE_STYLES_BTN } from \"@/lib/constants/constants-ui/button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { Activity } from \"lucide-react\";\n\n// Khai báo kiểu cho props\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n children?: React.ReactNode;\n type?: \"button\" | \"submit\" | \"reset\";\n icon?: React.ComponentType<{ className?: string }>;\n iconRight?: React.ComponentType<{ className?: string }>;\n variant?: keyof typeof VARIANT_STYLES_BTN;\n size?: keyof typeof SIZE_STYLES_BTN;\n className?: string;\n iConClassName?: string;\n disabled?: boolean;\n loading?: boolean;\n fullWidth?: boolean;\n title?: string;\n // Nâng cấp: tuỳ biến spinner & UX khi loading\n spinner?: React.ComponentType<{ className?: string }>;\n loadingText?: React.ReactNode;\n preserveChildrenOnLoading?: boolean; // giữ nguyên children khi loading\n // Chống double-click vô ý\n preventDoubleClick?: boolean;\n lockMs?: number; // thời gian khóa nếu onClick không trả Promise\n // Layout flexibility\n asContainer?: boolean; // cho phép children tự do layout (không force items-center)\n // Ngăn xuống dòng khiến icon nằm trên, text nằm dưới\n noWrap?: boolean; // mặc định: true\n // Tắt overlay gradient hover mặc định\n noHoverOverlay?: boolean;\n // Bật nền gradient (alias cho variant=\"gradient\")\n gradient?: boolean;\n}\n\n// Sử dụng forwardRef để chuyển tiếp ref\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n onClick,\n children,\n type = \"button\",\n icon: Icon,\n iconRight: IconRight,\n variant = \"default\",\n size = \"md\",\n className = \"\",\n iConClassName = \"\",\n disabled = false,\n loading = false,\n fullWidth = false,\n title,\n spinner: Spinner,\n loadingText,\n preserveChildrenOnLoading = false,\n // custom behavior props (do not forward to DOM)\n preventDoubleClick = false,\n lockMs = 600,\n asContainer = false,\n noWrap = true,\n noHoverOverlay = false,\n gradient = false,\n ...rest\n },\n ref,\n ) => {\n const baseStyles = asContainer\n ? \"relative inline-flex justify-center rounded-full font-medium transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\"\n : \"relative inline-flex items-center justify-center gap-2 rounded-full font-medium overflow-hidden transition-colors duration-150 ease-soft outline-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px\";\n\n const finalVariant = gradient ? \"gradient\" : variant;\n const variantStyle = VARIANT_STYLES_BTN[finalVariant] || VARIANT_STYLES_BTN.default;\n const sizeStyle = SIZE_STYLES_BTN[size] || SIZE_STYLES_BTN.md;\n\n const SpinnerIcon = Spinner ?? Activity;\n const [locked, setLocked] = useState(false);\n const lockTimer = useRef<NodeJS.Timeout | null>(null);\n\n const handleClick = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n if (preventDoubleClick) {\n if (locked) return;\n setLocked(true);\n try {\n const result = onClick?.(e) as unknown;\n if (result && typeof (result as any) === \"object\" && typeof (result as any).then === \"function\") {\n await (result as any);\n setLocked(false);\n } else {\n const ms = lockMs ?? 600;\n if (lockTimer.current) clearTimeout(lockTimer.current);\n lockTimer.current = setTimeout(() => setLocked(false), ms);\n }\n } catch (err) {\n setLocked(false);\n throw err;\n }\n } else {\n onClick?.(e);\n }\n },\n [disabled, loading, onClick, locked, preventDoubleClick, lockMs],\n );\n\n const computedDisabled = disabled || loading || (preventDoubleClick ? locked : false);\n\n return (\n <button\n ref={ref}\n type={type}\n onClick={handleClick}\n title={title}\n className={cn(\n baseStyles,\n variantStyle,\n sizeStyle,\n \"group\",\n noWrap && \"whitespace-nowrap\",\n {\n \"cursor-pointer hover:opacity-95\": !computedDisabled,\n \"opacity-50 cursor-not-allowed\": computedDisabled,\n \"w-full\": fullWidth,\n },\n className,\n )}\n disabled={computedDisabled}\n aria-disabled={computedDisabled}\n aria-busy={loading}\n data-variant={variant}\n data-size={size}\n data-locked={preventDoubleClick ? (locked ? \"true\" : \"false\") : undefined}\n aria-label={(rest as any)[\"aria-label\"] || title}\n {...rest}\n >\n {!noHoverOverlay ? (\n <span className=\"absolute inset-0 bg-linear-to-r from-primary-foreground/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-200 dark:hidden\" />\n ) : null}\n {loading ? (\n <>\n <SpinnerIcon className=\"w-4 h-4 animate-spin\" aria-hidden=\"true\" />\n {loadingText ? (\n <span className=\"ml-2\" aria-live=\"polite\">\n {loadingText}\n </span>\n ) : null}\n {preserveChildrenOnLoading && !loadingText ? (\n <span className=\"ml-2 opacity-70\" aria-hidden>\n {children}\n </span>\n ) : null}\n </>\n ) : (\n <>\n {Icon ? <Icon className={cn(\"transition-transform duration-200\", iConClassName ? iConClassName : \"w-5 h-5\")} /> : null}\n {children}\n {IconRight ? <IconRight className=\"w-4 h-4 transition-transform duration-200\" /> : null}\n </>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n","\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Check } from \"lucide-react\";\r\n\r\nexport interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\r\n label?: React.ReactNode;\r\n labelClassName?: string;\r\n containerClassName?: string;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n ({ className, label, labelClassName, containerClassName, checked, defaultChecked, onChange, ...props }, ref) => {\r\n const [internalChecked, setInternalChecked] = React.useState<boolean>(defaultChecked ?? false);\r\n\r\n const isControlled = checked !== undefined;\r\n const isChecked = isControlled ? checked : internalChecked;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (!isControlled) {\r\n setInternalChecked(e.target.checked);\r\n }\r\n onChange?.(e);\r\n };\r\n\r\n return (\r\n <label className={cn(\"inline-flex items-center gap-2 cursor-pointer select-none\", containerClassName)}>\r\n <input type=\"checkbox\" ref={ref} checked={isChecked} onChange={handleChange} className=\"hidden\" {...props} />\r\n <div\r\n className={cn(\r\n \"w-5 h-5 border rounded-md flex items-center justify-center transition-all duration-200 ease-soft\",\r\n \"hover:shadow-sm active:scale-95\",\r\n isChecked\r\n ? \"bg-primary border-primary shadow-md text-primary-foreground\"\r\n : \"bg-background border-input hover:border-accent-foreground/30 hover:bg-accent/10\",\r\n )}\r\n >\r\n {isChecked && <Check className=\"w-4 h-4\" />}\r\n </div>\r\n {label && <span className={cn(\"text-sm text-foreground\", labelClassName)}>{label}</span>}\r\n </label>\r\n );\r\n },\r\n);\r\n\r\nCheckbox.displayName = \"Checkbox\";\r\n\r\nexport { Checkbox };\r\n","\"use client\";\n\n/**\n * Translation adapter for Underverse UI components.\n *\n * This module provides a unified translation interface that:\n * 1. Uses next-intl when available (for Next.js projects)\n * 2. Falls back to @underverse-ui/underverse's internal translations\n *\n * Components should import from this file instead of directly from next-intl\n * to ensure compatibility with both Next.js and React projects.\n */\n\nimport * as React from \"react\";\n\n// ============================================================================\n// Default translations (fallback when next-intl is not available)\n// ============================================================================\ntype TranslationValue = string | Record<string, string>;\ntype NamespaceTranslations = Record<string, TranslationValue>;\ntype LocaleTranslations = Record<string, NamespaceTranslations>;\n\nconst defaultTranslations: Record<string, LocaleTranslations> = {\n en: {\n Common: {\n close: \"Close\",\n closeAlert: \"Close alert\",\n notifications: \"Notifications\",\n newNotification: \"New\",\n readStatus: \"Read\",\n openLink: \"Open link\",\n theme: \"Theme\",\n lightTheme: \"Light\",\n darkTheme: \"Dark\",\n systemTheme: \"System\",\n density: \"Density\",\n compact: \"Compact\",\n normal: \"Normal\",\n comfortable: \"Comfortable\",\n columns: \"Columns\",\n },\n ValidationInput: {\n required: \"This field is required\",\n typeMismatch: \"Invalid format\",\n pattern: \"Invalid pattern\",\n tooShort: \"Too short\",\n tooLong: \"Too long\",\n rangeUnderflow: \"Below minimum\",\n rangeOverflow: \"Above maximum\",\n stepMismatch: \"Step mismatch\",\n badInput: \"Bad input\",\n invalid: \"Invalid value\",\n },\n Loading: {\n loadingPage: \"Loading page\",\n pleaseWait: \"Please wait\",\n },\n DatePicker: {\n placeholder: \"Select date\",\n today: \"Today\",\n clear: \"Clear\",\n },\n Pagination: {\n navigationLabel: \"Pagination navigation\",\n showingResults: \"Showing {startItem}–{endItem} of {totalItems}\",\n firstPage: \"First page\",\n previousPage: \"Previous page\",\n previous: \"Previous\",\n nextPage: \"Next page\",\n next: \"Next\",\n lastPage: \"Last page\",\n pageNumber: \"Page {page}\",\n itemsPerPage: \"Items per page\",\n search: \"Search\",\n noOptions: \"No options\",\n },\n Form: {\n required: \"This field is required\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Drag & drop files here\",\n browseFiles: \"Browse files\",\n supportedFormats: \"Supported formats: images\",\n },\n },\n },\n vi: {\n Common: {\n close: \"Đóng\",\n closeAlert: \"Đóng cảnh báo\",\n notifications: \"Thông báo\",\n newNotification: \"Mới\",\n readStatus: \"Đã đọc\",\n openLink: \"Mở liên kết\",\n theme: \"Chủ đề\",\n lightTheme: \"Giao diện sáng\",\n darkTheme: \"Giao diện tối\",\n systemTheme: \"Theo hệ thống\",\n density: \"Mật độ\",\n compact: \"Gọn\",\n normal: \"Thường\",\n comfortable: \"Thoải mái\",\n columns: \"Cột\",\n },\n ValidationInput: {\n required: \"Trường này là bắt buộc\",\n typeMismatch: \"Định dạng không hợp lệ\",\n pattern: \"Sai mẫu\",\n tooShort: \"Quá ngắn\",\n tooLong: \"Quá dài\",\n rangeUnderflow: \"Nhỏ hơn giá trị tối thiểu\",\n rangeOverflow: \"Lớn hơn giá trị tối đa\",\n stepMismatch: \"Sai bước\",\n badInput: \"Giá trị không hợp lệ\",\n invalid: \"Giá trị không hợp lệ\",\n },\n Loading: {\n loadingPage: \"Đang tải trang\",\n pleaseWait: \"Vui lòng chờ\",\n },\n DatePicker: {\n placeholder: \"Chọn ngày\",\n today: \"Hôm nay\",\n clear: \"Xóa\",\n },\n Pagination: {\n navigationLabel: \"Điều hướng phân trang\",\n showingResults: \"Hiển thị {startItem}–{endItem} trong tổng {totalItems}\",\n firstPage: \"Trang đầu\",\n previousPage: \"Trang trước\",\n previous: \"Trước\",\n nextPage: \"Trang sau\",\n next: \"Sau\",\n lastPage: \"Trang cuối\",\n pageNumber: \"Trang {page}\",\n itemsPerPage: \"Số mục/trang\",\n search: \"Tìm kiếm\",\n noOptions: \"Không có lựa chọn\",\n },\n Form: {\n required: \"Trường này là bắt buộc\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"Kéo & thả ảnh vào đây\",\n browseFiles: \"Chọn tệp\",\n supportedFormats: \"Hỗ trợ các định dạng ảnh\",\n },\n },\n },\n ko: {\n Common: {\n close: \"닫기\",\n closeAlert: \"알림 닫기\",\n notifications: \"알림\",\n newNotification: \"새로운\",\n readStatus: \"읽음\",\n openLink: \"링크 열기\",\n theme: \"테마\",\n lightTheme: \"라이트\",\n darkTheme: \"다크\",\n systemTheme: \"시스템\",\n density: \"밀도\",\n compact: \"컴팩트\",\n normal: \"보통\",\n comfortable: \"여유\",\n columns: \"열\",\n },\n ValidationInput: {\n required: \"필수 입력 항목입니다\",\n typeMismatch: \"형식이 올바르지 않습니다\",\n pattern: \"패턴이 일치하지 않습니다\",\n tooShort: \"너무 짧습니다\",\n tooLong: \"너무 깁니다\",\n rangeUnderflow: \"최솟값보다 작습니다\",\n rangeOverflow: \"최댓값을 초과했습니다\",\n stepMismatch: \"단계가 일치하지 않습니다\",\n badInput: \"잘못된 입력입니다\",\n invalid: \"유효하지 않은 값입니다\",\n },\n Loading: {\n loadingPage: \"페이지 로딩 중\",\n pleaseWait: \"잠시만 기다려 주세요\",\n },\n DatePicker: {\n placeholder: \"날짜 선택\",\n today: \"오늘\",\n clear: \"지우기\",\n },\n Pagination: {\n navigationLabel: \"페이지 네비게이션\",\n showingResults: \"{startItem}–{endItem} / 총 {totalItems}개\",\n firstPage: \"첫 페이지\",\n previousPage: \"이전 페이지\",\n previous: \"이전\",\n nextPage: \"다음 페이지\",\n next: \"다음\",\n lastPage: \"마지막 페이지\",\n pageNumber: \"{page}페이지\",\n itemsPerPage: \"페이지당 항목 수\",\n search: \"검색\",\n noOptions: \"옵션 없음\",\n },\n Form: {\n required: \"필수 입력 항목입니다\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"여기에 파일을 드래그 앤 드롭하세요\",\n browseFiles: \"파일 찾아보기\",\n supportedFormats: \"지원 형식: 이미지\",\n },\n },\n },\n ja: {\n Common: {\n close: \"閉じる\",\n closeAlert: \"アラートを閉じる\",\n notifications: \"通知\",\n newNotification: \"新規\",\n readStatus: \"既読\",\n openLink: \"リンクを開く\",\n theme: \"テーマ\",\n lightTheme: \"ライト\",\n darkTheme: \"ダーク\",\n systemTheme: \"システム\",\n density: \"密度\",\n compact: \"コンパクト\",\n normal: \"通常\",\n comfortable: \"ゆったり\",\n columns: \"列\",\n },\n ValidationInput: {\n required: \"この項目は必須です\",\n typeMismatch: \"形式が正しくありません\",\n pattern: \"パターンが一致しません\",\n tooShort: \"短すぎます\",\n tooLong: \"長すぎます\",\n rangeUnderflow: \"最小値より小さいです\",\n rangeOverflow: \"最大値を超えています\",\n stepMismatch: \"ステップが一致しません\",\n badInput: \"入力が無効です\",\n invalid: \"無効な値です\",\n },\n Loading: {\n loadingPage: \"ページを読み込み中\",\n pleaseWait: \"しばらくお待ちください\",\n },\n DatePicker: {\n placeholder: \"日付を選択\",\n today: \"今日\",\n clear: \"クリア\",\n },\n Pagination: {\n navigationLabel: \"ページナビゲーション\",\n showingResults: \"{startItem}–{endItem} / 全{totalItems}件\",\n firstPage: \"最初のページ\",\n previousPage: \"前のページ\",\n previous: \"前へ\",\n nextPage: \"次のページ\",\n next: \"次へ\",\n lastPage: \"最後のページ\",\n pageNumber: \"{page}ページ\",\n itemsPerPage: \"1ページあたりの項目数\",\n search: \"検索\",\n noOptions: \"オプションなし\",\n },\n Form: {\n required: \"この項目は必須です\",\n },\n OCR: {\n imageUpload: {\n dragDropText: \"ここにファイルをドラッグ&ドロップ\",\n browseFiles: \"ファイルを参照\",\n supportedFormats: \"対応形式:画像\",\n },\n },\n },\n};\n\n// ============================================================================\n// Translation Context (for standalone React usage)\n// ============================================================================\ntype Locale = \"en\" | \"vi\" | \"ko\" | \"ja\";\n\ninterface TranslationContextType {\n locale: Locale;\n t: (namespace: string) => (key: string) => string;\n}\n\nconst TranslationContext = React.createContext<TranslationContextType | null>(null);\n\nexport interface UnderverseProviderProps {\n children: React.ReactNode;\n /** Current locale. Defaults to \"en\" */\n locale?: Locale;\n /** Custom translations to merge with defaults */\n translations?: Record<string, Record<string, string | Record<string, string>>>;\n}\n\n/**\n * UnderverseProvider for standalone React usage (without next-intl).\n * Wrap your app with this provider to enable translations.\n *\n * @example\n * ```tsx\n * // For React (Vite, CRA, etc.) - without next-intl\n * import { UnderverseProvider, DatePicker } from \"@underverse-ui/underverse\";\n *\n * function App() {\n * return (\n * <UnderverseProvider locale=\"vi\">\n * <DatePicker onChange={(date) => console.log(date)} />\n * </UnderverseProvider>\n * );\n * }\n * ```\n */\nexport const UnderverseProvider: React.FC<UnderverseProviderProps> = ({ children, locale = \"en\", translations }) => {\n const t = React.useCallback(\n (namespace: string) => {\n return (key: string): string => {\n const mergedTranslations = {\n ...defaultTranslations[locale],\n ...translations,\n };\n\n // Handle nested namespaces like \"OCR.imageUpload\"\n const parts = namespace.split(\".\");\n let current: unknown = mergedTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return key;\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? value : key;\n }\n\n return key;\n };\n },\n [locale, translations]\n );\n\n return <TranslationContext.Provider value={{ locale, t }}>{children}</TranslationContext.Provider>;\n};\n\n// ============================================================================\n// Try to detect next-intl\n// ============================================================================\nlet nextIntlAvailable = false;\nlet nextIntlUseTranslations: ((namespace: string) => (key: string) => string) | null = null;\nlet nextIntlUseLocale: (() => string) | null = null;\n\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const nextIntl = require(\"next-intl\");\n if (nextIntl && typeof nextIntl.useTranslations === \"function\") {\n nextIntlAvailable = true;\n nextIntlUseTranslations = nextIntl.useTranslations;\n nextIntlUseLocale = nextIntl.useLocale;\n }\n} catch {\n // next-intl not available\n}\n\n// ============================================================================\n// Smart hooks that auto-detect translation system\n// ============================================================================\n\n/**\n * Interpolate placeholders in a string.\n * Replaces {key} with the corresponding value from params.\n */\nfunction interpolate(template: string, params?: Record<string, unknown>): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : `{${key}}`;\n });\n}\n\n/**\n * Internal fallback translation function.\n */\nfunction getInternalTranslation(namespace: string, locale: Locale): (key: string, params?: Record<string, unknown>) => string {\n return (key: string, params?: Record<string, unknown>): string => {\n const localeTranslations = defaultTranslations[locale] || defaultTranslations.en;\n const parts = namespace.split(\".\");\n let current: unknown = localeTranslations;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return interpolate(key, params);\n }\n }\n\n if (current && typeof current === \"object\" && key in current) {\n const value = (current as Record<string, unknown>)[key];\n return typeof value === \"string\" ? interpolate(value, params) : interpolate(key, params);\n }\n\n return interpolate(key, params);\n };\n}\n\n/**\n * Smart translation hook that works with both next-intl and standalone React.\n *\n * Priority:\n * 1. next-intl (if available and in NextIntlClientProvider)\n * 2. UnderverseProvider context\n * 3. English fallback defaults\n *\n * @param namespace - The translation namespace (e.g., \"DatePicker\", \"Common\")\n */\nexport function useTranslations(namespace: string): (key: string, params?: Record<string, unknown>) => string {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return (key: string, params?: Record<string, unknown>) => {\n const result = underverseContext.t(namespace)(key);\n return interpolate(result, params);\n };\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseTranslations) {\n try {\n // This will throw if not wrapped in NextIntlClientProvider\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const nextIntlT = nextIntlUseTranslations(namespace);\n // next-intl's t function already supports params\n return nextIntlT as (key: string, params?: Record<string, unknown>) => string;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English defaults\n return getInternalTranslation(namespace, \"en\");\n}\n\n/**\n * Smart locale hook that works with both next-intl and standalone React.\n */\nexport function useLocale(): Locale {\n const underverseContext = React.useContext(TranslationContext);\n\n // If UnderverseProvider is available, use it\n if (underverseContext) {\n return underverseContext.locale;\n }\n\n // Try next-intl if available\n if (nextIntlAvailable && nextIntlUseLocale) {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const locale = nextIntlUseLocale();\n return (locale === \"vi\" ? \"vi\" : \"en\") as Locale;\n } catch {\n // Fall through to default\n }\n }\n\n // Fallback to English\n return \"en\";\n}\n\nexport type { Locale };\n","// components/ui/Input.tsx\r\n\"use client\";\r\n\r\nimport React, { forwardRef, InputHTMLAttributes, useId, useState } from \"react\";\r\nimport { useTranslations } from \"@/lib/i18n/translation-adapter\";\r\nimport { cn } from \"@/lib/utils/cn\";\r\nimport { Eye, EyeOff, Search, X, AlertCircle, CheckCircle, Loader2 } from \"lucide-react\";\r\n\r\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n leftIcon?: React.ComponentType<{ className?: string }>;\r\n rightIcon?: React.ComponentType<{ className?: string }>;\r\n clearable?: boolean;\r\n loading?: boolean;\r\n success?: boolean;\r\n onClear?: () => void;\r\n hint?: string;\r\n counter?: boolean;\r\n maxLength?: number;\r\n}\r\n\r\nconst Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n description,\r\n className,\r\n required,\r\n variant = \"default\",\r\n size = \"md\",\r\n leftIcon: LeftIcon,\r\n rightIcon: RightIcon,\r\n clearable = false,\r\n loading = false,\r\n success = false,\r\n onClear,\r\n hint,\r\n counter = false,\r\n type = \"text\",\r\n value,\r\n maxLength,\r\n ...rest\r\n },\r\n ref,\r\n ) => {\r\n const [localError, setLocalError] = useState<string | undefined>(error);\r\n const [showPassword, setShowPassword] = useState(false);\r\n const [isFocused, setIsFocused] = useState(false);\r\n const tv = useTranslations(\"ValidationInput\");\r\n const autoId = useId();\r\n // Only attach a generated id when we need to reference it (label/description/error)\r\n const needsId = !!(label || description || hint || error);\r\n const resolvedId = (rest.id as string) || (needsId ? `input-${autoId}` : undefined);\r\n\r\n const errMsg = error || localError;\r\n const hasValue = value !== undefined && value !== null && value !== \"\";\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n const errorId = errMsg && resolvedId ? `${resolvedId}-error` : undefined;\r\n const descId = !errMsg && (description || hint) && resolvedId ? `${resolvedId}-desc` : undefined;\r\n const containerSpacing = size === \"sm\" ? \"space-y-1.5\" : \"space-y-2\";\r\n\r\n // Variant styles\r\n const variantStyles = {\r\n default: {\r\n container: \"bg-background border border-input hover:border-accent-foreground/20\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n filled: {\r\n container: \"bg-muted/50 border border-transparent hover:bg-muted/70\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"bg-destructive/10 border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n outlined: {\r\n container: \"bg-transparent border border-border hover:border-accent-foreground/30\",\r\n focus:\r\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n error:\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n },\r\n minimal: {\r\n container: \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30\",\r\n focus: \"focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n error: \"border-destructive focus-visible:outline-none focus-visible:border-destructive\",\r\n },\r\n };\r\n\r\n // Size styles\r\n const sizeStyles = {\r\n sm: {\r\n input: \"px-3 py-1.5 text-sm h-8 md:h-7 md:py-1 md:text-xs\",\r\n icon: \"w-4 h-4\",\r\n button: \"h-7 w-7\",\r\n },\r\n md: {\r\n input: \"px-4 py-2 text-sm h-10\",\r\n icon: \"w-5 h-5\",\r\n button: \"h-8 w-8\",\r\n },\r\n lg: {\r\n input: \"px-5 py-4 text-base h-12\",\r\n icon: \"w-6 h-6\",\r\n button: \"h-10 w-10\",\r\n },\r\n };\r\n\r\n const getErrorKey = (v: ValidityState) => {\r\n if (v.valueMissing) return \"required\";\r\n if (v.typeMismatch) return \"typeMismatch\";\r\n if (v.patternMismatch) return \"pattern\";\r\n if (v.tooShort) return \"tooShort\";\r\n if (v.tooLong) return \"tooLong\";\r\n if (v.rangeUnderflow) return \"rangeUnderflow\";\r\n if (v.rangeOverflow) return \"rangeOverflow\";\r\n if (v.stepMismatch) return \"stepMismatch\";\r\n if (v.badInput) return \"badInput\";\r\n return \"invalid\";\r\n };\r\n\r\n // Status icon\r\n const getStatusIcon = () => {\r\n if (loading) return <Loader2 className={cn(\"animate-spin text-muted-foreground\", sizeStyles[size].icon)} />;\r\n if (success) return <CheckCircle className={cn(\"text-success\", sizeStyles[size].icon)} />;\r\n if (errMsg) return <AlertCircle className={cn(\"text-destructive\", sizeStyles[size].icon)} />;\r\n return null;\r\n };\r\n\r\n // Password toggle for password inputs\r\n const showPasswordToggle = type === \"password\";\r\n const actualType = showPasswordToggle && showPassword ? \"text\" : type;\r\n\r\n // Extract handlers and disabled state\r\n const { onFocus: onFocusProp, onBlur: onBlurProp, disabled } = rest;\r\n\r\n // Filter out custom props to create clean HTML attributes\r\n const {\r\n label: _label,\r\n error: _error,\r\n description: _description,\r\n variant: _variant,\r\n size: _size,\r\n leftIcon: _leftIcon,\r\n rightIcon: _rightIcon,\r\n clearable: _clearable,\r\n loading: _loading,\r\n success: _success,\r\n onClear: _onClear,\r\n hint: _hint,\r\n counter: _counter,\r\n ...restInput\r\n } = rest as any;\r\n\r\n const handleFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(true);\r\n onFocusProp?.(e);\r\n };\r\n\r\n const handleBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {\r\n setIsFocused(false);\r\n onBlurProp?.(e);\r\n };\r\n\r\n // Radius by size for visual consistency with Combobox/DatePicker\r\n const radiusClass = size === \"sm\" ? \"rounded-full\" : \"rounded-full\";\r\n\r\n return (\r\n <div className={cn(\"w-full group\", containerSpacing)}>\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n htmlFor={resolvedId}\r\n className={cn(\r\n // Label size follows input size\r\n size === \"sm\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : \"text-sm\",\r\n \"font-medium transition-colors duration-200\",\r\n // default color and highlight while any descendant focused\r\n disabled ? \"text-muted-foreground\" : cn(\"text-foreground group-focus-within:text-primary\", success && \"text-primary\"),\r\n errMsg && \"text-destructive\",\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\",\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Input Container */}\r\n <div className=\"relative group\">\r\n {/* Left Icon */}\r\n {LeftIcon && (\r\n <div\r\n className={cn(\r\n \"absolute left-3 top-1/2 -translate-y-1/2 z-10\",\r\n \"text-muted-foreground transition-colors duration-200\",\r\n // highlight icon when input (or controls) focused\r\n \"group-focus-within:text-primary\",\r\n )}\r\n >\r\n <LeftIcon className={sizeStyles[size].icon} />\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type={actualType}\r\n // NOTE: Only controlled when `value` prop is provided.\r\n {...(value !== undefined ? { value } : {})}\r\n maxLength={maxLength}\r\n required={required}\r\n id={resolvedId}\r\n autoComplete={type === \"password\" ? \"current-password\" : type === \"email\" ? \"email\" : rest.autoComplete}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onInvalid={(e) => {\r\n e.preventDefault();\r\n const key = getErrorKey(e.currentTarget.validity);\r\n setLocalError(tv(key));\r\n }}\r\n onInput={() => setLocalError(undefined)}\r\n aria-invalid={!!errMsg}\r\n aria-describedby={[errorId, descId].filter(Boolean).join(\" \") || undefined}\r\n className={cn(\r\n \"w-full text-foreground transition-all duration-200 ease-out\",\r\n \"placeholder:text-muted-foreground focus:outline-none focus-visible:outline-none\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n\r\n // Size styles\r\n sizeStyles[size].input,\r\n radiusClass,\r\n\r\n // Icon padding adjustments\r\n LeftIcon && \"pl-10\",\r\n (RightIcon || showPasswordToggle || clearable || loading || success || errMsg) && \"pr-10\",\r\n\r\n // Variant styles\r\n variantStyles[variant].container,\r\n errMsg ? variantStyles[variant].error : variantStyles[variant].focus,\r\n\r\n // Reduce visual weight for sm: no default drop shadows\r\n size !== \"sm\" && variant !== \"minimal\" && \"shadow-sm\",\r\n size !== \"sm\" && isFocused && \"shadow-md\",\r\n\r\n className,\r\n )}\r\n disabled={disabled}\r\n {...restInput}\r\n />\r\n\r\n {/* Right Icons */}\r\n <div className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {/* Status Icon */}\r\n {getStatusIcon()}\r\n\r\n {/* Custom Right Icon */}\r\n {RightIcon && !loading && !success && !errMsg && <RightIcon className={cn(\"text-muted-foreground\", sizeStyles[size].icon)} />}\r\n\r\n {/* Clear Button */}\r\n {clearable && hasValue && !loading && (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (onClear) return onClear();\r\n (rest.onChange as any)?.({ target: { value: \"\" } });\r\n }}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-md\",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\r\n \"active:bg-accent active:text-accent-foreground\",\r\n sizeStyles[size].button,\r\n )}\r\n tabIndex={0}\r\n aria-label=\"Clear input\"\r\n >\r\n <X className={sizeStyles[size].icon} />\r\n </button>\r\n )}\r\n\r\n {/* Password Toggle */}\r\n {showPasswordToggle && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n className={cn(\r\n \"flex items-center justify-center text-muted-foreground hover:text-foreground transition-colors rounded-full\",\r\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring/40\",\r\n \"active:bg-accent/50 active:text-accent-foreground\",\r\n sizeStyles[size].button,\r\n )}\r\n tabIndex={0}\r\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\r\n >\r\n {showPassword ? <EyeOff className={sizeStyles[size].icon} /> : <Eye className={sizeStyles[size].icon} />}\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Focus Indicator for minimal variant */}\r\n {variant === \"minimal\" && (\r\n <div\r\n className={cn(\r\n \"absolute bottom-0 left-0 h-0.5 bg-linear-to-r from-primary to-primary/60 transition-all duration-300\",\r\n // default hidden\r\n \"w-0 opacity-0\",\r\n // expand underline when focused within input container\r\n \"group-focus-within:w-full group-focus-within:opacity-100\",\r\n )}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Error Message */}\r\n {errMsg ? (\r\n <div id={errorId} className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{errMsg}</span>\r\n </div>\r\n ) : null}\r\n\r\n {/* Description/Hint */}\r\n {(description || hint) && !errMsg && (\r\n <p\r\n id={descId}\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n // follow focus state of the whole field area\r\n \"text-muted-foreground group-focus-within:text-primary/70\",\r\n )}\r\n >\r\n {hint || description}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nInput.displayName = \"Input\";\r\n\r\n// Search Input - specialized for search functionality\r\ninterface SearchInputProps extends Omit<InputProps, \"leftIcon\" | \"type\"> {\r\n onSearch?: (value: string) => void;\r\n searchDelay?: number;\r\n}\r\n\r\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(\r\n ({ onSearch, searchDelay = 300, placeholder = \"Search…\", ...props }, ref) => {\r\n const [searchValue, setSearchValue] = useState(props.value || \"\");\r\n\r\n // Debounced search\r\n React.useEffect(() => {\r\n if (!onSearch) return;\r\n\r\n const timer = setTimeout(() => {\r\n onSearch(searchValue as string);\r\n }, searchDelay);\r\n\r\n return () => clearTimeout(timer);\r\n }, [searchValue, onSearch, searchDelay]);\r\n\r\n return (\r\n <Input\r\n ref={ref}\r\n type=\"search\"\r\n leftIcon={Search}\r\n placeholder={placeholder}\r\n clearable\r\n value={searchValue}\r\n onChange={(e) => setSearchValue(e.target.value)}\r\n onClear={() => setSearchValue(\"\")}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\n\r\nSearchInput.displayName = \"SearchInput\";\r\n\r\n// Password Input - enhanced password field\r\ninterface PasswordInputProps extends Omit<InputProps, \"type\"> {\r\n showStrength?: boolean;\r\n strengthLabels?: string[];\r\n}\r\n\r\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\r\n ({ showStrength = false, strengthLabels = [\"Weak\", \"Fair\", \"Good\", \"Strong\"], ...props }, ref) => {\r\n const getPasswordStrength = (password: string): number => {\r\n let score = 0;\r\n if (password.length >= 8) score++;\r\n if (/[a-z]/.test(password)) score++;\r\n if (/[A-Z]/.test(password)) score++;\r\n if (/[0-9]/.test(password)) score++;\r\n if (/[^A-Za-z0-9]/.test(password)) score++;\r\n return Math.min(score, 4);\r\n };\r\n\r\n const strength = showStrength && typeof props.value === \"string\" ? getPasswordStrength(props.value) : 0;\r\n const strengthColors = [\"bg-destructive\", \"bg-warning\", \"bg-warning\", \"bg-success\"];\r\n const strengthLabel = strengthLabels[strength - 1];\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <Input ref={ref} type=\"password\" {...props} />\r\n\r\n {showStrength && props.value && (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex gap-1\">\r\n {[1, 2, 3, 4].map((level) => (\r\n <div\r\n key={level}\r\n className={cn(\r\n \"h-1 flex-1 rounded-full transition-colors duration-300\",\r\n level <= strength ? strengthColors[strength - 1] : \"bg-muted\",\r\n )}\r\n />\r\n ))}\r\n </div>\r\n {strengthLabel && (\r\n <p\r\n className={cn(\r\n \"text-xs font-medium\",\r\n strength <= 1 ? \"text-destructive\" : strength <= 2 ? \"text-warning\" : strength <= 3 ? \"text-warning\" : \"text-success\",\r\n )}\r\n >\r\n {strengthLabel}\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nPasswordInput.displayName = \"PasswordInput\";\r\n\r\n// Number Input - enhanced numeric input\r\ninterface NumberInputProps extends Omit<InputProps, \"type\" | \"value\" | \"onChange\"> {\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n showSteppers?: boolean;\r\n onIncrement?: () => void;\r\n onDecrement?: () => void;\r\n formatThousands?: boolean;\r\n locale?: string;\r\n value?: number | string;\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n}\r\n\r\nexport const NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\r\n (\r\n { min, max, step = 1, showSteppers = true, onIncrement, onDecrement, formatThousands = false, locale = \"vi-VN\", value, onChange, ...props },\r\n ref,\r\n ) => {\r\n const toNumber = (v: any): number => {\r\n if (v === \"\" || v === undefined || v === null) return 0;\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : 0;\r\n };\r\n\r\n const format = React.useCallback((n: number) => new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(n), [locale]);\r\n\r\n const parse = (s: string) => {\r\n // Remove all non-digits; treat empty as NaN\r\n const digits = (s || \"\").replace(/\\D+/g, \"\");\r\n return digits ? Number(digits) : NaN;\r\n };\r\n\r\n const [displayValue, setDisplayValue] = React.useState<string>(\r\n formatThousands ? (value !== undefined && value !== null && value !== \"\" ? format(toNumber(value)) : \"\") : String(value ?? \"\"),\r\n );\r\n\r\n const currentValue = toNumber(value);\r\n\r\n React.useEffect(() => {\r\n if (formatThousands) {\r\n const next = value === \"\" || value === undefined || value === null ? \"\" : format(toNumber(value));\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n } else {\r\n const next = String(value ?? \"\");\r\n setDisplayValue((prev) => (prev === next ? prev : next));\r\n }\r\n }, [value, formatThousands, locale, format]);\r\n\r\n const handleIncrement = () => {\r\n if (onIncrement) {\r\n onIncrement();\r\n } else if (onChange) {\r\n const newValue = Math.min(currentValue + step, max ?? Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n const handleDecrement = () => {\r\n if (onDecrement) {\r\n onDecrement();\r\n } else if (onChange) {\r\n const newValue = Math.max(currentValue - step, min ?? -Infinity);\r\n if (formatThousands) setDisplayValue(format(newValue));\r\n onChange({ target: { value: newValue.toString() } } as any);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n <Input\r\n ref={ref}\r\n type={formatThousands ? \"text\" : \"number\"}\r\n min={min}\r\n max={max}\r\n step={step}\r\n rightIcon={showSteppers ? undefined : props.rightIcon}\r\n value={displayValue}\r\n onChange={(e) => {\r\n if (!onChange) return;\r\n if (!formatThousands) return onChange(e);\r\n const raw = e.target.value;\r\n const parsed = parse(raw);\r\n if (Number.isNaN(parsed)) {\r\n setDisplayValue(\"\");\r\n onChange({ target: { value: \"\" } } as any);\r\n } else {\r\n const bounded = Math.min(Math.max(parsed, min ?? -Infinity), max ?? Infinity);\r\n setDisplayValue(format(bounded));\r\n onChange({ target: { value: bounded.toString() } } as any);\r\n }\r\n }}\r\n {...props}\r\n className={cn(\r\n showSteppers && [\r\n \"pr-12\",\r\n // Hide native browser steppers\r\n \"[&::-webkit-outer-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:appearance-none\",\r\n \"[&::-webkit-inner-spin-button]:m-0\",\r\n \"appearance-none\",\r\n ],\r\n props.className,\r\n )}\r\n />\r\n {showSteppers && (\r\n <div className=\"absolute right-2 top-1/2 -translate-y-1/2 flex flex-col gap-0.5\">\r\n <button\r\n type=\"button\"\r\n onClick={handleIncrement}\r\n disabled={max !== undefined && currentValue >= max}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-md transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\",\r\n )}\r\n aria-label=\"Increase value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 2L6 6H2L4 2Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleDecrement}\r\n disabled={min !== undefined && currentValue <= min}\r\n className={cn(\r\n \"flex items-center justify-center w-4 h-4 rounded-md transition-colors\",\r\n \"hover:bg-accent focus:outline-none focus:bg-accent\",\r\n \"disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent\",\r\n \"text-muted-foreground hover:text-foreground\",\r\n )}\r\n aria-label=\"Decrease value\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" className=\"shrink-0\">\r\n <path d=\"M4 6L2 2H6L4 6Z\" fill=\"currentColor\" />\r\n </svg>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nNumberInput.displayName = \"NumberInput\";\r\n\r\n// Textarea - multi-line text input\r\ninterface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\r\n label?: string;\r\n error?: string;\r\n description?: string;\r\n variant?: \"default\" | \"filled\" | \"outlined\" | \"minimal\";\r\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\r\n counter?: boolean;\r\n}\r\n\r\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n { label, error, description, variant = \"default\", resize = \"vertical\", counter = false, className, required, value, maxLength, ...props },\r\n ref,\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const charCount = typeof value === \"string\" ? value.length : 0;\r\n\r\n const variantStyles = {\r\n default:\r\n \"bg-background border border-input hover:border-accent-foreground/20 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n filled:\r\n \"bg-muted/50 border border-transparent hover:bg-muted/70 focus-visible:outline-none focus-visible:bg-background focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n outlined:\r\n \"bg-transparent border border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n minimal:\r\n \"bg-transparent border-0 border-b border-border hover:border-accent-foreground/30 focus-visible:outline-none focus-visible:border-ring focus-visible:ring-0 rounded-none\",\r\n };\r\n\r\n const resizeClasses = {\r\n none: \"resize-none\",\r\n vertical: \"resize-y\",\r\n horizontal: \"resize-x\",\r\n both: \"resize\",\r\n };\r\n\r\n return (\r\n <div className=\"w-full space-y-2\">\r\n {/* Label */}\r\n {label && (\r\n <div className=\"flex items-center justify-between\">\r\n <label\r\n className={cn(\r\n \"text-sm font-medium transition-colors duration-200\",\r\n isFocused ? \"text-primary\" : \"text-foreground\",\r\n error && \"text-destructive\",\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-destructive ml-1\">*</span>}\r\n </label>\r\n\r\n {counter && maxLength && (\r\n <span\r\n className={cn(\r\n \"text-xs transition-colors duration-200\",\r\n charCount > maxLength * 0.9 ? \"text-warning\" : \"text-muted-foreground\",\r\n charCount >= maxLength && \"text-destructive\",\r\n )}\r\n >\r\n {charCount}/{maxLength}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Textarea */}\r\n <textarea\r\n ref={ref}\r\n value={value}\r\n maxLength={maxLength}\r\n required={required}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n \"w-full rounded-full px-4 py-3 text-sm text-foreground transition-all duration-200\",\r\n \"placeholder:text-muted-foreground focus:outline-none min-h-20\",\r\n \"disabled:cursor-not-allowed disabled:opacity-50\",\r\n variantStyles[variant],\r\n // DÒNG NÀY ĐÃ ĐƯỢC CẬP NHẬT:\r\n error &&\r\n \"border-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-destructive focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:border-transparent\",\r\n resizeClasses[resize],\r\n isFocused && \"shadow-md\",\r\n variant !== \"minimal\" && \"shadow-sm\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n\r\n {/* Error Message */}\r\n {error && (\r\n <div className=\"flex items-center gap-2 text-sm text-destructive animate-in slide-in-from-top-1 duration-200\">\r\n <AlertCircle className=\"w-4 h-4 shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Description */}\r\n {description && !error && (\r\n <p className={cn(\"text-xs transition-colors duration-200\", isFocused ? \"text-primary/70\" : \"text-muted-foreground\")}>{description}</p>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nTextarea.displayName = \"Textarea\";\r\n\r\nexport default Input;\r\n","\"use client\"\r\n\r\nimport * as React from \"react\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils/cn\"\r\n\r\nconst labelVariants = cva(\r\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\r\n)\r\n\r\nconst Label = React.forwardRef<\r\n HTMLLabelElement,\r\n React.LabelHTMLAttributes<HTMLLabelElement> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <label\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nLabel.displayName = \"Label\"\r\n\r\nexport { Label }"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","React","forwardRef","useState","jsx","jsxs","forwardRef","useState","React","React","jsx"]}