@uxuissk/design-system 0.2.0 → 0.4.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/dist/sellsuki-ds.js +1124 -1086
- package/dist/sellsuki-ds.js.map +1 -1
- package/dist/sellsuki-ds.umd.cjs +107 -107
- package/dist/sellsuki-ds.umd.cjs.map +1 -1
- package/dist/types/index.d.ts +32 -4
- package/package.json +7 -7
package/dist/sellsuki-ds.js.map
CHANGED
|
@@ -1 +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/arrow-down-right.js","../node_modules/lucide-react/dist/esm/icons/arrow-up-right.js","../node_modules/lucide-react/dist/esm/icons/bell-off.js","../node_modules/lucide-react/dist/esm/icons/bell.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/circle.js","../node_modules/lucide-react/dist/esm/icons/clock.js","../node_modules/lucide-react/dist/esm/icons/copy.js","../node_modules/lucide-react/dist/esm/icons/dot.js","../node_modules/lucide-react/dist/esm/icons/ellipsis.js","../node_modules/lucide-react/dist/esm/icons/external-link.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/file-text.js","../node_modules/lucide-react/dist/esm/icons/file.js","../node_modules/lucide-react/dist/esm/icons/film.js","../node_modules/lucide-react/dist/esm/icons/folder-open.js","../node_modules/lucide-react/dist/esm/icons/folder.js","../node_modules/lucide-react/dist/esm/icons/heart.js","../node_modules/lucide-react/dist/esm/icons/image.js","../node_modules/lucide-react/dist/esm/icons/inbox.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/menu.js","../node_modules/lucide-react/dist/esm/icons/minus.js","../node_modules/lucide-react/dist/esm/icons/plus.js","../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../node_modules/lucide-react/dist/esm/icons/search.js","../node_modules/lucide-react/dist/esm/icons/slash.js","../node_modules/lucide-react/dist/esm/icons/star.js","../node_modules/lucide-react/dist/esm/icons/thumbs-up.js","../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../node_modules/lucide-react/dist/esm/icons/upload.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zoom-in.js","../node_modules/lucide-react/dist/esm/icons/zoom-out.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","../src/lib/components/ds-accordion.tsx","../src/lib/components/ds-avatar.tsx","../src/lib/components/ds-breadcrumb.tsx","../src/lib/components/ds-card.tsx","../src/lib/components/ds-colorpicker.tsx","../src/lib/components/ds-divider.tsx","../src/lib/components/ds-drawer.tsx","../src/lib/components/ds-dropdown.tsx","../src/lib/components/ds-emptystate.tsx","../src/lib/components/ds-fileupload.tsx","../src/lib/components/ds-imagepreview.tsx","../src/lib/components/ds-menu.tsx","../src/lib/components/ds-notification.tsx","../src/lib/components/ds-popover.tsx","../src/lib/components/ds-progressbar.tsx","../src/lib/components/ds-rating.tsx","../src/lib/components/ds-sidebar.tsx","../src/lib/components/ds-skeleton.tsx","../src/lib/components/ds-spinner.tsx","../src/lib/components/ds-statistic.tsx","../src/lib/components/ds-stepper.tsx","../src/lib/components/ds-switch.tsx","../src/lib/components/ds-tag.tsx","../src/lib/components/ds-taginput.tsx","../src/lib/components/ds-timeline.tsx","../src/lib/components/ds-tooltip.tsx","../src/lib/components/ds-topnavbar.tsx","../src/lib/components/ds-transferlist.tsx","../src/lib/components/ds-tree.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: \"m7 7 10 10\", key: \"1fmybs\" }],\n [\"path\", { d: \"M17 7v10H7\", key: \"6fjiku\" }]\n];\nconst ArrowDownRight = createLucideIcon(\"arrow-down-right\", __iconNode);\n\nexport { __iconNode, ArrowDownRight as default };\n//# sourceMappingURL=arrow-down-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 7h10v10\", key: \"1tivn9\" }],\n [\"path\", { d: \"M7 17 17 7\", key: \"1vkiza\" }]\n];\nconst ArrowUpRight = createLucideIcon(\"arrow-up-right\", __iconNode);\n\nexport { __iconNode, ArrowUpRight as default };\n//# sourceMappingURL=arrow-up-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: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742\",\n key: \"178tsu\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }],\n [\"path\", { d: \"M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\", key: \"1hqiys\" }]\n];\nconst BellOff = createLucideIcon(\"bell-off\", __iconNode);\n\nexport { __iconNode, BellOff as default };\n//# sourceMappingURL=bell-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 [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n];\nconst Bell = createLucideIcon(\"bell\", __iconNode);\n\nexport { __iconNode, Bell as default };\n//# sourceMappingURL=bell.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 = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=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 = [\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 [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.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 = [[\"circle\", { cx: \"12.1\", cy: \"12.1\", r: \"1\", key: \"18d7e5\" }]];\nconst Dot = createLucideIcon(\"dot\", __iconNode);\n\nexport { __iconNode, Dot as default };\n//# sourceMappingURL=dot.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 [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.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 [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.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: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M7 3v18\", key: \"bbkbws\" }],\n [\"path\", { d: \"M3 7.5h4\", key: \"zfgn84\" }],\n [\"path\", { d: \"M3 12h18\", key: \"1i2n21\" }],\n [\"path\", { d: \"M3 16.5h4\", key: \"1230mu\" }],\n [\"path\", { d: \"M17 3v18\", key: \"in4fa5\" }],\n [\"path\", { d: \"M17 7.5h4\", key: \"myr1c1\" }],\n [\"path\", { d: \"M17 16.5h4\", key: \"go4c1d\" }]\n];\nconst Film = createLucideIcon(\"film\", __iconNode);\n\nexport { __iconNode, Film as default };\n//# sourceMappingURL=film.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: \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n];\nconst FolderOpen = createLucideIcon(\"folder-open\", __iconNode);\n\nexport { __iconNode, FolderOpen as default };\n//# sourceMappingURL=folder-open.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: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.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: \"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\",\n key: \"c3ymky\"\n }\n ]\n];\nconst Heart = createLucideIcon(\"heart\", __iconNode);\n\nexport { __iconNode, Heart as default };\n//# sourceMappingURL=heart.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.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 [\"polyline\", { points: \"22 12 16 12 14 15 10 15 8 12 2 12\", key: \"o97t9d\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ]\n];\nconst Inbox = createLucideIcon(\"inbox\", __iconNode);\n\nexport { __iconNode, Inbox as default };\n//# sourceMappingURL=inbox.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 = [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"12\", y2: \"12\", key: \"1e0a9i\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"6\", y2: \"6\", key: \"1owob3\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"18\", y2: \"18\", key: \"yk5zj1\" }]\n];\nconst Menu = createLucideIcon(\"menu\", __iconNode);\n\nexport { __iconNode, Menu as default };\n//# sourceMappingURL=menu.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 [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.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: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n];\nconst RotateCw = createLucideIcon(\"rotate-cw\", __iconNode);\n\nexport { __iconNode, RotateCw as default };\n//# sourceMappingURL=rotate-cw.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 = [[\"path\", { d: \"M22 2 2 22\", key: \"y4kqgn\" }]];\nconst Slash = createLucideIcon(\"slash\", __iconNode);\n\nexport { __iconNode, Slash as default };\n//# sourceMappingURL=slash.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: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n];\nconst Star = createLucideIcon(\"star\", __iconNode);\n\nexport { __iconNode, Star as default };\n//# sourceMappingURL=star.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 10v12\", key: \"1qc93n\" }],\n [\n \"path\",\n {\n d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\n key: \"emmmcr\"\n }\n ]\n];\nconst ThumbsUp = createLucideIcon(\"thumbs-up\", __iconNode);\n\nexport { __iconNode, ThumbsUp as default };\n//# sourceMappingURL=thumbs-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 [\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: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"17 8 12 3 7 8\", key: \"t8dd8p\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"3\", y2: \"15\", key: \"widbto\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.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","/**\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 [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomIn = createLucideIcon(\"zoom-in\", __iconNode);\n\nexport { __iconNode, ZoomIn as default };\n//# sourceMappingURL=zoom-in.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 [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomOut = createLucideIcon(\"zoom-out\", __iconNode);\n\nexport { __iconNode, ZoomOut as default };\n//# sourceMappingURL=zoom-out.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: \"var(--text-button)\", 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: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" },\r\n xl: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-caption)\", 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}","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-button)\", fontSize: \"var(--text-button)\", 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\";","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: \"var(--text-label)\", 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}","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: \"var(--text-button)\",\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: \"var(--text-button)\",\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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", 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-button)\", fontSize: \"var(--text-button)\", 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-caption)\", fontSize: \"var(--text-caption)\", 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}","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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", 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-button)\", fontSize: \"var(--text-button)\", 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-caption)\", fontSize: \"var(--text-caption)\", 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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" }}>\r\n {error}\r\n </span>\r\n )}\r\n </fieldset>\r\n </RadioGroupCtx.Provider>\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: \"var(--text-label)\",\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-caption)\",\r\n fontSize: \"var(--text-caption)\",\r\n fontWeight: \"var(--weight-caption)\",\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-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\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-button)\", fontSize: \"var(--text-button)\", 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}","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: \"var(--text-button)\",\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: \"var(--text-label)\",\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}","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\", icon: 14, style: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", 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-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" } },\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>>(undefined);\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-button)\", fontSize: \"var(--text-button)\", 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: \"var(--text-button)\", 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: \"var(--text-label)\", 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: \"var(--text-button)\", 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}","import React, { useState } from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface AccordionItemProps {\r\n /** Header text */\r\n title: string;\r\n /** Content to display when expanded */\r\n children: React.ReactNode;\r\n /** Whether this item is open */\r\n open: boolean;\r\n /** Toggle callback */\r\n onToggle: () => void;\r\n /** Optional leading icon */\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport type AccordionType = \"single\" | \"multiple\";\r\n\r\nexport interface AccordionProps {\r\n /** Expand behavior */\r\n type?: AccordionType;\r\n /** Item definitions */\r\n items: { id: string; title: string; content: React.ReactNode; icon?: React.ReactNode }[];\r\n /** Initially open item(s) */\r\n defaultOpen?: string | string[];\r\n /** Controlled open state (for single: string | null, for multiple: string[]) */\r\n value?: string | null | string[];\r\n /** Change callback */\r\n onChange?: (value: string | null | string[]) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst fontLabel: 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// ─── AccordionItem ───────────────────────────────────────────────────────────\r\n\r\nexport function AccordionItem({ title, children, open, onToggle, icon }: AccordionItemProps) {\r\n return (\r\n <div className=\"border-b border-border last:border-b-0\">\r\n <button\r\n onClick={onToggle}\r\n className=\"w-full flex items-center gap-3 px-4 py-3 text-left hover:bg-muted/20 transition-colors cursor-pointer\"\r\n >\r\n {icon && <span className=\"text-primary flex-shrink-0\">{icon}</span>}\r\n <span className=\"flex-1 text-foreground\" style={fontLabelBold}>{title}</span>\r\n <ChevronDown\r\n size={16}\r\n className={`text-muted-foreground transition-transform ${open ? \"rotate-180\" : \"\"}`}\r\n />\r\n </button>\r\n <div className={`overflow-hidden transition-all ${open ? \"max-h-96 opacity-100\" : \"max-h-0 opacity-0\"}`}>\r\n <div className=\"px-4 pb-4 text-muted-foreground\" style={fontLabel}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Accordion (managed) ─────────────────────────────────────────────────────\r\n\r\nexport function Accordion({\r\n type = \"single\",\r\n items,\r\n defaultOpen,\r\n value,\r\n onChange,\r\n className = \"\",\r\n}: AccordionProps) {\r\n // Internal state for uncontrolled usage\r\n const [internalSingle, setInternalSingle] = useState<string | null>(\r\n typeof defaultOpen === \"string\" ? defaultOpen : null\r\n );\r\n const [internalMultiple, setInternalMultiple] = useState<Set<string>>(\r\n Array.isArray(defaultOpen) ? new Set(defaultOpen) : new Set()\r\n );\r\n\r\n const isControlled = value !== undefined;\r\n\r\n const isOpen = (id: string): boolean => {\r\n if (isControlled) {\r\n if (type === \"single\") return value === id;\r\n return Array.isArray(value) && value.includes(id);\r\n }\r\n if (type === \"single\") return internalSingle === id;\r\n return internalMultiple.has(id);\r\n };\r\n\r\n const toggle = (id: string) => {\r\n if (type === \"single\") {\r\n const next = (isControlled ? value === id : internalSingle === id) ? null : id;\r\n if (!isControlled) setInternalSingle(next);\r\n onChange?.(next);\r\n } else {\r\n if (isControlled) {\r\n const arr = Array.isArray(value) ? value : [];\r\n const next = arr.includes(id) ? arr.filter((v) => v !== id) : [...arr, id];\r\n onChange?.(next);\r\n } else {\r\n setInternalMultiple((prev) => {\r\n const n = new Set(prev);\r\n n.has(id) ? n.delete(id) : n.add(id);\r\n return n;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div className={`rounded-[var(--radius)] border border-border overflow-hidden ${className}`}>\r\n {items.map((item) => (\r\n <AccordionItem\r\n key={item.id}\r\n title={item.title}\r\n open={isOpen(item.id)}\r\n onToggle={() => toggle(item.id)}\r\n icon={item.icon}\r\n >\r\n {item.content}\r\n </AccordionItem>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nAccordion.displayName = \"Accordion\";\r\nAccordionItem.displayName = \"AccordionItem\";\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\r\n\r\nexport interface AvatarProps {\r\n /** Image URL */\r\n src?: string;\r\n /** Full name (used for initials fallback) */\r\n name?: string;\r\n /** Avatar size */\r\n size?: AvatarSize;\r\n /** Status indicator */\r\n status?: AvatarStatus;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\nexport interface AvatarGroupProps {\r\n /** Avatar elements */\r\n children: React.ReactNode;\r\n /** Maximum number of avatars to display before showing +N */\r\n max?: number;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst colors = [\"bg-primary\", \"bg-chart-2\", \"bg-chart-5\", \"bg-destructive\", \"bg-secondary\"];\r\n\r\nconst sizeMap: Record<AvatarSize, { box: string; font: React.CSSProperties }> = {\r\n xs: { box: \"w-6 h-6\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n sm: { box: \"w-8 h-8\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n md: { box: \"w-10 h-10\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n lg: { box: \"w-14 h-14\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n xl: { box: \"w-20 h-20\", font: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" } },\r\n};\r\n\r\nconst statusSizes: Record<AvatarSize, string> = {\r\n xs: \"w-2 h-2\",\r\n sm: \"w-2.5 h-2.5\",\r\n md: \"w-3 h-3\",\r\n lg: \"w-3.5 h-3.5\",\r\n xl: \"w-4 h-4\",\r\n};\r\n\r\nconst statusColors: Record<AvatarStatus, string> = {\r\n online: \"bg-chart-2\",\r\n offline: \"bg-secondary\",\r\n busy: \"bg-destructive\",\r\n away: \"bg-chart-5\",\r\n};\r\n\r\nconst btnStyle: 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// ─── Avatar ──────────────────────────────────────────────────────────────────\r\n\r\nexport function Avatar({ src, name, size = \"md\", status, className = \"\" }: AvatarProps) {\r\n const s = sizeMap[size];\r\n const initials = name\r\n ? name.split(\" \").map((w) => w[0]).join(\"\").slice(0, 2).toUpperCase()\r\n : \"?\";\r\n const bgColor = name ? colors[name.length % colors.length] : \"bg-muted\";\r\n\r\n return (\r\n <div className={`relative inline-flex ${className}`}>\r\n {src ? (\r\n <img\r\n src={src}\r\n alt={name || \"avatar\"}\r\n className={`${s.box} rounded-full object-cover border-2 border-card`}\r\n />\r\n ) : (\r\n <div\r\n className={`${s.box} rounded-full ${bgColor} text-white flex items-center justify-center border-2 border-card`}\r\n style={s.font}\r\n >\r\n {initials}\r\n </div>\r\n )}\r\n {status && (\r\n <span\r\n className={`absolute bottom-0 right-0 ${statusSizes[size]} ${statusColors[status]} rounded-full border-2 border-card`}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── AvatarGroup ─────────────────────────────────────────────────────────────\r\n\r\nexport function AvatarGroup({ children, max, className = \"\" }: AvatarGroupProps) {\r\n const items = React.Children.toArray(children);\r\n const visible = max ? items.slice(0, max) : items;\r\n const extra = max && items.length > max ? items.length - max : 0;\r\n\r\n return (\r\n <div className={`flex -space-x-2 ${className}`}>\r\n {visible.map((child, i) => (\r\n <div key={i} className=\"relative\" style={{ zIndex: visible.length - i }}>\r\n {child}\r\n </div>\r\n ))}\r\n {extra > 0 && (\r\n <div\r\n className=\"relative w-10 h-10 rounded-full bg-muted text-foreground flex items-center justify-center border-2 border-card\"\r\n style={{ ...btnStyle, zIndex: 0 }}\r\n >\r\n +{extra}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nAvatar.displayName = \"Avatar\";\r\nAvatarGroup.displayName = \"AvatarGroup\";\r\n","import React from \"react\";\r\nimport { ChevronRight, Slash, Dot, MoreHorizontal } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport type BreadcrumbSeparator = \"chevron\" | \"slash\" | \"dot\";\r\nexport type BreadcrumbSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface BreadcrumbProps {\r\n items: BreadcrumbItem[];\r\n separator?: BreadcrumbSeparator;\r\n size?: BreadcrumbSize;\r\n maxItems?: number;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst textStyles: Record<BreadcrumbSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n md: fontLabel,\r\n lg: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Breadcrumb({\r\n items,\r\n separator = \"chevron\",\r\n size = \"md\",\r\n maxItems,\r\n}: BreadcrumbProps) {\r\n const sep =\r\n separator === \"slash\" ? (\r\n <Slash size={12} className=\"text-muted-foreground\" />\r\n ) : separator === \"dot\" ? (\r\n <Dot size={16} className=\"text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight size={12} className=\"text-muted-foreground\" />\r\n );\r\n\r\n const pad =\r\n size === \"sm\" ? \"gap-1\" : size === \"lg\" ? \"gap-2.5\" : \"gap-1.5\";\r\n const textStyle = textStyles[size];\r\n\r\n let displayItems = items;\r\n if (maxItems && items.length > maxItems) {\r\n const first = items.slice(0, 1);\r\n const last = items.slice(-(maxItems - 1));\r\n displayItems = [...first, { label: \"\\u2026\" }, ...last];\r\n }\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\">\r\n <ol className={`flex items-center flex-wrap ${pad}`}>\r\n {displayItems.map((item, i) => (\r\n <li key={i} className=\"flex items-center gap-1.5\">\r\n {i > 0 && <span className=\"mx-0.5\">{sep}</span>}\r\n {item.label === \"\\u2026\" ? (\r\n <span className=\"w-6 h-6 flex items-center justify-center rounded-[var(--radius-sm)] text-muted-foreground hover:bg-accent cursor-pointer\">\r\n <MoreHorizontal size={14} />\r\n </span>\r\n ) : i === displayItems.length - 1 ? (\r\n <span\r\n className=\"inline-flex items-center gap-1.5 text-foreground\"\r\n style={{\r\n ...textStyle,\r\n fontWeight: \"var(--weight-button)\",\r\n }}\r\n >\r\n {item.icon}\r\n {item.label}\r\n </span>\r\n ) : (\r\n <a\r\n href={item.href || \"#\"}\r\n onClick={(e) => e.preventDefault()}\r\n className=\"inline-flex items-center gap-1.5 text-muted-foreground hover:text-foreground transition-colors\"\r\n style={textStyle}\r\n >\r\n {item.icon}\r\n {item.label}\r\n </a>\r\n )}\r\n </li>\r\n ))}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n hover?: boolean;\r\n elevation?: \"none\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst elevationMap: Record<string, string> = {\r\n none: \"\",\r\n sm: \"shadow-sm\",\r\n md: \"shadow-md\",\r\n lg: \"shadow-lg\",\r\n};\r\n\r\n// ─── Card ────────────────────────────────────────────────────────────────────\r\n\r\nexport function Card({ children, className, hover, elevation = \"none\" }: CardProps) {\r\n return (\r\n <div\r\n className={`rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden ${elevationMap[elevation] ?? \"\"} ${hover ? \"hover:border-primary/40 hover:shadow-md transition-all cursor-pointer\" : \"\"} ${className ?? \"\"}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nCard.displayName = \"Card\";\r\n\r\n// ─── CardHeader ──────────────────────────────────────────────────────────────\r\n\r\nexport interface CardHeaderProps {\r\n children: React.ReactNode;\r\n action?: React.ReactNode;\r\n}\r\n\r\nexport function CardHeader({ children, action }: CardHeaderProps) {\r\n return (\r\n <div className=\"px-5 py-4 border-b border-border flex items-center justify-between\">\r\n <div>{children}</div>\r\n {action}\r\n </div>\r\n );\r\n}\r\n\r\nCardHeader.displayName = \"CardHeader\";\r\n\r\n// ─── CardBody ────────────────────────────────────────────────────────────────\r\n\r\nexport function CardBody({ children }: { children: React.ReactNode }) {\r\n return <div className=\"px-5 py-4\">{children}</div>;\r\n}\r\n\r\nCardBody.displayName = \"CardBody\";\r\n\r\n// ─── CardFooter ──────────────────────────────────────────────────────────────\r\n\r\nexport function CardFooter({ children }: { children: React.ReactNode }) {\r\n return (\r\n <div className=\"px-5 py-3 border-t border-border bg-muted/10 flex items-center gap-2\">\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nCardFooter.displayName = \"CardFooter\";\r\n","import React, { useState, useRef } from \"react\";\r\nimport { Copy, Check } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type ColorPickerSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface ColorPickerProps {\r\n value: string;\r\n onChange: (v: string) => void;\r\n label?: string;\r\n presets?: string[];\r\n showInput?: boolean;\r\n showFormats?: boolean;\r\n size?: ColorPickerSize;\r\n}\r\n\r\n/* ─── Default Presets ────────────────────────────────────────────────────────── */\r\n\r\nconst DEFAULT_PRESETS = [\r\n \"#ef4444\", \"#f97316\", \"#eab308\", \"#22c55e\", \"#06b6d4\", \"#3b82f6\", \"#8b5cf6\", \"#ec4899\",\r\n \"#991b1b\", \"#9a3412\", \"#854d0e\", \"#166534\", \"#155e75\", \"#1e40af\", \"#5b21b6\", \"#9d174d\",\r\n \"#fca5a5\", \"#fdba74\", \"#fde047\", \"#86efac\", \"#67e8f9\", \"#93c5fd\", \"#c4b5fd\", \"#f9a8d4\",\r\n];\r\n\r\n/* ─── Helpers ────────────────────────────────────────────────────────────────── */\r\n\r\nfunction hexToRgb(hex: string): string {\r\n const r = parseInt(hex.slice(1, 3), 16);\r\n const g = parseInt(hex.slice(3, 5), 16);\r\n const b = parseInt(hex.slice(5, 7), 16);\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\nfunction hexToHsl(hex: string): string {\r\n const r = parseInt(hex.slice(1, 3), 16) / 255;\r\n const g = parseInt(hex.slice(3, 5), 16) / 255;\r\n const b = parseInt(hex.slice(5, 7), 16) / 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n const l = (max + min) / 2;\r\n if (max === min) return `hsl(0, 0%, ${Math.round(l * 100)}%)`;\r\n const d = max - min;\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n let h = 0;\r\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\r\n else if (max === g) h = ((b - r) / d + 2) / 6;\r\n else h = ((r - g) / d + 4) / 6;\r\n return `hsl(${Math.round(h * 360)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst mono: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function ColorPicker({\r\n value,\r\n onChange,\r\n label,\r\n presets,\r\n showInput = true,\r\n showFormats,\r\n size = \"md\",\r\n}: ColorPickerProps) {\r\n const [copied, setCopied] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const swatchSize =\r\n size === \"sm\" ? \"w-5 h-5\" : size === \"lg\" ? \"w-8 h-8\" : \"w-6 h-6\";\r\n const displayPresets = presets || DEFAULT_PRESETS;\r\n\r\n const copy = (text: string) => {\r\n navigator.clipboard.writeText(text).then(() => {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative\">\r\n <div\r\n className=\"w-10 h-10 rounded-[var(--radius-md)] border border-border cursor-pointer overflow-hidden\"\r\n style={{ backgroundColor: value }}\r\n onClick={() => inputRef.current?.click()}\r\n />\r\n <input\r\n ref={inputRef}\r\n type=\"color\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full\"\r\n />\r\n </div>\r\n\r\n {showInput && (\r\n <div className=\"flex items-center gap-1.5\">\r\n <input\r\n value={value}\r\n onChange={(e) => {\r\n if (\r\n /^#[0-9a-fA-F]{0,6}$/.test(e.target.value) ||\r\n e.target.value === \"#\"\r\n )\r\n onChange(e.target.value);\r\n }}\r\n className=\"w-24 px-2.5 py-1.5 rounded-[var(--radius-md)] border border-border bg-background text-foreground outline-none focus:border-primary\"\r\n style={mono}\r\n maxLength={7}\r\n />\r\n <button\r\n onClick={() => copy(value)}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-accent transition-colors cursor-pointer\"\r\n >\r\n {copied ? (\r\n <Check size={14} className=\"text-chart-2\" />\r\n ) : (\r\n <Copy size={14} />\r\n )}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {displayPresets.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {displayPresets.map((c) => (\r\n <button\r\n key={c}\r\n onClick={() => onChange(c)}\r\n className={`${swatchSize} rounded-[var(--radius-sm)] border-2 transition-transform hover:scale-110 cursor-pointer\r\n ${value === c ? \"border-foreground ring-1 ring-foreground/20\" : \"border-transparent\"}`}\r\n style={{ backgroundColor: c }}\r\n title={c}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {showFormats && (\r\n <div className=\"space-y-1\">\r\n {[\r\n { label: \"HEX\", val: value.toUpperCase() },\r\n { label: \"RGB\", val: hexToRgb(value) },\r\n { label: \"HSL\", val: hexToHsl(value) },\r\n ].map((f) => (\r\n <div key={f.label} className=\"flex items-center gap-2\">\r\n <span className=\"w-8 text-muted-foreground\" style={smallLabel}>\r\n {f.label}\r\n </span>\r\n <code className=\"text-foreground\" style={mono}>\r\n {f.val}\r\n </code>\r\n <button\r\n onClick={() => copy(f.val)}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <Copy size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type DividerSpacing = \"sm\" | \"md\" | \"lg\";\r\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\r\n\r\nexport interface DividerProps {\r\n label?: string;\r\n orientation?: DividerOrientation;\r\n dashed?: boolean;\r\n spacing?: DividerSpacing;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Divider ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Divider({\r\n label,\r\n orientation = \"horizontal\",\r\n dashed,\r\n spacing = \"md\",\r\n className = \"\",\r\n}: DividerProps) {\r\n const spacings = { sm: \"my-2\", md: \"my-4\", lg: \"my-8\" };\r\n const style = dashed ? \"border-dashed\" : \"border-solid\";\r\n\r\n if (orientation === \"vertical\") {\r\n return (\r\n <div\r\n className={`inline-block h-full min-h-[24px] border-l border-border ${style} mx-3 ${className}`}\r\n />\r\n );\r\n }\r\n\r\n if (label) {\r\n return (\r\n <div className={`flex items-center gap-3 ${spacings[spacing]} ${className}`}>\r\n <div className={`flex-1 border-t border-border ${style}`} />\r\n <span className=\"text-muted-foreground flex-shrink-0\" style={smallLabel}>\r\n {label}\r\n </span>\r\n <div className={`flex-1 border-t border-border ${style}`} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <hr className={`border-t border-border ${style} ${spacings[spacing]} ${className}`} />\r\n );\r\n}\r\n\r\nDivider.displayName = \"Divider\";\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type DrawerSide = \"left\" | \"right\" | \"top\" | \"bottom\";\r\nexport type DrawerSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface DrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n children: React.ReactNode;\r\n side?: DrawerSide;\r\n size?: DrawerSize;\r\n footer?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n// ─── Drawer ──────────────────────────────────────────────────────────────────\r\n\r\nexport function Drawer({\r\n open,\r\n onClose,\r\n title,\r\n children,\r\n side = \"right\",\r\n size = \"md\",\r\n footer,\r\n className = \"\",\r\n}: DrawerProps) {\r\n if (!open) return null;\r\n\r\n const widths = { sm: \"w-72\", md: \"w-96\", lg: \"w-[480px]\" };\r\n const heights = { sm: \"h-48\", md: \"h-72\", lg: \"h-96\" };\r\n const sideClasses: Record<DrawerSide, string> = {\r\n right: `top-0 right-0 h-full ${widths[size]} animate-[slideRight_0.2s_ease]`,\r\n left: `top-0 left-0 h-full ${widths[size]} animate-[slideLeft_0.2s_ease]`,\r\n top: `top-0 left-0 w-full ${heights[size]} animate-[slideTop_0.2s_ease]`,\r\n bottom: `bottom-0 left-0 w-full ${heights[size]} animate-[slideBottom_0.2s_ease]`,\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50\">\r\n <div className=\"absolute inset-0 bg-foreground/20\" onClick={onClose} />\r\n <div\r\n className={`absolute bg-card border border-border shadow-lg flex flex-col ${sideClasses[side]} ${className}`}\r\n >\r\n {title && (\r\n <div className=\"px-5 py-4 border-b border-border flex items-center justify-between flex-shrink-0\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <button\r\n onClick={onClose}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n )}\r\n <div className=\"flex-1 overflow-y-auto p-5\">{children}</div>\r\n {footer && (\r\n <div className=\"px-5 py-3 border-t border-border flex items-center gap-2 flex-shrink-0\">\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n <style>{`\r\n @keyframes slideRight { from { transform: translateX(100%); } to { transform: translateX(0); } }\r\n @keyframes slideLeft { from { transform: translateX(-100%); } to { transform: translateX(0); } }\r\n @keyframes slideTop { from { transform: translateY(-100%); } to { transform: translateY(0); } }\r\n @keyframes slideBottom { from { transform: translateY(100%); } to { transform: translateY(0); } }\r\n `}</style>\r\n </div>\r\n );\r\n}\r\n\r\nDrawer.displayName = \"Drawer\";\r\n","import React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n forwardRef,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport {\r\n ChevronDown,\r\n Check,\r\n Search,\r\n X,\r\n Loader2,\r\n AlertCircle,\r\n Plus,\r\n Inbox,\r\n} from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n avatar?: string;\r\n description?: string;\r\n group?: string;\r\n}\r\n\r\nexport type DropdownSize = \"sm\" | \"md\" | \"lg\";\r\nexport type DropdownVariant = \"default\" | \"outlined\" | \"filled\" | \"ghost\";\r\nexport type DropdownState = \"default\" | \"error\" | \"success\" | \"warning\";\r\n\r\nexport interface DropdownProps {\r\n options: DropdownOption[];\r\n value?: string | string[];\r\n defaultValue?: string | string[];\r\n onChange?: (value: string | string[]) => void;\r\n placeholder?: string;\r\n label?: string;\r\n helperText?: string;\r\n errorMessage?: string;\r\n successMessage?: string;\r\n size?: DropdownSize;\r\n variant?: DropdownVariant;\r\n state?: DropdownState;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n searchable?: boolean;\r\n clearable?: boolean;\r\n multiple?: boolean;\r\n maxSelections?: number;\r\n grouped?: boolean;\r\n required?: boolean;\r\n id?: string;\r\n className?: string;\r\n showSelectAll?: boolean;\r\n tagLimit?: number;\r\n creatable?: boolean;\r\n onCreateOption?: (label: string) => void;\r\n createLabel?: string;\r\n emptyState?: React.ReactNode;\r\n footer?: React.ReactNode;\r\n onSearch?: (query: string) => void;\r\n searchDebounce?: number;\r\n searchLoading?: boolean;\r\n renderOption?: (option: DropdownOption, isSelected: boolean) => React.ReactNode;\r\n}\r\n\r\n/* ─── Size Config ────────────────────────────────────────────────────────────── */\r\n\r\nconst sizeConfig: Record<\r\n DropdownSize,\r\n {\r\n trigger: string;\r\n option: string;\r\n optionStyle: React.CSSProperties;\r\n textStyle: React.CSSProperties;\r\n descStyle: React.CSSProperties;\r\n icon: number;\r\n avatarSize: number;\r\n }\r\n> = {\r\n sm: {\r\n trigger: \"h-9 px-[var(--Spacing--Spacing-xl)] gap-[var(--Spacing--Spacing-sm)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-sm) var(--Spacing--Spacing-xl)\" },\r\n textStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n icon: 14,\r\n avatarSize: 20,\r\n },\r\n md: {\r\n trigger: \"h-11 px-[var(--Spacing--Spacing-2xl)] gap-[var(--Spacing--Spacing-lg)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-md) var(--Spacing--Spacing-2xl)\" },\r\n textStyle: { fontFamily: \"var(--font-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n icon: 16,\r\n avatarSize: 24,\r\n },\r\n lg: {\r\n trigger: \"h-13 px-[var(--Spacing--Spacing-3xl)] gap-[var(--Spacing--Spacing-xl)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-lg) var(--Spacing--Spacing-3xl)\" },\r\n textStyle: { fontFamily: \"var(--font-p)\", fontSize: \"var(--text-p)\", fontWeight: \"var(--weight-p)\" },\r\n descStyle: { fontFamily: \"var(--font-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" },\r\n icon: 18,\r\n avatarSize: 28,\r\n },\r\n};\r\n\r\nconst variantStyles: Record<DropdownVariant, { 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 stateStyles: Record<DropdownState, 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\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\r\n (\r\n {\r\n options,\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n placeholder = \"Select an option\\u2026\",\r\n label,\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 loading = false,\r\n searchable = false,\r\n clearable = false,\r\n multiple = false,\r\n maxSelections,\r\n grouped = false,\r\n required = false,\r\n id,\r\n className = \"\",\r\n showSelectAll = false,\r\n tagLimit,\r\n creatable = false,\r\n onCreateOption,\r\n createLabel = 'Create \"{query}\"',\r\n emptyState,\r\n footer,\r\n onSearch,\r\n searchDebounce = 300,\r\n searchLoading = false,\r\n renderOption: customRenderOption,\r\n },\r\n ref\r\n ) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\r\n const [internalValue, setInternalValue] = useState<string | string[]>(\r\n defaultValue ?? (multiple ? [] : \"\")\r\n );\r\n\r\n const value = controlledValue ?? internalValue;\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const listRef = useRef<HTMLDivElement>(null);\r\n const searchRef = useRef<HTMLInputElement>(null);\r\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const [panelPos, setPanelPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 });\r\n\r\n const sc = sizeConfig[size];\r\n const vs = variantStyles[variant];\r\n\r\n useEffect(() => {\r\n if (!isOpen || !triggerRef.current) return;\r\n const updatePos = () => {\r\n const rect = triggerRef.current!.getBoundingClientRect();\r\n setPanelPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\r\n };\r\n updatePos();\r\n window.addEventListener(\"scroll\", updatePos, true);\r\n window.addEventListener(\"resize\", updatePos);\r\n return () => {\r\n window.removeEventListener(\"scroll\", updatePos, true);\r\n window.removeEventListener(\"resize\", updatePos);\r\n };\r\n }, [isOpen]);\r\n\r\n const handleSearchChange = useCallback(\r\n (query: string) => {\r\n setSearch(query);\r\n if (onSearch) {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n onSearch(query);\r\n }, searchDebounce);\r\n }\r\n },\r\n [onSearch, searchDebounce]\r\n );\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n };\r\n }, []);\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!search || onSearch) return options;\r\n return options.filter(\r\n (o) =>\r\n o.label.toLowerCase().includes(search.toLowerCase()) ||\r\n o.description?.toLowerCase().includes(search.toLowerCase())\r\n );\r\n }, [options, search, onSearch]);\r\n\r\n const groupedOptions = useMemo(() => {\r\n if (!grouped) return null;\r\n const groups: Record<string, DropdownOption[]> = {};\r\n filteredOptions.forEach((o) => {\r\n const g = o.group || \"Other\";\r\n if (!groups[g]) groups[g] = [];\r\n groups[g].push(o);\r\n });\r\n return groups;\r\n }, [filteredOptions, grouped]);\r\n\r\n const selectedLabels = useMemo(() => {\r\n if (multiple && Array.isArray(value)) {\r\n return value\r\n .map((v) => options.find((o) => o.value === v)?.label)\r\n .filter(Boolean) as string[];\r\n }\r\n return options.find((o) => o.value === value)?.label\r\n ? [options.find((o) => o.value === value)!.label]\r\n : [];\r\n }, [value, options, multiple]);\r\n\r\n const isSelected = useCallback(\r\n (optValue: string) => {\r\n if (multiple && Array.isArray(value)) return value.includes(optValue);\r\n return value === optValue;\r\n },\r\n [value, multiple]\r\n );\r\n\r\n const handleSelect = useCallback(\r\n (optValue: string) => {\r\n if (multiple) {\r\n const arr = Array.isArray(value) ? [...value] : [];\r\n const idx = arr.indexOf(optValue);\r\n if (idx > -1) {\r\n arr.splice(idx, 1);\r\n } else {\r\n if (maxSelections && arr.length >= maxSelections) return;\r\n arr.push(optValue);\r\n }\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n } else {\r\n setInternalValue(optValue);\r\n onChange?.(optValue);\r\n setIsOpen(false);\r\n }\r\n setSearch(\"\");\r\n },\r\n [value, multiple, maxSelections, onChange]\r\n );\r\n\r\n const allSelectableValues = useMemo(\r\n () => filteredOptions.filter((o) => !o.disabled).map((o) => o.value),\r\n [filteredOptions]\r\n );\r\n\r\n const allSelected = useMemo(() => {\r\n if (!multiple || !Array.isArray(value)) return false;\r\n return allSelectableValues.length > 0 && allSelectableValues.every((v) => value.includes(v));\r\n }, [multiple, value, allSelectableValues]);\r\n\r\n const someSelected = useMemo(() => {\r\n if (!multiple || !Array.isArray(value)) return false;\r\n return allSelectableValues.some((v) => value.includes(v)) && !allSelected;\r\n }, [multiple, value, allSelectableValues, allSelected]);\r\n\r\n const handleSelectAll = useCallback(() => {\r\n if (!multiple) return;\r\n if (allSelected) {\r\n const arr = Array.isArray(value) ? value.filter((v) => !allSelectableValues.includes(v)) : [];\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n } else {\r\n const arr = Array.isArray(value) ? [...value] : [];\r\n for (const v of allSelectableValues) {\r\n if (!arr.includes(v)) {\r\n if (maxSelections && arr.length >= maxSelections) break;\r\n arr.push(v);\r\n }\r\n }\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n }\r\n }, [multiple, allSelected, value, allSelectableValues, maxSelections, onChange]);\r\n\r\n const handleCreate = useCallback(() => {\r\n if (!search.trim()) return;\r\n onCreateOption?.(search.trim());\r\n setSearch(\"\");\r\n }, [search, onCreateOption]);\r\n\r\n const showCreateOption = useMemo(() => {\r\n if (!creatable || !search.trim()) return false;\r\n return !options.some((o) => o.label.toLowerCase() === search.toLowerCase());\r\n }, [creatable, search, options]);\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n const empty = multiple ? [] : \"\";\r\n setInternalValue(empty);\r\n onChange?.(empty);\r\n },\r\n [multiple, onChange]\r\n );\r\n\r\n const flatOptions = grouped\r\n ? Object.values(groupedOptions || {}).flat()\r\n : filteredOptions;\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled || loading) return;\r\n switch (e.key) {\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n if (!isOpen) {\r\n setIsOpen(true);\r\n } else {\r\n setHighlightedIndex((i) =>\r\n i < flatOptions.length - 1 ? i + 1 : 0\r\n );\r\n }\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n setHighlightedIndex((i) =>\r\n i > 0 ? i - 1 : flatOptions.length - 1\r\n );\r\n break;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n if (isOpen && highlightedIndex >= 0) {\r\n const opt = flatOptions[highlightedIndex];\r\n if (opt && !opt.disabled) handleSelect(opt.value);\r\n } else {\r\n setIsOpen(true);\r\n }\r\n break;\r\n case \"Escape\":\r\n setIsOpen(false);\r\n triggerRef.current?.focus();\r\n break;\r\n }\r\n },\r\n [disabled, loading, isOpen, highlightedIndex, flatOptions, handleSelect]\r\n );\r\n\r\n useEffect(() => {\r\n const handler = (e: MouseEvent) => {\r\n const target = e.target as Node;\r\n if (\r\n triggerRef.current &&\r\n !triggerRef.current.contains(target) &&\r\n listRef.current &&\r\n !listRef.current.contains(target)\r\n ) {\r\n setIsOpen(false);\r\n setSearch(\"\");\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isOpen && searchable) {\r\n setTimeout(() => searchRef.current?.focus(), 50);\r\n }\r\n if (isOpen) setHighlightedIndex(-1);\r\n }, [isOpen, searchable]);\r\n\r\n const hasValue = multiple\r\n ? Array.isArray(value) && value.length > 0\r\n : !!value;\r\n\r\n const computedState = errorMessage ? \"error\" : state;\r\n\r\n const renderTags = () => {\r\n const labels = selectedLabels;\r\n const limit = tagLimit && tagLimit > 0 ? tagLimit : labels.length;\r\n const visible = labels.slice(0, limit);\r\n const remaining = labels.length - visible.length;\r\n\r\n return (\r\n <span className=\"flex flex-wrap gap-1\">\r\n {visible.map((l) => (\r\n <span\r\n key={l}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-sm)] bg-[var(--Colors--Background--bg-brand-secondary)] text-[var(--Colors--Text--text-brand-primary)]\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {l}\r\n <X\r\n size={10}\r\n className=\"cursor-pointer hover:text-destructive transition-colors\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n const opt = options.find((o) => o.label === l);\r\n if (opt) handleSelect(opt.value);\r\n }}\r\n />\r\n </span>\r\n ))}\r\n {remaining > 0 && (\r\n <span\r\n className=\"inline-flex items-center px-2 py-0.5 rounded-[var(--radius-sm)] bg-muted text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n +{remaining} more\r\n </span>\r\n )}\r\n </span>\r\n );\r\n };\r\n\r\n const renderOptionNode = (opt: DropdownOption, idx: number) => {\r\n const selected = isSelected(opt.value);\r\n\r\n if (customRenderOption) {\r\n return (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={selected}\r\n disabled={opt.disabled}\r\n className={`w-full ${sc.option} transition-colors cursor-pointer\r\n ${selected ? \"bg-[var(--Colors--Background--bg-brand-secondary)]\" : \"\"}\r\n ${highlightedIndex === idx && !selected ? \"bg-[var(--Colors--Background--bg-primary_hover)]\" : \"\"}\r\n ${opt.disabled ? \"opacity-40 cursor-not-allowed\" : \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\"}\r\n `}\r\n style={sc.optionStyle}\r\n onClick={() => !opt.disabled && handleSelect(opt.value)}\r\n onMouseEnter={() => setHighlightedIndex(idx)}\r\n >\r\n {customRenderOption(opt, selected)}\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={selected}\r\n disabled={opt.disabled}\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} transition-colors cursor-pointer\r\n ${selected ? \"bg-[var(--Colors--Background--bg-brand-secondary)] text-[var(--Colors--Text--text-brand-primary)]\" : \"\"}\r\n ${highlightedIndex === idx && !selected ? \"bg-[var(--Colors--Background--bg-primary_hover)]\" : \"\"}\r\n ${opt.disabled ? \"opacity-40 cursor-not-allowed\" : \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\"}\r\n `}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={() => !opt.disabled && handleSelect(opt.value)}\r\n onMouseEnter={() => setHighlightedIndex(idx)}\r\n >\r\n {multiple && (\r\n <span\r\n className={`flex-shrink-0 w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center transition-colors\r\n ${selected ? \"bg-primary border-primary\" : \"border-border\"}\r\n `}\r\n >\r\n {selected && <Check size={10} className=\"text-primary-foreground\" />}\r\n </span>\r\n )}\r\n {opt.avatar && (\r\n <img\r\n src={opt.avatar}\r\n alt=\"\"\r\n className=\"flex-shrink-0 rounded-full object-cover\"\r\n style={{ width: sc.avatarSize, height: sc.avatarSize }}\r\n />\r\n )}\r\n {opt.icon && <span className=\"flex-shrink-0\">{opt.icon}</span>}\r\n <span className=\"flex-1 text-left\">\r\n <span className=\"block\">{opt.label}</span>\r\n {opt.description && (\r\n <span\r\n className=\"block text-muted-foreground\"\r\n style={{ marginTop: \"var(--Spacing--Spacing-xxs)\", ...sc.descStyle }}\r\n >\r\n {opt.description}\r\n </span>\r\n )}\r\n </span>\r\n {!multiple && selected && (\r\n <Check size={sc.icon} className=\"text-primary flex-shrink-0\" />\r\n )}\r\n </button>\r\n );\r\n };\r\n\r\n let globalIdx = 0;\r\n\r\n return (\r\n <div ref={ref} className={`relative w-full ${className}`} id={id}>\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 <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n role=\"combobox\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n disabled={disabled || loading}\r\n onClick={() => !disabled && !loading && setIsOpen(!isOpen)}\r\n onKeyDown={handleKeyDown}\r\n className={`w-full flex items-center rounded-[var(--radius-md)] transition-all duration-150 ${sc.trigger}\r\n ${vs.base}\r\n ${!disabled && !loading ? vs.hover : \"\"}\r\n ${isOpen ? vs.focus : \"\"}\r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}\r\n ${loading ? \"opacity-70 cursor-wait\" : \"\"}\r\n ${stateStyles[computedState]}\r\n `}\r\n style={sc.textStyle}\r\n >\r\n {loading ? <Loader2 size={sc.icon} className=\"animate-spin text-muted-foreground\" /> : null}\r\n\r\n <span className={`flex-1 text-left truncate ${!hasValue ? \"text-muted-foreground\" : \"text-foreground\"}`}>\r\n {hasValue ? (multiple ? renderTags() : selectedLabels[0]) : placeholder}\r\n </span>\r\n\r\n {clearable && hasValue && !disabled && (\r\n <X\r\n size={sc.icon}\r\n className=\"flex-shrink-0 text-muted-foreground hover:text-foreground cursor-pointer transition-colors\"\r\n onClick={handleClear}\r\n />\r\n )}\r\n\r\n <ChevronDown\r\n size={sc.icon}\r\n className={`flex-shrink-0 text-muted-foreground transition-transform duration-200 ${isOpen ? \"rotate-180\" : \"\"}`}\r\n />\r\n </button>\r\n\r\n {isOpen &&\r\n createPortal(\r\n <div\r\n ref={listRef}\r\n role=\"listbox\"\r\n className=\"fixed z-[9999] bg-popover border border-border rounded-[var(--radius)] shadow-elevation-sm overflow-hidden\"\r\n style={{ top: panelPos.top, left: panelPos.left, width: panelPos.width || \"auto\" }}\r\n >\r\n {searchable && (\r\n <div className=\"p-2 border-b border-border\">\r\n <div className=\"relative\">\r\n <Search size={14} className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\r\n <input\r\n ref={searchRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n placeholder=\"Search\\u2026\"\r\n className=\"w-full pl-8 pr-3 py-1.5 bg-background border border-border rounded-[var(--radius-sm)] outline-none placeholder:text-muted-foreground focus:border-ring focus:ring-1 focus:ring-ring/20 transition-colors\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n onKeyDown={handleKeyDown}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {multiple && showSelectAll && filteredOptions.length > 0 && (\r\n <button\r\n type=\"button\"\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} border-b border-border transition-colors hover:bg-[var(--Colors--Background--bg-primary_hover)] cursor-pointer`}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={handleSelectAll}\r\n >\r\n <span\r\n className={`flex-shrink-0 w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center transition-colors\r\n ${allSelected ? \"bg-primary border-primary\" : someSelected ? \"bg-primary/50 border-primary\" : \"border-border\"}\r\n `}\r\n >\r\n {allSelected && <Check size={10} className=\"text-primary-foreground\" />}\r\n {someSelected && !allSelected && <span className=\"w-2 h-0.5 bg-primary-foreground rounded-full\" />}\r\n </span>\r\n <span className=\"text-foreground\">{allSelected ? \"Deselect All\" : \"Select All\"}</span>\r\n <span\r\n className=\"ml-auto text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {Array.isArray(value) ? value.length : 0}/{filteredOptions.filter((o) => !o.disabled).length}\r\n </span>\r\n </button>\r\n )}\r\n\r\n <div className=\"max-h-60 overflow-y-auto p-1\">\r\n {searchLoading ? (\r\n <div className=\"flex items-center justify-center py-6 gap-2 text-muted-foreground\">\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n <span style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\" }}>Searching\\u2026</span>\r\n </div>\r\n ) : filteredOptions.length === 0 && !showCreateOption ? (\r\n emptyState ? (\r\n <div className=\"py-4 px-3\">{emptyState}</div>\r\n ) : (\r\n <div className=\"text-center py-6 text-muted-foreground flex flex-col items-center gap-2\">\r\n <Inbox size={24} className=\"opacity-40\" />\r\n <span style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\" }}>No options found</span>\r\n </div>\r\n )\r\n ) : grouped && groupedOptions ? (\r\n Object.entries(groupedOptions).map(([group, opts]) => (\r\n <div key={group}>\r\n <div\r\n className=\"px-3 py-1.5 uppercase tracking-wider text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" }}\r\n >\r\n {group}\r\n </div>\r\n {opts.map((opt) => {\r\n const node = renderOptionNode(opt, globalIdx);\r\n globalIdx++;\r\n return node;\r\n })}\r\n </div>\r\n ))\r\n ) : (\r\n filteredOptions.map((opt, i) => renderOptionNode(opt, i))\r\n )}\r\n\r\n {showCreateOption && (\r\n <button\r\n type=\"button\"\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} text-primary transition-colors hover:bg-[var(--Colors--Background--bg-primary_hover)] cursor-pointer`}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={handleCreate}\r\n >\r\n <Plus size={sc.icon} className=\"flex-shrink-0\" />\r\n <span>{createLabel.replace(\"{query}\", search.trim())}</span>\r\n </button>\r\n )}\r\n </div>\r\n\r\n {(footer || (multiple && maxSelections)) && (\r\n <div className=\"border-t border-border\">\r\n {multiple && maxSelections && (\r\n <div\r\n className=\"px-3 py-2 text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {Array.isArray(value) ? value.length : 0} / {maxSelections} selected\r\n </div>\r\n )}\r\n {footer && <div className=\"px-3 py-2\">{footer}</div>}\r\n </div>\r\n )}\r\n </div>,\r\n document.body\r\n )}\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 <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={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\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\nDropdown.displayName = \"Dropdown\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type EmptyStateSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface EmptyStateAction {\r\n label: string;\r\n onClick: () => void;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport interface EmptyStateProps {\r\n icon?: React.ReactNode;\r\n title: string;\r\n description?: string;\r\n action?: EmptyStateAction;\r\n secondaryAction?: { label: string; onClick: () => void };\r\n size?: EmptyStateSize;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function EmptyState({\r\n icon,\r\n title,\r\n description,\r\n action,\r\n secondaryAction,\r\n size = \"md\",\r\n}: EmptyStateProps) {\r\n const iconSize =\r\n size === \"sm\" ? \"w-10 h-10\" : size === \"lg\" ? \"w-16 h-16\" : \"w-12 h-12\";\r\n const pad =\r\n size === \"sm\"\r\n ? \"py-6 px-4\"\r\n : size === \"lg\"\r\n ? \"py-14 px-8\"\r\n : \"py-10 px-6\";\r\n\r\n return (\r\n <div className={`flex flex-col items-center text-center ${pad}`}>\r\n {icon && (\r\n <div\r\n className={`${iconSize} rounded-full bg-muted flex items-center justify-center mb-4`}\r\n >\r\n <span className=\"text-muted-foreground\">{icon}</span>\r\n </div>\r\n )}\r\n <h4 className=\"text-foreground\">{title}</h4>\r\n {description && (\r\n <p\r\n className=\"text-muted-foreground mt-1.5 max-w-sm\"\r\n style={fontLabel}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n {(action || secondaryAction) && (\r\n <div className=\"flex items-center gap-3 mt-5\">\r\n {action && (\r\n <button\r\n onClick={action.onClick}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] bg-primary text-primary-foreground hover:bg-primary/90 transition-colors cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {action.icon}\r\n {action.label}\r\n </button>\r\n )}\r\n {secondaryAction && (\r\n <button\r\n onClick={secondaryAction.onClick}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] border border-border text-foreground hover:bg-accent transition-colors cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {secondaryAction.label}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef } from \"react\";\r\nimport { Upload, X, FileText, Image, Film, File, CheckCircle2 } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type FileUploadVariant = \"dropzone\" | \"button\" | \"avatar\";\r\n\r\nexport interface UploadedFile {\r\n id: string;\r\n name: string;\r\n size: number;\r\n type: string;\r\n progress: number;\r\n status: \"uploading\" | \"done\" | \"error\";\r\n}\r\n\r\nexport interface FileUploadProps {\r\n accept?: string;\r\n maxSize?: number;\r\n multiple?: boolean;\r\n disabled?: boolean;\r\n variant?: FileUploadVariant;\r\n label?: string;\r\n description?: string;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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/* ─── Helpers ────────────────────────────────────────────────────────────────── */\r\n\r\nfunction formatBytes(bytes: number) {\r\n if (bytes < 1024) return bytes + \" B\";\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\r\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\r\n}\r\n\r\nfunction getFileIcon(type: string) {\r\n if (type.startsWith(\"image/\")) return <Image size={16} className=\"text-chart-2\" />;\r\n if (type.startsWith(\"video/\")) return <Film size={16} className=\"text-chart-5\" />;\r\n if (type.includes(\"pdf\") || type.includes(\"document\"))\r\n return <FileText size={16} className=\"text-destructive\" />;\r\n return <File size={16} className=\"text-muted-foreground\" />;\r\n}\r\n\r\n/* ─── Sub-component: FileList ────────────────────────────────────────────────── */\r\n\r\nfunction FileList({\r\n files,\r\n onRemove,\r\n}: {\r\n files: UploadedFile[];\r\n onRemove: (id: string) => void;\r\n}) {\r\n return (\r\n <div className=\"space-y-2\">\r\n {files.map((f) => (\r\n <div\r\n key={f.id}\r\n className=\"flex items-center gap-3 px-3 py-2 rounded-[var(--radius-md)] border border-border bg-card\"\r\n >\r\n {getFileIcon(f.type)}\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-foreground truncate\" style={fontLabel}>\r\n {f.name}\r\n </p>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {formatBytes(f.size)}\r\n </span>\r\n {f.status === \"uploading\" && (\r\n <div className=\"flex-1 h-1 bg-muted rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary rounded-full transition-all\"\r\n style={{ width: `${f.progress}%` }}\r\n />\r\n </div>\r\n )}\r\n {f.status === \"done\" && (\r\n <CheckCircle2 size={12} className=\"text-chart-2\" />\r\n )}\r\n </div>\r\n </div>\r\n <button\r\n onClick={() => onRemove(f.id)}\r\n className=\"text-muted-foreground hover:text-destructive cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function FileUpload({\r\n accept,\r\n maxSize,\r\n multiple,\r\n disabled,\r\n variant = \"dropzone\",\r\n label,\r\n description,\r\n}: FileUploadProps) {\r\n const [files, setFiles] = useState<UploadedFile[]>([]);\r\n const [dragOver, setDragOver] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n const addFiles = (fileList: FileList | null) => {\r\n if (!fileList) return;\r\n const newFiles: UploadedFile[] = Array.from(fileList).map((f) => ({\r\n id: Math.random().toString(36).slice(2),\r\n name: f.name,\r\n size: f.size,\r\n type: f.type,\r\n progress: 0,\r\n status: \"uploading\" as const,\r\n }));\r\n setFiles((prev) => [...prev, ...newFiles]);\r\n newFiles.forEach((f) => {\r\n let prog = 0;\r\n const iv = setInterval(() => {\r\n prog += Math.random() * 30 + 10;\r\n if (prog >= 100) {\r\n prog = 100;\r\n clearInterval(iv);\r\n }\r\n setFiles((prev) =>\r\n prev.map((p) =>\r\n p.id === f.id\r\n ? {\r\n ...p,\r\n progress: Math.min(prog, 100),\r\n status: prog >= 100 ? \"done\" : \"uploading\",\r\n }\r\n : p\r\n )\r\n );\r\n }, 300);\r\n });\r\n };\r\n\r\n const remove = (id: string) =>\r\n setFiles((prev) => prev.filter((f) => f.id !== id));\r\n\r\n if (variant === \"button\") {\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <button\r\n onClick={() => inputRef.current?.click()}\r\n disabled={disabled}\r\n className={`inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] border border-border bg-background text-foreground hover:bg-accent transition-colors cursor-pointer ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n <Upload size={14} /> Choose File{multiple ? \"s\" : \"\"}\r\n </button>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n {files.length > 0 && <FileList files={files} onRemove={remove} />}\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"avatar\") {\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n className={`w-24 h-24 rounded-full border-2 border-dashed flex items-center justify-center cursor-pointer transition-colors\r\n ${disabled ? \"opacity-50 pointer-events-none\" : \"\"} ${\r\n dragOver\r\n ? \"border-primary bg-primary/5\"\r\n : \"border-border hover:border-primary/40\"\r\n }`}\r\n >\r\n {files.length > 0 &&\r\n files[files.length - 1].status === \"done\" ? (\r\n <CheckCircle2 size={24} className=\"text-chart-2\" />\r\n ) : (\r\n <Upload size={20} className=\"text-muted-foreground\" />\r\n )}\r\n </div>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept || \"image/*\"}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n setDragOver(true);\r\n }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={(e) => {\r\n e.preventDefault();\r\n setDragOver(false);\r\n addFiles(e.dataTransfer.files);\r\n }}\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n className={`relative flex flex-col items-center justify-center gap-2 px-6 py-10 rounded-[var(--radius-lg)] border-2 border-dashed transition-all cursor-pointer\r\n ${disabled ? \"opacity-50 pointer-events-none\" : \"\"}\r\n ${\r\n dragOver\r\n ? \"border-primary bg-primary/5\"\r\n : \"border-border hover:border-primary/40 hover:bg-accent/30\"\r\n }`}\r\n >\r\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center\">\r\n <Upload size={20} className=\"text-primary\" />\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-foreground\" style={fontLabelBold}>\r\n <span className=\"text-primary\">Click to upload</span> or drag and\r\n drop\r\n </p>\r\n <p className=\"text-muted-foreground\" style={smallLabel}>\r\n {description || (accept ? `Accepted: ${accept}` : \"Any file type\")}\r\n {maxSize && ` \\u00B7 Max ${formatBytes(maxSize)}`}\r\n </p>\r\n </div>\r\n </div>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n {files.length > 0 && <FileList files={files} onRemove={remove} />}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { X, ZoomIn, ZoomOut, RotateCw, ChevronLeft, ChevronRight } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface ImagePreviewItem {\r\n src: string;\r\n alt: string;\r\n thumbnail?: string;\r\n}\r\n\r\nexport interface ImagePreviewProps {\r\n images: ImagePreviewItem[];\r\n initialIndex?: number;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function ImagePreview({ images, initialIndex = 0 }: ImagePreviewProps) {\r\n const [open, setOpen] = useState(false);\r\n const [idx, setIdx] = useState(initialIndex);\r\n const [zoom, setZoom] = useState(1);\r\n const [rotation, setRotation] = useState(0);\r\n\r\n const current = images[idx];\r\n const prev = () => {\r\n setIdx((i) => (i - 1 + images.length) % images.length);\r\n setZoom(1);\r\n setRotation(0);\r\n };\r\n const next = () => {\r\n setIdx((i) => (i + 1) % images.length);\r\n setZoom(1);\r\n setRotation(0);\r\n };\r\n const zoomIn = () => setZoom((z) => Math.min(z + 0.25, 3));\r\n const zoomOut = () => setZoom((z) => Math.max(z - 0.25, 0.5));\r\n const rotate = () => setRotation((r) => (r + 90) % 360);\r\n\r\n return (\r\n <div>\r\n {/* Thumbnails */}\r\n <div className=\"flex flex-wrap gap-2\">\r\n {images.map((img, i) => (\r\n <button\r\n key={i}\r\n onClick={() => {\r\n setIdx(i);\r\n setOpen(true);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className={`rounded-[var(--radius-md)] overflow-hidden border-2 transition-all cursor-pointer hover:opacity-80\r\n ${idx === i && open ? \"border-primary\" : \"border-border\"}`}\r\n >\r\n <div className=\"w-20 h-20 bg-muted flex items-center justify-center overflow-hidden\">\r\n <img\r\n src={img.thumbnail || img.src}\r\n alt={img.alt}\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Lightbox */}\r\n {open && (\r\n <div className=\"fixed inset-0 z-[60] bg-foreground/80 flex flex-col\">\r\n {/* Toolbar */}\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-foreground/20\">\r\n <span className=\"text-white\" style={fontLabel}>\r\n {current.alt} ({idx + 1}/{images.length})\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={zoomOut}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <ZoomOut size={16} />\r\n </button>\r\n <span className=\"text-white/70 px-2\" style={btnStyle}>\r\n {Math.round(zoom * 100)}%\r\n </span>\r\n <button\r\n onClick={zoomIn}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <ZoomIn size={16} />\r\n </button>\r\n <button\r\n onClick={rotate}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <RotateCw size={16} />\r\n </button>\r\n <div className=\"w-px h-5 bg-white/20 mx-1\" />\r\n <button\r\n onClick={() => {\r\n setOpen(false);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <X size={16} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image area */}\r\n <div\r\n className=\"flex-1 flex items-center justify-center relative overflow-hidden\"\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) {\r\n setOpen(false);\r\n setZoom(1);\r\n setRotation(0);\r\n }\r\n }}\r\n >\r\n {images.length > 1 && (\r\n <button\r\n onClick={prev}\r\n className=\"absolute left-4 w-10 h-10 rounded-full bg-foreground/30 text-white flex items-center justify-center hover:bg-foreground/50 cursor-pointer z-10\"\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n )}\r\n <img\r\n src={current.src}\r\n alt={current.alt}\r\n className=\"max-w-[90%] max-h-[80vh] object-contain transition-transform\"\r\n style={{\r\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\r\n }}\r\n />\r\n {images.length > 1 && (\r\n <button\r\n onClick={next}\r\n className=\"absolute right-4 w-10 h-10 rounded-full bg-foreground/30 text-white flex items-center justify-center hover:bg-foreground/50 cursor-pointer z-10\"\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Bottom thumbnails */}\r\n {images.length > 1 && (\r\n <div className=\"flex items-center justify-center gap-2 py-3 bg-foreground/20\">\r\n {images.map((img, i) => (\r\n <button\r\n key={i}\r\n onClick={() => {\r\n setIdx(i);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className={`w-12 h-12 rounded-[var(--radius-sm)] overflow-hidden border-2 cursor-pointer transition-all\r\n ${i === idx ? \"border-white\" : \"border-transparent opacity-50 hover:opacity-80\"}`}\r\n >\r\n <img\r\n src={img.thumbnail || img.src}\r\n alt={img.alt}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { ChevronRight } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface MenuItem {\r\n /** Display text */\r\n text?: string;\r\n /** Leading icon */\r\n icon?: React.ReactNode;\r\n /** Keyboard shortcut label */\r\n shortcut?: string;\r\n /** Click handler */\r\n onClick?: () => void;\r\n /** Render as a divider line */\r\n divider?: boolean;\r\n /** Render as a group label */\r\n label?: string;\r\n /** Destructive (red) styling */\r\n destructive?: boolean;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Nested sub-menu items */\r\n children?: MenuItem[];\r\n}\r\n\r\nexport interface MenuProps {\r\n /** Menu item definitions */\r\n items: MenuItem[];\r\n /** Whether the menu is open */\r\n open: boolean;\r\n /** Close callback */\r\n onClose: () => void;\r\n /** Ref to the trigger element for positioning */\r\n triggerRef: React.RefObject<HTMLElement | null>;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst shortcutStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst labelStyle: 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// ─── SubMenu ─────────────────────────────────────────────────────────────────\r\n\r\nfunction SubMenu({ items, parentRect }: { items: MenuItem[]; parentRect: DOMRect }) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: parentRect.top, left: parentRect.right + 4 });\r\n\r\n useEffect(() => {\r\n if (!ref.current) return;\r\n const el = ref.current;\r\n const rect = el.getBoundingClientRect();\r\n let top = parentRect.top;\r\n let left = parentRect.right + 4;\r\n if (left + rect.width > window.innerWidth - 8) {\r\n left = parentRect.left - rect.width - 4;\r\n }\r\n if (top + rect.height > window.innerHeight - 8) {\r\n top = window.innerHeight - rect.height - 8;\r\n }\r\n setPos({ top, left });\r\n }, [parentRect]);\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className=\"fixed z-[9999] min-w-[200px] rounded-[var(--radius)] border border-border bg-popover shadow-md py-1\"\r\n style={{ top: pos.top, left: pos.left }}\r\n >\r\n {items.map((item, i) => (\r\n <MenuItemRow key={i} item={item} />\r\n ))}\r\n </div>,\r\n document.body\r\n );\r\n}\r\n\r\n// ─── MenuItemRow ─────────────────────────────────────────────────────────────\r\n\r\nfunction MenuItemRow({ item }: { item: MenuItem }) {\r\n const [subOpen, setSubOpen] = useState(false);\r\n const rowRef = useRef<HTMLDivElement>(null);\r\n const hoverTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n if (item.divider) return <div className=\"my-1 border-t border-border\" />;\r\n\r\n if (item.label) {\r\n return (\r\n <div className=\"px-3 py-1.5 text-muted-foreground uppercase tracking-wider\" style={labelStyle}>\r\n {item.label}\r\n </div>\r\n );\r\n }\r\n\r\n const hasChildren = item.children && item.children.length > 0;\r\n\r\n const handleMouseEnter = () => {\r\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current);\r\n if (hasChildren) setSubOpen(true);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n hoverTimeout.current = setTimeout(() => setSubOpen(false), 150);\r\n };\r\n\r\n return (\r\n <div ref={rowRef} className=\"relative\" onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\r\n <button\r\n onClick={() => { if (!hasChildren) item.onClick?.(); }}\r\n disabled={item.disabled}\r\n className={`w-full flex items-center text-left rounded-[var(--radius-sm)] transition-colors cursor-pointer ${\r\n item.destructive\r\n ? \"text-destructive hover:bg-destructive/10\"\r\n : item.disabled\r\n ? \"text-muted-foreground opacity-50 cursor-not-allowed\"\r\n : \"text-popover-foreground 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)\", ...fontLabel }}\r\n >\r\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\r\n <span className=\"flex-1\">{item.text}</span>\r\n {item.shortcut && (\r\n <span className=\"text-muted-foreground ml-4\" style={shortcutStyle}>\r\n {item.shortcut}\r\n </span>\r\n )}\r\n {hasChildren && <ChevronRight size={14} className=\"text-muted-foreground\" />}\r\n </button>\r\n {hasChildren && subOpen && rowRef.current && (\r\n <SubMenu items={item.children!} parentRect={rowRef.current.getBoundingClientRect()} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Menu ────────────────────────────────────────────────────────────────────\r\n\r\nexport function Menu({ items, open, onClose, triggerRef, className = \"\" }: MenuProps) {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n let top = rect.bottom + 4;\r\n let left = rect.left;\r\n requestAnimationFrame(() => {\r\n if (!menuRef.current) return;\r\n const menuRect = menuRef.current.getBoundingClientRect();\r\n if (left + menuRect.width > window.innerWidth - 8) left = rect.right - menuRect.width;\r\n if (top + menuRect.height > window.innerHeight - 8) top = rect.top - menuRect.height - 4;\r\n setPos({ top, left });\r\n });\r\n setPos({ top, left });\r\n }, [open, triggerRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (triggerRef.current?.contains(e.target as Node)) return;\r\n if (menuRef.current?.contains(e.target as Node)) return;\r\n onClose();\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, [open, onClose, triggerRef]);\r\n\r\n if (!open) return null;\r\n\r\n return createPortal(\r\n <div\r\n ref={menuRef}\r\n className={`fixed z-[9999] min-w-[200px] rounded-[var(--radius)] border border-border bg-popover shadow-md py-1 animate-[fadeIn_0.15s_ease] ${className}`}\r\n style={{ top: pos.top, left: pos.left }}\r\n >\r\n {items.map((item, i) => (\r\n <MenuItemRow key={i} item={item} />\r\n ))}\r\n <style>{`@keyframes fadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }`}</style>\r\n </div>,\r\n document.body\r\n );\r\n}\r\n\r\nMenu.displayName = \"Menu\";\r\n","import React, { useState } from \"react\";\r\nimport { CheckCircle2, AlertTriangle, Info, XCircle, X, Bell, BellOff, ExternalLink } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type NotificationType = \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nexport interface NotificationProps {\r\n type?: NotificationType;\r\n title: string;\r\n message?: string;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n action?: { label: string; onClick: () => void };\r\n avatar?: string;\r\n time?: string;\r\n read?: boolean;\r\n}\r\n\r\nexport interface NotificationCenterItem {\r\n id: string;\r\n type: NotificationType;\r\n title: string;\r\n message?: string;\r\n time: string;\r\n read: boolean;\r\n}\r\n\r\nexport interface NotificationCenterProps {\r\n items: NotificationCenterItem[];\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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/* ─── Notification Component ─────────────────────────────────────────────────── */\r\n\r\nexport function Notification({\r\n type = \"info\",\r\n title,\r\n message,\r\n closable = true,\r\n onClose,\r\n action,\r\n avatar,\r\n time,\r\n read,\r\n}: NotificationProps) {\r\n const icons: Record<string, React.ReactNode> = {\r\n info: <Info size={16} className=\"text-primary\" />,\r\n success: <CheckCircle2 size={16} className=\"text-chart-2\" />,\r\n warning: <AlertTriangle size={16} className=\"text-chart-5\" />,\r\n error: <XCircle size={16} className=\"text-destructive\" />,\r\n };\r\n const border: Record<string, string> = {\r\n info: \"border-l-primary\",\r\n success: \"border-l-chart-2\",\r\n warning: \"border-l-chart-5\",\r\n error: \"border-l-destructive\",\r\n };\r\n\r\n return (\r\n <div\r\n className={`flex gap-3 px-4 py-3 rounded-[var(--radius-md)] border border-border bg-card border-l-[3px] ${border[type]} ${\r\n read === false ? \"bg-primary/5\" : \"\"\r\n }`}\r\n >\r\n {avatar ? (\r\n <div\r\n className=\"w-8 h-8 rounded-full bg-muted flex-shrink-0 flex items-center justify-center overflow-hidden\"\r\n style={fontLabelBold}\r\n >\r\n <span className=\"text-primary\">\r\n {avatar.slice(0, 2).toUpperCase()}\r\n </span>\r\n </div>\r\n ) : (\r\n <span className=\"flex-shrink-0 mt-0.5\">{icons[type]}</span>\r\n )}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <div className=\"flex items-center gap-1 flex-shrink-0\">\r\n {time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {time}\r\n </span>\r\n )}\r\n {read === false && (\r\n <span className=\"w-2 h-2 rounded-full bg-primary\" />\r\n )}\r\n {closable && onClose && (\r\n <button\r\n onClick={onClose}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n {message && (\r\n <p className=\"text-muted-foreground mt-0.5\" style={fontLabel}>\r\n {message}\r\n </p>\r\n )}\r\n {action && (\r\n <button\r\n onClick={action.onClick}\r\n className=\"inline-flex items-center gap-1 text-primary mt-2 hover:underline cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {action.label} <ExternalLink size={12} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── NotificationCenter Component ───────────────────────────────────────────── */\r\n\r\nexport function NotificationCenter({ items }: NotificationCenterProps) {\r\n const [notifications, setNotifications] = useState(items);\r\n const unread = notifications.filter((n) => !n.read).length;\r\n\r\n return (\r\n <div className=\"max-w-md rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-4 py-3 border-b border-border flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Bell size={16} className=\"text-foreground\" />\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n Notifications\r\n </span>\r\n {unread > 0 && (\r\n <span\r\n className=\"px-1.5 py-0.5 rounded-full bg-primary text-primary-foreground\"\r\n style={btnStyle}\r\n >\r\n {unread}\r\n </span>\r\n )}\r\n </div>\r\n {unread > 0 && (\r\n <button\r\n onClick={() =>\r\n setNotifications((n) =>\r\n n.map((i) => ({ ...i, read: true }))\r\n )\r\n }\r\n className=\"text-primary cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n Mark all read\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"divide-y divide-border max-h-[360px] overflow-y-auto\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`px-3 py-2 ${!n.read ? \"bg-primary/5\" : \"\"}`}\r\n >\r\n <Notification\r\n type={n.type}\r\n title={n.title}\r\n message={n.message}\r\n time={n.time}\r\n read={n.read}\r\n closable={false}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n {notifications.length === 0 && (\r\n <div className=\"py-10 text-center text-muted-foreground\">\r\n <BellOff size={24} className=\"mx-auto mb-2 opacity-40\" />\r\n <span style={fontLabel}>No notifications</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\nexport interface PopoverProps {\r\n trigger: React.ReactNode;\r\n children: React.ReactNode;\r\n placement?: PopoverPlacement;\r\n title?: string;\r\n open?: boolean;\r\n onOpenChange?: (v: boolean) => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Popover({\r\n trigger,\r\n children,\r\n placement = \"bottom\",\r\n title,\r\n open: controlled,\r\n onOpenChange,\r\n}: PopoverProps) {\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const isOpen = controlled !== undefined ? controlled : internalOpen;\r\n const setOpen = (v: boolean) => {\r\n onOpenChange?.(v);\r\n if (controlled === undefined) setInternalOpen(v);\r\n };\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", h);\r\n return () => document.removeEventListener(\"mousedown\", h);\r\n }, [isOpen]);\r\n\r\n const posMap: Record<string, string> = {\r\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\r\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\r\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\r\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\r\n };\r\n\r\n return (\r\n <div className=\"relative inline-block\" ref={ref}>\r\n <div onClick={() => setOpen(!isOpen)} className=\"cursor-pointer\">\r\n {trigger}\r\n </div>\r\n {isOpen && (\r\n <div\r\n className={`absolute z-50 ${posMap[placement]} w-max max-w-xs`}\r\n >\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card shadow-lg overflow-hidden\">\r\n {title && (\r\n <div className=\"px-4 py-2.5 border-b border-border flex items-center justify-between\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <button\r\n onClick={() => setOpen(false)}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </div>\r\n )}\r\n <div className=\"px-4 py-3\">{children}</div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface ProgressBarProps {\r\n value?: number;\r\n max?: number;\r\n size?: ProgressBarSize;\r\n color?: string;\r\n label?: string;\r\n showValue?: boolean;\r\n indeterminate?: boolean;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── ProgressBar ─────────────────────────────────────────────────────────────\r\n\r\nexport function ProgressBar({\r\n value,\r\n max = 100,\r\n size = \"md\",\r\n color,\r\n label,\r\n showValue,\r\n indeterminate,\r\n className = \"\",\r\n}: ProgressBarProps) {\r\n const sizes = { sm: \"h-1.5\", md: \"h-2.5\", lg: \"h-4\" };\r\n const pct = indeterminate ? 0 : Math.min(100, Math.max(0, ((value ?? 0) / max) * 100));\r\n\r\n return (\r\n <div className={`w-full ${className}`}>\r\n {(label || showValue) && (\r\n <div className=\"flex items-center justify-between mb-1.5\">\r\n {label && (\r\n <span className=\"text-foreground\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {showValue && !indeterminate && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {Math.round(pct)}%\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n <div className={`w-full ${sizes[size]} rounded-full bg-muted overflow-hidden`}>\r\n {indeterminate ? (\r\n <div\r\n className=\"h-full w-1/3 rounded-full animate-[indeterminate_1.5s_infinite_ease-in-out]\"\r\n style={{ backgroundColor: color ?? \"var(--primary)\" }}\r\n />\r\n ) : (\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${pct}%`,\r\n backgroundColor: color ?? \"var(--primary)\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n <style>{`@keyframes indeterminate { 0% { transform: translateX(-100%); } 100% { transform: translateX(400%); } }`}</style>\r\n </div>\r\n );\r\n}\r\n\r\nProgressBar.displayName = \"ProgressBar\";\r\n","import React, { useState } from \"react\";\r\nimport { Star, Heart, ThumbsUp } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type RatingSize = \"sm\" | \"md\" | \"lg\";\r\nexport type RatingIcon = \"star\" | \"heart\" | \"thumb\";\r\n\r\nexport interface RatingProps {\r\n value?: number;\r\n onChange?: (v: number) => void;\r\n max?: number;\r\n size?: RatingSize;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n icon?: RatingIcon;\r\n showValue?: boolean;\r\n label?: string;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Rating({\r\n value = 0,\r\n onChange,\r\n max = 5,\r\n size = \"md\",\r\n disabled,\r\n readOnly,\r\n icon = \"star\",\r\n showValue,\r\n label,\r\n}: RatingProps) {\r\n const [hover, setHover] = useState(0);\r\n const iconSize = size === \"sm\" ? 16 : size === \"lg\" ? 28 : 20;\r\n const gap = size === \"sm\" ? \"gap-0.5\" : size === \"lg\" ? \"gap-1.5\" : \"gap-1\";\r\n\r\n const IconComp = icon === \"heart\" ? Heart : icon === \"thumb\" ? ThumbsUp : Star;\r\n const activeColor = icon === \"heart\" ? \"text-destructive\" : \"text-chart-5\";\r\n\r\n const items = Array.from({ length: max }, (_, i) => i + 1);\r\n\r\n return (\r\n <div\r\n className={`inline-flex items-center ${gap} ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"\"\r\n }`}\r\n >\r\n {label && (\r\n <span className=\"text-foreground mr-2\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {items.map((n) => {\r\n const filled = n <= (hover || value);\r\n return (\r\n <button\r\n key={n}\r\n type=\"button\"\r\n className={`transition-transform ${\r\n readOnly || disabled\r\n ? \"\"\r\n : \"cursor-pointer hover:scale-110\"\r\n } ${filled ? activeColor : \"text-muted-foreground/40\"}`}\r\n onMouseEnter={() => !readOnly && !disabled && setHover(n)}\r\n onMouseLeave={() => setHover(0)}\r\n onClick={() =>\r\n !readOnly && !disabled && onChange?.(n === value ? 0 : n)\r\n }\r\n disabled={disabled || readOnly}\r\n >\r\n <IconComp\r\n size={iconSize}\r\n fill={filled ? \"currentColor\" : \"none\"}\r\n />\r\n </button>\r\n );\r\n })}\r\n {showValue && (\r\n <span className=\"text-foreground ml-1\" style={fontLabelBold}>\r\n {value}/{max}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface SidebarItem {\r\n /** Unique item identifier */\r\n id: string;\r\n /** Display label */\r\n label: string;\r\n /** Leading icon */\r\n icon?: React.ReactNode;\r\n /** Badge text (e.g., count) */\r\n badge?: string;\r\n}\r\n\r\nexport interface SidebarGroup {\r\n /** Group label (displayed as uppercase header) */\r\n label: string;\r\n /** Items in this group */\r\n items: SidebarItem[];\r\n}\r\n\r\nexport interface SidebarBrand {\r\n /** Brand name */\r\n name: string;\r\n /** Brand logo URL */\r\n logo?: string;\r\n}\r\n\r\nexport interface SidebarProps {\r\n /** Brand card in header */\r\n brand?: SidebarBrand;\r\n /** Navigation groups */\r\n groups: SidebarGroup[];\r\n /** Active item ID */\r\n activeItem?: string;\r\n /** Navigation callback */\r\n onNavigate?: (item: SidebarItem) => void;\r\n /** Collapse to icon-only mode */\r\n collapsed?: boolean;\r\n /** Toggle collapse callback */\r\n onCollapsedChange?: (collapsed: boolean) => void;\r\n /** Sidebar width (default: 256px) */\r\n width?: string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst fontLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n};\r\n\r\nconst btnStyle: 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\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Sidebar ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Sidebar({\r\n brand,\r\n groups,\r\n activeItem,\r\n onNavigate,\r\n collapsed = false,\r\n onCollapsedChange,\r\n className = \"\",\r\n}: SidebarProps) {\r\n return (\r\n <div\r\n className={`bg-sidebar border-r border-sidebar-border flex flex-col flex-shrink-0 transition-all ${\r\n collapsed ? \"w-16\" : \"w-64\"\r\n } ${className}`}\r\n >\r\n {/* Brand */}\r\n {brand && (\r\n <div className=\"px-4 py-4 border-b border-sidebar-border flex items-center gap-2\">\r\n {brand.logo ? (\r\n <img\r\n src={brand.logo}\r\n alt={brand.name}\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] flex-shrink-0 object-cover\"\r\n />\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] bg-primary flex items-center justify-center text-primary-foreground flex-shrink-0\"\r\n style={btnStyle}\r\n >\r\n {brand.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n {!collapsed && (\r\n <span className=\"text-sidebar-foreground truncate\" style={fontLabelBold}>\r\n {brand.name}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Nav */}\r\n <nav className=\"flex-1 overflow-y-auto py-3 px-2\">\r\n {groups.map((g) => (\r\n <div key={g.label} className=\"mb-4\">\r\n {!collapsed && (\r\n <span\r\n className=\"px-2 mb-1.5 block text-muted-foreground uppercase tracking-wider\"\r\n style={btnStyle}\r\n >\r\n {g.label}\r\n </span>\r\n )}\r\n <div className=\"space-y-0.5\">\r\n {g.items.map((item) => {\r\n const active = activeItem === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n onClick={() => onNavigate?.(item)}\r\n className={`w-full flex items-center gap-2 px-2 py-2 rounded-[var(--radius-md)] transition-colors cursor-pointer ${\r\n active\r\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\r\n : \"text-sidebar-foreground hover:bg-sidebar-accent/50\"\r\n }`}\r\n style={fontLabel}\r\n >\r\n <span className={active ? \"text-sidebar-primary\" : \"text-muted-foreground\"}>\r\n {item.icon}\r\n </span>\r\n {!collapsed && (\r\n <span className=\"truncate flex-1 text-left\">{item.label}</span>\r\n )}\r\n {!collapsed && item.badge && (\r\n <span\r\n className=\"px-1.5 py-0.5 rounded-full bg-primary text-primary-foreground\"\r\n style={{ ...btnStyle, lineHeight: \"1\" }}\r\n >\r\n {item.badge}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </nav>\r\n\r\n {/* Footer */}\r\n {onCollapsedChange && (\r\n <div className=\"px-3 py-3 border-t border-sidebar-border\">\r\n <button\r\n onClick={() => onCollapsedChange(!collapsed)}\r\n className=\"w-full px-2 py-1.5 rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-sidebar-accent/50 cursor-pointer text-left\"\r\n style={smallLabel}\r\n >\r\n {collapsed ? \">\" : \"Collapse\"}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nSidebar.displayName = \"Sidebar\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type SkeletonVariant = \"text\" | \"rectangular\" | \"circular\" | \"rounded\";\r\n\r\nexport interface SkeletonProps {\r\n width?: string | number;\r\n height?: string | number;\r\n variant?: SkeletonVariant;\r\n animate?: boolean;\r\n className?: string;\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Skeleton({\r\n width,\r\n height,\r\n variant = \"rectangular\",\r\n animate = true,\r\n className,\r\n}: SkeletonProps) {\r\n const base = \"bg-muted\";\r\n const anim = animate ? \"animate-pulse\" : \"\";\r\n const radius =\r\n variant === \"circular\"\r\n ? \"rounded-full\"\r\n : variant === \"rounded\"\r\n ? \"rounded-[var(--radius-md)]\"\r\n : variant === \"text\"\r\n ? \"rounded-[var(--radius-sm)]\"\r\n : \"rounded-[var(--radius-sm)]\";\r\n\r\n return (\r\n <div\r\n className={`${base} ${anim} ${radius} ${className ?? \"\"}`}\r\n style={{\r\n width: width ?? \"100%\",\r\n height:\r\n height ??\r\n (variant === \"text\" ? \"1em\" : variant === \"circular\" ? 40 : 20),\r\n }}\r\n />\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonCard ─────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonCard() {\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card p-4 space-y-4 w-full max-w-sm\">\r\n <Skeleton variant=\"rounded\" height={160} />\r\n <div className=\"space-y-2\">\r\n <Skeleton variant=\"text\" width=\"60%\" height={20} />\r\n <Skeleton variant=\"text\" width=\"100%\" height={14} />\r\n <Skeleton variant=\"text\" width=\"80%\" height={14} />\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <Skeleton variant=\"circular\" width={36} height={36} />\r\n <div className=\"flex-1 space-y-1.5\">\r\n <Skeleton variant=\"text\" width=\"40%\" height={14} />\r\n <Skeleton variant=\"text\" width=\"25%\" height={12} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonTable ────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonTable() {\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-4 py-3 border-b border-border bg-muted/30 flex gap-4\">\r\n {[120, 160, 100, 80].map((w, i) => (\r\n <Skeleton key={i} variant=\"text\" width={w} height={14} />\r\n ))}\r\n </div>\r\n {[0, 1, 2, 3].map((row) => (\r\n <div\r\n key={row}\r\n className=\"px-4 py-3 border-b border-border flex items-center gap-4\"\r\n >\r\n <Skeleton variant=\"circular\" width={28} height={28} />\r\n <Skeleton variant=\"text\" width={100 + row * 15} height={14} />\r\n <Skeleton\r\n variant=\"text\"\r\n width={140}\r\n height={14}\r\n className=\"flex-1\"\r\n />\r\n <Skeleton variant=\"rounded\" width={60} height={22} />\r\n <Skeleton variant=\"text\" width={80} height={14} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonList ─────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonList() {\r\n return (\r\n <div className=\"space-y-3 w-full max-w-md\">\r\n {[0, 1, 2].map((i) => (\r\n <div\r\n key={i}\r\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-[var(--radius-md)] border border-border bg-card\"\r\n >\r\n <Skeleton variant=\"circular\" width={40} height={40} />\r\n <div className=\"flex-1 space-y-1.5\">\r\n <Skeleton\r\n variant=\"text\"\r\n width={`${60 + i * 10}%`}\r\n height={14}\r\n />\r\n <Skeleton\r\n variant=\"text\"\r\n width={`${40 + i * 5}%`}\r\n height={12}\r\n />\r\n </div>\r\n <Skeleton variant=\"rounded\" width={50} height={24} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\nexport interface SpinnerProps {\r\n /** Spinner size */\r\n size?: SpinnerSize;\r\n /** Spinner color (CSS value) */\r\n color?: string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst sizeClasses: Record<SpinnerSize, string> = {\r\n sm: \"w-4 h-4 border-2\",\r\n md: \"w-8 h-8 border-[3px]\",\r\n lg: \"w-12 h-12 border-4\",\r\n xl: \"w-16 h-16 border-4\",\r\n};\r\n\r\n// ─── Spinner ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Spinner({ size = \"md\", color, className = \"\" }: SpinnerProps) {\r\n return (\r\n <div\r\n className={`${sizeClasses[size]} rounded-full border-muted animate-spin ${className}`}\r\n style={{ borderTopColor: color ?? \"var(--primary)\" }}\r\n role=\"status\"\r\n aria-label=\"Loading\"\r\n />\r\n );\r\n}\r\n\r\nSpinner.displayName = \"Spinner\";\r\n","import React from \"react\";\r\nimport { ArrowUpRight, ArrowDownRight, Minus } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type StatisticSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface StatisticTrend {\r\n value: number;\r\n direction: \"up\" | \"down\" | \"neutral\";\r\n}\r\n\r\nexport interface StatisticProps {\r\n title: string;\r\n value: string | number;\r\n prefix?: React.ReactNode;\r\n suffix?: string;\r\n trend?: StatisticTrend;\r\n trendLabel?: string;\r\n icon?: React.ReactNode;\r\n size?: StatisticSize;\r\n loading?: boolean;\r\n}\r\n\r\nexport interface StatCardProps {\r\n title: string;\r\n value: string | number;\r\n prefix?: React.ReactNode;\r\n trend?: StatisticTrend;\r\n trendLabel?: string;\r\n icon?: React.ReactNode;\r\n iconBg?: string;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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\nconst valueStyles: Record<StatisticSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-h4)\",\r\n fontSize: \"var(--text-h4)\",\r\n fontWeight: \"var(--weight-h4)\",\r\n },\r\n md: {\r\n fontFamily: \"var(--font-h2)\",\r\n fontSize: \"var(--text-h2)\",\r\n fontWeight: \"var(--weight-h2)\",\r\n },\r\n lg: {\r\n fontFamily: \"var(--font-h1)\",\r\n fontSize: \"var(--text-h1)\",\r\n fontWeight: \"var(--weight-h1)\",\r\n },\r\n};\r\n\r\n/* ─── Statistic Component ────────────────────────────────────────────────────── */\r\n\r\nexport function Statistic({\r\n title,\r\n value,\r\n prefix,\r\n suffix,\r\n trend,\r\n trendLabel,\r\n icon,\r\n size = \"md\",\r\n loading,\r\n}: StatisticProps) {\r\n const valueStyle = valueStyles[size];\r\n const trendColor =\r\n trend?.direction === \"up\"\r\n ? \"text-chart-2\"\r\n : trend?.direction === \"down\"\r\n ? \"text-destructive\"\r\n : \"text-muted-foreground\";\r\n const TrendIcon =\r\n trend?.direction === \"up\"\r\n ? ArrowUpRight\r\n : trend?.direction === \"down\"\r\n ? ArrowDownRight\r\n : Minus;\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"space-y-2 animate-pulse\">\r\n <div className=\"h-3 w-20 bg-muted rounded-[var(--radius-sm)]\" />\r\n <div className=\"h-8 w-32 bg-muted rounded-[var(--radius-sm)]\" />\r\n <div className=\"h-3 w-24 bg-muted rounded-[var(--radius-sm)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {title}\r\n </span>\r\n </div>\r\n <div className=\"flex items-baseline gap-1\">\r\n {prefix && (\r\n <span className=\"text-muted-foreground\" style={fontLabelBold}>\r\n {prefix}\r\n </span>\r\n )}\r\n <span className=\"text-foreground\" style={valueStyle}>\r\n {typeof value === \"number\" ? value.toLocaleString() : value}\r\n </span>\r\n {suffix && (\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {suffix}\r\n </span>\r\n )}\r\n </div>\r\n {trend && (\r\n <div className={`flex items-center gap-1 ${trendColor}`}>\r\n <TrendIcon size={14} />\r\n <span style={btnStyle}>{trend.value}%</span>\r\n {trendLabel && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {trendLabel}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── StatCard Component ─────────────────────────────────────────────────────── */\r\n\r\nexport function StatCard({\r\n title,\r\n value,\r\n prefix,\r\n trend,\r\n trendLabel,\r\n icon,\r\n iconBg,\r\n}: StatCardProps) {\r\n const trendColor =\r\n trend?.direction === \"up\"\r\n ? \"text-chart-2\"\r\n : trend?.direction === \"down\"\r\n ? \"text-destructive\"\r\n : \"text-muted-foreground\";\r\n const TrendIcon =\r\n trend?.direction === \"up\"\r\n ? ArrowUpRight\r\n : trend?.direction === \"down\"\r\n ? ArrowDownRight\r\n : Minus;\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card p-5\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"space-y-1\">\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {title}\r\n </span>\r\n <div className=\"flex items-baseline gap-1\">\r\n {prefix && (\r\n <span className=\"text-muted-foreground\" style={fontLabelBold}>\r\n {prefix}\r\n </span>\r\n )}\r\n <span\r\n className=\"text-foreground\"\r\n style={{\r\n fontFamily: \"var(--font-h3)\",\r\n fontSize: \"var(--text-h3)\",\r\n fontWeight: \"var(--weight-h3)\",\r\n }}\r\n >\r\n {typeof value === \"number\" ? value.toLocaleString() : value}\r\n </span>\r\n </div>\r\n {trend && (\r\n <div className={`flex items-center gap-1 ${trendColor}`}>\r\n <TrendIcon size={12} />\r\n <span style={btnStyle}>{trend.value}%</span>\r\n {trendLabel && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {trendLabel}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n {icon && (\r\n <div\r\n className={`w-10 h-10 rounded-[var(--radius-md)] flex items-center justify-center flex-shrink-0 ${\r\n iconBg || \"bg-primary/10 text-primary\"\r\n }`}\r\n >\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { Check } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface StepDefinition {\r\n /** Step title */\r\n title: string;\r\n /** Optional step description */\r\n description?: string;\r\n}\r\n\r\nexport interface StepperProps {\r\n /** Step definitions */\r\n steps: StepDefinition[];\r\n /** Current active step (0-based) */\r\n current: number;\r\n /** Layout direction */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Step click handler (for navigating to completed steps) */\r\n onStepClick?: (index: number) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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// ─── Stepper ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Stepper({\r\n steps,\r\n current,\r\n orientation = \"horizontal\",\r\n onStepClick,\r\n className = \"\",\r\n}: StepperProps) {\r\n if (orientation === \"vertical\") {\r\n return (\r\n <div className={`flex flex-col ${className}`}>\r\n {steps.map((step, i) => {\r\n const done = i < current;\r\n const active = i === current;\r\n return (\r\n <div\r\n key={i}\r\n className=\"flex gap-3\"\r\n onClick={() => onStepClick?.(i)}\r\n >\r\n <div className=\"flex flex-col items-center\">\r\n <div\r\n className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-colors ${\r\n onStepClick ? \"cursor-pointer\" : \"\"\r\n } ${\r\n done\r\n ? \"bg-primary text-primary-foreground\"\r\n : active\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"bg-muted text-muted-foreground\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n {done ? <Check size={14} /> : i + 1}\r\n </div>\r\n {i < steps.length - 1 && (\r\n <div\r\n className={`w-px flex-1 min-h-[24px] my-1 ${\r\n done ? \"bg-primary\" : \"bg-border\"\r\n }`}\r\n />\r\n )}\r\n </div>\r\n <div className={`pb-6 ${i === steps.length - 1 ? \"pb-0\" : \"\"}`}>\r\n <span\r\n className={`block ${\r\n active ? \"text-foreground\" : \"text-muted-foreground\"\r\n }`}\r\n style={active ? fontLabelBold : fontLabel}\r\n >\r\n {step.title}\r\n </span>\r\n {step.description && (\r\n <span className=\"text-muted-foreground block\" style={smallLabel}>\r\n {step.description}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`flex items-center ${className}`}>\r\n {steps.map((step, i) => {\r\n const done = i < current;\r\n const active = i === current;\r\n return (\r\n <div\r\n key={i}\r\n className={`flex items-center ${i < steps.length - 1 ? \"flex-1\" : \"\"}`}\r\n >\r\n <div\r\n className=\"flex flex-col items-center gap-1\"\r\n onClick={() => onStepClick?.(i)}\r\n >\r\n <div\r\n className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-colors ${\r\n onStepClick ? \"cursor-pointer\" : \"\"\r\n } ${\r\n done\r\n ? \"bg-primary text-primary-foreground\"\r\n : active\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"bg-muted text-muted-foreground\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n {done ? <Check size={14} /> : i + 1}\r\n </div>\r\n <span\r\n className={`text-center ${\r\n active ? \"text-foreground\" : \"text-muted-foreground\"\r\n }`}\r\n style={active ? fontLabelBold : smallLabel}\r\n >\r\n {step.title}\r\n </span>\r\n </div>\r\n {i < steps.length - 1 && (\r\n <div\r\n className={`flex-1 h-px mx-2 mt-[-20px] ${\r\n done ? \"bg-primary\" : \"bg-border\"\r\n }`}\r\n />\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nStepper.displayName = \"Stepper\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\r\nexport type SwitchColor = \"primary\" | \"success\" | \"warning\" | \"destructive\";\r\n\r\nexport interface SwitchProps {\r\n checked: boolean;\r\n onChange: (v: boolean) => void;\r\n label?: string;\r\n description?: string;\r\n size?: SwitchSize;\r\n disabled?: boolean;\r\n color?: SwitchColor;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Config ─────────────────────────────────────────────────────────────────── */\r\n\r\nconst sizes: Record<SwitchSize, { track: string; thumb: string; on: string }> = {\r\n sm: { track: \"w-7 h-4\", thumb: \"w-3 h-3\", on: \"translate-x-3\" },\r\n md: { track: \"w-10 h-6\", thumb: \"w-4.5 h-4.5\", on: \"translate-x-4.5\" },\r\n lg: { track: \"w-14 h-8\", thumb: \"w-6.5 h-6.5\", on: \"translate-x-6\" },\r\n};\r\n\r\nconst colors: Record<SwitchColor, string> = {\r\n primary: \"bg-primary\",\r\n success: \"bg-chart-2\",\r\n warning: \"bg-chart-5\",\r\n destructive: \"bg-destructive\",\r\n};\r\n\r\nconst thumbPx: Record<SwitchSize, { w: number; h: number; on: number }> = {\r\n sm: { w: 12, h: 12, on: 14 },\r\n md: { w: 18, h: 18, on: 18 },\r\n lg: { w: 26, h: 26, on: 24 },\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Switch({\r\n checked,\r\n onChange,\r\n label,\r\n description,\r\n size = \"md\",\r\n disabled,\r\n color = \"primary\",\r\n}: SwitchProps) {\r\n const s = sizes[size];\r\n const tp = thumbPx[size];\r\n\r\n return (\r\n <label\r\n className={`inline-flex items-start gap-3 ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"cursor-pointer\"\r\n }`}\r\n >\r\n <button\r\n role=\"switch\"\r\n aria-checked={checked}\r\n onClick={() => onChange(!checked)}\r\n disabled={disabled}\r\n className={`${s.track} rounded-full relative flex-shrink-0 transition-colors cursor-pointer ${\r\n checked ? colors[color] : \"bg-muted\"\r\n }`}\r\n >\r\n <span\r\n className=\"rounded-full bg-white shadow-sm absolute transition-transform\"\r\n style={{\r\n width: tp.w,\r\n height: tp.h,\r\n top: \"50%\",\r\n transform: `translateY(-50%) translateX(${checked ? tp.on : 2}px)`,\r\n left: 0,\r\n }}\r\n />\r\n </button>\r\n {(label || description) && (\r\n <div>\r\n {label && (\r\n <span className=\"text-foreground block\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {description && (\r\n <span className=\"text-muted-foreground block\" style={smallLabel}>\r\n {description}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </label>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TagColor = \"default\" | \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"info\";\r\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface TagProps {\r\n /** Tag content */\r\n children: React.ReactNode;\r\n /** Color variant */\r\n color?: TagColor;\r\n /** Tag size */\r\n size?: TagSize;\r\n /** Leading icon element */\r\n icon?: React.ReactNode;\r\n /** Show close button */\r\n closable?: boolean;\r\n /** Close callback */\r\n onClose?: () => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst colorClasses: Record<TagColor, string> = {\r\n default: \"bg-muted/50 text-foreground border-border\",\r\n primary: \"bg-primary/10 text-primary border-primary/20\",\r\n success: \"bg-chart-2/10 text-chart-2 border-chart-2/20\",\r\n warning: \"bg-chart-5/10 text-chart-5 border-chart-5/20\",\r\n destructive: \"bg-destructive/10 text-destructive border-destructive/20\",\r\n info: \"bg-accent text-accent-foreground border-primary/20\",\r\n};\r\n\r\nconst sizePadding: Record<TagSize, string> = {\r\n sm: \"px-1.5 py-0.5\",\r\n md: \"px-2 py-0.5\",\r\n lg: \"px-3 py-1.5\",\r\n};\r\n\r\nconst sizeStyles: Record<TagSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n md: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n lg: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n};\r\n\r\n// ─── Tag ─────────────────────────────────────────────────────────────────────\r\n\r\nexport function Tag({\r\n children,\r\n color = \"default\",\r\n size = \"md\",\r\n icon,\r\n closable,\r\n onClose,\r\n className = \"\",\r\n}: TagProps) {\r\n const cls = colorClasses[color];\r\n const sz = sizePadding[size];\r\n const style = sizeStyles[size];\r\n\r\n return (\r\n <span\r\n className={`inline-flex items-center gap-1 rounded-full border ${cls} ${sz} ${className}`}\r\n style={style}\r\n >\r\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\r\n {children}\r\n {closable && (\r\n <button className=\"hover:opacity-70 cursor-pointer\" onClick={onClose}>\r\n <X size={size === \"sm\" ? 10 : 12} />\r\n </button>\r\n )}\r\n </span>\r\n );\r\n}\r\n\r\nTag.displayName = \"Tag\";\r\n","import React, { useState } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TagInputVariant = \"default\" | \"outline\" | \"filled\";\r\n\r\nexport interface TagInputProps {\r\n /** Array of tag values */\r\n tags: string[];\r\n /** Callback when tags change */\r\n onChange: (tags: string[]) => void;\r\n /** Input placeholder text */\r\n placeholder?: string;\r\n /** Disable input */\r\n disabled?: boolean;\r\n /** Maximum number of tags */\r\n maxTags?: number;\r\n /** Visual variant */\r\n variant?: TagInputVariant;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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\nconst variantClasses: Record<TagInputVariant, string> = {\r\n default: \"bg-card border-border\",\r\n outline: \"bg-transparent border-border\",\r\n filled: \"bg-muted/30 border-transparent\",\r\n};\r\n\r\n// ─── TagInput ────────────────────────────────────────────────────────────────\r\n\r\nexport function TagInput({\r\n tags,\r\n onChange,\r\n placeholder,\r\n disabled,\r\n maxTags,\r\n variant = \"default\",\r\n className = \"\",\r\n}: TagInputProps) {\r\n const [input, setInput] = useState(\"\");\r\n\r\n const add = () => {\r\n const v = input.trim();\r\n if (!v || tags.includes(v) || (maxTags && tags.length >= maxTags)) return;\r\n onChange([...tags, v]);\r\n setInput(\"\");\r\n };\r\n\r\n const remove = (tag: string) => {\r\n onChange(tags.filter((t) => t !== tag));\r\n };\r\n\r\n return (\r\n <div\r\n className={`flex flex-wrap items-center gap-1.5 px-3 py-2 rounded-[var(--radius)] border ${variantClasses[variant]} transition-colors focus-within:border-primary ${disabled ? \"opacity-50 pointer-events-none\" : \"\"} ${className}`}\r\n >\r\n {tags.map((t) => (\r\n <span\r\n key={t}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-sm)] bg-primary/10 text-primary\"\r\n style={btnStyle}\r\n >\r\n {t}\r\n <button\r\n className=\"hover:text-destructive cursor-pointer\"\r\n onClick={() => remove(t)}\r\n >\r\n <X size={12} />\r\n </button>\r\n </span>\r\n ))}\r\n <input\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n add();\r\n }\r\n if (e.key === \"Backspace\" && !input && tags.length) {\r\n onChange(tags.slice(0, -1));\r\n }\r\n }}\r\n placeholder={!tags.length ? placeholder : \"\"}\r\n className=\"flex-1 min-w-[80px] bg-transparent outline-none text-foreground placeholder:text-muted-foreground\"\r\n style={fontLabel}\r\n disabled={disabled}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nTagInput.displayName = \"TagInput\";\r\n","import React from \"react\";\r\nimport { CheckCircle2, Circle } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type TimelineVariant = \"default\" | \"alternate\" | \"compact\";\r\nexport type TimelineSize = \"sm\" | \"md\" | \"lg\";\r\nexport type TimelineItemStatus = \"completed\" | \"current\" | \"pending\" | \"error\";\r\n\r\nexport interface TimelineItem {\r\n title: string;\r\n description?: string;\r\n time?: string;\r\n icon?: React.ReactNode;\r\n status?: TimelineItemStatus;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport interface TimelineProps {\r\n items: TimelineItem[];\r\n variant?: TimelineVariant;\r\n size?: TimelineSize;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Timeline({\r\n items,\r\n variant = \"default\",\r\n size = \"md\",\r\n}: TimelineProps) {\r\n const dotSize =\r\n size === \"sm\" ? \"w-6 h-6\" : size === \"lg\" ? \"w-10 h-10\" : \"w-8 h-8\";\r\n const iconSz = size === \"sm\" ? 12 : size === \"lg\" ? 18 : 14;\r\n\r\n const statusColor = (s?: string) =>\r\n s === \"completed\"\r\n ? \"bg-chart-2 text-white\"\r\n : s === \"current\"\r\n ? \"bg-primary text-primary-foreground\"\r\n : s === \"error\"\r\n ? \"bg-destructive text-white\"\r\n : \"bg-muted text-muted-foreground\";\r\n\r\n if (variant === \"compact\") {\r\n return (\r\n <div className=\"space-y-0\">\r\n {items.map((item, i) => (\r\n <div key={i} className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center\">\r\n <div\r\n className={`${dotSize} rounded-full flex items-center justify-center flex-shrink-0 ${statusColor(\r\n item.status\r\n )}`}\r\n >\r\n {item.icon ||\r\n (item.status === \"completed\" ? (\r\n <CheckCircle2 size={iconSz} />\r\n ) : (\r\n <Circle size={iconSz} />\r\n ))}\r\n </div>\r\n {i < items.length - 1 && (\r\n <div className=\"w-0.5 flex-1 min-h-4 bg-border\" />\r\n )}\r\n </div>\r\n <div className=\"pb-4 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {item.title}\r\n </span>\r\n {item.time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {item.time}\r\n </span>\r\n )}\r\n </div>\r\n {item.description && (\r\n <p\r\n className=\"text-muted-foreground mt-0.5\"\r\n style={smallLabel}\r\n >\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"relative\">\r\n {items.map((item, i) => {\r\n const isAlt = variant === \"alternate\" && i % 2 === 1;\r\n return (\r\n <div\r\n key={i}\r\n className={`flex gap-4 pb-8 last:pb-0 ${\r\n isAlt ? \"flex-row-reverse\" : \"\"\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center flex-shrink-0\">\r\n <div\r\n className={`${dotSize} rounded-full flex items-center justify-center ${statusColor(\r\n item.status\r\n )}`}\r\n >\r\n {item.icon ||\r\n (item.status === \"completed\" ? (\r\n <CheckCircle2 size={iconSz} />\r\n ) : (\r\n <Circle size={iconSz} />\r\n ))}\r\n </div>\r\n {i < items.length - 1 && (\r\n <div className=\"w-0.5 flex-1 bg-border mt-1\" />\r\n )}\r\n </div>\r\n <div\r\n className={`flex-1 min-w-0 ${isAlt ? \"text-right\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center gap-2 ${\r\n isAlt ? \"justify-end\" : \"\"\r\n }`}\r\n >\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {item.title}\r\n </span>\r\n {item.time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {item.time}\r\n </span>\r\n )}\r\n </div>\r\n {item.description && (\r\n <p\r\n className=\"text-muted-foreground mt-0.5\"\r\n style={fontLabel}\r\n >\r\n {item.description}\r\n </p>\r\n )}\r\n {item.children && (\r\n <div className=\"mt-2\">{item.children}</div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\nexport interface TooltipProps {\r\n /** Trigger element */\r\n children: React.ReactNode;\r\n /** Tooltip content */\r\n content: string;\r\n /** Tooltip position */\r\n placement?: TooltipPlacement;\r\n /** Additional class name for the wrapper */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst placementClasses: Record<TooltipPlacement, string> = {\r\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\r\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\r\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\r\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Tooltip ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Tooltip({\r\n children,\r\n content,\r\n placement = \"top\",\r\n className = \"\",\r\n}: TooltipProps) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div\r\n className={`relative inline-flex ${className}`}\r\n onMouseEnter={() => setShow(true)}\r\n onMouseLeave={() => setShow(false)}\r\n onFocus={() => setShow(true)}\r\n onBlur={() => setShow(false)}\r\n >\r\n {children}\r\n {show && (\r\n <div\r\n className={`absolute ${placementClasses[placement]} z-50 px-3 py-1.5 rounded-[var(--radius-sm)] bg-foreground text-background whitespace-nowrap shadow-md`}\r\n style={smallLabel}\r\n role=\"tooltip\"\r\n >\r\n {content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTooltip.displayName = \"Tooltip\";\r\n","import React from \"react\";\r\nimport { ChevronRight, Search, Bell, Menu } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface BreadcrumbItem {\r\n /** Display label */\r\n label: string;\r\n /** Optional href for navigation */\r\n href?: string;\r\n}\r\n\r\nexport interface TopNavbarBrand {\r\n /** Brand name */\r\n name: string;\r\n /** Logo URL or ReactNode */\r\n logo?: string | React.ReactNode;\r\n}\r\n\r\nexport interface TopNavbarUser {\r\n /** User display name */\r\n name: string;\r\n /** Avatar image URL */\r\n avatar?: string;\r\n}\r\n\r\nexport interface TopNavbarProps {\r\n /** Brand logo and name */\r\n brand?: TopNavbarBrand;\r\n /** Breadcrumb items */\r\n breadcrumbs?: BreadcrumbItem[];\r\n /** Right-side action area */\r\n actions?: React.ReactNode;\r\n /** User avatar */\r\n user?: TopNavbarUser;\r\n /** Navbar height */\r\n height?: string;\r\n /** Show search bar */\r\n showSearch?: boolean;\r\n /** Search placeholder text */\r\n searchPlaceholder?: string;\r\n /** Search click handler */\r\n onSearchClick?: () => void;\r\n /** Notification count (0 = hidden) */\r\n notificationCount?: number;\r\n /** Notification click handler */\r\n onNotificationClick?: () => void;\r\n /** Mobile menu click handler */\r\n onMobileMenuClick?: () => void;\r\n /** User click handler */\r\n onUserClick?: () => void;\r\n /** Breadcrumb click handler */\r\n onBreadcrumbClick?: (item: BreadcrumbItem, index: number) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst btnStyle: 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// ─── TopNavbar ───────────────────────────────────────────────────────────────\r\n\r\nexport function TopNavbar({\r\n brand,\r\n breadcrumbs,\r\n actions,\r\n user,\r\n height = \"72px\",\r\n showSearch = false,\r\n searchPlaceholder = \"Search... (Ctrl+K)\",\r\n onSearchClick,\r\n notificationCount,\r\n onNotificationClick,\r\n onMobileMenuClick,\r\n onUserClick,\r\n onBreadcrumbClick,\r\n className = \"\",\r\n}: TopNavbarProps) {\r\n const initials = user?.name\r\n ? user.name\r\n .split(\" \")\r\n .map((w) => w[0])\r\n .join(\"\")\r\n .slice(0, 2)\r\n .toUpperCase()\r\n : \"\";\r\n\r\n return (\r\n <div\r\n className={`bg-card border-b border-border flex items-center px-5 gap-4 ${className}`}\r\n style={{ height }}\r\n >\r\n {/* Mobile menu button */}\r\n {onMobileMenuClick && (\r\n <button\r\n className=\"lg:hidden w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-foreground hover:bg-muted/30 transition-colors cursor-pointer\"\r\n onClick={onMobileMenuClick}\r\n >\r\n <Menu size={16} />\r\n </button>\r\n )}\r\n\r\n {/* Brand */}\r\n {brand && (\r\n <>\r\n {typeof brand.logo === \"string\" ? (\r\n <img\r\n src={brand.logo}\r\n alt={brand.name}\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] flex-shrink-0 object-cover\"\r\n />\r\n ) : brand.logo ? (\r\n <div className=\"w-8 h-8 rounded-[var(--radius-sm)] overflow-hidden flex-shrink-0\">\r\n {brand.logo}\r\n </div>\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] bg-primary flex items-center justify-center text-primary-foreground flex-shrink-0\"\r\n style={btnStyle}\r\n >\r\n {brand.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Breadcrumbs */}\r\n {breadcrumbs && breadcrumbs.length > 0 && (\r\n <nav className=\"hidden sm:flex items-center gap-1.5 text-muted-foreground\" style={btnStyle}>\r\n {breadcrumbs.map((item, i) => (\r\n <React.Fragment key={i}>\r\n {i > 0 && <ChevronRight size={12} />}\r\n {item.href || onBreadcrumbClick ? (\r\n <span\r\n className={`cursor-pointer ${\r\n i === breadcrumbs.length - 1\r\n ? \"text-foreground\"\r\n : \"hover:text-foreground\"\r\n }`}\r\n onClick={() => onBreadcrumbClick?.(item, i)}\r\n >\r\n {item.label}\r\n </span>\r\n ) : (\r\n <span\r\n className={\r\n i === breadcrumbs.length - 1 ? \"text-foreground\" : \"\"\r\n }\r\n >\r\n {item.label}\r\n </span>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </nav>\r\n )}\r\n\r\n {/* Spacer */}\r\n <div className=\"flex-1\" />\r\n\r\n {/* Search */}\r\n {showSearch && (\r\n <div\r\n className=\"hidden md:flex items-center gap-2 px-3 h-8 rounded-[var(--radius)] border border-border bg-muted/20 text-muted-foreground w-56 cursor-pointer hover:border-primary/40 transition-colors\"\r\n onClick={onSearchClick}\r\n >\r\n <Search size={14} />\r\n <span style={btnStyle}>{searchPlaceholder}</span>\r\n </div>\r\n )}\r\n\r\n {/* Custom actions */}\r\n {actions}\r\n\r\n {/* Notifications */}\r\n {onNotificationClick && (\r\n <button\r\n className=\"relative w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-muted/30 transition-colors cursor-pointer\"\r\n onClick={onNotificationClick}\r\n >\r\n <Bell size={16} />\r\n {notificationCount !== undefined && notificationCount > 0 && (\r\n <span className=\"absolute top-1 right-1 w-2 h-2 rounded-full bg-destructive\" />\r\n )}\r\n </button>\r\n )}\r\n\r\n {/* User avatar */}\r\n {user && (\r\n <div\r\n className=\"cursor-pointer\"\r\n onClick={onUserClick}\r\n >\r\n {user.avatar ? (\r\n <img\r\n src={user.avatar}\r\n alt={user.name}\r\n className=\"w-8 h-8 rounded-full object-cover\"\r\n />\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center\"\r\n style={btnStyle}\r\n >\r\n {initials}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTopNavbar.displayName = \"TopNavbar\";\r\n","import React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronLeft, ChevronsRight, ChevronsLeft, Search } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface TransferItem {\r\n id: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface TransferListProps {\r\n sourceTitle?: string;\r\n targetTitle?: string;\r\n items: TransferItem[];\r\n defaultTarget?: string[];\r\n searchable?: boolean;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Sub-component: ListBox ─────────────────────────────────────────────────── */\r\n\r\nfunction ListBox({\r\n title,\r\n items,\r\n selected,\r\n onToggle,\r\n search,\r\n onSearch,\r\n searchable,\r\n}: {\r\n title: string;\r\n items: TransferItem[];\r\n selected: Set<string>;\r\n onToggle: (id: string) => void;\r\n search: string;\r\n onSearch: (v: string) => void;\r\n searchable?: boolean;\r\n}) {\r\n return (\r\n <div className=\"flex-1 min-w-[180px] rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-3 py-2.5 border-b border-border bg-muted/30 flex items-center justify-between\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {items.length} items\r\n </span>\r\n </div>\r\n {searchable && (\r\n <div className=\"px-3 py-2 border-b border-border flex items-center gap-2\">\r\n <Search size={12} className=\"text-muted-foreground\" />\r\n <input\r\n value={search}\r\n onChange={(e) => onSearch(e.target.value)}\r\n placeholder=\"Search\\u2026\"\r\n className=\"flex-1 bg-transparent outline-none text-foreground placeholder:text-muted-foreground\"\r\n style={smallLabel}\r\n />\r\n </div>\r\n )}\r\n <div className=\"max-h-[240px] overflow-y-auto py-1\">\r\n {items.length === 0 && (\r\n <div\r\n className=\"px-3 py-6 text-center text-muted-foreground\"\r\n style={smallLabel}\r\n >\r\n No items\r\n </div>\r\n )}\r\n {items.map((item) => (\r\n <button\r\n key={item.id}\r\n onClick={() => !item.disabled && onToggle(item.id)}\r\n className={`w-full flex items-center gap-2 px-3 py-1.5 transition-colors cursor-pointer\r\n ${selected.has(item.id) ? \"bg-primary/10\" : \"hover:bg-accent\"}\r\n ${item.disabled ? \"opacity-40 pointer-events-none\" : \"\"}`}\r\n style={fontLabel}\r\n >\r\n <span\r\n className={`w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center flex-shrink-0\r\n ${selected.has(item.id) ? \"bg-primary border-primary\" : \"border-border\"}`}\r\n >\r\n {selected.has(item.id) && (\r\n <span className=\"w-2 h-2 rounded-[1px] bg-primary-foreground\" />\r\n )}\r\n </span>\r\n <span className=\"text-foreground truncate\">{item.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function TransferList({\r\n sourceTitle = \"Available\",\r\n targetTitle = \"Selected\",\r\n items,\r\n defaultTarget = [],\r\n searchable,\r\n}: TransferListProps) {\r\n const [target, setTarget] = useState<Set<string>>(\r\n new Set(defaultTarget)\r\n );\r\n const [sourceSelected, setSourceSelected] = useState<Set<string>>(\r\n new Set()\r\n );\r\n const [targetSelected, setTargetSelected] = useState<Set<string>>(\r\n new Set()\r\n );\r\n const [sourceSearch, setSourceSearch] = useState(\"\");\r\n const [targetSearch, setTargetSearch] = useState(\"\");\r\n\r\n const source = items.filter((i) => !target.has(i.id));\r\n const targetItems = items.filter((i) => target.has(i.id));\r\n\r\n const filteredSource = sourceSearch\r\n ? source.filter((i) =>\r\n i.label.toLowerCase().includes(sourceSearch.toLowerCase())\r\n )\r\n : source;\r\n const filteredTarget = targetSearch\r\n ? targetItems.filter((i) =>\r\n i.label.toLowerCase().includes(targetSearch.toLowerCase())\r\n )\r\n : targetItems;\r\n\r\n const moveRight = () => {\r\n setTarget((prev) => {\r\n const n = new Set(prev);\r\n sourceSelected.forEach((id) => n.add(id));\r\n return n;\r\n });\r\n setSourceSelected(new Set());\r\n };\r\n const moveLeft = () => {\r\n setTarget((prev) => {\r\n const n = new Set(prev);\r\n targetSelected.forEach((id) => n.delete(id));\r\n return n;\r\n });\r\n setTargetSelected(new Set());\r\n };\r\n const moveAllRight = () => {\r\n setTarget(new Set(items.filter((i) => !i.disabled).map((i) => i.id)));\r\n setSourceSelected(new Set());\r\n };\r\n const moveAllLeft = () => {\r\n setTarget(new Set());\r\n setTargetSelected(new Set());\r\n };\r\n\r\n const toggleSelect = (\r\n id: string,\r\n set: Set<string>,\r\n setter: (s: Set<string>) => void\r\n ) => {\r\n const n = new Set(set);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n setter(n);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-stretch gap-3 flex-wrap\">\r\n <ListBox\r\n title={sourceTitle}\r\n items={filteredSource}\r\n selected={sourceSelected}\r\n onToggle={(id) =>\r\n toggleSelect(id, sourceSelected, setSourceSelected)\r\n }\r\n search={sourceSearch}\r\n onSearch={setSourceSearch}\r\n searchable={searchable}\r\n />\r\n\r\n <div className=\"flex flex-col items-center justify-center gap-1.5 py-4\">\r\n <button\r\n onClick={moveAllRight}\r\n disabled={source.length === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronsRight size={14} />\r\n </button>\r\n <button\r\n onClick={moveRight}\r\n disabled={sourceSelected.size === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronRight size={14} />\r\n </button>\r\n <button\r\n onClick={moveLeft}\r\n disabled={targetSelected.size === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronLeft size={14} />\r\n </button>\r\n <button\r\n onClick={moveAllLeft}\r\n disabled={targetItems.length === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronsLeft size={14} />\r\n </button>\r\n </div>\r\n\r\n <ListBox\r\n title={targetTitle}\r\n items={filteredTarget}\r\n selected={targetSelected}\r\n onToggle={(id) =>\r\n toggleSelect(id, targetSelected, setTargetSelected)\r\n }\r\n search={targetSearch}\r\n onSearch={setTargetSearch}\r\n searchable={searchable}\r\n />\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronDown, Folder, FolderOpen, File } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface TreeNode {\r\n id: string;\r\n label: string;\r\n icon?: React.ReactNode;\r\n children?: TreeNode[];\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface TreeProps {\r\n data: TreeNode[];\r\n selectable?: boolean;\r\n showLines?: boolean;\r\n defaultExpanded?: string[];\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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/* ─── Sub-component: TreeItem ────────────────────────────────────────────────── */\r\n\r\nfunction TreeItem({\r\n node,\r\n level,\r\n expanded,\r\n selected,\r\n onToggle,\r\n onSelect,\r\n selectable,\r\n showLines,\r\n}: {\r\n node: TreeNode;\r\n level: number;\r\n expanded: Set<string>;\r\n selected: Set<string>;\r\n onToggle: (id: string) => void;\r\n onSelect: (id: string) => void;\r\n selectable?: boolean;\r\n showLines?: boolean;\r\n}) {\r\n const hasChildren = node.children && node.children.length > 0;\r\n const isExpanded = expanded.has(node.id);\r\n const isSelected = selected.has(node.id);\r\n\r\n const defaultIcon = hasChildren\r\n ? isExpanded\r\n ? <FolderOpen size={14} className=\"text-chart-5\" />\r\n : <Folder size={14} className=\"text-chart-5\" />\r\n : <File size={14} className=\"text-muted-foreground\" />;\r\n\r\n return (\r\n <div>\r\n <div\r\n className={`flex items-center gap-1.5 py-1 px-2 rounded-[var(--radius-sm)] transition-colors\r\n ${node.disabled ? \"opacity-40 pointer-events-none\" : \"cursor-pointer hover:bg-accent\"}\r\n ${isSelected ? \"bg-primary/10 text-primary\" : \"text-foreground\"}`}\r\n style={{ paddingLeft: `${level * 20 + 8}px`, ...fontLabel }}\r\n onClick={() => {\r\n if (hasChildren) onToggle(node.id);\r\n if (selectable) onSelect(node.id);\r\n }}\r\n >\r\n {hasChildren ? (\r\n <span className=\"w-4 h-4 flex items-center justify-center flex-shrink-0\">\r\n {isExpanded ? <ChevronDown size={12} /> : <ChevronRight size={12} />}\r\n </span>\r\n ) : (\r\n <span className=\"w-4\" />\r\n )}\r\n {selectable && (\r\n <span\r\n className={`w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center flex-shrink-0 ${\r\n isSelected ? \"bg-primary border-primary\" : \"border-border\"\r\n }`}\r\n >\r\n {isSelected && (\r\n <span className=\"w-2 h-2 rounded-[1px] bg-primary-foreground\" />\r\n )}\r\n </span>\r\n )}\r\n <span className=\"flex-shrink-0\">{node.icon || defaultIcon}</span>\r\n <span className=\"truncate\">{node.label}</span>\r\n </div>\r\n {hasChildren && isExpanded && (\r\n <div className={showLines ? \"border-l border-border ml-[22px]\" : \"\"}>\r\n {node.children!.map((child) => (\r\n <TreeItem\r\n key={child.id}\r\n node={child}\r\n level={level + 1}\r\n expanded={expanded}\r\n selected={selected}\r\n onToggle={onToggle}\r\n onSelect={onSelect}\r\n selectable={selectable}\r\n showLines={showLines}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Tree({\r\n data,\r\n selectable,\r\n showLines,\r\n defaultExpanded,\r\n}: TreeProps) {\r\n const [expanded, setExpanded] = useState<Set<string>>(\r\n new Set(defaultExpanded || [])\r\n );\r\n const [selected, setSelected] = useState<Set<string>>(new Set());\r\n\r\n const toggle = (id: string) =>\r\n setExpanded((prev) => {\r\n const n = new Set(prev);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n return n;\r\n });\r\n const select = (id: string) =>\r\n setSelected((prev) => {\r\n const n = new Set(prev);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n return n;\r\n });\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-md)] border border-border bg-card py-1\">\r\n {data.map((node) => (\r\n <TreeItem\r\n key={node.id}\r\n node={node}\r\n level={0}\r\n expanded={expanded}\r\n selected={selected}\r\n onToggle={toggle}\r\n onSelect={select}\r\n selectable={selectable}\r\n showLines={showLines}\r\n />\r\n ))}\r\n </div>\r\n );\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","ArrowDownRight","ArrowUpRight","BellOff","Bell","Calendar","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ChevronsLeft","ChevronsRight","ChevronsUpDown","CircleAlert","CircleCheck","CircleX","Circle","Clock","Copy","Dot","Ellipsis","ExternalLink","EyeOff","Eye","FileText","File","Film","FolderOpen","Folder","Heart","Image","Inbox","Info","LoaderCircle","Menu","Minus","Plus","RotateCw","Search","Slash","Star","ThumbsUp","TriangleAlert","Upload","X","ZoomIn","ZoomOut","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","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","i","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","fontLabelBold","fontLabel","AccordionItem","onToggle","Accordion","type","items","defaultOpen","internalSingle","setInternalSingle","internalMultiple","setInternalMultiple","isControlled","isOpen","toggle","arr","prev","n","colors","statusSizes","statusColors","Avatar","src","status","initials","w","bgColor","AvatarGroup","max","extra","child","textStyles","Breadcrumb","separator","maxItems","sep","pad","textStyle","displayItems","first","last","elevationMap","Card","hover","elevation","CardHeader","CardBody","CardFooter","DEFAULT_PRESETS","hexToRgb","hex","g","hexToHsl","h","smallLabel","mono","ColorPicker","presets","showInput","showFormats","copied","setCopied","swatchSize","displayPresets","copy","text","c","f","Divider","orientation","dashed","spacing","spacings","style","Drawer","side","widths","heights","sideClasses","stateStyles","Dropdown","options","controlledValue","searchable","multiple","maxSelections","grouped","showSelectAll","tagLimit","creatable","onCreateOption","createLabel","emptyState","searchDebounce","searchLoading","customRenderOption","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","triggerRef","listRef","searchRef","panelPos","setPanelPos","updatePos","rect","handleSearchChange","query","filteredOptions","o","groupedOptions","groups","selectedLabels","optValue","allSelectableValues","handleSelectAll","handleCreate","showCreateOption","empty","flatOptions","handler","target","renderTags","labels","limit","remaining","l","renderOptionNode","globalIdx","createPortal","group","node","EmptyState","secondaryAction","formatBytes","bytes","getFileIcon","FileList","files","FileUpload","accept","maxSize","setFiles","dragOver","setDragOver","addFiles","fileList","newFiles","prog","iv","p","remove","ImagePreview","images","initialIndex","setIdx","zoom","setZoom","rotation","setRotation","current","zoomIn","z","zoomOut","rotate","r","img","shortcutStyle","SubMenu","parentRect","pos","setPos","top","left","MenuItemRow","subOpen","setSubOpen","rowRef","hoverTimeout","hasChildren","menuRef","menuRect","Notification","closable","avatar","time","read","icons","NotificationCenter","notifications","setNotifications","unread","Popover","trigger","placement","onOpenChange","internalOpen","setInternalOpen","ProgressBar","showValue","sizes","pct","Rating","readOnly","setHover","iconSize","gap","IconComp","activeColor","filled","Sidebar","brand","activeItem","onNavigate","collapsed","onCollapsedChange","Skeleton","width","height","animate","SkeletonCard","SkeletonTable","SkeletonList","sizeClasses","Spinner","valueStyles","Statistic","trend","trendLabel","valueStyle","trendColor","TrendIcon","StatCard","iconBg","Stepper","steps","onStepClick","step","done","thumbPx","Switch","checked","tp","colorClasses","sizePadding","Tag","cls","TagInput","tags","maxTags","input","setInput","add","Timeline","dotSize","iconSz","statusColor","isAlt","placementClasses","Tooltip","content","show","setShow","TopNavbar","breadcrumbs","actions","user","showSearch","searchPlaceholder","onSearchClick","notificationCount","onNotificationClick","onMobileMenuClick","onUserClick","onBreadcrumbClick","ListBox","TransferList","sourceTitle","targetTitle","defaultTarget","setTarget","sourceSelected","setSourceSelected","targetSelected","setTargetSelected","sourceSearch","setSourceSearch","targetSearch","setTargetSearch","source","targetItems","filteredSource","filteredTarget","moveRight","moveLeft","moveAllRight","moveAllLeft","toggleSelect","set","setter","TreeItem","level","expanded","onSelect","showLines","isExpanded","defaultIcon","Tree","defaultExpanded","setExpanded","select"],"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,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]}
|
|
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/arrow-down-right.js","../node_modules/lucide-react/dist/esm/icons/arrow-up-right.js","../node_modules/lucide-react/dist/esm/icons/bell-off.js","../node_modules/lucide-react/dist/esm/icons/bell.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/circle.js","../node_modules/lucide-react/dist/esm/icons/clock.js","../node_modules/lucide-react/dist/esm/icons/copy.js","../node_modules/lucide-react/dist/esm/icons/dot.js","../node_modules/lucide-react/dist/esm/icons/ellipsis.js","../node_modules/lucide-react/dist/esm/icons/external-link.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/file-text.js","../node_modules/lucide-react/dist/esm/icons/file.js","../node_modules/lucide-react/dist/esm/icons/film.js","../node_modules/lucide-react/dist/esm/icons/folder-open.js","../node_modules/lucide-react/dist/esm/icons/folder.js","../node_modules/lucide-react/dist/esm/icons/heart.js","../node_modules/lucide-react/dist/esm/icons/image.js","../node_modules/lucide-react/dist/esm/icons/inbox.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/menu.js","../node_modules/lucide-react/dist/esm/icons/minus.js","../node_modules/lucide-react/dist/esm/icons/plus.js","../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../node_modules/lucide-react/dist/esm/icons/search.js","../node_modules/lucide-react/dist/esm/icons/slash.js","../node_modules/lucide-react/dist/esm/icons/star.js","../node_modules/lucide-react/dist/esm/icons/thumbs-up.js","../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../node_modules/lucide-react/dist/esm/icons/upload.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zoom-in.js","../node_modules/lucide-react/dist/esm/icons/zoom-out.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","../src/lib/components/ds-accordion.tsx","../src/lib/components/ds-avatar.tsx","../src/lib/components/ds-breadcrumb.tsx","../src/lib/components/ds-card.tsx","../src/lib/components/ds-colorpicker.tsx","../src/lib/components/ds-divider.tsx","../src/lib/components/ds-drawer.tsx","../src/lib/components/ds-dropdown.tsx","../src/lib/components/ds-emptystate.tsx","../src/lib/components/ds-fileupload.tsx","../src/lib/components/ds-imagepreview.tsx","../src/lib/components/ds-menu.tsx","../src/lib/components/ds-notification.tsx","../src/lib/components/ds-popover.tsx","../src/lib/components/ds-progressbar.tsx","../src/lib/components/ds-rating.tsx","../src/lib/components/ds-sidebar.tsx","../src/lib/components/ds-skeleton.tsx","../src/lib/components/ds-spinner.tsx","../src/lib/components/ds-statistic.tsx","../src/lib/components/ds-stepper.tsx","../src/lib/components/ds-switch.tsx","../src/lib/components/ds-tag.tsx","../src/lib/components/ds-taginput.tsx","../src/lib/components/ds-timeline.tsx","../src/lib/components/ds-tooltip.tsx","../src/lib/components/ds-topnavbar.tsx","../src/lib/components/ds-transferlist.tsx","../src/lib/components/ds-tree.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: \"m7 7 10 10\", key: \"1fmybs\" }],\n [\"path\", { d: \"M17 7v10H7\", key: \"6fjiku\" }]\n];\nconst ArrowDownRight = createLucideIcon(\"arrow-down-right\", __iconNode);\n\nexport { __iconNode, ArrowDownRight as default };\n//# sourceMappingURL=arrow-down-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 7h10v10\", key: \"1tivn9\" }],\n [\"path\", { d: \"M7 17 17 7\", key: \"1vkiza\" }]\n];\nconst ArrowUpRight = createLucideIcon(\"arrow-up-right\", __iconNode);\n\nexport { __iconNode, ArrowUpRight as default };\n//# sourceMappingURL=arrow-up-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: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742\",\n key: \"178tsu\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }],\n [\"path\", { d: \"M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\", key: \"1hqiys\" }]\n];\nconst BellOff = createLucideIcon(\"bell-off\", __iconNode);\n\nexport { __iconNode, BellOff as default };\n//# sourceMappingURL=bell-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 [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n];\nconst Bell = createLucideIcon(\"bell\", __iconNode);\n\nexport { __iconNode, Bell as default };\n//# sourceMappingURL=bell.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 = [[\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]];\nconst Circle = createLucideIcon(\"circle\", __iconNode);\n\nexport { __iconNode, Circle as default };\n//# sourceMappingURL=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 = [\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 [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.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 = [[\"circle\", { cx: \"12.1\", cy: \"12.1\", r: \"1\", key: \"18d7e5\" }]];\nconst Dot = createLucideIcon(\"dot\", __iconNode);\n\nexport { __iconNode, Dot as default };\n//# sourceMappingURL=dot.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 [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.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 [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.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: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n];\nconst File = createLucideIcon(\"file\", __iconNode);\n\nexport { __iconNode, File as default };\n//# sourceMappingURL=file.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M7 3v18\", key: \"bbkbws\" }],\n [\"path\", { d: \"M3 7.5h4\", key: \"zfgn84\" }],\n [\"path\", { d: \"M3 12h18\", key: \"1i2n21\" }],\n [\"path\", { d: \"M3 16.5h4\", key: \"1230mu\" }],\n [\"path\", { d: \"M17 3v18\", key: \"in4fa5\" }],\n [\"path\", { d: \"M17 7.5h4\", key: \"myr1c1\" }],\n [\"path\", { d: \"M17 16.5h4\", key: \"go4c1d\" }]\n];\nconst Film = createLucideIcon(\"film\", __iconNode);\n\nexport { __iconNode, Film as default };\n//# sourceMappingURL=film.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: \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n];\nconst FolderOpen = createLucideIcon(\"folder-open\", __iconNode);\n\nexport { __iconNode, FolderOpen as default };\n//# sourceMappingURL=folder-open.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: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.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: \"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\",\n key: \"c3ymky\"\n }\n ]\n];\nconst Heart = createLucideIcon(\"heart\", __iconNode);\n\nexport { __iconNode, Heart as default };\n//# sourceMappingURL=heart.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 [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.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 [\"polyline\", { points: \"22 12 16 12 14 15 10 15 8 12 2 12\", key: \"o97t9d\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ]\n];\nconst Inbox = createLucideIcon(\"inbox\", __iconNode);\n\nexport { __iconNode, Inbox as default };\n//# sourceMappingURL=inbox.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 = [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"12\", y2: \"12\", key: \"1e0a9i\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"6\", y2: \"6\", key: \"1owob3\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"18\", y2: \"18\", key: \"yk5zj1\" }]\n];\nconst Menu = createLucideIcon(\"menu\", __iconNode);\n\nexport { __iconNode, Menu as default };\n//# sourceMappingURL=menu.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 [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.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: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n];\nconst RotateCw = createLucideIcon(\"rotate-cw\", __iconNode);\n\nexport { __iconNode, RotateCw as default };\n//# sourceMappingURL=rotate-cw.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 = [[\"path\", { d: \"M22 2 2 22\", key: \"y4kqgn\" }]];\nconst Slash = createLucideIcon(\"slash\", __iconNode);\n\nexport { __iconNode, Slash as default };\n//# sourceMappingURL=slash.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: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n];\nconst Star = createLucideIcon(\"star\", __iconNode);\n\nexport { __iconNode, Star as default };\n//# sourceMappingURL=star.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 10v12\", key: \"1qc93n\" }],\n [\n \"path\",\n {\n d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\",\n key: \"emmmcr\"\n }\n ]\n];\nconst ThumbsUp = createLucideIcon(\"thumbs-up\", __iconNode);\n\nexport { __iconNode, ThumbsUp as default };\n//# sourceMappingURL=thumbs-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 [\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: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"17 8 12 3 7 8\", key: \"t8dd8p\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"3\", y2: \"15\", key: \"widbto\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.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","/**\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 [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomIn = createLucideIcon(\"zoom-in\", __iconNode);\n\nexport { __iconNode, ZoomIn as default };\n//# sourceMappingURL=zoom-in.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 [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomOut = createLucideIcon(\"zoom-out\", __iconNode);\n\nexport { __iconNode, ZoomOut as default };\n//# sourceMappingURL=zoom-out.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: \"var(--text-button)\", 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: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" },\r\n xl: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-caption)\", 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}","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-button)\", fontSize: \"var(--text-button)\", 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\";","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: \"var(--text-label)\", 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}","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: \"var(--text-button)\",\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: \"var(--text-button)\",\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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", 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-button)\", fontSize: \"var(--text-button)\", 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-caption)\", fontSize: \"var(--text-caption)\", 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}","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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", 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-button)\", fontSize: \"var(--text-button)\", 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-caption)\", fontSize: \"var(--text-caption)\", 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-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" }}>\r\n {error}\r\n </span>\r\n )}\r\n </fieldset>\r\n </RadioGroupCtx.Provider>\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: \"var(--text-label)\",\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-caption)\",\r\n fontSize: \"var(--text-caption)\",\r\n fontWeight: \"var(--weight-caption)\",\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-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\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-button)\", fontSize: \"var(--text-button)\", 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}","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: \"var(--text-button)\",\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: \"var(--text-label)\",\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}","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\", icon: 14, style: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", 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-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" } },\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>>(undefined);\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-button)\", fontSize: \"var(--text-button)\", 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: \"var(--text-button)\", 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: \"var(--text-label)\", 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: \"var(--text-button)\", 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}","import React, { useState } from \"react\";\r\nimport { ChevronDown } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface AccordionItemProps {\r\n /** Header text */\r\n title: string;\r\n /** Content to display when expanded */\r\n children: React.ReactNode;\r\n /** Whether this item is open */\r\n open: boolean;\r\n /** Toggle callback */\r\n onToggle: () => void;\r\n /** Optional leading icon */\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport type AccordionType = \"single\" | \"multiple\";\r\n\r\nexport interface AccordionProps {\r\n /** Expand behavior */\r\n type?: AccordionType;\r\n /** Item definitions */\r\n items: { id: string; title: string; content: React.ReactNode; icon?: React.ReactNode }[];\r\n /** Initially open item(s) */\r\n defaultOpen?: string | string[];\r\n /** Controlled open state (for single: string | null, for multiple: string[]) */\r\n value?: string | null | string[];\r\n /** Change callback */\r\n onChange?: (value: string | null | string[]) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst fontLabel: 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// ─── AccordionItem ───────────────────────────────────────────────────────────\r\n\r\nexport function AccordionItem({ title, children, open, onToggle, icon }: AccordionItemProps) {\r\n return (\r\n <div className=\"border-b border-border last:border-b-0\">\r\n <button\r\n onClick={onToggle}\r\n className=\"w-full flex items-center gap-3 px-4 py-3 text-left hover:bg-muted/20 transition-colors cursor-pointer\"\r\n >\r\n {icon && <span className=\"text-primary flex-shrink-0\">{icon}</span>}\r\n <span className=\"flex-1 text-foreground\" style={fontLabelBold}>{title}</span>\r\n <ChevronDown\r\n size={16}\r\n className={`text-muted-foreground transition-transform ${open ? \"rotate-180\" : \"\"}`}\r\n />\r\n </button>\r\n <div className={`overflow-hidden transition-all ${open ? \"max-h-96 opacity-100\" : \"max-h-0 opacity-0\"}`}>\r\n <div className=\"px-4 pb-4 text-muted-foreground\" style={fontLabel}>{children}</div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Accordion (managed) ─────────────────────────────────────────────────────\r\n\r\nexport function Accordion({\r\n type = \"single\",\r\n items,\r\n defaultOpen,\r\n value,\r\n onChange,\r\n className = \"\",\r\n}: AccordionProps) {\r\n // Internal state for uncontrolled usage\r\n const [internalSingle, setInternalSingle] = useState<string | null>(\r\n typeof defaultOpen === \"string\" ? defaultOpen : null\r\n );\r\n const [internalMultiple, setInternalMultiple] = useState<Set<string>>(\r\n Array.isArray(defaultOpen) ? new Set(defaultOpen) : new Set()\r\n );\r\n\r\n const isControlled = value !== undefined;\r\n\r\n const isOpen = (id: string): boolean => {\r\n if (isControlled) {\r\n if (type === \"single\") return value === id;\r\n return Array.isArray(value) && value.includes(id);\r\n }\r\n if (type === \"single\") return internalSingle === id;\r\n return internalMultiple.has(id);\r\n };\r\n\r\n const toggle = (id: string) => {\r\n if (type === \"single\") {\r\n const next = (isControlled ? value === id : internalSingle === id) ? null : id;\r\n if (!isControlled) setInternalSingle(next);\r\n onChange?.(next);\r\n } else {\r\n if (isControlled) {\r\n const arr = Array.isArray(value) ? value : [];\r\n const next = arr.includes(id) ? arr.filter((v) => v !== id) : [...arr, id];\r\n onChange?.(next);\r\n } else {\r\n setInternalMultiple((prev) => {\r\n const n = new Set(prev);\r\n n.has(id) ? n.delete(id) : n.add(id);\r\n return n;\r\n });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div className={`rounded-[var(--radius)] border border-border overflow-hidden ${className}`}>\r\n {items.map((item) => (\r\n <AccordionItem\r\n key={item.id}\r\n title={item.title}\r\n open={isOpen(item.id)}\r\n onToggle={() => toggle(item.id)}\r\n icon={item.icon}\r\n >\r\n {item.content}\r\n </AccordionItem>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nAccordion.displayName = \"Accordion\";\r\nAccordionItem.displayName = \"AccordionItem\";\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\r\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\r\n\r\nexport interface AvatarProps {\r\n /** Image URL */\r\n src?: string;\r\n /** Full name (used for initials fallback) */\r\n name?: string;\r\n /** Avatar size */\r\n size?: AvatarSize;\r\n /** Status indicator */\r\n status?: AvatarStatus;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\nexport interface AvatarGroupProps {\r\n /** Avatar elements */\r\n children: React.ReactNode;\r\n /** Maximum number of avatars to display before showing +N */\r\n max?: number;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst colors = [\"bg-primary\", \"bg-chart-2\", \"bg-chart-5\", \"bg-destructive\", \"bg-secondary\"];\r\n\r\nconst sizeMap: Record<AvatarSize, { box: string; font: React.CSSProperties }> = {\r\n xs: { box: \"w-6 h-6\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n sm: { box: \"w-8 h-8\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n md: { box: \"w-10 h-10\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n lg: { box: \"w-14 h-14\", font: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" } },\r\n xl: { box: \"w-20 h-20\", font: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-button)\" } },\r\n};\r\n\r\nconst statusSizes: Record<AvatarSize, string> = {\r\n xs: \"w-2 h-2\",\r\n sm: \"w-2.5 h-2.5\",\r\n md: \"w-3 h-3\",\r\n lg: \"w-3.5 h-3.5\",\r\n xl: \"w-4 h-4\",\r\n};\r\n\r\nconst statusColors: Record<AvatarStatus, string> = {\r\n online: \"bg-chart-2\",\r\n offline: \"bg-secondary\",\r\n busy: \"bg-destructive\",\r\n away: \"bg-chart-5\",\r\n};\r\n\r\nconst btnStyle: 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// ─── Avatar ──────────────────────────────────────────────────────────────────\r\n\r\nexport function Avatar({ src, name, size = \"md\", status, className = \"\" }: AvatarProps) {\r\n const s = sizeMap[size];\r\n const initials = name\r\n ? name.split(\" \").map((w) => w[0]).join(\"\").slice(0, 2).toUpperCase()\r\n : \"?\";\r\n const bgColor = name ? colors[name.length % colors.length] : \"bg-muted\";\r\n\r\n return (\r\n <div className={`relative inline-flex ${className}`}>\r\n {src ? (\r\n <img\r\n src={src}\r\n alt={name || \"avatar\"}\r\n className={`${s.box} rounded-full object-cover border-2 border-card`}\r\n />\r\n ) : (\r\n <div\r\n className={`${s.box} rounded-full ${bgColor} text-white flex items-center justify-center border-2 border-card`}\r\n style={s.font}\r\n >\r\n {initials}\r\n </div>\r\n )}\r\n {status && (\r\n <span\r\n className={`absolute bottom-0 right-0 ${statusSizes[size]} ${statusColors[status]} rounded-full border-2 border-card`}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── AvatarGroup ─────────────────────────────────────────────────────────────\r\n\r\nexport function AvatarGroup({ children, max, className = \"\" }: AvatarGroupProps) {\r\n const items = React.Children.toArray(children);\r\n const visible = max ? items.slice(0, max) : items;\r\n const extra = max && items.length > max ? items.length - max : 0;\r\n\r\n return (\r\n <div className={`flex -space-x-2 ${className}`}>\r\n {visible.map((child, i) => (\r\n <div key={i} className=\"relative\" style={{ zIndex: visible.length - i }}>\r\n {child}\r\n </div>\r\n ))}\r\n {extra > 0 && (\r\n <div\r\n className=\"relative w-10 h-10 rounded-full bg-muted text-foreground flex items-center justify-center border-2 border-card\"\r\n style={{ ...btnStyle, zIndex: 0 }}\r\n >\r\n +{extra}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nAvatar.displayName = \"Avatar\";\r\nAvatarGroup.displayName = \"AvatarGroup\";\r\n","import React from \"react\";\r\nimport { ChevronRight, Slash, Dot, MoreHorizontal } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n href?: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport type BreadcrumbSeparator = \"chevron\" | \"slash\" | \"dot\";\r\nexport type BreadcrumbSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface BreadcrumbProps {\r\n items: BreadcrumbItem[];\r\n separator?: BreadcrumbSeparator;\r\n size?: BreadcrumbSize;\r\n maxItems?: number;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst textStyles: Record<BreadcrumbSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n md: fontLabel,\r\n lg: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-label)\",\r\n },\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Breadcrumb({\r\n items,\r\n separator = \"chevron\",\r\n size = \"md\",\r\n maxItems,\r\n}: BreadcrumbProps) {\r\n const sep =\r\n separator === \"slash\" ? (\r\n <Slash size={12} className=\"text-muted-foreground\" />\r\n ) : separator === \"dot\" ? (\r\n <Dot size={16} className=\"text-muted-foreground\" />\r\n ) : (\r\n <ChevronRight size={12} className=\"text-muted-foreground\" />\r\n );\r\n\r\n const pad =\r\n size === \"sm\" ? \"gap-1\" : size === \"lg\" ? \"gap-2.5\" : \"gap-1.5\";\r\n const textStyle = textStyles[size];\r\n\r\n let displayItems = items;\r\n if (maxItems && items.length > maxItems) {\r\n const first = items.slice(0, 1);\r\n const last = items.slice(-(maxItems - 1));\r\n displayItems = [...first, { label: \"\\u2026\" }, ...last];\r\n }\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\">\r\n <ol className={`flex items-center flex-wrap ${pad}`}>\r\n {displayItems.map((item, i) => (\r\n <li key={i} className=\"flex items-center gap-1.5\">\r\n {i > 0 && <span className=\"mx-0.5\">{sep}</span>}\r\n {item.label === \"\\u2026\" ? (\r\n <span className=\"w-6 h-6 flex items-center justify-center rounded-[var(--radius-sm)] text-muted-foreground hover:bg-accent cursor-pointer\">\r\n <MoreHorizontal size={14} />\r\n </span>\r\n ) : i === displayItems.length - 1 ? (\r\n <span\r\n className=\"inline-flex items-center gap-1.5 text-foreground\"\r\n style={{\r\n ...textStyle,\r\n fontWeight: \"var(--weight-button)\",\r\n }}\r\n >\r\n {item.icon}\r\n {item.label}\r\n </span>\r\n ) : (\r\n <a\r\n href={item.href || \"#\"}\r\n onClick={(e) => e.preventDefault()}\r\n className=\"inline-flex items-center gap-1.5 text-muted-foreground hover:text-foreground transition-colors\"\r\n style={textStyle}\r\n >\r\n {item.icon}\r\n {item.label}\r\n </a>\r\n )}\r\n </li>\r\n ))}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface CardProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n hover?: boolean;\r\n elevation?: \"none\" | \"sm\" | \"md\" | \"lg\";\r\n}\r\n\r\nconst elevationMap: Record<string, string> = {\r\n none: \"\",\r\n sm: \"shadow-sm\",\r\n md: \"shadow-md\",\r\n lg: \"shadow-lg\",\r\n};\r\n\r\n// ─── Card ────────────────────────────────────────────────────────────────────\r\n\r\nexport function Card({ children, className, hover, elevation = \"none\" }: CardProps) {\r\n return (\r\n <div\r\n className={`rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden ${elevationMap[elevation] ?? \"\"} ${hover ? \"hover:border-primary/40 hover:shadow-md transition-all cursor-pointer\" : \"\"} ${className ?? \"\"}`}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nCard.displayName = \"Card\";\r\n\r\n// ─── CardHeader ──────────────────────────────────────────────────────────────\r\n\r\nexport interface CardHeaderProps {\r\n children: React.ReactNode;\r\n action?: React.ReactNode;\r\n}\r\n\r\nexport function CardHeader({ children, action }: CardHeaderProps) {\r\n return (\r\n <div className=\"px-5 py-4 border-b border-border flex items-center justify-between\">\r\n <div>{children}</div>\r\n {action}\r\n </div>\r\n );\r\n}\r\n\r\nCardHeader.displayName = \"CardHeader\";\r\n\r\n// ─── CardBody ────────────────────────────────────────────────────────────────\r\n\r\nexport function CardBody({ children }: { children: React.ReactNode }) {\r\n return <div className=\"px-5 py-4\">{children}</div>;\r\n}\r\n\r\nCardBody.displayName = \"CardBody\";\r\n\r\n// ─── CardFooter ──────────────────────────────────────────────────────────────\r\n\r\nexport function CardFooter({ children }: { children: React.ReactNode }) {\r\n return (\r\n <div className=\"px-5 py-3 border-t border-border bg-muted/10 flex items-center gap-2\">\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\nCardFooter.displayName = \"CardFooter\";\r\n","import React, { useState, useRef } from \"react\";\r\nimport { Copy, Check } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type ColorPickerSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface ColorPickerProps {\r\n value: string;\r\n onChange: (v: string) => void;\r\n label?: string;\r\n presets?: string[];\r\n showInput?: boolean;\r\n showFormats?: boolean;\r\n size?: ColorPickerSize;\r\n}\r\n\r\n/* ─── Default Presets ────────────────────────────────────────────────────────── */\r\n\r\nconst DEFAULT_PRESETS = [\r\n \"#ef4444\", \"#f97316\", \"#eab308\", \"#22c55e\", \"#06b6d4\", \"#3b82f6\", \"#8b5cf6\", \"#ec4899\",\r\n \"#991b1b\", \"#9a3412\", \"#854d0e\", \"#166534\", \"#155e75\", \"#1e40af\", \"#5b21b6\", \"#9d174d\",\r\n \"#fca5a5\", \"#fdba74\", \"#fde047\", \"#86efac\", \"#67e8f9\", \"#93c5fd\", \"#c4b5fd\", \"#f9a8d4\",\r\n];\r\n\r\n/* ─── Helpers ────────────────────────────────────────────────────────────────── */\r\n\r\nfunction hexToRgb(hex: string): string {\r\n const r = parseInt(hex.slice(1, 3), 16);\r\n const g = parseInt(hex.slice(3, 5), 16);\r\n const b = parseInt(hex.slice(5, 7), 16);\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\nfunction hexToHsl(hex: string): string {\r\n const r = parseInt(hex.slice(1, 3), 16) / 255;\r\n const g = parseInt(hex.slice(3, 5), 16) / 255;\r\n const b = parseInt(hex.slice(5, 7), 16) / 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n const l = (max + min) / 2;\r\n if (max === min) return `hsl(0, 0%, ${Math.round(l * 100)}%)`;\r\n const d = max - min;\r\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n let h = 0;\r\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\r\n else if (max === g) h = ((b - r) / d + 2) / 6;\r\n else h = ((r - g) / d + 4) / 6;\r\n return `hsl(${Math.round(h * 360)}, ${Math.round(s * 100)}%, ${Math.round(l * 100)}%)`;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst mono: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function ColorPicker({\r\n value,\r\n onChange,\r\n label,\r\n presets,\r\n showInput = true,\r\n showFormats,\r\n size = \"md\",\r\n}: ColorPickerProps) {\r\n const [copied, setCopied] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const swatchSize =\r\n size === \"sm\" ? \"w-5 h-5\" : size === \"lg\" ? \"w-8 h-8\" : \"w-6 h-6\";\r\n const displayPresets = presets || DEFAULT_PRESETS;\r\n\r\n const copy = (text: string) => {\r\n navigator.clipboard.writeText(text).then(() => {\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative\">\r\n <div\r\n className=\"w-10 h-10 rounded-[var(--radius-md)] border border-border cursor-pointer overflow-hidden\"\r\n style={{ backgroundColor: value }}\r\n onClick={() => inputRef.current?.click()}\r\n />\r\n <input\r\n ref={inputRef}\r\n type=\"color\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full\"\r\n />\r\n </div>\r\n\r\n {showInput && (\r\n <div className=\"flex items-center gap-1.5\">\r\n <input\r\n value={value}\r\n onChange={(e) => {\r\n if (\r\n /^#[0-9a-fA-F]{0,6}$/.test(e.target.value) ||\r\n e.target.value === \"#\"\r\n )\r\n onChange(e.target.value);\r\n }}\r\n className=\"w-24 px-2.5 py-1.5 rounded-[var(--radius-md)] border border-border bg-background text-foreground outline-none focus:border-primary\"\r\n style={mono}\r\n maxLength={7}\r\n />\r\n <button\r\n onClick={() => copy(value)}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-accent transition-colors cursor-pointer\"\r\n >\r\n {copied ? (\r\n <Check size={14} className=\"text-chart-2\" />\r\n ) : (\r\n <Copy size={14} />\r\n )}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {displayPresets.length > 0 && (\r\n <div className=\"flex flex-wrap gap-1.5\">\r\n {displayPresets.map((c) => (\r\n <button\r\n key={c}\r\n onClick={() => onChange(c)}\r\n className={`${swatchSize} rounded-[var(--radius-sm)] border-2 transition-transform hover:scale-110 cursor-pointer\r\n ${value === c ? \"border-foreground ring-1 ring-foreground/20\" : \"border-transparent\"}`}\r\n style={{ backgroundColor: c }}\r\n title={c}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n\r\n {showFormats && (\r\n <div className=\"space-y-1\">\r\n {[\r\n { label: \"HEX\", val: value.toUpperCase() },\r\n { label: \"RGB\", val: hexToRgb(value) },\r\n { label: \"HSL\", val: hexToHsl(value) },\r\n ].map((f) => (\r\n <div key={f.label} className=\"flex items-center gap-2\">\r\n <span className=\"w-8 text-muted-foreground\" style={smallLabel}>\r\n {f.label}\r\n </span>\r\n <code className=\"text-foreground\" style={mono}>\r\n {f.val}\r\n </code>\r\n <button\r\n onClick={() => copy(f.val)}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <Copy size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type DividerSpacing = \"sm\" | \"md\" | \"lg\";\r\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\r\n\r\nexport interface DividerProps {\r\n label?: string;\r\n orientation?: DividerOrientation;\r\n dashed?: boolean;\r\n spacing?: DividerSpacing;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Divider ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Divider({\r\n label,\r\n orientation = \"horizontal\",\r\n dashed,\r\n spacing = \"md\",\r\n className = \"\",\r\n}: DividerProps) {\r\n const spacings = { sm: \"my-2\", md: \"my-4\", lg: \"my-8\" };\r\n const style = dashed ? \"border-dashed\" : \"border-solid\";\r\n\r\n if (orientation === \"vertical\") {\r\n return (\r\n <div\r\n className={`inline-block h-full min-h-[24px] border-l border-border ${style} mx-3 ${className}`}\r\n />\r\n );\r\n }\r\n\r\n if (label) {\r\n return (\r\n <div className={`flex items-center gap-3 ${spacings[spacing]} ${className}`}>\r\n <div className={`flex-1 border-t border-border ${style}`} />\r\n <span className=\"text-muted-foreground flex-shrink-0\" style={smallLabel}>\r\n {label}\r\n </span>\r\n <div className={`flex-1 border-t border-border ${style}`} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <hr className={`border-t border-border ${style} ${spacings[spacing]} ${className}`} />\r\n );\r\n}\r\n\r\nDivider.displayName = \"Divider\";\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type DrawerSide = \"left\" | \"right\" | \"top\" | \"bottom\";\r\nexport type DrawerSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface DrawerProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title?: string;\r\n children: React.ReactNode;\r\n side?: DrawerSide;\r\n size?: DrawerSize;\r\n footer?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n// ─── Drawer ──────────────────────────────────────────────────────────────────\r\n\r\nexport function Drawer({\r\n open,\r\n onClose,\r\n title,\r\n children,\r\n side = \"right\",\r\n size = \"md\",\r\n footer,\r\n className = \"\",\r\n}: DrawerProps) {\r\n if (!open) return null;\r\n\r\n const widths = { sm: \"w-72\", md: \"w-96\", lg: \"w-[480px]\" };\r\n const heights = { sm: \"h-48\", md: \"h-72\", lg: \"h-96\" };\r\n const sideClasses: Record<DrawerSide, string> = {\r\n right: `top-0 right-0 h-full ${widths[size]} animate-[slideRight_0.2s_ease]`,\r\n left: `top-0 left-0 h-full ${widths[size]} animate-[slideLeft_0.2s_ease]`,\r\n top: `top-0 left-0 w-full ${heights[size]} animate-[slideTop_0.2s_ease]`,\r\n bottom: `bottom-0 left-0 w-full ${heights[size]} animate-[slideBottom_0.2s_ease]`,\r\n };\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50\">\r\n <div className=\"absolute inset-0 bg-foreground/20\" onClick={onClose} />\r\n <div\r\n className={`absolute bg-card border border-border shadow-lg flex flex-col ${sideClasses[side]} ${className}`}\r\n >\r\n {title && (\r\n <div className=\"px-5 py-4 border-b border-border flex items-center justify-between flex-shrink-0\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <button\r\n onClick={onClose}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={18} />\r\n </button>\r\n </div>\r\n )}\r\n <div className=\"flex-1 overflow-y-auto p-5\">{children}</div>\r\n {footer && (\r\n <div className=\"px-5 py-3 border-t border-border flex items-center gap-2 flex-shrink-0\">\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n <style>{`\r\n @keyframes slideRight { from { transform: translateX(100%); } to { transform: translateX(0); } }\r\n @keyframes slideLeft { from { transform: translateX(-100%); } to { transform: translateX(0); } }\r\n @keyframes slideTop { from { transform: translateY(-100%); } to { transform: translateY(0); } }\r\n @keyframes slideBottom { from { transform: translateY(100%); } to { transform: translateY(0); } }\r\n `}</style>\r\n </div>\r\n );\r\n}\r\n\r\nDrawer.displayName = \"Drawer\";\r\n","import React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n useMemo,\r\n forwardRef,\r\n} from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport {\r\n ChevronDown,\r\n Check,\r\n Search,\r\n X,\r\n Loader2,\r\n AlertCircle,\r\n Plus,\r\n Inbox,\r\n} from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n avatar?: string;\r\n description?: string;\r\n group?: string;\r\n}\r\n\r\nexport type DropdownSize = \"sm\" | \"md\" | \"lg\";\r\nexport type DropdownVariant = \"default\" | \"outlined\" | \"filled\" | \"ghost\";\r\nexport type DropdownState = \"default\" | \"error\" | \"success\" | \"warning\";\r\n\r\nexport interface DropdownProps {\r\n options: DropdownOption[];\r\n value?: string | string[];\r\n defaultValue?: string | string[];\r\n onChange?: (value: string | string[]) => void;\r\n placeholder?: string;\r\n label?: string;\r\n helperText?: string;\r\n errorMessage?: string;\r\n successMessage?: string;\r\n size?: DropdownSize;\r\n variant?: DropdownVariant;\r\n state?: DropdownState;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n searchable?: boolean;\r\n clearable?: boolean;\r\n multiple?: boolean;\r\n maxSelections?: number;\r\n grouped?: boolean;\r\n required?: boolean;\r\n id?: string;\r\n className?: string;\r\n showSelectAll?: boolean;\r\n tagLimit?: number;\r\n creatable?: boolean;\r\n onCreateOption?: (label: string) => void;\r\n createLabel?: string;\r\n emptyState?: React.ReactNode;\r\n footer?: React.ReactNode;\r\n onSearch?: (query: string) => void;\r\n searchDebounce?: number;\r\n searchLoading?: boolean;\r\n renderOption?: (option: DropdownOption, isSelected: boolean) => React.ReactNode;\r\n}\r\n\r\n/* ─── Size Config ────────────────────────────────────────────────────────────── */\r\n\r\nconst sizeConfig: Record<\r\n DropdownSize,\r\n {\r\n trigger: string;\r\n option: string;\r\n optionStyle: React.CSSProperties;\r\n textStyle: React.CSSProperties;\r\n descStyle: React.CSSProperties;\r\n icon: number;\r\n avatarSize: number;\r\n }\r\n> = {\r\n sm: {\r\n trigger: \"h-9 px-[var(--Spacing--Spacing-xl)] gap-[var(--Spacing--Spacing-sm)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-sm) var(--Spacing--Spacing-xl)\" },\r\n textStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n descStyle: { fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" },\r\n icon: 14,\r\n avatarSize: 20,\r\n },\r\n md: {\r\n trigger: \"h-11 px-[var(--Spacing--Spacing-2xl)] gap-[var(--Spacing--Spacing-lg)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-md) var(--Spacing--Spacing-2xl)\" },\r\n textStyle: { fontFamily: \"var(--font-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" },\r\n descStyle: { fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" },\r\n icon: 16,\r\n avatarSize: 24,\r\n },\r\n lg: {\r\n trigger: \"h-13 px-[var(--Spacing--Spacing-3xl)] gap-[var(--Spacing--Spacing-xl)]\",\r\n option: \"rounded-[var(--radius-sm)]\",\r\n optionStyle: { padding: \"var(--Spacing--Spacing-lg) var(--Spacing--Spacing-3xl)\" },\r\n textStyle: { fontFamily: \"var(--font-p)\", fontSize: \"var(--text-p)\", fontWeight: \"var(--weight-p)\" },\r\n descStyle: { fontFamily: \"var(--font-caption)\", fontSize: \"var(--text-caption)\", fontWeight: \"var(--weight-caption)\" },\r\n icon: 18,\r\n avatarSize: 28,\r\n },\r\n};\r\n\r\nconst variantStyles: Record<DropdownVariant, { 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 stateStyles: Record<DropdownState, 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\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(\r\n (\r\n {\r\n options,\r\n value: controlledValue,\r\n defaultValue,\r\n onChange,\r\n placeholder = \"Select an option\\u2026\",\r\n label,\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 loading = false,\r\n searchable = false,\r\n clearable = false,\r\n multiple = false,\r\n maxSelections,\r\n grouped = false,\r\n required = false,\r\n id,\r\n className = \"\",\r\n showSelectAll = false,\r\n tagLimit,\r\n creatable = false,\r\n onCreateOption,\r\n createLabel = 'Create \"{query}\"',\r\n emptyState,\r\n footer,\r\n onSearch,\r\n searchDebounce = 300,\r\n searchLoading = false,\r\n renderOption: customRenderOption,\r\n },\r\n ref\r\n ) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [search, setSearch] = useState(\"\");\r\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\r\n const [internalValue, setInternalValue] = useState<string | string[]>(\r\n defaultValue ?? (multiple ? [] : \"\")\r\n );\r\n\r\n const value = controlledValue ?? internalValue;\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const listRef = useRef<HTMLDivElement>(null);\r\n const searchRef = useRef<HTMLInputElement>(null);\r\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const [panelPos, setPanelPos] = useState<{ top: number; left: number; width: number }>({ top: 0, left: 0, width: 0 });\r\n\r\n const sc = sizeConfig[size];\r\n const vs = variantStyles[variant];\r\n\r\n useEffect(() => {\r\n if (!isOpen || !triggerRef.current) return;\r\n const updatePos = () => {\r\n const rect = triggerRef.current!.getBoundingClientRect();\r\n setPanelPos({ top: rect.bottom + 4, left: rect.left, width: rect.width });\r\n };\r\n updatePos();\r\n window.addEventListener(\"scroll\", updatePos, true);\r\n window.addEventListener(\"resize\", updatePos);\r\n return () => {\r\n window.removeEventListener(\"scroll\", updatePos, true);\r\n window.removeEventListener(\"resize\", updatePos);\r\n };\r\n }, [isOpen]);\r\n\r\n const handleSearchChange = useCallback(\r\n (query: string) => {\r\n setSearch(query);\r\n if (onSearch) {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n onSearch(query);\r\n }, searchDebounce);\r\n }\r\n },\r\n [onSearch, searchDebounce]\r\n );\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceRef.current) clearTimeout(debounceRef.current);\r\n };\r\n }, []);\r\n\r\n const filteredOptions = useMemo(() => {\r\n if (!search || onSearch) return options;\r\n return options.filter(\r\n (o) =>\r\n o.label.toLowerCase().includes(search.toLowerCase()) ||\r\n o.description?.toLowerCase().includes(search.toLowerCase())\r\n );\r\n }, [options, search, onSearch]);\r\n\r\n const groupedOptions = useMemo(() => {\r\n if (!grouped) return null;\r\n const groups: Record<string, DropdownOption[]> = {};\r\n filteredOptions.forEach((o) => {\r\n const g = o.group || \"Other\";\r\n if (!groups[g]) groups[g] = [];\r\n groups[g].push(o);\r\n });\r\n return groups;\r\n }, [filteredOptions, grouped]);\r\n\r\n const selectedLabels = useMemo(() => {\r\n if (multiple && Array.isArray(value)) {\r\n return value\r\n .map((v) => options.find((o) => o.value === v)?.label)\r\n .filter(Boolean) as string[];\r\n }\r\n return options.find((o) => o.value === value)?.label\r\n ? [options.find((o) => o.value === value)!.label]\r\n : [];\r\n }, [value, options, multiple]);\r\n\r\n const isSelected = useCallback(\r\n (optValue: string) => {\r\n if (multiple && Array.isArray(value)) return value.includes(optValue);\r\n return value === optValue;\r\n },\r\n [value, multiple]\r\n );\r\n\r\n const handleSelect = useCallback(\r\n (optValue: string) => {\r\n if (multiple) {\r\n const arr = Array.isArray(value) ? [...value] : [];\r\n const idx = arr.indexOf(optValue);\r\n if (idx > -1) {\r\n arr.splice(idx, 1);\r\n } else {\r\n if (maxSelections && arr.length >= maxSelections) return;\r\n arr.push(optValue);\r\n }\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n } else {\r\n setInternalValue(optValue);\r\n onChange?.(optValue);\r\n setIsOpen(false);\r\n }\r\n setSearch(\"\");\r\n },\r\n [value, multiple, maxSelections, onChange]\r\n );\r\n\r\n const allSelectableValues = useMemo(\r\n () => filteredOptions.filter((o) => !o.disabled).map((o) => o.value),\r\n [filteredOptions]\r\n );\r\n\r\n const allSelected = useMemo(() => {\r\n if (!multiple || !Array.isArray(value)) return false;\r\n return allSelectableValues.length > 0 && allSelectableValues.every((v) => value.includes(v));\r\n }, [multiple, value, allSelectableValues]);\r\n\r\n const someSelected = useMemo(() => {\r\n if (!multiple || !Array.isArray(value)) return false;\r\n return allSelectableValues.some((v) => value.includes(v)) && !allSelected;\r\n }, [multiple, value, allSelectableValues, allSelected]);\r\n\r\n const handleSelectAll = useCallback(() => {\r\n if (!multiple) return;\r\n if (allSelected) {\r\n const arr = Array.isArray(value) ? value.filter((v) => !allSelectableValues.includes(v)) : [];\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n } else {\r\n const arr = Array.isArray(value) ? [...value] : [];\r\n for (const v of allSelectableValues) {\r\n if (!arr.includes(v)) {\r\n if (maxSelections && arr.length >= maxSelections) break;\r\n arr.push(v);\r\n }\r\n }\r\n setInternalValue(arr);\r\n onChange?.(arr);\r\n }\r\n }, [multiple, allSelected, value, allSelectableValues, maxSelections, onChange]);\r\n\r\n const handleCreate = useCallback(() => {\r\n if (!search.trim()) return;\r\n onCreateOption?.(search.trim());\r\n setSearch(\"\");\r\n }, [search, onCreateOption]);\r\n\r\n const showCreateOption = useMemo(() => {\r\n if (!creatable || !search.trim()) return false;\r\n return !options.some((o) => o.label.toLowerCase() === search.toLowerCase());\r\n }, [creatable, search, options]);\r\n\r\n const handleClear = useCallback(\r\n (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n const empty = multiple ? [] : \"\";\r\n setInternalValue(empty);\r\n onChange?.(empty);\r\n },\r\n [multiple, onChange]\r\n );\r\n\r\n const flatOptions = grouped\r\n ? Object.values(groupedOptions || {}).flat()\r\n : filteredOptions;\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n if (disabled || loading) return;\r\n switch (e.key) {\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n if (!isOpen) {\r\n setIsOpen(true);\r\n } else {\r\n setHighlightedIndex((i) =>\r\n i < flatOptions.length - 1 ? i + 1 : 0\r\n );\r\n }\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n setHighlightedIndex((i) =>\r\n i > 0 ? i - 1 : flatOptions.length - 1\r\n );\r\n break;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n if (isOpen && highlightedIndex >= 0) {\r\n const opt = flatOptions[highlightedIndex];\r\n if (opt && !opt.disabled) handleSelect(opt.value);\r\n } else {\r\n setIsOpen(true);\r\n }\r\n break;\r\n case \"Escape\":\r\n setIsOpen(false);\r\n triggerRef.current?.focus();\r\n break;\r\n }\r\n },\r\n [disabled, loading, isOpen, highlightedIndex, flatOptions, handleSelect]\r\n );\r\n\r\n useEffect(() => {\r\n const handler = (e: MouseEvent) => {\r\n const target = e.target as Node;\r\n if (\r\n triggerRef.current &&\r\n !triggerRef.current.contains(target) &&\r\n listRef.current &&\r\n !listRef.current.contains(target)\r\n ) {\r\n setIsOpen(false);\r\n setSearch(\"\");\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isOpen && searchable) {\r\n setTimeout(() => searchRef.current?.focus(), 50);\r\n }\r\n if (isOpen) setHighlightedIndex(-1);\r\n }, [isOpen, searchable]);\r\n\r\n const hasValue = multiple\r\n ? Array.isArray(value) && value.length > 0\r\n : !!value;\r\n\r\n const computedState = errorMessage ? \"error\" : state;\r\n\r\n const renderTags = () => {\r\n const labels = selectedLabels;\r\n const limit = tagLimit && tagLimit > 0 ? tagLimit : labels.length;\r\n const visible = labels.slice(0, limit);\r\n const remaining = labels.length - visible.length;\r\n\r\n return (\r\n <span className=\"flex flex-wrap gap-1\">\r\n {visible.map((l) => (\r\n <span\r\n key={l}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-sm)] bg-[var(--Colors--Background--bg-brand-secondary)] text-[var(--Colors--Text--text-brand-primary)]\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {l}\r\n <X\r\n size={10}\r\n className=\"cursor-pointer hover:text-destructive transition-colors\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n const opt = options.find((o) => o.label === l);\r\n if (opt) handleSelect(opt.value);\r\n }}\r\n />\r\n </span>\r\n ))}\r\n {remaining > 0 && (\r\n <span\r\n className=\"inline-flex items-center px-2 py-0.5 rounded-[var(--radius-sm)] bg-muted text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n +{remaining} more\r\n </span>\r\n )}\r\n </span>\r\n );\r\n };\r\n\r\n const renderOptionNode = (opt: DropdownOption, idx: number) => {\r\n const selected = isSelected(opt.value);\r\n\r\n if (customRenderOption) {\r\n return (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={selected}\r\n disabled={opt.disabled}\r\n className={`w-full ${sc.option} transition-colors cursor-pointer\r\n ${selected ? \"bg-[var(--Colors--Background--bg-brand-secondary)]\" : \"\"}\r\n ${highlightedIndex === idx && !selected ? \"bg-[var(--Colors--Background--bg-primary_hover)]\" : \"\"}\r\n ${opt.disabled ? \"opacity-40 cursor-not-allowed\" : \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\"}\r\n `}\r\n style={sc.optionStyle}\r\n onClick={() => !opt.disabled && handleSelect(opt.value)}\r\n onMouseEnter={() => setHighlightedIndex(idx)}\r\n >\r\n {customRenderOption(opt, selected)}\r\n </button>\r\n );\r\n }\r\n\r\n return (\r\n <button\r\n key={opt.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={selected}\r\n disabled={opt.disabled}\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} transition-colors cursor-pointer\r\n ${selected ? \"bg-[var(--Colors--Background--bg-brand-secondary)] text-[var(--Colors--Text--text-brand-primary)]\" : \"\"}\r\n ${highlightedIndex === idx && !selected ? \"bg-[var(--Colors--Background--bg-primary_hover)]\" : \"\"}\r\n ${opt.disabled ? \"opacity-40 cursor-not-allowed\" : \"hover:bg-[var(--Colors--Background--bg-primary_hover)]\"}\r\n `}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={() => !opt.disabled && handleSelect(opt.value)}\r\n onMouseEnter={() => setHighlightedIndex(idx)}\r\n >\r\n {multiple && (\r\n <span\r\n className={`flex-shrink-0 w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center transition-colors\r\n ${selected ? \"bg-primary border-primary\" : \"border-border\"}\r\n `}\r\n >\r\n {selected && <Check size={10} className=\"text-primary-foreground\" />}\r\n </span>\r\n )}\r\n {opt.avatar && (\r\n <img\r\n src={opt.avatar}\r\n alt=\"\"\r\n className=\"flex-shrink-0 rounded-full object-cover\"\r\n style={{ width: sc.avatarSize, height: sc.avatarSize }}\r\n />\r\n )}\r\n {opt.icon && <span className=\"flex-shrink-0\">{opt.icon}</span>}\r\n <span className=\"flex-1 text-left\">\r\n <span className=\"block\">{opt.label}</span>\r\n {opt.description && (\r\n <span\r\n className=\"block text-muted-foreground\"\r\n style={{ marginTop: \"var(--Spacing--Spacing-xxs)\", ...sc.descStyle }}\r\n >\r\n {opt.description}\r\n </span>\r\n )}\r\n </span>\r\n {!multiple && selected && (\r\n <Check size={sc.icon} className=\"text-primary flex-shrink-0\" />\r\n )}\r\n </button>\r\n );\r\n };\r\n\r\n let globalIdx = 0;\r\n\r\n return (\r\n <div ref={ref} className={`relative w-full ${className}`} id={id}>\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 <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n role=\"combobox\"\r\n aria-expanded={isOpen}\r\n aria-haspopup=\"listbox\"\r\n disabled={disabled || loading}\r\n onClick={() => !disabled && !loading && setIsOpen(!isOpen)}\r\n onKeyDown={handleKeyDown}\r\n className={`w-full flex items-center rounded-[var(--radius-md)] transition-all duration-150 ${sc.trigger}\r\n ${vs.base}\r\n ${!disabled && !loading ? vs.hover : \"\"}\r\n ${isOpen ? vs.focus : \"\"}\r\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}\r\n ${loading ? \"opacity-70 cursor-wait\" : \"\"}\r\n ${stateStyles[computedState]}\r\n `}\r\n style={sc.textStyle}\r\n >\r\n {loading ? <Loader2 size={sc.icon} className=\"animate-spin text-muted-foreground\" /> : null}\r\n\r\n <span className={`flex-1 text-left truncate ${!hasValue ? \"text-muted-foreground\" : \"text-foreground\"}`}>\r\n {hasValue ? (multiple ? renderTags() : selectedLabels[0]) : placeholder}\r\n </span>\r\n\r\n {clearable && hasValue && !disabled && (\r\n <X\r\n size={sc.icon}\r\n className=\"flex-shrink-0 text-muted-foreground hover:text-foreground cursor-pointer transition-colors\"\r\n onClick={handleClear}\r\n />\r\n )}\r\n\r\n <ChevronDown\r\n size={sc.icon}\r\n className={`flex-shrink-0 text-muted-foreground transition-transform duration-200 ${isOpen ? \"rotate-180\" : \"\"}`}\r\n />\r\n </button>\r\n\r\n {isOpen &&\r\n createPortal(\r\n <div\r\n ref={listRef}\r\n role=\"listbox\"\r\n className=\"fixed z-[9999] bg-popover border border-border rounded-[var(--radius)] shadow-elevation-sm overflow-hidden\"\r\n style={{ top: panelPos.top, left: panelPos.left, width: panelPos.width || \"auto\" }}\r\n >\r\n {searchable && (\r\n <div className=\"p-2 border-b border-border\">\r\n <div className=\"relative\">\r\n <Search size={14} className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-muted-foreground\" />\r\n <input\r\n ref={searchRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => handleSearchChange(e.target.value)}\r\n placeholder=\"Search\\u2026\"\r\n className=\"w-full pl-8 pr-3 py-1.5 bg-background border border-border rounded-[var(--radius-sm)] outline-none placeholder:text-muted-foreground focus:border-ring focus:ring-1 focus:ring-ring/20 transition-colors\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n onKeyDown={handleKeyDown}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {multiple && showSelectAll && filteredOptions.length > 0 && (\r\n <button\r\n type=\"button\"\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} border-b border-border transition-colors hover:bg-[var(--Colors--Background--bg-primary_hover)] cursor-pointer`}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={handleSelectAll}\r\n >\r\n <span\r\n className={`flex-shrink-0 w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center transition-colors\r\n ${allSelected ? \"bg-primary border-primary\" : someSelected ? \"bg-primary/50 border-primary\" : \"border-border\"}\r\n `}\r\n >\r\n {allSelected && <Check size={10} className=\"text-primary-foreground\" />}\r\n {someSelected && !allSelected && <span className=\"w-2 h-0.5 bg-primary-foreground rounded-full\" />}\r\n </span>\r\n <span className=\"text-foreground\">{allSelected ? \"Deselect All\" : \"Select All\"}</span>\r\n <span\r\n className=\"ml-auto text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {Array.isArray(value) ? value.length : 0}/{filteredOptions.filter((o) => !o.disabled).length}\r\n </span>\r\n </button>\r\n )}\r\n\r\n <div className=\"max-h-60 overflow-y-auto p-1\">\r\n {searchLoading ? (\r\n <div className=\"flex items-center justify-center py-6 gap-2 text-muted-foreground\">\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n <span style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\" }}>Searching\\u2026</span>\r\n </div>\r\n ) : filteredOptions.length === 0 && !showCreateOption ? (\r\n emptyState ? (\r\n <div className=\"py-4 px-3\">{emptyState}</div>\r\n ) : (\r\n <div className=\"text-center py-6 text-muted-foreground flex flex-col items-center gap-2\">\r\n <Inbox size={24} className=\"opacity-40\" />\r\n <span style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\" }}>No options found</span>\r\n </div>\r\n )\r\n ) : grouped && groupedOptions ? (\r\n Object.entries(groupedOptions).map(([group, opts]) => (\r\n <div key={group}>\r\n <div\r\n className=\"px-3 py-1.5 uppercase tracking-wider text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-button)\", fontSize: \"var(--text-button)\", fontWeight: \"var(--weight-button)\" }}\r\n >\r\n {group}\r\n </div>\r\n {opts.map((opt) => {\r\n const node = renderOptionNode(opt, globalIdx);\r\n globalIdx++;\r\n return node;\r\n })}\r\n </div>\r\n ))\r\n ) : (\r\n filteredOptions.map((opt, i) => renderOptionNode(opt, i))\r\n )}\r\n\r\n {showCreateOption && (\r\n <button\r\n type=\"button\"\r\n className={`w-full flex items-center gap-[var(--Spacing--Spacing-lg)] ${sc.option} text-primary transition-colors hover:bg-[var(--Colors--Background--bg-primary_hover)] cursor-pointer`}\r\n style={{ ...sc.optionStyle, ...sc.textStyle }}\r\n onClick={handleCreate}\r\n >\r\n <Plus size={sc.icon} className=\"flex-shrink-0\" />\r\n <span>{createLabel.replace(\"{query}\", search.trim())}</span>\r\n </button>\r\n )}\r\n </div>\r\n\r\n {(footer || (multiple && maxSelections)) && (\r\n <div className=\"border-t border-border\">\r\n {multiple && maxSelections && (\r\n <div\r\n className=\"px-3 py-2 text-muted-foreground\"\r\n style={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\r\n >\r\n {Array.isArray(value) ? value.length : 0} / {maxSelections} selected\r\n </div>\r\n )}\r\n {footer && <div className=\"px-3 py-2\">{footer}</div>}\r\n </div>\r\n )}\r\n </div>,\r\n document.body\r\n )}\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 <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={{ fontFamily: \"var(--font-label)\", fontSize: \"var(--text-label)\", fontWeight: \"var(--weight-label)\" }}\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\nDropdown.displayName = \"Dropdown\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type EmptyStateSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface EmptyStateAction {\r\n label: string;\r\n onClick: () => void;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport interface EmptyStateProps {\r\n icon?: React.ReactNode;\r\n title: string;\r\n description?: string;\r\n action?: EmptyStateAction;\r\n secondaryAction?: { label: string; onClick: () => void };\r\n size?: EmptyStateSize;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function EmptyState({\r\n icon,\r\n title,\r\n description,\r\n action,\r\n secondaryAction,\r\n size = \"md\",\r\n}: EmptyStateProps) {\r\n const iconSize =\r\n size === \"sm\" ? \"w-10 h-10\" : size === \"lg\" ? \"w-16 h-16\" : \"w-12 h-12\";\r\n const pad =\r\n size === \"sm\"\r\n ? \"py-6 px-4\"\r\n : size === \"lg\"\r\n ? \"py-14 px-8\"\r\n : \"py-10 px-6\";\r\n\r\n return (\r\n <div className={`flex flex-col items-center text-center ${pad}`}>\r\n {icon && (\r\n <div\r\n className={`${iconSize} rounded-full bg-muted flex items-center justify-center mb-4`}\r\n >\r\n <span className=\"text-muted-foreground\">{icon}</span>\r\n </div>\r\n )}\r\n <h4 className=\"text-foreground\">{title}</h4>\r\n {description && (\r\n <p\r\n className=\"text-muted-foreground mt-1.5 max-w-sm\"\r\n style={fontLabel}\r\n >\r\n {description}\r\n </p>\r\n )}\r\n {(action || secondaryAction) && (\r\n <div className=\"flex items-center gap-3 mt-5\">\r\n {action && (\r\n <button\r\n onClick={action.onClick}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] bg-primary text-primary-foreground hover:bg-primary/90 transition-colors cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {action.icon}\r\n {action.label}\r\n </button>\r\n )}\r\n {secondaryAction && (\r\n <button\r\n onClick={secondaryAction.onClick}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] border border-border text-foreground hover:bg-accent transition-colors cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {secondaryAction.label}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef } from \"react\";\r\nimport { Upload, X, FileText, Image, Film, File, CheckCircle2 } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type FileUploadVariant = \"dropzone\" | \"button\" | \"avatar\";\r\n\r\nexport interface UploadedFile {\r\n id: string;\r\n name: string;\r\n size: number;\r\n type: string;\r\n progress: number;\r\n status: \"uploading\" | \"done\" | \"error\";\r\n}\r\n\r\nexport interface FileUploadProps {\r\n accept?: string;\r\n maxSize?: number;\r\n multiple?: boolean;\r\n disabled?: boolean;\r\n variant?: FileUploadVariant;\r\n label?: string;\r\n description?: string;\r\n /** Controlled file list */\r\n value?: UploadedFile[];\r\n /** Called when files are added (from drop or file picker) */\r\n onChange?: (files: File[]) => void;\r\n /** Called when a file finishes uploading (internal simulation completes) */\r\n onUpload?: (file: UploadedFile) => void;\r\n /** Called when a file is removed from the list */\r\n onRemove?: (fileId: string) => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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/* ─── Helpers ────────────────────────────────────────────────────────────────── */\r\n\r\nfunction formatBytes(bytes: number) {\r\n if (bytes < 1024) return bytes + \" B\";\r\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\r\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\r\n}\r\n\r\nfunction getFileIcon(type: string) {\r\n if (type.startsWith(\"image/\")) return <Image size={16} className=\"text-chart-2\" />;\r\n if (type.startsWith(\"video/\")) return <Film size={16} className=\"text-chart-5\" />;\r\n if (type.includes(\"pdf\") || type.includes(\"document\"))\r\n return <FileText size={16} className=\"text-destructive\" />;\r\n return <File size={16} className=\"text-muted-foreground\" />;\r\n}\r\n\r\n/* ─── Sub-component: FileList ────────────────────────────────────────────────── */\r\n\r\nfunction FileList({\r\n files,\r\n onRemove,\r\n}: {\r\n files: UploadedFile[];\r\n onRemove: (id: string) => void;\r\n}) {\r\n return (\r\n <div className=\"space-y-2\">\r\n {files.map((f) => (\r\n <div\r\n key={f.id}\r\n className=\"flex items-center gap-3 px-3 py-2 rounded-[var(--radius-md)] border border-border bg-card\"\r\n >\r\n {getFileIcon(f.type)}\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-foreground truncate\" style={fontLabel}>\r\n {f.name}\r\n </p>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {formatBytes(f.size)}\r\n </span>\r\n {f.status === \"uploading\" && (\r\n <div className=\"flex-1 h-1 bg-muted rounded-full overflow-hidden\">\r\n <div\r\n className=\"h-full bg-primary rounded-full transition-all\"\r\n style={{ width: `${f.progress}%` }}\r\n />\r\n </div>\r\n )}\r\n {f.status === \"done\" && (\r\n <CheckCircle2 size={12} className=\"text-chart-2\" />\r\n )}\r\n </div>\r\n </div>\r\n <button\r\n onClick={() => onRemove(f.id)}\r\n className=\"text-muted-foreground hover:text-destructive cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function FileUpload({\r\n accept,\r\n maxSize,\r\n multiple,\r\n disabled,\r\n variant = \"dropzone\",\r\n label,\r\n description,\r\n value,\r\n onChange,\r\n onUpload,\r\n onRemove,\r\n}: FileUploadProps) {\r\n const [internalFiles, setInternalFiles] = useState<UploadedFile[]>([]);\r\n const [dragOver, setDragOver] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Support controlled (value) and uncontrolled modes\r\n const files = value ?? internalFiles;\r\n const setFiles = value !== undefined ? () => {} : setInternalFiles;\r\n\r\n const addFiles = (fileList: FileList | null) => {\r\n if (!fileList) return;\r\n const rawFiles = Array.from(fileList);\r\n\r\n // Call onChange with raw File objects for controlled usage\r\n if (onChange) {\r\n onChange(rawFiles);\r\n }\r\n\r\n // Internal simulation (uncontrolled mode)\r\n if (value === undefined) {\r\n const newFiles: UploadedFile[] = rawFiles.map((f) => ({\r\n id: Math.random().toString(36).slice(2),\r\n name: f.name,\r\n size: f.size,\r\n type: f.type,\r\n progress: 0,\r\n status: \"uploading\" as const,\r\n }));\r\n setInternalFiles((prev) => [...prev, ...newFiles]);\r\n newFiles.forEach((f) => {\r\n let prog = 0;\r\n const iv = setInterval(() => {\r\n prog += Math.random() * 30 + 10;\r\n if (prog >= 100) {\r\n prog = 100;\r\n clearInterval(iv);\r\n }\r\n setInternalFiles((prev) =>\r\n prev.map((p) =>\r\n p.id === f.id\r\n ? {\r\n ...p,\r\n progress: Math.min(prog, 100),\r\n status: prog >= 100 ? \"done\" : \"uploading\",\r\n }\r\n : p\r\n )\r\n );\r\n if (prog >= 100 && onUpload) {\r\n onUpload({ ...f, progress: 100, status: \"done\" });\r\n }\r\n }, 300);\r\n });\r\n }\r\n };\r\n\r\n const remove = (id: string) => {\r\n if (onRemove) {\r\n onRemove(id);\r\n }\r\n if (value === undefined) {\r\n setInternalFiles((prev) => prev.filter((f) => f.id !== id));\r\n }\r\n };\r\n\r\n if (variant === \"button\") {\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <button\r\n onClick={() => inputRef.current?.click()}\r\n disabled={disabled}\r\n className={`inline-flex items-center gap-2 px-4 py-2 rounded-[var(--radius-md)] border border-border bg-background text-foreground hover:bg-accent transition-colors cursor-pointer ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n <Upload size={14} /> Choose File{multiple ? \"s\" : \"\"}\r\n </button>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n {files.length > 0 && <FileList files={files} onRemove={remove} />}\r\n </div>\r\n );\r\n }\r\n\r\n if (variant === \"avatar\") {\r\n return (\r\n <div className=\"space-y-2\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n className={`w-24 h-24 rounded-full border-2 border-dashed flex items-center justify-center cursor-pointer transition-colors\r\n ${disabled ? \"opacity-50 pointer-events-none\" : \"\"} ${\r\n dragOver\r\n ? \"border-primary bg-primary/5\"\r\n : \"border-border hover:border-primary/40\"\r\n }`}\r\n >\r\n {files.length > 0 &&\r\n files[files.length - 1].status === \"done\" ? (\r\n <CheckCircle2 size={24} className=\"text-chart-2\" />\r\n ) : (\r\n <Upload size={20} className=\"text-muted-foreground\" />\r\n )}\r\n </div>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept || \"image/*\"}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {label && (\r\n <label className=\"block text-foreground\" style={fontLabelBold}>\r\n {label}\r\n </label>\r\n )}\r\n <div\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n setDragOver(true);\r\n }}\r\n onDragLeave={() => setDragOver(false)}\r\n onDrop={(e) => {\r\n e.preventDefault();\r\n setDragOver(false);\r\n addFiles(e.dataTransfer.files);\r\n }}\r\n onClick={() => !disabled && inputRef.current?.click()}\r\n className={`relative flex flex-col items-center justify-center gap-2 px-6 py-10 rounded-[var(--radius-lg)] border-2 border-dashed transition-all cursor-pointer\r\n ${disabled ? \"opacity-50 pointer-events-none\" : \"\"}\r\n ${\r\n dragOver\r\n ? \"border-primary bg-primary/5\"\r\n : \"border-border hover:border-primary/40 hover:bg-accent/30\"\r\n }`}\r\n >\r\n <div className=\"w-12 h-12 rounded-full bg-primary/10 flex items-center justify-center\">\r\n <Upload size={20} className=\"text-primary\" />\r\n </div>\r\n <div className=\"text-center\">\r\n <p className=\"text-foreground\" style={fontLabelBold}>\r\n <span className=\"text-primary\">Click to upload</span> or drag and\r\n drop\r\n </p>\r\n <p className=\"text-muted-foreground\" style={smallLabel}>\r\n {description || (accept ? `Accepted: ${accept}` : \"Any file type\")}\r\n {maxSize && ` \\u00B7 Max ${formatBytes(maxSize)}`}\r\n </p>\r\n </div>\r\n </div>\r\n <input\r\n ref={inputRef}\r\n type=\"file\"\r\n className=\"hidden\"\r\n accept={accept}\r\n multiple={multiple}\r\n onChange={(e) => addFiles(e.target.files)}\r\n />\r\n {files.length > 0 && <FileList files={files} onRemove={remove} />}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { X, ZoomIn, ZoomOut, RotateCw, ChevronLeft, ChevronRight } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface ImagePreviewItem {\r\n src: string;\r\n alt: string;\r\n thumbnail?: string;\r\n}\r\n\r\nexport interface ImagePreviewProps {\r\n images: ImagePreviewItem[];\r\n initialIndex?: number;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function ImagePreview({ images, initialIndex = 0 }: ImagePreviewProps) {\r\n const [open, setOpen] = useState(false);\r\n const [idx, setIdx] = useState(initialIndex);\r\n const [zoom, setZoom] = useState(1);\r\n const [rotation, setRotation] = useState(0);\r\n\r\n const current = images[idx];\r\n const prev = () => {\r\n setIdx((i) => (i - 1 + images.length) % images.length);\r\n setZoom(1);\r\n setRotation(0);\r\n };\r\n const next = () => {\r\n setIdx((i) => (i + 1) % images.length);\r\n setZoom(1);\r\n setRotation(0);\r\n };\r\n const zoomIn = () => setZoom((z) => Math.min(z + 0.25, 3));\r\n const zoomOut = () => setZoom((z) => Math.max(z - 0.25, 0.5));\r\n const rotate = () => setRotation((r) => (r + 90) % 360);\r\n\r\n return (\r\n <div>\r\n {/* Thumbnails */}\r\n <div className=\"flex flex-wrap gap-2\">\r\n {images.map((img, i) => (\r\n <button\r\n key={i}\r\n onClick={() => {\r\n setIdx(i);\r\n setOpen(true);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className={`rounded-[var(--radius-md)] overflow-hidden border-2 transition-all cursor-pointer hover:opacity-80\r\n ${idx === i && open ? \"border-primary\" : \"border-border\"}`}\r\n >\r\n <div className=\"w-20 h-20 bg-muted flex items-center justify-center overflow-hidden\">\r\n <img\r\n src={img.thumbnail || img.src}\r\n alt={img.alt}\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n />\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Lightbox */}\r\n {open && (\r\n <div className=\"fixed inset-0 z-[60] bg-foreground/80 flex flex-col\">\r\n {/* Toolbar */}\r\n <div className=\"flex items-center justify-between px-4 py-3 bg-foreground/20\">\r\n <span className=\"text-white\" style={fontLabel}>\r\n {current.alt} ({idx + 1}/{images.length})\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={zoomOut}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <ZoomOut size={16} />\r\n </button>\r\n <span className=\"text-white/70 px-2\" style={btnStyle}>\r\n {Math.round(zoom * 100)}%\r\n </span>\r\n <button\r\n onClick={zoomIn}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <ZoomIn size={16} />\r\n </button>\r\n <button\r\n onClick={rotate}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <RotateCw size={16} />\r\n </button>\r\n <div className=\"w-px h-5 bg-white/20 mx-1\" />\r\n <button\r\n onClick={() => {\r\n setOpen(false);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-white/70 hover:text-white hover:bg-white/10 cursor-pointer\"\r\n >\r\n <X size={16} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Image area */}\r\n <div\r\n className=\"flex-1 flex items-center justify-center relative overflow-hidden\"\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) {\r\n setOpen(false);\r\n setZoom(1);\r\n setRotation(0);\r\n }\r\n }}\r\n >\r\n {images.length > 1 && (\r\n <button\r\n onClick={prev}\r\n className=\"absolute left-4 w-10 h-10 rounded-full bg-foreground/30 text-white flex items-center justify-center hover:bg-foreground/50 cursor-pointer z-10\"\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n )}\r\n <img\r\n src={current.src}\r\n alt={current.alt}\r\n className=\"max-w-[90%] max-h-[80vh] object-contain transition-transform\"\r\n style={{\r\n transform: `scale(${zoom}) rotate(${rotation}deg)`,\r\n }}\r\n />\r\n {images.length > 1 && (\r\n <button\r\n onClick={next}\r\n className=\"absolute right-4 w-10 h-10 rounded-full bg-foreground/30 text-white flex items-center justify-center hover:bg-foreground/50 cursor-pointer z-10\"\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Bottom thumbnails */}\r\n {images.length > 1 && (\r\n <div className=\"flex items-center justify-center gap-2 py-3 bg-foreground/20\">\r\n {images.map((img, i) => (\r\n <button\r\n key={i}\r\n onClick={() => {\r\n setIdx(i);\r\n setZoom(1);\r\n setRotation(0);\r\n }}\r\n className={`w-12 h-12 rounded-[var(--radius-sm)] overflow-hidden border-2 cursor-pointer transition-all\r\n ${i === idx ? \"border-white\" : \"border-transparent opacity-50 hover:opacity-80\"}`}\r\n >\r\n <img\r\n src={img.thumbnail || img.src}\r\n alt={img.alt}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { ChevronRight } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface MenuItem {\r\n /** Display text */\r\n text?: string;\r\n /** Leading icon */\r\n icon?: React.ReactNode;\r\n /** Keyboard shortcut label */\r\n shortcut?: string;\r\n /** Click handler */\r\n onClick?: () => void;\r\n /** Render as a divider line */\r\n divider?: boolean;\r\n /** Render as a group label */\r\n label?: string;\r\n /** Destructive (red) styling */\r\n destructive?: boolean;\r\n /** Disabled state */\r\n disabled?: boolean;\r\n /** Nested sub-menu items */\r\n children?: MenuItem[];\r\n}\r\n\r\nexport interface MenuProps {\r\n /** Menu item definitions */\r\n items: MenuItem[];\r\n /** Whether the menu is open */\r\n open: boolean;\r\n /** Close callback */\r\n onClose: () => void;\r\n /** Ref to the trigger element for positioning */\r\n triggerRef: React.RefObject<HTMLElement | null>;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst shortcutStyle: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst labelStyle: 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// ─── SubMenu ─────────────────────────────────────────────────────────────────\r\n\r\nfunction SubMenu({ items, parentRect }: { items: MenuItem[]; parentRect: DOMRect }) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: parentRect.top, left: parentRect.right + 4 });\r\n\r\n useEffect(() => {\r\n if (!ref.current) return;\r\n const el = ref.current;\r\n const rect = el.getBoundingClientRect();\r\n let top = parentRect.top;\r\n let left = parentRect.right + 4;\r\n if (left + rect.width > window.innerWidth - 8) {\r\n left = parentRect.left - rect.width - 4;\r\n }\r\n if (top + rect.height > window.innerHeight - 8) {\r\n top = window.innerHeight - rect.height - 8;\r\n }\r\n setPos({ top, left });\r\n }, [parentRect]);\r\n\r\n return createPortal(\r\n <div\r\n ref={ref}\r\n className=\"fixed z-[9999] min-w-[200px] rounded-[var(--radius)] border border-border bg-popover shadow-md py-1\"\r\n style={{ top: pos.top, left: pos.left }}\r\n >\r\n {items.map((item, i) => (\r\n <MenuItemRow key={i} item={item} />\r\n ))}\r\n </div>,\r\n document.body\r\n );\r\n}\r\n\r\n// ─── MenuItemRow ─────────────────────────────────────────────────────────────\r\n\r\nfunction MenuItemRow({ item }: { item: MenuItem }) {\r\n const [subOpen, setSubOpen] = useState(false);\r\n const rowRef = useRef<HTMLDivElement>(null);\r\n const hoverTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n if (item.divider) return <div className=\"my-1 border-t border-border\" />;\r\n\r\n if (item.label) {\r\n return (\r\n <div className=\"px-3 py-1.5 text-muted-foreground uppercase tracking-wider\" style={labelStyle}>\r\n {item.label}\r\n </div>\r\n );\r\n }\r\n\r\n const hasChildren = item.children && item.children.length > 0;\r\n\r\n const handleMouseEnter = () => {\r\n if (hoverTimeout.current) clearTimeout(hoverTimeout.current);\r\n if (hasChildren) setSubOpen(true);\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n hoverTimeout.current = setTimeout(() => setSubOpen(false), 150);\r\n };\r\n\r\n return (\r\n <div ref={rowRef} className=\"relative\" onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\r\n <button\r\n onClick={() => { if (!hasChildren) item.onClick?.(); }}\r\n disabled={item.disabled}\r\n className={`w-full flex items-center text-left rounded-[var(--radius-sm)] transition-colors cursor-pointer ${\r\n item.destructive\r\n ? \"text-destructive hover:bg-destructive/10\"\r\n : item.disabled\r\n ? \"text-muted-foreground opacity-50 cursor-not-allowed\"\r\n : \"text-popover-foreground 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)\", ...fontLabel }}\r\n >\r\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\r\n <span className=\"flex-1\">{item.text}</span>\r\n {item.shortcut && (\r\n <span className=\"text-muted-foreground ml-4\" style={shortcutStyle}>\r\n {item.shortcut}\r\n </span>\r\n )}\r\n {hasChildren && <ChevronRight size={14} className=\"text-muted-foreground\" />}\r\n </button>\r\n {hasChildren && subOpen && rowRef.current && (\r\n <SubMenu items={item.children!} parentRect={rowRef.current.getBoundingClientRect()} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Menu ────────────────────────────────────────────────────────────────────\r\n\r\nexport function Menu({ items, open, onClose, triggerRef, className = \"\" }: MenuProps) {\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n\r\n useEffect(() => {\r\n if (!open || !triggerRef.current) return;\r\n const rect = triggerRef.current.getBoundingClientRect();\r\n let top = rect.bottom + 4;\r\n let left = rect.left;\r\n requestAnimationFrame(() => {\r\n if (!menuRef.current) return;\r\n const menuRect = menuRef.current.getBoundingClientRect();\r\n if (left + menuRect.width > window.innerWidth - 8) left = rect.right - menuRect.width;\r\n if (top + menuRect.height > window.innerHeight - 8) top = rect.top - menuRect.height - 4;\r\n setPos({ top, left });\r\n });\r\n setPos({ top, left });\r\n }, [open, triggerRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (triggerRef.current?.contains(e.target as Node)) return;\r\n if (menuRef.current?.contains(e.target as Node)) return;\r\n onClose();\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, [open, onClose, triggerRef]);\r\n\r\n if (!open) return null;\r\n\r\n return createPortal(\r\n <div\r\n ref={menuRef}\r\n className={`fixed z-[9999] min-w-[200px] rounded-[var(--radius)] border border-border bg-popover shadow-md py-1 animate-[fadeIn_0.15s_ease] ${className}`}\r\n style={{ top: pos.top, left: pos.left }}\r\n >\r\n {items.map((item, i) => (\r\n <MenuItemRow key={i} item={item} />\r\n ))}\r\n <style>{`@keyframes fadeIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }`}</style>\r\n </div>,\r\n document.body\r\n );\r\n}\r\n\r\nMenu.displayName = \"Menu\";\r\n","import React, { useState } from \"react\";\r\nimport { CheckCircle2, AlertTriangle, Info, XCircle, X, Bell, BellOff, ExternalLink } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type NotificationType = \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nexport interface NotificationProps {\r\n type?: NotificationType;\r\n title: string;\r\n message?: string;\r\n closable?: boolean;\r\n onClose?: () => void;\r\n action?: { label: string; onClick: () => void };\r\n avatar?: string;\r\n time?: string;\r\n read?: boolean;\r\n}\r\n\r\nexport interface NotificationCenterItem {\r\n id: string;\r\n type: NotificationType;\r\n title: string;\r\n message?: string;\r\n time: string;\r\n read: boolean;\r\n}\r\n\r\nexport interface NotificationCenterProps {\r\n items: NotificationCenterItem[];\r\n /** Called when a single notification is marked as read */\r\n onMarkRead?: (id: string) => void;\r\n /** Called when \"Mark all read\" is clicked */\r\n onMarkAllRead?: () => void;\r\n /** Called when a notification is dismissed/removed */\r\n onDismiss?: (id: string) => void;\r\n /** Called when all notifications are cleared */\r\n onClearAll?: () => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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/* ─── Notification Component ─────────────────────────────────────────────────── */\r\n\r\nexport function Notification({\r\n type = \"info\",\r\n title,\r\n message,\r\n closable = true,\r\n onClose,\r\n action,\r\n avatar,\r\n time,\r\n read,\r\n}: NotificationProps) {\r\n const icons: Record<string, React.ReactNode> = {\r\n info: <Info size={16} className=\"text-primary\" />,\r\n success: <CheckCircle2 size={16} className=\"text-chart-2\" />,\r\n warning: <AlertTriangle size={16} className=\"text-chart-5\" />,\r\n error: <XCircle size={16} className=\"text-destructive\" />,\r\n };\r\n const border: Record<string, string> = {\r\n info: \"border-l-primary\",\r\n success: \"border-l-chart-2\",\r\n warning: \"border-l-chart-5\",\r\n error: \"border-l-destructive\",\r\n };\r\n\r\n return (\r\n <div\r\n className={`flex gap-3 px-4 py-3 rounded-[var(--radius-md)] border border-border bg-card border-l-[3px] ${border[type]} ${\r\n read === false ? \"bg-primary/5\" : \"\"\r\n }`}\r\n >\r\n {avatar ? (\r\n <div\r\n className=\"w-8 h-8 rounded-full bg-muted flex-shrink-0 flex items-center justify-center overflow-hidden\"\r\n style={fontLabelBold}\r\n >\r\n <span className=\"text-primary\">\r\n {avatar.slice(0, 2).toUpperCase()}\r\n </span>\r\n </div>\r\n ) : (\r\n <span className=\"flex-shrink-0 mt-0.5\">{icons[type]}</span>\r\n )}\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <div className=\"flex items-center gap-1 flex-shrink-0\">\r\n {time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {time}\r\n </span>\r\n )}\r\n {read === false && (\r\n <span className=\"w-2 h-2 rounded-full bg-primary\" />\r\n )}\r\n {closable && onClose && (\r\n <button\r\n onClick={onClose}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n {message && (\r\n <p className=\"text-muted-foreground mt-0.5\" style={fontLabel}>\r\n {message}\r\n </p>\r\n )}\r\n {action && (\r\n <button\r\n onClick={action.onClick}\r\n className=\"inline-flex items-center gap-1 text-primary mt-2 hover:underline cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n {action.label} <ExternalLink size={12} />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── NotificationCenter Component ───────────────────────────────────────────── */\r\n\r\nexport function NotificationCenter({\r\n items,\r\n onMarkRead,\r\n onMarkAllRead,\r\n onDismiss,\r\n onClearAll,\r\n}: NotificationCenterProps) {\r\n const [internalItems, setInternalItems] = useState(items);\r\n\r\n // Use items prop directly when callbacks are provided (controlled), otherwise internal state\r\n const isControlled = onMarkRead !== undefined || onMarkAllRead !== undefined;\r\n const notifications = isControlled ? items : internalItems;\r\n const unread = notifications.filter((n) => !n.read).length;\r\n\r\n const handleMarkAllRead = () => {\r\n if (onMarkAllRead) {\r\n onMarkAllRead();\r\n }\r\n if (!isControlled) {\r\n setInternalItems((n) => n.map((i) => ({ ...i, read: true })));\r\n }\r\n };\r\n\r\n const handleDismiss = (id: string) => {\r\n if (onDismiss) {\r\n onDismiss(id);\r\n }\r\n if (!isControlled) {\r\n setInternalItems((n) => n.filter((i) => i.id !== id));\r\n }\r\n };\r\n\r\n const handleMarkRead = (id: string) => {\r\n if (onMarkRead) {\r\n onMarkRead(id);\r\n }\r\n if (!isControlled) {\r\n setInternalItems((n) =>\r\n n.map((i) => (i.id === id ? { ...i, read: true } : i))\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"max-w-md rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-4 py-3 border-b border-border flex items-center justify-between\">\r\n <div className=\"flex items-center gap-2\">\r\n <Bell size={16} className=\"text-foreground\" />\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n Notifications\r\n </span>\r\n {unread > 0 && (\r\n <span\r\n className=\"px-1.5 py-0.5 rounded-full bg-primary text-primary-foreground\"\r\n style={btnStyle}\r\n >\r\n {unread}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {unread > 0 && (\r\n <button\r\n onClick={handleMarkAllRead}\r\n className=\"text-primary cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n Mark all read\r\n </button>\r\n )}\r\n {notifications.length > 0 && onClearAll && (\r\n <button\r\n onClick={onClearAll}\r\n className=\"text-muted-foreground hover:text-destructive cursor-pointer\"\r\n style={btnStyle}\r\n >\r\n Clear all\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"divide-y divide-border max-h-[360px] overflow-y-auto\">\r\n {notifications.map((n) => (\r\n <div\r\n key={n.id}\r\n className={`px-3 py-2 ${!n.read ? \"bg-primary/5\" : \"\"}`}\r\n onClick={() => !n.read && handleMarkRead(n.id)}\r\n >\r\n <Notification\r\n type={n.type}\r\n title={n.title}\r\n message={n.message}\r\n time={n.time}\r\n read={n.read}\r\n closable={!!onDismiss}\r\n onClose={() => handleDismiss(n.id)}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n {notifications.length === 0 && (\r\n <div className=\"py-10 text-center text-muted-foreground\">\r\n <BellOff size={24} className=\"mx-auto mb-2 opacity-40\" />\r\n <span style={fontLabel}>No notifications</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\nexport interface PopoverProps {\r\n trigger: React.ReactNode;\r\n children: React.ReactNode;\r\n placement?: PopoverPlacement;\r\n title?: string;\r\n open?: boolean;\r\n onOpenChange?: (v: boolean) => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Popover({\r\n trigger,\r\n children,\r\n placement = \"bottom\",\r\n title,\r\n open: controlled,\r\n onOpenChange,\r\n}: PopoverProps) {\r\n const [internalOpen, setInternalOpen] = useState(false);\r\n const isOpen = controlled !== undefined ? controlled : internalOpen;\r\n const setOpen = (v: boolean) => {\r\n onOpenChange?.(v);\r\n if (controlled === undefined) setInternalOpen(v);\r\n };\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const h = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", h);\r\n return () => document.removeEventListener(\"mousedown\", h);\r\n }, [isOpen]);\r\n\r\n const posMap: Record<string, string> = {\r\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\r\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\r\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\r\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\r\n };\r\n\r\n return (\r\n <div className=\"relative inline-block\" ref={ref}>\r\n <div onClick={() => setOpen(!isOpen)} className=\"cursor-pointer\">\r\n {trigger}\r\n </div>\r\n {isOpen && (\r\n <div\r\n className={`absolute z-50 ${posMap[placement]} w-max max-w-xs`}\r\n >\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card shadow-lg overflow-hidden\">\r\n {title && (\r\n <div className=\"px-4 py-2.5 border-b border-border flex items-center justify-between\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <button\r\n onClick={() => setOpen(false)}\r\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </div>\r\n )}\r\n <div className=\"px-4 py-3\">{children}</div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type ProgressBarSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface ProgressBarProps {\r\n value?: number;\r\n max?: number;\r\n size?: ProgressBarSize;\r\n color?: string;\r\n label?: string;\r\n showValue?: boolean;\r\n indeterminate?: boolean;\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── ProgressBar ─────────────────────────────────────────────────────────────\r\n\r\nexport function ProgressBar({\r\n value,\r\n max = 100,\r\n size = \"md\",\r\n color,\r\n label,\r\n showValue,\r\n indeterminate,\r\n className = \"\",\r\n}: ProgressBarProps) {\r\n const sizes = { sm: \"h-1.5\", md: \"h-2.5\", lg: \"h-4\" };\r\n const pct = indeterminate ? 0 : Math.min(100, Math.max(0, ((value ?? 0) / max) * 100));\r\n\r\n return (\r\n <div className={`w-full ${className}`}>\r\n {(label || showValue) && (\r\n <div className=\"flex items-center justify-between mb-1.5\">\r\n {label && (\r\n <span className=\"text-foreground\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {showValue && !indeterminate && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {Math.round(pct)}%\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n <div className={`w-full ${sizes[size]} rounded-full bg-muted overflow-hidden`}>\r\n {indeterminate ? (\r\n <div\r\n className=\"h-full w-1/3 rounded-full animate-[indeterminate_1.5s_infinite_ease-in-out]\"\r\n style={{ backgroundColor: color ?? \"var(--primary)\" }}\r\n />\r\n ) : (\r\n <div\r\n className=\"h-full rounded-full transition-all duration-500\"\r\n style={{\r\n width: `${pct}%`,\r\n backgroundColor: color ?? \"var(--primary)\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n <style>{`@keyframes indeterminate { 0% { transform: translateX(-100%); } 100% { transform: translateX(400%); } }`}</style>\r\n </div>\r\n );\r\n}\r\n\r\nProgressBar.displayName = \"ProgressBar\";\r\n","import React, { useState } from \"react\";\r\nimport { Star, Heart, ThumbsUp } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type RatingSize = \"sm\" | \"md\" | \"lg\";\r\nexport type RatingIcon = \"star\" | \"heart\" | \"thumb\";\r\n\r\nexport interface RatingProps {\r\n value?: number;\r\n onChange?: (v: number) => void;\r\n max?: number;\r\n size?: RatingSize;\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n icon?: RatingIcon;\r\n showValue?: boolean;\r\n label?: string;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Rating({\r\n value = 0,\r\n onChange,\r\n max = 5,\r\n size = \"md\",\r\n disabled,\r\n readOnly,\r\n icon = \"star\",\r\n showValue,\r\n label,\r\n}: RatingProps) {\r\n const [hover, setHover] = useState(0);\r\n const iconSize = size === \"sm\" ? 16 : size === \"lg\" ? 28 : 20;\r\n const gap = size === \"sm\" ? \"gap-0.5\" : size === \"lg\" ? \"gap-1.5\" : \"gap-1\";\r\n\r\n const IconComp = icon === \"heart\" ? Heart : icon === \"thumb\" ? ThumbsUp : Star;\r\n const activeColor = icon === \"heart\" ? \"text-destructive\" : \"text-chart-5\";\r\n\r\n const items = Array.from({ length: max }, (_, i) => i + 1);\r\n\r\n return (\r\n <div\r\n className={`inline-flex items-center ${gap} ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"\"\r\n }`}\r\n >\r\n {label && (\r\n <span className=\"text-foreground mr-2\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {items.map((n) => {\r\n const filled = n <= (hover || value);\r\n return (\r\n <button\r\n key={n}\r\n type=\"button\"\r\n className={`transition-transform ${\r\n readOnly || disabled\r\n ? \"\"\r\n : \"cursor-pointer hover:scale-110\"\r\n } ${filled ? activeColor : \"text-muted-foreground/40\"}`}\r\n onMouseEnter={() => !readOnly && !disabled && setHover(n)}\r\n onMouseLeave={() => setHover(0)}\r\n onClick={() =>\r\n !readOnly && !disabled && onChange?.(n === value ? 0 : n)\r\n }\r\n disabled={disabled || readOnly}\r\n >\r\n <IconComp\r\n size={iconSize}\r\n fill={filled ? \"currentColor\" : \"none\"}\r\n />\r\n </button>\r\n );\r\n })}\r\n {showValue && (\r\n <span className=\"text-foreground ml-1\" style={fontLabelBold}>\r\n {value}/{max}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface SidebarItem {\r\n /** Unique item identifier */\r\n id: string;\r\n /** Display label */\r\n label: string;\r\n /** Leading icon */\r\n icon?: React.ReactNode;\r\n /** Badge text (e.g., count) */\r\n badge?: string;\r\n}\r\n\r\nexport interface SidebarGroup {\r\n /** Group label (displayed as uppercase header) */\r\n label: string;\r\n /** Items in this group */\r\n items: SidebarItem[];\r\n}\r\n\r\nexport interface SidebarBrand {\r\n /** Brand name */\r\n name: string;\r\n /** Brand logo URL */\r\n logo?: string;\r\n}\r\n\r\nexport interface SidebarProps {\r\n /** Brand card in header */\r\n brand?: SidebarBrand;\r\n /** Navigation groups */\r\n groups: SidebarGroup[];\r\n /** Active item ID */\r\n activeItem?: string;\r\n /** Navigation callback */\r\n onNavigate?: (item: SidebarItem) => void;\r\n /** Collapse to icon-only mode */\r\n collapsed?: boolean;\r\n /** Toggle collapse callback */\r\n onCollapsedChange?: (collapsed: boolean) => void;\r\n /** Sidebar width (default: 256px) */\r\n width?: string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst fontLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n};\r\n\r\nconst btnStyle: 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\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Sidebar ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Sidebar({\r\n brand,\r\n groups,\r\n activeItem,\r\n onNavigate,\r\n collapsed = false,\r\n onCollapsedChange,\r\n className = \"\",\r\n}: SidebarProps) {\r\n return (\r\n <div\r\n className={`bg-sidebar border-r border-sidebar-border flex flex-col flex-shrink-0 transition-all ${\r\n collapsed ? \"w-16\" : \"w-64\"\r\n } ${className}`}\r\n >\r\n {/* Brand */}\r\n {brand && (\r\n <div className=\"px-4 py-4 border-b border-sidebar-border flex items-center gap-2\">\r\n {brand.logo ? (\r\n <img\r\n src={brand.logo}\r\n alt={brand.name}\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] flex-shrink-0 object-cover\"\r\n />\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] bg-primary flex items-center justify-center text-primary-foreground flex-shrink-0\"\r\n style={btnStyle}\r\n >\r\n {brand.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n {!collapsed && (\r\n <span className=\"text-sidebar-foreground truncate\" style={fontLabelBold}>\r\n {brand.name}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Nav */}\r\n <nav className=\"flex-1 overflow-y-auto py-3 px-2\">\r\n {groups.map((g) => (\r\n <div key={g.label} className=\"mb-4\">\r\n {!collapsed && (\r\n <span\r\n className=\"px-2 mb-1.5 block text-muted-foreground uppercase tracking-wider\"\r\n style={btnStyle}\r\n >\r\n {g.label}\r\n </span>\r\n )}\r\n <div className=\"space-y-0.5\">\r\n {g.items.map((item) => {\r\n const active = activeItem === item.id;\r\n return (\r\n <button\r\n key={item.id}\r\n onClick={() => onNavigate?.(item)}\r\n className={`w-full flex items-center gap-2 px-2 py-2 rounded-[var(--radius-md)] transition-colors cursor-pointer ${\r\n active\r\n ? \"bg-sidebar-accent text-sidebar-accent-foreground\"\r\n : \"text-sidebar-foreground hover:bg-sidebar-accent/50\"\r\n }`}\r\n style={fontLabel}\r\n >\r\n <span className={active ? \"text-sidebar-primary\" : \"text-muted-foreground\"}>\r\n {item.icon}\r\n </span>\r\n {!collapsed && (\r\n <span className=\"truncate flex-1 text-left\">{item.label}</span>\r\n )}\r\n {!collapsed && item.badge && (\r\n <span\r\n className=\"px-1.5 py-0.5 rounded-full bg-primary text-primary-foreground\"\r\n style={{ ...btnStyle, lineHeight: \"1\" }}\r\n >\r\n {item.badge}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </nav>\r\n\r\n {/* Footer */}\r\n {onCollapsedChange && (\r\n <div className=\"px-3 py-3 border-t border-sidebar-border\">\r\n <button\r\n onClick={() => onCollapsedChange(!collapsed)}\r\n className=\"w-full px-2 py-1.5 rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-sidebar-accent/50 cursor-pointer text-left\"\r\n style={smallLabel}\r\n >\r\n {collapsed ? \">\" : \"Collapse\"}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nSidebar.displayName = \"Sidebar\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type SkeletonVariant = \"text\" | \"rectangular\" | \"circular\" | \"rounded\";\r\n\r\nexport interface SkeletonProps {\r\n width?: string | number;\r\n height?: string | number;\r\n variant?: SkeletonVariant;\r\n animate?: boolean;\r\n className?: string;\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Skeleton({\r\n width,\r\n height,\r\n variant = \"rectangular\",\r\n animate = true,\r\n className,\r\n}: SkeletonProps) {\r\n const base = \"bg-muted\";\r\n const anim = animate ? \"animate-pulse\" : \"\";\r\n const radius =\r\n variant === \"circular\"\r\n ? \"rounded-full\"\r\n : variant === \"rounded\"\r\n ? \"rounded-[var(--radius-md)]\"\r\n : variant === \"text\"\r\n ? \"rounded-[var(--radius-sm)]\"\r\n : \"rounded-[var(--radius-sm)]\";\r\n\r\n return (\r\n <div\r\n className={`${base} ${anim} ${radius} ${className ?? \"\"}`}\r\n style={{\r\n width: width ?? \"100%\",\r\n height:\r\n height ??\r\n (variant === \"text\" ? \"1em\" : variant === \"circular\" ? 40 : 20),\r\n }}\r\n />\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonCard ─────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonCard() {\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card p-4 space-y-4 w-full max-w-sm\">\r\n <Skeleton variant=\"rounded\" height={160} />\r\n <div className=\"space-y-2\">\r\n <Skeleton variant=\"text\" width=\"60%\" height={20} />\r\n <Skeleton variant=\"text\" width=\"100%\" height={14} />\r\n <Skeleton variant=\"text\" width=\"80%\" height={14} />\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <Skeleton variant=\"circular\" width={36} height={36} />\r\n <div className=\"flex-1 space-y-1.5\">\r\n <Skeleton variant=\"text\" width=\"40%\" height={14} />\r\n <Skeleton variant=\"text\" width=\"25%\" height={12} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonTable ────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonTable() {\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-4 py-3 border-b border-border bg-muted/30 flex gap-4\">\r\n {[120, 160, 100, 80].map((w, i) => (\r\n <Skeleton key={i} variant=\"text\" width={w} height={14} />\r\n ))}\r\n </div>\r\n {[0, 1, 2, 3].map((row) => (\r\n <div\r\n key={row}\r\n className=\"px-4 py-3 border-b border-border flex items-center gap-4\"\r\n >\r\n <Skeleton variant=\"circular\" width={28} height={28} />\r\n <Skeleton variant=\"text\" width={100 + row * 15} height={14} />\r\n <Skeleton\r\n variant=\"text\"\r\n width={140}\r\n height={14}\r\n className=\"flex-1\"\r\n />\r\n <Skeleton variant=\"rounded\" width={60} height={22} />\r\n <Skeleton variant=\"text\" width={80} height={14} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Composed: SkeletonList ─────────────────────────────────────────────────── */\r\n\r\nexport function SkeletonList() {\r\n return (\r\n <div className=\"space-y-3 w-full max-w-md\">\r\n {[0, 1, 2].map((i) => (\r\n <div\r\n key={i}\r\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-[var(--radius-md)] border border-border bg-card\"\r\n >\r\n <Skeleton variant=\"circular\" width={40} height={40} />\r\n <div className=\"flex-1 space-y-1.5\">\r\n <Skeleton\r\n variant=\"text\"\r\n width={`${60 + i * 10}%`}\r\n height={14}\r\n />\r\n <Skeleton\r\n variant=\"text\"\r\n width={`${40 + i * 5}%`}\r\n height={12}\r\n />\r\n </div>\r\n <Skeleton variant=\"rounded\" width={50} height={24} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n\r\nexport interface SpinnerProps {\r\n /** Spinner size */\r\n size?: SpinnerSize;\r\n /** Spinner color (CSS value) */\r\n color?: string;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst sizeClasses: Record<SpinnerSize, string> = {\r\n sm: \"w-4 h-4 border-2\",\r\n md: \"w-8 h-8 border-[3px]\",\r\n lg: \"w-12 h-12 border-4\",\r\n xl: \"w-16 h-16 border-4\",\r\n};\r\n\r\n// ─── Spinner ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Spinner({ size = \"md\", color, className = \"\" }: SpinnerProps) {\r\n return (\r\n <div\r\n className={`${sizeClasses[size]} rounded-full border-muted animate-spin ${className}`}\r\n style={{ borderTopColor: color ?? \"var(--primary)\" }}\r\n role=\"status\"\r\n aria-label=\"Loading\"\r\n />\r\n );\r\n}\r\n\r\nSpinner.displayName = \"Spinner\";\r\n","import React from \"react\";\r\nimport { ArrowUpRight, ArrowDownRight, Minus } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type StatisticSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface StatisticTrend {\r\n value: number;\r\n direction: \"up\" | \"down\" | \"neutral\";\r\n}\r\n\r\nexport interface StatisticProps {\r\n title: string;\r\n value: string | number;\r\n prefix?: React.ReactNode;\r\n suffix?: string;\r\n trend?: StatisticTrend;\r\n trendLabel?: string;\r\n icon?: React.ReactNode;\r\n size?: StatisticSize;\r\n loading?: boolean;\r\n}\r\n\r\nexport interface StatCardProps {\r\n title: string;\r\n value: string | number;\r\n prefix?: React.ReactNode;\r\n trend?: StatisticTrend;\r\n trendLabel?: string;\r\n icon?: React.ReactNode;\r\n iconBg?: string;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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\nconst valueStyles: Record<StatisticSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-h4)\",\r\n fontSize: \"var(--text-h4)\",\r\n fontWeight: \"var(--weight-h4)\",\r\n },\r\n md: {\r\n fontFamily: \"var(--font-h2)\",\r\n fontSize: \"var(--text-h2)\",\r\n fontWeight: \"var(--weight-h2)\",\r\n },\r\n lg: {\r\n fontFamily: \"var(--font-h1)\",\r\n fontSize: \"var(--text-h1)\",\r\n fontWeight: \"var(--weight-h1)\",\r\n },\r\n};\r\n\r\n/* ─── Statistic Component ────────────────────────────────────────────────────── */\r\n\r\nexport function Statistic({\r\n title,\r\n value,\r\n prefix,\r\n suffix,\r\n trend,\r\n trendLabel,\r\n icon,\r\n size = \"md\",\r\n loading,\r\n}: StatisticProps) {\r\n const valueStyle = valueStyles[size];\r\n const trendColor =\r\n trend?.direction === \"up\"\r\n ? \"text-chart-2\"\r\n : trend?.direction === \"down\"\r\n ? \"text-destructive\"\r\n : \"text-muted-foreground\";\r\n const TrendIcon =\r\n trend?.direction === \"up\"\r\n ? ArrowUpRight\r\n : trend?.direction === \"down\"\r\n ? ArrowDownRight\r\n : Minus;\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"space-y-2 animate-pulse\">\r\n <div className=\"h-3 w-20 bg-muted rounded-[var(--radius-sm)]\" />\r\n <div className=\"h-8 w-32 bg-muted rounded-[var(--radius-sm)]\" />\r\n <div className=\"h-3 w-24 bg-muted rounded-[var(--radius-sm)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-1\">\r\n <div className=\"flex items-center gap-2\">\r\n {icon && <span className=\"text-muted-foreground\">{icon}</span>}\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {title}\r\n </span>\r\n </div>\r\n <div className=\"flex items-baseline gap-1\">\r\n {prefix && (\r\n <span className=\"text-muted-foreground\" style={fontLabelBold}>\r\n {prefix}\r\n </span>\r\n )}\r\n <span className=\"text-foreground\" style={valueStyle}>\r\n {typeof value === \"number\" ? value.toLocaleString() : value}\r\n </span>\r\n {suffix && (\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {suffix}\r\n </span>\r\n )}\r\n </div>\r\n {trend && (\r\n <div className={`flex items-center gap-1 ${trendColor}`}>\r\n <TrendIcon size={14} />\r\n <span style={btnStyle}>{trend.value}%</span>\r\n {trendLabel && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {trendLabel}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── StatCard Component ─────────────────────────────────────────────────────── */\r\n\r\nexport function StatCard({\r\n title,\r\n value,\r\n prefix,\r\n trend,\r\n trendLabel,\r\n icon,\r\n iconBg,\r\n}: StatCardProps) {\r\n const trendColor =\r\n trend?.direction === \"up\"\r\n ? \"text-chart-2\"\r\n : trend?.direction === \"down\"\r\n ? \"text-destructive\"\r\n : \"text-muted-foreground\";\r\n const TrendIcon =\r\n trend?.direction === \"up\"\r\n ? ArrowUpRight\r\n : trend?.direction === \"down\"\r\n ? ArrowDownRight\r\n : Minus;\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-lg)] border border-border bg-card p-5\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"space-y-1\">\r\n <span className=\"text-muted-foreground\" style={fontLabel}>\r\n {title}\r\n </span>\r\n <div className=\"flex items-baseline gap-1\">\r\n {prefix && (\r\n <span className=\"text-muted-foreground\" style={fontLabelBold}>\r\n {prefix}\r\n </span>\r\n )}\r\n <span\r\n className=\"text-foreground\"\r\n style={{\r\n fontFamily: \"var(--font-h3)\",\r\n fontSize: \"var(--text-h3)\",\r\n fontWeight: \"var(--weight-h3)\",\r\n }}\r\n >\r\n {typeof value === \"number\" ? value.toLocaleString() : value}\r\n </span>\r\n </div>\r\n {trend && (\r\n <div className={`flex items-center gap-1 ${trendColor}`}>\r\n <TrendIcon size={12} />\r\n <span style={btnStyle}>{trend.value}%</span>\r\n {trendLabel && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {trendLabel}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n {icon && (\r\n <div\r\n className={`w-10 h-10 rounded-[var(--radius-md)] flex items-center justify-center flex-shrink-0 ${\r\n iconBg || \"bg-primary/10 text-primary\"\r\n }`}\r\n >\r\n {icon}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { Check } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface StepDefinition {\r\n /** Step title */\r\n title: string;\r\n /** Optional step description */\r\n description?: string;\r\n}\r\n\r\nexport interface StepperProps {\r\n /** Step definitions */\r\n steps: StepDefinition[];\r\n /** Current active step (0-based) */\r\n current: number;\r\n /** Layout direction */\r\n orientation?: \"horizontal\" | \"vertical\";\r\n /** Step click handler (for navigating to completed steps) */\r\n onStepClick?: (index: number) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\nconst btnStyle: 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// ─── Stepper ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Stepper({\r\n steps,\r\n current,\r\n orientation = \"horizontal\",\r\n onStepClick,\r\n className = \"\",\r\n}: StepperProps) {\r\n if (orientation === \"vertical\") {\r\n return (\r\n <div className={`flex flex-col ${className}`}>\r\n {steps.map((step, i) => {\r\n const done = i < current;\r\n const active = i === current;\r\n return (\r\n <div\r\n key={i}\r\n className=\"flex gap-3\"\r\n onClick={() => onStepClick?.(i)}\r\n >\r\n <div className=\"flex flex-col items-center\">\r\n <div\r\n className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-colors ${\r\n onStepClick ? \"cursor-pointer\" : \"\"\r\n } ${\r\n done\r\n ? \"bg-primary text-primary-foreground\"\r\n : active\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"bg-muted text-muted-foreground\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n {done ? <Check size={14} /> : i + 1}\r\n </div>\r\n {i < steps.length - 1 && (\r\n <div\r\n className={`w-px flex-1 min-h-[24px] my-1 ${\r\n done ? \"bg-primary\" : \"bg-border\"\r\n }`}\r\n />\r\n )}\r\n </div>\r\n <div className={`pb-6 ${i === steps.length - 1 ? \"pb-0\" : \"\"}`}>\r\n <span\r\n className={`block ${\r\n active ? \"text-foreground\" : \"text-muted-foreground\"\r\n }`}\r\n style={active ? fontLabelBold : fontLabel}\r\n >\r\n {step.title}\r\n </span>\r\n {step.description && (\r\n <span className=\"text-muted-foreground block\" style={smallLabel}>\r\n {step.description}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`flex items-center ${className}`}>\r\n {steps.map((step, i) => {\r\n const done = i < current;\r\n const active = i === current;\r\n return (\r\n <div\r\n key={i}\r\n className={`flex items-center ${i < steps.length - 1 ? \"flex-1\" : \"\"}`}\r\n >\r\n <div\r\n className=\"flex flex-col items-center gap-1\"\r\n onClick={() => onStepClick?.(i)}\r\n >\r\n <div\r\n className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 transition-colors ${\r\n onStepClick ? \"cursor-pointer\" : \"\"\r\n } ${\r\n done\r\n ? \"bg-primary text-primary-foreground\"\r\n : active\r\n ? \"bg-primary text-primary-foreground\"\r\n : \"bg-muted text-muted-foreground\"\r\n }`}\r\n style={btnStyle}\r\n >\r\n {done ? <Check size={14} /> : i + 1}\r\n </div>\r\n <span\r\n className={`text-center ${\r\n active ? \"text-foreground\" : \"text-muted-foreground\"\r\n }`}\r\n style={active ? fontLabelBold : smallLabel}\r\n >\r\n {step.title}\r\n </span>\r\n </div>\r\n {i < steps.length - 1 && (\r\n <div\r\n className={`flex-1 h-px mx-2 mt-[-20px] ${\r\n done ? \"bg-primary\" : \"bg-border\"\r\n }`}\r\n />\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n\r\nStepper.displayName = \"Stepper\";\r\n","import React from \"react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\r\nexport type SwitchColor = \"primary\" | \"success\" | \"warning\" | \"destructive\";\r\n\r\nexport interface SwitchProps {\r\n checked: boolean;\r\n onChange: (v: boolean) => void;\r\n label?: string;\r\n description?: string;\r\n size?: SwitchSize;\r\n disabled?: boolean;\r\n color?: SwitchColor;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Config ─────────────────────────────────────────────────────────────────── */\r\n\r\nconst sizes: Record<SwitchSize, { track: string; thumb: string; on: string }> = {\r\n sm: { track: \"w-7 h-4\", thumb: \"w-3 h-3\", on: \"translate-x-3\" },\r\n md: { track: \"w-10 h-6\", thumb: \"w-4.5 h-4.5\", on: \"translate-x-4.5\" },\r\n lg: { track: \"w-14 h-8\", thumb: \"w-6.5 h-6.5\", on: \"translate-x-6\" },\r\n};\r\n\r\nconst colors: Record<SwitchColor, string> = {\r\n primary: \"bg-primary\",\r\n success: \"bg-chart-2\",\r\n warning: \"bg-chart-5\",\r\n destructive: \"bg-destructive\",\r\n};\r\n\r\nconst thumbPx: Record<SwitchSize, { w: number; h: number; on: number }> = {\r\n sm: { w: 12, h: 12, on: 14 },\r\n md: { w: 18, h: 18, on: 18 },\r\n lg: { w: 26, h: 26, on: 24 },\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Switch({\r\n checked,\r\n onChange,\r\n label,\r\n description,\r\n size = \"md\",\r\n disabled,\r\n color = \"primary\",\r\n}: SwitchProps) {\r\n const s = sizes[size];\r\n const tp = thumbPx[size];\r\n\r\n return (\r\n <label\r\n className={`inline-flex items-start gap-3 ${\r\n disabled ? \"opacity-50 pointer-events-none\" : \"cursor-pointer\"\r\n }`}\r\n >\r\n <button\r\n role=\"switch\"\r\n aria-checked={checked}\r\n onClick={() => onChange(!checked)}\r\n disabled={disabled}\r\n className={`${s.track} rounded-full relative flex-shrink-0 transition-colors cursor-pointer ${\r\n checked ? colors[color] : \"bg-muted\"\r\n }`}\r\n >\r\n <span\r\n className=\"rounded-full bg-white shadow-sm absolute transition-transform\"\r\n style={{\r\n width: tp.w,\r\n height: tp.h,\r\n top: \"50%\",\r\n transform: `translateY(-50%) translateX(${checked ? tp.on : 2}px)`,\r\n left: 0,\r\n }}\r\n />\r\n </button>\r\n {(label || description) && (\r\n <div>\r\n {label && (\r\n <span className=\"text-foreground block\" style={fontLabel}>\r\n {label}\r\n </span>\r\n )}\r\n {description && (\r\n <span className=\"text-muted-foreground block\" style={smallLabel}>\r\n {description}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </label>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TagColor = \"default\" | \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"info\";\r\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\r\n\r\nexport interface TagProps {\r\n /** Tag content */\r\n children: React.ReactNode;\r\n /** Color variant */\r\n color?: TagColor;\r\n /** Tag size */\r\n size?: TagSize;\r\n /** Leading icon element */\r\n icon?: React.ReactNode;\r\n /** Show close button */\r\n closable?: boolean;\r\n /** Close callback */\r\n onClose?: () => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst colorClasses: Record<TagColor, string> = {\r\n default: \"bg-muted/50 text-foreground border-border\",\r\n primary: \"bg-primary/10 text-primary border-primary/20\",\r\n success: \"bg-chart-2/10 text-chart-2 border-chart-2/20\",\r\n warning: \"bg-chart-5/10 text-chart-5 border-chart-5/20\",\r\n destructive: \"bg-destructive/10 text-destructive border-destructive/20\",\r\n info: \"bg-accent text-accent-foreground border-primary/20\",\r\n};\r\n\r\nconst sizePadding: Record<TagSize, string> = {\r\n sm: \"px-1.5 py-0.5\",\r\n md: \"px-2 py-0.5\",\r\n lg: \"px-3 py-1.5\",\r\n};\r\n\r\nconst sizeStyles: Record<TagSize, React.CSSProperties> = {\r\n sm: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n md: {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n lg: {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n },\r\n};\r\n\r\n// ─── Tag ─────────────────────────────────────────────────────────────────────\r\n\r\nexport function Tag({\r\n children,\r\n color = \"default\",\r\n size = \"md\",\r\n icon,\r\n closable,\r\n onClose,\r\n className = \"\",\r\n}: TagProps) {\r\n const cls = colorClasses[color];\r\n const sz = sizePadding[size];\r\n const style = sizeStyles[size];\r\n\r\n return (\r\n <span\r\n className={`inline-flex items-center gap-1 rounded-full border ${cls} ${sz} ${className}`}\r\n style={style}\r\n >\r\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\r\n {children}\r\n {closable && (\r\n <button className=\"hover:opacity-70 cursor-pointer\" onClick={onClose}>\r\n <X size={size === \"sm\" ? 10 : 12} />\r\n </button>\r\n )}\r\n </span>\r\n );\r\n}\r\n\r\nTag.displayName = \"Tag\";\r\n","import React, { useState } from \"react\";\r\nimport { X } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TagInputVariant = \"default\" | \"outline\" | \"filled\";\r\n\r\nexport interface TagInputProps {\r\n /** Array of tag values */\r\n tags: string[];\r\n /** Callback when tags change */\r\n onChange: (tags: string[]) => void;\r\n /** Input placeholder text */\r\n placeholder?: string;\r\n /** Disable input */\r\n disabled?: boolean;\r\n /** Maximum number of tags */\r\n maxTags?: number;\r\n /** Visual variant */\r\n variant?: TagInputVariant;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst fontLabel: 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\nconst btnStyle: 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\nconst variantClasses: Record<TagInputVariant, string> = {\r\n default: \"bg-card border-border\",\r\n outline: \"bg-transparent border-border\",\r\n filled: \"bg-muted/30 border-transparent\",\r\n};\r\n\r\n// ─── TagInput ────────────────────────────────────────────────────────────────\r\n\r\nexport function TagInput({\r\n tags,\r\n onChange,\r\n placeholder,\r\n disabled,\r\n maxTags,\r\n variant = \"default\",\r\n className = \"\",\r\n}: TagInputProps) {\r\n const [input, setInput] = useState(\"\");\r\n\r\n const add = () => {\r\n const v = input.trim();\r\n if (!v || tags.includes(v) || (maxTags && tags.length >= maxTags)) return;\r\n onChange([...tags, v]);\r\n setInput(\"\");\r\n };\r\n\r\n const remove = (tag: string) => {\r\n onChange(tags.filter((t) => t !== tag));\r\n };\r\n\r\n return (\r\n <div\r\n className={`flex flex-wrap items-center gap-1.5 px-3 py-2 rounded-[var(--radius)] border ${variantClasses[variant]} transition-colors focus-within:border-primary ${disabled ? \"opacity-50 pointer-events-none\" : \"\"} ${className}`}\r\n >\r\n {tags.map((t) => (\r\n <span\r\n key={t}\r\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-[var(--radius-sm)] bg-primary/10 text-primary\"\r\n style={btnStyle}\r\n >\r\n {t}\r\n <button\r\n className=\"hover:text-destructive cursor-pointer\"\r\n onClick={() => remove(t)}\r\n >\r\n <X size={12} />\r\n </button>\r\n </span>\r\n ))}\r\n <input\r\n value={input}\r\n onChange={(e) => setInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n add();\r\n }\r\n if (e.key === \"Backspace\" && !input && tags.length) {\r\n onChange(tags.slice(0, -1));\r\n }\r\n }}\r\n placeholder={!tags.length ? placeholder : \"\"}\r\n className=\"flex-1 min-w-[80px] bg-transparent outline-none text-foreground placeholder:text-muted-foreground\"\r\n style={fontLabel}\r\n disabled={disabled}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nTagInput.displayName = \"TagInput\";\r\n","import React from \"react\";\r\nimport { CheckCircle2, Circle } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport type TimelineVariant = \"default\" | \"alternate\" | \"compact\";\r\nexport type TimelineSize = \"sm\" | \"md\" | \"lg\";\r\nexport type TimelineItemStatus = \"completed\" | \"current\" | \"pending\" | \"error\";\r\n\r\nexport interface TimelineItem {\r\n title: string;\r\n description?: string;\r\n time?: string;\r\n icon?: React.ReactNode;\r\n status?: TimelineItemStatus;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport interface TimelineProps {\r\n items: TimelineItem[];\r\n variant?: TimelineVariant;\r\n size?: TimelineSize;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Timeline({\r\n items,\r\n variant = \"default\",\r\n size = \"md\",\r\n}: TimelineProps) {\r\n const dotSize =\r\n size === \"sm\" ? \"w-6 h-6\" : size === \"lg\" ? \"w-10 h-10\" : \"w-8 h-8\";\r\n const iconSz = size === \"sm\" ? 12 : size === \"lg\" ? 18 : 14;\r\n\r\n const statusColor = (s?: string) =>\r\n s === \"completed\"\r\n ? \"bg-chart-2 text-white\"\r\n : s === \"current\"\r\n ? \"bg-primary text-primary-foreground\"\r\n : s === \"error\"\r\n ? \"bg-destructive text-white\"\r\n : \"bg-muted text-muted-foreground\";\r\n\r\n if (variant === \"compact\") {\r\n return (\r\n <div className=\"space-y-0\">\r\n {items.map((item, i) => (\r\n <div key={i} className=\"flex items-start gap-3\">\r\n <div className=\"flex flex-col items-center\">\r\n <div\r\n className={`${dotSize} rounded-full flex items-center justify-center flex-shrink-0 ${statusColor(\r\n item.status\r\n )}`}\r\n >\r\n {item.icon ||\r\n (item.status === \"completed\" ? (\r\n <CheckCircle2 size={iconSz} />\r\n ) : (\r\n <Circle size={iconSz} />\r\n ))}\r\n </div>\r\n {i < items.length - 1 && (\r\n <div className=\"w-0.5 flex-1 min-h-4 bg-border\" />\r\n )}\r\n </div>\r\n <div className=\"pb-4 min-w-0\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {item.title}\r\n </span>\r\n {item.time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {item.time}\r\n </span>\r\n )}\r\n </div>\r\n {item.description && (\r\n <p\r\n className=\"text-muted-foreground mt-0.5\"\r\n style={smallLabel}\r\n >\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"relative\">\r\n {items.map((item, i) => {\r\n const isAlt = variant === \"alternate\" && i % 2 === 1;\r\n return (\r\n <div\r\n key={i}\r\n className={`flex gap-4 pb-8 last:pb-0 ${\r\n isAlt ? \"flex-row-reverse\" : \"\"\r\n }`}\r\n >\r\n <div className=\"flex flex-col items-center flex-shrink-0\">\r\n <div\r\n className={`${dotSize} rounded-full flex items-center justify-center ${statusColor(\r\n item.status\r\n )}`}\r\n >\r\n {item.icon ||\r\n (item.status === \"completed\" ? (\r\n <CheckCircle2 size={iconSz} />\r\n ) : (\r\n <Circle size={iconSz} />\r\n ))}\r\n </div>\r\n {i < items.length - 1 && (\r\n <div className=\"w-0.5 flex-1 bg-border mt-1\" />\r\n )}\r\n </div>\r\n <div\r\n className={`flex-1 min-w-0 ${isAlt ? \"text-right\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center gap-2 ${\r\n isAlt ? \"justify-end\" : \"\"\r\n }`}\r\n >\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {item.title}\r\n </span>\r\n {item.time && (\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {item.time}\r\n </span>\r\n )}\r\n </div>\r\n {item.description && (\r\n <p\r\n className=\"text-muted-foreground mt-0.5\"\r\n style={fontLabel}\r\n >\r\n {item.description}\r\n </p>\r\n )}\r\n {item.children && (\r\n <div className=\"mt-2\">{item.children}</div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\nexport interface TooltipProps {\r\n /** Trigger element */\r\n children: React.ReactNode;\r\n /** Tooltip content */\r\n content: string;\r\n /** Tooltip position */\r\n placement?: TooltipPlacement;\r\n /** Additional class name for the wrapper */\r\n className?: string;\r\n}\r\n\r\n// ─── Config ──────────────────────────────────────────────────────────────────\r\n\r\nconst placementClasses: Record<TooltipPlacement, string> = {\r\n top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\r\n bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\r\n left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\r\n right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n// ─── Tooltip ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Tooltip({\r\n children,\r\n content,\r\n placement = \"top\",\r\n className = \"\",\r\n}: TooltipProps) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div\r\n className={`relative inline-flex ${className}`}\r\n onMouseEnter={() => setShow(true)}\r\n onMouseLeave={() => setShow(false)}\r\n onFocus={() => setShow(true)}\r\n onBlur={() => setShow(false)}\r\n >\r\n {children}\r\n {show && (\r\n <div\r\n className={`absolute ${placementClasses[placement]} z-50 px-3 py-1.5 rounded-[var(--radius-sm)] bg-foreground text-background whitespace-nowrap shadow-md`}\r\n style={smallLabel}\r\n role=\"tooltip\"\r\n >\r\n {content}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTooltip.displayName = \"Tooltip\";\r\n","import React from \"react\";\r\nimport { ChevronRight, Search, Bell, Menu } from \"lucide-react\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport interface BreadcrumbItem {\r\n /** Display label */\r\n label: string;\r\n /** Optional href for navigation */\r\n href?: string;\r\n}\r\n\r\nexport interface TopNavbarBrand {\r\n /** Brand name */\r\n name: string;\r\n /** Logo URL or ReactNode */\r\n logo?: string | React.ReactNode;\r\n}\r\n\r\nexport interface TopNavbarUser {\r\n /** User display name */\r\n name: string;\r\n /** Avatar image URL */\r\n avatar?: string;\r\n}\r\n\r\nexport interface TopNavbarProps {\r\n /** Brand logo and name */\r\n brand?: TopNavbarBrand;\r\n /** Breadcrumb items */\r\n breadcrumbs?: BreadcrumbItem[];\r\n /** Right-side action area */\r\n actions?: React.ReactNode;\r\n /** User avatar */\r\n user?: TopNavbarUser;\r\n /** Navbar height */\r\n height?: string;\r\n /** Show search bar */\r\n showSearch?: boolean;\r\n /** Search placeholder text */\r\n searchPlaceholder?: string;\r\n /** Search click handler */\r\n onSearchClick?: () => void;\r\n /** Notification count (0 = hidden) */\r\n notificationCount?: number;\r\n /** Notification click handler */\r\n onNotificationClick?: () => void;\r\n /** Mobile menu click handler */\r\n onMobileMenuClick?: () => void;\r\n /** User click handler */\r\n onUserClick?: () => void;\r\n /** Breadcrumb click handler */\r\n onBreadcrumbClick?: (item: BreadcrumbItem, index: number) => void;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n// ─── Styles ──────────────────────────────────────────────────────────────────\r\n\r\nconst btnStyle: 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// ─── TopNavbar ───────────────────────────────────────────────────────────────\r\n\r\nexport function TopNavbar({\r\n brand,\r\n breadcrumbs,\r\n actions,\r\n user,\r\n height = \"72px\",\r\n showSearch = false,\r\n searchPlaceholder = \"Search... (Ctrl+K)\",\r\n onSearchClick,\r\n notificationCount,\r\n onNotificationClick,\r\n onMobileMenuClick,\r\n onUserClick,\r\n onBreadcrumbClick,\r\n className = \"\",\r\n}: TopNavbarProps) {\r\n const initials = user?.name\r\n ? user.name\r\n .split(\" \")\r\n .map((w) => w[0])\r\n .join(\"\")\r\n .slice(0, 2)\r\n .toUpperCase()\r\n : \"\";\r\n\r\n return (\r\n <div\r\n className={`bg-card border-b border-border flex items-center px-5 gap-4 ${className}`}\r\n style={{ height }}\r\n >\r\n {/* Mobile menu button */}\r\n {onMobileMenuClick && (\r\n <button\r\n className=\"lg:hidden w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-foreground hover:bg-muted/30 transition-colors cursor-pointer\"\r\n onClick={onMobileMenuClick}\r\n >\r\n <Menu size={16} />\r\n </button>\r\n )}\r\n\r\n {/* Brand */}\r\n {brand && (\r\n <>\r\n {typeof brand.logo === \"string\" ? (\r\n <img\r\n src={brand.logo}\r\n alt={brand.name}\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] flex-shrink-0 object-cover\"\r\n />\r\n ) : brand.logo ? (\r\n <div className=\"w-8 h-8 rounded-[var(--radius-sm)] overflow-hidden flex-shrink-0\">\r\n {brand.logo}\r\n </div>\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-[var(--radius-sm)] bg-primary flex items-center justify-center text-primary-foreground flex-shrink-0\"\r\n style={btnStyle}\r\n >\r\n {brand.name.charAt(0).toUpperCase()}\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {/* Breadcrumbs */}\r\n {breadcrumbs && breadcrumbs.length > 0 && (\r\n <nav className=\"hidden sm:flex items-center gap-1.5 text-muted-foreground\" style={btnStyle}>\r\n {breadcrumbs.map((item, i) => (\r\n <React.Fragment key={i}>\r\n {i > 0 && <ChevronRight size={12} />}\r\n {item.href || onBreadcrumbClick ? (\r\n <span\r\n className={`cursor-pointer ${\r\n i === breadcrumbs.length - 1\r\n ? \"text-foreground\"\r\n : \"hover:text-foreground\"\r\n }`}\r\n onClick={() => onBreadcrumbClick?.(item, i)}\r\n >\r\n {item.label}\r\n </span>\r\n ) : (\r\n <span\r\n className={\r\n i === breadcrumbs.length - 1 ? \"text-foreground\" : \"\"\r\n }\r\n >\r\n {item.label}\r\n </span>\r\n )}\r\n </React.Fragment>\r\n ))}\r\n </nav>\r\n )}\r\n\r\n {/* Spacer */}\r\n <div className=\"flex-1\" />\r\n\r\n {/* Search */}\r\n {showSearch && (\r\n <div\r\n className=\"hidden md:flex items-center gap-2 px-3 h-8 rounded-[var(--radius)] border border-border bg-muted/20 text-muted-foreground w-56 cursor-pointer hover:border-primary/40 transition-colors\"\r\n onClick={onSearchClick}\r\n >\r\n <Search size={14} />\r\n <span style={btnStyle}>{searchPlaceholder}</span>\r\n </div>\r\n )}\r\n\r\n {/* Custom actions */}\r\n {actions}\r\n\r\n {/* Notifications */}\r\n {onNotificationClick && (\r\n <button\r\n className=\"relative w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] text-muted-foreground hover:text-foreground hover:bg-muted/30 transition-colors cursor-pointer\"\r\n onClick={onNotificationClick}\r\n >\r\n <Bell size={16} />\r\n {notificationCount !== undefined && notificationCount > 0 && (\r\n <span className=\"absolute top-1 right-1 w-2 h-2 rounded-full bg-destructive\" />\r\n )}\r\n </button>\r\n )}\r\n\r\n {/* User avatar */}\r\n {user && (\r\n <div\r\n className=\"cursor-pointer\"\r\n onClick={onUserClick}\r\n >\r\n {user.avatar ? (\r\n <img\r\n src={user.avatar}\r\n alt={user.name}\r\n className=\"w-8 h-8 rounded-full object-cover\"\r\n />\r\n ) : (\r\n <div\r\n className=\"w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center\"\r\n style={btnStyle}\r\n >\r\n {initials}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTopNavbar.displayName = \"TopNavbar\";\r\n","import React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronLeft, ChevronsRight, ChevronsLeft, Search } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface TransferItem {\r\n id: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface TransferListProps {\r\n sourceTitle?: string;\r\n targetTitle?: string;\r\n items: TransferItem[];\r\n defaultTarget?: string[];\r\n searchable?: boolean;\r\n /** Controlled: IDs of items in the target list */\r\n value?: string[];\r\n /** Called when target list changes */\r\n onChange?: (targetIds: string[]) => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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\nconst fontLabelBold: React.CSSProperties = {\r\n fontFamily: \"var(--font-label)\",\r\n fontSize: \"var(--text-label)\",\r\n fontWeight: \"var(--weight-button)\",\r\n};\r\n\r\nconst smallLabel: React.CSSProperties = {\r\n fontFamily: \"var(--font-button)\",\r\n fontSize: \"var(--text-button)\",\r\n fontWeight: \"var(--weight-label)\",\r\n};\r\n\r\n/* ─── Sub-component: ListBox ─────────────────────────────────────────────────── */\r\n\r\nfunction ListBox({\r\n title,\r\n items,\r\n selected,\r\n onToggle,\r\n search,\r\n onSearch,\r\n searchable,\r\n}: {\r\n title: string;\r\n items: TransferItem[];\r\n selected: Set<string>;\r\n onToggle: (id: string) => void;\r\n search: string;\r\n onSearch: (v: string) => void;\r\n searchable?: boolean;\r\n}) {\r\n return (\r\n <div className=\"flex-1 min-w-[180px] rounded-[var(--radius-lg)] border border-border bg-card overflow-hidden\">\r\n <div className=\"px-3 py-2.5 border-b border-border bg-muted/30 flex items-center justify-between\">\r\n <span className=\"text-foreground\" style={fontLabelBold}>\r\n {title}\r\n </span>\r\n <span className=\"text-muted-foreground\" style={smallLabel}>\r\n {items.length} items\r\n </span>\r\n </div>\r\n {searchable && (\r\n <div className=\"px-3 py-2 border-b border-border flex items-center gap-2\">\r\n <Search size={12} className=\"text-muted-foreground\" />\r\n <input\r\n value={search}\r\n onChange={(e) => onSearch(e.target.value)}\r\n placeholder=\"Search\\u2026\"\r\n className=\"flex-1 bg-transparent outline-none text-foreground placeholder:text-muted-foreground\"\r\n style={smallLabel}\r\n />\r\n </div>\r\n )}\r\n <div className=\"max-h-[240px] overflow-y-auto py-1\">\r\n {items.length === 0 && (\r\n <div\r\n className=\"px-3 py-6 text-center text-muted-foreground\"\r\n style={smallLabel}\r\n >\r\n No items\r\n </div>\r\n )}\r\n {items.map((item) => (\r\n <button\r\n key={item.id}\r\n onClick={() => !item.disabled && onToggle(item.id)}\r\n className={`w-full flex items-center gap-2 px-3 py-1.5 transition-colors cursor-pointer\r\n ${selected.has(item.id) ? \"bg-primary/10\" : \"hover:bg-accent\"}\r\n ${item.disabled ? \"opacity-40 pointer-events-none\" : \"\"}`}\r\n style={fontLabel}\r\n >\r\n <span\r\n className={`w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center flex-shrink-0\r\n ${selected.has(item.id) ? \"bg-primary border-primary\" : \"border-border\"}`}\r\n >\r\n {selected.has(item.id) && (\r\n <span className=\"w-2 h-2 rounded-[1px] bg-primary-foreground\" />\r\n )}\r\n </span>\r\n <span className=\"text-foreground truncate\">{item.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function TransferList({\r\n sourceTitle = \"Available\",\r\n targetTitle = \"Selected\",\r\n items,\r\n defaultTarget = [],\r\n searchable,\r\n value,\r\n onChange,\r\n}: TransferListProps) {\r\n const [internalTarget, setInternalTarget] = useState<Set<string>>(\r\n new Set(defaultTarget)\r\n );\r\n\r\n // Support controlled (value) and uncontrolled modes\r\n const target = value !== undefined ? new Set(value) : internalTarget;\r\n const updateTarget = (next: Set<string>) => {\r\n if (onChange) {\r\n onChange(Array.from(next));\r\n }\r\n if (value === undefined) {\r\n setInternalTarget(next);\r\n }\r\n };\r\n const [sourceSelected, setSourceSelected] = useState<Set<string>>(\r\n new Set()\r\n );\r\n const [targetSelected, setTargetSelected] = useState<Set<string>>(\r\n new Set()\r\n );\r\n const [sourceSearch, setSourceSearch] = useState(\"\");\r\n const [targetSearch, setTargetSearch] = useState(\"\");\r\n\r\n const source = items.filter((i) => !target.has(i.id));\r\n const targetItems = items.filter((i) => target.has(i.id));\r\n\r\n const filteredSource = sourceSearch\r\n ? source.filter((i) =>\r\n i.label.toLowerCase().includes(sourceSearch.toLowerCase())\r\n )\r\n : source;\r\n const filteredTarget = targetSearch\r\n ? targetItems.filter((i) =>\r\n i.label.toLowerCase().includes(targetSearch.toLowerCase())\r\n )\r\n : targetItems;\r\n\r\n const moveRight = () => {\r\n const n = new Set(target);\r\n sourceSelected.forEach((id) => n.add(id));\r\n updateTarget(n);\r\n setSourceSelected(new Set());\r\n };\r\n const moveLeft = () => {\r\n const n = new Set(target);\r\n targetSelected.forEach((id) => n.delete(id));\r\n updateTarget(n);\r\n setTargetSelected(new Set());\r\n };\r\n const moveAllRight = () => {\r\n updateTarget(new Set(items.filter((i) => !i.disabled).map((i) => i.id)));\r\n setSourceSelected(new Set());\r\n };\r\n const moveAllLeft = () => {\r\n updateTarget(new Set());\r\n setTargetSelected(new Set());\r\n };\r\n\r\n const toggleSelect = (\r\n id: string,\r\n set: Set<string>,\r\n setter: (s: Set<string>) => void\r\n ) => {\r\n const n = new Set(set);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n setter(n);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-stretch gap-3 flex-wrap\">\r\n <ListBox\r\n title={sourceTitle}\r\n items={filteredSource}\r\n selected={sourceSelected}\r\n onToggle={(id) =>\r\n toggleSelect(id, sourceSelected, setSourceSelected)\r\n }\r\n search={sourceSearch}\r\n onSearch={setSourceSearch}\r\n searchable={searchable}\r\n />\r\n\r\n <div className=\"flex flex-col items-center justify-center gap-1.5 py-4\">\r\n <button\r\n onClick={moveAllRight}\r\n disabled={source.length === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronsRight size={14} />\r\n </button>\r\n <button\r\n onClick={moveRight}\r\n disabled={sourceSelected.size === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronRight size={14} />\r\n </button>\r\n <button\r\n onClick={moveLeft}\r\n disabled={targetSelected.size === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronLeft size={14} />\r\n </button>\r\n <button\r\n onClick={moveAllLeft}\r\n disabled={targetItems.length === 0}\r\n className=\"w-8 h-8 flex items-center justify-center rounded-[var(--radius-md)] border border-border text-muted-foreground hover:text-foreground hover:bg-accent disabled:opacity-30 transition-colors cursor-pointer\"\r\n >\r\n <ChevronsLeft size={14} />\r\n </button>\r\n </div>\r\n\r\n <ListBox\r\n title={targetTitle}\r\n items={filteredTarget}\r\n selected={targetSelected}\r\n onToggle={(id) =>\r\n toggleSelect(id, targetSelected, setTargetSelected)\r\n }\r\n search={targetSearch}\r\n onSearch={setTargetSearch}\r\n searchable={searchable}\r\n />\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { ChevronRight, ChevronDown, Folder, FolderOpen, File } from \"lucide-react\";\r\n\r\n/* ─── Types ──────────────────────────────────────────────────────────────────── */\r\n\r\nexport interface TreeNode {\r\n id: string;\r\n label: string;\r\n icon?: React.ReactNode;\r\n children?: TreeNode[];\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface TreeProps {\r\n data: TreeNode[];\r\n selectable?: boolean;\r\n showLines?: boolean;\r\n defaultExpanded?: string[];\r\n /** Controlled: expanded node IDs */\r\n expandedItems?: string[];\r\n /** Called when expanded state changes */\r\n onExpandChange?: (expandedIds: string[]) => void;\r\n /** Controlled: selected node IDs */\r\n selectedItems?: string[];\r\n /** Called when selection changes */\r\n onSelect?: (selectedIds: string[]) => void;\r\n}\r\n\r\n/* ─── Style helpers ──────────────────────────────────────────────────────────── */\r\n\r\nconst fontLabel: 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/* ─── Sub-component: TreeItem ────────────────────────────────────────────────── */\r\n\r\nfunction TreeItem({\r\n node,\r\n level,\r\n expanded,\r\n selected,\r\n onToggle,\r\n onSelect,\r\n selectable,\r\n showLines,\r\n}: {\r\n node: TreeNode;\r\n level: number;\r\n expanded: Set<string>;\r\n selected: Set<string>;\r\n onToggle: (id: string) => void;\r\n onSelect: (id: string) => void;\r\n selectable?: boolean;\r\n showLines?: boolean;\r\n}) {\r\n const hasChildren = node.children && node.children.length > 0;\r\n const isExpanded = expanded.has(node.id);\r\n const isSelected = selected.has(node.id);\r\n\r\n const defaultIcon = hasChildren\r\n ? isExpanded\r\n ? <FolderOpen size={14} className=\"text-chart-5\" />\r\n : <Folder size={14} className=\"text-chart-5\" />\r\n : <File size={14} className=\"text-muted-foreground\" />;\r\n\r\n return (\r\n <div>\r\n <div\r\n className={`flex items-center gap-1.5 py-1 px-2 rounded-[var(--radius-sm)] transition-colors\r\n ${node.disabled ? \"opacity-40 pointer-events-none\" : \"cursor-pointer hover:bg-accent\"}\r\n ${isSelected ? \"bg-primary/10 text-primary\" : \"text-foreground\"}`}\r\n style={{ paddingLeft: `${level * 20 + 8}px`, ...fontLabel }}\r\n onClick={() => {\r\n if (hasChildren) onToggle(node.id);\r\n if (selectable) onSelect(node.id);\r\n }}\r\n >\r\n {hasChildren ? (\r\n <span className=\"w-4 h-4 flex items-center justify-center flex-shrink-0\">\r\n {isExpanded ? <ChevronDown size={12} /> : <ChevronRight size={12} />}\r\n </span>\r\n ) : (\r\n <span className=\"w-4\" />\r\n )}\r\n {selectable && (\r\n <span\r\n className={`w-4 h-4 rounded-[var(--radius-sm)] border flex items-center justify-center flex-shrink-0 ${\r\n isSelected ? \"bg-primary border-primary\" : \"border-border\"\r\n }`}\r\n >\r\n {isSelected && (\r\n <span className=\"w-2 h-2 rounded-[1px] bg-primary-foreground\" />\r\n )}\r\n </span>\r\n )}\r\n <span className=\"flex-shrink-0\">{node.icon || defaultIcon}</span>\r\n <span className=\"truncate\">{node.label}</span>\r\n </div>\r\n {hasChildren && isExpanded && (\r\n <div className={showLines ? \"border-l border-border ml-[22px]\" : \"\"}>\r\n {node.children!.map((child) => (\r\n <TreeItem\r\n key={child.id}\r\n node={child}\r\n level={level + 1}\r\n expanded={expanded}\r\n selected={selected}\r\n onToggle={onToggle}\r\n onSelect={onSelect}\r\n selectable={selectable}\r\n showLines={showLines}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/* ─── Component ──────────────────────────────────────────────────────────────── */\r\n\r\nexport function Tree({\r\n data,\r\n selectable,\r\n showLines,\r\n defaultExpanded,\r\n expandedItems,\r\n onExpandChange,\r\n selectedItems,\r\n onSelect,\r\n}: TreeProps) {\r\n const [internalExpanded, setInternalExpanded] = useState<Set<string>>(\r\n new Set(defaultExpanded || [])\r\n );\r\n const [internalSelected, setInternalSelected] = useState<Set<string>>(new Set());\r\n\r\n // Support controlled and uncontrolled modes\r\n const expanded = expandedItems !== undefined ? new Set(expandedItems) : internalExpanded;\r\n const selected = selectedItems !== undefined ? new Set(selectedItems) : internalSelected;\r\n\r\n const toggle = (id: string) => {\r\n const n = new Set(expanded);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n if (onExpandChange) {\r\n onExpandChange(Array.from(n));\r\n }\r\n if (expandedItems === undefined) {\r\n setInternalExpanded(n);\r\n }\r\n };\r\n const select = (id: string) => {\r\n const n = new Set(selected);\r\n if (n.has(id)) n.delete(id);\r\n else n.add(id);\r\n if (onSelect) {\r\n onSelect(Array.from(n));\r\n }\r\n if (selectedItems === undefined) {\r\n setInternalSelected(n);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rounded-[var(--radius-md)] border border-border bg-card py-1\">\r\n {data.map((node) => (\r\n <TreeItem\r\n key={node.id}\r\n node={node}\r\n level={0}\r\n expanded={expanded}\r\n selected={selected}\r\n onToggle={toggle}\r\n onSelect={select}\r\n selectable={selectable}\r\n showLines={showLines}\r\n />\r\n ))}\r\n </div>\r\n );\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","ArrowDownRight","ArrowUpRight","BellOff","Bell","Calendar","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ChevronsLeft","ChevronsRight","ChevronsUpDown","CircleAlert","CircleCheck","CircleX","Circle","Clock","Copy","Dot","Ellipsis","ExternalLink","EyeOff","Eye","FileText","File","Film","FolderOpen","Folder","Heart","Image","Inbox","Info","LoaderCircle","Menu","Minus","Plus","RotateCw","Search","Slash","Star","ThumbsUp","TriangleAlert","Upload","X","ZoomIn","ZoomOut","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","fontLabelBold","fontLabel","AccordionItem","onToggle","Accordion","type","items","defaultOpen","internalSingle","setInternalSingle","internalMultiple","setInternalMultiple","isControlled","isOpen","toggle","arr","prev","n","colors","statusSizes","statusColors","Avatar","src","status","initials","w","bgColor","AvatarGroup","max","extra","child","textStyles","Breadcrumb","separator","maxItems","sep","pad","textStyle","displayItems","first","last","elevationMap","Card","hover","elevation","CardHeader","CardBody","CardFooter","DEFAULT_PRESETS","hexToRgb","hex","g","hexToHsl","l","h","smallLabel","mono","ColorPicker","presets","showInput","showFormats","copied","setCopied","swatchSize","displayPresets","copy","text","c","f","Divider","orientation","dashed","spacing","spacings","style","Drawer","side","widths","heights","sideClasses","stateStyles","Dropdown","options","controlledValue","searchable","multiple","maxSelections","grouped","showSelectAll","tagLimit","creatable","onCreateOption","createLabel","emptyState","searchDebounce","searchLoading","customRenderOption","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","triggerRef","listRef","searchRef","panelPos","setPanelPos","updatePos","rect","handleSearchChange","query","filteredOptions","o","groupedOptions","groups","selectedLabels","optValue","allSelectableValues","handleSelectAll","handleCreate","showCreateOption","empty","flatOptions","handler","target","renderTags","labels","limit","remaining","renderOptionNode","globalIdx","createPortal","group","node","EmptyState","secondaryAction","formatBytes","bytes","getFileIcon","FileList","files","FileUpload","accept","maxSize","onUpload","internalFiles","setInternalFiles","dragOver","setDragOver","addFiles","fileList","rawFiles","newFiles","prog","iv","p","remove","ImagePreview","images","initialIndex","setIdx","zoom","setZoom","rotation","setRotation","current","zoomIn","z","zoomOut","rotate","r","img","shortcutStyle","SubMenu","parentRect","pos","setPos","top","left","MenuItemRow","subOpen","setSubOpen","rowRef","hoverTimeout","hasChildren","menuRef","menuRect","Notification","closable","avatar","time","read","icons","NotificationCenter","onMarkRead","onMarkAllRead","onClearAll","internalItems","setInternalItems","notifications","unread","handleMarkAllRead","handleMarkRead","Popover","trigger","placement","onOpenChange","internalOpen","setInternalOpen","ProgressBar","showValue","sizes","pct","Rating","readOnly","setHover","iconSize","gap","IconComp","activeColor","filled","Sidebar","brand","activeItem","onNavigate","collapsed","onCollapsedChange","Skeleton","width","height","animate","SkeletonCard","SkeletonTable","SkeletonList","sizeClasses","Spinner","valueStyles","Statistic","trend","trendLabel","valueStyle","trendColor","TrendIcon","StatCard","iconBg","Stepper","steps","onStepClick","step","done","thumbPx","Switch","checked","tp","colorClasses","sizePadding","Tag","cls","TagInput","tags","maxTags","input","setInput","add","Timeline","dotSize","iconSz","statusColor","isAlt","placementClasses","Tooltip","content","show","setShow","TopNavbar","breadcrumbs","actions","user","showSearch","searchPlaceholder","onSearchClick","notificationCount","onNotificationClick","onMobileMenuClick","onUserClick","onBreadcrumbClick","ListBox","TransferList","sourceTitle","targetTitle","defaultTarget","internalTarget","setInternalTarget","updateTarget","sourceSelected","setSourceSelected","targetSelected","setTargetSelected","sourceSearch","setSourceSearch","targetSearch","setTargetSearch","source","targetItems","filteredSource","filteredTarget","moveRight","moveLeft","moveAllRight","moveAllLeft","toggleSelect","set","setter","TreeItem","level","expanded","onSelect","showLines","isExpanded","defaultIcon","Tree","defaultExpanded","expandedItems","onExpandChange","selectedItems","internalExpanded","setInternalExpanded","select"],"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,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]}
|