@uxuissk/design-system 0.1.0
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/README.md +11 -0
- package/dist/sellsuki-ds.css +1 -0
- package/dist/sellsuki-ds.js +1972 -0
- package/dist/sellsuki-ds.js.map +1 -0
- package/dist/sellsuki-ds.umd.cjs +187 -0
- package/dist/sellsuki-ds.umd.cjs.map +1 -0
- package/dist/types/index.d.ts +413 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sellsuki-ds.js","sources":["../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/calendar.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-left.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/chevron-up.js","../node_modules/lucide-react/dist/esm/icons/chevrons-left.js","../node_modules/lucide-react/dist/esm/icons/chevrons-right.js","../node_modules/lucide-react/dist/esm/icons/chevrons-up-down.js","../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/circle-check.js","../node_modules/lucide-react/dist/esm/icons/circle-x.js","../node_modules/lucide-react/dist/esm/icons/clock.js","../node_modules/lucide-react/dist/esm/icons/ellipsis.js","../node_modules/lucide-react/dist/esm/icons/eye-off.js","../node_modules/lucide-react/dist/esm/icons/eye.js","../node_modules/lucide-react/dist/esm/icons/info.js","../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../node_modules/lucide-react/dist/esm/icons/minus.js","../node_modules/lucide-react/dist/esm/icons/search.js","../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../node_modules/lucide-react/dist/esm/icons/x.js","../src/lib/components/ds-button.tsx","../src/lib/components/ds-input.tsx","../src/lib/components/ds-alert.tsx","../src/lib/components/ds-badge.tsx","../src/lib/components/ds-checkbox.tsx","../src/lib/components/ds-radio.tsx","../src/lib/components/ds-datepicker.tsx","../src/lib/components/ds-modal.tsx","../src/lib/components/ds-pagination.tsx","../src/lib/components/ds-search.tsx","../src/lib/components/ds-table.tsx","../src/lib/components/ds-tabs.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"4\", rx: \"2\", key: \"1hopcy\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }]\n];\nconst Calendar = createLucideIcon(\"calendar\", __iconNode);\n\nexport { __iconNode, Calendar as default };\n//# sourceMappingURL=calendar.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]];\nconst ChevronLeft = createLucideIcon(\"chevron-left\", __iconNode);\n\nexport { __iconNode, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m11 17-5-5 5-5\", key: \"13zhaf\" }],\n [\"path\", { d: \"m18 17-5-5 5-5\", key: \"h8a8et\" }]\n];\nconst ChevronsLeft = createLucideIcon(\"chevrons-left\", __iconNode);\n\nexport { __iconNode, ChevronsLeft as default };\n//# sourceMappingURL=chevrons-left.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m6 17 5-5-5-5\", key: \"xnjwq\" }],\n [\"path\", { d: \"m13 17 5-5-5-5\", key: \"17xmmf\" }]\n];\nconst ChevronsRight = createLucideIcon(\"chevrons-right\", __iconNode);\n\nexport { __iconNode, ChevronsRight as default };\n//# sourceMappingURL=chevrons-right.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m7 15 5 5 5-5\", key: \"1hf1tw\" }],\n [\"path\", { d: \"m7 9 5-5 5 5\", key: \"sgt6xg\" }]\n];\nconst ChevronsUpDown = createLucideIcon(\"chevrons-up-down\", __iconNode);\n\nexport { __iconNode, ChevronsUpDown as default };\n//# sourceMappingURL=chevrons-up-down.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst CircleCheck = createLucideIcon(\"circle-check\", __iconNode);\n\nexport { __iconNode, CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n];\nconst CircleX = createLucideIcon(\"circle-x\", __iconNode);\n\nexport { __iconNode, CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"19\", cy: \"12\", r: \"1\", key: \"1wjl8i\" }],\n [\"circle\", { cx: \"5\", cy: \"12\", r: \"1\", key: \"1pcz8c\" }]\n];\nconst Ellipsis = createLucideIcon(\"ellipsis\", __iconNode);\n\nexport { __iconNode, Ellipsis as default };\n//# sourceMappingURL=ellipsis.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n];\nconst EyeOff = createLucideIcon(\"eye-off\", __iconNode);\n\nexport { __iconNode, EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Eye = createLucideIcon(\"eye\", __iconNode);\n\nexport { __iconNode, Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }]];\nconst Minus = createLucideIcon(\"minus\", __iconNode);\n\nexport { __iconNode, Minus as default };\n//# sourceMappingURL=minus.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","import React, { forwardRef } from \"react\";\r\nimport { Loader2 } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"destructive\" | \"link\";\r\n\r\nexport interface DSButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: ButtonVariant;\r\n size?: ButtonSize;\r\n loading?: boolean;\r\n loadingText?: string;\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n fullWidth?: boolean;\r\n active?: boolean;\r\n}\r\n\r\n// ─── Size Config ──────────────────────────────────────────────────────────────\r\n\r\nconst sizeStyles: Record<ButtonSize, string> = {\r\n sm: \"h-8 px-3 gap-1.5\",\r\n md: \"h-10 px-4 gap-2\",\r\n lg: \"h-12 px-6 gap-2.5\",\r\n xl: \"h-14 px-8 gap-3\",\r\n};\r\n\r\nconst sizeTextStyles: Record<ButtonSize, React.CSSProperties> = {\r\n sm: { fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 0.9)\", fontWeight: \"var(--weight-button)\" },\r\n md: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" },\r\n lg: { fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 1.1)\", fontWeight: \"var(--weight-button)\" },\r\n xl: { fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 1.2)\", fontWeight: \"var(--weight-button)\" },\r\n};\r\n\r\nconst sizeIconMap: Record<ButtonSize, number> = {\r\n sm: 14,\r\n md: 16,\r\n lg: 18,\r\n xl: 20,\r\n};\r\n\r\n// ─── Variant Config ───────────────────────────────────────────────────────────\r\n\r\nconst variantStyles: Record<ButtonVariant, string> = {\r\n primary:\r\n \"bg-primary text-primary-foreground border border-primary hover:bg-primary/90 active:bg-primary/80 shadow-elevation-sm\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground border border-secondary hover:bg-secondary/90 active:bg-secondary/80 shadow-elevation-sm\",\r\n outline:\r\n \"bg-transparent text-foreground border border-border hover:bg-muted active:bg-muted/80\",\r\n ghost:\r\n \"bg-transparent text-foreground border border-transparent hover:bg-muted active:bg-muted/80\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground border border-destructive hover:bg-destructive/90 active:bg-destructive/80 shadow-elevation-sm\",\r\n link:\r\n \"bg-transparent text-primary border border-transparent underline-offset-4 hover:underline px-0 h-auto\",\r\n};\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\nexport const DSButton = forwardRef<HTMLButtonElement, DSButtonProps>(\r\n (\r\n {\r\n variant = \"primary\",\r\n size = \"md\",\r\n loading = false,\r\n loadingText,\r\n leftIcon,\r\n rightIcon,\r\n fullWidth = false,\r\n active = false,\r\n disabled,\r\n children,\r\n className = \"\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isDisabled = disabled || loading;\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n disabled={isDisabled}\r\n className={`inline-flex items-center justify-center rounded-[var(--radius-md)] transition-all duration-150\r\n ${sizeStyles[size]}\r\n ${variantStyles[variant]}\r\n ${fullWidth ? \"w-full\" : \"\"}\r\n ${active ? \"ring-2 ring-ring/30\" : \"\"}\r\n ${isDisabled ? \"opacity-50 cursor-not-allowed pointer-events-none\" : \"cursor-pointer active:scale-[0.98]\"}\r\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\r\n ${className}\r\n `}\r\n style={sizeTextStyles[size]}\r\n {...props}\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 size={sizeIconMap[size]} className=\"animate-spin flex-shrink-0\" />\r\n {loadingText && <span>{loadingText}</span>}\r\n </>\r\n ) : (\r\n <>\r\n {leftIcon && <span className=\"flex-shrink-0\">{leftIcon}</span>}\r\n {children && <span>{children}</span>}\r\n {rightIcon && <span className=\"flex-shrink-0\">{rightIcon}</span>}\r\n </>\r\n )}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nDSButton.displayName = \"DSButton\";\r\n\r\n// ─── Icon Button ──────────────────────────────────────────────────────────────\r\n\r\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n variant?: ButtonVariant;\r\n size?: ButtonSize;\r\n loading?: boolean;\r\n icon: React.ReactNode;\r\n \"aria-label\": string;\r\n}\r\n\r\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\r\n (\r\n {\r\n variant = \"ghost\",\r\n size = \"md\",\r\n loading = false,\r\n icon,\r\n disabled,\r\n className = \"\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const isDisabled = disabled || loading;\r\n const sizeMap: Record<ButtonSize, string> = {\r\n sm: \"w-8 h-8\",\r\n md: \"w-10 h-10\",\r\n lg: \"w-12 h-12\",\r\n xl: \"w-14 h-14\",\r\n };\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n disabled={isDisabled}\r\n className={`inline-flex items-center justify-center rounded-[var(--radius-md)] transition-all duration-150\r\n ${sizeMap[size]}\r\n ${variantStyles[variant]}\r\n ${isDisabled ? \"opacity-50 cursor-not-allowed pointer-events-none\" : \"cursor-pointer active:scale-[0.98]\"}\r\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40\r\n ${className}\r\n `}\r\n {...props}\r\n >\r\n {loading ? (\r\n <Loader2 size={sizeIconMap[size]} className=\"animate-spin\" />\r\n ) : (\r\n icon\r\n )}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nIconButton.displayName = \"IconButton\";\r\n\r\n// ─── Button Group ─────────────────────────────────────────────────────────────\r\n\r\nexport function ButtonGroup({\r\n children,\r\n className = \"\",\r\n}: {\r\n children: React.ReactNode;\r\n className?: string;\r\n}) {\r\n return (\r\n <div\r\n className={`inline-flex [&>button]:rounded-none [&>button:first-child]:rounded-l-[var(--radius-md)] [&>button:last-child]:rounded-r-[var(--radius-md)] [&>button:not(:last-child)]:border-r-0 ${className}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, forwardRef, useCallback } from \"react\";\r\nimport { AlertCircle, CheckCircle2, Eye, EyeOff, X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\r\nexport type InputVariant = \"default\" | \"outlined\" | \"filled\" | \"ghost\";\r\nexport type InputState = \"default\" | \"error\" | \"success\" | \"warning\";\r\n\r\nexport interface DSInputProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\r\n label?: string;\r\n helperText?: string;\r\n errorMessage?: string;\r\n successMessage?: string;\r\n inputSize?: InputSize;\r\n variant?: InputVariant;\r\n state?: InputState;\r\n leftIcon?: React.ReactNode;\r\n rightIcon?: React.ReactNode;\r\n prefix?: string;\r\n suffix?: string;\r\n clearable?: boolean;\r\n showPasswordToggle?: boolean;\r\n loading?: boolean;\r\n fullWidth?: boolean;\r\n required?: boolean;\r\n onClear?: () => void;\r\n}\r\n\r\n// ─── Textarea ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface DSTextareaProps\r\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"\"> {\r\n label?: string;\r\n helperText?: string;\r\n errorMessage?: string;\r\n successMessage?: string;\r\n inputSize?: InputSize;\r\n variant?: InputVariant;\r\n state?: InputState;\r\n showCharCount?: boolean;\r\n maxLength?: number;\r\n required?: boolean;\r\n}\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\nconst inputSizeConfig: Record<\r\n InputSize,\r\n {\r\n wrapper: string;\r\n textStyle: React.CSSProperties;\r\n icon: number;\r\n }\r\n> = {\r\n sm: {\r\n wrapper: \"h-9 px-2.5 gap-1.5\",\r\n textStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n icon: 14,\r\n },\r\n md: {\r\n wrapper: \"h-11 px-3 gap-2\",\r\n textStyle: { fontFamily: \"var(--font-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" },\r\n icon: 16,\r\n },\r\n lg: {\r\n wrapper: \"h-13 px-4 gap-2.5\",\r\n textStyle: { fontFamily: \"var(--font-p)\", fontSize: \"var(--text-p)\", fontWeight: \"var(--weight-p)\" },\r\n icon: 18,\r\n },\r\n};\r\n\r\nconst inputVariantStyles: Record<InputVariant, { base: string; hover: string; focus: string }> = {\r\n default: {\r\n base: \"border border-border bg-input-background\",\r\n hover: \"hover:border-foreground/30\",\r\n focus: \"ring-2 ring-ring/20 border-ring\",\r\n },\r\n outlined: {\r\n base: \"border-2 border-border bg-transparent\",\r\n hover: \"hover:border-foreground/40\",\r\n focus: \"ring-2 ring-ring/20 border-ring\",\r\n },\r\n filled: {\r\n base: \"border border-transparent bg-muted\",\r\n hover: \"hover:bg-muted/80\",\r\n focus: \"ring-2 ring-ring/20 border-ring bg-input-background\",\r\n },\r\n ghost: {\r\n base: \"border border-transparent bg-transparent\",\r\n hover: \"hover:bg-muted/50\",\r\n focus: \"ring-2 ring-ring/20 bg-input-background\",\r\n },\r\n};\r\n\r\nconst inputStateStyles: Record<InputState, string> = {\r\n default: \"\",\r\n error: \"!border-destructive ring-destructive/20\",\r\n success: \"!border-chart-2 ring-chart-2/20\",\r\n warning: \"!border-chart-5 ring-chart-5/20\",\r\n};\r\n\r\nconst labelStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Input Component ──────────────────────────────────────────────────────────\r\n\r\nexport const DSInput = forwardRef<HTMLInputElement, DSInputProps>(\r\n (\r\n {\r\n label,\r\n helperText,\r\n errorMessage,\r\n successMessage,\r\n inputSize = \"md\",\r\n variant = \"default\",\r\n state = \"default\",\r\n leftIcon,\r\n rightIcon,\r\n prefix,\r\n suffix,\r\n clearable = false,\r\n showPasswordToggle = false,\r\n loading = false,\r\n fullWidth = true,\r\n required = false,\r\n onClear,\r\n disabled,\r\n type: typeProp = \"text\",\r\n value,\r\n defaultValue,\r\n onChange,\r\n className = \"\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [showPw, setShowPw] = useState(false);\r\n const [internalValue, setInternalValue] = useState(defaultValue ?? \"\");\r\n const currentValue = value !== undefined ? value : internalValue;\r\n\r\n const sc = inputSizeConfig[inputSize];\r\n const vs = inputVariantStyles[variant];\r\n const computedState = errorMessage ? \"error\" : state;\r\n const isPassword = typeProp === \"password\";\r\n const resolvedType = isPassword && showPw ? \"text\" : typeProp;\r\n\r\n const handleChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setInternalValue(e.target.value);\r\n onChange?.(e);\r\n },\r\n [onChange]\r\n );\r\n\r\n const handleClear = useCallback(() => {\r\n setInternalValue(\"\");\r\n onClear?.();\r\n }, [onClear]);\r\n\r\n const hasValue = String(currentValue).length > 0;\r\n\r\n return (\r\n <div className={`${fullWidth ? \"w-full\" : \"inline-flex flex-col\"} ${className}`}>\r\n {/* Label */}\r\n {label && (\r\n <label className=\"block mb-1.5 text-foreground\">\r\n {label}\r\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </label>\r\n )}\r\n\r\n {/* Input wrapper */}\r\n <div\r\n className={`flex items-center rounded-[var(--radius-md)] transition-all duration-150\r\n ${sc.wrapper}\r\n ${vs.base}\r\n ${!disabled ? vs.hover : \"\"}\r\n ${isFocused && !disabled ? vs.focus : \"\"}\r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}\r\n ${inputStateStyles[computedState]}\r\n `}\r\n >\r\n {leftIcon && <span className=\"flex-shrink-0 text-muted-foreground\">{leftIcon}</span>}\r\n {prefix && (\r\n <span className=\"flex-shrink-0 text-muted-foreground\" style={labelStyle}>\r\n {prefix}\r\n </span>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type={resolvedType}\r\n disabled={disabled || loading}\r\n value={currentValue}\r\n onChange={handleChange}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className=\"flex-1 min-w-0 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed\"\r\n style={sc.textStyle}\r\n {...props}\r\n />\r\n\r\n {suffix && (\r\n <span className=\"flex-shrink-0 text-muted-foreground\" style={labelStyle}>\r\n {suffix}\r\n </span>\r\n )}\r\n {clearable && hasValue && !disabled && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"flex-shrink-0 text-muted-foreground hover:text-foreground transition-colors cursor-pointer p-0.5\"\r\n >\r\n <X size={sc.icon - 2} />\r\n </button>\r\n )}\r\n {isPassword && showPasswordToggle && (\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowPw(!showPw)}\r\n className=\"flex-shrink-0 text-muted-foreground hover:text-foreground transition-colors cursor-pointer p-0.5\"\r\n >\r\n {showPw ? <EyeOff size={sc.icon} /> : <Eye size={sc.icon} />}\r\n </button>\r\n )}\r\n {rightIcon && !isPassword && <span className=\"flex-shrink-0 text-muted-foreground\">{rightIcon}</span>}\r\n {loading && (\r\n <span className=\"flex-shrink-0\">\r\n <span className=\"block w-4 h-4 border-2 border-muted-foreground border-t-transparent rounded-full animate-spin\" />\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Helper / Error */}\r\n {(helperText || errorMessage || successMessage) && (\r\n <div className=\"mt-1.5 flex items-center gap-1\">\r\n {computedState === \"error\" && <AlertCircle size={12} className=\"text-destructive flex-shrink-0\" />}\r\n {computedState === \"success\" && <CheckCircle2 size={12} className=\"text-chart-2 flex-shrink-0\" />}\r\n <span\r\n className={`${\r\n computedState === \"error\"\r\n ? \"text-destructive\"\r\n : computedState === \"success\"\r\n ? \"text-chart-2\"\r\n : \"text-muted-foreground\"\r\n }`}\r\n style={labelStyle}\r\n >\r\n {errorMessage || successMessage || helperText}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDSInput.displayName = \"DSInput\";\r\n\r\n// ─── Textarea Component ───────────────────────────────────────────────────────\r\n\r\nexport const DSTextarea = forwardRef<HTMLTextAreaElement, DSTextareaProps>(\r\n (\r\n {\r\n label,\r\n helperText,\r\n errorMessage,\r\n successMessage,\r\n inputSize = \"md\",\r\n variant = \"default\",\r\n state = \"default\",\r\n showCharCount = false,\r\n maxLength,\r\n required = false,\r\n disabled,\r\n value,\r\n defaultValue,\r\n onChange,\r\n className = \"\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [charCount, setCharCount] = useState(String(defaultValue ?? \"\").length);\r\n const sc = inputSizeConfig[inputSize];\r\n const vs = inputVariantStyles[variant];\r\n const computedState = errorMessage ? \"error\" : state;\r\n\r\n const handleChange = useCallback(\r\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n setCharCount(e.target.value.length);\r\n onChange?.(e);\r\n },\r\n [onChange]\r\n );\r\n\r\n return (\r\n <div className={`w-full ${className}`}>\r\n {label && (\r\n <label className=\"block mb-1.5 text-foreground\">\r\n {label}\r\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </label>\r\n )}\r\n\r\n <div\r\n className={`transition-all duration-150 overflow-hidden rounded-[var(--radius-md)]\r\n ${vs.base}\r\n ${!disabled ? vs.hover : \"\"}\r\n ${isFocused && !disabled ? vs.focus : \"\"}\r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}\r\n ${inputStateStyles[computedState]}\r\n `}\r\n >\r\n <textarea\r\n ref={ref}\r\n disabled={disabled}\r\n value={value}\r\n defaultValue={defaultValue}\r\n maxLength={maxLength}\r\n onChange={handleChange}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className=\"w-full min-h-[100px] px-3 py-2.5 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground resize-y disabled:cursor-not-allowed\"\r\n style={sc.textStyle}\r\n {...props}\r\n />\r\n {showCharCount && (\r\n <div\r\n className=\"flex justify-end px-3 py-1.5 border-t border-border text-muted-foreground bg-muted/20\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {charCount}{maxLength ? ` / ${maxLength}` : \"\"} chars\r\n </div>\r\n )}\r\n </div>\r\n\r\n {(helperText || errorMessage || successMessage) && (\r\n <div className=\"mt-1.5 flex items-center gap-1\">\r\n {computedState === \"error\" && <AlertCircle size={12} className=\"text-destructive flex-shrink-0\" />}\r\n {computedState === \"success\" && <CheckCircle2 size={12} className=\"text-chart-2 flex-shrink-0\" />}\r\n <span\r\n className={`${\r\n computedState === \"error\"\r\n ? \"text-destructive\"\r\n : computedState === \"success\"\r\n ? \"text-chart-2\"\r\n : \"text-muted-foreground\"\r\n }`}\r\n style={labelStyle}\r\n >\r\n {errorMessage || successMessage || helperText}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nDSTextarea.displayName = \"DSTextarea\";\r\n","import React, { useState, useCallback, useRef } from \"react\";\r\nimport { Info, CheckCircle2, AlertTriangle, XCircle, X } from \"lucide-react\";\r\n\r\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\ninterface AlertProps {\r\n variant?: AlertVariant;\r\n title?: string;\r\n children: React.ReactNode;\r\n dismissible?: boolean;\r\n onDismiss?: () => void;\r\n action?: React.ReactNode;\r\n icon?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst alertStyles: Record<AlertVariant, { bg: string; border: string; text: string; icon: React.ReactNode }> = {\r\n info: { bg: \"bg-primary/5\", border: \"border-primary/30\", text: \"text-primary\", icon: <Info size={18} /> },\r\n success: { bg: \"bg-chart-2/5\", border: \"border-chart-2/30\", text: \"text-chart-2\", icon: <CheckCircle2 size={18} /> },\r\n warning: { bg: \"bg-chart-5/5\", border: \"border-chart-5/30\", text: \"text-chart-5\", icon: <AlertTriangle size={18} /> },\r\n error: { bg: \"bg-destructive/5\", border: \"border-destructive/30\", text: \"text-destructive\", icon: <XCircle size={18} /> },\r\n};\r\n\r\nexport function Alert({ variant = \"info\", title, children, dismissible = false, onDismiss, action, icon, className = \"\" }: AlertProps) {\r\n const [visible, setVisible] = useState(true);\r\n const s = alertStyles[variant];\r\n\r\n if (!visible) return null;\r\n\r\n const handleDismiss = () => {\r\n setVisible(false);\r\n onDismiss?.();\r\n };\r\n\r\n return (\r\n <div className={`flex gap-3 p-4 rounded-[var(--radius)] border ${s.bg} ${s.border} ${className}`} role=\"alert\">\r\n <span className={`flex-shrink-0 mt-0.5 ${s.text}`}>{icon ?? s.icon}</span>\r\n <div className=\"flex-1 min-w-0\">\r\n {title && (\r\n <span className={`block ${s.text}`} style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" }}>\r\n {title}\r\n </span>\r\n )}\r\n <span className=\"text-foreground block\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.9)\", fontWeight: \"var(--weight-label)\" }}>\r\n {children}\r\n </span>\r\n {action && <div className=\"mt-2\">{action}</div>}\r\n </div>\r\n {dismissible && (\r\n <button onClick={handleDismiss} className=\"flex-shrink-0 text-muted-foreground hover:text-foreground transition-colors cursor-pointer\" aria-label=\"Dismiss\">\r\n <X size={16} />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Toast System ────────────────────────────────────────────────────────────\r\n\r\ninterface ToastData {\r\n id: string;\r\n variant: AlertVariant;\r\n title?: string;\r\n message: string;\r\n duration?: number;\r\n}\r\n\r\nlet toastListeners: ((toasts: ToastData[]) => void)[] = [];\r\nlet toastQueue: ToastData[] = [];\r\n\r\nfunction emitToasts() {\r\n toastListeners.forEach((fn) => fn([...toastQueue]));\r\n}\r\n\r\nexport const toast = {\r\n show: (opts: Omit<ToastData, \"id\">) => {\r\n const t: ToastData = { ...opts, id: `toast-${Date.now()}-${Math.random().toString(36).slice(2)}` };\r\n toastQueue = [...toastQueue, t];\r\n emitToasts();\r\n setTimeout(() => { toast.dismiss(t.id); }, opts.duration ?? 4000);\r\n },\r\n info: (message: string, title?: string) => toast.show({ variant: \"info\", message, title }),\r\n success: (message: string, title?: string) => toast.show({ variant: \"success\", message, title }),\r\n warning: (message: string, title?: string) => toast.show({ variant: \"warning\", message, title }),\r\n error: (message: string, title?: string) => toast.show({ variant: \"error\", message, title }),\r\n dismiss: (id: string) => {\r\n toastQueue = toastQueue.filter((t) => t.id !== id);\r\n emitToasts();\r\n },\r\n};\r\n\r\nexport function ToastContainer() {\r\n const [toasts, setToasts] = useState<ToastData[]>([]);\r\n const ref = useRef(false);\r\n\r\n if (!ref.current) {\r\n ref.current = true;\r\n toastListeners.push(setToasts);\r\n }\r\n\r\n if (toasts.length === 0) return null;\r\n\r\n return (\r\n <div className=\"fixed bottom-4 right-4 z-[200] flex flex-col gap-2 max-w-sm w-full pointer-events-none\">\r\n {toasts.map((t) => (\r\n <div key={t.id} className=\"pointer-events-auto animate-in slide-in-from-right fade-in duration-300\">\r\n <Alert variant={t.variant} title={t.title} dismissible onDismiss={() => toast.dismiss(t.id)}>\r\n {t.message}\r\n </Alert>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\nexport type BadgeVariant =\r\n | \"default\"\r\n | \"secondary\"\r\n | \"outline\"\r\n | \"destructive\"\r\n | \"success\"\r\n | \"warning\";\r\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\r\n\r\ninterface BadgeProps {\r\n children: React.ReactNode;\r\n variant?: BadgeVariant;\r\n size?: BadgeSize;\r\n icon?: React.ReactNode;\r\n dot?: boolean;\r\n removable?: boolean;\r\n onRemove?: () => void;\r\n className?: string;\r\n}\r\n\r\nconst variantClasses: Record<BadgeVariant, string> = {\r\n default: \"bg-primary text-primary-foreground\",\r\n secondary: \"bg-secondary/15 text-secondary\",\r\n outline:\r\n \"bg-transparent border border-border text-foreground\",\r\n destructive: \"bg-destructive/15 text-destructive\",\r\n success: \"bg-chart-2/15 text-chart-2\",\r\n warning: \"bg-chart-5/15 text-chart-5\",\r\n};\r\n\r\nconst sizeStyles: Record<\r\n BadgeSize,\r\n {\r\n className: string;\r\n style: React.CSSProperties;\r\n iconSize: number;\r\n }\r\n> = {\r\n sm: {\r\n className: \"px-1.5 py-0.5 gap-1\",\r\n style: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"calc(var(--text-button) * 0.72)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n iconSize: 10,\r\n },\r\n md: {\r\n className: \"px-2.5 py-0.5 gap-1.5\",\r\n style: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"calc(var(--text-button) * 0.85)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n iconSize: 12,\r\n },\r\n lg: {\r\n className: \"px-3 py-1 gap-1.5\",\r\n style: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n iconSize: 14,\r\n },\r\n};\r\n\r\nconst dotColors: Record<BadgeVariant, string> = {\r\n default: \"bg-primary-foreground\",\r\n secondary: \"bg-secondary\",\r\n outline: \"bg-foreground\",\r\n destructive: \"bg-destructive\",\r\n success: \"bg-chart-2\",\r\n warning: \"bg-chart-5\",\r\n};\r\n\r\nexport function Badge({\r\n children,\r\n variant = \"default\",\r\n size = \"md\",\r\n icon,\r\n dot,\r\n removable,\r\n onRemove,\r\n className = \"\",\r\n}: BadgeProps) {\r\n const s = sizeStyles[size];\r\n return (\r\n <span\r\n className={`inline-flex items-center rounded-full whitespace-nowrap ${variantClasses[variant]} ${s.className} ${className}`}\r\n style={{ ...s.style, lineHeight: \"1.2\" }}\r\n >\r\n {dot && (\r\n <span\r\n className={`w-1.5 h-1.5 rounded-full flex-shrink-0 ${dotColors[variant]}`}\r\n />\r\n )}\r\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\r\n <span>{children}</span>\r\n {removable && (\r\n <button\r\n onClick={onRemove}\r\n className=\"flex-shrink-0 hover:opacity-70 transition-opacity cursor-pointer rounded-full -mr-0.5\"\r\n aria-label=\"Remove\"\r\n >\r\n <X size={s.iconSize} />\r\n </button>\r\n )}\r\n </span>\r\n );\r\n}","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { Check, Minus } from \"lucide-react\";\r\n\r\nexport type CheckboxSize = \"sm\" | \"md\" | \"lg\";\r\n\r\ninterface CheckboxProps {\r\n checked?: boolean;\r\n indeterminate?: boolean;\r\n defaultChecked?: boolean;\r\n onChange?: (checked: boolean) => void;\r\n label?: string;\r\n description?: string;\r\n size?: CheckboxSize;\r\n disabled?: boolean;\r\n error?: string;\r\n className?: string;\r\n id?: string;\r\n}\r\n\r\nconst sizeConfig: Record<CheckboxSize, { box: string; icon: number; labelStyle: React.CSSProperties; descStyle: React.CSSProperties }> = {\r\n sm: {\r\n box: \"w-4 h-4\",\r\n icon: 10,\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.75)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n md: {\r\n box: \"w-5 h-5\",\r\n icon: 12,\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n lg: {\r\n box: \"w-6 h-6\",\r\n icon: 14,\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 1.1)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n};\r\n\r\nexport function DSCheckbox({\r\n checked: controlledChecked,\r\n indeterminate = false,\r\n defaultChecked = false,\r\n onChange,\r\n label,\r\n description,\r\n size = \"md\",\r\n disabled = false,\r\n error,\r\n className = \"\",\r\n id: propId,\r\n}: CheckboxProps) {\r\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\r\n const isChecked = controlledChecked ?? internalChecked;\r\n const s = sizeConfig[size];\r\n const uid = propId ?? `cb-${React.useId()}`;\r\n\r\n const handleToggle = () => {\r\n if (disabled) return;\r\n const next = !isChecked;\r\n if (controlledChecked === undefined) setInternalChecked(next);\r\n onChange?.(next);\r\n };\r\n\r\n const isActive = isChecked || indeterminate;\r\n\r\n return (\r\n <div className={`inline-flex items-start gap-2.5 ${disabled ? \"opacity-50\" : \"\"} ${className}`}>\r\n <button\r\n id={uid}\r\n role=\"checkbox\"\r\n aria-checked={indeterminate ? \"mixed\" : isChecked}\r\n disabled={disabled}\r\n onClick={handleToggle}\r\n className={`${s.box} flex-shrink-0 rounded-[var(--radius-sm)] border-2 transition-all flex items-center justify-center cursor-pointer mt-0.5\r\n ${isActive\r\n ? \"bg-primary border-primary text-primary-foreground\"\r\n : error\r\n ? \"border-destructive bg-card\"\r\n : \"border-border bg-card hover:border-primary/50\"\r\n }\r\n ${disabled ? \"!cursor-not-allowed\" : \"\"}\r\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 outline-none`}\r\n >\r\n {indeterminate ? <Minus size={s.icon} strokeWidth={3} /> : isChecked ? <Check size={s.icon} strokeWidth={3} /> : null}\r\n </button>\r\n {(label || description) && (\r\n <div className=\"min-w-0\">\r\n {label && (\r\n <label\r\n htmlFor={uid}\r\n className={`text-foreground block cursor-pointer ${disabled ? \"!cursor-not-allowed\" : \"\"}`}\r\n style={s.labelStyle}\r\n onClick={handleToggle}\r\n >\r\n {label}\r\n </label>\r\n )}\r\n {description && (\r\n <span className=\"text-muted-foreground block\" style={s.descStyle}>{description}</span>\r\n )}\r\n {error && (\r\n <span className=\"text-destructive block mt-0.5\" style={s.descStyle}>{error}</span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Group\r\ninterface CheckboxGroupProps {\r\n label?: string;\r\n children: React.ReactNode;\r\n direction?: \"horizontal\" | \"vertical\";\r\n className?: string;\r\n}\r\n\r\nexport function CheckboxGroup({ label, children, direction = \"vertical\", className = \"\" }: CheckboxGroupProps) {\r\n return (\r\n <fieldset className={`${className}`}>\r\n {label && (\r\n <legend className=\"text-foreground mb-2 block\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" }}>\r\n {label}\r\n </legend>\r\n )}\r\n <div className={`flex ${direction === \"vertical\" ? \"flex-col gap-3\" : \"flex-wrap gap-4\"}`}>\r\n {children}\r\n </div>\r\n </fieldset>\r\n );\r\n}\r\n","import React, { useState, createContext, useContext } from \"react\";\r\n\r\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\r\n\r\n// Context for RadioGroup\r\ninterface RadioGroupContextValue {\r\n value: string;\r\n onChange: (v: string) => void;\r\n size: RadioSize;\r\n disabled: boolean;\r\n name: string;\r\n}\r\nconst RadioGroupCtx = createContext<RadioGroupContextValue | null>(null);\r\n\r\ninterface RadioProps {\r\n value: string;\r\n label?: string;\r\n description?: string;\r\n disabled?: boolean;\r\n size?: RadioSize;\r\n className?: string;\r\n}\r\n\r\nconst sizeConfig: Record<RadioSize, { outer: string; inner: string; labelStyle: React.CSSProperties; descStyle: React.CSSProperties }> = {\r\n sm: {\r\n outer: \"w-4 h-4\",\r\n inner: \"w-1.5 h-1.5\",\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.75)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n md: {\r\n outer: \"w-5 h-5\",\r\n inner: \"w-2 h-2\",\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n lg: {\r\n outer: \"w-6 h-6\",\r\n inner: \"w-2.5 h-2.5\",\r\n labelStyle: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 1.1)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n },\r\n};\r\n\r\nexport function DSRadio({ value, label, description, disabled: localDisabled, size: localSize, className = \"\" }: RadioProps) {\r\n const ctx = useContext(RadioGroupCtx);\r\n const isSelected = ctx ? ctx.value === value : false;\r\n const isDisabled = localDisabled ?? ctx?.disabled ?? false;\r\n const sz = localSize ?? ctx?.size ?? \"md\";\r\n const s = sizeConfig[sz];\r\n\r\n const handleSelect = () => {\r\n if (isDisabled) return;\r\n ctx?.onChange(value);\r\n };\r\n\r\n return (\r\n <div className={`inline-flex items-start gap-2.5 ${isDisabled ? \"opacity-50\" : \"\"} ${className}`}>\r\n <button\r\n role=\"radio\"\r\n aria-checked={isSelected}\r\n disabled={isDisabled}\r\n onClick={handleSelect}\r\n className={`${s.outer} flex-shrink-0 rounded-full border-2 transition-all flex items-center justify-center cursor-pointer mt-0.5\r\n ${isSelected ? \"border-primary\" : \"border-border hover:border-primary/50\"}\r\n ${isDisabled ? \"!cursor-not-allowed\" : \"\"}\r\n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 outline-none`}\r\n >\r\n {isSelected && <span className={`${s.inner} rounded-full bg-primary transition-transform scale-100`} />}\r\n </button>\r\n {(label || description) && (\r\n <div className=\"min-w-0\">\r\n {label && (\r\n <span\r\n className={`text-foreground block cursor-pointer ${isDisabled ? \"!cursor-not-allowed\" : \"\"}`}\r\n style={s.labelStyle}\r\n onClick={handleSelect}\r\n >\r\n {label}\r\n </span>\r\n )}\r\n {description && <span className=\"text-muted-foreground block\" style={s.descStyle}>{description}</span>}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Group\r\ninterface RadioGroupProps {\r\n name: string;\r\n value?: string;\r\n defaultValue?: string;\r\n onChange?: (value: string) => void;\r\n label?: string;\r\n size?: RadioSize;\r\n disabled?: boolean;\r\n direction?: \"horizontal\" | \"vertical\";\r\n children: React.ReactNode;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function RadioGroup({\r\n name,\r\n value: controlled,\r\n defaultValue = \"\",\r\n onChange,\r\n label,\r\n size = \"md\",\r\n disabled = false,\r\n direction = \"vertical\",\r\n children,\r\n error,\r\n className = \"\",\r\n}: RadioGroupProps) {\r\n const [internal, setInternal] = useState(defaultValue);\r\n const val = controlled ?? internal;\r\n\r\n const handleChange = (v: string) => {\r\n if (controlled === undefined) setInternal(v);\r\n onChange?.(v);\r\n };\r\n\r\n return (\r\n <RadioGroupCtx.Provider value={{ value: val, onChange: handleChange, size, disabled, name }}>\r\n <fieldset className={className} role=\"radiogroup\">\r\n {label && (\r\n <legend className=\"text-foreground mb-2 block\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" }}>\r\n {label}\r\n </legend>\r\n )}\r\n <div className={`flex ${direction === \"vertical\" ? \"flex-col gap-3\" : \"flex-wrap gap-4\"}`}>\r\n {children}\r\n </div>\r\n {error && (\r\n <span className=\"text-destructive block mt-1.5\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" }}>\r\n {error}\r\n </span>\r\n )}\r\n </fieldset>\r\n </RadioGroupCtx.Provider>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\r\nimport {\r\n Calendar as CalendarIcon,\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n X,\r\n Clock,\r\n AlertCircle,\r\n CheckCircle2,\r\n} from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type DatePickerSize = \"sm\" | \"md\" | \"lg\";\r\nexport type DatePickerVariant = \"default\" | \"outlined\" | \"filled\" | \"ghost\";\r\nexport type DatePickerState = \"default\" | \"error\" | \"success\";\r\nexport type DatePickerMode = \"single\" | \"range\";\r\n\r\nexport interface DatePickerProps {\r\n /** Selected date (single mode) */\r\n value?: Date | null;\r\n /** Selected range (range mode) */\r\n rangeValue?: { start: Date | null; end: Date | null };\r\n /** Callback on date change (single) */\r\n onChange?: (date: Date | null) => void;\r\n /** Callback on range change */\r\n onRangeChange?: (range: { start: Date | null; end: Date | null }) => void;\r\n /** Single or range mode */\r\n mode?: DatePickerMode;\r\n /** Label text */\r\n label?: string;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Helper text */\r\n helperText?: string;\r\n /** Error message */\r\n errorMessage?: string;\r\n /** Success message */\r\n successMessage?: string;\r\n /** Visual size */\r\n size?: DatePickerSize;\r\n /** Visual variant */\r\n variant?: DatePickerVariant;\r\n /** Validation state */\r\n state?: DatePickerState;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Required field */\r\n required?: boolean;\r\n /** Allow clearing the value */\r\n clearable?: boolean;\r\n /** Show time picker */\r\n showTime?: boolean;\r\n /** Minimum selectable date */\r\n minDate?: Date;\r\n /** Maximum selectable date */\r\n maxDate?: Date;\r\n /** Disabled specific dates */\r\n disabledDates?: Date[];\r\n /** Date format for display */\r\n format?: string;\r\n /** Show today button */\r\n showToday?: boolean;\r\n /** Custom footer element */\r\n footer?: React.ReactNode;\r\n /** Full width */\r\n fullWidth?: boolean;\r\n}\r\n\r\n// ─── Utilities ────────────────────────────────────────────────────────────────\r\n\r\nconst WEEKDAYS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\r\nconst MONTHS = [\r\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\r\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\r\n];\r\n\r\nfunction isSameDay(a: Date, b: Date): boolean {\r\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\r\n}\r\n\r\nfunction isInRange(date: Date, start: Date | null, end: Date | null): boolean {\r\n if (!start || !end) return false;\r\n const d = date.getTime();\r\n return d > start.getTime() && d < end.getTime();\r\n}\r\n\r\nfunction isDateDisabled(\r\n date: Date,\r\n minDate?: Date,\r\n maxDate?: Date,\r\n disabledDates?: Date[]\r\n): boolean {\r\n if (minDate && date < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate())) return true;\r\n if (maxDate && date > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate())) return true;\r\n if (disabledDates?.some((d) => isSameDay(d, date))) return true;\r\n return false;\r\n}\r\n\r\nfunction getDaysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\nfunction getCalendarDays(year: number, month: number): (Date | null)[] {\r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = getDaysInMonth(year, month);\r\n const days: (Date | null)[] = [];\r\n\r\n for (let i = 0; i < firstDay; i++) days.push(null);\r\n for (let i = 1; i <= daysInMonth; i++) days.push(new Date(year, month, i));\r\n return days;\r\n}\r\n\r\nfunction formatDate(date: Date | null, showTime?: boolean): string {\r\n if (!date) return \"\";\r\n const dd = String(date.getDate()).padStart(2, \"0\");\r\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const yyyy = date.getFullYear();\r\n let str = `${dd}/${mm}/${yyyy}`;\r\n if (showTime) {\r\n const hh = String(date.getHours()).padStart(2, \"0\");\r\n const min = String(date.getMinutes()).padStart(2, \"0\");\r\n str += ` ${hh}:${min}`;\r\n }\r\n return str;\r\n}\r\n\r\n// ─── Size Config ──────────────────────────────────────────────────────────────\r\n\r\nconst sizeConfig: Record<\r\n DatePickerSize,\r\n { trigger: string; text: React.CSSProperties; icon: number; cell: string }\r\n> = {\r\n sm: {\r\n trigger: \"h-8 px-2.5\",\r\n text: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"calc(var(--text-label) * 0.9)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n icon: 14,\r\n cell: \"w-7 h-7\",\r\n },\r\n md: {\r\n trigger: \"h-10 px-3\",\r\n text: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n icon: 16,\r\n cell: \"w-9 h-9\",\r\n },\r\n lg: {\r\n trigger: \"h-12 px-4\",\r\n text: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"calc(var(--text-label) * 1.1)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n icon: 18,\r\n cell: \"w-10 h-10\",\r\n },\r\n};\r\n\r\n// ─── Variant Config ───────────────────────────────────────────────────────────\r\n\r\nconst variantStyles: Record<DatePickerVariant, string> = {\r\n default: \"bg-input-background border border-border\",\r\n outlined: \"bg-transparent border-2 border-border\",\r\n filled: \"bg-muted/30 border border-transparent\",\r\n ghost: \"bg-transparent border border-transparent\",\r\n};\r\n\r\nconst stateRing: Record<DatePickerState, string> = {\r\n default: \"focus-within:ring-2 focus-within:ring-ring/30 focus-within:border-primary\",\r\n error: \"ring-2 ring-destructive/30 border-destructive\",\r\n success: \"ring-2 ring-chart-2/30 border-chart-2\",\r\n};\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\nexport function DatePicker({\r\n value = null,\r\n rangeValue,\r\n onChange,\r\n onRangeChange,\r\n mode = \"single\",\r\n label,\r\n placeholder,\r\n helperText,\r\n errorMessage,\r\n successMessage,\r\n size = \"md\",\r\n variant = \"default\",\r\n state = \"default\",\r\n disabled = false,\r\n required = false,\r\n clearable = false,\r\n showTime = false,\r\n minDate,\r\n maxDate,\r\n disabledDates,\r\n showToday = true,\r\n footer,\r\n fullWidth = false,\r\n}: DatePickerProps) {\r\n const [open, setOpen] = useState(false);\r\n const [viewDate, setViewDate] = useState<Date>(() => value ?? new Date());\r\n const [view, setView] = useState<\"days\" | \"months\" | \"years\">(\"days\");\r\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\r\n const [hours, setHours] = useState(() => (value ? value.getHours() : 0));\r\n const [minutes, setMinutes] = useState(() => (value ? value.getMinutes() : 0));\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const cfg = sizeConfig[size];\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n function handleClick(e: MouseEvent) {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n setView(\"days\");\r\n }\r\n }\r\n if (open) document.addEventListener(\"mousedown\", handleClick);\r\n return () => document.removeEventListener(\"mousedown\", handleClick);\r\n }, [open]);\r\n\r\n // Calendar days\r\n const calendarDays = useMemo(\r\n () => getCalendarDays(viewDate.getFullYear(), viewDate.getMonth()),\r\n [viewDate]\r\n );\r\n\r\n const today = useMemo(() => new Date(), []);\r\n\r\n // Navigate\r\n const prevMonth = () => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() - 1, 1));\r\n const nextMonth = () => setViewDate(new Date(viewDate.getFullYear(), viewDate.getMonth() + 1, 1));\r\n const prevYear = () => setViewDate(new Date(viewDate.getFullYear() - 1, viewDate.getMonth(), 1));\r\n const nextYear = () => setViewDate(new Date(viewDate.getFullYear() + 1, viewDate.getMonth(), 1));\r\n\r\n // Select day\r\n const selectDay = useCallback(\r\n (day: Date) => {\r\n if (isDateDisabled(day, minDate, maxDate, disabledDates)) return;\r\n\r\n if (mode === \"single\") {\r\n let selected = new Date(day);\r\n if (showTime) {\r\n selected.setHours(hours, minutes);\r\n }\r\n onChange?.(selected);\r\n if (!showTime) {\r\n setOpen(false);\r\n setView(\"days\");\r\n }\r\n } else {\r\n // Range mode\r\n const start = rangeValue?.start;\r\n const end = rangeValue?.end;\r\n if (!start || (start && end)) {\r\n onRangeChange?.({ start: day, end: null });\r\n } else {\r\n if (day < start) {\r\n onRangeChange?.({ start: day, end: start });\r\n } else {\r\n onRangeChange?.({ start, end: day });\r\n }\r\n setOpen(false);\r\n setView(\"days\");\r\n }\r\n }\r\n },\r\n [mode, onChange, onRangeChange, rangeValue, minDate, maxDate, disabledDates, showTime, hours, minutes]\r\n );\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n if (mode === \"single\") onChange?.(null);\r\n else onRangeChange?.({ start: null, end: null });\r\n };\r\n\r\n const goToToday = () => {\r\n const now = new Date();\r\n setViewDate(now);\r\n if (mode === \"single\") {\r\n const selected = new Date(now);\r\n if (showTime) selected.setHours(hours, minutes);\r\n onChange?.(selected);\r\n if (!showTime) {\r\n setOpen(false);\r\n setView(\"days\");\r\n }\r\n }\r\n };\r\n\r\n // Apply time\r\n const handleTimeApply = () => {\r\n if (value) {\r\n const updated = new Date(value);\r\n updated.setHours(hours, minutes);\r\n onChange?.(updated);\r\n }\r\n setOpen(false);\r\n setView(\"days\");\r\n };\r\n\r\n // Display value\r\n const displayValue = useMemo(() => {\r\n if (mode === \"single\") return formatDate(value, showTime);\r\n if (rangeValue?.start && rangeValue?.end)\r\n return `${formatDate(rangeValue.start)} – ${formatDate(rangeValue.end)}`;\r\n if (rangeValue?.start) return `${formatDate(rangeValue.start)} – ...`;\r\n return \"\";\r\n }, [mode, value, rangeValue, showTime]);\r\n\r\n const hasValue = mode === \"single\" ? !!value : !!(rangeValue?.start || rangeValue?.end);\r\n\r\n // State-specific styles\r\n const stateIcon =\r\n state === \"error\" ? (\r\n <AlertCircle size={cfg.icon} className=\"text-destructive flex-shrink-0\" />\r\n ) : state === \"success\" ? (\r\n <CheckCircle2 size={cfg.icon} className=\"text-chart-2 flex-shrink-0\" />\r\n ) : null;\r\n\r\n const helperMsg =\r\n state === \"error\" ? errorMessage : state === \"success\" ? successMessage : helperText;\r\n const helperColor =\r\n state === \"error\" ? \"text-destructive\" : state === \"success\" ? \"text-chart-2\" : \"text-muted-foreground\";\r\n\r\n const labelStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n };\r\n\r\n const captionStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-caption)\",\r\n fontSize: \"calc(var(--text-caption) * 0.7)\",\r\n fontWeight: \"var(--weight-caption)\",\r\n };\r\n\r\n const buttonStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n };\r\n\r\n // Year grid for year picker\r\n const yearGridStart = Math.floor(viewDate.getFullYear() / 12) * 12;\r\n\r\n return (\r\n <div className={`relative ${fullWidth ? \"w-full\" : \"\"}`} ref={containerRef}>\r\n {/* Label */}\r\n {label && (\r\n <label className=\"block text-foreground mb-1.5\" style={labelStyle}>\r\n {label}\r\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </label>\r\n )}\r\n\r\n {/* Trigger */}\r\n <button\r\n type=\"button\"\r\n onClick={() => !disabled && setOpen(!open)}\r\n disabled={disabled}\r\n className={`\r\n w-full flex items-center gap-2 rounded-[var(--radius-md)] transition-all cursor-pointer\r\n ${cfg.trigger}\r\n ${variantStyles[variant]}\r\n ${stateRing[state]}\r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"hover:border-primary/50\"}\r\n `}\r\n style={cfg.text}\r\n >\r\n <CalendarIcon size={cfg.icon} className=\"text-muted-foreground flex-shrink-0\" />\r\n <span className={`flex-1 text-left truncate ${hasValue ? \"text-foreground\" : \"text-muted-foreground\"}`}>\r\n {hasValue ? displayValue : placeholder || (mode === \"range\" ? \"Select date range…\" : \"Select date…\")}\r\n </span>\r\n {stateIcon}\r\n {clearable && hasValue && !disabled && (\r\n <span\r\n onClick={handleClear}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={cfg.icon - 2} />\r\n </span>\r\n )}\r\n </button>\r\n\r\n {/* Helper text */}\r\n {helperMsg && (\r\n <p className={`mt-1.5 ${helperColor}`} style={{ fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" }}>\r\n {helperMsg}\r\n </p>\r\n )}\r\n\r\n {/* Dropdown calendar */}\r\n {open && (\r\n <div\r\n className=\"absolute z-50 mt-1.5 bg-popover border border-border rounded-[var(--radius-lg)] shadow-elevation-sm overflow-hidden\"\r\n style={{ minWidth: mode === \"range\" ? \"560px\" : \"300px\" }}\r\n >\r\n {/* Calendar Header */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-border bg-card\">\r\n <div className=\"flex items-center gap-1\">\r\n <button onClick={prevYear} className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground transition-colors cursor-pointer\" title=\"Previous year\">\r\n <ChevronsLeft size={16} />\r\n </button>\r\n <button onClick={prevMonth} className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground transition-colors cursor-pointer\" title=\"Previous month\">\r\n <ChevronLeft size={16} />\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={() => setView(view === \"months\" ? \"days\" : \"months\")}\r\n className=\"px-2 py-1 rounded-[var(--radius-sm)] hover:bg-muted text-foreground transition-colors cursor-pointer\"\r\n style={buttonStyle}\r\n >\r\n {MONTHS[viewDate.getMonth()]}\r\n </button>\r\n <button\r\n onClick={() => setView(view === \"years\" ? \"days\" : \"years\")}\r\n className=\"px-2 py-1 rounded-[var(--radius-sm)] hover:bg-muted text-foreground transition-colors cursor-pointer\"\r\n style={buttonStyle}\r\n >\r\n {viewDate.getFullYear()}\r\n </button>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1\">\r\n <button onClick={nextMonth} className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground transition-colors cursor-pointer\" title=\"Next month\">\r\n <ChevronRight size={16} />\r\n </button>\r\n <button onClick={nextYear} className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground transition-colors cursor-pointer\" title=\"Next year\">\r\n <ChevronsRight size={16} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Day View */}\r\n {view === \"days\" && (\r\n <div className={`p-3 ${mode === \"range\" ? \"flex gap-3\" : \"\"}`}>\r\n {/* Render 1 or 2 month grids */}\r\n {(mode === \"range\" ? [0, 1] : [0]).map((offset) => {\r\n const monthDate = new Date(viewDate.getFullYear(), viewDate.getMonth() + offset, 1);\r\n const days = getCalendarDays(monthDate.getFullYear(), monthDate.getMonth());\r\n return (\r\n <div key={offset} className=\"flex-1\">\r\n {offset > 0 && (\r\n <div className=\"text-center mb-2 text-foreground\" style={buttonStyle}>\r\n {MONTHS[monthDate.getMonth()]} {monthDate.getFullYear()}\r\n </div>\r\n )}\r\n {/* Weekday headers */}\r\n <div className=\"grid grid-cols-7 mb-1\">\r\n {WEEKDAYS.map((wd) => (\r\n <div\r\n key={`${offset}-${wd}`}\r\n className=\"text-center text-muted-foreground py-1\"\r\n style={captionStyle}\r\n >\r\n {wd}\r\n </div>\r\n ))}\r\n </div>\r\n {/* Day grid */}\r\n <div className=\"grid grid-cols-7\">\r\n {days.map((day, i) => {\r\n if (!day) return <div key={`empty-${offset}-${i}`} />;\r\n\r\n const isDisabled = isDateDisabled(day, minDate, maxDate, disabledDates);\r\n const isToday = isSameDay(day, today);\r\n const isSelected =\r\n mode === \"single\"\r\n ? value && isSameDay(day, value)\r\n : (rangeValue?.start && isSameDay(day, rangeValue.start)) ||\r\n (rangeValue?.end && isSameDay(day, rangeValue.end));\r\n const inRange =\r\n mode === \"range\" &&\r\n (isInRange(day, rangeValue?.start ?? null, rangeValue?.end ?? null) ||\r\n (rangeValue?.start &&\r\n !rangeValue?.end &&\r\n hoverDate &&\r\n isInRange(\r\n day,\r\n rangeValue.start,\r\n hoverDate > rangeValue.start ? hoverDate : null\r\n )));\r\n\r\n return (\r\n <button\r\n key={`${offset}-${day.getTime()}`}\r\n onClick={() => selectDay(day)}\r\n onMouseEnter={() => mode === \"range\" && setHoverDate(day)}\r\n disabled={isDisabled}\r\n className={`\r\n ${cfg.cell} flex items-center justify-center rounded-[var(--radius-sm)] transition-all cursor-pointer\r\n ${isDisabled ? \"opacity-30 cursor-not-allowed\" : \"hover:bg-muted\"}\r\n ${isSelected ? \"bg-primary text-primary-foreground hover:bg-primary/90\" : \"\"}\r\n ${inRange && !isSelected ? \"bg-accent text-accent-foreground\" : \"\"}\r\n ${isToday && !isSelected ? \"border border-primary text-primary\" : \"\"}\r\n `}\r\n style={buttonStyle}\r\n >\r\n {day.getDate()}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {/* Month Picker View */}\r\n {view === \"months\" && (\r\n <div className=\"p-3 grid grid-cols-3 gap-2\">\r\n {MONTHS.map((m, idx) => (\r\n <button\r\n key={m}\r\n onClick={() => {\r\n setViewDate(new Date(viewDate.getFullYear(), idx, 1));\r\n setView(\"days\");\r\n }}\r\n className={`\r\n py-2.5 rounded-[var(--radius-md)] transition-all cursor-pointer\r\n ${viewDate.getMonth() === idx ? \"bg-primary text-primary-foreground\" : \"text-foreground hover:bg-muted\"}\r\n `}\r\n style={buttonStyle}\r\n >\r\n {m.substring(0, 3)}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Year Picker View */}\r\n {view === \"years\" && (\r\n <div className=\"p-3\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <button\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear() - 12, viewDate.getMonth(), 1))}\r\n className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <ChevronLeft size={16} />\r\n </button>\r\n <span className=\"text-foreground\" style={buttonStyle}>\r\n {yearGridStart} – {yearGridStart + 11}\r\n </span>\r\n <button\r\n onClick={() => setViewDate(new Date(viewDate.getFullYear() + 12, viewDate.getMonth(), 1))}\r\n className=\"p-1 rounded-[var(--radius-sm)] hover:bg-muted text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <ChevronRight size={16} />\r\n </button>\r\n </div>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {Array.from({ length: 12 }, (_, i) => yearGridStart + i).map((yr) => (\r\n <button\r\n key={yr}\r\n onClick={() => {\r\n setViewDate(new Date(yr, viewDate.getMonth(), 1));\r\n setView(\"months\");\r\n }}\r\n className={`\r\n py-2.5 rounded-[var(--radius-md)] transition-all cursor-pointer\r\n ${viewDate.getFullYear() === yr ? \"bg-primary text-primary-foreground\" : \"text-foreground hover:bg-muted\"}\r\n ${yr === today.getFullYear() && viewDate.getFullYear() !== yr ? \"border border-primary text-primary\" : \"\"}\r\n `}\r\n style={buttonStyle}\r\n >\r\n {yr}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Time Picker (only in single mode) */}\r\n {showTime && mode === \"single\" && view === \"days\" && (\r\n <div className=\"px-4 py-3 border-t border-border flex items-center gap-3\">\r\n <Clock size={14} className=\"text-muted-foreground\" />\r\n <div className=\"flex items-center gap-1\">\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={23}\r\n value={String(hours).padStart(2, \"0\")}\r\n onChange={(e) => setHours(Math.max(0, Math.min(23, Number(e.target.value))))}\r\n className=\"w-10 text-center bg-input-background border border-border rounded-[var(--radius-sm)] py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-ring/30\"\r\n style={buttonStyle}\r\n />\r\n <span className=\"text-muted-foreground\" style={buttonStyle}>:</span>\r\n <input\r\n type=\"number\"\r\n min={0}\r\n max={59}\r\n value={String(minutes).padStart(2, \"0\")}\r\n onChange={(e) => setMinutes(Math.max(0, Math.min(59, Number(e.target.value))))}\r\n className=\"w-10 text-center bg-input-background border border-border rounded-[var(--radius-sm)] py-1 text-foreground focus:outline-none focus:ring-1 focus:ring-ring/30\"\r\n style={buttonStyle}\r\n />\r\n </div>\r\n <button\r\n onClick={handleTimeApply}\r\n className=\"ml-auto px-3 py-1 rounded-[var(--radius-md)] bg-primary text-primary-foreground hover:bg-primary/90 transition-colors cursor-pointer\"\r\n style={buttonStyle}\r\n >\r\n Apply\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Footer */}\r\n <div className=\"px-4 py-2.5 border-t border-border bg-card flex items-center justify-between\">\r\n {showToday ? (\r\n <button\r\n onClick={goToToday}\r\n className=\"text-primary hover:underline cursor-pointer\"\r\n style={buttonStyle}\r\n >\r\n Today\r\n </button>\r\n ) : (\r\n <span />\r\n )}\r\n {footer ?? (\r\n <button\r\n onClick={() => { setOpen(false); setView(\"days\"); }}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n style={buttonStyle}\r\n >\r\n Close\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useRef } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\r\n\r\ninterface ModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n description?: string;\r\n size?: ModalSize;\r\n children: React.ReactNode;\r\n footer?: React.ReactNode;\r\n closeOnOverlay?: boolean;\r\n showCloseButton?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst sizeMap: Record<ModalSize, string> = {\r\n sm: \"max-w-sm\",\r\n md: \"max-w-lg\",\r\n lg: \"max-w-2xl\",\r\n xl: \"max-w-4xl\",\r\n full: \"max-w-[calc(100vw-2rem)] max-h-[calc(100vh-2rem)]\",\r\n};\r\n\r\nexport function Modal({\r\n open,\r\n onClose,\r\n title,\r\n description,\r\n size = \"md\",\r\n children,\r\n footer,\r\n closeOnOverlay = true,\r\n showCloseButton = true,\r\n className = \"\",\r\n}: ModalProps) {\r\n const dialogRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handleEsc = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\r\n document.addEventListener(\"keydown\", handleEsc);\r\n document.body.style.overflow = \"hidden\";\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEsc);\r\n document.body.style.overflow = \"\";\r\n };\r\n }, [open, onClose]);\r\n\r\n useEffect(() => {\r\n if (open && dialogRef.current) {\r\n dialogRef.current.focus();\r\n }\r\n }, [open]);\r\n\r\n if (!open) return null;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center p-4\">\r\n {/* Backdrop */}\r\n <div\r\n className=\"absolute inset-0 bg-foreground/40 backdrop-blur-sm animate-in fade-in duration-200\"\r\n onClick={closeOnOverlay ? onClose : undefined}\r\n />\r\n\r\n {/* Dialog */}\r\n <div\r\n ref={dialogRef}\r\n tabIndex={-1}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={title ? \"modal-title\" : undefined}\r\n className={`relative w-full ${sizeMap[size]} bg-card rounded-[var(--radius-lg)] shadow-lg border border-border animate-in zoom-in-95 fade-in duration-200 flex flex-col ${size === \"full\" ? \"h-full\" : \"max-h-[85vh]\"} ${className}`}\r\n >\r\n {/* Header */}\r\n {(title || showCloseButton) && (\r\n <div className=\"flex items-start justify-between gap-4 px-6 pt-6 pb-2 flex-shrink-0\">\r\n <div className=\"min-w-0 flex-1\">\r\n {title && (\r\n <h4 id=\"modal-title\" className=\"text-foreground\">{title}</h4>\r\n )}\r\n {description && (\r\n <span className=\"text-muted-foreground block mt-0.5\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}>\r\n {description}\r\n </span>\r\n )}\r\n </div>\r\n {showCloseButton && (\r\n <button\r\n onClick={onClose}\r\n className=\"flex-shrink-0 w-8 h-8 rounded-[var(--radius-sm)] flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-muted transition-colors cursor-pointer\"\r\n aria-label=\"Close\"\r\n >\r\n <X size={16} />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Body */}\r\n <div className=\"flex-1 overflow-y-auto px-6 py-4\" style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}>\r\n {children}\r\n </div>\r\n\r\n {/* Footer */}\r\n {footer && (\r\n <div className=\"flex items-center justify-end gap-2 px-6 py-4 border-t border-border flex-shrink-0\">\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Convenience: Confirm Dialog\r\ninterface ConfirmDialogProps {\r\n open: boolean;\r\n onClose: () => void;\r\n onConfirm: () => void;\r\n title?: string;\r\n description?: string;\r\n confirmLabel?: string;\r\n cancelLabel?: string;\r\n variant?: \"default\" | \"destructive\";\r\n}\r\n\r\nexport function ConfirmDialog({\r\n open,\r\n onClose,\r\n onConfirm,\r\n title = \"Are you sure?\",\r\n description = \"This action cannot be undone.\",\r\n confirmLabel = \"Confirm\",\r\n cancelLabel = \"Cancel\",\r\n variant = \"default\",\r\n}: ConfirmDialogProps) {\r\n const btnStyle: React.CSSProperties = { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" };\r\n\r\n return (\r\n <Modal open={open} onClose={onClose} title={title} description={description} size=\"sm\">\r\n <div className=\"flex items-center justify-end gap-2 pt-4\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 rounded-[var(--radius-md)] border border-border text-foreground hover:bg-muted transition-colors cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {cancelLabel}\r\n </button>\r\n <button\r\n onClick={() => { onConfirm(); onClose(); }}\r\n className={`px-4 py-2 rounded-[var(--radius-md)] text-primary-foreground transition-colors cursor-pointer ${\r\n variant === \"destructive\" ? \"bg-destructive hover:bg-destructive/90\" : \"bg-primary hover:bg-primary/90\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n {confirmLabel}\r\n </button>\r\n </div>\r\n </Modal>\r\n );\r\n}\r\n","import React, { useMemo, useCallback } from \"react\";\r\nimport {\r\n ChevronLeft,\r\n ChevronRight,\r\n ChevronsLeft,\r\n ChevronsRight,\r\n MoreHorizontal,\r\n} from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type PaginationSize = \"sm\" | \"md\" | \"lg\";\r\nexport type PaginationVariant = \"default\" | \"outlined\" | \"filled\" | \"minimal\";\r\n\r\nexport interface PaginationProps {\r\n /** Current active page (1-indexed) */\r\n currentPage: number;\r\n /** Total number of pages */\r\n totalPages: number;\r\n /** Callback when page changes */\r\n onPageChange: (page: number) => void;\r\n /** Number of sibling pages to show on each side of current */\r\n siblingCount?: number;\r\n /** Show first/last page jump buttons */\r\n showFirstLast?: boolean;\r\n /** Show previous/next buttons */\r\n showPrevNext?: boolean;\r\n /** Show page size selector */\r\n showPageSize?: boolean;\r\n /** Available page sizes */\r\n pageSizeOptions?: number[];\r\n /** Current page size */\r\n pageSize?: number;\r\n /** Callback when page size changes */\r\n onPageSizeChange?: (size: number) => void;\r\n /** Total number of items (for info display) */\r\n totalItems?: number;\r\n /** Visual size */\r\n size?: PaginationSize;\r\n /** Visual variant */\r\n variant?: PaginationVariant;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Show \"Page X of Y\" text */\r\n showPageInfo?: boolean;\r\n /** Show total items info */\r\n showItemsInfo?: boolean;\r\n /** Custom previous label */\r\n prevLabel?: React.ReactNode;\r\n /** Custom next label */\r\n nextLabel?: React.ReactNode;\r\n}\r\n\r\n// ─── Size Config ──────────────────────────────────────────────────────────────\r\n\r\nconst sizeConfig: Record<\r\n PaginationSize,\r\n { btn: string; icon: number; text: React.CSSProperties; gap: string }\r\n> = {\r\n sm: {\r\n btn: \"min-w-[28px] h-7 px-1.5\",\r\n icon: 14,\r\n text: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"calc(var(--text-button) * 0.9)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n gap: \"gap-1\",\r\n },\r\n md: {\r\n btn: \"min-w-[34px] h-9 px-2\",\r\n icon: 16,\r\n text: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n gap: \"gap-1.5\",\r\n },\r\n lg: {\r\n btn: \"min-w-[42px] h-11 px-3\",\r\n icon: 18,\r\n text: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"calc(var(--text-button) * 1.1)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n gap: \"gap-2\",\r\n },\r\n};\r\n\r\n// ─── Variant Config ───────────────────────────────────────────────────────────\r\n\r\nconst variantConfig: Record<\r\n PaginationVariant,\r\n { base: string; active: string; hover: string }\r\n> = {\r\n default: {\r\n base: \"bg-transparent text-foreground border border-transparent\",\r\n active: \"bg-primary text-primary-foreground border-primary shadow-elevation-sm\",\r\n hover: \"hover:bg-muted\",\r\n },\r\n outlined: {\r\n base: \"bg-transparent text-foreground border border-border\",\r\n active: \"bg-primary text-primary-foreground border-primary shadow-elevation-sm\",\r\n hover: \"hover:bg-muted hover:border-muted\",\r\n },\r\n filled: {\r\n base: \"bg-muted/50 text-foreground border border-transparent\",\r\n active: \"bg-primary text-primary-foreground border-primary shadow-elevation-sm\",\r\n hover: \"hover:bg-muted\",\r\n },\r\n minimal: {\r\n base: \"bg-transparent text-foreground border border-transparent\",\r\n active: \"bg-accent text-accent-foreground border-accent\",\r\n hover: \"hover:text-primary\",\r\n },\r\n};\r\n\r\n// ─── Range helper ─────────────────────────────────────────────────────────────\r\n\r\nfunction usePaginationRange(\r\n currentPage: number,\r\n totalPages: number,\r\n siblingCount: number\r\n): (number | \"dots-left\" | \"dots-right\")[] {\r\n return useMemo(() => {\r\n const totalNumbers = siblingCount * 2 + 5; // siblings + first + last + current + 2 dots\r\n if (totalNumbers >= totalPages) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n\r\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\r\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\r\n\r\n const showLeftDots = leftSiblingIndex > 2;\r\n const showRightDots = rightSiblingIndex < totalPages - 1;\r\n\r\n if (!showLeftDots && showRightDots) {\r\n const leftItemCount = 3 + 2 * siblingCount;\r\n const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\r\n return [...leftRange, \"dots-right\" as const, totalPages];\r\n }\r\n\r\n if (showLeftDots && !showRightDots) {\r\n const rightItemCount = 3 + 2 * siblingCount;\r\n const rightRange = Array.from(\r\n { length: rightItemCount },\r\n (_, i) => totalPages - rightItemCount + i + 1\r\n );\r\n return [1, \"dots-left\" as const, ...rightRange];\r\n }\r\n\r\n const middleRange = Array.from(\r\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\r\n (_, i) => leftSiblingIndex + i\r\n );\r\n return [1, \"dots-left\" as const, ...middleRange, \"dots-right\" as const, totalPages];\r\n }, [currentPage, totalPages, siblingCount]);\r\n}\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\nexport function Pagination({\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n siblingCount = 1,\r\n showFirstLast = false,\r\n showPrevNext = true,\r\n showPageSize = false,\r\n pageSizeOptions = [10, 20, 50, 100],\r\n pageSize = 10,\r\n onPageSizeChange,\r\n totalItems,\r\n size = \"md\",\r\n variant = \"default\",\r\n disabled = false,\r\n showPageInfo = false,\r\n showItemsInfo = false,\r\n prevLabel,\r\n nextLabel,\r\n}: PaginationProps) {\r\n const range = usePaginationRange(currentPage, totalPages, siblingCount);\r\n const cfg = sizeConfig[size];\r\n const vars = variantConfig[variant];\r\n\r\n const goTo = useCallback(\r\n (page: number) => {\r\n if (!disabled && page >= 1 && page <= totalPages) onPageChange(page);\r\n },\r\n [disabled, totalPages, onPageChange]\r\n );\r\n\r\n const btnCls = (isActive: boolean, isDisabled: boolean) =>\r\n `inline-flex items-center justify-center rounded-[var(--radius-md)] transition-all cursor-pointer select-none\r\n ${cfg.btn}\r\n ${isDisabled ? \"opacity-40 pointer-events-none cursor-default\" : \"\"}\r\n ${isActive ? vars.active : `${vars.base} ${!isDisabled ? vars.hover : \"\"}`}`;\r\n\r\n // Items info calculation\r\n const startItem = totalItems ? (currentPage - 1) * pageSize + 1 : 0;\r\n const endItem = totalItems ? Math.min(currentPage * pageSize, totalItems) : 0;\r\n\r\n const labelStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\r\n {/* Left: items info / page size */}\r\n <div className=\"flex items-center gap-4\">\r\n {showItemsInfo && totalItems !== undefined && (\r\n <span className=\"text-muted-foreground\" style={labelStyle}>\r\n {startItem}–{endItem} of {totalItems}\r\n </span>\r\n )}\r\n\r\n {showPageSize && (\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-muted-foreground\" style={labelStyle}>\r\n Rows per page:\r\n </span>\r\n <select\r\n value={pageSize}\r\n onChange={(e) => onPageSizeChange?.(Number(e.target.value))}\r\n disabled={disabled}\r\n className=\"bg-input-background text-foreground border border-border rounded-[var(--radius-md)] px-2 py-1 cursor-pointer focus:outline-none focus:ring-2 focus:ring-ring/30\"\r\n style={{\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n }}\r\n >\r\n {pageSizeOptions.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {opt}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Center: pagination buttons */}\r\n <nav\r\n className={`flex items-center ${cfg.gap}`}\r\n aria-label=\"Pagination\"\r\n role=\"navigation\"\r\n >\r\n {/* First */}\r\n {showFirstLast && (\r\n <button\r\n onClick={() => goTo(1)}\r\n disabled={disabled || currentPage <= 1}\r\n className={btnCls(false, disabled || currentPage <= 1)}\r\n style={cfg.text}\r\n aria-label=\"First page\"\r\n title=\"First page\"\r\n >\r\n <ChevronsLeft size={cfg.icon} />\r\n </button>\r\n )}\r\n\r\n {/* Previous */}\r\n {showPrevNext && (\r\n <button\r\n onClick={() => goTo(currentPage - 1)}\r\n disabled={disabled || currentPage <= 1}\r\n className={btnCls(false, disabled || currentPage <= 1)}\r\n style={cfg.text}\r\n aria-label=\"Previous page\"\r\n >\r\n {prevLabel ?? <ChevronLeft size={cfg.icon} />}\r\n </button>\r\n )}\r\n\r\n {/* Page numbers */}\r\n {range.map((item, idx) => {\r\n if (item === \"dots-left\" || item === \"dots-right\") {\r\n return (\r\n <span\r\n key={item}\r\n className={`inline-flex items-center justify-center text-muted-foreground ${cfg.btn}`}\r\n style={cfg.text}\r\n >\r\n <MoreHorizontal size={cfg.icon} />\r\n </span>\r\n );\r\n }\r\n return (\r\n <button\r\n key={item}\r\n onClick={() => goTo(item)}\r\n disabled={disabled}\r\n className={btnCls(item === currentPage, disabled)}\r\n style={cfg.text}\r\n aria-label={`Page ${item}`}\r\n aria-current={item === currentPage ? \"page\" : undefined}\r\n >\r\n {item}\r\n </button>\r\n );\r\n })}\r\n\r\n {/* Next */}\r\n {showPrevNext && (\r\n <button\r\n onClick={() => goTo(currentPage + 1)}\r\n disabled={disabled || currentPage >= totalPages}\r\n className={btnCls(false, disabled || currentPage >= totalPages)}\r\n style={cfg.text}\r\n aria-label=\"Next page\"\r\n >\r\n {nextLabel ?? <ChevronRight size={cfg.icon} />}\r\n </button>\r\n )}\r\n\r\n {/* Last */}\r\n {showFirstLast && (\r\n <button\r\n onClick={() => goTo(totalPages)}\r\n disabled={disabled || currentPage >= totalPages}\r\n className={btnCls(false, disabled || currentPage >= totalPages)}\r\n style={cfg.text}\r\n aria-label=\"Last page\"\r\n title=\"Last page\"\r\n >\r\n <ChevronsRight size={cfg.icon} />\r\n </button>\r\n )}\r\n </nav>\r\n\r\n {/* Right: page info */}\r\n {showPageInfo && (\r\n <span className=\"text-muted-foreground\" style={labelStyle}>\r\n Page {currentPage} of {totalPages}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport { Search, X, Loader2 } from \"lucide-react\";\r\n\r\nexport type SearchSize = \"sm\" | \"md\" | \"lg\";\r\nexport type SearchVariant = \"default\" | \"outlined\" | \"filled\";\r\n\r\ninterface SearchSuggestion {\r\n id: string;\r\n label: string;\r\n description?: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface SearchFieldProps {\r\n value?: string;\r\n onChange?: (value: string) => void;\r\n onSearch?: (value: string) => void;\r\n placeholder?: string;\r\n size?: SearchSize;\r\n variant?: SearchVariant;\r\n loading?: boolean;\r\n suggestions?: SearchSuggestion[];\r\n onSuggestionSelect?: (suggestion: SearchSuggestion) => void;\r\n clearable?: boolean;\r\n disabled?: boolean;\r\n autoFocus?: boolean;\r\n debounce?: number;\r\n className?: string;\r\n}\r\n\r\nconst sizeMap: Record<SearchSize, { input: string; icon: number; style: React.CSSProperties }> = {\r\n sm: { input: \"h-8 px-8 text-sm\", icon: 14, style: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.85)\", fontWeight: \"var(--weight-label)\" } },\r\n md: { input: \"h-10 px-9\", icon: 16, style: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" } },\r\n lg: { input: \"h-12 px-10\", icon: 18, style: { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 1.1)\", fontWeight: \"var(--weight-label)\" } },\r\n};\r\n\r\nconst variantMap: Record<SearchVariant, string> = {\r\n default: \"bg-card border border-border focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/20\",\r\n outlined: \"bg-transparent border-2 border-border focus-within:border-primary\",\r\n filled: \"bg-muted/50 border border-transparent focus-within:border-ring focus-within:bg-card\",\r\n};\r\n\r\nexport function SearchField({\r\n value: controlled,\r\n onChange,\r\n onSearch,\r\n placeholder = \"Search...\",\r\n size = \"md\",\r\n variant = \"default\",\r\n loading = false,\r\n suggestions = [],\r\n onSuggestionSelect,\r\n clearable = true,\r\n disabled = false,\r\n autoFocus = false,\r\n debounce = 0,\r\n className = \"\",\r\n}: SearchFieldProps) {\r\n const [internal, setInternal] = useState(\"\");\r\n const [showSuggestions, setShowSuggestions] = useState(false);\r\n const [highlightIdx, setHighlightIdx] = useState(-1);\r\n const val = controlled ?? internal;\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\r\n\r\n const s = sizeMap[size];\r\n\r\n const setValue = useCallback((v: string) => {\r\n if (controlled === undefined) setInternal(v);\r\n onChange?.(v);\r\n if (debounce > 0) {\r\n clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => onSearch?.(v), debounce);\r\n }\r\n }, [controlled, onChange, onSearch, debounce]);\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\") {\r\n if (highlightIdx >= 0 && suggestions[highlightIdx]) {\r\n onSuggestionSelect?.(suggestions[highlightIdx]);\r\n setShowSuggestions(false);\r\n } else {\r\n onSearch?.(val);\r\n }\r\n } else if (e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n setHighlightIdx((i) => Math.min(i + 1, suggestions.length - 1));\r\n } else if (e.key === \"ArrowUp\") {\r\n e.preventDefault();\r\n setHighlightIdx((i) => Math.max(i - 1, -1));\r\n } else if (e.key === \"Escape\") {\r\n setShowSuggestions(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleClick = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setShowSuggestions(false);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClick);\r\n return () => document.removeEventListener(\"mousedown\", handleClick);\r\n }, []);\r\n\r\n useEffect(() => {\r\n setShowSuggestions(suggestions.length > 0 && val.length > 0);\r\n setHighlightIdx(-1);\r\n }, [suggestions, val]);\r\n\r\n const labelStyle: React.CSSProperties = { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" };\r\n const smallLabelStyle: React.CSSProperties = { fontFamily: \"var(--font-label)\", fontSize: \"calc(var(--text-label) * 0.8)\", fontWeight: \"var(--weight-label)\" };\r\n\r\n return (\r\n <div ref={containerRef} className={`relative ${className}`}>\r\n <div className={`relative rounded-[var(--radius-md)] transition-all ${variantMap[variant]} ${disabled ? \"opacity-50 pointer-events-none\" : \"\"}`}>\r\n {/* Search icon */}\r\n <span className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground pointer-events-none\">\r\n <Search size={s.icon} />\r\n </span>\r\n\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={val}\r\n onChange={(e) => setValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n onFocus={() => suggestions.length > 0 && val.length > 0 && setShowSuggestions(true)}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n autoFocus={autoFocus}\r\n className={`w-full ${s.input} rounded-[var(--radius-md)] bg-transparent outline-none text-foreground placeholder:text-muted-foreground`}\r\n style={s.style}\r\n />\r\n\r\n {/* Right side: loading/clear */}\r\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\">\r\n {loading && <Loader2 size={s.icon} className=\"animate-spin text-muted-foreground\" />}\r\n {clearable && val && !loading && (\r\n <button\r\n onClick={() => { setValue(\"\"); inputRef.current?.focus(); }}\r\n className=\"text-muted-foreground hover:text-foreground transition-colors cursor-pointer\"\r\n >\r\n <X size={s.icon} />\r\n </button>\r\n )}\r\n </span>\r\n </div>\r\n\r\n {/* Suggestions dropdown */}\r\n {showSuggestions && suggestions.length > 0 && (\r\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-popover border border-border rounded-[var(--radius-md)] shadow-lg z-50 overflow-hidden max-h-64 overflow-y-auto\" style={{ padding: \"var(--Spacing--Spacing-sm)\" }}>\r\n {suggestions.map((sug, idx) => (\r\n <button\r\n key={sug.id}\r\n onClick={() => { onSuggestionSelect?.(sug); setShowSuggestions(false); }}\r\n className={`w-full text-left flex items-center rounded-[var(--radius-sm)] transition-colors cursor-pointer ${\r\n idx === highlightIdx ? \"bg-[var(--Colors--Background--bg-brand-secondary)]\" : \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\"\r\n }`}\r\n style={{ padding: \"var(--Spacing--Spacing-md) var(--Spacing--Spacing-2xl)\", gap: \"var(--Spacing--Spacing-lg)\" }}\r\n >\r\n {sug.icon && <span className=\"text-muted-foreground flex-shrink-0\">{sug.icon}</span>}\r\n <div className=\"min-w-0 flex-1\">\r\n <span className=\"text-foreground block truncate\" style={labelStyle}>{sug.label}</span>\r\n {sug.description && <span className=\"text-muted-foreground block truncate\" style={{ marginTop: \"var(--Spacing--Spacing-xxs)\", ...smallLabelStyle }}>{sug.description}</span>}\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}","import React, { useState, useMemo } from \"react\";\r\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from \"lucide-react\";\r\n\r\nexport type TableSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface TableColumn<T = any> {\r\n key: string;\r\n header: string;\r\n sortable?: boolean;\r\n width?: string;\r\n align?: \"left\" | \"center\" | \"right\";\r\n render?: (value: any, row: T, index: number) => React.ReactNode;\r\n}\r\n\r\ninterface TableProps<T = any> {\r\n columns: TableColumn<T>[];\r\n data: T[];\r\n size?: TableSize;\r\n striped?: boolean;\r\n hoverable?: boolean;\r\n bordered?: boolean;\r\n selectable?: boolean;\r\n selectedRows?: Set<number>;\r\n onSelectionChange?: (selected: Set<number>) => void;\r\n loading?: boolean;\r\n emptyMessage?: string;\r\n stickyHeader?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst cellPadding: Record<TableSize, string> = {\r\n sm: \"px-3 py-2\",\r\n md: \"px-4 py-3\",\r\n lg: \"px-5 py-4\",\r\n};\r\n\r\nexport function DSTable<T extends Record<string, any>>({\r\n columns,\r\n data,\r\n size = \"md\",\r\n striped = false,\r\n hoverable = true,\r\n bordered = false,\r\n selectable = false,\r\n selectedRows: controlledSelected,\r\n onSelectionChange,\r\n loading = false,\r\n emptyMessage = \"No data available\",\r\n stickyHeader = false,\r\n className = \"\",\r\n}: TableProps<T>) {\r\n const [sortKey, setSortKey] = useState<string | null>(null);\r\n const [sortDir, setSortDir] = useState<\"asc\" | \"desc\">(\"asc\");\r\n const [internalSelected, setInternalSelected] = useState<Set<number>>(new Set());\r\n const selected = controlledSelected ?? internalSelected;\r\n\r\n const setSelected = (s: Set<number>) => {\r\n if (!controlledSelected) setInternalSelected(s);\r\n onSelectionChange?.(s);\r\n };\r\n\r\n const sortedData = useMemo(() => {\r\n if (!sortKey) return data;\r\n return [...data].sort((a, b) => {\r\n const aVal = a[sortKey];\r\n const bVal = b[sortKey];\r\n if (aVal == null) return 1;\r\n if (bVal == null) return -1;\r\n const cmp = typeof aVal === \"string\" ? aVal.localeCompare(bVal) : aVal - bVal;\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n }, [data, sortKey, sortDir]);\r\n\r\n const handleSort = (key: string) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const allSelected = data.length > 0 && selected.size === data.length;\r\n const someSelected = selected.size > 0 && !allSelected;\r\n\r\n const toggleAll = () => {\r\n if (allSelected) setSelected(new Set());\r\n else setSelected(new Set(data.map((_, i) => i)));\r\n };\r\n\r\n const toggleRow = (idx: number) => {\r\n const next = new Set(selected);\r\n if (next.has(idx)) next.delete(idx);\r\n else next.add(idx);\r\n setSelected(next);\r\n };\r\n\r\n const labelStyle: React.CSSProperties = { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" };\r\n const headerStyle: React.CSSProperties = { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" };\r\n\r\n return (\r\n <div className={`rounded-[var(--radius-lg)] border border-border overflow-hidden ${className}`}>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full border-collapse\">\r\n <thead className={stickyHeader ? \"sticky top-0 z-10\" : \"\"}>\r\n <tr className=\"bg-muted/50 border-b border-border\">\r\n {selectable && (\r\n <th className={`${cellPadding[size]} w-12`}>\r\n <input\r\n type=\"checkbox\"\r\n checked={allSelected}\r\n ref={(el) => { if (el) el.indeterminate = someSelected; }}\r\n onChange={toggleAll}\r\n className=\"w-4 h-4 rounded-[var(--radius-sm)] border-border accent-primary cursor-pointer\"\r\n />\r\n </th>\r\n )}\r\n {columns.map((col) => (\r\n <th\r\n key={col.key}\r\n className={`${cellPadding[size]} text-${col.align ?? \"left\"} text-muted-foreground ${col.sortable ? \"cursor-pointer select-none hover:text-foreground transition-colors\" : \"\"} ${bordered ? \"border-x border-border first:border-l-0 last:border-r-0\" : \"\"}`}\r\n style={{ ...headerStyle, width: col.width }}\r\n onClick={() => col.sortable && handleSort(col.key)}\r\n >\r\n <span className=\"inline-flex items-center gap-1\">\r\n {col.header}\r\n {col.sortable && (\r\n <span className=\"text-muted-foreground/60\">\r\n {sortKey === col.key ? (\r\n sortDir === \"asc\" ? <ChevronUp size={14} /> : <ChevronDown size={14} />\r\n ) : (\r\n <ChevronsUpDown size={12} />\r\n )}\r\n </span>\r\n )}\r\n </span>\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {loading ? (\r\n <tr>\r\n <td colSpan={columns.length + (selectable ? 1 : 0)} className={`${cellPadding[size]} text-center text-muted-foreground`}>\r\n <div className=\"flex items-center justify-center gap-2 py-8\">\r\n <div className=\"w-5 h-5 border-2 border-primary border-t-transparent rounded-full animate-spin\" />\r\n <span style={labelStyle}>Loading...</span>\r\n </div>\r\n </td>\r\n </tr>\r\n ) : sortedData.length === 0 ? (\r\n <tr>\r\n <td colSpan={columns.length + (selectable ? 1 : 0)} className={`${cellPadding[size]} text-center text-muted-foreground py-12`}>\r\n <span style={labelStyle}>{emptyMessage}</span>\r\n </td>\r\n </tr>\r\n ) : (\r\n sortedData.map((row, idx) => {\r\n const isSelected = selected.has(idx);\r\n return (\r\n <tr\r\n key={idx}\r\n className={`border-b border-border last:border-b-0 transition-colors ${\r\n isSelected ? \"bg-primary/5\" : striped && idx % 2 === 1 ? \"bg-muted/20\" : \"bg-card\"\r\n } ${hoverable ? \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\" : \"\"}`}\r\n >\r\n {selectable && (\r\n <td className={`${cellPadding[size]} w-12`}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={() => toggleRow(idx)}\r\n className=\"w-4 h-4 rounded-[var(--radius-sm)] border-border accent-primary cursor-pointer\"\r\n />\r\n </td>\r\n )}\r\n {columns.map((col) => (\r\n <td\r\n key={col.key}\r\n className={`${cellPadding[size]} text-${col.align ?? \"left\"} text-foreground ${bordered ? \"border-x border-border first:border-l-0 last:border-r-0\" : \"\"}`}\r\n style={labelStyle}\r\n >\r\n {col.render ? col.render(row[col.key], row, idx) : row[col.key]}\r\n </td>\r\n ))}\r\n </tr>\r\n );\r\n })\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n}","import React, { useState, useRef, useEffect } from \"react\";\r\n\r\nexport type TabVariant = \"default\" | \"bordered\" | \"pills\" | \"underline\";\r\nexport type TabSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface TabItem {\r\n id: string;\r\n label: string;\r\n icon?: React.ReactNode;\r\n badge?: number | string;\r\n disabled?: boolean;\r\n content?: React.ReactNode;\r\n}\r\n\r\ninterface TabsProps {\r\n tabs: TabItem[];\r\n variant?: TabVariant;\r\n size?: TabSize;\r\n defaultTab?: string;\r\n activeTab?: string;\r\n onChange?: (id: string) => void;\r\n fullWidth?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst sizeStyles: Record<TabSize, React.CSSProperties> = {\r\n sm: { fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 0.85)\", fontWeight: \"var(--weight-button)\", padding: \"6px 12px\" },\r\n md: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\", padding: \"8px 16px\" },\r\n lg: { fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 1.14)\", fontWeight: \"var(--weight-button)\", padding: \"10px 20px\" },\r\n};\r\n\r\nexport function Tabs({ tabs, variant = \"default\", size = \"md\", defaultTab, activeTab: controlled, onChange, fullWidth = false, className = \"\" }: TabsProps) {\r\n const [internalActive, setInternalActive] = useState(defaultTab ?? tabs[0]?.id ?? \"\");\r\n const active = controlled ?? internalActive;\r\n const tabsRef = useRef<HTMLDivElement>(null);\r\n const [indicator, setIndicator] = useState({ left: 0, width: 0 });\r\n\r\n const handleChange = (id: string) => {\r\n if (!controlled) setInternalActive(id);\r\n onChange?.(id);\r\n };\r\n\r\n useEffect(() => {\r\n if (variant !== \"underline\" && variant !== \"default\") return;\r\n const container = tabsRef.current;\r\n if (!container) return;\r\n const activeEl = container.querySelector(`[data-tab-id=\"${active}\"]`) as HTMLElement;\r\n if (activeEl) {\r\n setIndicator({ left: activeEl.offsetLeft, width: activeEl.offsetWidth });\r\n }\r\n }, [active, variant]);\r\n\r\n const activeContent = tabs.find((t) => t.id === active)?.content;\r\n\r\n const containerClass = (() => {\r\n switch (variant) {\r\n case \"bordered\": return \"border border-border rounded-[var(--radius)] bg-muted/30 p-1 gap-1\";\r\n case \"pills\": return \"gap-1.5\";\r\n case \"underline\": return \"border-b border-border relative\";\r\n default: return \"border-b border-border relative\";\r\n }\r\n })();\r\n\r\n const getTabClass = (isActive: boolean, disabled: boolean) => {\r\n const base = \"relative flex items-center gap-1.5 transition-all cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-ring whitespace-nowrap\";\r\n if (disabled) return `${base} opacity-40 !cursor-not-allowed`;\r\n switch (variant) {\r\n case \"bordered\":\r\n return `${base} rounded-[var(--radius-sm)] ${isActive ? \"bg-card text-foreground shadow-elevation-sm\" : \"text-muted-foreground hover:text-foreground hover:bg-card/50\"}`;\r\n case \"pills\":\r\n return `${base} rounded-[var(--radius)] ${isActive ? \"bg-primary text-primary-foreground\" : \"text-muted-foreground hover:text-foreground hover:bg-muted\"}`;\r\n case \"underline\":\r\n return `${base} ${isActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"}`;\r\n default:\r\n return `${base} ${isActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"}`;\r\n }\r\n };\r\n\r\n return (\r\n <div className={className}>\r\n <div ref={tabsRef} className={`flex ${fullWidth ? \"\" : \"inline-flex\"} ${containerClass}`} role=\"tablist\">\r\n {(variant === \"default\" || variant === \"underline\") && (\r\n <div\r\n className=\"absolute bottom-0 h-0.5 bg-primary transition-all duration-200 rounded-full\"\r\n style={{ left: indicator.left, width: indicator.width }}\r\n />\r\n )}\r\n {tabs.map((tab) => {\r\n const isActive = active === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n data-tab-id={tab.id}\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n disabled={tab.disabled}\r\n onClick={() => !tab.disabled && handleChange(tab.id)}\r\n className={`${getTabClass(isActive, !!tab.disabled)} ${fullWidth ? \"flex-1 justify-center\" : \"\"}`}\r\n style={sizeStyles[size]}\r\n >\r\n {tab.icon && <span className=\"flex-shrink-0\">{tab.icon}</span>}\r\n <span>{tab.label}</span>\r\n {tab.badge !== undefined && (\r\n <span\r\n className={`ml-1 px-1.5 py-0.5 rounded-full min-w-[18px] text-center ${\r\n isActive && variant === \"pills\" ? \"bg-primary-foreground/20 text-primary-foreground\" : \"bg-muted text-muted-foreground\"\r\n }`}\r\n style={{ fontFamily: \"var(--font-button)\", fontSize: \"calc(var(--text-button) * 0.72)\", fontWeight: \"var(--weight-button)\", lineHeight: \"1\" }}\r\n >\r\n {tab.badge}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n {activeContent && (\r\n <div className=\"pt-4\" role=\"tabpanel\">\r\n {activeContent}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}"],"names":["toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","__iconNode","Calendar","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ChevronsLeft","ChevronsRight","ChevronsUpDown","CircleAlert","CircleCheck","CircleX","Clock","Ellipsis","EyeOff","Eye","Info","LoaderCircle","Minus","Search","TriangleAlert","X","sizeStyles","sizeTextStyles","sizeIconMap","variantStyles","DSButton","variant","loading","loadingText","leftIcon","rightIcon","fullWidth","active","disabled","isDisabled","jsx","jsxs","Fragment","Loader2","IconButton","icon","ButtonGroup","inputSizeConfig","inputVariantStyles","inputStateStyles","labelStyle","DSInput","label","helperText","errorMessage","successMessage","inputSize","state","prefix","suffix","clearable","showPasswordToggle","required","onClear","typeProp","value","defaultValue","onChange","isFocused","setIsFocused","useState","showPw","setShowPw","internalValue","setInternalValue","currentValue","sc","vs","computedState","isPassword","resolvedType","handleChange","useCallback","e","handleClear","hasValue","AlertCircle","CheckCircle2","DSTextarea","showCharCount","maxLength","charCount","setCharCount","alertStyles","AlertTriangle","XCircle","Alert","title","dismissible","onDismiss","action","visible","setVisible","s","handleDismiss","toastListeners","toastQueue","emitToasts","fn","toast","opts","t","message","id","ToastContainer","toasts","setToasts","useRef","variantClasses","dotColors","Badge","dot","removable","onRemove","sizeConfig","DSCheckbox","controlledChecked","indeterminate","defaultChecked","description","error","propId","internalChecked","setInternalChecked","isChecked","uid","React","handleToggle","next","isActive","CheckboxGroup","direction","RadioGroupCtx","createContext","DSRadio","localDisabled","localSize","ctx","useContext","isSelected","sz","handleSelect","RadioGroup","name","controlled","internal","setInternal","val","v","WEEKDAYS","MONTHS","isSameDay","a","b","isInRange","date","start","end","d","isDateDisabled","minDate","maxDate","disabledDates","getDaysInMonth","year","month","getCalendarDays","firstDay","daysInMonth","days","i","formatDate","showTime","dd","mm","yyyy","str","hh","min","stateRing","DatePicker","rangeValue","onRangeChange","mode","placeholder","showToday","footer","open","setOpen","viewDate","setViewDate","view","setView","hoverDate","setHoverDate","hours","setHours","minutes","setMinutes","containerRef","cfg","useEffect","handleClick","useMemo","today","prevMonth","nextMonth","prevYear","nextYear","selectDay","day","selected","goToToday","now","handleTimeApply","updated","displayValue","stateIcon","helperMsg","helperColor","captionStyle","buttonStyle","yearGridStart","CalendarIcon","offset","monthDate","wd","isToday","inRange","m","idx","_","yr","sizeMap","Modal","onClose","closeOnOverlay","showCloseButton","dialogRef","handleEsc","ConfirmDialog","onConfirm","confirmLabel","cancelLabel","btnStyle","variantConfig","usePaginationRange","currentPage","totalPages","siblingCount","leftSiblingIndex","rightSiblingIndex","showLeftDots","showRightDots","leftItemCount","rightItemCount","Pagination","onPageChange","showFirstLast","showPrevNext","showPageSize","pageSizeOptions","pageSize","onPageSizeChange","totalItems","showPageInfo","showItemsInfo","prevLabel","nextLabel","range","vars","goTo","page","btnCls","startItem","endItem","opt","item","MoreHorizontal","variantMap","SearchField","onSearch","suggestions","onSuggestionSelect","autoFocus","debounce","showSuggestions","setShowSuggestions","highlightIdx","setHighlightIdx","inputRef","debounceRef","setValue","handleKeyDown","smallLabelStyle","_a","sug","cellPadding","DSTable","columns","data","striped","hoverable","bordered","selectable","controlledSelected","onSelectionChange","emptyMessage","stickyHeader","sortKey","setSortKey","sortDir","setSortDir","internalSelected","setInternalSelected","setSelected","sortedData","aVal","bVal","cmp","handleSort","key","allSelected","someSelected","toggleAll","toggleRow","headerStyle","el","col","row","Tabs","tabs","defaultTab","internalActive","setInternalActive","tabsRef","indicator","setIndicator","container","activeEl","activeContent","_b","containerClass","getTabClass","base","tab"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}
|