@toteat-eng/ds-react 2026.7.9 → 2026.7.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","names":[],"sources":["../src/components/Icon/Icon.module.css","../src/components/Icon/icons.ts","../src/components/Icon/Icon.tsx","../src/components/Accordion/Accordion.module.css","../src/components/Accordion/Accordion.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.tsx","../src/components/AppleSignInButton/AppleSignInButton.module.css","../src/components/AppleSignInButton/AppleSignInButton.tsx","../src/components/BackgroundWrapper/BackgroundWrapper.module.css","../src/components/BackgroundWrapper/BackgroundWrapper.tsx","../src/utils/cn.ts","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.tsx","../src/components/Breadcrumb/Breadcrumb.module.css","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Charts/Charts.module.css","../src/components/Charts/Charts.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/ComingSoon/ComingSoon.module.css","../src/components/ComingSoon/ComingSoon.tsx","../src/components/ConfigRow/ConfigRow.module.css","../src/components/ConfigRow/ConfigRow.tsx","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx","../src/components/DatePicker/DatePicker.module.css","../src/components/DatePicker/DatePicker.tsx","../src/components/DateRangePicker/DateRangePicker.module.css","../src/components/DateRangePicker/DateRangePicker.tsx","../src/hooks/useScrollLock.ts","../src/utils/focusTrap.ts","../src/components/CloseButton/CloseButton.module.css","../src/components/CloseButton/CloseButton.tsx","../src/components/Dialog/Dialog.module.css","../src/components/Dialog/Dialog.tsx","../src/hooks/useDropdown.ts","../src/utils/portal.ts","../src/components/DropdownButton/DropdownButton.module.css","../src/components/DropdownButton/DropdownButton.tsx","../src/components/DropdownMenu/DropdownMenu.module.css","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/ImagePreview/ImagePreview.module.css","../src/components/ImagePreview/ImagePreview.tsx","../src/components/DropZone/DropZone.module.css","../src/components/DropZone/dropZoneConstants.ts","../src/components/DropZone/DropZone.tsx","../src/components/DsProvider/DsProvider.tsx","../src/components/EmptyState/EmptyState.module.css","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorBoundary/ErrorBoundary.module.css","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/ExtrasDialog/ExtrasDialog.module.css","../src/components/ExtrasDialog/ExtrasDialog.tsx","../src/components/FormField/FormField.module.css","../src/components/FormField/FormField.tsx","../src/components/GoogleSignInButton/GoogleSignInButton.module.css","../src/components/GoogleSignInButton/GoogleSignInButton.tsx","../src/components/GroupedButtons/GroupedButtons.module.css","../src/components/GroupedButtons/GroupedButtons.tsx","../src/components/Header/Header.module.css","../src/components/Header/Header.tsx","../src/components/LanguageSelector/LanguageSelector.tsx","../src/components/LogoToteat/LogoToteat.module.css","../src/components/LogoToteat/LogoToteat.tsx","../src/components/Multiselect/Multiselect.module.css","../src/components/Multiselect/Multiselect.tsx","../src/components/Sidebar/Sidebar.module.css","../src/components/Sidebar/Sidebar.tsx","../src/components/NavBar/NavBar.module.css","../src/components/NavBar/NavBar.tsx","../src/components/Overlay/Overlay.module.css","../src/components/Overlay/Overlay.tsx","../src/components/OverlayMessage/OverlayMessage.module.css","../src/components/OverlayMessage/OverlayMessage.tsx","../src/components/PageLoadingOverlay/BreathingDotsCanvas.module.css","../src/components/PageLoadingOverlay/BreathingDotsCanvas.tsx","../src/components/PageLoadingOverlay/PageLoadingOverlay.module.css","../src/components/PageLoadingOverlay/ToteatLogo.module.css","../src/components/PageLoadingOverlay/ToteatLogo.tsx","../src/components/PageLoadingOverlay/PageLoadingOverlay.tsx","../src/components/PermissionGate/PermissionGate.tsx","../src/components/PinLockOverlay/PinLockOverlay.module.css","../src/components/PinLockOverlay/PinLockOverlay.tsx","../src/components/ProductTile/ProductTile.module.css","../src/components/ProductTile/ProductTile.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/SearchInput/SearchInput.module.css","../src/components/SearchInput/SearchInput.tsx","../src/components/SectionHeader/SectionHeader.module.css","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/components/SidebarNavItem/SidebarNavItem.module.css","../src/components/SidebarNavItem/SidebarNavItem.tsx","../src/hooks/useToggle.ts","../src/components/SidebarNavSection/SidebarNavSection.module.css","../src/components/SidebarNavSection/SidebarNavSection.tsx","../src/components/StatusBadge/StatusBadge.tsx","../src/components/UserNotification/NotificationBase.tsx","../src/components/StatusBanner/StatusBanner.module.css","../src/components/StatusBanner/StatusBanner.tsx","../src/components/Stepper/Stepper.module.css","../src/components/Stepper/Stepper.tsx","../src/components/Tab/Tab.module.css","../src/components/Tab/Tab.tsx","../src/components/TabBar/TabBar.module.css","../src/components/TabBar/TabBar.tsx","../src/components/Tabs/Tabs.module.css","../src/components/Tabs/Tabs.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/TextInput/TextInput.module.css","../src/components/TextInput/TextInput.tsx","../src/components/ThemeGate/ThemeGate.tsx","../src/components/Toast/Toast.module.css","../src/components/Toast/useToast.ts","../src/components/Toast/Toast.tsx","../src/components/Toggle/Toggle.module.css","../src/components/Toggle/Toggle.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx","../src/components/TreeItem/TreeItem.module.css","../src/components/TreeItem/TreeItem.tsx","../src/components/TreeList/TreeList.module.css","../src/components/TreeList/TreeList.tsx","../src/components/UserNotification/UserNotification.module.css","../src/components/UserNotification/UserNotification.tsx","../src/layouts/AdminPageHeader/AdminPageHeader.module.css","../src/layouts/AdminPageHeader/AdminPageHeader.tsx","../src/layouts/AppShell/AppShell.module.css","../src/layouts/AppShell/AppShell.tsx","../src/layouts/Divider/Divider.module.css","../src/layouts/Divider/Divider.tsx","../src/layouts/Grid/Grid.module.css","../src/layouts/Grid/Grid.tsx","../src/layouts/LoginFooter/LoginFooter.module.css","../src/layouts/LoginFooter/LoginFooter.tsx","../src/layouts/LoginPageLayout/LoginPageLayout.module.css","../src/layouts/LoginPageLayout/LoginPageLayout.tsx","../src/layouts/PageLayout/PageLayout.module.css","../src/layouts/PageLayout/PageLayout.tsx","../src/layouts/Stack/Stack.tsx","../src/utils/csv.ts"],"sourcesContent":["@layer ds-components {\n .icon {\n display: inline-block;\n flex-shrink: 0;\n vertical-align: middle;\n }\n}\n","// This file is auto-generated by generateIcons.ts. Do not edit directly.\n// Run: npx tsx src/components/Icon/generateIcons.ts\n\nexport const ICON_APPLE_FILLED = [\n\t\"<path d='M16.102 2.01c-.042-.047-1.573.019-2.906 1.465C11.864 4.92 12.07 6.577 12.1 6.62c.03.042 1.9.109 3.093-1.573 1.194-1.68.953-2.988.91-3.037Zm4.143 14.666c-.06-.12-2.906-1.542-2.641-4.277.265-2.737 2.093-3.487 2.122-3.568.029-.081-.746-.987-1.567-1.446a4.615 4.615 0 0 0-1.954-.543c-.135-.003-.604-.118-1.568.145-.635.174-2.066.737-2.46.76-.395.022-1.57-.653-2.833-.832-.81-.156-1.667.164-2.28.41-.613.245-1.778.942-2.593 2.796-.815 1.853-.389 4.788-.084 5.7.305.911.782 2.405 1.592 3.495.72 1.23 1.675 2.084 2.073 2.374.4.29 1.524.482 2.304.084.628-.385 1.76-.607 2.208-.59.446.016 1.326.192 2.227.673.714.247 1.389.144 2.065-.13.676-.277 1.655-1.325 2.798-3.448.433-.988.63-1.522.59-1.603Z'/><path d='M16.102 2.01c-.042-.047-1.573.019-2.906 1.465C11.864 4.92 12.07 6.577 12.1 6.62c.03.042 1.9.109 3.093-1.573 1.194-1.68.953-2.988.91-3.037Zm4.143 14.666c-.06-.12-2.906-1.542-2.641-4.277.265-2.737 2.093-3.487 2.122-3.568.029-.081-.746-.987-1.567-1.446a4.615 4.615 0 0 0-1.954-.543c-.135-.003-.604-.118-1.568.145-.635.174-2.066.737-2.46.76-.395.022-1.57-.653-2.833-.832-.81-.156-1.667.164-2.28.41-.613.245-1.778.942-2.593 2.796-.815 1.853-.389 4.788-.084 5.7.305.911.782 2.405 1.592 3.495.72 1.23 1.675 2.084 2.073 2.374.4.29 1.524.482 2.304.084.628-.385 1.76-.607 2.208-.59.446.016 1.326.192 2.227.673.714.247 1.389.144 2.065-.13.676-.277 1.655-1.325 2.798-3.448.433-.988.63-1.522.59-1.603Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_DOWN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M8.354 11.854a.5.5 0 0 1-.707 0L4.465 8.672a.5.5 0 1 1 .707-.708L7.5 10.293V4.5a.5.5 0 1 1 1 0v5.793l2.329-2.329a.5.5 0 1 1 .707.708l-3.182 3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_LEFT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.146 8.353a.5.5 0 0 1 0-.707l3.182-3.182a.5.5 0 0 1 .708.707L5.707 7.5H11.5a.5.5 0 0 1 0 1H5.707l2.329 2.328a.5.5 0 1 1-.708.707L4.146 8.353Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_RIGHT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M11.854 7.646a.5.5 0 0 1 0 .707l-3.182 3.182a.5.5 0 1 1-.708-.707L10.293 8.5H4.5a.5.5 0 0 1 0-1h5.793L7.964 5.17a.5.5 0 1 1 .708-.707l3.182 3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_UP_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.646 4.146a.5.5 0 0 1 .707 0l3.182 3.182a.5.5 0 1 1-.707.708L8.5 5.707V11.5a.5.5 0 0 1-1 0V5.707L5.17 8.036a.5.5 0 1 1-.707-.708l3.182-3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_DOWN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m11.535 11.172-3.182 3.182a.5.5 0 0 1-.707 0l-3.182-3.182a.5.5 0 1 1 .707-.708L7.5 12.793V2a.5.5 0 0 1 1 0v10.793l2.328-2.329a.5.5 0 1 1 .707.708Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_LEFT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.646 8.353a.5.5 0 0 1 0-.707l3.182-3.182a.5.5 0 0 1 .708.707L3.207 7.5H14a.5.5 0 0 1 0 1H3.207l2.329 2.328a.5.5 0 1 1-.708.707L1.646 8.353Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_LIST_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M4.25 2.6c.22 0 .4.18.4.4v6.6h6.353L9.417 7.222a.4.4 0 1 1 .666-.444l2 3a.4.4 0 0 1 0 .444l-2 3a.4.4 0 1 1-.666-.444l1.586-2.378H4.25a.4.4 0 0 1-.4-.4V3c0-.22.18-.4.4-.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_DOWN_FILLED = [\n\t\"<path d='m7.5 9.5 3-3h-6l3 3Z'/><path fill-rule='evenodd' d='M7.854 9.854a.5.5 0 0 1-.708 0l-3-3A.5.5 0 0 1 4.5 6h6a.5.5 0 0 1 .354.854l-3 3ZM9.293 7H5.707L7.5 8.793 9.293 7Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_LEFT_FILLED = [\n\t\"<path d='m6.5 7.5 3 3v-6l-3 3Z'/><path fill-rule='evenodd' d='M6.146 7.854a.5.5 0 0 1 0-.708l3-3A.5.5 0 0 1 10 4.5v6a.5.5 0 0 1-.854.354l-3-3ZM9 9.293V5.707L7.207 7.5 9 9.293Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_RIGHT_FILLED = [\n\t\"<path d='m10 7.962-3 3v-6l3 3Z'/><path fill-rule='evenodd' d='M10.354 8.315a.5.5 0 0 0 0-.707l-3-3a.5.5 0 0 0-.854.354v6a.5.5 0 0 0 .854.354l3-3ZM7.5 9.755V6.169l1.793 1.793L7.5 9.755Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_UP_FILLED = [\n\t\"<path d='m8.25 7-3 3h6l-3-3Z'/><path fill-rule='evenodd' d='M7.896 6.646a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.354.854h-6a.5.5 0 0 1-.354-.854l3-3ZM6.457 9.5h3.586L8.25 7.707 6.457 9.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_RIGHT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m11.172 4.464 3.182 3.182a.5.5 0 0 1 0 .707l-3.182 3.182a.5.5 0 0 1-.708-.707L12.793 8.5H2a.5.5 0 0 1 0-1h10.793L10.464 5.17a.5.5 0 1 1 .708-.707Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_UP_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m4.465 4.828 3.182-3.182a.5.5 0 0 1 .707 0l3.182 3.182a.5.5 0 1 1-.707.708L8.5 3.207V14a.5.5 0 0 1-1 0V3.207L5.172 5.536a.5.5 0 1 1-.707-.708Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_BARCODE_OUTLINE = [\n\t\"<path d='M13.76 8a.48.48 0 0 1-.48.48H2.72a.48.48 0 1 1 0-.96h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96a.48.48 0 0 1 .48.48ZM4.64 10.88h-.96V9.44h.96v1.44ZM12.32 10.88h-.96V9.44h.96v1.44ZM6.56 10.4H5.6v-.96h.96v.96ZM8.48 10.4h-.96v-.96h.96v.96ZM10.4 10.4h-.96v-.96h.96v.96ZM1.28 5.12V3.68c0-.794.646-1.44 1.44-1.44h1.44a.48.48 0 1 1 0 .96H2.72a.48.48 0 0 0-.48.48v1.44a.48.48 0 1 1-.96 0ZM14.72 3.68v1.44a.48.48 0 1 1-.96 0V3.68a.48.48 0 0 0-.48-.48h-1.44a.48.48 0 1 1 0-.96h1.44c.794 0 1.44.646 1.44 1.44ZM4.64 13.28a.48.48 0 0 1-.48.48H2.72c-.794 0-1.44-.646-1.44-1.44v-1.44a.48.48 0 1 1 .96 0v1.44c0 .265.215.48.48.48h1.44a.48.48 0 0 1 .48.48ZM14.72 10.88v1.44c0 .794-.646 1.44-1.44 1.44h-1.44a.48.48 0 1 1 0-.96h1.44a.48.48 0 0 0 .48-.48v-1.44a.48.48 0 1 1 .96 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_BELL_OUTLINE = [\n\t\"<path d='M13.98 12.667h-.525V8.139c0-2.424-1.483-4.488-3.563-5.288V1.96C9.892.877 9.042 0 7.995 0 6.95 0 6.103.88 6.103 1.96v.885C4.025 3.643 2.54 5.71 2.54 8.136v4.53h-.525a.526.526 0 0 0-.515.534c0 .293.232.533.515.533H5.45C5.64 15.013 6.708 16 8 16s2.36-.987 2.549-2.267h3.436c.283 0 .515-.24.515-.533a.53.53 0 0 0-.52-.533M7.132 1.96A.88.88 0 0 1 8 1.067c.476 0 .862.4.862.893v.608a5 5 0 0 0-.872-.08c-.294 0-.577.032-.858.077zM8 14.8c-.72 0-1.216-.376-1.39-1.067h2.812C9.249 14.424 8.72 14.8 8 14.8m-4.297-2.3V8.139C3.703 5.613 5.895 3.8 8 3.8s4.203 1.813 4.203 4.339V12.5z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_ALT_OUTLINE = [\n\t\"<path d='M7.47 10.14a.842.842 0 0 1-.205-.724c.01-.053.025-.102.04-.15.02-.048.045-.096.07-.14.03-.042.06-.085.095-.122a.617.617 0 0 1 .245-.171.662.662 0 0 1 .57 0c.045.015.09.042.13.069.04.032.08.064.115.102.035.037.065.08.095.123.025.043.05.09.065.14a.777.777 0 0 1 .06.305c0 .208-.08.417-.22.567-.034.038-.075.07-.115.102-.04.027-.085.054-.13.075a1.1 1.1 0 0 1-.14.043.636.636 0 0 1-.29 0c-.05-.01-.095-.027-.14-.043a1.048 1.048 0 0 1-.13-.075 1.07 1.07 0 0 1-.115-.102Zm3.335 2.951a.77.77 0 0 0 .165.262c.035.038.075.07.115.103.04.026.085.053.13.075.045.015.09.032.14.042a.725.725 0 0 0 .675-.22.699.699 0 0 0 .16-.262.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.694.694 0 0 0-.16-.263.716.716 0 0 0-.675-.22.624.624 0 0 0-.14.049.617.617 0 0 0-.245.171 1.19 1.19 0 0 0-.095.123c-.025.043-.05.091-.07.14-.014.048-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-3.5 0c.02.048.045.097.07.14.03.042.06.085.095.123a.621.621 0 0 0 .245.171.624.624 0 0 0 .285.064.636.636 0 0 0 .284-.064.61.61 0 0 0 .131-.07c.04-.032.08-.064.115-.101a.699.699 0 0 0 .16-.262.777.777 0 0 0 .06-.305.843.843 0 0 0-.22-.569.607.607 0 0 0-.246-.171.663.663 0 0 0-.57 0 .617.617 0 0 0-.244.171.843.843 0 0 0-.165.873Zm3.5-3.214a.77.77 0 0 0 .165.263c.035.037.075.069.115.101.04.027.085.054.13.075.045.016.09.032.14.043a.636.636 0 0 0 .29 0c.05-.01.095-.027.14-.043a1.02 1.02 0 0 0 .13-.075c.04-.032.08-.064.115-.102a.699.699 0 0 0 .16-.263.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.697.697 0 0 0-.16-.262.716.716 0 0 0-1.06 0 .806.806 0 0 0-.165.262c-.014.048-.03.097-.04.15a.777.777 0 0 0 0 .31c.01.054.025.103.04.15Zm-6.305.498c.195 0 .39-.086.53-.236s.22-.353.22-.567a.843.843 0 0 0-.22-.568c-.28-.3-.78-.3-1.06 0a.843.843 0 0 0 0 1.135c.14.15.33.236.53.236ZM15 4.215v10.178c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607H4V1.536C4 1.24 4.224 1 4.5 1s.5.24.5.536v1.071h6V1.536c0-.296.224-.536.5-.536s.5.24.5.536v1.071h1.5c.827 0 1.5.721 1.5 1.607Zm-1 3.214H2v6.964c0 .295.224.536.5.536h11c.276 0 .5-.24.5-.536V7.429Zm0-3.215c0-.295-.224-.535-.5-.535H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.679H5V4.75c0 .296-.224.536-.5.536S4 5.046 4 4.75V3.679H2.5c-.276 0-.5.24-.5.535v2.143h12V4.214ZM4.5 13.59c.2 0 .39-.085.53-.235.14-.15.22-.354.22-.568a.833.833 0 0 0-.22-.568.737.737 0 0 0-1.06 0 .833.833 0 0 0-.22.568c0 .214.08.418.22.568.14.15.33.235.53.235Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_LOCKED_OUTLINE = [\n\t\"<path d='M15 4.214v10.179c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607h11c.827 0 1.5.721 1.5 1.607Zm-1 3.214H2v6.965c0 .295.224.535.5.535h11c.276 0 .5-.24.5-.535V7.428Zm0-3.214c0-.295-.224-.536-.5-.536H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.678H6V4.75c0 .296-.224.536-.5.536S5 5.046 5 4.75V3.678H2.5c-.276 0-.5.24-.5.536v2.143h12V4.214Z'/><path stroke='currentColor' d='M5.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5M11.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5'/><path d='M10.063 10.25h-.376v-.375A1.877 1.877 0 0 0 7.813 8a1.877 1.877 0 0 0-1.875 1.875v.375h-.375a.375.375 0 0 0-.375.375v3c0 .207.167.375.375.375h4.5a.375.375 0 0 0 .374-.375v-3a.375.375 0 0 0-.374-.375Zm-3.376-.375a1.125 1.125 0 0 1 2.25 0v.375h-2.25v-.375Zm3 3.375h-3.75V11h3.75v2.25Z'/><path d='M7.813 12.5a.375.375 0 1 0 0-.75.375.375 0 0 0 0 .75Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_OUTLINE = [\n\t\"<path d='M7.47 10.14a.843.843 0 0 1-.205-.724c.01-.054.025-.102.04-.15.02-.048.045-.097.07-.14.03-.042.06-.085.095-.123a.616.616 0 0 1 .245-.171.662.662 0 0 1 .57 0c.045.016.09.043.13.07.04.032.08.064.115.101a.697.697 0 0 1 .16.262.777.777 0 0 1 .06.305c0 .21-.08.42-.22.57-.034.037-.075.069-.115.1-.04.028-.085.054-.13.076a1.1 1.1 0 0 1-.14.043.636.636 0 0 1-.29 0 1.08 1.08 0 0 1-.14-.043 1.048 1.048 0 0 1-.13-.075 1.07 1.07 0 0 1-.115-.102Zm3.335 2.951a.767.767 0 0 0 .28.364c.04.027.085.054.13.075.045.016.09.032.14.043a.725.725 0 0 0 .675-.22.696.696 0 0 0 .16-.263.778.778 0 0 0 .045-.46.74.74 0 0 0-.045-.15.696.696 0 0 0-.16-.262.716.716 0 0 0-.675-.22.624.624 0 0 0-.14.048.617.617 0 0 0-.245.172 1.19 1.19 0 0 0-.095.123c-.025.043-.05.091-.07.14-.014.047-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-3.5 0c.02.048.045.096.07.14.03.042.06.085.095.123a.617.617 0 0 0 .245.171.624.624 0 0 0 .285.064.636.636 0 0 0 .284-.064.607.607 0 0 0 .131-.07c.04-.032.08-.064.115-.101a.696.696 0 0 0 .16-.263.778.778 0 0 0 .06-.305.843.843 0 0 0-.22-.568c-.034-.038-.075-.07-.115-.102a.607.607 0 0 0-.13-.07.663.663 0 0 0-.57 0 .617.617 0 0 0-.13.07c-.04.032-.08.064-.115.102a.843.843 0 0 0-.205.723c.01.053.025.102.04.15Zm3.5-3.214a.77.77 0 0 0 .165.263c.035.037.075.069.115.101.04.027.085.053.13.075.045.016.09.032.14.043a.636.636 0 0 0 .29 0c.05-.01.095-.027.14-.043.045-.022.09-.048.13-.075.04-.032.08-.064.115-.102a.699.699 0 0 0 .16-.263.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.697.697 0 0 0-.16-.263.716.716 0 0 0-.675-.22c-.05.012-.095.028-.14.044-.045.021-.09.048-.13.075-.04.032-.08.064-.115.101a.806.806 0 0 0-.165.263c-.014.048-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-6.305.498c.195 0 .39-.086.53-.236s.22-.353.22-.568a.843.843 0 0 0-.22-.568c-.28-.3-.78-.3-1.06 0a.843.843 0 0 0 0 1.136c.14.15.33.236.53.236ZM15 4.215v10.178c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607h11c.827 0 1.5.721 1.5 1.607Zm-1 3.213H2v6.965c0 .295.224.535.5.535h11c.276 0 .5-.24.5-.535V7.428Zm0-3.214c0-.295-.224-.536-.5-.536H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.678H6V4.75c0 .296-.224.536-.5.536S5 5.046 5 4.75V3.678H2.5c-.276 0-.5.24-.5.536v2.143h12V4.214ZM4.5 13.59c.2 0 .39-.086.53-.236s.22-.353.22-.567a.833.833 0 0 0-.22-.568.737.737 0 0 0-1.06 0 .833.833 0 0 0-.22.568c0 .214.08.417.22.567.14.15.33.236.53.236Z'/><path stroke='currentColor' d='M5.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5M11.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CARROT_FILLED = [\n\t\"<path d='M1.4 22.116c1.812 1.632 13.968-5.604 15.768-8.652.864-1.464-.156-3.612-1.824-5.328 1.896-1.26 3.564 2.664 5.148 1.836.72-.384 1.188-1.572.84-2.304-.624-1.296-2.7-1.296-4.104-1.452.996-.24 3.384-1.26 3.432-2.7.048-1.104-1.356-2.364-2.46-2.232-1.452.168-1.98 2.256-2.472 3.6-.06-.852-.24-2.724-1.176-3.54-1.248-1.092-2.748-.06-2.784 1.26-.048 1.596 3.384 2.484 2.304 4.404C12.248 5.604 10.1 4.836 8.72 5.64c-.588.372-1.26 1.092-1.956 2.028 1.068 1.128 2.544 2.484 3.708 3.264.24.168.312.504.132.744a.53.53 0 0 1-.744.144c-1.188-.804-2.64-2.136-3.72-3.252a32.183 32.183 0 0 0-1.608 2.676c1.02 1.032 2.316 2.196 3.348 2.892.24.168.3.504.132.744a.541.541 0 0 1-.756.144c-1.02-.696-2.232-1.776-3.252-2.784C1.88 16.428.32 21.156 1.4 22.116Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CHECK_OUTLINE = [\n\t\"<path d='M14.04 4.04a.65.65 0 0 1 .92.92l-9 9a.651.651 0 0 1-.968-.054l-4-5-.071-.11A.65.65 0 0 1 1.915 8l.093.094 3.546 4.431L14.04 4.04Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHECKBOX_CHECKED = [\n\t\"<path fill='#1B1B1B' d='M11 0H1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1Zm-6 8.75L2.5 6.271l.795-.771L5 7.173 8.704 3.5l.796.788L5 8.75Z'/>\",\n\t\"0 0 12 12\",\n] as const;\n\nexport const ICON_CHECKBOX_UNCHECKED = [\n\t\"<path fill='#1B1B1B' d='M11 0H1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1ZM1 11V1h10v10H1Z'/>\",\n\t\"0 0 12 12\",\n] as const;\n\nexport const ICON_CHEVRON_DOWN_OUTLINE = [\n\t\"<path d='M15.761 4.197c.263.245.31.638.135.938l-.09.122-6.762 7.5a.732.732 0 0 1-1.088 0l-6.762-7.5a.759.759 0 0 1 .045-1.06.73.73 0 0 1 1.043.046L8.5 11.14l6.219-6.896.111-.1a.729.729 0 0 1 .931.054Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_LEFT_BICOLOR = [\n\t\"<path fill='#F2F2F2' d='M17.005 12.982a4 4 0 0 1-3.992 4.008l-8 .015a4 4 0 0 1-4.008-3.992l-.015-8a4 4 0 0 1 3.993-4.008l8-.015a4 4 0 0 1 4.007 3.992l.015 8Z'/><path fill='#1B1B1B' fill-rule='evenodd' d='M10.825 14.493a.432.432 0 0 1-.61-.008l-5.11-5.256a.432.432 0 0 1 .009-.611l5.256-5.11a.432.432 0 0 1 .602.62L6.025 8.936l4.809 4.947a.432.432 0 0 1-.009.61Z' clip-rule='evenodd'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_CHEVRON_LEFT_OUTLINE = [\n\t\"<path d='M12.803 15.761a.759.759 0 0 1-.938.135l-.122-.09-7.5-6.762a.732.732 0 0 1 0-1.088l7.5-6.762a.759.759 0 0 1 1.06.045.73.73 0 0 1-.046 1.043L5.86 8.5l6.897 6.219.1.111a.729.729 0 0 1-.054.931Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_RIGHT_BICOLOR = [\n\t\"<path fill='#F2F2F2' d='M17.005 12.982a4 4 0 0 1-3.992 4.008l-8 .015a4 4 0 0 1-4.008-3.992l-.015-8a4 4 0 0 1 3.993-4.008l8-.015a4 4 0 0 1 4.007 3.992l.015 8Z'/><path fill='#1B1B1B' fill-rule='evenodd' d='M7.189 14.493a.432.432 0 0 0 .61-.008l5.11-5.256a.432.432 0 0 0-.008-.611l-5.256-5.11a.432.432 0 0 0-.603.62l4.947 4.808-4.809 4.947a.432.432 0 0 0 .009.61Z' clip-rule='evenodd'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_CHEVRON_RIGHT_OUTLINE = [\n\t\"<path d='M4.197 1.239a.759.759 0 0 1 .938-.134l.122.088 7.5 6.763a.732.732 0 0 1 0 1.088l-7.5 6.762a.759.759 0 0 1-1.06-.045.73.73 0 0 1 .046-1.043L11.14 8.5 4.244 2.28l-.1-.111a.729.729 0 0 1 .054-.931Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_UP_OUTLINE = [\n\t\"<path d='M1.239 12.803a.759.759 0 0 1-.134-.938l.088-.122 6.763-7.5a.732.732 0 0 1 1.088 0l6.762 7.5a.759.759 0 0 1-.045 1.06.73.73 0 0 1-1.043-.046L8.5 5.86 2.28 12.757l-.111.1a.729.729 0 0 1-.931-.054Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHICKEN_FILLED = [\n\t\"<path d='M20.16 12.73A6.27 6.27 0 0 0 19.09 3c-2.01-1.33-4.7-1.34-6.73-.03-1.76 1.13-2.73 2.89-2.9 4.71-.13 1.32-.63 2.55-1.55 3.47l-.03.03c-1.16 1.16-1.16 2.93-.07 4.01l.99.99a2.794 2.794 0 0 0 3.95 0c.97-.97 2.25-1.5 3.64-1.65 1.37-.15 2.71-.75 3.77-1.8Zm-13.9 7.13c.27.56.18 1.24-.29 1.7a1.49 1.49 0 0 1-2.55-.98 1.49 1.49 0 0 1-.98-2.55c.46-.46 1.15-.56 1.7-.29l2.48-2.43c.14.19.3.41.48.59l.99.99c.21.2.41.37.67.52l-2.5 2.45Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CHILI_FILLED = [\n\t\"<path d='M18.73 2.118a.936.936 0 0 1 1.274.363l.187.34a4.682 4.682 0 0 1 .133 4.297A6.214 6.214 0 0 1 22 11.376c0 .722-.121 1.418-.348 2.062-.238.676-1.113.637-1.437-.004l-.457-.914a.944.944 0 0 0-.84-.52h-2.855a.935.935 0 0 1-.938-.937V7.938a.935.935 0 0 0-.938-.937h-.667c-.832 0-1.172-.934-.422-1.286a6.206 6.206 0 0 1 2.652-.59c1.105 0 2.14.286 3.04.79a2.81 2.81 0 0 0-.235-2.18l-.188-.34a.936.936 0 0 1 .363-1.273v-.004ZM8.688 15.497l3.626-7.246h1.562v3.125c0 1.035.84 1.875 1.875 1.875h2.977l.933 1.867A16.934 16.934 0 0 1 6.031 22H3.734a1.734 1.734 0 0 1-.375-3.426l1.946-.434a4.999 4.999 0 0 0 3.386-2.644h-.004Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CLOSE_OUTLINE = [\n\t\"<path d='m8 7.293 5.646-5.647a.502.502 0 0 1 .708.708L8.707 8l5.647 5.646a.502.502 0 0 1-.708.708L8 8.707l-5.646 5.647a.502.502 0 0 1-.708-.708L7.293 8 1.646 2.354a.502.502 0 0 1 .708-.708z' />\",\n\t\"0 0 15 15\",\n] as const;\n\nexport const ICON_CLOUD_DOWNLOAD_OUTLINE = [\n\t\"<path d='M4.406 1.342A5.53 5.53 0 0 1 8 0c2.69 0 4.923 2 5.166 4.579C14.758 4.804 16 6.137 16 7.773c0 1.796-1.498 3.226-3.313 3.226H10a.5.5 0 0 1 0-1h2.688C13.979 10 15 8.988 15 7.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 2.825 10.328 1 8 1a4.53 4.53 0 0 0-2.941 1.1c-.757.652-1.153 1.438-1.153 2.055v.448l-.445.049C2.064 4.805 1 5.952 1 7.318c0 1.467 1.23 2.681 2.781 2.681H6a.5.5 0 1 1 0 1H3.781C1.708 11 0 9.366 0 7.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383Z'/><path d='M8.354 15.794a.5.5 0 0 1-.708 0L5 13a.5.5 0 0 1 .708-.708L7.5 14.233V5.441a.5.5 0 0 1 1 0v8.792l1.792-1.941A.5.5 0 0 1 11 13l-2.646 2.794Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CLOUD_UPLOAD_OUTLINE = [\n\t\"<path d='M4.406 1.342A5.53 5.53 0 0 1 8 0c2.69 0 4.923 2 5.166 4.579C14.758 4.804 16 6.137 16 7.773c0 1.796-1.498 3.226-3.313 3.226H10a.5.5 0 0 1 0-1h2.688C13.979 10 15 8.988 15 7.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 2.825 10.328 1 8 1a4.53 4.53 0 0 0-2.941 1.1c-.757.652-1.153 1.438-1.153 2.055v.448l-.445.049C2.064 4.805 1 5.952 1 7.318c0 1.467 1.23 2.681 2.781 2.681H6a.5.5 0 1 1 0 1H3.781C1.708 11 0 9.366 0 7.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383Z'/><path d='M7.646 3.206a.5.5 0 0 1 .708 0l3 3a.5.5 0 1 1-.708.708L8.5 4.767v9.792a.5.5 0 1 1-1 0V4.767L5.354 6.914a.5.5 0 0 1-.708-.708l3-3Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_COPY_GENERIC_OUTLINE = [\n\t\"<path d='M9.5 11.5a.5.5 0 0 1-.5.5H5a.5.5 0 0 1 0-1h4a.5.5 0 0 1 .5.5ZM9 9H5a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1Zm4.5-4.421V11a1.502 1.502 0 0 1-1.5 1.5h-.5v1A1.502 1.502 0 0 1 10 15H4a1.502 1.502 0 0 1-1.5-1.5V5A1.502 1.502 0 0 1 4 3.5h.5v-1A1.502 1.502 0 0 1 6 1h4a.5.5 0 0 1 .358.151l3 3.079a.498.498 0 0 1 .142.349Zm-3-1.079a.5.5 0 0 0 .5.5h.738L10.5 2.73v.77Zm0 10v-6H9A1.502 1.502 0 0 1 7.5 6V4.5H4a.5.5 0 0 0-.5.5v8.5a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 .5-.5ZM8.5 6a.5.5 0 0 0 .5.5h.738L8.5 5.23V6Zm4 5V5H11a1.502 1.502 0 0 1-1.5-1.5V2H6a.5.5 0 0 0-.5.5v1H8a.499.499 0 0 1 .358.151l3 3.079a.498.498 0 0 1 .142.349V11.5h.5a.5.5 0 0 0 .5-.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_COPY_SQUARE_OUTLINE = [\n\t\"<path d='M11.77 4.23A2.728 2.728 0 0 0 9.09 2H4.728A2.727 2.727 0 0 0 2 4.727v4.364a2.727 2.727 0 0 0 2.23 2.678A2.727 2.727 0 0 0 6.91 14h4.363A2.726 2.726 0 0 0 14 11.273V6.909a2.727 2.727 0 0 0-2.23-2.678ZM3.09 9.09V4.728a1.636 1.636 0 0 1 1.637-1.636h4.364a1.636 1.636 0 0 1 1.636 1.636v4.364a1.636 1.636 0 0 1-1.636 1.636H4.727a1.636 1.636 0 0 1-1.636-1.636Zm9.82 2.183a1.636 1.636 0 0 1-1.637 1.636H6.909a1.637 1.637 0 0 1-1.538-1.09h3.72a2.728 2.728 0 0 0 2.727-2.728V5.37a1.636 1.636 0 0 1 1.091 1.538v4.364Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DELETE_OUTLINE = [\n\t\"<path d='M3.098 3.297a.634.634 0 0 0-.634.638v9.543c0 1.046.86 1.907 1.907 1.907h7.639c1.046 0 1.907-.86 1.907-1.907V3.935a.637.637 0 0 0-.635-.638H3.098Zm.638 1.272h8.907v8.909a.623.623 0 0 1-.634.634H4.371a.623.623 0 0 1-.634-.634V4.569Z'/><path d='M1.825 3.3a.636.636 0 0 0 0 1.272h12.731a.638.638 0 0 0 0-1.272H1.825Z'/><path d='M5.644.117c-1.047 0-1.908.86-1.908 1.907v1.911a.637.637 0 0 0 1.274 0V2.024c0-.359.275-.634.634-.634h5.093c.359 0 .634.275.634.634v1.911a.64.64 0 0 0 .639.634.636.636 0 0 0 .634-.634V2.024c0-1.047-.861-1.907-1.908-1.907H5.644ZM6.283 5.845a.64.64 0 0 0-.639.634v5.725a.64.64 0 0 0 1.088.45.635.635 0 0 0 .185-.45V6.479a.636.636 0 0 0-.634-.634ZM10.102 5.845a.64.64 0 0 0-.639.634v5.725a.64.64 0 0 0 1.088.45.632.632 0 0 0 .185-.45V6.479a.636.636 0 0 0-.634-.634Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DISCOUNT_OUTLINE = [\n\t\"<path d='M9.273 9.91a.636.636 0 1 0 0-1.274.636.636 0 0 0 0 1.273ZM6.727 7.364a.636.636 0 1 0 0-1.273.636.636 0 0 0 0 1.273ZM6.546 9.91a.455.455 0 0 1-.322-.778L9.127 6.23a.455.455 0 1 1 .643.643L6.868 9.776a.453.453 0 0 1-.322.133Z'/><path d='M8 15a1.93 1.93 0 0 1-1.369-.566l-.665-.665a.853.853 0 0 0-.607-.251h-.941a1.94 1.94 0 0 1-1.936-1.936v-.942a.852.852 0 0 0-.252-.606l-.665-.666a1.94 1.94 0 0 1 0-2.737l.665-.666a.852.852 0 0 0 .252-.606v-.942a1.94 1.94 0 0 1 1.935-1.935h.942a.853.853 0 0 0 .606-.252l.666-.665a1.94 1.94 0 0 1 2.738 0l.665.665a.853.853 0 0 0 .607.251h.942a1.94 1.94 0 0 1 1.935 1.936v.942a.854.854 0 0 0 .252.606l.665.666a1.94 1.94 0 0 1 0 2.737l-.665.665a.855.855 0 0 0-.252.607v.942a1.94 1.94 0 0 1-1.935 1.935h-.942a.85.85 0 0 0-.607.252l-.665.665A1.93 1.93 0 0 1 8 15ZM8 2.077a.857.857 0 0 0-.607.251l-.665.664a1.924 1.924 0 0 1-1.368.567h-.942a.86.86 0 0 0-.858.858v.942a1.924 1.924 0 0 1-.567 1.368l-.666.666a.86.86 0 0 0 0 1.214l.665.665a1.924 1.924 0 0 1 .567 1.368v.942a.86.86 0 0 0 .859.858h.942a1.925 1.925 0 0 1 1.368.567l.665.665a.86.86 0 0 0 1.214 0l.666-.665a1.923 1.923 0 0 1 1.368-.567h.941a.86.86 0 0 0 .859-.858v-.942a1.924 1.924 0 0 1 .567-1.368l.665-.665a.86.86 0 0 0 0-1.214l-.665-.666a1.925 1.925 0 0 1-.567-1.368v-.941a.86.86 0 0 0-.858-.859h-.942a1.924 1.924 0 0 1-1.368-.566l-.666-.666A.857.857 0 0 0 8 2.077Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_GENERIC_OUTLINE = [\n\t\"<path d='M5.703 4.333a.417.417 0 0 0 0 .834h4.53a.417.417 0 0 0 0-.834h-4.53ZM5.286 7.678c0-.23.187-.416.417-.416h4.53a.417.417 0 0 1 0 .833h-4.53a.417.417 0 0 1-.417-.417ZM5.703 10.167a.417.417 0 1 0 0 .833H8.41a.417.417 0 1 0 0-.833H5.703Z'/><path d='M3 2.667C3 1.747 3.746 1 4.667 1h6.666C12.253 1 13 1.746 13 2.667v10c0 .92-.746 1.666-1.667 1.666H4.667c-.92 0-1.667-.746-1.667-1.666v-10Zm8.333-.834H4.667a.833.833 0 0 0-.834.834v10c0 .46.373.833.834.833h6.666c.46 0 .834-.373.834-.833v-10a.833.833 0 0 0-.834-.834Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_HISTORY_ALT_OUTLINE = [\n\t\"<path stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M7.5 5v4H11'/><circle cx='8' cy='8' r='6.4' stroke='currentColor' stroke-width='1.2'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_HISTORY_OUTLINE = [\n\t\"<path d='M14.17 3.44A6.928 6.928 0 1 1 3.264 11.99a.533.533 0 1 1 .839-.658 5.884 5.884 0 1 0-1.207-4.246s-.077.117-.308.298l-.81-.098.095-.526A6.922 6.922 0 0 1 14.169 3.44Z'/><path d='m.486 5.994 4.531-.29a.289.289 0 0 1 .252.458L3.177 9.026a.289.289 0 0 1-.442.029L.295 6.48a.289.289 0 0 1 .191-.486Z'/><path stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M8 5v4h4'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_LIST_OUTLINE = [\n\t\"<path d='M7.524 4.333a.417.417 0 0 0 0 .834h2.708a.417.417 0 0 0 0-.834H7.524ZM7.107 7.678c0-.23.187-.416.417-.416h2.708a.417.417 0 0 1 0 .833H7.524a.417.417 0 0 1-.417-.417ZM7.524 10.167a.417.417 0 1 0 0 .833h2.708a.417.417 0 1 0 0-.833H7.524Z'/><path d='M3 2.667C3 1.747 3.746 1 4.667 1h6.666C12.253 1 13 1.746 13 2.667v10c0 .92-.746 1.666-1.667 1.666H4.667c-.92 0-1.667-.746-1.667-1.666v-10Zm8.333-.834H4.667a.833.833 0 0 0-.834.834v10c0 .46.373.833.834.833h6.666c.46 0 .834-.373.834-.833v-10a.833.833 0 0 0-.834-.834Z'/><path d='M5.5 4.333a.417.417 0 0 0 0 .834h.292a.417.417 0 0 0 0-.834H5.5ZM5.5 7.262a.417.417 0 1 0 0 .833h.292a.417.417 0 0 0 0-.833H5.5ZM5.5 10.167a.417.417 0 1 0 0 .833h.292a.417.417 0 1 0 0-.833H5.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DRAG_HANDLE_OUTLINE = [\n\t\"<path d='M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_ERROR_FILLED_RED = [\n\t\"<path fill='#E12845' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14ZM3.353 3.044a.571.571 0 0 0-.185.933L6.192 7l-3.024 3.023a.572.572 0 0 0 .809.81L7 7.807l3.024 3.024a.573.573 0 0 0 .808-.809L7.808 7l3.024-3.023a.571.571 0 1 0-.809-.81L7 6.193 3.977 3.168a.571.571 0 0 0-.624-.124Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_ERROR_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.164 4.13a.5.5 0 0 1 .706.034l5 5.5a.5.5 0 1 1-.74.672l-5-5.5a.5.5 0 0 1 .034-.706Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M9.836 4.13a.5.5 0 0 0-.706.034l-5 5.5a.5.5 0 1 0 .74.672l5-5.5a.5.5 0 0 0-.034-.706Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_EXCLAMATION_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 15.2A7.2 7.2 0 1 0 8 .8a7.2 7.2 0 0 0 0 14.4Zm0 .8A8 8 0 1 0 8 0a8 8 0 0 0 0 16Z' clip-rule='evenodd'/><path d='M7.53 12.8v-1.056h.94V12.8h-.94Zm0-2.304V2.784h.94v7.712h-.94Z'/><path fill-rule='evenodd' d='M8 15.04A7.04 7.04 0 1 0 8 .96a7.04 7.04 0 0 0 0 14.08ZM8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EXPAND_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M.35 6.5V1L.363.87A.65.65 0 0 1 1 .35h6l.13.013a.65.65 0 0 1 0 1.274L7 1.65H1.65V6.5a.65.65 0 0 1-1.3 0ZM15.65 10v5.5l-.013.13a.65.65 0 0 1-.637.52H9l-.13-.013a.65.65 0 0 1 0-1.274L9 14.85h5.35V10a.65.65 0 0 1 1.3 0Z'/><path d='M1.063 1.019a.65.65 0 0 1 .82-.044l.098.088 5 5.5.079.106a.65.65 0 0 1-.943.856l-.098-.088-5-5.5-.079-.106a.65.65 0 0 1 .123-.812ZM9.063 9.019a.65.65 0 0 1 .82-.044l.098.088 5 5.5.079.106a.65.65 0 0 1-.943.856l-.098-.088-5-5.5-.079-.106a.65.65 0 0 1 .123-.812Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EXPORT_OUTLINE = [\n\t\"<g fill-rule='evenodd' clip-path='url(#a)' clip-rule='evenodd'><path d='M0 4.435c0-.317.257-.574.574-.574h6.694a.574.574 0 1 1 0 1.147h-6.12v9.844h9.85V8.258a.574.574 0 0 1 1.147 0v7.168a.574.574 0 0 1-.574.573H.574A.574.574 0 0 1 0 15.426V4.435Z'/><path d='M7.973 1.049c0-.317.256-.574.573-.574L14.78.467c.317 0 .574.255.575.572l.008 6.232a.574.574 0 0 1-1.148.001l-.006-4.847-8.29 8.308a.574.574 0 0 1-.813-.81l8.29-8.308-4.85.006a.574.574 0 0 1-.574-.572Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_CLOSED_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.884 5.18a.5.5 0 0 0-.704-.064l.704.063Zm0 0 .005.006.022.025a8.287 8.287 0 0 0 .464.478c.327.31.803.717 1.398 1.104C4.76 7.434 6.045 8 7.5 8c1.241 0 2.333-.411 3.253-.935.668-.38 1.264-.855 1.696-1.24a11.508 11.508 0 0 0 .672-.651l.007-.008.002-.002a.5.5 0 0 1 .74.672L13.5 5.5l.37.336-.001.002-.003.003-.011.012-.041.043c-.035.037-.085.09-.15.155a12.526 12.526 0 0 1-1.8 1.5l1.948 1.559a.5.5 0 0 1-.624.78l-2.24-1.792c-.839.44-1.828.799-2.948.883V11.5a.5.5 0 1 1-1 0V8.981c-1.319-.099-2.478-.576-3.403-1.12l-1.72 1.968a.5.5 0 1 1-.753-.658l1.63-1.866A10.935 10.935 0 0 1 1.27 5.993a6.076 6.076 0 0 1-.141-.158l-.009-.01-.003-.003V5.82L1.5 5.5l-.383.32a.5.5 0 0 1 .063-.704' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_OPEN_FILLED = [\n\t\"<path d='M14.333 7.583S11.833 3 7.667 3C3.5 3 1 7.583 1 7.583s2.5 4.584 6.667 4.584c4.166 0 6.666-4.584 6.666-4.584Zm-12.356 0 .162-.24c.28-.4.691-.932 1.221-1.462C4.434 4.807 5.9 3.833 7.667 3.833c1.766 0 3.232.974 4.306 2.048a10.934 10.934 0 0 1 1.383 1.702 10.934 10.934 0 0 1-1.383 1.702c-1.074 1.075-2.54 2.048-4.306 2.048S4.434 10.36 3.36 9.286a10.946 10.946 0 0 1-1.383-1.703Z'/><path d='M4.75 7.583a2.917 2.917 0 1 1 5.833 0 2.917 2.917 0 0 1-5.833 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_OPEN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7.43 2.208c-1.228.09-2.46.475-3.69 1.16L2.118 1.808a.588.588 0 0 0-.808 0 .535.535 0 0 0 0 .777l1.447 1.391C1.887 4.573 1.02 5.32.153 6.22a.534.534 0 0 0 0 .748C2.763 9.674 5.39 10.999 8 11c2.61.001 5.238-1.32 7.848-4.034l.004-.004.057-.072.047-.085.029-.086.014-.095-.002-.089-.02-.094-.032-.084-.043-.071-.054-.066c-.866-.9-1.734-1.648-2.604-2.244l1.446-1.39a.535.535 0 0 0 0-.777.588.588 0 0 0-.808 0l-1.62 1.557C11.033 2.68 9.8 2.298 8.572 2.207V.549A.561.561 0 0 0 8.001 0a.561.561 0 0 0-.572.55v1.658Zm.683 1.078a.629.629 0 0 1-.224 0c-2.182.038-4.348 1.159-6.529 3.307C3.578 8.778 5.781 9.9 8 9.901c2.22.001 4.424-1.119 6.642-3.308-2.18-2.152-4.348-3.271-6.53-3.307ZM8 3.846c-1.578 0-2.858 1.23-2.858 2.747 0 1.516 1.28 2.747 2.858 2.747 1.577 0 2.857-1.23 2.857-2.747 0-1.516-1.28-2.747-2.857-2.747Zm0 1.099c.946 0 1.714.738 1.714 1.648 0 .91-.768 1.648-1.714 1.648-.947 0-1.715-.738-1.715-1.648 0-.91.768-1.648 1.715-1.648Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 11\",\n] as const;\n\nexport const ICON_FACEBOOK_FILLED = [\n\t\"<path d='M22 12.061C22 6.504 17.523 2 12.001 2 6.477 2.001 2 6.504 2 12.063c0 5.02 3.657 9.182 8.436 9.937v-7.03H7.9v-2.908h2.54V9.845c0-2.52 1.493-3.913 3.777-3.913 1.095 0 2.238.196 2.238.196v2.475h-1.26c-1.242 0-1.63.776-1.63 1.572v1.887h2.773l-.442 2.907h-2.331v7.03C18.343 21.245 22 17.083 22 12.062Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_FIRE_FILLED = [\n\t\"<path d='M19.069 11.051a7.768 7.768 0 0 0-1.853-2.575l-.65-.597a.18.18 0 0 0-.291.074l-.291.834c-.181.523-.514 1.057-.986 1.582a.14.14 0 0 1-.091.045.124.124 0 0 1-.097-.034.131.131 0 0 1-.044-.107c.082-1.346-.32-2.863-1.2-4.515-.73-1.373-1.742-2.444-3.007-3.19l-.924-.543a.18.18 0 0 0-.268.163l.05 1.073c.033.733-.052 1.381-.253 1.92-.246.66-.6 1.272-1.05 1.822a6.61 6.61 0 0 1-1.063 1.03A7.882 7.882 0 0 0 4.81 10.75a7.774 7.774 0 0 0-.19 6.49 7.854 7.854 0 0 0 4.19 4.149c.97.406 1.998.612 3.06.612 1.061 0 2.09-.206 3.06-.61a7.791 7.791 0 0 0 2.501-1.67 7.737 7.737 0 0 0 2.307-5.52c0-1.09-.223-2.15-.668-3.149Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_FISH_FILLED = [\n\t\"<path d='M24 12c0-.775-.669-2.192-2.138-3.469a9.705 9.705 0 0 0-2.826-1.693.148.148 0 0 0-.184.073.89.89 0 0 1-.022.04l-.45.746a8.589 8.589 0 0 0 .004 8.615l.01.018.41.75a.187.187 0 0 0 .232.085C22.483 15.817 24 13.195 24 12Zm-4.402-.007a.75.75 0 1 1-.195-1.487.75.75 0 0 1 .195 1.487Z'/><path d='M15.724 12c0-1.778.47-3.525 1.363-5.062l.006-.01.216-.36a.187.187 0 0 0-.12-.281 13.325 13.325 0 0 0-1.841-.253.372.372 0 0 1-.201-.075c-.904-.687-2.696-1.889-4.522-2.198a.75.75 0 0 0-.844.946l.498 1.743a.187.187 0 0 1-.113.226c-1.728.642-3.215 1.817-4.3 2.712a.375.375 0 0 1-.472.003 14.548 14.548 0 0 0-.454-.346C3.082 7.688.899 7.509.807 7.502a.75.75 0 0 0-.79.91c.02.09.432 1.907 1.487 3.356a.38.38 0 0 1 0 .448C.449 13.666.037 15.482.018 15.573a.75.75 0 0 0 .789.91c.093-.007 2.275-.188 4.13-1.542.152-.111.3-.224.444-.338a.375.375 0 0 1 .472.003c1.09.9 2.58 2.075 4.312 2.719a.187.187 0 0 1 .114.226l-.5 1.743a.75.75 0 0 0 .844.946c.804-.136 2.432-.603 4.502-2.195a.383.383 0 0 1 .204-.078c.618-.04 1.233-.123 1.839-.248a.188.188 0 0 0 .126-.274l-.211-.388A10.069 10.069 0 0 1 15.724 12Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_GLOBE_OUTLINE = [\n\t\"<path d='M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm7.934 9h-2.938a14.86 14.86 0 0 0-1.186-5.079A8.013 8.013 0 0 1 19.934 11zM12 20c-.491 0-1.48-1.819-1.888-5H13.888C13.48 18.181 12.491 20 12 20zm-2-7h4c-.086 1.183-.297 2.24-.606 3.11C13.077 16.922 12.545 18 12 18c-.545 0-1.077-1.078-1.394-1.89C10.297 15.24 10.086 14.183 10 13zm0-2c.086-1.183.297-2.24.606-3.11C10.923 7.078 11.455 6 12 6c.545 0 1.077 1.078 1.394 1.89C13.703 8.76 13.914 9.817 14 11h-4zm-2.81 5.079A14.86 14.86 0 0 0 8.004 11H5.066a8.013 8.013 0 0 0 4.124 5.079zM5.066 13h2.938c.205 1.842.61 3.561 1.186 5.079A8.013 8.013 0 0 1 5.066 13zm9.748 5.079A14.86 14.86 0 0 0 15.996 13h2.938a8.013 8.013 0 0 1-4.18 5.079zM15.996 11a14.86 14.86 0 0 0-1.186-5.079A8.013 8.013 0 0 1 18.934 11h-2.938zM9.19 5.921A14.86 14.86 0 0 0 8.004 11H5.066A8.013 8.013 0 0 1 9.19 5.921z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_GOOGLE_FILLED = [\n\t\"<path d='M21.823 10.363c.119.685.178 1.379.177 2.074 0 3.104-1.11 5.728-3.04 7.504h.002c-1.688 1.56-4.009 2.463-6.76 2.463a10.202 10.202 0 0 1 0-20.403 9.805 9.805 0 0 1 6.824 2.655l-2.912 2.912a5.543 5.543 0 0 0-3.913-1.53c-2.66 0-4.922 1.795-5.728 4.213a6.11 6.11 0 0 0 0 3.906h.004c.81 2.414 3.067 4.21 5.728 4.21 1.375 0 2.556-.353 3.471-.975h-.004a4.72 4.72 0 0 0 2.04-3.1h-5.51v-3.927l9.62-.002Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_HASHTAG_OUTLINE = [\n\t\"<path d='M4.758 13.704c-.192 0-.325-.059-.4-.176-.064-.107-.074-.288-.032-.544l.352-2.096h-1.76c-.149 0-.25-.037-.304-.112-.053-.085-.069-.224-.048-.416.022-.192.059-.336.112-.432a.459.459 0 0 1 .256-.192c.118-.043.246-.064.384-.064H4.87l.48-2.928H3.606c-.149 0-.256-.037-.32-.112-.053-.075-.069-.203-.048-.384.022-.203.064-.352.128-.448a.459.459 0 0 1 .256-.192c.107-.043.235-.064.384-.064h1.536l.4-2.4c.043-.235.096-.41.16-.528a.495.495 0 0 1 .288-.24c.128-.053.304-.08.528-.08.224 0 .363.064.416.192.064.117.07.325.016.624l-.416 2.432h3.264l.368-2.336c.043-.235.091-.416.144-.544a.494.494 0 0 1 .256-.272c.118-.064.294-.096.528-.096.224 0 .374.059.448.176.075.107.091.293.048.56l-.4 2.512h1.472c.182 0 .294.048.336.144.054.096.059.24.016.432a1.096 1.096 0 0 1-.176.432.475.475 0 0 1-.256.16 1.265 1.265 0 0 1-.304.032h-1.312l-.448 2.928h1.456c.182 0 .294.053.336.16a.624.624 0 0 1 .032.352 1.84 1.84 0 0 1-.176.464.463.463 0 0 1-.24.192.975.975 0 0 1-.336.048h-1.296l-.32 1.952a1.427 1.427 0 0 1-.128.48.616.616 0 0 1-.304.288c-.128.064-.314.096-.56.096-.17 0-.293-.059-.368-.176-.074-.107-.09-.293-.048-.56l.32-2.08H6.07l-.32 1.92c-.032.203-.08.373-.144.512a.628.628 0 0 1-.288.288c-.128.064-.314.096-.56.096Zm1.488-4.032H9.51l.464-2.928h-3.2l-.528 2.928Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_HOME_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M2.642 6.408c0-.339.165-.656.442-.85l4.321-3.025c.357-.25.833-.25 1.19 0l4.32 3.025c.278.194.443.511.443.85v6.913c0 .573-.464 1.037-1.037 1.037H3.679a1.037 1.037 0 0 1-1.037-1.037V6.408ZM8 3.383 3.679 6.408v6.913h8.642V6.408L8 3.383Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M10.765 14.358h-5.53v-3.917h1.037v2.88h3.456v-2.88h1.037v3.917Zm-1.037-3.917S9.728 9 8 9s-1.728 1.44-1.728 1.44c-1.038 0-1.038 0-1.038-.002v-.023a1.617 1.617 0 0 1 .008-.126 2.602 2.602 0 0 1 .357-1.103c.41-.683 1.185-1.224 2.4-1.224 1.216 0 1.993.54 2.403 1.224a2.601 2.601 0 0 1 .363 1.23v.023H9.728ZM7.693 2.1a.519.519 0 0 1 .614 0l6.481 4.753a.519.519 0 0 1-.613.837L8 3.162 1.825 7.69a.519.519 0 1 1-.613-.837L7.693 2.1Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_IMPORT_OUTLINE = [\n\t\"<g fill-rule='evenodd' clip-path='url(#a)' clip-rule='evenodd'><path d='M16 11.565a.574.574 0 0 1-.574.573H8.732a.574.574 0 1 1 0-1.147h6.12V1.147h-9.85v6.595a.574.574 0 0 1-1.147 0V.574c0-.317.257-.574.574-.574h10.997c.317 0 .574.257.574.574v10.99Z'/><path d='M8.027 14.95a.574.574 0 0 1-.573.574l-6.235.009a.574.574 0 0 1-.575-.573L.636 8.728a.574.574 0 0 1 1.148-.002l.006 4.848 8.29-8.308a.574.574 0 0 1 .813.81l-8.29 8.308 4.85-.007c.317 0 .574.256.574.573Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_INFO_FILLED_BLUE = [\n\t\"<path fill='#275FFD' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm.32-9.24a.88.88 0 1 0 0-1.76.88.88 0 0 0 0 1.76ZM6.123 5.97l2.015-.253-.881 4.139c-.062.299.026.469.268.469.17 0 .428-.062.603-.217l-.077.366c-.253.304-.81.526-1.289.526-.618 0-.881-.371-.711-1.16L6.7 6.79c.056-.258.004-.35-.253-.413l-.397-.072.072-.335Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_INFO_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path d='m8.138 5.716-2.015.253-.072.335.397.072c.257.062.309.155.252.413L6.05 9.84c-.17.789.094 1.16.712 1.16.48 0 1.036-.222 1.289-.526l.077-.366a.974.974 0 0 1-.603.217c-.242 0-.33-.17-.268-.47l.881-4.139ZM8.2 3.88a.88.88 0 1 1-1.76 0 .88.88 0 0 1 1.76 0Z'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_INSTAGRAM_FILLED = [\n\t\"<path d='M12 8.876A3.13 3.13 0 0 0 8.876 12 3.13 3.13 0 0 0 12 15.124 3.13 3.13 0 0 0 15.124 12 3.13 3.13 0 0 0 12 8.876ZM21.37 12c0-1.294.012-2.576-.06-3.867-.073-1.5-.415-2.831-1.512-3.928-1.1-1.1-2.428-1.44-3.928-1.512-1.294-.073-2.576-.061-3.868-.061-1.293 0-2.575-.012-3.867.061-1.5.073-2.831.415-3.928 1.512-1.1 1.099-1.439 2.428-1.512 3.928-.072 1.294-.06 2.576-.06 3.867s-.012 2.576.06 3.867c.073 1.5.415 2.831 1.512 3.928 1.1 1.1 2.428 1.44 3.928 1.512 1.294.073 2.576.061 3.867.061 1.294 0 2.576.012 3.867-.061 1.5-.073 2.832-.415 3.929-1.512 1.099-1.099 1.439-2.428 1.511-3.928.075-1.291.061-2.573.061-3.867ZM12 16.807A4.8 4.8 0 0 1 7.193 12 4.8 4.8 0 0 1 12 7.193 4.8 4.8 0 0 1 16.807 12 4.8 4.8 0 0 1 12 16.807Zm5.004-8.688a1.121 1.121 0 0 1-1.123-1.123c0-.621.502-1.123 1.123-1.123a1.121 1.121 0 0 1 .43 2.16 1.12 1.12 0 0 1-.43.086Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_KEY_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M12.888 4.373c0-1.205-.912-2.191-2.038-2.191s-2.038.986-2.038 2.19c0 1.207.912 2.183 2.038 2.183s2.038-.976 2.038-2.182m1.112 0C14 2.51 12.59 1 10.85 1S7.7 2.51 7.7 4.373c0 .717.21 1.382.565 1.93l-6.102 6.534a.625.625 0 0 0 0 .841.53.53 0 0 0 .786 0l.834-.892q.021.03.047.058l.918.982a.53.53 0 0 0 .786 0 .625.625 0 0 0 0-.842l-.917-.982a1 1 0 0 0-.055-.051l.545-.584.02.023.525.56a.53.53 0 0 0 .786 0 .625.625 0 0 0 0-.84l-.524-.563-.021-.02 3.16-3.383c.51.38 1.129.602 1.797.602 1.74 0 3.15-1.51 3.15-3.373' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_LACTOSE_INTOLERANT_FILLED = [\n\t\"<path fill-rule='evenodd' d='M1.293 1.293a1 1 0 0 1 1.414 0L8.494 7.08a.99.99 0 0 1 .028.027l7.613 7.614.015.015 6.557 6.557a1 1 0 0 1-1.414 1.414L18 19.414V20a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3v-9.788a5 5 0 0 1 .539-2.259L1.293 2.707a1 1 0 0 1 0-1.414ZM8.086 9.5a3 3 0 0 0-.086.712v3.438a7.472 7.472 0 0 1 4.386.428c.145.06.292.114.44.162L8.086 9.5Zm3.528 6.422a7.472 7.472 0 0 0 3.453.56l-3.453-.56Zm3.453.56.933.932V20a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4.293a5.467 5.467 0 0 1 3.614.215M7 2a1 1 0 0 1 1-1h8a1 1 0 1 1 0 2v1.789a3 3 0 0 0 .504 1.664l.656.984a5 5 0 0 1 .84 2.775v1.131a1 1 0 1 1-2 0v-1.131a3 3 0 0 0-.504-1.665l-.656-.984A5 5 0 0 1 14 4.789V3h-4v.343a1 1 0 0 1-2 0V3a1 1 0 0 1-1-1Z' clip-rule='evenodd'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LAYOUT_1_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.733 1.444c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444V5.89a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V1.444Zm.89.445v3.556h3.555V1.889H2.622ZM1.733 8.111c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444v4.445a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V8.111Zm.89.445v3.556h3.555V8.555H2.622ZM9.067 1.444c0-.245.186-.444.416-.444h4.167c.23 0 .417.199.417.444v11.112c0 .245-.187.444-.417.444H9.483c-.23 0-.416-.199-.416-.444V1.444Zm.833.445V12.11h3.333V1.89H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_2_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7.241 1.305a.439.439 0 0 0-.439-.44h-4.39a.439.439 0 0 0-.439.44v4.39c0 .242.197.439.44.439h4.39a.439.439 0 0 0 .438-.439v-4.39Zm-.878.439v3.512H2.851V1.744h3.512ZM11.266 5.11a1.683 1.683 0 1 1 0-3.366 1.683 1.683 0 0 1 0 3.366Zm0 .878a2.561 2.561 0 1 1 0-5.122 2.561 2.561 0 0 1 0 5.122ZM2.344 8.134c-.245 0-.444.187-.444.417v4.167c0 .23.199.416.444.416h11.111c.246 0 .445-.186.445-.416V8.55c0-.23-.2-.417-.444-.417H2.344Zm.445.834H13.01V12.3H2.789V8.968Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_3_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.733 1.444c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444V5.89a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V1.444Zm.89.445v3.556h3.555V1.889H2.622ZM1.733 8.111c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444v4.445a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V8.111Zm.89.445v3.556h3.555V8.555H2.622ZM9.067 1.444c0-.245.186-.444.416-.444h4.167c.23 0 .417.199.417.444v11.112c0 .245-.187.444-.417.444H9.483c-.23 0-.416-.199-.416-.444V1.444Zm.833.445V12.11h3.333V1.89H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_4_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M2.178 7.667a.444.444 0 0 0-.445.444v4.444c0 .246.2.445.445.445h4.444a.444.444 0 0 0 .445-.445V8.111a.444.444 0 0 0-.445-.445H2.178Zm.444.888h3.556v3.556H2.622V8.555ZM6.03 3.593a1.704 1.704 0 1 1-3.408 0 1.704 1.704 0 0 1 3.408 0Zm.888 0a2.593 2.593 0 1 1-5.185 0 2.593 2.593 0 0 1 5.185 0ZM9.067 12.556c0 .245.186.444.416.444h4.167c.23 0 .416-.199.416-.444V1.444c0-.245-.186-.444-.416-.444H9.483c-.23 0-.416.199-.416.444v11.112Zm.833-.445V1.89h3.333V12.11H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_5_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.668 3.588a1.744 1.744 0 1 0 3.488 0 1.744 1.744 0 0 0-3.488 0Zm-.91 0a2.654 2.654 0 1 0 5.308 0 2.654 2.654 0 0 0-5.308 0ZM1.668 10.412a1.744 1.744 0 1 0 3.488 0 1.744 1.744 0 0 0-3.488 0Zm-.91 0a2.654 2.654 0 1 0 5.308 0 2.654 2.654 0 0 0-5.308 0ZM15.042 2.223a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 5.408a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 8.592a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 11.777a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 14\",\n] as const;\n\nexport const ICON_LEAF_FILLED = [\n\t\"<path d='M20.977 3.27 20.857 2l-1.21.403c-2.072.72-4.285.94-6.458.645a11.96 11.96 0 0 0-6.73.907 7.285 7.285 0 0 0-4.323 5.45 9.068 9.068 0 0 0 .393 4.615c.34-.768.737-1.508 1.189-2.216a9.925 9.925 0 0 1 4.1-3.456 11.244 11.244 0 0 1 5.099-1.008c-1.67.255-3.27.856-4.696 1.763a9.553 9.553 0 0 0-1.874 1.542 11.465 11.465 0 0 0-1.4 1.924 16.514 16.514 0 0 0-1.582 4.575A26.62 26.62 0 0 0 2.841 22h2.015a30.92 30.92 0 0 1 .595-4.353 9.32 9.32 0 0 0 4.554 1.119 11.083 11.083 0 0 0 4.312-.877c7.668-3.274 6.66-14.166 6.66-14.62Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LINKEDIN_FILLED = [\n\t\"<path d='M2 3.433C2 2.64 2.658 2 3.469 2H20.53C21.343 2 22 2.641 22 3.433v17.134C22 21.36 21.343 22 20.531 22H3.47C2.658 22 2 21.359 2 20.567V3.433Zm6.179 15.31V9.71H5.177v9.031H8.18Zm-1.5-10.265c1.046 0 1.697-.693 1.697-1.56-.018-.887-.65-1.56-1.677-1.56C5.67 5.357 5 6.032 5 6.918c0 .867.651 1.56 1.659 1.56h.02Zm6.135 10.264V13.7c0-.27.02-.54.1-.733.216-.538.71-1.097 1.54-1.097 1.086 0 1.52.827 1.52 2.042v4.832h3.001v-5.18c0-2.776-1.48-4.066-3.455-4.066-1.592 0-2.306.876-2.706 1.492v.031h-.02l.02-.031V9.71h-3c.037.848 0 9.031 0 9.031h3Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LOCATION_FILLED = [\n\t\"<path d='M11.5 22S19 14.892 19 9.5a7.5 7.5 0 0 0-15 0C4 14.892 11.5 22 11.5 22Zm0-8.75a3.75 3.75 0 1 1 0-7.5 3.75 3.75 0 0 1 0 7.5Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LOCK_PASSWORD_1_OUTLINE = [\n\t\"<path d='M5.961 9.278h4.088c.844 0 1.531-.687 1.531-1.532V5.151a1.53 1.53 0 0 0-1.453-1.524V2.623C10.127 1.453 9.175.5 8.005.5s-2.123.952-2.123 2.123v1.003A1.53 1.53 0 0 0 4.43 5.15v2.595c0 .846.687 1.533 1.531 1.533M8 1.5c.676 0 1.231.558 1.231 1.234v.885H6.778v-.885A1.23 1.23 0 0 1 8 1.5m-2.5 4c0-.35 0-.781.547-.781h4.002c.451 0 .53.43.53.781v2c0 .35-.089.828-.618.828H6.07c-.462 0-.571-.478-.571-.828zM13.553 10.543H2.602C1.547 10.543 1 11.197 1 12v2.117c0 .804.653 1.458 1.457 1.458h11.096c.803 0 1.457-.654 1.457-1.457V12c0-.804-.653-1.457-1.457-1.457M14 14.118c0 .308-.138.482-.447.482H2.457c-.31 0-.457-.174-.457-.482V12c0-.309.293-.49.602-.49h10.951c.31 0 .447.181.447.49z'/><path d='M4.653 13.806a.652.652 0 1 0 0-1.306.652.652 0 1 0 0 1.306M8 13.806A.652.652 0 1 0 8 12.5a.652.652 0 1 0 0 1.306M11.653 13.806a.652.652 0 1 0 0-1.306.652.652 0 1 0 0 1.306'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_LOCK_PASSWORD_2_OUTLINE = [\n\t\"<path d='M14.41 9.018a2.11 2.11 0 0 0-1.642-.601V7.1c.001-.908-.735-1.646-1.645-1.648H9.845v-2A2.96 2.96 0 0 0 8.364.895a2.97 2.97 0 0 0-2.96 0 2.96 2.96 0 0 0-1.48 2.558v2H2.644C1.735 5.455.999 6.193 1 7.1v6.75c0 .908.735 1.647 1.645 1.649h8.478a1.65 1.65 0 0 0 1.645-1.65v-1.315a2.073 2.073 0 0 0 1.641-3.517M4.936 3.453a1.947 1.947 0 0 1 3.897 0v2H4.936zm6.82 10.398a.636.636 0 0 1-.633.638H2.645a.636.636 0 0 1-.633-.638V7.1a.635.635 0 0 1 .633-.637h1.782c.001-.004 4.906.003 4.91 0h1.786a.635.635 0 0 1 .633.637v1.316H8.443a2.06 2.06 0 0 0 0 4.118h3.313zm1.197-2.327c-.36-.002-4.035.002-4.499 0a1.049 1.049 0 0 1-.01-2.096h4.51a1.049 1.049 0 0 1-.001 2.096m-2.258-.542a.506.506 0 0 1 0-1.012.506.506 0 0 1 0 1.011m1.796 0a.506.506 0 0 1 .001-1.012.506.506 0 0 1 0 1.011m-3.593 0a.506.506 0 0 1 0-1.012.506.506 0 0 1 0 1.011'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MAIL_OUTLINE = [\n\t\"<path d='M1.714 2.5C.763 2.5 0 3.303 0 4.256v7.91c0 .954.763 1.763 1.714 1.763h12.572c.951 0 1.714-.81 1.714-1.762V4.256c0-.953-.763-1.756-1.714-1.756H1.714Zm.084 1.143h12.41L8.34 9.214c-.213.203-.452.203-.666 0L1.798 3.643Zm-.655.952 3.893 3.69-3.893 3.882V4.595Zm13.714 0v7.572l-3.88-3.887 3.88-3.685Zm-4.702 4.47 3.708 3.72H2.143l3.72-3.714 1.024.97c.62.589 1.618.59 2.238 0l1.03-.976Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MENU_CLOSE_OUTLINE = [\n\t\"<path d='m13.003 1.013.107-.097a1.413 1.413 0 0 1 1.988 1.988L15 3.01 3.01 15a1.413 1.413 0 1 1-1.998-1.999l11.99-11.99Z'/><path d='m14.987 12.989.097.107a1.413 1.413 0 0 1-1.988 1.988l-.107-.097L.999 2.997A1.413 1.413 0 0 1 2.997 1l11.99 11.99Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MENU_HAMBURGER_OUTLINE = [\n\t\"<path d='m14.857 0 .117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 1 1 0-2.286h13.714ZM14.857 6.857l.117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 0 1 0-2.286h13.714ZM14.857 13.714l.117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 0 1 0-2.286h13.714Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_BICOLOR_TERTIARY_LIGHT = [\n\t\"<circle cx='8' cy='8' r='8' fill='#F7F3EE'/><path fill='#1B1B1B' fill-rule='evenodd' d='M3.929 8.5c0-.276.191-.5.428-.5H11.5c.237 0 .429.224.429.5s-.192.5-.429.5H4.357c-.237 0-.428-.224-.428-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_BICOLOR_TERTIARY = [\n\t\"<circle cx='8' cy='8' r='8' fill='#E6D9CA'/><path fill='#1B1B1B' fill-rule='evenodd' d='M3.929 8.5c0-.276.191-.5.428-.5H11.5c.237 0 .429.224.429.5s-.192.5-.429.5H4.357c-.237 0-.428-.224-.428-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_FILLED = [\n\t\"<path d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM4.357 8c-.236 0-.428.224-.428.5s.192.5.428.5H11.5c.237 0 .429-.224.429-.5S11.737 8 11.5 8H4.357Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_BILL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M0 12.167V4.833c0-.053.002-.107.006-.16.072-.885.731-1.59 1.558-1.666.05-.005.1-.007.15-.007h12.572c.05 0 .1.002.15.007.827.076 1.486.781 1.558 1.666a2 2 0 0 1 .006.16v7.334c0 .053-.002.107-.006.16-.072.885-.731 1.59-1.558 1.666-.05.005-.1.007-.15.007H1.714c-.05 0-.1-.002-.15-.007-.827-.076-1.486-.781-1.558-1.666a2.009 2.009 0 0 1-.006-.16Zm2.829-7.945H1.714c-.315 0-.571.274-.571.611v1.192c.093.02.188.03.286.03.788 0 1.428-.684 1.428-1.527 0-.105-.01-.206-.028-.306Zm9.187 0H3.984c.011.1.016.203.016.306 0 1.518-1.152 2.75-2.571 2.75-.097 0-.192-.006-.286-.017v2.478c.094-.012.19-.017.286-.017C2.848 9.722 4 10.954 4 12.472c0 .103-.005.206-.016.306h8.032a2.88 2.88 0 0 1-.016-.306c0-1.518 1.152-2.75 2.571-2.75.097 0 .193.005.286.017V7.261c-.093.011-.19.017-.286.017-1.419 0-2.571-1.232-2.571-2.75 0-.103.005-.206.016-.306ZM8 10.111c.301 0 .571-.207.571-.5 0-.217-.167-.288-.332-.366-.246-.114-.528-.198-.784-.304-.67-.278-1.17-.705-1.17-1.552 0-.738.471-1.385 1.144-1.625v-.32c0-.337.255-.61.571-.61.316 0 .571.273.571.61v.32c.382.137.7.403.901.741.17.285.09.663-.176.844a.55.55 0 0 1-.788-.187A.584.584 0 0 0 8 6.889c-.301 0-.571.207-.571.5 0 .217.167.288.332.365.246.115.528.199.784.305.67.278 1.17.705 1.17 1.552 0 .738-.471 1.385-1.144 1.624v.32c0 .338-.255.612-.571.612-.316 0-.571-.274-.571-.611v-.32a1.73 1.73 0 0 1-.901-.742.637.637 0 0 1 .176-.843.55.55 0 0 1 .788.187c.1.17.293.273.508.273Zm5.171 2.667h1.115c.315 0 .571-.274.571-.611v-1.192a1.357 1.357 0 0 0-.286-.03c-.788 0-1.428.684-1.428 1.527 0 .105.01.207.028.306ZM1.143 10.975v1.192c0 .337.256.61.571.61H2.83c.018-.098.028-.2.028-.305 0-.843-.64-1.528-1.428-1.528-.098 0-.193.011-.286.031Zm13.714-4.95V4.833c0-.337-.256-.61-.571-.61H13.17c-.018.099-.028.2-.028.305 0 .843.64 1.528 1.428 1.528.098 0 .193-.011.286-.03Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_CASH_OUTLINE = [\n\t\"<path d='M16 6.417C16 3.432 13.605 1 10.667 1c-1.739 0-3.28.856-4.256 2.167H1.6c-.88 0-1.6.73-1.6 1.625v1.083c0 .417.16.796.416 1.083A1.625 1.625 0 0 0 0 8.042v1.083c0 .417.16.796.416 1.083A1.625 1.625 0 0 0 0 11.292v1.083C0 13.269.72 14 1.6 14h8.533c.88 0 1.6-.731 1.6-1.625v-.65C14.165 11.221 16 9.033 16 6.417ZM1.067 9.125V8.042A.54.54 0 0 1 1.6 7.5h3.84c.16.802.501 1.538.97 2.167H1.6a.539.539 0 0 1-.533-.542Zm0-4.333A.54.54 0 0 1 1.6 4.25h4.181a5.443 5.443 0 0 0-.448 2.167H1.6a.54.54 0 0 1-.533-.542V4.792Zm9.6 7.583a.54.54 0 0 1-.534.542H1.6a.54.54 0 0 1-.533-.542v-1.083a.54.54 0 0 1 .533-.542h5.883a5.24 5.24 0 0 0 3.184 1.083v.542Zm0-1.625C8.315 10.75 6.4 8.805 6.4 6.417c0-2.389 1.915-4.334 4.267-4.334 2.352 0 4.266 1.945 4.266 4.334 0 2.388-1.914 4.333-4.266 4.333Z'/><path d='M10.207 5.27h1.467c.22 0 .4-.208.4-.462s-.18-.462-.4-.462h-.7v-.384c0-.254-.18-.462-.399-.462-.22 0-.4.208-.4.462v.389c-.607.023-1.098.596-1.098 1.303s.507 1.308 1.13 1.308h.732c.183 0 .331.171.331.384s-.148.384-.331.384H9.473c-.22 0-.4.208-.4.462s.18.462.4.462h.699v.384c0 .254.18.462.4.462.219 0 .399-.208.399-.462v-.389c.607-.023 1.098-.596 1.098-1.303s-.507-1.308-1.13-1.308h-.732c-.183 0-.331-.171-.331-.384s.148-.384.332-.384Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_COIN_OUTLINE = [\n\t\"<path d='M14.7 8A6.7 6.7 0 1 0 8 14.7V16A8 8 0 1 1 8 0a8 8 0 0 1 0 16v-1.3c3.7 0 6.7-3 6.7-6.7Z'/><path d='M7.513 6.36h1.954c.293 0 .533-.277.533-.616 0-.339-.24-.616-.533-.616h-.932v-.512c0-.339-.24-.616-.532-.616-.293 0-.533.277-.533.616v.518c-.81.03-1.465.795-1.465 1.738s.677 1.744 1.508 1.744h.974c.245 0 .442.228.442.512 0 .283-.197.511-.442.511H6.533c-.293 0-.533.278-.533.617 0 .339.24.616.533.616h.932v.512c0 .339.24.616.532.616.293 0 .533-.277.533-.616v-.518c.81-.03 1.465-.795 1.465-1.738s-.677-1.744-1.508-1.744h-.974c-.245 0-.442-.228-.442-.512 0-.283.197-.511.442-.511Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_CREDIT_CARD_OUTLINE = [\n\t\"<path d='M13.143 3H2.857C1.28 3 0 4.232 0 5.75v5.5C0 12.768 1.28 14 2.857 14h10.286C14.72 14 16 12.768 16 11.25v-5.5C16 4.232 14.72 3 13.143 3ZM2.857 4.1h10.286c.943 0 1.714.743 1.714 1.65v.275H1.143V5.75c0-.907.771-1.65 1.714-1.65Zm10.286 8.8H2.857c-.943 0-1.714-.742-1.714-1.65V7.125h13.714v4.125c0 .908-.771 1.65-1.714 1.65Z'/><path d='M10.591 9c.332 0 .647.1.909.265A1.57 1.57 0 0 1 12.409 9C13.283 9 14 9.68 14 10.508c0 .83-.717 1.492-1.591 1.492-.332 0-.647-.1-.909-.265-.262.165-.56.265-.909.265C9.717 12 9 11.32 9 10.492 9 9.662 9.717 9 10.591 9Zm1.38 2.22c.123.066.28.1.42.1.49 0 .892-.381.892-.829 0-.464-.402-.845-.892-.845a.862.862 0 0 0-.42.1c.123.215.21.464.21.729 0 .282-.07.53-.21.745Zm-1.38.117c.49 0 .892-.381.892-.845 0-.465-.402-.846-.892-.846s-.892.381-.892.845c0 .465.402.846.892.846ZM5 8.5l.1.01a.5.5 0 0 1 0 .98L5 9.5H3a.5.5 0 0 1 0-1h2ZM7 10.5a.5.5 0 0 1 0 1H3a.5.5 0 0 1 0-1h4Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_NFC_FILLED = [\n\t\"<path d='M15 .5A2.5 2.5 0 0 1 17.5 3v12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12ZM5.994 4.622a.5.5 0 0 0-.822.306L5.167 5v8.667a.5.5 0 0 0 1 0V6.095l3.173 2.75.082.057a.5.5 0 0 0 .641-.74l-.069-.073-4-3.467Zm6.34-.122a.5.5 0 0 0-.5.5v7.69l-3.208-2.318a.5.5 0 0 0-.585.812l4 2.888.06.036a.5.5 0 0 0 .733-.441V5a.5.5 0 0 0-.5-.5Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_NFC_OUTLINE = [\n\t\"<path d='M16.5 3A1.5 1.5 0 0 0 15 1.5H3A1.5 1.5 0 0 0 1.5 3v12A1.5 1.5 0 0 0 3 16.5h12a1.5 1.5 0 0 0 1.5-1.5V3ZM5.167 13.667V5a.5.5 0 0 1 .827-.378l4 3.467.07.073a.5.5 0 0 1-.642.74l-.083-.057-3.172-2.75v7.572a.5.5 0 0 1-1 0ZM11.833 5a.5.5 0 0 1 1 0v8.667a.5.5 0 0 1-.792.405l-4-2.888-.076-.068a.5.5 0 0 1 .661-.744l3.207 2.316V5ZM17.5 15a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12A2.5 2.5 0 0 1 17.5 3v12Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_PENCIL_OUTLINE = [\n\t\"<path d='M10.944 1c-.44 0-.88.165-1.213.498L1.737 9.497A2.515 2.515 0 0 0 1 11.275v2.148C1 14.286 1.714 15 2.577 15h2.148c.667 0 1.307-.265 1.778-.737l7.999-7.994a1.724 1.724 0 0 0 0-2.424l-2.347-2.347A1.708 1.708 0 0 0 10.943 1Zm.002 1.16c.14 0 .278.055.387.165l2.342 2.341a.54.54 0 0 1 0 .775l-1.15 1.15L9.41 3.474l1.15-1.15a.545.545 0 0 1 .387-.163ZM8.582 4.302 11.7 7.418 5.68 13.436a1.353 1.353 0 0 1-.956.395H2.577a.4.4 0 0 1-.41-.409v-2.148c0-.358.143-.703.396-.956l6.02-6.017Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PENCIL = [\n\t\"<path fill='#1B1B1B' d='M10.944 1c-.44 0-.88.165-1.213.498L1.737 9.497A2.515 2.515 0 0 0 1 11.275v2.148C1 14.286 1.714 15 2.577 15h2.148c.667 0 1.307-.265 1.778-.737l7.999-7.994a1.724 1.724 0 0 0 0-2.424l-2.347-2.347A1.708 1.708 0 0 0 10.943 1Zm.002 1.16c.14 0 .278.055.387.165l2.342 2.341a.54.54 0 0 1 0 .775l-1.15 1.15L9.41 3.474l1.15-1.15a.545.545 0 0 1 .387-.163ZM8.582 4.302 11.7 7.418 5.68 13.436a1.353 1.353 0 0 1-.956.395H2.577a.4.4 0 0 1-.41-.409v-2.148c0-.358.143-.703.396-.956l6.02-6.017Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PHONE_OUTLINE = [\n\t\"<path d='M9.951 15c-1.058 0-2.108-.347-2.927-1.029a26.112 26.112 0 0 1-3.52-3.553A24.78 24.78 0 0 1 .811 6.37C-.1 4.65.463 2.58 2.152 1.447l.168-.113c.402-.27.897-.383 1.393-.314a1.9 1.9 0 0 1 1.23.67l1.488 1.825c.615.755.44 1.823-.392 2.38l-.661.444A6.543 6.543 0 0 0 6.52 8.394a7.198 7.198 0 0 0 1.84 1.597l.655-.447c.403-.27.899-.382 1.393-.316.496.068.934.306 1.23.671l1.488 1.825c.615.754.44 1.822-.393 2.38l-.168.113c-.782.523-1.701.782-2.616.782l.002.001ZM3.434 2.136c-.13 0-.26.035-.372.111l-.167.112c-1.206.81-1.608 2.29-.956 3.519a23.758 23.758 0 0 0 2.57 3.866 25.05 25.05 0 0 0 3.361 3.392c1.087.906 2.75.977 3.952.17l.169-.113a.533.533 0 0 0 .13-.793l-1.488-1.825a.637.637 0 0 0-.41-.224.678.678 0 0 0-.465.105l-.66.443c-.425.285-1.003.299-1.438.032A8.466 8.466 0 0 1 5.514 9.07a7.687 7.687 0 0 1-1.34-2.414c-.15-.45.034-.944.46-1.23l.66-.443a.533.533 0 0 0 .13-.793L3.936 2.365a.646.646 0 0 0-.502-.23Zm9.415 5.973c.26-2.177-1.48-4.14-3.882-4.376-.345-.032-.652.192-.69.503-.037.311.212.592.555.626 1.715.168 2.958 1.57 2.773 3.125-.037.311.211.591.554.625a.74.74 0 0 0 .068.004c.316 0 .588-.217.622-.507Zm2.488.244c.199-1.657-.327-3.285-1.48-4.583-1.151-1.3-2.791-2.114-4.619-2.294-.342-.033-.652.192-.69.503-.037.311.212.591.555.625 1.495.147 2.838.814 3.78 1.877.942 1.063 1.372 2.394 1.21 3.75-.037.312.211.592.555.626a.747.747 0 0 0 .068.003c.315 0 .587-.216.621-.507Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_BICOLOR_TERTIARY_LIGHT = [\n\t\"<circle cx='8' cy='8' r='8' fill='#F7F3EE'/><path fill='#1B1B1B' fill-rule='evenodd' d='M8.522 4.078a.522.522 0 0 0-1.045 0v3.4h-3.4a.522.522 0 1 0 0 1.044h3.4v3.4a.522.522 0 0 0 1.045 0v-3.4h3.4a.522.522 0 0 0 0-1.045h-3.4v-3.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_BICOLOR_TERTIARY = [\n\t\"<circle cx='8' cy='8' r='8' fill='#E6D9CA'/><path fill='#1B1B1B' fill-rule='evenodd' d='M8.522 4.078a.522.522 0 0 0-1.045 0v3.4h-3.4a.522.522 0 1 0 0 1.044h3.4v3.4a.522.522 0 0 0 1.045 0v-3.4h3.4a.522.522 0 0 0 0-1.045h-3.4v-3.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_FILLED = [\n\t\"<path d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0Zm-.001 3.556a.522.522 0 0 0-.521.522v3.4h-3.4a.523.523 0 0 0 0 1.043h3.4v3.402a.522.522 0 0 0 1.043 0V8.52h3.4a.522.522 0 1 0 0-1.043h-3.4v-3.4A.523.523 0 0 0 8 3.556Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PRINTER_OUTLINE = [\n\t\"<path d='M13.035 3.69h-.547V1.368a.407.407 0 0 0-.407-.406H4.139a.407.407 0 0 0-.408.406V3.69h-.547a2.072 2.072 0 0 0-2.075 2.063v4.437c0 .224.183.406.408.406h2.214v2.958c0 .225.182.406.408.406h7.94a.406.406 0 0 0 .409-.406v-2.958H14.7a.407.407 0 0 0 .408-.406V5.754c0-1.137-.93-2.063-2.074-2.063ZM4.547 1.774h7.125V3.69H4.547V1.773Zm7.125 11.376H4.547V8.602h7.125v4.547Zm2.621-3.363H12.49V8.602h.596a.407.407 0 1 0 0-.811H3.135a.407.407 0 1 0 0 .811h.597v1.184H1.926V5.754c0-.69.565-1.251 1.259-1.251h9.85c.694 0 1.258.561 1.258 1.251v4.032Z'/><path d='M4.11 6.461c0 .667-1 .667-1 0s1-.667 1 0ZM10.519 9.367H5.558a.51.51 0 0 0-.52.5c0 .276.232.5.52.5h4.96a.51.51 0 0 0 .52-.5.51.51 0 0 0-.52-.5ZM10.519 11.367H5.558a.51.51 0 0 0-.52.5c0 .276.232.5.52.5h4.96a.51.51 0 0 0 .52-.5.51.51 0 0 0-.52-.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_BILL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.5 4a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM7.5 6.5A.5.5 0 0 1 8 6h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM4.5 9a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/><path d='M5.162 6.588v.28c0 .073.052.132.116.132h.297c.064 0 .116-.059.116-.132v-.28c.219-.044.4-.147.528-.309a.986.986 0 0 0 .22-.647c0-.073 0-.132-.013-.19a2.637 2.637 0 0 0-.04-.163c-.012-.058-.038-.103-.064-.147-.025-.044-.064-.088-.09-.117-.026-.03-.064-.074-.116-.103-.039-.03-.09-.06-.129-.088-.039-.03-.09-.045-.142-.074a.668.668 0 0 0-.154-.059c-.052-.014-.103-.044-.168-.059a1.912 1.912 0 0 1-.31-.147c-.05-.044-.077-.088-.077-.147s.013-.103.065-.132c.051-.044.116-.059.206-.059.168 0 .348.074.541.206.052.044.117.03.155-.03l.245-.338c.026-.03.026-.073.026-.103a.1.1 0 0 0-.052-.088c-.077-.073-.18-.132-.27-.191a1.356 1.356 0 0 0-.336-.132v-.339C5.716 3.06 5.665 3 5.6 3h-.296c-.065 0-.116.059-.116.132v.31a.935.935 0 0 0-.529.293.986.986 0 0 0-.219.647c0 .06 0 .118.013.177s.026.103.039.162c.013.044.038.088.051.132a.816.816 0 0 0 .078.118c.025.029.064.058.09.088.026.03.064.059.116.088.039.03.077.044.116.059.039.015.077.044.129.059.051.014.09.029.129.044.038.014.077.03.142.044.051.015.103.03.141.059a.43.43 0 0 1 .116.059l.078.044c.013.014.038.03.051.059.013.014.026.029.026.058 0 .015.013.045.013.074a.224.224 0 0 1-.065.162c-.116.088-.335.088-.54-.015a.953.953 0 0 1-.285-.206c-.025-.03-.064-.044-.09-.03-.038 0-.064.015-.077.045L4.466 6a.153.153 0 0 0 .013.191c.155.191.4.338.683.397Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_LIST_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.5 3.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM4.5 6.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM4.5 9.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM6.5 3.5A.5.5 0 0 1 7 3h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5ZM6.5 6.5A.5.5 0 0 1 7 6h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5ZM6.5 9.5A.5.5 0 0 1 7 9h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_TICKET_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M5 3.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM5 6.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_QUESTION_CIRCLE_OUTLINE = [\n\t\"<path d='M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16zm-.5-5h1v1.5h-1V15zm.74-7.93A3.5 3.5 0 0 0 8.5 10.5h1.5a2 2 0 1 1 2.87 1.79C11.63 12.87 11 13.8 11 15h1.5c0-.71.37-1.22 1.06-1.61A3.5 3.5 0 0 0 12.24 7.07z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_RADIO_BUTTON_CHECKED_OUTLINE = [\n\t\"<path d='M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm0 13A6 6 0 1 1 8 2a6 6 0 0 1 0 12Z'/><path d='M8 5a3 3 0 1 0 0 6 3 3 0 0 0 0-6Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_RADIO_BUTTON_UNCHECKED_OUTLINE = [\n\t\"<path d='M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm0 13A6 6 0 1 1 8 2a6 6 0 0 1 0 12Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_REFRESH_DOUBLE_OUTLINE = [\n\t\"<path d='M11.534 7h3.932a.25.25 0 0 1 .192.41l-1.966 2.36a.25.25 0 0 1-.384 0l-1.966-2.36a.25.25 0 0 1 .192-.41Zm-11 2h3.932a.25.25 0 0 0 .192-.41L2.692 6.23a.25.25 0 0 0-.384 0L.342 8.59A.25.25 0 0 0 .534 9Z'/><path fill-rule='evenodd' d='M8 3c-1.552 0-2.94.707-3.857 1.818a.5.5 0 1 1-.771-.636A6.002 6.002 0 0 1 13.917 7H12.9A5.002 5.002 0 0 0 8 3ZM3.1 9a5.002 5.002 0 0 0 8.757 2.182.502.502 0 0 1 .84.075.499.499 0 0 1-.069.561A6.002 6.002 0 0 1 2.083 9H3.1Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_REFRESH_SINGLE_OUTLINE = [\n\t\"<path d='M14 7.986a6 6 0 1 1-12 0 .461.461 0 1 1 .923 0A5.096 5.096 0 1 0 4.37 4.448s-.115.038-.369.038l-.5-.5.346-.307A5.994 5.994 0 0 1 14 7.986Z'/><path d='m3.015 2.344 3.243 2.223a.25.25 0 0 1-.073.447l-2.956.835a.25.25 0 0 1-.317-.217l-.287-3.059a.25.25 0 0 1 .39-.23Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ROCKET_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M9.752 6.193c.599.6 1.73.437 2.528-.362.798-.799.96-1.932.362-2.531-.599-.6-1.73-.438-2.528.361-.798.8-.96 1.933-.362 2.532Z'/><path d='M15.811 3.312c-.363 1.534-1.334 3.626-3.64 6.218l-.24 2.408a2.56 2.56 0 0 1-.732 1.526L8.817 15.85a.51.51 0 0 1-.867-.434l.27-1.899c.04-.28-.013-.593-.131-.956-.076-.233-.16-.439-.249-.657l-.082-.202c-.815-.197-1.578-.662-2.191-1.277-.614-.615-1.079-1.379-1.275-2.195l-.203-.083c-.218-.089-.423-.172-.655-.248-.363-.119-.675-.172-.955-.132l-1.896.27A.51.51 0 0 1 .15 7.17l2.382-2.386c.41-.41.947-.67 1.524-.734h.006l2.4-.238C9.005 1.55 11.087.582 12.623.208c.89-.217 1.59-.232 2.08-.188.244.023.435.06.57.093.067.017.12.033.16.045.184.06.279.13.351.295l.029.073c.014.038.032.091.05.158.038.133.08.322.107.563.055.485.051 1.178-.159 2.065Zm-4.828 7.475.04-.04-.107 1.081a1.536 1.536 0 0 1-.44.913l-1.298 1.3.054-.38c.072-.506-.034-.993-.172-1.418a8.548 8.548 0 0 0-.164-.45c.738-.065 1.462-.38 2.087-1.006ZM5.205 5c-.625.626-.94 1.351-1.004 2.09a8.497 8.497 0 0 0-.45-.164c-.424-.138-.91-.244-1.416-.172l-.38.054 1.3-1.3c.245-.246.566-.401.91-.44l1.08-.107-.04.039Zm9.406-3.961c-.38-.034-.967-.027-1.746.163-1.558.38-3.917 1.496-6.937 4.521-.62.62-.799 1.34-.687 2.051.107.676.483 1.362 1.048 1.928.564.565 1.25.941 1.924 1.049.71.112 1.429-.067 2.048-.688 3.079-3.083 4.192-5.444 4.556-6.987.183-.771.18-1.345.138-1.713a2.835 2.835 0 0 0-.045-.283 3.078 3.078 0 0 0-.3-.041Z'/><path d='M6.803 12.352A7.632 7.632 0 0 1 5 11a7.568 7.568 0 0 1-1.411-1.925c-1.102.991-1.965 5.054-1.84 5.18.126.125 3.936-.896 5.054-1.903Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SEARCH_OUTLINE = [\n\t\"<path d='M11.118 9.953a5.417 5.417 0 1 0-1.164 1.165.833.833 0 0 0 .081.096l3.21 3.209a.833.833 0 0 0 1.178-1.179l-3.21-3.208a.834.834 0 0 0-.095-.083Zm.215-3.203a4.583 4.583 0 1 1-9.166 0 4.583 4.583 0 0 1 9.166 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SETTINGS_OUTLINE = [\n\t\"<path d='M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.22 7.22 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96a.48.48 0 0 0-.59.22L2.74 8.87a.47.47 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.47.47 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_SHEET_BENT_OUTLINE = [\n\t\"<path d='M11.491.5H4.509C3.122.5 2 1.638 2 3.045v9.91c0 .68.265 1.328.732 1.802a2.494 2.494 0 0 0 1.777.743l5.346-.016c.67 0 1.293-.268 1.776-.743l1.637-1.66A2.566 2.566 0 0 0 14 11.28V3.045C14 1.638 12.878.5 11.491.5ZM4.509 14.33c-.358 0-.701-.142-.966-.395-.25-.253-.405-.6-.405-.98v-9.91c0-.759.608-1.375 1.356-1.375h6.981c.748 0 1.356.616 1.356 1.375v7.808h-1.839c-.872 0-1.574.711-1.574 1.597v1.88H4.51Zm6.312-.395c-.063.063-.14.127-.234.19v-1.676c0-.237.187-.41.405-.41h1.637a1.25 1.25 0 0 1-.187.237l-1.621 1.66Z'/><path d='M10.456 4.5H5.529c-.298 0-.537.258-.537.581 0 .323.239.581.537.581h4.927c.298 0 .536-.258.536-.58 0-.324-.238-.582-.536-.582ZM10.456 8.338H5.529c-.298 0-.537.258-.537.58 0 .324.239.582.537.582h4.927c.298 0 .536-.258.536-.581 0-.323-.238-.581-.536-.581Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHEET_GENERIC_OUTLINE = [\n\t\"<path d='M12.465.983H3.523c-.841 0-1.52.68-1.52 1.535v10.964c0 .841.679 1.535 1.535 1.535h8.927c.841 0 1.535-.679 1.535-1.535V2.518A1.543 1.543 0 0 0 12.465.983Zm.458 12.485a.466.466 0 0 1-.472.472H3.523a.466.466 0 0 1-.472-.473V2.518c0-.266.206-.472.472-.472h8.928c.265 0 .472.206.472.472v10.95Z'/><path d='M10.872 5.348H5.117a.529.529 0 0 0-.531.531c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.532.529.529 0 0 0-.531-.53ZM10.872 7.932H5.117a.529.529 0 0 0-.531.53c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.531.529.529 0 0 0-.531-.531ZM10.872 10.515H5.117a.53.53 0 0 0-.531.53c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.531.53.53 0 0 0-.531-.531Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHEET_LIST_OUTLINE = [\n\t\"<path d='M13.21 0H2.776c-.981 0-1.774.774-1.774 1.75v12.5c0 .96.793 1.75 1.791 1.75h10.419c.981 0 1.79-.774 1.79-1.75V1.75A1.78 1.78 0 0 0 13.212 0Zm.534 14.233a.538.538 0 0 1-.55.539H2.774a.538.538 0 0 1-.55-.539V1.75c0-.303.24-.539.55-.539h10.418c.31 0 .551.236.551.539v12.483Z'/><path d='M11.351 4.976H7.544a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606h3.807a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM4.88 4.976h-.345a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606h.345a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM5 7.945l-.501-.017a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606L5 9.157a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM5 10.867l-.501-.017a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.605l.501.017a.61.61 0 0 0 .62-.605.61.61 0 0 0-.62-.606ZM11.351 7.922H7.453a.61.61 0 0 0-.62.605.61.61 0 0 0 .62.606h3.898a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.605ZM11.351 10.867H7.453a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.605h3.898a.61.61 0 0 0 .62-.605.61.61 0 0 0-.62-.606Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_BAG_OUTLINE = [\n\t\"<path d='M3.381 15h9.659a1.216 1.216 0 0 0 .898-.395 1.233 1.233 0 0 0 .322-.931l-.69-9.032a1.24 1.24 0 0 0-.39-.807 1.225 1.225 0 0 0-.83-.33H4.07a1.225 1.225 0 0 0-.83.33 1.24 1.24 0 0 0-.39.807l-.69 9.032a1.24 1.24 0 0 0 .322.931 1.224 1.224 0 0 0 .898.395Zm.286-10.295a.412.412 0 0 1 .407-.379h8.28a.407.407 0 0 1 .409.38l.69 9.03a.413.413 0 0 1-.244.409.407.407 0 0 1-.164.034H3.38a.406.406 0 0 1-.386-.275.413.413 0 0 1-.022-.167l.694-9.032Z'/><path d='M8.04 1c.54 0 1.059.217 1.44.602.383.385.598.906.599 1.45v.822a.412.412 0 0 1-.408.41.407.407 0 0 1-.408-.41v-.821c0-.327-.129-.64-.358-.871a1.22 1.22 0 0 0-1.73 0c-.23.23-.36.544-.36.87v.822a.412.412 0 0 1-.407.41.407.407 0 0 1-.408-.41v-.821c0-.545.216-1.066.598-1.451S7.498 1 8.04 1Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_BASKET_OUTLINE = [\n\t\"<path d='M2.947 8h.26l.494 3.946a1.263 1.263 0 0 0 1.253 1.107h6.934a1.263 1.263 0 0 0 1.254-1.107L13.635 8h.26a.842.842 0 0 0 .842-.842V5.474a.842.842 0 0 0-.842-.842H12.87l-1.376-2.32a.421.421 0 0 0-.724.43l1.121 1.89H4.95l1.122-1.89a.42.42 0 1 0-.725-.43l-1.376 2.32H2.947a.842.842 0 0 0-.842.842v1.684A.842.842 0 0 0 2.947 8Zm9.36 3.842a.421.421 0 0 1-.419.369H4.954a.422.422 0 0 1-.418-.37l-.48-3.84h8.73l-.48 3.84Zm-9.36-6.368h10.948v1.684H2.947V5.474Z'/><path d='M8.421 11.369a.421.421 0 0 0 .421-.421V9.262a.421.421 0 1 0-.842 0v1.684a.42.42 0 0 0 .421.422ZM6.316 11.369a.421.421 0 0 0 .42-.421V9.262a.421.421 0 1 0-.841 0v1.684a.42.42 0 0 0 .42.422ZM10.526 11.369a.421.421 0 0 0 .421-.421V9.262a.421.421 0 0 0-.842 0v1.684a.42.42 0 0 0 .421.422Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_CART_OUTLINE = [\n\t\"<path d='M14.892 3.98a.466.466 0 0 0-.369-.182H4.34l-.541-2.434A.466.466 0 0 0 3.332 1H1.466a.466.466 0 0 0 0 .933H2.96l2.14 9.424a1.865 1.865 0 1 0 2.43 1.767 1.823 1.823 0 0 0-.262-.932h2.854c-.17.281-.26.604-.261.932a1.866 1.866 0 1 0 1.865-1.865H6.036L5.72 9.86h6.692a1.399 1.399 0 0 0 1.352-1.03l1.226-4.444a.466.466 0 0 0-.098-.406Zm-8.296 9.144a.932.932 0 1 1-1.865 0 .932.932 0 0 1 1.865 0Zm6.062 0a.932.932 0 1 1-1.864 0 .932.932 0 0 1 1.864 0Zm.205-4.542a.466.466 0 0 1-.466.345H5.505l-.933-4.196h9.34l-1.049 3.851Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SPLIT_BILL_TICKET_1_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.5 4a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM7.5 6.5A.5.5 0 0 1 8 6h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM4.5 9a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/><path d='M5.162 6.588v.28c0 .073.052.132.116.132h.297c.064 0 .116-.059.116-.132v-.28c.219-.044.4-.147.528-.309a.986.986 0 0 0 .22-.647c0-.073 0-.132-.013-.19a2.637 2.637 0 0 0-.04-.163c-.012-.058-.038-.103-.064-.147-.025-.044-.064-.088-.09-.117-.026-.03-.064-.074-.116-.103-.039-.03-.09-.06-.129-.088-.039-.03-.09-.045-.142-.074a.668.668 0 0 0-.154-.059c-.052-.014-.103-.044-.168-.059a1.912 1.912 0 0 1-.31-.147c-.05-.044-.077-.088-.077-.147s.013-.103.065-.132c.051-.044.116-.059.206-.059.168 0 .348.074.541.206.052.044.117.03.155-.03l.245-.338c.026-.03.026-.073.026-.103a.1.1 0 0 0-.052-.088c-.077-.073-.18-.132-.27-.191a1.356 1.356 0 0 0-.336-.132v-.339C5.716 3.06 5.665 3 5.6 3h-.296c-.065 0-.116.059-.116.132v.31a.935.935 0 0 0-.529.293.986.986 0 0 0-.219.647c0 .06 0 .118.013.177s.026.103.039.162c.013.044.038.088.051.132a.816.816 0 0 0 .078.118c.025.029.064.058.09.088.026.03.064.059.116.088.039.03.077.044.116.059.039.015.077.044.129.059.051.014.09.029.129.044.038.014.077.03.142.044.051.015.103.03.141.059a.43.43 0 0 1 .116.059l.078.044c.013.014.038.03.051.059.013.014.026.029.026.058 0 .015.013.045.013.074a.224.224 0 0 1-.065.162c-.116.088-.335.088-.54-.015a.953.953 0 0 1-.285-.206c-.025-.03-.064-.044-.09-.03-.038 0-.064.015-.077.045L4.466 6a.153.153 0 0 0 .013.191c.155.191.4.338.683.397Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SPLIT_BILL_TICKET_2_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M15.914 1.675a.406.406 0 0 0-.262-.164L7.324.036a.432.432 0 0 0-.476.328l-.64 3.64H.833c-.23 0-.41.18-.41.409v10.131c0 .197.115.377.279.476.18.098.393.082.557-.033l.984-.656 1.114.738a.492.492 0 0 0 .59 0l1.115-.738 1.115.738c.18.114.41.114.607 0l1.114-.738.984.656a.563.563 0 0 0 .557.033.532.532 0 0 0 .28-.476v-3.59l.95.918c.164.148.393.18.59.098l1.23-.54.852.82a.52.52 0 0 0 .541.114.54.54 0 0 0 .36-.41l1.755-9.967a.43.43 0 0 0-.082-.312ZM8.88 14.036l-.705-.475a.549.549 0 0 0-.59 0l-1.115.737-1.115-.737a.577.577 0 0 0-.606 0l-1.115.737-1.115-.737a.491.491 0 0 0-.59 0l-.705.459V4.84h7.64v9.196h.016Zm4.64-2.738-.607-.573a.52.52 0 0 0-.377-.148.505.505 0 0 0-.213.05l-1.23.54-.967-.934a.529.529 0 0 0-.426-.148V8.888l2.492.443h.065a.39.39 0 0 0 .394-.344.422.422 0 0 0-.328-.476l-2.64-.459v-.934l2.804.492h.065a.39.39 0 0 0 .394-.345.422.422 0 0 0-.328-.475l-2.935-.525v-.934l.951.164h.066a.39.39 0 0 0 .393-.344.432.432 0 0 0-.328-.476l-1.098-.197V4.38c0-.23-.18-.41-.41-.41H7.045l.54-3.098L15.112 2.2l-1.59 9.098Z'/><path d='m12.31 5.804-.033.213c-.016.066.033.115.082.131l.262.05c.066.016.115-.033.132-.083l.033-.213c.196 0 .377-.049.508-.164a.747.747 0 0 0 .278-.475c.017-.05.017-.115.017-.164 0-.05 0-.098-.017-.131 0-.05-.016-.082-.049-.131-.016-.033-.033-.082-.065-.099-.017-.032-.05-.065-.082-.098a.432.432 0 0 0-.099-.082c-.032-.033-.065-.05-.114-.082-.05-.033-.099-.05-.132-.082-.032-.016-.082-.05-.147-.082a1.048 1.048 0 0 1-.263-.164.186.186 0 0 1-.049-.131c.017-.05.033-.082.066-.098a.369.369 0 0 1 .197-.017c.147.033.311.115.459.246.049.033.098.033.147 0l.262-.23a.125.125 0 0 0 .033-.081.125.125 0 0 0-.033-.082c-.065-.066-.13-.131-.229-.197a1.557 1.557 0 0 0-.279-.164l.05-.262c.016-.066-.033-.115-.082-.131l-.263-.05c-.065-.016-.114.033-.13.082l-.05.246a.847.847 0 0 0-.508.148.747.747 0 0 0-.279.475c-.016.05-.016.099-.016.131 0 .05 0 .082.016.132.016.032.016.082.033.114l.049.099c.016.032.05.065.066.082.016.032.049.049.082.082.032.032.065.049.098.065.033.017.065.05.115.066.032.016.082.049.114.065.033.017.066.033.115.066.05.016.082.05.115.066s.066.032.098.065c.033.016.05.033.066.05.016.016.033.032.033.048 0 .017.016.033.016.05v.049a.19.19 0 0 1-.082.115c-.115.065-.311.016-.492-.099a.937.937 0 0 1-.23-.213c-.016-.016-.048-.033-.081-.05-.033 0-.066 0-.082.034l-.262.23c-.05.032-.05.098-.017.147.164.262.377.41.623.508ZM8.798 3.417l2.148.378h.065c.197 0 .36-.148.41-.345.033-.23-.115-.442-.328-.475l-2.147-.377c-.214-.033-.443.115-.476.328-.033.246.115.459.328.491ZM6.568 9.306v.23c0 .065.05.114.115.114h.279c.065 0 .114-.049.114-.115v-.213a.786.786 0 0 0 .476-.246.718.718 0 0 0 .196-.524c0-.05 0-.115-.016-.164-.016-.05-.016-.099-.033-.131a.264.264 0 0 0-.065-.115c-.033-.033-.05-.066-.082-.098-.033-.033-.066-.05-.099-.082-.032-.033-.082-.05-.114-.066-.033-.016-.082-.033-.132-.066l-.147-.049c-.05-.016-.098-.032-.164-.049-.131-.05-.23-.082-.279-.115-.049-.032-.065-.065-.065-.114 0-.05.016-.082.049-.115a.294.294 0 0 1 .18-.05c.164 0 .328.05.492.165.05.032.115.016.148-.017l.213-.278c.016-.017.033-.05.016-.082 0-.033-.016-.05-.05-.066l-.245-.148a1.042 1.042 0 0 0-.295-.098v-.262a.112.112 0 0 0-.115-.115h-.278a.112.112 0 0 0-.115.115v.23a.786.786 0 0 0-.476.245.705.705 0 0 0-.196.508c0 .05 0 .099.016.132 0 .049.016.082.033.13l.049.099c.016.033.05.066.082.098.033.033.05.05.082.066.033.016.065.05.098.066l.099.049c.032.016.065.033.114.049.05.016.082.033.115.033.033.016.082.016.131.032.05.017.099.033.131.05l.099.049c.033.016.049.033.065.033l.05.049c.016.016.016.033.016.049v.05a.15.15 0 0 1-.066.13c-.098.082-.295.066-.491-.016a.88.88 0 0 1-.263-.164.125.125 0 0 0-.082-.033c-.032 0-.049.017-.082.033l-.23.279c-.032.049-.032.114.017.147.213.197.443.312.705.36ZM2.64 7.515h1.728c.23 0 .41-.18.41-.41 0-.229-.18-.41-.41-.41H2.64c-.23 0-.41.181-.41.41 0 .214.18.41.41.41ZM2.64 9.652h1.728c.23 0 .41-.18.41-.41 0-.23-.18-.41-.41-.41H2.64c-.23 0-.41.18-.41.41 0 .213.18.41.41.41ZM2.94 11.788h4.1c.23 0 .41-.18.41-.41 0-.229-.18-.41-.41-.41h-4.1c-.23 0-.41.181-.41.41 0 .23.18.41.41.41Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_STAR_FILLED = [\n\t\"<path d='m21.284 8.276-5.951-.865-2.66-5.393a.753.753 0 0 0-1.345 0l-2.66 5.393-5.952.865a.749.749 0 0 0-.414 1.28l4.305 4.197L5.59 19.68a.749.749 0 0 0 1.087.79L12 17.672l5.323 2.798a.749.749 0 0 0 1.087-.79l-1.017-5.927 4.305-4.197a.748.748 0 0 0 .218-.43.747.747 0 0 0-.632-.85Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_SUCCESS_FILLED_GREEN = [\n\t\"<path fill='#46D281' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm4.384-9.18a.5.5 0 0 0-.768-.64L5.995 9.725 3.38 6.675a.5.5 0 1 0-.76.65l3 3.5a.5.5 0 0 0 .764-.005l5-6Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_SUCCESS_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M11.835 5.628a.5.5 0 0 1 .037.706l-4.5 5a.5.5 0 0 1-.726.02l-2.5-2.5a.5.5 0 1 1 .708-.708l2.127 2.128 4.147-4.608a.5.5 0 0 1 .707-.038Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SUGAR_FREE_FILLED = [\n\t\"<path d='M22.11 21.46 2.39 1.73 1.11 3 4.3 6.19l-.77.43c-.32.17-.53.5-.53.88v9c0 .38.21.71.53.88l7.9 4.44c.16.12.36.18.57.18.21 0 .41-.06.57-.18l4.71-2.65 3.56 3.56 1.27-1.27ZM5 15.91v-6.7l5.29 2.97.71.71v6.4l-6-3.38Zm8 3.38v-4.4l2.82 2.81L13 19.29ZM9 5.82 7.56 4.36l3.87-2.18c.16-.12.36-.18.57-.18.21 0 .41.06.57.18l7.9 4.44c.32.17.53.5.53.88v9c0 .35-.18.66-.47.83L19 15.8V9.21l-4.22 2.37-1.47-1.47 4.65-2.61L12 4.15 9 5.82Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_TAG_FILLED = [\n\t\"<path d='M5.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Zm15.91 4.58-9-9C12.05 2.22 11.55 2 11 2H4c-1.11 0-2 .89-2 2v7c0 .55.22 1.05.59 1.41l8.99 9c.37.36.87.59 1.42.59.55 0 1.05-.23 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.56-.23-1.06-.59-1.42Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_TAG_OUTLINE = [\n\t\"<path d='M6.739 1c.99 0 1.94.394 2.64 1.094l5.071 5.072a1.9 1.9 0 0 1 0 2.673L9.84 14.45a1.895 1.895 0 0 1-2.67 0L2.094 9.375C1.394 8.674 1 7.725 1 6.734V3.43A2.438 2.438 0 0 1 3.429 1h3.31Zm0 1.167h-3.31c-.704 0-1.262.557-1.262 1.26v3.307c0 .681.272 1.336.753 1.817l5.072 5.072a.713.713 0 0 0 1.021 0l4.611-4.611a.713.713 0 0 0 0-1.02L8.552 2.918a2.562 2.562 0 0 0-1.812-.753h-.001Z'/><path d='M6.489 3.872c.717.717.717 1.9 0 2.618-.717.717-1.9.717-2.618 0a1.861 1.861 0 0 1 0-2.618 1.861 1.861 0 0 1 2.618 0Zm-.827.827a.672.672 0 0 0-.964 0 .672.672 0 0 0 0 .964.672.672 0 0 0 .964 0 .672.672 0 0 0 0-.964Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TAP_CLICK_HAND_OUTLINE = [\n\t\"<path d='M13.063 6.388c-.205 0-.407.04-.597.117a1.597 1.597 0 0 0-1.533-1.182 1.566 1.566 0 0 0-.782.213 1.597 1.597 0 0 0-1.88-.65V1.598a1.597 1.597 0 1 0-3.193 0v8.3l-.48-.48a2.337 2.337 0 0 0-3.3 0 1.011 1.011 0 0 0-.037 1.395l3.833 4.258a2.732 2.732 0 0 0 2.028.9h4.455a2.73 2.73 0 0 0 2.55-1.714 7.73 7.73 0 0 0 .533-2.859V7.985a1.597 1.597 0 0 0-1.597-1.597Zm.532 5.01a6.586 6.586 0 0 1-.474 2.443 1.656 1.656 0 0 1-1.544 1.064H7.122a1.677 1.677 0 0 1-1.24-.532l-3.796-4.259a1.272 1.272 0 0 1 1.762.032l1.384 1.39a.533.533 0 0 0 .814-.075.532.532 0 0 0 .096-.282V1.597a.532.532 0 0 1 1.065 0v6.388a.532.532 0 1 0 1.065 0V6.388a.532.532 0 0 1 1.064 0v2.13a.532.532 0 1 0 1.065 0V6.92a.532.532 0 1 1 1.065 0v2.13a.532.532 0 0 0 1.064 0V7.985a.532.532 0 0 1 1.065 0v3.412Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TICKET_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M2.552 4.405a.555.555 0 0 0-.772.058L.306 6.126c-.472.537-.436 1.34.08 1.804l8.593 7.622c.52.456 1.323.396 1.8-.136l1.475-1.663a.555.555 0 0 0-.034-.773c-.371-.328-.397-.905-.057-1.287.339-.383.915-.426 1.285-.098a.555.555 0 0 0 .772-.058l1.474-1.662c.471-.538.436-1.342-.08-1.804L7.021.448c-.52-.456-1.323-.395-1.8.137L3.746 2.247c-.2.23-.184.574.034.773.37.329.396.905.057 1.288-.339.382-.915.426-1.285.097Zm2.32-1.804L6.026 1.3a.188.188 0 0 1 .127-.063.177.177 0 0 1 .13.044l5.506 4.883-.614.692a.547.547 0 0 0 .034.773.547.547 0 0 0 .771-.058l.615-.693 2.282 2.025c.075.066.08.181.012.258l-1.155 1.302c-.802-.371-1.768-.159-2.371.521s-.699 1.665-.235 2.416l-1.154 1.302a.182.182 0 0 1-.258.02l-2.282-2.025.614-.692a.547.547 0 0 0-.034-.773.547.547 0 0 0-.772.058l-.614.692-5.505-4.883a.177.177 0 0 1-.06-.125.189.189 0 0 1 .048-.133l1.155-1.302c.802.372 1.768.16 2.37-.52.604-.681.7-1.665.236-2.417Zm3.845 7.025L9.7 8.518a.547.547 0 0 1 .772-.059.547.547 0 0 1 .034.773l-.984 1.109a.547.547 0 0 1-.771.058.548.548 0 0 1-.034-.773Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TICKETS_OUTLINE = [\n\t\"<path d='M1.123 3h11.609c.31 0 .591.125.795.326l.015.016c.194.2.315.472.315.768v.15h1.017c.31 0 .59.124.794.326a1.1 1.1 0 0 1 .331.785v1.38c0 .14-.115.254-.258.254-.314 0-.6.126-.805.33a1.115 1.115 0 0 0 0 1.59c.206.203.491.33.806.33.142 0 .258.114.258.254v1.38c0 .306-.127.584-.33.785l-.016.015a1.127 1.127 0 0 1-.778.311H3.268c-.31 0-.592-.125-.795-.326a1.1 1.1 0 0 1-.33-.784v-.15H1.125c-.31 0-.591-.125-.795-.325A1.101 1.101 0 0 1 0 9.629V8.25c0-.14.116-.255.258-.255.315 0 .6-.126.805-.329a1.116 1.116 0 0 0 0-1.59 1.144 1.144 0 0 0-.805-.33A.257.257 0 0 1 0 5.493v-1.38a1.124 1.124 0 0 1 1.125-1.11L1.123 3Zm6.959 4.311a1.258 1.258 0 0 1 0 1.796 1.293 1.293 0 0 1-1.82 0l-.014-.016a1.258 1.258 0 0 1 .014-1.778 1.29 1.29 0 0 1 .91-.373c.33 0 .659.123.91.371Zm-.14.898a.754.754 0 0 0-.225-.537.774.774 0 0 0-1.09 0 .75.75 0 0 0-.011 1.064l.012.01a.774.774 0 0 0 1.09 0 .753.753 0 0 0 .224-.537ZM5.368 4.633l.016.016a1.258 1.258 0 0 1-.014 1.778l-.016.016a1.29 1.29 0 0 1-1.801-.014 1.256 1.256 0 0 1-.002-1.795c.252-.249.58-.373.91-.373.328 0 .656.123.907.372Zm-.364.36a.773.773 0 0 0-1.09 0 .752.752 0 0 0 0 1.075.775.775 0 0 0 1.078.012l.01-.012a.752.752 0 0 0 .013-1.064l-.012-.011h.001Zm2.597-.247c.1-.1.264-.1.365 0 .1.1.1.261 0 .36L4.224 8.803c-.1.1-.264.1-.365 0-.1-.1-.1-.261 0-.36l3.742-3.696Zm6.254.024v.72c0 .14-.115.255-.258.255-.314 0-.6.126-.805.33a1.115 1.115 0 0 0 0 1.59c.206.202.49.328.805.328.143 0 .258.115.258.255v1.38c0 .305-.127.583-.33.785a1.13 1.13 0 0 1-.795.325H2.656v.15a.611.611 0 0 0 .609.6h11.608c.162 0 .31-.063.42-.165l.01-.011a.596.596 0 0 0 .179-.425V9.742a1.656 1.656 0 0 1-.912-.458 1.623 1.623 0 0 1 0-2.311c.242-.24.558-.404.912-.459V5.37a.61.61 0 0 0-.609-.601h-1.018v.002ZM12.73 3.51H1.122a.613.613 0 0 0-.43.176.594.594 0 0 0-.18.424v1.145c.354.055.671.22.913.459a1.62 1.62 0 0 1 0 2.31 1.656 1.656 0 0 1-.912.46v1.143c0 .166.068.316.179.425.11.109.262.177.43.177H12.73c.168 0 .32-.068.43-.177a.597.597 0 0 0 .18-.425V8.483a1.656 1.656 0 0 1-.913-.458 1.62 1.62 0 0 1 0-2.311c.242-.24.559-.404.912-.459V4.11a.595.595 0 0 0-.167-.413l-.012-.01a.61.61 0 0 0-.43-.177Z'/><path d='M10.439 4.16a.242.242 0 0 1 .346 0c.046.046.071.11.071.176v.875c0 .066-.025.13-.071.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.071-.177v-.875c0-.066.025-.13.07-.177ZM10.44 6.066a.242.242 0 0 1 .345 0c.046.047.072.11.072.177V7.2c0 .067-.026.13-.072.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.071-.177v-.956c0-.066.025-.13.071-.177ZM10.44 8.243a.242.242 0 0 1 .345 0c.046.047.072.11.072.176v1.073c0 .067-.026.13-.071.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.072-.177V8.42c0-.066.025-.13.071-.176Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TWITTER_FILLED = [\n\t\"<path d='M21.75 5.96a8.015 8.015 0 0 1-2.302.619 3.987 3.987 0 0 0 1.758-2.203 7.89 7.89 0 0 1-2.536.965 3.986 3.986 0 0 0-2.92-1.263 3.996 3.996 0 0 0-3.996 3.999c0 .309.037.618.098.916a11.358 11.358 0 0 1-8.24-4.184 3.968 3.968 0 0 0-.544 2.018c0 1.388.705 2.611 1.781 3.33a4.03 4.03 0 0 1-1.807-.508v.05a3.997 3.997 0 0 0 3.204 3.923c-.344.09-.697.135-1.052.136a5.31 5.31 0 0 1-.755-.061 4.004 4.004 0 0 0 3.736 2.773 8.01 8.01 0 0 1-4.962 1.708c-.335 0-.644-.012-.965-.05a11.317 11.317 0 0 0 6.138 1.794c7.35 0 11.372-6.09 11.372-11.374 0-.174 0-.347-.012-.52A8.607 8.607 0 0 0 21.75 5.96Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_USER_OUTLINE = [\n\t\"<path d='M8 1C4.14 1 1 4.14 1 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7ZM4.32 12.633A4.473 4.473 0 0 1 8 10.693c1.48 0 2.85.737 3.68 1.94a5.891 5.891 0 0 1-7.36 0Zm1.347-5.35A2.336 2.336 0 0 1 8 4.948a2.336 2.336 0 0 1 2.333 2.333A2.336 2.336 0 0 1 8 9.615a2.336 2.336 0 0 1-2.333-2.333Zm6.792 4.603a5.55 5.55 0 0 0-2.43-1.879 3.398 3.398 0 0 0 1.381-2.725c0-1.88-1.53-3.41-3.41-3.41-1.88 0-3.41 1.53-3.41 3.41 0 1.118.548 2.103 1.382 2.725a5.56 5.56 0 0 0-2.43 1.88A5.893 5.893 0 0 1 2.077 8 5.93 5.93 0 0 1 8 2.077 5.93 5.93 0 0 1 13.923 8a5.891 5.891 0 0 1-1.464 3.886Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_WARNING_FILLED_YELLOW = [\n\t\"<path fill='#FBCC29' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm.14-12c.374 0 .677.304.677.678V9a.678.678 0 1 1-1.356 0V2.678c0-.374.304-.678.678-.678Zm.677 9.169a.678.678 0 1 1-1.356 0 .678.678 0 0 1 1.356 0Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_WARNING_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7 10a.5.5 0 0 1 .5.5v.5a.5.5 0 0 1-1 0v-.5A.5.5 0 0 1 7 10ZM7 3a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-1 0v-5A.5.5 0 0 1 7 3Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_WHATSAPP_OUTLINE = [\n\t\"<path d='M16.723 14.06c-.256-.131-1.528-.755-1.765-.839-.237-.089-.41-.131-.582.131-.173.26-.665.84-.82 1.015-.15.174-.302.195-.558.066-1.518-.76-2.514-1.355-3.515-3.073-.265-.457.265-.424.76-1.41.083-.174.041-.322-.024-.453-.066-.131-.582-1.402-.797-1.92-.209-.504-.424-.433-.581-.443-.15-.009-.321-.009-.495-.009a.956.956 0 0 0-.689.321c-.237.26-.905.886-.905 2.156s.926 2.501 1.053 2.675c.13.173 1.82 2.78 4.415 3.902 1.64.708 2.283.769 3.103.647.5-.075 1.529-.624 1.742-1.23.213-.605.213-1.123.15-1.231-.064-.115-.237-.18-.492-.305Z'/><path d='M21.684 7.931a10.505 10.505 0 0 0-5.615-5.615A10.45 10.45 0 0 0 12 1.5h-.047A10.475 10.475 0 0 0 1.5 12.05a10.533 10.533 0 0 0 1.125 4.684v3.563c0 .595.483 1.078 1.078 1.078h3.565a10.532 10.532 0 0 0 4.685 1.125h.05c1.403 0 2.765-.272 4.047-.804a10.418 10.418 0 0 0 3.347-2.231 10.475 10.475 0 0 0 3.103-7.418 10.46 10.46 0 0 0-.816-4.116Zm-3.541 10.266A8.673 8.673 0 0 1 12 20.719h-.04a8.75 8.75 0 0 1-4.057-1.02l-.197-.105h-3.3v-3.3l-.105-.197a8.75 8.75 0 0 1-1.02-4.057 8.665 8.665 0 0 1 2.522-6.183 8.653 8.653 0 0 1 6.16-2.576h.04c1.171 0 2.308.228 3.379.678a8.662 8.662 0 0 1 2.79 1.875 8.684 8.684 0 0 1 2.552 6.206 8.686 8.686 0 0 1-2.581 6.157Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_WHEAT_FILLED = [\n\t\"<path d='M21.725 3.598A.937.937 0 0 0 20.4 2.274l-3.442 3.433a.937.937 0 0 0 1.324 1.324l3.438-3.437.004.004Zm-7.793-.535a.627.627 0 0 0-.883 0l-.445.441a3.75 3.75 0 0 0 0 5.305l.406.406-1.191 1.191a4.989 4.989 0 0 0-1.426-2.921l-.441-.442a.627.627 0 0 0-.883 0l-.441.442a3.75 3.75 0 0 0 0 5.304l.406.406-1.192 1.192a4.988 4.988 0 0 0-1.425-2.922l-.442-.445a.627.627 0 0 0-.882 0l-.442.441a3.75 3.75 0 0 0 0 5.304l.406.407-2.69 2.69a1.252 1.252 0 0 0 1.769 1.77l2.69-2.69.477.476a3.75 3.75 0 0 0 5.305 0l.441-.442a.627.627 0 0 0 0-.883l-.441-.44a4.992 4.992 0 0 0-3.05-1.442l1.245-1.246.477.476a3.75 3.75 0 0 0 5.304 0l.442-.441a.627.627 0 0 0 0-.883l-.442-.441a4.992 4.992 0 0 0-3.05-1.442l1.246-1.246.476.477a3.751 3.751 0 0 0 5.305 0l.44-.445a.627.627 0 0 0 0-.883l-.44-.445a4.922 4.922 0 0 0-.641-.543l1.805-1.801A.937.937 0 0 0 20.4 6.024l-2.32 2.32a5.033 5.033 0 0 0-2.434.082c.238-.832.258-1.71.054-2.55l2.274-2.278a.937.937 0 0 0-1.324-1.324l-1.797 1.789a4.642 4.642 0 0 0-.484-.559l-.438-.441Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_WIFI_NO_SIGNAL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M15.784 6.009q-.23-.223-.472-.433a11 11 0 0 0-2.043-1.398l-.946 1.065a9.7 9.7 0 0 1 2.465 1.738.72.72 0 0 0 .967.037.672.672 0 0 0 .029-1.01M12.868 7.66a7.9 7.9 0 0 0-1.772-1.033l-.975 1.098c.845.288 1.62.747 2.273 1.347a.71.71 0 0 0 .938.013.667.667 0 0 0 .024-1.014 8 8 0 0 0-.488-.41m-1.966 2.473a4.6 4.6 0 0 0-2.092-.93l-1.172 1.319c.846-.1 1.697.139 2.36.663a.69.69 0 0 0 .875-.005l.05-.044h.001a.625.625 0 0 0-.021-1.003M8 12.26c-.405 0-.79.171-1.057.47a1.34 1.34 0 0 0-.347.862c-.009.761.606 1.388 1.382 1.408.375.007.737-.135 1.005-.392a1.342 1.342 0 0 0 .073-1.878A1.42 1.42 0 0 0 8 12.26m1.223-4.772 1.03-1.162 1.271-1.431.968-1.09 1.482-1.67a.675.675 0 0 0-.066-.966.716.716 0 0 0-.991.065L11.082 3.3h.001a11 11 0 0 0-1.679-.34c-.932-.12-1.876-.12-2.808 0a11.1 11.1 0 0 0-6.38 3.049.672.672 0 0 0 .03 1.01.72.72 0 0 0 .966-.039q.263-.255.545-.491h.001a9.7 9.7 0 0 1 4.838-2.15 9.8 9.8 0 0 1 3.46.117L8.661 6.03a8 8 0 0 0-.66-.03H8q-.708.002-1.404.126a7.87 7.87 0 0 0-3.952 1.947.666.666 0 0 0 .023 1.013c.27.231.675.226.939-.012a6.46 6.46 0 0 1 3.84-1.677l-5.024 5.66a.68.68 0 0 0 .07.97.71.71 0 0 0 .988-.069l2.388-2.691L7.756 9.14z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_WIFI_SIGNAL_FILLED = [\n\t\"<path d='M15 .5A2.5 2.5 0 0 1 17.5 3v12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12ZM3.985 8.685a.585.585 0 0 0-.562.58c0 .312.254.555.562.546a3.777 3.777 0 0 1 2.78 1.08 3.773 3.773 0 0 1 1.14 2.755.544.544 0 0 0 .559.551.584.584 0 0 0 .567-.575 4.862 4.862 0 0 0-1.468-3.548 4.863 4.863 0 0 0-3.578-1.39ZM4 5.682a.583.583 0 0 0-.564.577.543.543 0 0 0 .56.549c1.855-.047 3.596.63 4.9 1.906 1.305 1.276 2.02 3.002 2.013 4.857a.544.544 0 0 0 .56.548.582.582 0 0 0 .565-.577c.008-2.157-.824-4.161-2.34-5.645C8.178 6.414 6.155 5.627 4 5.682Zm.012-3.004a.584.584 0 0 0-.566.576.543.543 0 0 0 .56.549c2.661-.063 5.154.908 7.02 2.733 1.865 1.825 2.89 4.297 2.885 6.96a.542.542 0 0 0 .562.547.583.583 0 0 0 .563-.58c.005-2.961-1.135-5.71-3.212-7.742-2.076-2.032-4.85-3.113-7.812-3.043Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_WIFI_SIGNAL_OUTLINE = [\n\t\"<path d='M16.5 3A1.5 1.5 0 0 0 15 1.5H3A1.5 1.5 0 0 0 1.5 3v12A1.5 1.5 0 0 0 3 16.5h12a1.5 1.5 0 0 0 1.5-1.5V3Zm1 12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12A2.5 2.5 0 0 1 17.5 3v12Z'/><path d='M14.01 14.806a.553.553 0 0 1-.165-.396c.004-2.688-1.03-5.183-2.914-7.026-1.883-1.843-4.4-2.823-7.088-2.76a.549.549 0 0 1-.564-.554.59.59 0 0 1 .57-.582c2.99-.07 5.792 1.02 7.888 3.072 2.097 2.051 3.249 4.828 3.243 7.819a.589.589 0 0 1-.569.583.547.547 0 0 1-.401-.156Zm-2.63.234a.588.588 0 0 0 .57-.583c.007-2.177-.832-4.2-2.363-5.698C8.057 7.26 6.014 6.466 3.838 6.52a.588.588 0 0 0-.57.583.548.548 0 0 0 .566.554c1.872-.048 3.63.636 4.947 1.925 1.317 1.288 2.039 3.03 2.032 4.904a.55.55 0 0 0 .566.553Zm-3.035.078a.589.589 0 0 0 .572-.58 4.908 4.908 0 0 0-1.481-3.582 4.91 4.91 0 0 0-3.613-1.403.59.59 0 0 0-.568.585c0 .316.256.561.568.552a3.812 3.812 0 0 1 2.806 1.09 3.808 3.808 0 0 1 1.15 2.781.55.55 0 0 0 .566.557Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const iconNames = [\n\t\"apple-filled\",\n\t\"arrow-circle-down-outline\",\n\t\"arrow-circle-left-outline\",\n\t\"arrow-circle-right-outline\",\n\t\"arrow-circle-up-outline\",\n\t\"arrow-down-outline\",\n\t\"arrow-left-outline\",\n\t\"arrow-list-outline\",\n\t\"arrow-point-down-filled\",\n\t\"arrow-point-left-filled\",\n\t\"arrow-point-right-filled\",\n\t\"arrow-point-up-filled\",\n\t\"arrow-right-outline\",\n\t\"arrow-up-outline\",\n\t\"barcode-outline\",\n\t\"bell-outline\",\n\t\"calendar-alt-outline\",\n\t\"calendar-locked-outline\",\n\t\"calendar-outline\",\n\t\"carrot-filled\",\n\t\"check-outline\",\n\t\"checkbox-checked\",\n\t\"checkbox-unchecked\",\n\t\"chevron-down-outline\",\n\t\"chevron-left-bicolor\",\n\t\"chevron-left-outline\",\n\t\"chevron-right-bicolor\",\n\t\"chevron-right-outline\",\n\t\"chevron-up-outline\",\n\t\"chicken-filled\",\n\t\"chili-filled\",\n\t\"close-outline\",\n\t\"cloud-download-outline\",\n\t\"cloud-upload-outline\",\n\t\"copy-generic-outline\",\n\t\"copy-square-outline\",\n\t\"delete-outline\",\n\t\"discount-outline\",\n\t\"document-generic-outline\",\n\t\"document-history-alt-outline\",\n\t\"document-history-outline\",\n\t\"document-list-outline\",\n\t\"drag-handle-outline\",\n\t\"error-filled-red\",\n\t\"error-outline\",\n\t\"exclamation-outline\",\n\t\"expand-outline\",\n\t\"export-outline\",\n\t\"eye-closed-outline\",\n\t\"eye-open-filled\",\n\t\"eye-open-outline\",\n\t\"facebook-filled\",\n\t\"fire-filled\",\n\t\"fish-filled\",\n\t\"globe-outline\",\n\t\"google-filled\",\n\t\"hashtag-outline\",\n\t\"home-outline\",\n\t\"import-outline\",\n\t\"info-filled-blue\",\n\t\"info-outline\",\n\t\"instagram-filled\",\n\t\"key-outline\",\n\t\"lactose-intolerant-filled\",\n\t\"layout-1-outline\",\n\t\"layout-2-outline\",\n\t\"layout-3-outline\",\n\t\"layout-4-outline\",\n\t\"layout-5-outline\",\n\t\"leaf-filled\",\n\t\"linkedin-filled\",\n\t\"location-filled\",\n\t\"lock-password-1-outline\",\n\t\"lock-password-2-outline\",\n\t\"mail-outline\",\n\t\"menu-close-outline\",\n\t\"menu-hamburger-outline\",\n\t\"minus-bicolor-tertiary-light\",\n\t\"minus-bicolor-tertiary\",\n\t\"minus-filled\",\n\t\"money-bill-outline\",\n\t\"money-cash-outline\",\n\t\"money-coin-outline\",\n\t\"money-credit-card-outline\",\n\t\"nfc-filled\",\n\t\"nfc-outline\",\n\t\"pencil-outline\",\n\t\"pencil\",\n\t\"phone-outline\",\n\t\"plus-bicolor-tertiary-light\",\n\t\"plus-bicolor-tertiary\",\n\t\"plus-filled\",\n\t\"printer-outline\",\n\t\"purchase-order-bill-outline\",\n\t\"purchase-order-list-outline\",\n\t\"purchase-order-ticket-outline\",\n\t\"question-circle-outline\",\n\t\"radio-button-checked-outline\",\n\t\"radio-button-unchecked-outline\",\n\t\"refresh-double-outline\",\n\t\"refresh-single-outline\",\n\t\"rocket-outline\",\n\t\"search-outline\",\n\t\"settings-outline\",\n\t\"sheet-bent-outline\",\n\t\"sheet-generic-outline\",\n\t\"sheet-list-outline\",\n\t\"shopping-bag-outline\",\n\t\"shopping-basket-outline\",\n\t\"shopping-cart-outline\",\n\t\"split-bill-ticket-1-outline\",\n\t\"split-bill-ticket-2-outline\",\n\t\"star-filled\",\n\t\"success-filled-green\",\n\t\"success-outline\",\n\t\"sugar-free-filled\",\n\t\"tag-filled\",\n\t\"tag-outline\",\n\t\"tap-click-hand-outline\",\n\t\"ticket-outline\",\n\t\"tickets-outline\",\n\t\"twitter-filled\",\n\t\"user-outline\",\n\t\"warning-filled-yellow\",\n\t\"warning-outline\",\n\t\"whatsapp-outline\",\n\t\"wheat-filled\",\n\t\"wifi-no-signal-outline\",\n\t\"wifi-signal-filled\",\n\t\"wifi-signal-outline\",\n] as const;\n\nexport type IconNameType = (typeof iconNames)[number];\n","import { useMemo } from \"react\";\nimport styles from \"./Icon.module.css\";\nimport type { IconNameType } from \"./icons\";\nimport * as Icons from \"./icons\";\n\nexport type { IconNameType };\n\nexport interface IconProps {\n\tname: IconNameType;\n\tsize?: number | string;\n\tclassName?: string;\n\tcolor?: string;\n\t\"aria-label\"?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n\t\"data-testid\"?: string;\n}\n\nfunction resolveIcon(name: IconNameType): { path: string; viewBox: string } {\n\tconst key = `ICON_${name.replace(/-/g, \"_\").toUpperCase()}` as keyof typeof Icons;\n\t// biome-ignore lint/performance/noDynamicNamespaceImportAccess: dynamic icon resolution by name (matches Vue DS pattern)\n\tconst entry = Icons[key];\n\tif (Array.isArray(entry) && entry.length === 2) {\n\t\treturn { path: entry[0] as string, viewBox: entry[1] as string };\n\t}\n\t// Warn (dev only) instead of silently rendering an empty SVG — mirrors the Vue 3\n\t// DS. Gated so a published library never spams consumer production logs.\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconsole.warn(`[Icon] Icon content not found for name: ${name} (resolved to key: ${key})`);\n\t}\n\treturn { path: \"\", viewBox: \"0 0 16 16\" };\n}\n\nexport function Icon({\n\tname,\n\tsize = 20,\n\tclassName,\n\tcolor,\n\t\"aria-label\": ariaLabel,\n\t\"aria-hidden\": ariaHidden,\n\t\"data-testid\": testId,\n}: IconProps) {\n\tconst { path, viewBox } = useMemo(() => resolveIcon(name), [name]);\n\tconst isDecorative = !ariaLabel;\n\t// Only -outline / -filled icons take the color (matches the Vue 3 DS). All\n\t// other icons (bicolor, checkbox, pencil…) carry their own fills in the sprite\n\t// and must NOT receive a component-level fill or stroke — doing so repaints or\n\t// outlines them. Stroke-drawn geometry (e.g. calendar-outline) keeps its stroke\n\t// in the sprite, normalized to currentColor by generateIcons. Driving the color\n\t// via the element's CSS `color` keeps the (currentColor) fills and strokes in\n\t// sync — including when the `color` prop is set.\n\tconst applyFill = name.endsWith(\"-outline\") || name.endsWith(\"-filled\");\n\tconst tokenColor = applyFill && color ? `var(--ds-color-${color})` : undefined;\n\tconst fill = applyFill ? (tokenColor ?? \"currentColor\") : undefined;\n\n\treturn (\n\t\t<svg\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox={viewBox}\n\t\t\tfill={fill}\n\t\t\tstyle={tokenColor ? { color: tokenColor } : undefined}\n\t\t\tclassName={[styles.icon, className].filter(Boolean).join(\" \")}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-hidden={ariaHidden ?? (isDecorative ? \"true\" : undefined)}\n\t\t\trole={ariaLabel ? \"img\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: SVG content from auto-generated icons.ts (not user input)\n\t\t\tdangerouslySetInnerHTML={{ __html: path }}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n .accordion {\n display: flex;\n flex-direction: column;\n font-family: var(--font-family-base);\n color: var(--color-text);\n }\n\n /* ── Item ── */\n .item {\n border-bottom: 1px solid var(--color-border);\n\n &:first-child {\n border-top: 1px solid var(--color-border);\n }\n }\n\n /* ── Trigger ── */\n .trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--spacing-md) var(--spacing-lg);\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: var(--font-family-base);\n font-size: var(--text-base);\n font-weight: var(--font-medium);\n color: var(--color-text);\n line-height: var(--leading-normal);\n transition: background-color var(--duration-fast) var(--ease-out);\n\n &:hover {\n background-color: var(--color-neutral-50);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n }\n }\n\n /* ── Chevron ── */\n .chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: var(--text-base);\n color: var(--color-text-muted);\n transition: transform var(--duration-base) var(--ease-in-out);\n transform-origin: center;\n }\n\n .item[data-open] .chevron {\n transform: rotate(180deg);\n }\n\n /* ── Content panel ── */\n .content {\n /* `hidden` attribute sets display:none natively — no extra CSS needed */\n }\n\n /* ── Inner padding ── */\n .inner {\n padding: var(--spacing-sm) var(--spacing-lg) var(--spacing-lg);\n font-size: var(--text-base);\n line-height: var(--leading-relaxed);\n color: var(--color-text);\n }\n}\n","import { type ReactElement, type ReactNode, useState } from \"react\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Accordion.module.css\";\n\ninterface AccordionItem {\n\tid: string;\n\ttitle: string;\n\tcontent: ReactNode;\n\tdefaultOpen?: boolean;\n}\n\ninterface AccordionProps {\n\titems: AccordionItem[];\n\tmultiple?: boolean;\n\t\"data-testid\"?: string;\n}\n\nexport function Accordion({\n\titems,\n\tmultiple = false,\n\t\"data-testid\": testId,\n}: AccordionProps): ReactElement {\n\tconst [openIds, setOpenIds] = useState<Set<string>>(() => {\n\t\tconst defaults = items.filter((i) => i.defaultOpen).map((i) => i.id);\n\t\treturn new Set(defaults);\n\t});\n\n\tconst toggle = (id: string) => {\n\t\tsetOpenIds((prev) => {\n\t\t\tconst next = new Set(prev);\n\t\t\tif (next.has(id)) {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tif (!multiple) next.clear();\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className={styles.accordion} data-testid={testId}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst isOpen = openIds.has(item.id);\n\t\t\t\treturn (\n\t\t\t\t\t<div key={item.id} className={styles.item} data-open={isOpen || undefined}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tid={`accordion-trigger-${item.id}`}\n\t\t\t\t\t\t\tclassName={styles.trigger}\n\t\t\t\t\t\t\tonClick={() => toggle(item.id)}\n\t\t\t\t\t\t\taria-expanded={isOpen}\n\t\t\t\t\t\t\taria-controls={`accordion-${item.id}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span>{item.title}</span>\n\t\t\t\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<section\n\t\t\t\t\t\t\tid={`accordion-${item.id}`}\n\t\t\t\t\t\t\tclassName={styles.content}\n\t\t\t\t\t\t\taria-labelledby={`accordion-trigger-${item.id}`}\n\t\t\t\t\t\t\thidden={!isOpen}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isOpen && <div className={styles.inner}>{item.content}</div>}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .spinner[data-size=\"small\"] {\n width: 16px;\n height: 16px;\n }\n\n .spinner[data-size=\"medium\"] {\n width: 24px;\n height: 24px;\n }\n\n .spinner[data-size=\"large\"] {\n width: 40px;\n height: 40px;\n }\n\n .track {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--ds-radius-circle);\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: spin var(--ds-duration-slow, 400ms) linear infinite;\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"small\" | \"medium\" | \"large\";\n\nexport interface SpinnerProps {\n\tsize?: SpinnerSize;\n\tlabel?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Spinner({\n\tsize = \"medium\",\n\tlabel = \"Cargando\",\n\tclassName,\n\t\"data-testid\": testId,\n}: SpinnerProps) {\n\treturn (\n\t\t<span\n\t\t\trole=\"status\"\n\t\t\taria-label={label}\n\t\t\tclassName={[styles.spinner, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<span className={styles.track} aria-hidden=\"true\" />\n\t\t</span>\n\t);\n}\n","@layer ds-components {\n .button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-2);\n font-family: var(--ds-font-family);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-tight);\n border: none;\n border-radius: var(--ds-radius-full);\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background-color var(--ds-duration-fast) var(--ds-ease-out),\n color var(--ds-duration-fast) var(--ds-ease-out),\n box-shadow var(--ds-duration-fast) var(--ds-ease-out),\n opacity var(--ds-duration-fast) var(--ds-ease-out);\n\n &:focus-visible {\n outline: var(--ds-focus-width) solid var(--ds-focus-color);\n outline-offset: var(--ds-focus-offset);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n /* ── Sizes (font-size + padding + height aligned with Vue3 DS btn-size-*) ── */\n .button[data-size=\"small\"] {\n padding: 0 var(--ds-space-3); /* 12px — matches spacing-md */\n font-size: var(--ds-font-size-xs); /* 12px — matches text-xs */\n min-height: 2.75rem; /* 44px — matches btn-size-small */\n }\n\n .button[data-size=\"medium\"] {\n padding: 0 var(--ds-space-4); /* 16px — matches spacing-lg */\n font-size: var(--ds-font-size-base); /* 16px — matches text-base */\n min-height: 3.75rem; /* 60px — matches btn-size-medium */\n }\n\n .button[data-size=\"large\"] {\n padding: 0 var(--ds-space-6); /* 24px — matches spacing-xl */\n /* 32px in both themes via a dedicated token. Do NOT replace with\n --ds-font-size-2xl: that's 32px only under vue3 (24px under angular-legacy). */\n font-size: var(--ds-button-font-size-lg);\n min-height: 5rem; /* 80px — matches btn-size-large */\n }\n\n /* ── Variants ── */\n .button[data-variant=\"primary\"] {\n background-color: var(--ds-color-primary);\n color: var(--ds-color-text-on-primary);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-primary-900);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-primary-900);\n transform: translateY(1px);\n }\n }\n\n .button[data-variant=\"secondary\"] {\n background-color: var(--ds-color-secondary);\n color: var(--ds-color-white, #ffffff);\n\n &:hover:not(:disabled) {\n opacity: 0.85;\n }\n\n &:active:not(:disabled) {\n opacity: 0.75;\n transform: translateY(1px);\n }\n }\n\n .button[data-variant=\"ghost\"] {\n background-color: transparent;\n color: var(--ds-color-text);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-gray-200);\n }\n }\n\n .button[data-variant=\"outline\"] {\n background-color: transparent;\n color: var(--ds-color-text);\n border: 1.5px solid var(--ds-color-border);\n\n &:hover:not(:disabled) {\n border-color: var(--ds-color-gray-400);\n background-color: var(--ds-color-gray-50);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n }\n }\n\n /* ── Full width ── */\n .button[data-full-width] {\n width: 100%;\n }\n\n /* ── Loading state ── */\n .button[data-loading] {\n cursor: wait;\n }\n\n .spinnerWrap {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .content {\n display: contents;\n }\n\n .content[data-hidden] {\n visibility: hidden;\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { Spinner } from \"../Spinner\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"outline\";\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\nexport type ButtonIconPosition = \"left\" | \"right\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tvariant?: ButtonVariant;\n\tsize?: ButtonSize;\n\tloading?: boolean;\n\tfullWidth?: boolean;\n\ticon?: ReactNode;\n\ticonPosition?: ButtonIconPosition;\n\tchildren: ReactNode;\n}\n\nexport function Button({\n\tvariant = \"primary\",\n\tsize = \"medium\",\n\tloading = false,\n\tfullWidth = false,\n\ticon,\n\ticonPosition = \"left\",\n\tdisabled,\n\tchildren,\n\tclassName,\n\ttype = \"button\",\n\t...props\n}: ButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tclassName={[styles.button, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tdata-loading={loading ? \"\" : undefined}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\tdisabled={disabled || loading}\n\t\t\taria-busy={loading}\n\t\t\t{...props}\n\t\t>\n\t\t\t{loading && (\n\t\t\t\t<span className={styles.spinnerWrap} aria-hidden=\"true\">\n\t\t\t\t\t<Spinner size=\"small\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span className={styles.content} data-hidden={loading ? \"\" : undefined}>\n\t\t\t\t{icon && iconPosition === \"left\" && icon}\n\t\t\t\t{children}\n\t\t\t\t{icon && iconPosition === \"right\" && icon}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.error {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tcolor: var(--ds-color-error);\n\t}\n}\n","import { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./AppleSignInButton.module.css\";\n\nexport interface AppleSignInButtonProps {\n\tonSignIn: () => void;\n\tisPending?: boolean;\n\tisError?: boolean;\n\terror?: Error | null;\n\t\"data-testid\"?: string;\n}\n\nexport function AppleSignInButton({\n\tonSignIn,\n\tisPending = false,\n\tisError = false,\n\terror,\n\t\"data-testid\": testId,\n}: AppleSignInButtonProps) {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tfullWidth\n\t\t\t\tonClick={onSignIn}\n\t\t\t\tloading={isPending}\n\t\t\t\taria-label=\"Continuar con Apple\"\n\t\t\t>\n\t\t\t\t<Icon name=\"apple-filled\" size={18} aria-hidden=\"true\" />\n\t\t\t\tApple\n\t\t\t</Button>\n\t\t\t{isError && (\n\t\t\t\t<span role=\"alert\" className={styles.error}>\n\t\t\t\t\t{error instanceof Error ? error.message : \"Error al iniciar sesión con Apple\"}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-height: 100dvh;\n\t\tflex: 1;\n\t\twidth: 100%;\n\t\tbackground-color: var(--ds-color-white);\n\t\tbackground-image: url(\"./assets/login-background-mobile.svg\");\n\t\tbackground-position: bottom;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: 100% auto;\n\n\t\t@media (width >= 768px) {\n\t\t\tbackground-image: url(\"./assets/login-background-desktop.svg\");\n\t\t\tbackground-position: right top;\n\t\t\tbackground-size: 30% auto;\n\n\t\t\t&::before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 30%;\n\t\t\t\theight: 35%;\n\t\t\t\tbackground-image: url(\"./assets/login-background-desktop.svg\");\n\t\t\t\tbackground-size: contain;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\ttransform: rotateZ(180deg);\n\t\t\t\tpointer-events: none;\n\t\t\t\tz-index: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t.content {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-2xl);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-lg);\n\t}\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./BackgroundWrapper.module.css\";\n\nexport interface BackgroundWrapperProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode;\n}\n\nexport function BackgroundWrapper({ children, className, ...props }: BackgroundWrapperProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\tdata-full-bleed=\"\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className={styles.content}>{children}</div>\n\t\t</div>\n\t);\n}\n","/**\n * Utility to merge CSS class names, filtering out falsy values.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n\treturn classes.filter(Boolean).join(\" \");\n}\n","@layer ds-components {\n .badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-full);\n font-family: var(--font-family-base);\n font-weight: var(--font-medium);\n line-height: var(--leading-tight);\n white-space: nowrap;\n }\n\n /* ── Sizes ── */\n .badge[data-size=\"small\"] {\n padding: 0.125rem var(--spacing-sm);\n font-size: var(--text-xs);\n }\n\n .badge[data-size=\"medium\"] {\n padding: 0.1875rem var(--spacing-md);\n font-size: var(--text-sm);\n }\n\n /* ── Variants ── */\n .badge[data-variant=\"default\"] {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-500);\n }\n\n .badge[data-variant=\"success\"] {\n background-color: var(--color-success-light);\n color: var(--color-success-dark);\n }\n\n .badge[data-variant=\"warning\"] {\n background-color: var(--color-warning-light);\n color: var(--color-warning-dark);\n }\n\n .badge[data-variant=\"error\"] {\n background-color: var(--color-error-light);\n color: var(--color-error-dark);\n }\n\n .badge[data-variant=\"info\"] {\n background-color: var(--color-info-light);\n color: var(--color-info-dark);\n }\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type BadgeSize = \"small\" | \"medium\";\n\nexport interface BadgeProps {\n\tvariant?: BadgeVariant;\n\tsize?: BadgeSize;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Badge({\n\tvariant = \"default\",\n\tsize = \"medium\",\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: BadgeProps): React.ReactElement {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(styles.badge, className)}\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n","@layer ds-components {\n\t.banner {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t.dismiss {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tmargin-inline-start: var(--ds-space-2);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t/* Static (no-motion) baseline: visible immediately, no transition. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.banner {\n\t\t\ttransition:\n\t\t\t\topacity var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\ttranslate var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t@starting-style {\n\t\t\t\topacity: 0;\n\t\t\t\ttranslate: 0 calc(-1 * var(--ds-space-2));\n\t\t\t}\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface BannerProps {\n\tvariant?: BannerVariant;\n\ticon?: IconNameType;\n\tonDismiss?: () => void;\n\tdismissLabel?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Banner({\n\tvariant = \"info\",\n\ticon,\n\tonDismiss,\n\tdismissLabel = \"Cerrar\",\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: BannerProps): React.ReactElement {\n\tconst isError = variant === \"error\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.banner, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\trole={isError ? \"alert\" : \"status\"}\n\t\t\taria-live={isError ? \"assertive\" : \"polite\"}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{icon && <Icon name={icon} size={20} aria-hidden=\"true\" />}\n\t\t\t<span className={styles.content}>{children}</span>\n\t\t\t{action && <span className={styles.action}>{action}</span>}\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.dismiss}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\taria-label={dismissLabel}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close-outline\" size={20} aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.breadcrumb {\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-snug);\n\t}\n\n\t.list {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t}\n\n\t.item {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tmin-inline-size: 0;\n\t}\n\n\t/* CSS-generated separator between items (decorative). */\n\t.item + .item::before {\n\t\tcontent: \"/\";\n\t\tcolor: var(--ds-color-text-muted);\n\t\tuser-select: none;\n\t}\n\n\t.link {\n\t\tcolor: var(--ds-color-primary);\n\t\ttext-decoration: none;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:hover {\n\t\t\ttext-decoration: underline;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t@media (prefers-reduced-motion: no-preference) {\n\t\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n\n\t.current {\n\t\tcolor: var(--ds-color-text-muted);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t}\n}\n","import type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Breadcrumb.module.css\";\n\nexport interface BreadcrumbItem {\n\tlabel: string;\n\thref?: string;\n}\n\nexport interface BreadcrumbProps {\n\titems: BreadcrumbItem[];\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Breadcrumb({\n\titems,\n\t\"aria-label\": ariaLabel = \"Breadcrumb\",\n\tclassName,\n\t\"data-testid\": testId,\n}: BreadcrumbProps): React.ReactElement | null {\n\tif (items.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lastIndex = items.length - 1;\n\n\treturn (\n\t\t<nav aria-label={ariaLabel} className={cn(styles.breadcrumb, className)} data-testid={testId}>\n\t\t\t<ol className={styles.list}>\n\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\tconst isLast = index === lastIndex;\n\t\t\t\t\tconst key = `${index}-${item.label}`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={key} className={styles.item}>\n\t\t\t\t\t\t\t{isLast || !item.href ? (\n\t\t\t\t\t\t\t\t<span className={styles.current} aria-current={isLast ? \"page\" : undefined}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<a href={item.href} className={styles.link}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ol>\n\t\t</nav>\n\t);\n}\n","@layer ds-components {\n .card {\n background-color: var(--ds-color-surface);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-xl);\n width: 100%;\n }\n\n /* ── Padding ── */\n .card[data-padding=\"none\"] {\n padding: 0;\n }\n\n .card[data-padding=\"small\"] {\n padding: var(--ds-space-4);\n }\n\n .card[data-padding=\"medium\"] {\n padding: var(--ds-space-6);\n }\n\n .card[data-padding=\"large\"] {\n padding: var(--ds-space-8);\n }\n\n /* ── Elevation ── */\n .card[data-elevation=\"none\"] {\n box-shadow: none;\n }\n\n .card[data-elevation=\"small\"] {\n box-shadow: var(--ds-shadow-sm);\n }\n\n .card[data-elevation=\"medium\"] {\n box-shadow: var(--ds-shadow-md);\n }\n\n .card[data-elevation=\"large\"] {\n box-shadow: var(--ds-shadow-lg);\n }\n\n /* ── Hoverable ── */\n .card[data-hoverable] {\n cursor: pointer;\n transition: box-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover {\n box-shadow: var(--ds-shadow-md);\n }\n }\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Card.module.css\";\n\nexport type CardPadding = \"none\" | \"small\" | \"medium\" | \"large\";\nexport type CardElevation = \"none\" | \"small\" | \"medium\" | \"large\";\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n\tpadding?: CardPadding;\n\televation?: CardElevation;\n\thoverable?: boolean;\n\tmaxWidth?: string;\n\tchildren: ReactNode;\n}\n\nexport function Card({\n\tpadding = \"small\",\n\televation = \"none\",\n\thoverable = false,\n\tmaxWidth,\n\tchildren,\n\tclassName,\n\tstyle,\n\t...props\n}: CardProps) {\n\treturn (\n\t\t<section\n\t\t\tclassName={[styles.card, className].filter(Boolean).join(\" \")}\n\t\t\tdata-padding={padding}\n\t\t\tdata-elevation={elevation}\n\t\t\tdata-hoverable={hoverable ? \"\" : undefined}\n\t\t\tstyle={maxWidth ? { maxWidth, ...style } : style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</section>\n\t);\n}\n","@layer ds-components {\n\t.chartWrapper {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t}\n\n\t.chartTitle {\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-semibold);\n\t\tcolor: var(--color-text-muted);\n\t\tmargin-bottom: var(--spacing-sm);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t}\n\n\t.kpiCard {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-md);\n\t\tbackground: var(--color-surface);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t}\n\n\t.kpiLabel {\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t}\n\n\t.kpiValue {\n\t\tfont-size: var(--text-2xl);\n\t\tfont-weight: var(--font-bold);\n\t\tcolor: var(--color-text);\n\t\tline-height: var(--leading-tight);\n\t}\n\n\t.kpiChange {\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t}\n\n\t.kpiChange[data-trend=\"up\"] {\n\t\tcolor: var(--color-success);\n\t}\n\n\t.kpiChange[data-trend=\"down\"] {\n\t\tcolor: var(--color-error);\n\t}\n\n\t.kpiChange[data-trend=\"neutral\"] {\n\t\tcolor: var(--color-text-muted);\n\t}\n\n\t.emptyState {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: 200px;\n\t\tcolor: var(--color-text-muted);\n\t\tfont-size: var(--text-sm);\n\t}\n}\n","import type { ReactElement } from \"react\";\nimport {\n\tArea,\n\tBar,\n\tCartesianGrid,\n\tLegend,\n\tLine,\n\tAreaChart as ReAreaChart,\n\tBarChart as ReBarChart,\n\tLineChart as ReLineChart,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from \"recharts\";\nimport styles from \"./Charts.module.css\";\n\n/* ── DS color palette: recharts stroke/fill accept only resolved colors, not CSS custom properties.\n Keep in sync with --ds-color-primary, blue-600, green-600, amber-600, violet-700, cyan-600. ── */\nconst DS_COLORS = [\n\t\"#ff4235\", // --ds-color-primary\n\t\"#2563eb\", // blue\n\t\"#16a34a\", // green\n\t\"#d97706\", // amber\n\t\"#7c3aed\", // violet\n\t\"#0891b2\", // cyan\n];\n\nexport interface ChartSeries {\n\tdataKey: string;\n\tlabel?: string;\n\tcolor?: string;\n}\n\nexport interface BaseChartProps {\n\t/** Data array — each object must have the keys referenced by series[].dataKey */\n\tdata: Record<string, unknown>[];\n\t/** X-axis data key */\n\txKey: string;\n\tseries: ChartSeries[];\n\theight?: number;\n\ttitle?: string;\n\t/** Y-axis tick formatter */\n\tformatY?: (value: number) => string;\n\t/** Tooltip value formatter */\n\tformatValue?: (value: number) => string;\n\t/** Hide recharts legend */\n\thideLegend?: boolean;\n\t\"data-testid\"?: string;\n}\n\n/* ── LineChart ── */\nexport function LineChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReLineChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => (\n\t\t\t\t\t\t<Line\n\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\tstroke={s.color ?? DS_COLORS[i % DS_COLORS.length]}\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={{ r: 4 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ReLineChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── BarChart ── */\nexport function BarChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReBarChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => (\n\t\t\t\t\t\t<Bar\n\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\tfill={s.color ?? DS_COLORS[i % DS_COLORS.length]}\n\t\t\t\t\t\t\tradius={[2, 2, 0, 0]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ReBarChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── AreaChart ── */\nexport function AreaChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReAreaChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => {\n\t\t\t\t\t\tconst color = s.color ?? DS_COLORS[i % DS_COLORS.length];\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\t\tstroke={color}\n\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\tfillOpacity={0.12}\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</ReAreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── KpiCard ── */\nexport interface KpiCardProps {\n\tlabel: string;\n\tvalue: string | number;\n\t/** e.g. \"+12.5%\" or \"-3.2%\" */\n\tchange?: string;\n\ttrend?: \"up\" | \"down\" | \"neutral\";\n\t\"data-testid\"?: string;\n}\n\nexport function KpiCard({\n\tlabel,\n\tvalue,\n\tchange,\n\ttrend = \"neutral\",\n\t\"data-testid\": testId,\n}: KpiCardProps): ReactElement {\n\treturn (\n\t\t<div className={styles.kpiCard} data-testid={testId}>\n\t\t\t<div className={styles.kpiLabel}>{label}</div>\n\t\t\t<div className={styles.kpiValue}>{value}</div>\n\t\t\t{change && (\n\t\t\t\t<div className={styles.kpiChange} data-trend={trend}>\n\t\t\t\t\t{change}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n .checkmark {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background-color: var(--color-surface);\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-sm);\n transition:\n background-color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n }\n\n .wrapper:hover:not(:has(.input:disabled)) .checkmark {\n border-color: var(--color-neutral-400);\n }\n\n .input:checked + .checkmark {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 10' fill='none'%3E%3Cpath d='M1 5l3.5 3.5L11 1' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n background-size: 10px 8px;\n }\n\n .input:indeterminate + .checkmark {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 2' fill='none'%3E%3Cpath d='M1 1h8' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n background-size: 10px 2px;\n }\n\n .input:focus-visible + .checkmark {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n }\n\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n color: var(--color-text);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Checkbox({\n\tlabel,\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: CheckboxProps) {\n\tconst inputId =\n\t\tid ??\n\t\t`checkbox-${String(label ?? \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/\\s+/g, \"-\")}`;\n\treturn (\n\t\t<label\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\thtmlFor={inputId}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<input ref={ref} type=\"checkbox\" id={inputId} className={styles.input} {...props} />\n\t\t\t<span className={styles.checkmark} aria-hidden=\"true\" />\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-3);\n padding: var(--ds-space-12) var(--ds-space-4);\n color: var(--ds-color-text-muted);\n }\n\n .icon {\n opacity: 0.6;\n\n @media (prefers-reduced-motion: no-preference) {\n animation: ds-coming-soon-fade-in var(--ds-duration-slow) var(--ds-ease-out) both;\n }\n }\n\n .message {\n margin: 0;\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-medium);\n text-align: center;\n color: var(--ds-color-text-muted);\n }\n}\n\n@layer ds-components {\n @keyframes ds-coming-soon-fade-in {\n from {\n opacity: 0;\n transform: translateY(var(--ds-space-2));\n }\n to {\n opacity: 0.6;\n transform: translateY(0);\n }\n }\n}\n","import type React from \"react\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./ComingSoon.module.css\";\n\nexport interface ComingSoonProps {\n\tmessage?: string;\n\ticon?: IconNameType;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ComingSoon({\n\tmessage,\n\ticon = \"lock-password-1-outline\",\n\tclassName,\n\t\"data-testid\": testId,\n}: ComingSoonProps): React.ReactElement {\n\t// A default parameter only substitutes for `undefined`, not for an empty/\n\t// whitespace string — which would render a blank live region. Coalesce on\n\t// content so a falsy message still shows the placeholder text.\n\tconst resolvedMessage = message?.trim() ? message : \"Próximamente\";\n\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<Icon name={icon} size={40} aria-hidden=\"true\" className={styles.icon} />\n\t\t\t<p className={styles.message}>{resolvedMessage}</p>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-4);\n padding-block: var(--ds-space-3);\n padding-inline: var(--ds-space-4);\n cursor: default;\n\n @media (prefers-reduced-motion: no-preference) {\n transition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n }\n\n &:hover {\n background-color: var(--ds-color-gray-50);\n }\n\n &[data-divider] {\n border-block-end: thin solid var(--ds-color-border);\n }\n\n /* Purely visual — must not block interaction (the caller disables the\n control itself). No pointer-events:none, which would asymmetrically\n block pointer but not keyboard. */\n &[data-dimmed] {\n opacity: 0.5;\n }\n }\n\n .labelCol {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n flex: 1;\n min-inline-size: 0;\n }\n\n .label {\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-medium);\n color: var(--ds-color-text);\n line-height: var(--ds-leading-snug);\n }\n\n .description {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n }\n\n .controlCol {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n justify-content: flex-end;\n }\n}\n","import type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport styles from \"./ConfigRow.module.css\";\n\nexport interface ConfigRowProps {\n\tlabel: string;\n\tdescription?: string;\n\t/** The control slot — Toggle, Select, Button, etc. */\n\tchildren: ReactNode;\n\t/**\n\t * When provided the label is rendered as `<label htmlFor>`, linking it to\n\t * the control by id. The CALLER MUST put a matching `id={htmlFor}` on the\n\t * child control — ConfigRow renders `children` opaquely and cannot verify\n\t * it; without a match the label associates with nothing. Omit when the\n\t * control manages its own label.\n\t */\n\thtmlFor?: string;\n\t/**\n\t * Purely visual muted state (reduced opacity). Does NOT affect\n\t * interactivity — to disable the control, pass `disabled` to the control\n\t * inside `children` yourself.\n\t */\n\tdimmed?: boolean;\n\t/** Bottom border separator. Defaults to `true`. */\n\tdivider?: boolean;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ConfigRow({\n\tlabel,\n\tdescription,\n\tchildren,\n\thtmlFor,\n\tdimmed = false,\n\tdivider = true,\n\tclassName,\n\t\"data-testid\": testId,\n}: ConfigRowProps): React.ReactElement {\n\tconst LabelEl = htmlFor ? \"label\" : \"span\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.row, className].filter(Boolean).join(\" \")}\n\t\t\tdata-dimmed={dimmed || undefined}\n\t\t\tdata-divider={divider || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<div className={styles.labelCol}>\n\t\t\t\t<LabelEl htmlFor={htmlFor} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</LabelEl>\n\t\t\t\t{description && <span className={styles.description}>{description}</span>}\n\t\t\t</div>\n\t\t\t<div className={styles.controlCol}>{children}</div>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-md);\n\t\tbackground: var(--ds-color-white);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-md);\n\t\tpadding: var(--spacing-md);\n\t}\n\n\t.search {\n\t\twidth: 100%;\n\t\tmax-width: 320px;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-family: var(--font-family-base);\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px\n\t\t\t\tcolor-mix(in oklch, var(--color-primary) 20%, transparent);\n\t\t}\n\t}\n\n\t.tableContainer {\n\t\toverflow-x: auto;\n\t\toverflow-y: auto;\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t}\n\n\t.table {\n\t\twidth: 100%;\n\t\tborder-collapse: collapse;\n\t\tfont-size: var(--text-sm);\n\t}\n\n\t.th {\n\t\ttext-align: left;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-neutral-400);\n\t\tbackground: var(--color-neutral-50);\n\t\tborder-bottom: 1px solid var(--color-neutral-200);\n\t\twhite-space: nowrap;\n\t\tuser-select: none;\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\n\t\t&[data-sortable] {\n\t\t\tcursor: pointer;\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--color-neutral-500);\n\t\t\t}\n\t\t}\n\t}\n\n\t.tr {\n\t\tborder-top: 1px solid var(--color-neutral-200);\n\t\ttransition: background var(--duration-fast) var(--ease-out);\n\n\t\t&:last-child {\n\t\t\tborder-bottom: none;\n\t\t}\n\n\t\t&:nth-child(even) {\n\t\t\tbackground: var(--color-neutral-100);\n\t\t\tborder-bottom: 1px solid var(--color-neutral-200);\n\t\t}\n\n\t\t/* biome-ignore lint/style/noDescendingSpecificity: .th and .tr are unrelated elements; no cascade conflict */\n\t\t&:hover {\n\t\t\tbackground: var(--color-tertiary);\n\t\t}\n\t\t&[data-clickable] {\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&[data-selected] {\n\t\t\tbackground: color-mix(in oklch, var(--color-primary) 6%, transparent);\n\t\t\t&:hover {\n\t\t\t\tbackground: color-mix(in oklch, var(--color-primary) 10%, transparent);\n\t\t\t}\n\t\t}\n\t}\n\n\t.td {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tcolor: var(--color-neutral-500);\n\t}\n\n\t.empty {\n\t\ttext-align: center;\n\t\tpadding: var(--spacing-2xl);\n\t\tcolor: var(--color-neutral-400);\n\t}\n\n\t.loading {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tpadding: var(--spacing-2xl);\n\t}\n\n\t.pagination {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: var(--spacing-md);\n\t\tpadding: var(--spacing-sm) 0;\n\t}\n\n\t.pageButton {\n\t\tpadding: var(--spacing-xs) var(--spacing-md);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t\tfont-size: var(--text-sm);\n\t\tcursor: pointer;\n\t\ttransition: all var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground: var(--color-neutral-50);\n\t\t}\n\t\t&:disabled {\n\t\t\topacity: 0.5;\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.pageInfo {\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-neutral-400);\n\t}\n}\n","import {\n\ttype Column,\n\ttype ColumnDef,\n\tflexRender,\n\tgetCoreRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\ttype SortingState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Spinner } from \"../Spinner\";\nimport styles from \"./DataTable.module.css\";\n\nfunction getAriaSortValue<T>(\n\tcolumn: Column<T, unknown>,\n): \"ascending\" | \"descending\" | \"none\" | undefined {\n\tconst sorted = column.getIsSorted();\n\tif (sorted === \"asc\") return \"ascending\";\n\tif (sorted === \"desc\") return \"descending\";\n\tif (column.getCanSort()) return \"none\";\n\treturn undefined;\n}\n\nexport interface DataTableProps<T> {\n\tdata: T[];\n\tcolumns: ColumnDef<T, unknown>[];\n\tisLoading?: boolean;\n\tloadingSlot?: ReactNode;\n\tpageSize?: number;\n\tsearchable?: boolean;\n\tsortable?: boolean;\n\tpaginated?: boolean;\n\temptyMessage?: ReactNode;\n\tsearchPlaceholder?: string;\n\tpreviousLabel?: string;\n\tnextLabel?: string;\n\tonRowClick?: (row: T) => void;\n\tselectable?: boolean;\n\tonSelectionChange?: (rows: T[]) => void;\n\tmanualPagination?: boolean;\n\tpageCount?: number;\n\t/** Wrap with useCallback in the parent to avoid redundant fetches on re-render. */\n\tonPageChange?: (pageIndex: number, pageSize: number) => void;\n\t\"data-testid\"?: string;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pagination + selection + loading branches are all load-bearing\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tisLoading = false,\n\tloadingSlot,\n\tpageSize = 20,\n\tsearchable = false,\n\tsortable = true,\n\tpaginated = true,\n\temptyMessage = \"Sin resultados\",\n\tsearchPlaceholder = \"Buscar...\",\n\tpreviousLabel = \"Anterior\",\n\tnextLabel = \"Siguiente\",\n\tonRowClick,\n\tselectable = false,\n\tonSelectionChange,\n\tmanualPagination = false,\n\tpageCount,\n\tonPageChange,\n\t\"data-testid\": testId,\n}: DataTableProps<T>): React.ReactElement {\n\tconst [sorting, setSorting] = useState<SortingState>([]);\n\tconst [globalFilter, setGlobalFilter] = useState(\"\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize,\n\t});\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\tconst selectionColumn: ColumnDef<T, unknown> = useMemo(\n\t\t() => ({\n\t\t\tid: \"__select__\",\n\t\t\tsize: 40,\n\t\t\tenableSorting: false,\n\t\t\theader: ({ table }) => (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\t\tonChange={table.getToggleAllPageRowsSelectedHandler()}\n\t\t\t\t\taria-label=\"Select all rows\"\n\t\t\t\t/>\n\t\t\t),\n\t\t\tcell: ({ row }) => (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\tonChange={row.getToggleSelectedHandler()}\n\t\t\t\t\taria-label={`Select row ${row.index + 1}`}\n\t\t\t\t/>\n\t\t\t),\n\t\t}),\n\t\t[],\n\t);\n\n\tconst resolvedColumns = useMemo(\n\t\t() => (selectable ? [selectionColumn, ...columns] : columns),\n\t\t[selectable, columns, selectionColumn],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: resolvedColumns,\n\t\tstate: { sorting, globalFilter, pagination, rowSelection },\n\t\tonSortingChange: setSorting,\n\t\tonGlobalFilterChange: setGlobalFilter,\n\t\tonPaginationChange: setPagination,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t...(sortable ? { getSortedRowModel: getSortedRowModel() } : {}),\n\t\t...(paginated ? { getPaginationRowModel: getPaginationRowModel() } : {}),\n\t\t...(searchable ? { getFilteredRowModel: getFilteredRowModel() } : {}),\n\t\tenableRowSelection: selectable,\n\t\tmanualPagination,\n\t\tpageCount: manualPagination ? (pageCount ?? -1) : undefined,\n\t});\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: rowSelection change must trigger recompute because table.getSelectedRowModel() reads current state\n\tconst selectedRows = useMemo(\n\t\t() => (selectable ? table.getSelectedRowModel().rows.map((row) => row.original) : []),\n\t\t[selectable, table, rowSelection],\n\t);\n\n\tconst isMountedRef = useRef(false);\n\tuseEffect(() => {\n\t\tif (!isMountedRef.current) {\n\t\t\tisMountedRef.current = true;\n\t\t\treturn;\n\t\t}\n\t\tonSelectionChange?.(selectedRows);\n\t}, [selectedRows, onSelectionChange]);\n\n\tuseEffect(() => {\n\t\tif (!manualPagination || !onPageChange) return;\n\t\tonPageChange(pagination.pageIndex, pagination.pageSize);\n\t}, [pagination.pageIndex, pagination.pageSize, manualPagination, onPageChange]);\n\n\tif (isLoading) {\n\t\treturn <div className={styles.loading}>{loadingSlot ?? <Spinner size=\"large\" />}</div>;\n\t}\n\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t{searchable && (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\tvalue={globalFilter}\n\t\t\t\t\tonChange={(e) => setGlobalFilter(e.target.value)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<div className={styles.tableContainer}>\n\t\t\t\t<table className={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t\t\t<tr key={headerGroup.id}>\n\t\t\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.th}\n\t\t\t\t\t\t\t\t\t\tdata-sortable={header.column.getCanSort() || undefined}\n\t\t\t\t\t\t\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\t\t\t\t\t\t\taria-sort={getAriaSortValue(header.column)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{flexRender(header.column.columnDef.header, header.getContext())}\n\t\t\t\t\t\t\t\t\t\t{header.column.getIsSorted() === \"asc\" && \" ▲\"}\n\t\t\t\t\t\t\t\t\t\t{header.column.getIsSorted() === \"desc\" && \" ▼\"}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{table.getRowModel().rows.length === 0 ? (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={resolvedColumns.length} className={styles.empty}>\n\t\t\t\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\ttable.getRowModel().rows.map((row) => (\n\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\tclassName={styles.tr}\n\t\t\t\t\t\t\t\t\tdata-clickable={!!onRowClick || undefined}\n\t\t\t\t\t\t\t\t\tdata-selected={row.getIsSelected() || undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => onRowClick?.(row.original)}\n\t\t\t\t\t\t\t\t\ttabIndex={onRowClick ? 0 : undefined}\n\t\t\t\t\t\t\t\t\trole={onRowClick ? \"button\" : undefined}\n\t\t\t\t\t\t\t\t\tonKeyDown={\n\t\t\t\t\t\t\t\t\t\tonRowClick\n\t\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonRowClick(row.original);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t\t\t\t<td key={cell.id} className={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{flexRender(cell.column.columnDef.cell, cell.getContext())}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t)}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\n\t\t\t{paginated && (manualPagination ? (pageCount ?? 0) > 1 : table.getPageCount() > 1) && (\n\t\t\t\t<div className={styles.pagination}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.pageButton}\n\t\t\t\t\t\tonClick={() => table.previousPage()}\n\t\t\t\t\t\tdisabled={!table.getCanPreviousPage()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{previousLabel}\n\t\t\t\t\t</button>\n\t\t\t\t\t<span className={styles.pageInfo}>\n\t\t\t\t\t\t{table.getState().pagination.pageIndex + 1} /{\" \"}\n\t\t\t\t\t\t{manualPagination ? (pageCount ?? \"?\") : table.getPageCount()}\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.pageButton}\n\t\t\t\t\t\tonClick={() => table.nextPage()}\n\t\t\t\t\t\tdisabled={!table.getCanNextPage()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{nextLabel}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-xs);\n\t}\n\n\t.label {\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-semibold);\n\t\tline-height: var(--leading-snug);\n\t\tcolor: var(--color-text);\n\t}\n\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t/* Normalize native date picker appearance */\n\t\tappearance: none;\n\t\t-webkit-appearance: none;\n\n\t\t&::-webkit-calendar-picker-indicator {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.6;\n\t\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t\t&:hover {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { InputHTMLAttributes, Ref } from \"react\";\nimport { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./DatePicker.module.css\";\n\nexport interface DatePickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\terror?: boolean;\n\tlabel?: string;\n\tref?: Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function DatePicker({\n\terror,\n\tlabel,\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: DatePickerProps) {\n\tconst generatedId = useId();\n\tconst inputId = id ?? generatedId;\n\treturn (\n\t\t<div className={cn(styles.wrapper, className)} data-testid={testId}>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={inputId} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"date\"\n\t\t\t\tid={inputId}\n\t\t\t\tclassName={styles.input}\n\t\t\t\tdata-error={error || undefined}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: var(--ds-space-2);\n\t}\n\n\t.field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.label {\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-semibold);\n\t\tline-height: var(--ds-leading-snug);\n\t\tcolor: var(--ds-color-text);\n\t}\n\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\tappearance: none;\n\t\t-webkit-appearance: none;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&::-webkit-calendar-picker-indicator {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.6;\n\t\t\ttransition: opacity var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t&:hover {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n\n\t.separator {\n\t\tfont-size: var(--ds-font-size-base);\n\t\tcolor: var(--ds-color-text-muted);\n\t\tpadding-bottom: var(--ds-space-2);\n\t\tflex-shrink: 0;\n\t}\n}\n","import { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./DateRangePicker.module.css\";\n\nexport interface DateRangePickerProps {\n\tstartDate?: string;\n\tendDate?: string;\n\tonStartChange?: (date: string) => void;\n\tonEndChange?: (date: string) => void;\n\tstartLabel?: string;\n\tendLabel?: string;\n\terror?: boolean;\n\tdisabled?: boolean;\n\tminDate?: string;\n\tmaxDate?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function DateRangePicker({\n\tstartDate = \"\",\n\tendDate = \"\",\n\tonStartChange,\n\tonEndChange,\n\tstartLabel = \"Desde\",\n\tendLabel = \"Hasta\",\n\terror,\n\tdisabled,\n\tminDate,\n\tmaxDate,\n\tclassName,\n\t\"data-testid\": testId,\n}: DateRangePickerProps) {\n\tconst startId = useId();\n\tconst endId = useId();\n\n\treturn (\n\t\t<div className={cn(styles.wrapper, className)} data-testid={testId}>\n\t\t\t<div className={styles.field}>\n\t\t\t\t<label htmlFor={startId} className={styles.label}>\n\t\t\t\t\t{startLabel}\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid={startId}\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tvalue={startDate}\n\t\t\t\t\tmin={minDate}\n\t\t\t\t\tmax={endDate || maxDate}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t\tonChange={(e) => onStartChange?.(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<span className={styles.separator} aria-hidden=\"true\">\n\t\t\t\t—\n\t\t\t</span>\n\t\t\t<div className={styles.field}>\n\t\t\t\t<label htmlFor={endId} className={styles.label}>\n\t\t\t\t\t{endLabel}\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid={endId}\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tvalue={endDate}\n\t\t\t\t\tmin={startDate || minDate}\n\t\t\t\t\tmax={maxDate}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t\tonChange={(e) => onEndChange?.(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useEffect } from \"react\";\n\nexport interface UseScrollLockOptions {\n\t/**\n\t * Locking strategy.\n\t * - `\"fixed\"` (default): pins `document.body` with `position: fixed` and\n\t * restores the scroll position on release. This is Dialog's behavior —\n\t * it prevents the page from jumping when the scrollbar disappears.\n\t * - `\"overflow\"`: only sets `document.body.style.overflow = \"hidden\"`.\n\t * This is Overlay's lighter behavior.\n\t */\n\tstrategy?: \"fixed\" | \"overflow\";\n}\n\n/**\n * Locks body scroll while `lock` is true and restores the previous state on\n * cleanup (release / unmount). Internal hook — not part of the public API.\n *\n * Behavior is extracted verbatim from Dialog (`strategy: \"fixed\"`) and Overlay\n * (`strategy: \"overflow\"`) so neither consumer changes visually or behaviorally.\n */\nexport function useScrollLock(lock: boolean, options: UseScrollLockOptions = {}): void {\n\tconst { strategy = \"fixed\" } = options;\n\n\tuseEffect(() => {\n\t\tif (!lock) return;\n\n\t\tif (strategy === \"overflow\") {\n\t\t\tdocument.body.style.overflow = \"hidden\";\n\t\t\treturn () => {\n\t\t\t\tdocument.body.style.overflow = \"\";\n\t\t\t};\n\t\t}\n\n\t\tconst scrollY = window.scrollY;\n\t\tdocument.body.style.overflow = \"hidden\";\n\t\tdocument.body.style.position = \"fixed\";\n\t\tdocument.body.style.top = `-${scrollY}px`;\n\t\tdocument.body.style.width = \"100%\";\n\t\treturn () => {\n\t\t\tdocument.body.style.overflow = \"\";\n\t\t\tdocument.body.style.position = \"\";\n\t\t\tdocument.body.style.top = \"\";\n\t\t\tdocument.body.style.width = \"\";\n\t\t\twindow.scrollTo(0, scrollY);\n\t\t};\n\t}, [lock, strategy]);\n}\n","import { type RefObject, useEffect } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n\t'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Traps keyboard focus inside the referenced element while `active` is true.\n * On activation the first focusable child receives focus.\n * On deactivation focus returns to the element that was focused before the trap.\n */\nexport function useFocusTrap(ref: RefObject<HTMLElement | null>, active: boolean): void {\n\tuseEffect(() => {\n\t\tif (!active || !ref.current) return;\n\n\t\tconst container = ref.current;\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\n\t\tconst focusables = () =>\n\t\t\tArray.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n\n\t\t// Focus first element on activation\n\t\tconst first = focusables()[0];\n\t\tfirst?.focus();\n\n\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: focus trap requires Tab/Shift-Tab × first/last boundary branches\n\t\tfunction handleKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key !== \"Tab\") return;\n\n\t\t\tconst items = focusables();\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst firstItem = items[0];\n\t\t\tconst lastItem = items[items.length - 1];\n\n\t\t\tif (e.shiftKey && document.activeElement === firstItem) {\n\t\t\t\te.preventDefault();\n\t\t\t\tlastItem?.focus();\n\t\t\t} else if (!e.shiftKey && document.activeElement === lastItem) {\n\t\t\t\te.preventDefault();\n\t\t\t\tfirstItem?.focus();\n\t\t\t}\n\t\t}\n\n\t\tcontainer.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => {\n\t\t\tcontainer.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tpreviouslyFocused?.focus();\n\t\t};\n\t}, [active, ref]);\n}\n","@layer ds-components {\n\t/*\n\t * Zero-specificity baseline so any consumer-supplied className (Dialog,\n\t * Toast, UserNotification, OverlayMessage) overrides every property here. This lets\n\t * each consumer keep its exact existing look while CloseButton provides a\n\t * sane standalone default (transparent bg, min target size, focus ring).\n\t */\n\t:where(.closeButton) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\ttransition:\n\t\t\tbackground-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tcolor var(--ds-duration-fast) var(--ds-ease-out);\n\t}\n\n\t:where(.closeButton):focus-visible {\n\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\toutline-offset: var(--ds-focus-offset);\n\t}\n}\n","import { cn } from \"../../utils/cn\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./CloseButton.module.css\";\n\nexport interface CloseButtonProps {\n\tonClick?: () => void;\n\t/** Accessible name for the dismiss button. */\n\tlabel?: string;\n\t/** Icon size in px (also drives the rendered close glyph size). */\n\tsize?: number;\n\t/** Consumer class applied alongside the zero-specificity baseline, so the\n\t * host component's exact look is preserved. */\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Internal dismiss-button primitive. NOT part of the public API — used to\n * de-duplicate the bespoke close buttons across Dialog, Toast, UserNotification and\n * OverlayMessage. Renders a single native `<button>` containing the canonical\n * `close-outline` icon.\n */\nexport function CloseButton({\n\tonClick,\n\tlabel = \"Cerrar\",\n\tsize = 20,\n\tclassName,\n\t\"data-testid\": testId,\n}: CloseButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(styles.closeButton, className)}\n\t\t\tonClick={onClick}\n\t\t\taria-label={label}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<Icon name=\"close-outline\" size={size} aria-hidden=\"true\" />\n\t\t</button>\n\t);\n}\n","@layer ds-components {\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ds-z-modal);\n background-color: var(--ds-color-surface-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--ds-space-4);\n animation: ds-fade-in var(--ds-duration-fast) var(--ds-ease-out);\n }\n\n .overlayBackdrop {\n position: absolute;\n inset: 0;\n background: transparent;\n border: none;\n cursor: default;\n padding: 0;\n }\n\n .dialog {\n position: relative;\n background-color: var(--ds-color-surface);\n border-radius: var(--ds-radius-xl);\n box-shadow: var(--ds-shadow-xl);\n display: flex;\n flex-direction: column;\n max-height: calc(100dvh - 2 * var(--ds-space-4));\n overflow: hidden;\n animation: ds-dialog-open var(--ds-duration-base) var(--ds-ease-spring);\n\n /* Remove default focus ring from programmatic focus */\n &:focus {\n outline: none;\n }\n\n &[data-size=\"small\"] {\n width: 100%;\n max-width: 400px;\n }\n\n &[data-size=\"medium\"] {\n width: 100%;\n max-width: 560px;\n }\n\n &[data-size=\"large\"] {\n width: 100%;\n max-width: 800px;\n }\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-3);\n padding: var(--ds-space-6) var(--ds-space-6) var(--ds-space-4);\n border-bottom: 1px solid var(--ds-color-border);\n flex-shrink: 0;\n }\n\n .title {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-xl);\n font-weight: var(--ds-font-weight-bold);\n line-height: var(--ds-leading-tight);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--ds-color-text-muted);\n border-radius: var(--ds-radius-md);\n transition:\n background-color var(--ds-duration-fast) var(--ds-ease-out),\n color var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover {\n background-color: var(--ds-color-gray-100);\n color: var(--ds-color-text);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 1px;\n }\n }\n\n .body {\n padding: var(--ds-space-6);\n overflow-y: auto;\n flex: 1;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useScrollLock } from \"../../hooks/useScrollLock\";\nimport { useFocusTrap } from \"../../utils/focusTrap\";\nimport { CloseButton } from \"../CloseButton\";\nimport styles from \"./Dialog.module.css\";\n\nexport type DialogSize = \"small\" | \"medium\" | \"large\";\n\nexport interface DialogProps {\n\topen: boolean;\n\tonClose: () => void;\n\ttitle: string;\n\tchildren: ReactNode;\n\tsize?: DialogSize;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Dialog({\n\topen,\n\tonClose,\n\ttitle,\n\tchildren,\n\tsize = \"medium\",\n\tclassName,\n\t\"data-testid\": testId,\n}: DialogProps) {\n\tconst titleId = useId();\n\tconst dialogRef = useRef<HTMLDivElement>(null);\n\n\t/* ── Lock scroll ── */\n\tuseScrollLock(open);\n\n\t/* ── Focus trap (handles focus save/restore + Tab wrapping) ── */\n\tuseFocusTrap(dialogRef, open);\n\n\t/* ── Escape key ── */\n\tuseEffect(() => {\n\t\tif (!open) return;\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [open, onClose]);\n\n\tif (!open || typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<div className={styles.overlay}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.overlayBackdrop}\n\t\t\t\tonClick={onClose}\n\t\t\t\taria-label=\"Cerrar\"\n\t\t\t\ttabIndex={-1}\n\t\t\t/>\n\n\t\t\t<div\n\t\t\t\tref={dialogRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={titleId}\n\t\t\t\tclassName={[styles.dialog, className].filter(Boolean).join(\" \")}\n\t\t\t\tdata-size={size}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t<div className={styles.header}>\n\t\t\t\t\t<h2 id={titleId} className={styles.title}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<CloseButton\n\t\t\t\t\t\tclassName={styles.closeButton}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tlabel=\"Cerrar diálogo\"\n\t\t\t\t\t\tsize={20}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.body}>{children}</div>\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseDropdownOptions {\n\t/** Number of navigable items. Used to clamp the active index for roving keyboard nav. */\n\titemCount?: number;\n\t/** Called when an item is chosen via keyboard (Enter/Space) at the active index. */\n\tonSelectIndex?: (index: number) => void;\n\t/** Fired after the dropdown opens. */\n\tonOpen?: () => void;\n\t/** Fired after the dropdown closes (any cause: toggle, Escape, outside-click, select). */\n\tonClose?: () => void;\n\t/** When true, toggle/open are no-ops. */\n\tdisabled?: boolean;\n\t/**\n\t * When false, the document `mousedown` outside-click handler is disabled.\n\t * Defaults to true. (Some legacy components historically used `click` instead of\n\t * `mousedown`; this option lets a component skip the shared handler if it must.)\n\t */\n\tcloseOnOutsideClick?: boolean;\n}\n\nexport interface UseDropdownReturn {\n\t/** Whether the dropdown is currently open. */\n\tisOpen: boolean;\n\t/** Attach to the dropdown root: scopes outside-click detection. */\n\tcontainerRef: React.RefObject<HTMLDivElement | null>;\n\t/** Attach to the trigger: focus is returned here on Escape / close. */\n\ttriggerRef: React.RefObject<HTMLButtonElement | null>;\n\t/** Attach to the (possibly portaled) menu element: keeps it \"inside\" for outside-click detection. */\n\tmenuRef: React.RefObject<HTMLDivElement | null>;\n\t/** Index of the keyboard-active item (-1 when none). */\n\tactiveIndex: number;\n\t/** Imperatively set the keyboard-active item index. */\n\tsetActiveIndex: (index: number) => void;\n\t/** Open the dropdown (no-op when disabled). Resets active index to -1. */\n\topen: () => void;\n\t/** Close the dropdown. Resets active index to -1. Does NOT move focus. */\n\tclose: () => void;\n\t/** Close the dropdown AND return focus to the trigger. */\n\tcloseAndFocusTrigger: () => void;\n\t/** Toggle open/closed (no-op when disabled). */\n\ttoggle: () => void;\n\t/**\n\t * Roving keyboard handler modeled on DropdownButton's interaction:\n\t * - closed: Enter/Space/ArrowDown open and focus the first item\n\t * - open: ArrowDown/ArrowUp move the active index (clamped), Home/End jump to ends,\n\t * Enter/Space select the active item, Escape closes + returns focus, Tab closes.\n\t * Components that own a different keyboard model can ignore this and use the\n\t * primitives (open/close/activeIndex) directly.\n\t */\n\thandleTriggerKeyDown: (e: React.KeyboardEvent) => void;\n}\n\n/**\n * Shared, headless dropdown interaction core. Internal — NOT part of the public API.\n *\n * Models the canonical Toteat dropdown UX used by `DropdownButton` (TRM login's\n * `LanguageSelector`): open/close/toggle, document outside-click-to-close, Escape-to-close,\n * roving Arrow/Home/End keyboard navigation with an active index, Enter/Space to select,\n * and focus-return-to-trigger on close.\n *\n * Markup, ARIA, and selection semantics stay in the consuming component; this hook owns\n * only the behaviour that every dropdown shares.\n */\nexport function useDropdown(options: UseDropdownOptions = {}): UseDropdownReturn {\n\tconst {\n\t\titemCount = 0,\n\t\tonSelectIndex,\n\t\tonOpen,\n\t\tonClose,\n\t\tdisabled = false,\n\t\tcloseOnOutsideClick = true,\n\t} = options;\n\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [activeIndex, setActiveIndex] = useState(-1);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLButtonElement>(null);\n\tconst menuRef = useRef<HTMLDivElement>(null);\n\n\t// Keep callbacks in refs so the document listeners never need to re-bind on\n\t// every render (and so we don't churn the effect dependency arrays).\n\tconst onCloseRef = useRef(onClose);\n\tonCloseRef.current = onClose;\n\tconst onSelectIndexRef = useRef(onSelectIndex);\n\tonSelectIndexRef.current = onSelectIndex;\n\n\tconst open = useCallback(() => {\n\t\tif (disabled) return;\n\t\tsetIsOpen(true);\n\t\tsetActiveIndex(-1);\n\t\tonOpen?.();\n\t}, [disabled, onOpen]);\n\n\tconst close = useCallback(() => {\n\t\tsetIsOpen(false);\n\t\tsetActiveIndex(-1);\n\t\tonCloseRef.current?.();\n\t}, []);\n\n\tconst closeAndFocusTrigger = useCallback(() => {\n\t\tclose();\n\t\ttriggerRef.current?.focus();\n\t}, [close]);\n\n\tconst toggle = useCallback(() => {\n\t\tif (disabled) return;\n\t\tsetIsOpen((wasOpen) => {\n\t\t\tconst next = !wasOpen;\n\t\t\tsetActiveIndex(-1);\n\t\t\tif (next) onOpen?.();\n\t\t\telse onCloseRef.current?.();\n\t\t\treturn next;\n\t\t});\n\t}, [disabled, onOpen]);\n\n\t// Outside-click (document mousedown) closes the dropdown.\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnOutsideClick) return;\n\t\tfunction handlePointerDown(e: MouseEvent) {\n\t\t\tconst target = e.target as Node;\n\t\t\tconst insideContainer = containerRef.current?.contains(target) ?? false;\n\t\t\tconst insideMenu = menuRef.current?.contains(target) ?? false;\n\t\t\tif (insideContainer || insideMenu) return;\n\t\t\tsetIsOpen(false);\n\t\t\tsetActiveIndex(-1);\n\t\t\tonCloseRef.current?.();\n\t\t}\n\t\tdocument.addEventListener(\"mousedown\", handlePointerDown);\n\t\treturn () => document.removeEventListener(\"mousedown\", handlePointerDown);\n\t}, [isOpen, closeOnOutsideClick]);\n\n\tconst handleTriggerKeyDown = useCallback(\n\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: keyboard nav requires a branch per key × open/closed state\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (!isOpen) {\n\t\t\t\tif (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\topen();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? 0 : -1);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tcloseAndFocusTrigger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => Math.min(i + 1, itemCount - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? 0 : -1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? itemCount - 1 : -1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Enter\":\n\t\t\t\tcase \" \":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (activeIndex >= 0) onSelectIndexRef.current?.(activeIndex);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Tab\":\n\t\t\t\t\tclose();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[isOpen, itemCount, activeIndex, open, close, closeAndFocusTrigger],\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\tmenuRef,\n\t\tactiveIndex,\n\t\tsetActiveIndex,\n\t\topen,\n\t\tclose,\n\t\tcloseAndFocusTrigger,\n\t\ttoggle,\n\t\thandleTriggerKeyDown,\n\t};\n}\n","import type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function portal(children: ReactNode, container?: Element): ReturnType<typeof createPortal> {\n\treturn createPortal(children, container ?? document.body);\n}\n","@layer ds-components {\n .root {\n position: relative;\n display: inline-block;\n\n /* ── Trigger button ── */\n .trigger {\n display: flex;\n align-items: center;\n gap: 0;\n border: none;\n border-radius: var(--ds-radius-full);\n font-weight: var(--ds-font-weight-semibold);\n font-family: inherit;\n cursor: pointer;\n transition: opacity 200ms ease-in-out;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n user-select: none;\n\n &:hover:not(:disabled) {\n opacity: 0.85;\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-focus-color, var(--ds-color-primary));\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n filter: grayscale(1) opacity(0.3);\n }\n }\n\n .triggerText {\n white-space: nowrap;\n }\n\n /* Separator between text and chevron */\n .separator {\n width: 1px;\n align-self: stretch;\n }\n\n .iconWrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .root .iconWrapper svg {\n transition: transform 200ms ease-out;\n }\n\n /* ── Variants ── */\n &[data-variant=\"primary\"] {\n .trigger {\n background-color: var(--ds-color-info);\n color: var(--ds-color-white);\n }\n .separator {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n\n &[data-variant=\"ghost\"] {\n .trigger {\n background-color: transparent;\n color: var(--ds-color-text-muted);\n border: 1px solid var(--ds-color-border);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n color: var(--ds-color-text);\n opacity: 1;\n }\n }\n .separator {\n background-color: var(--ds-color-border);\n }\n }\n\n /* ── Sizes ── */\n &[data-size=\"tiny\"] {\n .trigger {\n font-size: var(--ds-font-size-xs);\n min-height: 1.75rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-3);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-2);\n }\n .separator {\n margin: var(--ds-space-1) 0;\n }\n }\n\n &[data-size=\"small\"] {\n .trigger {\n font-size: var(--ds-font-size-sm);\n min-height: 2.25rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-3);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-2);\n }\n .separator {\n margin: var(--ds-space-1) 0;\n }\n }\n\n &[data-size=\"medium\"] {\n .trigger {\n font-size: var(--ds-font-size-base);\n min-height: 3rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-4);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-3);\n }\n .separator {\n margin: var(--ds-space-2) 0;\n }\n }\n\n &[data-size=\"large\"] {\n .trigger {\n font-size: var(--ds-font-size-lg);\n min-height: 4rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-6);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-4);\n }\n .separator {\n margin: var(--ds-space-2) 0;\n }\n }\n\n /* Chevron rotates when open */\n &[data-open] .iconWrapper svg {\n transform: rotate(180deg);\n }\n }\n\n /* ── Dropdown menu (portaled to document.body, position: fixed) ── */\n .menu {\n position: fixed;\n z-index: 1000;\n min-width: max-content;\n background-color: var(--ds-color-surface);\n border: 1.5px solid var(--ds-color-border);\n border-radius: var(--ds-radius-lg);\n box-shadow: var(--ds-shadow-lg);\n padding: var(--ds-space-1) 0;\n list-style: none;\n overflow: hidden;\n animation: menuEnter 150ms ease-out;\n }\n\n .menuItem {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n padding: var(--ds-space-2) var(--ds-space-4);\n font-size: var(--ds-font-size-sm);\n font-family: inherit;\n text-align: left;\n background: none;\n cursor: pointer;\n color: var(--ds-color-text);\n transition: background-color 150ms ease-in-out;\n white-space: nowrap;\n\n &:hover:not([data-disabled]) {\n background-color: var(--ds-color-gray-100);\n }\n\n &[data-disabled] {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n &[data-focused] {\n background-color: var(--ds-color-gray-100);\n }\n }\n\n .menuIcon {\n flex-shrink: 0;\n }\n\n .menuLabel {\n flex: 1;\n }\n\n @keyframes menuEnter {\n from {\n opacity: 0;\n transform: scaleY(0.95) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scaleY(1) translateY(0);\n }\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport { cn } from \"../../utils/cn\";\nimport { portal } from \"../../utils/portal\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./DropdownButton.module.css\";\n\nexport interface DropdownMenuItemType {\n\tvalue: string;\n\tlabel: string;\n\ticon?: IconNameType;\n\tdisabled?: boolean;\n}\n\nexport interface DropdownButtonProps {\n\ttext: string;\n\tmenuItems: DropdownMenuItemType[];\n\tsize?: \"tiny\" | \"small\" | \"medium\" | \"large\";\n\tvariant?: \"primary\" | \"ghost\";\n\tdisabled?: boolean;\n\tonSelect?: (item: DropdownMenuItemType) => void;\n\tonOpen?: () => void;\n\tonClose?: () => void;\n\t\"data-testid\"?: string;\n}\n\nconst ICON_SIZE: Record<NonNullable<DropdownButtonProps[\"size\"]>, number> = {\n\ttiny: 14,\n\tsmall: 16,\n\tmedium: 20,\n\tlarge: 24,\n};\n\n/** Gap between trigger bottom and menu top (px). */\nconst MENU_GAP = 4;\n\n/** Minimum clearance between menu edge and viewport edge (px). */\nconst VIEWPORT_GUTTER = 8;\n\ninterface TriggerRect {\n\ttop: number;\n\tbottom: number;\n\tleft: number;\n\twidth: number;\n}\n\ninterface MenuSize {\n\twidth: number;\n\theight: number;\n}\n\ninterface ViewportSize {\n\twidth: number;\n\theight: number;\n}\n\ninterface MenuPosition {\n\ttop: number;\n\tleft: number;\n\tplacement: \"top\" | \"bottom\";\n}\n\n/**\n * Compute fixed viewport-aware position for the portaled menu.\n * Exported for unit tests: placement values (\"top\"/\"bottom\") are written to\n * the menu's data-placement attribute and drive the CSS enter animation direction.\n */\nexport function computeMenuPosition(\n\ttrigger: TriggerRect,\n\tmenu: MenuSize,\n\tviewport: ViewportSize,\n): MenuPosition {\n\t// Prefer above (top); flip to below (bottom) only when there isn't room above.\n\tconst fitsAbove = trigger.top - MENU_GAP - menu.height >= VIEWPORT_GUTTER;\n\tconst fitsBelow = trigger.bottom + MENU_GAP + menu.height <= viewport.height - VIEWPORT_GUTTER;\n\tconst placement: \"top\" | \"bottom\" = fitsAbove || !fitsBelow ? \"top\" : \"bottom\";\n\n\tconst top =\n\t\tplacement === \"top\" ? trigger.top - MENU_GAP - menu.height : trigger.bottom + MENU_GAP;\n\n\tconst centeredLeft = trigger.left + trigger.width / 2 - menu.width / 2;\n\tconst maxLeft = viewport.width - VIEWPORT_GUTTER - menu.width;\n\tconst left = Math.max(VIEWPORT_GUTTER, Math.min(centeredLeft, maxLeft));\n\n\treturn { top, left, placement };\n}\n\nexport function DropdownButton({\n\ttext,\n\tmenuItems,\n\tsize = \"medium\",\n\tvariant = \"primary\",\n\tdisabled = false,\n\tonSelect,\n\tonOpen,\n\tonClose,\n\t\"data-testid\": testId,\n}: DropdownButtonProps) {\n\tfunction selectItem(item: DropdownMenuItemType) {\n\t\tif (item.disabled) return;\n\t\tonSelect?.(item);\n\t\tclose();\n\t}\n\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef: buttonRef,\n\t\tmenuRef,\n\t\tactiveIndex: focusedIndex,\n\t\tclose,\n\t\ttoggle,\n\t\thandleTriggerKeyDown: handleKeyDown,\n\t} = useDropdown({\n\t\titemCount: menuItems.length,\n\t\tdisabled,\n\t\tonOpen,\n\t\tonClose,\n\t\tonSelectIndex: (index) => {\n\t\t\tconst item = menuItems[index];\n\t\t\tif (item && !item.disabled) selectItem(item);\n\t\t},\n\t});\n\n\tconst [menuPos, setMenuPos] = useState<{\n\t\ttop: number;\n\t\tleft: number;\n\t\tplacement: \"top\" | \"bottom\";\n\t} | null>(null);\n\tconst [menuTheme, setMenuTheme] = useState<string | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetMenuPos(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst theme = buttonRef.current?.closest<HTMLElement>(\"[data-theme]\")?.dataset.theme;\n\t\tsetMenuTheme(theme);\n\n\t\tfunction measure() {\n\t\t\tconst triggerEl = buttonRef.current;\n\t\t\tconst menuEl = menuRef.current;\n\t\t\tif (!triggerEl || !menuEl) return;\n\n\t\t\tconst triggerRect = triggerEl.getBoundingClientRect();\n\n\t\t\tconst pos = computeMenuPosition(\n\t\t\t\t{\n\t\t\t\t\ttop: triggerRect.top,\n\t\t\t\t\tbottom: triggerRect.bottom,\n\t\t\t\t\tleft: triggerRect.left,\n\t\t\t\t\twidth: triggerRect.width,\n\t\t\t\t},\n\t\t\t\t// Use offsetWidth/offsetHeight (layout size) instead of getBoundingClientRect\n\t\t\t\t// so the CSS scaleY transform on the menuEnter keyframe doesn't skew measurements.\n\t\t\t\t{ width: menuEl.offsetWidth, height: menuEl.offsetHeight },\n\t\t\t\t{ width: window.innerWidth, height: window.innerHeight },\n\t\t\t);\n\n\t\t\tsetMenuPos(pos);\n\t\t}\n\n\t\t// First measure (menu just mounted, visibility:hidden).\n\t\tmeasure();\n\n\t\twindow.addEventListener(\"scroll\", measure, { capture: true, passive: true });\n\t\twindow.addEventListener(\"resize\", measure, { passive: true });\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"scroll\", measure, { capture: true });\n\t\t\twindow.removeEventListener(\"resize\", measure);\n\t\t};\n\t}, [isOpen, buttonRef, menuRef]);\n\n\tconst iconSize = ICON_SIZE[size];\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.root}\n\t\t\tdata-size={size}\n\t\t\tdata-variant={variant}\n\t\t\tdata-open={isOpen || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={buttonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\tonClick={toggle}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t>\n\t\t\t\t<span className={styles.triggerText}>{text}</span>\n\t\t\t\t<span className={styles.separator} aria-hidden=\"true\" />\n\t\t\t\t<span className={styles.iconWrapper}>\n\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={iconSize} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t{isOpen &&\n\t\t\t\tportal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={menuRef}\n\t\t\t\t\t\tclassName={cn(\"tot-ds-root\", styles.menu)}\n\t\t\t\t\t\tdata-theme={menuTheme || undefined}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\taria-label={`${text} options`}\n\t\t\t\t\t\tdata-placement={menuPos?.placement ?? \"top\"}\n\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\tmenuPos\n\t\t\t\t\t\t\t\t? { top: menuPos.top, left: menuPos.left, visibility: \"visible\" }\n\t\t\t\t\t\t\t\t: { visibility: \"hidden\" }\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{menuItems.map((item, index) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\tclassName={styles.menuItem}\n\t\t\t\t\t\t\t\tdata-focused={focusedIndex === index || undefined}\n\t\t\t\t\t\t\t\tdata-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={false}\n\t\t\t\t\t\t\t\ttabIndex={isOpen ? 0 : -1}\n\t\t\t\t\t\t\t\tonClick={() => selectItem(item)}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tselectItem(item);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.icon && (\n\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\tname={item.icon}\n\t\t\t\t\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.menuIcon}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className={styles.menuLabel}>{item.label}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>,\n\t\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n\n\t/* ── Trigger wrapper (accessible button) ── */\n\t.triggerWrapper {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tcolor: inherit;\n\t}\n\n\t/* ── Menu panel ── */\n\t.menu {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tz-index: var(--z-dropdown);\n\t\tmin-width: 160px;\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\toverflow: hidden;\n\t\tpadding: var(--spacing-xs) 0;\n\t}\n\n\t/* ── Alignment ── */\n\t.menu[data-align=\"left\"] {\n\t\tleft: 0;\n\t}\n\n\t.menu[data-align=\"right\"] {\n\t\tright: 0;\n\t}\n\n\t/* ── Menu items ── */\n\t.menuItem {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tbackground: none;\n\t\tborder: none;\n\t\ttext-align: left;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-normal);\n\t\tcolor: var(--color-text);\n\t\tcursor: pointer;\n\t\tline-height: var(--leading-normal);\n\t\twhite-space: nowrap;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t/* ── Danger variant ── */\n\t.menuItem[data-danger] {\n\t\tcolor: var(--color-error);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-error-light);\n\t\t}\n\t}\n\n\t/* ── Icon slot ── */\n\t.icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 16px;\n\t\theight: 16px;\n\t\tcolor: inherit;\n\t}\n}\n","import { type ReactElement, type ReactNode, useEffect, useRef } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport styles from \"./DropdownMenu.module.css\";\n\nexport interface DropdownMenuItem {\n\tid: string;\n\tlabel: string;\n\ticon?: ReactNode;\n\tonClick: () => void;\n\tdanger?: boolean;\n\tdisabled?: boolean;\n}\n\nexport interface DropdownMenuProps {\n\ttrigger: ReactNode;\n\titems: DropdownMenuItem[];\n\talign?: \"left\" | \"right\";\n\t\"data-testid\"?: string;\n}\n\nexport function DropdownMenu({\n\ttrigger,\n\titems,\n\talign = \"left\",\n\t\"data-testid\": testId,\n}: DropdownMenuProps): ReactElement {\n\tconst itemRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n\t// Shared dropdown core: open state, outside-click (mousedown), focus-return-to-trigger.\n\t// DropdownMenu keeps its own DOM-focus roving keyboard model (real focus on each\n\t// <menuitem> with wrap-around + Home/End), so the hook's active-index nav is unused here.\n\tconst { isOpen, containerRef, triggerRef, toggle, close, closeAndFocusTrigger } = useDropdown();\n\n\t// Focus first enabled item when menu opens\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst firstEnabled = items.find((item) => !item.disabled);\n\t\tif (firstEnabled) itemRefs.current.get(firstEnabled.id)?.focus();\n\t}, [isOpen, items]);\n\n\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: keyboard nav requires a branch per key\n\tconst handleMenuKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.preventDefault();\n\t\t\tcloseAndFocusTrigger();\n\t\t\treturn;\n\t\t}\n\n\t\tconst enabledItems = items.filter((item) => !item.disabled);\n\t\tconst enabledIds = enabledItems.map((item) => item.id);\n\t\tconst focused = document.activeElement as HTMLButtonElement;\n\t\tconst focusedId = [...itemRefs.current.entries()].find(([, el]) => el === focused)?.[0];\n\t\tconst currentIndex = focusedId ? enabledIds.indexOf(focusedId) : -1;\n\n\t\tlet targetId: string | undefined;\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentIndex + 1) % enabledIds.length];\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentIndex - 1 + enabledIds.length) % enabledIds.length];\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[0];\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[enabledIds.length - 1];\n\t\t}\n\n\t\tif (targetId) itemRefs.current.get(targetId)?.focus();\n\t};\n\n\treturn (\n\t\t<div ref={containerRef} className={styles.container} data-testid={testId}>\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.triggerWrapper}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t>\n\t\t\t\t{trigger}\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div className={styles.menu} data-align={align} role=\"menu\" onKeyDown={handleMenuKeyDown}>\n\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(item.id, el);\n\t\t\t\t\t\t\t\telse itemRefs.current.delete(item.id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\tclassName={styles.menuItem}\n\t\t\t\t\t\t\tdata-danger={item.danger || undefined}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\titem.onClick();\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.icon && <span className={styles.icon}>{item.icon}</span>}\n\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .skeleton {\n display: block;\n background: linear-gradient(\n 90deg,\n var(--ds-color-gray-100) 25%,\n var(--ds-color-gray-200) 50%,\n var(--ds-color-gray-100) 75%\n );\n background-size: 200% 100%;\n animation: ds-skeleton-shimmer 1.5s ease-in-out infinite;\n }\n\n .skeleton[data-variant=\"text\"] {\n height: 1em;\n border-radius: var(--ds-radius-sm);\n\n &:not([style*=\"width\"]) {\n width: 100%;\n }\n }\n\n .skeleton[data-variant=\"circular\"] {\n border-radius: var(--ds-radius-circle);\n }\n\n .skeleton[data-variant=\"rectangular\"] {\n border-radius: var(--ds-radius-md);\n }\n}\n","import styles from \"./Skeleton.module.css\";\n\nexport type SkeletonVariant = \"text\" | \"circular\" | \"rectangular\";\n\nexport interface SkeletonProps {\n\twidth?: string | number;\n\theight?: string | number;\n\tvariant?: SkeletonVariant;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nfunction toCssValue(val: string | number | undefined): string | undefined {\n\tif (val === undefined) return undefined;\n\treturn typeof val === \"number\" ? `${val}px` : val;\n}\n\nexport function Skeleton({\n\twidth,\n\theight,\n\tvariant = \"rectangular\",\n\tclassName,\n\t\"data-testid\": testId,\n}: SkeletonProps) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={[styles.skeleton, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\tdata-testid={testId}\n\t\t\tstyle={{\n\t\t\t\twidth: toCssValue(width),\n\t\t\t\theight: toCssValue(height),\n\t\t\t}}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t.imagePreview {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground-color: var(--color-neutral-100);\n\t\toverflow: hidden;\n\t\tflex-shrink: 0;\n\t\twidth: var(--ip-width, 40px);\n\t\theight: var(--ip-height, 40px);\n\t\tborder-radius: var(--ip-radius, 8px);\n\n\t\t& img {\n\t\t\tobject-fit: cover;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\t}\n\n\t.hidden {\n\t\topacity: 0;\n\t\tposition: absolute;\n\t\tpointer-events: none;\n\t}\n\n\t.errorIcon {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcolor: var(--color-neutral-300);\n\t}\n}\n","import { useEffect, useState } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\nimport styles from \"./ImagePreview.module.css\";\n\nexport interface ImagePreviewProps {\n\timageSrc: string;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n\tborderRadius?: number;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\ntype LoadState = \"loading\" | \"loaded\" | \"error\";\n\nfunction isBase64Image(src: string): boolean {\n\treturn src.startsWith(\"data:image/\");\n}\n\nfunction isValidUrl(src: string): boolean {\n\ttry {\n\t\tnew URL(src);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function ImagePreview({\n\timageSrc,\n\twidth = 40,\n\theight = 40,\n\talt = \"Image without alt text\",\n\tborderRadius = 8,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: ImagePreviewProps) {\n\tconst [state, setState] = useState<LoadState>(() => (!imageSrc ? \"error\" : \"loading\"));\n\n\tuseEffect(() => {\n\t\tif (!imageSrc) {\n\t\t\tsetState(\"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isBase64Image(imageSrc) && !isValidUrl(imageSrc)) {\n\t\t\tsetState(\"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (isBase64Image(imageSrc)) {\n\t\t\tsetState(\"loaded\");\n\t\t\treturn;\n\t\t}\n\n\t\tsetState(\"loading\");\n\t\tconst img = new Image();\n\t\timg.onload = () => setState(\"loaded\");\n\t\timg.onerror = () => setState(\"error\");\n\t\timg.src = imageSrc;\n\t\treturn () => {\n\t\t\timg.onload = null;\n\t\t\timg.onerror = null;\n\t\t};\n\t}, [imageSrc]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.imagePreview, className].filter(Boolean).join(\" \")}\n\t\t\tdata-state={state}\n\t\t\tdata-testid={dataTestId}\n\t\t\trole={state === \"error\" ? \"img\" : undefined}\n\t\t\taria-label={state === \"error\" ? \"Image failed to load\" : undefined}\n\t\t\tstyle={\n\t\t\t\t{\n\t\t\t\t\t\"--ip-width\": `${width}px`,\n\t\t\t\t\t\"--ip-height\": `${height}px`,\n\t\t\t\t\t\"--ip-radius\": `${borderRadius}px`,\n\t\t\t\t} as React.CSSProperties\n\t\t\t}\n\t\t>\n\t\t\t{state !== \"error\" && (\n\t\t\t\t<img\n\t\t\t\t\tsrc={imageSrc}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\tloading={isBase64Image(imageSrc) ? undefined : \"lazy\"}\n\t\t\t\t\tclassName={state === \"loading\" ? styles.hidden : undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{state === \"loading\" && <Skeleton width={width} height={height} />}\n\t\t\t{state === \"error\" && (\n\t\t\t\t<span className={styles.errorIcon}>\n\t\t\t\t\t<Icon name=\"error-outline\" size={Math.round(width * 0.6)} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-2xl);\n\t\twidth: 100%;\n\t}\n\n\t.previewGrid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(auto-fill, minmax(70px, 1fr));\n\t\tgap: var(--spacing-xl);\n\t\twidth: 100%;\n\t\tjustify-items: center;\n\t}\n\n\t.previewBtn {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-xs) 0.125rem 0.5rem;\n\t\tborder: none;\n\t\tborder-radius: var(--radius-lg);\n\t\tbackground-color: transparent;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground-color var(--duration-fast) var(--ease-out),\n\t\t\ttransform var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t\ttransform: scale(1.25);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t.zone {\n\t\tborder: 0.125rem dashed var(--color-neutral-300);\n\t\tborder-radius: var(--radius-lg);\n\t\tpadding: var(--spacing-2xl);\n\t\ttext-align: center;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast),\n\t\t\tbackground var(--duration-fast),\n\t\t\topacity var(--duration-fast);\n\t\tbackground: var(--color-neutral-100);\n\t\toutline: none;\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t&:hover {\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t&[data-dragging] {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbackground: var(--color-primary-50);\n\t\t}\n\n\t\t&[data-processing] {\n\t\t\topacity: 0.6;\n\t\t\tcursor: wait;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 2px;\n\t\t}\n\t}\n\n\t.input {\n\t\tdisplay: none;\n\t}\n\n\t.zoneLabel {\n\t\tdisplay: block;\n\t\tmargin-top: var(--spacing-sm);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-secondary);\n\t}\n\n\t.description {\n\t\tfont-size: var(--text-xs);\n\t\tcolor: var(--color-neutral-400);\n\t\tmargin: 0;\n\t}\n\n\t.fileList {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\tgap: var(--spacing-sm);\n\t\twidth: 100%;\n\t}\n}\n","export type AllowedFileTypes = \"images\" | \"video\" | \"text\" | \"spreadsheet\";\n\nexport const ALLOWED_TYPES_MAP: Record<AllowedFileTypes, { types: string[]; mimeTypes: string[] }> =\n\t{\n\t\timages: {\n\t\t\ttypes: [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"heif\"],\n\t\t\tmimeTypes: [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\", \"image/heic\", \"image/heif\"],\n\t\t},\n\t\tvideo: {\n\t\t\ttypes: [\"mp4\", \"mov\", \"webm\"],\n\t\t\tmimeTypes: [\"video/mp4\", \"video/quicktime\", \"video/webm\"],\n\t\t},\n\t\ttext: {\n\t\t\ttypes: [\"csv\"],\n\t\t\tmimeTypes: [\"text/csv\", \"text/plain\"],\n\t\t},\n\t\tspreadsheet: {\n\t\t\ttypes: [\"xls\", \"xlsx\"],\n\t\t\tmimeTypes: [\n\t\t\t\t\"application/vnd.ms-excel\",\n\t\t\t\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n\t\t\t],\n\t\t},\n\t};\n\nexport function getAllowedMimeTypes(fileType: AllowedFileTypes): string {\n\treturn ALLOWED_TYPES_MAP[fileType].mimeTypes.join(\",\");\n}\n\nexport function validateFiles(files: FileList, allowedFileTypes: AllowedFileTypes): File[] {\n\tconst { types, mimeTypes } = ALLOWED_TYPES_MAP[allowedFileTypes];\n\treturn Array.from(files).filter((file) => {\n\t\tconst mimeMatch = mimeTypes.some((m) => file.type === m);\n\t\tconst extMatch = types.some((t) => file.name.toLowerCase().endsWith(`.${t}`));\n\t\treturn mimeMatch || extMatch;\n\t});\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { ImagePreview } from \"../ImagePreview\";\nimport styles from \"./DropZone.module.css\";\nimport type { AllowedFileTypes } from \"./dropZoneConstants\";\nimport { ALLOWED_TYPES_MAP, getAllowedMimeTypes, validateFiles } from \"./dropZoneConstants\";\n\nexport interface FileWithPreview {\n\tid: string;\n\tfile: File;\n\tname: string;\n\tpreview: string;\n}\n\nexport interface DropZoneProps {\n\tlabel?: string;\n\tallowedFileTypes?: AllowedFileTypes;\n\tmultiple?: boolean;\n\tdisplayPreview?: boolean;\n\tdisplayFileList?: boolean;\n\tvalue?: FileWithPreview[] | null;\n\tonDrop: (files: FileList) => void;\n\tonDropError?: (message: string) => void;\n\tonRemove?: (file: FileWithPreview) => void;\n\tonChange?: (files: FileWithPreview[]) => void;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nasync function buildPreview(file: File, isImage: boolean): Promise<string> {\n\tif (!isImage) return \"\";\n\treturn new Promise((resolve) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = (e) => resolve((e.target?.result as string) ?? \"\");\n\t\treader.readAsDataURL(file);\n\t});\n}\n\nasync function buildFileEntries(valid: File[], isImage: boolean): Promise<FileWithPreview[]> {\n\treturn Promise.all(\n\t\tvalid.map(async (file) => ({\n\t\t\tid: crypto.randomUUID(),\n\t\t\tfile,\n\t\t\tname: file.name,\n\t\t\tpreview: await buildPreview(file, isImage),\n\t\t})),\n\t);\n}\n\nexport function DropZone({\n\tlabel = \"Haz click o arrastra un archivo para subir\",\n\tallowedFileTypes = \"images\",\n\tmultiple = true,\n\tdisplayPreview = true,\n\tdisplayFileList = false,\n\tvalue,\n\tonDrop,\n\tonDropError,\n\tonRemove,\n\tonChange,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: DropZoneProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [isProcessing, setIsProcessing] = useState(false);\n\tconst [internalFiles, setInternalFiles] = useState<FileWithPreview[]>(value ?? []);\n\n\tuseEffect(() => {\n\t\tif (value !== undefined) setInternalFiles(value ?? []);\n\t}, [value]);\n\n\tconst files = value !== undefined ? (value ?? []) : internalFiles;\n\tconst showFileList =\n\t\t(displayFileList || (!displayPreview && !displayFileList)) && files.length > 0;\n\tconst extensions = ALLOWED_TYPES_MAP[allowedFileTypes].types;\n\tconst mimeAccept = getAllowedMimeTypes(allowedFileTypes);\n\tconst isImageType = allowedFileTypes === \"images\";\n\n\tasync function applyFiles(valid: File[], list: FileList) {\n\t\tif (valid.length === 0) {\n\t\t\tonDropError?.(`No files match the allowed types: ${allowedFileTypes}`);\n\t\t\treturn;\n\t\t}\n\t\tconst processed = await buildFileEntries(valid, isImageType);\n\t\tconst next = multiple ? [...files, ...processed] : processed;\n\t\tif (value === undefined) setInternalFiles(next);\n\t\tonChange?.(next);\n\t\tonDrop(list);\n\t}\n\n\tasync function processFiles(list: FileList) {\n\t\tif (isProcessing) return;\n\t\tsetIsProcessing(true);\n\t\ttry {\n\t\t\tawait applyFiles(validateFiles(list, allowedFileTypes), list);\n\t\t} catch (err) {\n\t\t\tonDropError?.(err instanceof Error ? err.message : \"Unknown error\");\n\t\t} finally {\n\t\t\tsetIsProcessing(false);\n\t\t}\n\t}\n\n\tfunction removeFile(index: number) {\n\t\tconst removed = files[index];\n\t\tconst next = files.filter((_, i) => i !== index);\n\t\tif (value === undefined) setInternalFiles(next);\n\t\tonChange?.(next);\n\t\tif (removed) onRemove?.(removed);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.container, className].filter(Boolean).join(\" \")}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t{displayPreview && files.length > 0 && (\n\t\t\t\t<div className={styles.previewGrid}>\n\t\t\t\t\t{files.map((f, i) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={f.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={styles.previewBtn}\n\t\t\t\t\t\t\tonClick={() => removeFile(i)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ImagePreview\n\t\t\t\t\t\t\t\timageSrc={f.preview}\n\t\t\t\t\t\t\t\twidth={70}\n\t\t\t\t\t\t\t\theight={70}\n\t\t\t\t\t\t\t\tborderRadius={8}\n\t\t\t\t\t\t\t\talt={f.name}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Icon name=\"delete-outline\" size={14} aria-hidden=\"true\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.zone}\n\t\t\t\tdata-dragging={isDragging ? \"\" : undefined}\n\t\t\t\tdata-processing={isProcessing ? \"\" : undefined}\n\t\t\t\taria-label={label}\n\t\t\t\tonClick={() => inputRef.current?.click()}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") inputRef.current?.click();\n\t\t\t\t}}\n\t\t\t\tonDragOver={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}}\n\t\t\t\tonDragLeave={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(false);\n\t\t\t\t}}\n\t\t\t\tonDrop={async (e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(false);\n\t\t\t\t\tconst dropped = e.dataTransfer?.files;\n\t\t\t\t\tif (dropped?.length) await processFiles(dropped);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Icon name=\"cloud-upload-outline\" size={48} aria-hidden=\"true\" />\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tmultiple={multiple}\n\t\t\t\t\taccept={mimeAccept}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tonChange={async (e) => {\n\t\t\t\t\t\tconst list = e.target.files;\n\t\t\t\t\t\tif (list?.length) await processFiles(list);\n\t\t\t\t\t\te.target.value = \"\";\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<strong className={styles.zoneLabel}>{label}</strong>\n\t\t\t\t<p className={styles.description}>({extensions.join(\", \")})</p>\n\t\t\t</button>\n\n\t\t\t{showFileList && (\n\t\t\t\t<div className={styles.fileList}>\n\t\t\t\t\t{files.map((f, i) => (\n\t\t\t\t\t\t<Button key={f.id} variant=\"outline\" size=\"small\" onClick={() => removeFile(i)}>\n\t\t\t\t\t\t\t{f.name}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type DsTheme = \"toteat-react-ds\" | \"angular-legacy\";\n\nexport interface DsProviderProps {\n\ttheme: DsTheme;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function DsProvider({ theme, children, className, \"data-testid\": testId }: DsProviderProps) {\n\treturn (\n\t\t<div className={cn(\"tot-ds-root\", className)} data-theme={theme} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n",".wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-3);\n padding: var(--ds-space-8) var(--ds-space-4);\n color: var(--ds-color-text-muted);\n}\n\n.message {\n margin: 0;\n font-size: var(--ds-font-size-sm);\n text-align: center;\n}\n","import type React from \"react\";\nimport styles from \"./EmptyState.module.css\";\n\nexport interface EmptyStateProps {\n\tmessage: string;\n\taction?: React.ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function EmptyState({\n\tmessage,\n\taction,\n\t\"data-testid\": testId,\n}: EmptyStateProps): React.ReactElement {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<p className={styles.message}>{message}</p>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .errorContainer {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n padding: var(--ds-space-6);\n }\n\n .errorCard {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-3);\n max-width: 480px;\n text-align: center;\n }\n\n .icon {\n color: var(--ds-color-error);\n flex-shrink: 0;\n }\n\n .title {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-xl);\n font-weight: var(--ds-font-weight-bold);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .message {\n font-size: var(--ds-font-size-base);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin: 0;\n }\n\n .details {\n width: 100%;\n text-align: left;\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n\n summary {\n cursor: pointer;\n font-weight: var(--ds-font-weight-medium);\n padding: var(--ds-space-1) 0;\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n }\n }\n\n .stack {\n margin-top: var(--ds-space-2);\n padding: var(--ds-space-3);\n background-color: var(--ds-color-gray-50);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-md);\n font-size: var(--ds-font-size-xs);\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--ds-color-error);\n }\n\n .retryButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--ds-space-2) var(--ds-space-6);\n background-color: var(--ds-color-primary);\n color: var(--ds-color-text-on-primary);\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-base);\n font-weight: var(--ds-font-weight-semibold);\n border: none;\n border-radius: var(--ds-radius-md);\n cursor: pointer;\n transition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n margin-top: var(--ds-space-2);\n\n &:hover {\n background-color: var(--ds-color-primary-900);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n }\n}\n","/// <reference types=\"node\" />\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport { Component } from \"react\";\nimport styles from \"./ErrorBoundary.module.css\";\n\nexport interface ErrorBoundaryProps {\n\tchildren: ReactNode;\n\tfallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n\tonError?: (error: Error, info: ErrorInfo) => void;\n\t\"data-testid\"?: string;\n}\n\ninterface ErrorBoundaryState {\n\thasError: boolean;\n\terror: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\tcomponentDidCatch(error: Error, info: ErrorInfo) {\n\t\tthis.props.onError?.(error, info);\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tconsole.error(\"[ErrorBoundary] Uncaught error:\", error, info);\n\t\t}\n\t}\n\n\thandleRetry = () => {\n\t\tthis.setState({ hasError: false, error: null });\n\t};\n\n\trender() {\n\t\tconst { hasError, error } = this.state;\n\t\tconst { children, fallback } = this.props;\n\t\tconst testId = this.props[\"data-testid\"];\n\n\t\tif (hasError && error) {\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(error, this.handleRetry);\n\t\t\t}\n\n\t\t\tif (fallback) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<div role=\"alert\" className={styles.errorContainer} data-testid={testId}>\n\t\t\t\t\t<div className={styles.errorCard}>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"48\"\n\t\t\t\t\t\t\theight=\"48\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tclassName={styles.icon}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path 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-3Z\" />\n\t\t\t\t\t\t\t<path d=\"M12 9v4\" />\n\t\t\t\t\t\t\t<path d=\"M12 17h.01\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<h2 className={styles.title}>Algo salió mal</h2>\n\t\t\t\t\t\t<p className={styles.message}>\n\t\t\t\t\t\t\tHa ocurrido un error inesperado. Por favor intenta de nuevo.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{process.env.NODE_ENV !== \"production\" && (\n\t\t\t\t\t\t\t<details className={styles.details}>\n\t\t\t\t\t\t\t\t<summary>Detalle del error</summary>\n\t\t\t\t\t\t\t\t<pre className={styles.stack}>{error.message}</pre>\n\t\t\t\t\t\t\t</details>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button type=\"button\" className={styles.retryButton} onClick={this.handleRetry}>\n\t\t\t\t\t\t\tIntentar de nuevo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn children;\n\t}\n}\n","@layer ds-components {\n .content {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-4);\n }\n\n .category {\n border: none;\n border-bottom: 1px solid var(--ds-color-gray-100);\n padding: 0 0 var(--ds-space-3);\n margin: 0;\n }\n\n .categoryName {\n display: flex;\n align-items: baseline;\n gap: var(--ds-space-2);\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-semibold);\n margin-bottom: var(--ds-space-2);\n padding: 0;\n float: none;\n width: 100%;\n }\n\n .categoryHint {\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-normal);\n color: var(--ds-color-gray-400);\n }\n\n .options {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ds-space-2);\n }\n\n .option {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n padding: var(--ds-space-2) var(--ds-space-3);\n border: 1px solid var(--ds-color-gray-200);\n border-radius: var(--ds-radius-md);\n background: var(--ds-color-white);\n cursor: pointer;\n font-size: var(--ds-font-size-sm);\n transition: all var(--ds-duration-fast) var(--ds-easing-default);\n\n &:hover:not(:disabled) {\n border-color: var(--ds-color-primary);\n }\n\n &[data-selected] {\n border-color: var(--ds-color-primary);\n background: color-mix(in oklch, var(--ds-color-primary) 8%, var(--ds-color-white));\n color: var(--ds-color-primary);\n font-weight: var(--ds-font-weight-medium);\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .extraPrice {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-gray-500);\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--ds-space-2);\n padding-top: var(--ds-space-2);\n }\n}\n","import { useState } from \"react\";\nimport { Button } from \"../Button\";\nimport { Dialog } from \"../Dialog\";\n\nexport type ExtraProductType = {\n\tproductId: string;\n\tname: string;\n\tprice: number;\n\tinStock: boolean;\n};\n\nexport type ExtrasCategoryType = {\n\tid: string;\n\tname: string;\n\tselectionType: \"multi\" | \"single\";\n\tminSelections: number;\n\tmaxSelections: number;\n\tproducts: ExtraProductType[];\n};\n\nexport type SelectedExtraType = {\n\tproductId: string;\n\tquantity: number;\n\tcategoryId: string;\n};\n\nimport styles from \"./ExtrasDialog.module.css\";\n\nexport type ExtrasDialogProps = {\n\topen: boolean;\n\tonClose: () => void;\n\t/** Called with all selections when user confirms.\n\t * NOTE: maxSelections is enforced client-side (FIFO). The server must\n\t * also validate extras counts to prevent tampered requests. */\n\tonConfirm: (selections: SelectedExtraType[]) => void;\n\tcategories: ExtrasCategoryType[];\n\tproductName: string;\n\t/** Forwarded to the underlying Dialog's root element. */\n\t\"data-testid\"?: string;\n};\n\nexport function ExtrasDialog({\n\topen,\n\tonClose,\n\tonConfirm,\n\tcategories,\n\tproductName,\n\t\"data-testid\": testId,\n}: ExtrasDialogProps) {\n\tconst [selections, setSelections] = useState<Map<string, SelectedExtraType[]>>(new Map());\n\n\tconst toggleExtra = (\n\t\tcategoryId: string,\n\t\tproductId: string,\n\t\tselectionType: \"multi\" | \"single\",\n\t\tmaxSelections: number,\n\t) => {\n\t\tsetSelections((prev) => {\n\t\t\tconst next = new Map(prev);\n\t\t\tconst current = next.get(categoryId) ?? [];\n\n\t\t\tif (selectionType === \"single\") {\n\t\t\t\tnext.set(categoryId, [{ productId, quantity: 1, categoryId }]);\n\t\t\t\treturn next;\n\t\t\t}\n\n\t\t\tconst existsAt = current.findIndex((s) => s.productId === productId);\n\t\t\tif (existsAt >= 0) {\n\t\t\t\tnext.set(\n\t\t\t\t\tcategoryId,\n\t\t\t\t\tcurrent.filter((_, i) => i !== existsAt),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst updated = [...current, { productId, quantity: 1, categoryId }];\n\t\t\t\tif (updated.length > maxSelections) {\n\t\t\t\t\tupdated.shift(); // FIFO: drop oldest when limit exceeded\n\t\t\t\t}\n\t\t\t\tnext.set(categoryId, updated);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst allSelections = Array.from(selections.values()).flat();\n\n\tconst handleConfirm = () => {\n\t\tonConfirm(allSelections);\n\t\tsetSelections(new Map());\n\t};\n\n\tconst handleClose = () => {\n\t\tsetSelections(new Map());\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Dialog\n\t\t\topen={open}\n\t\t\tonClose={handleClose}\n\t\t\ttitle={`Extras — ${productName}`}\n\t\t\tsize=\"large\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<div className={styles.content}>\n\t\t\t\t{categories.map((cat) => (\n\t\t\t\t\t<fieldset key={cat.id} className={styles.category}>\n\t\t\t\t\t\t<legend className={styles.categoryName}>\n\t\t\t\t\t\t\t{cat.name}\n\t\t\t\t\t\t\t<span className={styles.categoryHint}>\n\t\t\t\t\t\t\t\t{cat.selectionType === \"single\" ? \"Elige 1\" : `Máx. ${cat.maxSelections}`}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</legend>\n\t\t\t\t\t\t<div className={styles.options}>\n\t\t\t\t\t\t\t{cat.products.map((product: ExtraProductType) => {\n\t\t\t\t\t\t\t\tconst isSelected = (selections.get(cat.id) ?? []).some(\n\t\t\t\t\t\t\t\t\t(s) => s.productId === product.productId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={product.productId}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\t\t\t\tdata-selected={isSelected ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\t\t\t\t\tdisabled={!product.inStock}\n\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\ttoggleExtra(cat.id, product.productId, cat.selectionType, cat.maxSelections)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span>{product.name}</span>\n\t\t\t\t\t\t\t\t\t\t{product.price > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.extraPrice}>+${product.price}</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</fieldset>\n\t\t\t\t))}\n\n\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t<Button variant=\"ghost\" onClick={handleClose}>\n\t\t\t\t\t\tCancelar\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button variant=\"primary\" onClick={handleConfirm}>\n\t\t\t\t\t\tAgregar {allSelections.length > 0 ? `(${allSelections.length})` : \"\"}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Dialog>\n\t);\n}\n","@layer ds-components {\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n }\n\n .label {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-snug);\n color: var(--ds-color-text);\n /* Inset to align with the text inside bordered controls (matches TextInput's .label) */\n margin-inline: var(--ds-space-3);\n }\n\n .required {\n color: var(--ds-color-error);\n }\n\n .description {\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin-top: calc(-1 * var(--ds-space-1));\n /* Align with the inset label */\n margin-inline: var(--ds-space-3);\n }\n\n .error {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-error);\n font-weight: var(--ds-font-weight-medium);\n line-height: var(--ds-leading-snug);\n display: flex;\n align-items: center;\n gap: var(--ds-space-1);\n /* Align with the inset label */\n margin-inline: var(--ds-space-3);\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./FormField.module.css\";\n\nexport interface FormFieldProps {\n\tlabel: string;\n\thtmlFor?: string;\n\terror?: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function FormField({\n\tlabel,\n\thtmlFor,\n\terror,\n\tdescription,\n\trequired = false,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: FormFieldProps) {\n\tconst errorId = htmlFor ? `${htmlFor}-error` : undefined;\n\tconst descriptionId = htmlFor ? `${htmlFor}-description` : undefined;\n\n\treturn (\n\t\t<div className={[styles.field, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t<label htmlFor={htmlFor} className={styles.label}>\n\t\t\t\t{label}\n\t\t\t\t{required && (\n\t\t\t\t\t<span className={styles.required} aria-hidden=\"true\">\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t*\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</label>\n\n\t\t\t{description && (\n\t\t\t\t<p id={descriptionId} className={styles.description}>\n\t\t\t\t\t{description}\n\t\t\t\t</p>\n\t\t\t)}\n\n\t\t\t{children}\n\n\t\t\t{error && (\n\t\t\t\t<p id={errorId} className={styles.error} role=\"alert\" aria-live=\"polite\">\n\t\t\t\t\t{error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.error {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tcolor: var(--ds-color-error);\n\t}\n}\n","import { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./GoogleSignInButton.module.css\";\n\nexport interface GoogleSignInButtonProps {\n\tonSignIn: () => void;\n\tisPending?: boolean;\n\tisError?: boolean;\n\terror?: Error | null;\n\t\"data-testid\"?: string;\n}\n\nexport function GoogleSignInButton({\n\tonSignIn,\n\tisPending = false,\n\tisError = false,\n\terror,\n\t\"data-testid\": testId,\n}: GoogleSignInButtonProps) {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tfullWidth\n\t\t\t\tonClick={onSignIn}\n\t\t\t\tloading={isPending}\n\t\t\t\taria-label=\"Continuar con Google\"\n\t\t\t>\n\t\t\t\t<Icon name=\"google-filled\" size={18} aria-hidden=\"true\" />\n\t\t\t\tGoogle\n\t\t\t</Button>\n\t\t\t{isError && (\n\t\t\t\t<span role=\"alert\" className={styles.error}>\n\t\t\t\t\t{error instanceof Error ? error.message : \"Error al iniciar sesión con Google\"}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .groupedButtons {\n display: flex;\n gap: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n border: none;\n width: fit-content;\n\n &[data-full-width] {\n width: 100%;\n overflow-x: auto;\n\n & .button {\n flex: 1;\n flex-shrink: 0;\n min-width: max-content;\n }\n }\n }\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n border: 1px solid var(--color-neutral-300);\n background-color: var(--ds-color-white);\n color: var(--color-neutral-500);\n font-family: inherit;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n transition:\n background-color var(--duration-fast) var(--ease-out),\n color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out);\n\n &[data-size=\"small\"] {\n padding: var(--spacing-xs) var(--spacing-md);\n font-size: var(--text-sm);\n min-height: 2.75rem;\n }\n\n &[data-size=\"medium\"] {\n padding: var(--spacing-sm) var(--spacing-lg);\n font-size: var(--text-sm);\n min-height: 3.75rem;\n }\n\n &[data-size=\"large\"] {\n padding: var(--spacing-md) var(--spacing-xl);\n font-size: var(--text-base);\n min-height: 5rem;\n }\n\n &[data-position=\"standalone\"] {\n border-radius: var(--radius-xl);\n }\n\n &[data-position=\"left\"] {\n border-radius: var(--radius-xl) 0 0 var(--radius-xl);\n }\n\n &[data-position=\"center\"] {\n border-radius: 0;\n border-left-width: 0;\n }\n\n &[data-position=\"right\"] {\n border-radius: 0 var(--radius-xl) var(--radius-xl) 0;\n border-left-width: 0;\n }\n\n &[data-selected] {\n background-color: var(--color-secondary);\n color: var(--ds-color-white);\n border-color: var(--color-secondary);\n }\n\n &:hover:not(:disabled):not([data-selected]) {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n position: relative;\n z-index: 1;\n }\n }\n}\n","import type { HTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport type { IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./GroupedButtons.module.css\";\n\nexport type GroupedButtonSize = \"small\" | \"medium\" | \"large\";\nexport type GroupPosition = \"standalone\" | \"left\" | \"center\" | \"right\";\n\nexport interface GroupedButtonOption {\n\tvalue: string | number;\n\tlabel: string;\n\tdisabled?: boolean;\n\ticon?: IconName;\n\t/** Forwarded to this option's `<button>` for use as a test/Playwright locator. */\n\t\"data-testid\"?: string;\n}\n\nexport interface GroupedButtonsProps extends Omit<HTMLAttributes<HTMLFieldSetElement>, \"onChange\"> {\n\tlabel: string;\n\toptions: GroupedButtonOption[];\n\tselectedButton?: string | number;\n\tsize?: GroupedButtonSize;\n\tfullWidth?: boolean;\n\tdisabled?: boolean;\n\tonChange?: (value: string | number) => void;\n}\n\nfunction getGroupPosition(index: number, total: number): GroupPosition {\n\tif (total === 1) return \"standalone\";\n\tif (index === 0) return \"left\";\n\tif (index === total - 1) return \"right\";\n\treturn \"center\";\n}\n\nexport function GroupedButtons({\n\tlabel,\n\toptions,\n\tselectedButton,\n\tsize = \"medium\",\n\tfullWidth = false,\n\tdisabled = false,\n\tonChange,\n\tclassName,\n\t...props\n}: GroupedButtonsProps) {\n\tconst [internalSelected, setInternalSelected] = useState<string | number | undefined>(\n\t\t() => options[0]?.value,\n\t);\n\n\tconst isControlled = selectedButton !== undefined;\n\tconst current = isControlled ? selectedButton : internalSelected;\n\n\tconst handleClick = (value: string | number) => {\n\t\tconst option = options.find((o) => o.value === value);\n\t\tif (disabled || option?.disabled) return;\n\t\tif (!isControlled) setInternalSelected(value);\n\t\tonChange?.(value);\n\t};\n\n\treturn (\n\t\t<fieldset\n\t\t\taria-label={label}\n\t\t\tclassName={[styles.groupedButtons, className].filter(Boolean).join(\" \")}\n\t\t\tdisabled={disabled}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{options.map((option, i) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\tdata-size={size}\n\t\t\t\t\tdata-position={getGroupPosition(i, options.length)}\n\t\t\t\t\tdata-selected={current === option.value ? \"\" : undefined}\n\t\t\t\t\tdata-testid={option[\"data-testid\"]}\n\t\t\t\t\tdisabled={disabled || option.disabled}\n\t\t\t\t\tonClick={() => handleClick(option.value)}\n\t\t\t\t>\n\t\t\t\t\t{option.icon && <Icon name={option.icon} size={16} />}\n\t\t\t\t\t{option.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</fieldset>\n\t);\n}\n","@layer ds-components {\n\t.header {\n\t\tdisplay: grid;\n\t\tgrid-auto-flow: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\tpadding: var(--spacing-sm) var(--spacing-2xl);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-lg);\n\t\tbackground-color: var(--color-neutral-100);\n\n\t\t&[data-space-between] {\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t.item {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: auto;\n\t\tpadding: 0 var(--spacing-md);\n\t}\n\n\t.title {\n\t\tfont-size: var(--text-base);\n\t\tfont-weight: 800;\n\t\tcolor: var(--color-secondary);\n\t\tmargin: 0;\n\t}\n\n\t.description {\n\t\tfont-size: 0.625rem;\n\t\tline-height: 1;\n\t\tfont-weight: 400;\n\t\tcolor: var(--color-neutral-500);\n\t\tmargin: 0;\n\t}\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Header.module.css\";\n\nexport interface HeaderItem {\n\ttitle: string;\n\tdescription?: string;\n}\n\nexport interface HeaderProps extends HTMLAttributes<HTMLElement> {\n\theaders?: HeaderItem[];\n\tspaceBetween?: boolean;\n}\n\nexport function Header({ headers = [], spaceBetween = false, className, ...props }: HeaderProps) {\n\treturn (\n\t\t<section\n\t\t\tclassName={[styles.header, className].filter(Boolean).join(\" \")}\n\t\t\tdata-space-between={spaceBetween ? \"\" : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{headers.map((header) => (\n\t\t\t\t<div key={header.title} className={styles.item}>\n\t\t\t\t\t<p className={styles.title}>{header.title}</p>\n\t\t\t\t\t{header.description && <p className={styles.description}>{header.description}</p>}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</section>\n\t);\n}\n","import { useMemo } from \"react\";\nimport { DropdownButton, type DropdownMenuItemType } from \"../DropdownButton\";\n\nexport interface LanguageOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface LanguageSelectorProps {\n\tvalue: string;\n\toptions: LanguageOption[];\n\tonChange: (value: string) => void;\n\t\"data-testid\"?: string;\n}\n\nexport function LanguageSelector({\n\tvalue,\n\toptions,\n\tonChange,\n\t\"data-testid\": testId,\n}: LanguageSelectorProps) {\n\tconst menuItems = useMemo<DropdownMenuItemType[]>(\n\t\t() => options.map(({ value: v, label }) => ({ value: v, label })),\n\t\t[options],\n\t);\n\n\tconst currentLabel = options.find((o) => o.value === value)?.label ?? value;\n\n\treturn (\n\t\t<DropdownButton\n\t\t\ttext={currentLabel}\n\t\t\tmenuItems={menuItems}\n\t\t\tsize=\"small\"\n\t\t\tvariant=\"ghost\"\n\t\t\tonSelect={(item) => onChange(item.value)}\n\t\t\tdata-testid={testId}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n .logo {\n --logo-icon-max-size: 100px;\n --logo-complete-max-width: 400px;\n --logo-complete-max-height: 100px;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n line-height: 0;\n vertical-align: middle;\n transition: opacity var(--duration-fast) ease-in-out;\n\n &:hover {\n opacity: 0.9;\n }\n\n &[data-mode=\"icon\"] {\n max-width: var(--logo-icon-max-size);\n max-height: var(--logo-icon-max-size);\n }\n\n &[data-mode=\"complete\"] {\n max-width: var(--logo-complete-max-width);\n max-height: var(--logo-complete-max-height);\n }\n }\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./LogoToteat.module.css\";\nimport iconCreamOrange from \"./svg/toteat-isotipo-crema-naranja.svg?raw\";\nimport iconBlackCream from \"./svg/toteat-isotipo-crema-negro.svg?raw\";\nimport iconOriginal from \"./svg/toteat-isotipo-original.svg?raw\";\nimport logoCreamOrange from \"./svg/toteat-logo-crema-naranja.svg?raw\";\nimport logoBlackCream from \"./svg/toteat-logo-negro-crema.svg?raw\";\nimport logoOriginal from \"./svg/toteat-logo-original.svg?raw\";\n\nexport type LogoToteatMode = \"icon\" | \"complete\";\nexport type LogoToteatVariant = \"original\" | \"cream-orange\" | \"black-cream\";\n\nexport interface LogoToteatProps extends HTMLAttributes<HTMLSpanElement> {\n\tmode?: LogoToteatMode;\n\tvariant?: LogoToteatVariant;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\");\n}\n\nconst LOGO_MAP: Record<LogoToteatVariant, string> = {\n\toriginal: logoOriginal,\n\t\"cream-orange\": logoCreamOrange,\n\t\"black-cream\": logoBlackCream,\n};\n\nconst ICON_MAP: Record<LogoToteatVariant, string> = {\n\toriginal: iconOriginal,\n\t\"cream-orange\": iconCreamOrange,\n\t\"black-cream\": iconBlackCream,\n};\n\nfunction getDimensions(\n\tmode: LogoToteatMode,\n\twidth?: number,\n\theight?: number,\n): { width: number; height: number } {\n\tif (width !== undefined && height !== undefined) return { width, height };\n\tif (mode === \"icon\") {\n\t\tconst size = width ?? height ?? 44;\n\t\treturn { width: size, height: size };\n\t}\n\tif (width !== undefined) return { width, height: Math.round((width / 317) * 80) };\n\tif (height !== undefined) return { width: Math.round((height / 80) * 317), height };\n\treturn { width: 160, height: 40 };\n}\n\nexport function LogoToteat({\n\tmode = \"complete\",\n\tvariant = \"original\",\n\twidth,\n\theight,\n\talt = \"Logo Toteat\",\n\tclassName,\n\t...props\n}: LogoToteatProps) {\n\tconst rawSvg = mode === \"icon\" ? ICON_MAP[variant] : LOGO_MAP[variant];\n\tconst dims = getDimensions(mode, width, height);\n\t// SVG content is bundled package assets, not user input — safe for dangerouslySetInnerHTML\n\tconst modifiedSvg = rawSvg\n\t\t.replace(/width=\"\\d+\"/, `width=\"${dims.width}\"`)\n\t\t.replace(/height=\"\\d+\"/, `height=\"${dims.height}\"`)\n\t\t.replace(/<svg/, `<svg role=\"img\" aria-label=\"${escapeAttr(alt)}\"`);\n\n\treturn (\n\t\t<span\n\t\t\tclassName={[styles.logo, className].filter(Boolean).join(\" \")}\n\t\t\tdata-mode={mode}\n\t\t\tdata-variant={variant}\n\t\t\t{...props}\n\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: SVG is a bundled package asset, not user content\n\t\t\tdangerouslySetInnerHTML={{ __html: modifiedSvg }}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t.multiselect {\n\t\tposition: relative;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tcolor: var(--color-text);\n\t}\n\n\t/* ── Trigger ── */\n\t.trigger {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tmin-height: 40px;\n\t\tpadding: var(--spacing-xs) var(--spacing-sm);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\t}\n\n\t.multiselect[data-error] .trigger {\n\t\tborder-color: var(--color-error);\n\t}\n\n\t.multiselect[data-disabled] .trigger {\n\t\tbackground-color: var(--color-neutral-50);\n\t\tcolor: var(--color-neutral-400);\n\t\tcursor: not-allowed;\n\t\tpointer-events: none;\n\t}\n\n\t/* ── Placeholder ── */\n\t.placeholder {\n\t\tcolor: var(--color-neutral-400);\n\t\tline-height: var(--leading-normal);\n\t\tpadding: var(--spacing-xs) 0;\n\t}\n\n\t/* ── Tags ── */\n\t.tag {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: 2px var(--spacing-sm);\n\t\tbackground-color: var(--color-primary-100);\n\t\tcolor: var(--color-primary-900);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tborder-radius: var(--radius-full);\n\t\tline-height: var(--leading-tight);\n\t\twhite-space: nowrap;\n\t}\n\n\t.tagRemove {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 14px;\n\t\theight: 14px;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--radius-circle);\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tfont-size: var(--text-base);\n\t\tline-height: 1;\n\t\topacity: 0.7;\n\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 1px;\n\t\t}\n\t}\n\n\t/* ── Dropdown ── */\n\t.dropdown {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tleft: 0;\n\t\tright: 0;\n\t\tz-index: var(--z-dropdown);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\toverflow: hidden;\n\t\tmax-height: 240px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* ── Options list (scrollable) ── */\n\t.optionsList {\n\t\toverflow-y: auto;\n\t\tflex: 1;\n\t}\n\n\t/* ── Flip upward when not enough space below ── */\n\t.dropdown[data-upward] {\n\t\ttop: auto;\n\t\tbottom: calc(100% + var(--spacing-xs));\n\t}\n\n\t/* ── Search input ── */\n\t.search {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: none;\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\toutline: none;\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t}\n\t}\n\n\t/* ── Option buttons ── */\n\t.option {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\ttext-align: left;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text);\n\t\tbackground: none;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\t}\n\n\t/* ── No results ── */\n\t.noResults {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t\ttext-align: center;\n\t}\n}\n","import { type ReactElement, useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport styles from \"./Multiselect.module.css\";\n\nexport interface MultiselectOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface MultiselectProps {\n\toptions: MultiselectOption[];\n\tvalue: string[];\n\tonChange: (values: string[]) => void;\n\tplaceholder?: string;\n\tsearchPlaceholder?: string;\n\tnoResultsText?: string;\n\tremoveLabel?: string;\n\tdisabled?: boolean;\n\terror?: boolean;\n\t\"data-testid\"?: string;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 240;\n\nexport function Multiselect({\n\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Seleccionar...\",\n\tsearchPlaceholder = \"Buscar...\",\n\tnoResultsText = \"Sin resultados\",\n\tremoveLabel = \"Eliminar\",\n\tdisabled,\n\terror,\n\t\"data-testid\": testId,\n}: MultiselectProps): ReactElement {\n\tconst [openUpward, setOpenUpward] = useState(false);\n\tconst [search, setSearch] = useState(\"\");\n\n\t// Shared dropdown core: open state, refs, toggle, focus-return-to-trigger.\n\t// Multiselect keeps its own outside-click + Escape listeners because it returns focus\n\t// to the trigger on outside-click; both reuse the hook's `closeAndFocusTrigger`.\n\t// Selection is multi-value via the always-on search field, so the hook's roving\n\t// active-index keyboard handler is intentionally unused here.\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\ttoggle,\n\t\tcloseAndFocusTrigger: closeDropdown,\n\t} = useDropdown({ disabled, closeOnOutsideClick: false });\n\n\tconst selectedOptions = options.filter((o) => value.includes(o.value));\n\tconst filteredOptions = options.filter(\n\t\t(o) => !value.includes(o.value) && o.label.toLowerCase().includes(search.toLowerCase()),\n\t);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: MouseEvent) => {\n\t\t\tif (!containerRef.current?.contains(e.target as Node)) closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handler);\n\t\treturn () => document.removeEventListener(\"mousedown\", handler);\n\t}, [isOpen, closeDropdown, containerRef]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handler);\n\t\treturn () => document.removeEventListener(\"keydown\", handler);\n\t}, [isOpen, closeDropdown]);\n\n\t// Determine flip direction when opening\n\tuseEffect(() => {\n\t\tif (!isOpen || !containerRef.current) return;\n\t\tconst rect = containerRef.current.getBoundingClientRect();\n\t\tconst spaceBelow = window.innerHeight - rect.bottom;\n\t\tsetOpenUpward(spaceBelow < DROPDOWN_MAX_HEIGHT + 8);\n\t}, [isOpen, containerRef]);\n\n\tconst addValue = (v: string) => onChange([...value, v]);\n\tconst removeValue = (v: string) => onChange(value.filter((x) => x !== v));\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.multiselect}\n\t\t\tdata-error={error || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t{selectedOptions.length === 0 && <span className={styles.placeholder}>{placeholder}</span>}\n\t\t\t\t{selectedOptions.map((opt) => (\n\t\t\t\t\t<span key={opt.value} className={styles.tag}>\n\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={styles.tagRemove}\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tremoveValue(opt.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label={`${removeLabel} ${opt.label}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t×\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.dropdown}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=\"true\"\n\t\t\t\t\tdata-upward={openUpward || undefined}\n\t\t\t\t>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\t// biome-ignore lint/a11y/noAutofocus: search input needs focus when dropdown opens\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t/>\n\t\t\t\t\t<div className={styles.optionsList}>\n\t\t\t\t\t\t{filteredOptions.map((opt) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={opt.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={value.includes(opt.value)}\n\t\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\taddValue(opt.value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filteredOptions.length === 0 && (\n\t\t\t\t\t\t\t<div className={styles.noResults}>{noResultsText}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n /* Overlay scrim — covers content at every breakpoint while the drawer is open,\n and provides click-outside-to-close. The sidebar always overlays; it never\n takes horizontal space from the content. */\n .backdrop {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 19;\n /* Visible dimming scrim, matching Dialog's overlay token. */\n background-color: var(--ds-color-surface-overlay);\n }\n\n .backdrop[data-open=\"true\"] {\n display: block;\n }\n\n /* Fixed off-canvas drawer at ALL widths — overlays content, never reflows it. */\n .sidebar {\n position: fixed;\n top: 0;\n left: 0;\n height: 100dvh;\n width: var(--ds-ang-sidebar-width);\n background-color: var(--ds-ang-secondary);\n color: var(--ds-ang-neutral-0);\n display: flex;\n flex-direction: column;\n gap: var(--ds-ang-space-8);\n padding: var(--ds-ang-space-24) var(--ds-ang-space-16);\n overflow-y: auto;\n z-index: 20;\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n user-select: none;\n transform: translateX(-100%);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .sidebar {\n transition: transform 200ms ease-out;\n }\n }\n\n .sidebar[data-open=\"true\"] {\n transform: translateX(0);\n }\n\n /* Close (X) button — DS outline Button, centered at the top inside the drawer.\n The drawer background is dark (--ds-ang-secondary), so lift the outline\n variant's border + icon (currentColor) to the light foreground for contrast. */\n .closeButton {\n align-self: center;\n color: var(--ds-ang-neutral-0);\n border-color: color-mix(in oklch, var(--ds-ang-neutral-0) 45%, transparent);\n\n &:hover:not(:disabled) {\n border-color: var(--ds-ang-neutral-0);\n background-color: color-mix(in oklch, var(--ds-ang-neutral-0) 12%, transparent);\n }\n }\n}\n","import { type ReactNode, useEffect, useRef } from \"react\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Sidebar.module.css\";\n\n/**\n * Stable id for the sidebar drawer `<nav>`. The NavBar toggle references it via\n * `aria-controls` so assistive tech associates the hamburger with the drawer.\n */\nexport const SIDEBAR_DRAWER_ID = \"ds-sidebar-drawer\";\n\nexport interface SidebarProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tisPinLocked?: boolean;\n\tisModal?: boolean;\n\tchildren: ReactNode;\n}\n\nexport function Sidebar({\n\tisOpen,\n\tonClose,\n\tisPinLocked = false,\n\tisModal = false,\n\tchildren,\n}: SidebarProps) {\n\tconst navRef = useRef<HTMLElement>(null);\n\t// Keep the latest onClose without making it an effect dependency: an inline\n\t// onClose from the parent changes identity every render, and if it were a dep\n\t// the open drawer's focus effect would re-run on each render — its cleanup\n\t// would re-capture `previouslyFocused` (breaking focus-return) and flicker focus.\n\tconst onCloseRef = useRef(onClose);\n\tonCloseRef.current = onClose;\n\n\t// The drawer overlays the content behind a scrim, so give it modal-like\n\t// affordances when open: move focus in, close on Escape, and restore focus\n\t// to the opener (e.g. the NavBar hamburger) on close.\n\tuseEffect(() => {\n\t\t// Only when the drawer is actually rendered and open — matches the render\n\t\t// guard below so Escape can't fire onClose for a non-rendered sidebar.\n\t\tif (!isOpen || isPinLocked || isModal) return;\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\t\tnavRef.current?.querySelector<HTMLElement>(\"button\")?.focus();\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") onCloseRef.current();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tpreviouslyFocused?.focus?.();\n\t\t};\n\t}, [isOpen, isPinLocked, isModal]);\n\n\tif (isPinLocked || isModal) return null;\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName={styles.backdrop}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\tdata-testid=\"sidebar-backdrop\"\n\t\t\t\tonClick={onClose}\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t\t{/* When closed the drawer is only slid off-canvas, so `inert` keeps its\n\t\t\t controls out of the tab order and the accessibility tree. */}\n\t\t\t<nav\n\t\t\t\tref={navRef}\n\t\t\t\tid={SIDEBAR_DRAWER_ID}\n\t\t\t\tclassName={styles.sidebar}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\tdata-testid=\"sidebar\"\n\t\t\t\taria-label=\"Menú principal\"\n\t\t\t\tinert={isOpen ? undefined : true}\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tclassName={styles.closeButton}\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\ticon={<Icon name=\"close-outline\" aria-hidden=\"true\" />}\n\t\t\t\t\tdata-testid=\"sidebar-close\"\n\t\t\t\t>\n\t\t\t\t\tCerrar\n\t\t\t\t</Button>\n\t\t\t\t{children}\n\t\t\t</nav>\n\t\t</>\n\t);\n}\n","@layer ang-components {\n .navbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--ds-ang-navbar-height);\n min-height: var(--ds-ang-navbar-height);\n max-height: var(--ds-ang-navbar-height);\n background-color: var(--ds-ang-secondary);\n position: relative;\n z-index: 10;\n padding: 0;\n user-select: none;\n }\n\n .navLeft {\n position: absolute;\n left: 0;\n top: 0;\n height: var(--ds-ang-navbar-height);\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-4);\n padding-left: var(--ds-ang-space-8);\n }\n\n .menuButton {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--ds-ang-space-8);\n color: var(--ds-ang-neutral-0);\n min-width: var(--ds-ang-min-touch-target);\n min-height: var(--ds-ang-min-touch-target);\n }\n\n .menuButton:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .menuIcon {\n display: block;\n width: 18px;\n height: 2px;\n background-color: var(--ds-ang-neutral-0);\n position: relative;\n }\n\n .menuIcon::before,\n .menuIcon::after {\n content: \"\";\n display: block;\n width: 18px;\n height: 2px;\n background-color: var(--ds-ang-neutral-0);\n position: absolute;\n left: 0;\n }\n\n .menuIcon::before {\n top: -6px;\n }\n\n .menuIcon::after {\n top: 6px;\n }\n\n .spinner {\n position: absolute;\n left: 55px;\n top: 10px;\n }\n\n .navCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-ang-space-8);\n height: var(--ds-ang-navbar-height);\n padding: 0 50px;\n flex: 1;\n }\n\n .logoBrand {\n display: flex;\n align-items: center;\n cursor: pointer;\n height: var(--ds-ang-navbar-height);\n background: none;\n border: none;\n padding: 0;\n }\n\n .logoBrand:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .logo {\n width: 83px;\n height: 21px;\n }\n\n @media (max-width: 780px) {\n .logo {\n width: 78px;\n height: 16px;\n }\n }\n\n .restaurantName {\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n color: var(--ds-ang-neutral-0);\n cursor: pointer;\n }\n\n .navRight {\n position: absolute;\n right: 0;\n top: 0;\n height: var(--ds-ang-navbar-height);\n display: flex;\n align-items: center;\n padding-right: var(--ds-ang-space-8);\n }\n\n .rightButton {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--ds-ang-space-8);\n min-width: var(--ds-ang-min-touch-target);\n min-height: var(--ds-ang-min-touch-target);\n }\n\n .rightButton:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n}\n","import type { ReactNode } from \"react\";\nimport { SIDEBAR_DRAWER_ID } from \"../Sidebar\";\nimport styles from \"./NavBar.module.css\";\n\nexport interface NavBarProps {\n\trestaurantName: string;\n\tonMenuToggle: () => void;\n\tonLogoClick: () => void;\n\tonRightToggle: () => void;\n\t/** Reflects the sidebar's open state so the toggle exposes aria-expanded + the right label. */\n\tisMenuOpen?: boolean;\n\tisLoading?: boolean;\n\tisPinLocked?: boolean;\n\trightSlot?: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function NavBar({\n\trestaurantName,\n\tonMenuToggle,\n\tonLogoClick,\n\tonRightToggle,\n\tisMenuOpen = false,\n\tisLoading = false,\n\tisPinLocked = false,\n\trightSlot,\n\t\"data-testid\": testId,\n}: NavBarProps) {\n\tif (isPinLocked) return null;\n\n\treturn (\n\t\t<header className={styles.navbar} data-testid={testId}>\n\t\t\t<div className={styles.navLeft}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.menuButton}\n\t\t\t\t\tonClick={onMenuToggle}\n\t\t\t\t\taria-label={isMenuOpen ? \"Cerrar menú\" : \"Abrir menú\"}\n\t\t\t\t\taria-expanded={isMenuOpen}\n\t\t\t\t\taria-controls={SIDEBAR_DRAWER_ID}\n\t\t\t\t>\n\t\t\t\t\t<span className={styles.menuIcon} aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t\t{isLoading && (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/assets/angular/dsSpinner.svg\"\n\t\t\t\t\t\talt=\"Cargando\"\n\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\theight={20}\n\t\t\t\t\t\tclassName={styles.spinner}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className={styles.navCenter}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.logoBrand}\n\t\t\t\t\tonClick={onLogoClick}\n\t\t\t\t\taria-label=\"Ir al inicio\"\n\t\t\t\t>\n\t\t\t\t\t<img src=\"/assets/angular/dsLogo.svg\" alt=\"Toteat\" className={styles.logo} />\n\t\t\t\t</button>\n\t\t\t\t<span className={styles.restaurantName}>{restaurantName}</span>\n\t\t\t</div>\n\n\t\t\t<div className={styles.navRight}>\n\t\t\t\t{rightSlot}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.rightButton}\n\t\t\t\t\tonClick={onRightToggle}\n\t\t\t\t\taria-label=\"Pantalla completa\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/assets/angular/dsIconLogo.svg\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</header>\n\t);\n}\n","@layer ds-components {\n .overlay {\n position: fixed;\n inset: 0;\n display: flex;\n width: 100dvw;\n height: 100dvh;\n padding: clamp(1.5rem, 4vw, 3rem);\n z-index: var(--overlay-z-index, 1200);\n justify-content: center;\n animation: overlay-fade-in 200ms ease-in-out;\n\n &[data-blur] {\n backdrop-filter: blur(0.75rem);\n }\n\n &[data-placement=\"top\"] { align-items: flex-start; }\n &[data-placement=\"center\"] { align-items: center; }\n &[data-placement=\"bottom\"] { align-items: flex-end; }\n }\n\n .backdrop {\n position: absolute;\n inset: 0;\n background-color: color-mix(in srgb, var(--color-secondary) 60%, transparent);\n border: none;\n cursor: default;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .content {\n position: relative;\n z-index: 1;\n width: min(100%, 64rem);\n display: flex;\n justify-content: center;\n pointer-events: none;\n\n & > * {\n pointer-events: auto;\n width: 100%;\n }\n }\n\n @keyframes overlay-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay { animation: none; }\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useScrollLock } from \"../../hooks/useScrollLock\";\nimport styles from \"./Overlay.module.css\";\n\nexport type OverlayPlacement = \"top\" | \"center\" | \"bottom\";\n\nexport interface OverlayProps {\n\tvisible?: boolean;\n\tonClose: () => void;\n\tchildren: ReactNode;\n\tdismissible?: boolean;\n\tcloseOnBackdrop?: boolean;\n\tcloseOnEsc?: boolean;\n\tlockScroll?: boolean;\n\tblur?: boolean;\n\tplacement?: OverlayPlacement;\n\tzIndex?: number;\n\trole?: \"presentation\" | \"dialog\";\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Overlay({\n\tvisible = false,\n\tonClose,\n\tchildren,\n\tdismissible = true,\n\tcloseOnBackdrop = true,\n\tcloseOnEsc = true,\n\tlockScroll = true,\n\tblur = false,\n\tplacement = \"center\",\n\tzIndex = 1200,\n\trole = \"presentation\",\n\t\"aria-label\": ariaLabel,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: OverlayProps) {\n\tconst handleClose = useCallback(() => {\n\t\tif (dismissible) onClose();\n\t}, [dismissible, onClose]);\n\n\tuseScrollLock(visible && lockScroll, { strategy: \"overflow\" });\n\n\tuseEffect(() => {\n\t\tif (!visible || !closeOnEsc) return;\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") handleClose();\n\t\t};\n\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [visible, closeOnEsc, handleClose]);\n\n\tif (!visible || typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<div\n\t\t\tdata-testid={dataTestId}\n\t\t\tclassName={[styles.overlay, className].filter(Boolean).join(\" \")}\n\t\t\tdata-blur={blur ? \"\" : undefined}\n\t\t\tdata-placement={placement}\n\t\t\tstyle={{ \"--overlay-z-index\": String(zIndex) } as React.CSSProperties}\n\t\t\trole={role}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.backdrop}\n\t\t\t\tdata-backdrop=\"\"\n\t\t\t\tonClick={closeOnBackdrop ? handleClose : undefined}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\ttabIndex={-1}\n\t\t\t/>\n\t\t\t<div className={styles.content}>{children}</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n}\n","@layer ds-components {\n .overlayMessage {\n background-color: var(--ds-color-white);\n border-radius: var(--radius-xl);\n padding: clamp(1.5rem, 4vw, 2.75rem);\n box-shadow: 0 35px 100px rgba(0, 0, 0, 0.2);\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n width: 100%;\n max-width: var(--om-max-width, 400px);\n\n &[data-standalone] {\n box-shadow: none;\n border: 1px solid var(--color-neutral-200);\n min-height: 16.625rem;\n }\n }\n\n .header {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: var(--spacing-md);\n position: relative;\n padding-inline: var(--spacing-sm);\n }\n\n .iconWrap {\n width: 3.5rem;\n height: 3.5rem;\n display: grid;\n place-items: center;\n }\n\n .iconColor {\n display: contents;\n color: var(--om-icon-color);\n }\n\n .headline {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n align-items: center;\n }\n\n .eyebrow {\n font-size: var(--text-xs);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n font-weight: 600;\n margin: 0;\n }\n\n .title {\n font-size: clamp(var(--text-lg), 2vw, var(--text-xl));\n line-height: 1.2;\n font-weight: 600;\n color: var(--color-secondary);\n margin: var(--spacing-xl) 0 0;\n }\n\n .closeBtn {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: var(--radius-circle);\n border: 1px solid transparent;\n background: transparent;\n color: var(--color-neutral-400);\n display: grid;\n place-items: center;\n cursor: pointer;\n position: absolute;\n top: 0;\n right: 0;\n padding: 0;\n transition:\n border-color var(--duration-fast) var(--ease-out),\n color var(--duration-fast) var(--ease-out);\n\n &:hover {\n color: var(--color-secondary);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n }\n }\n\n .body {\n font-size: var(--text-base);\n color: var(--color-neutral-500);\n line-height: 1.5;\n text-align: center;\n }\n\n .actions {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n width: 100%;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { Button } from \"../Button\";\nimport { CloseButton } from \"../CloseButton\";\nimport type { IconNameType as IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport type { OverlayPlacement } from \"../Overlay\";\nimport { Overlay } from \"../Overlay\";\nimport styles from \"./OverlayMessage.module.css\";\n\nexport type OverlayMessageStatus = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst STATUS_ICON_MAP: Record<OverlayMessageStatus, IconName> = {\n\tsuccess: \"success-outline\",\n\tinfo: \"info-outline\",\n\twarning: \"exclamation-outline\",\n\terror: \"error-outline\",\n};\n\nconst STATUS_COLOR_VAR_MAP: Record<OverlayMessageStatus, string> = {\n\tsuccess: \"var(--ds-color-success)\",\n\tinfo: \"var(--ds-color-info)\",\n\twarning: \"var(--ds-color-warning)\",\n\terror: \"var(--ds-color-primary)\",\n};\n\nexport interface OverlayMessageProps {\n\tvisible?: boolean;\n\tonClose: () => void;\n\ttitle: string;\n\teyebrow?: string;\n\tchildren?: ReactNode;\n\tstatus?: OverlayMessageStatus;\n\ticonName?: IconName;\n\ticonSize?: number;\n\tdismissible?: boolean;\n\tshowCloseButton?: boolean;\n\tcloseButtonLabel?: string;\n\tcloseOnBackdrop?: boolean;\n\tcloseOnEsc?: boolean;\n\tlockScroll?: boolean;\n\tzIndex?: number;\n\tblur?: boolean;\n\tplacement?: OverlayPlacement;\n\t\"aria-label\"?: string;\n\tprimaryButtonLabel?: string;\n\tsecondaryButtonLabel?: string;\n\tloadingPrimary?: boolean;\n\tloadingSecondary?: boolean;\n\tmaxWidth?: number;\n\tstandalone?: boolean;\n\tonPrimaryClick?: () => void;\n\tonSecondaryClick?: () => void;\n\t\"data-testid\"?: string;\n}\n\ninterface CardProps {\n\ttitle: string;\n\teyebrow?: string;\n\tchildren?: ReactNode;\n\tstatus?: OverlayMessageStatus;\n\ticonName?: IconName;\n\ticonSize?: number;\n\tdismissible?: boolean;\n\tshowCloseButton?: boolean;\n\tcloseButtonLabel?: string;\n\tprimaryButtonLabel?: string;\n\tsecondaryButtonLabel?: string;\n\tloadingPrimary?: boolean;\n\tloadingSecondary?: boolean;\n\tmaxWidth?: number;\n\tstandalone?: boolean;\n\tonClose: () => void;\n\tonPrimaryClick?: () => void;\n\tonSecondaryClick?: () => void;\n\t\"data-testid\"?: string;\n}\n\nfunction OverlayMessageCard({\n\ttitle,\n\teyebrow,\n\tchildren,\n\tstatus = \"success\",\n\ticonName,\n\ticonSize = 44,\n\tdismissible = true,\n\tshowCloseButton = true,\n\tcloseButtonLabel = \"Close overlay message\",\n\tprimaryButtonLabel,\n\tsecondaryButtonLabel,\n\tloadingPrimary = false,\n\tloadingSecondary = false,\n\tmaxWidth = 400,\n\tstandalone = false,\n\tonClose,\n\tonPrimaryClick,\n\tonSecondaryClick,\n\t\"data-testid\": dataTestId,\n}: CardProps) {\n\tconst titleId = useId();\n\tconst bodyId = useId();\n\tconst resolvedIcon = iconName ?? STATUS_ICON_MAP[status];\n\tconst iconColor = STATUS_COLOR_VAR_MAP[status];\n\tconst hasBody = Boolean(children);\n\tconst hasActions = Boolean(primaryButtonLabel) || Boolean(secondaryButtonLabel);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.overlayMessage}\n\t\t\tdata-status={status}\n\t\t\tdata-standalone={standalone ? \"\" : undefined}\n\t\t\trole={standalone ? \"region\" : \"alertdialog\"}\n\t\t\taria-modal={standalone ? undefined : \"true\"}\n\t\t\taria-labelledby={titleId}\n\t\t\taria-describedby={hasBody ? bodyId : undefined}\n\t\t\tstyle={{ \"--om-max-width\": `${maxWidth}px` } as React.CSSProperties}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<header className={styles.header}>\n\t\t\t\t<div className={styles.iconWrap} aria-hidden=\"true\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={styles.iconColor}\n\t\t\t\t\t\tstyle={{ \"--om-icon-color\": iconColor } as React.CSSProperties}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name={resolvedIcon} size={iconSize} />\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.headline}>\n\t\t\t\t\t{eyebrow && <p className={styles.eyebrow}>{eyebrow}</p>}\n\t\t\t\t\t<h2 className={styles.title} id={titleId}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t</div>\n\t\t\t\t{dismissible && showCloseButton && (\n\t\t\t\t\t<CloseButton\n\t\t\t\t\t\tclassName={styles.closeBtn}\n\t\t\t\t\t\tlabel={closeButtonLabel}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tsize={20}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</header>\n\t\t\t{hasBody && (\n\t\t\t\t<div className={styles.body} id={bodyId}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{hasActions && (\n\t\t\t\t<footer className={styles.actions}>\n\t\t\t\t\t{secondaryButtonLabel && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tloading={loadingSecondary}\n\t\t\t\t\t\t\tonClick={onSecondaryClick}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{secondaryButtonLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{primaryButtonLabel && (\n\t\t\t\t\t\t<Button variant=\"primary\" fullWidth loading={loadingPrimary} onClick={onPrimaryClick}>\n\t\t\t\t\t\t\t{primaryButtonLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</footer>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function OverlayMessage({\n\tvisible = false,\n\tonClose,\n\tdismissible = true,\n\tcloseOnBackdrop = true,\n\tcloseOnEsc = true,\n\tlockScroll = true,\n\tzIndex = 1200,\n\tblur = false,\n\tplacement = \"center\",\n\t\"aria-label\": ariaLabel,\n\tstandalone = false,\n\t\"data-testid\": dataTestId,\n\t...cardProps\n}: OverlayMessageProps) {\n\tif (!visible) return null;\n\n\tif (standalone) {\n\t\treturn (\n\t\t\t<OverlayMessageCard\n\t\t\t\t{...cardProps}\n\t\t\t\tstandalone\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tonClose={onClose}\n\t\t\t\tdata-testid={dataTestId}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Overlay\n\t\t\tvisible={visible}\n\t\t\tonClose={onClose}\n\t\t\tdismissible={dismissible}\n\t\t\tcloseOnBackdrop={closeOnBackdrop}\n\t\t\tcloseOnEsc={closeOnEsc}\n\t\t\tlockScroll={lockScroll}\n\t\t\tzIndex={zIndex}\n\t\t\tblur={blur}\n\t\t\tplacement={placement}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<OverlayMessageCard\n\t\t\t\t{...cardProps}\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tonClose={onClose}\n\t\t\t\tdata-testid={dataTestId}\n\t\t\t/>\n\t\t</Overlay>\n\t);\n}\n","@layer ds-components {\n /*\n * Grid overlap pattern — sits in the same 1/1 cell as siblings.\n * stretch fills the cell without position: absolute, so the logo div\n * (later in DOM) naturally paints on top. No z-index needed.\n */\n .canvas {\n grid-area: 1 / 1;\n align-self: stretch;\n justify-self: stretch;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n}\n","import { useEffect, useRef } from \"react\";\nimport styles from \"./BreathingDotsCanvas.module.css\";\n\n// ── Shaders ────────────────────────────────────────────────────────────────\nconst VERT = `#version 300 es\nin vec2 a_pos;\nvoid main() { gl_Position = vec4(a_pos, 0.0, 1.0); }`;\n\n/**\n * Breathing Dots — inspired by the Codrops / Dave Whyte technique.\n *\n * Each dot in a hex-offset grid has its position scaled radially by a smooth\n * square wave whose phase is delayed by distance from the screen centre.\n * An 8-fold cosine term on the distance metric creates the flower-like\n * distortion on the wave-front edge.\n *\n * wave(t, dist) = (2A/π) · atan(sin(2π·t·f) / k)\n * phase = u_time − dist / SPEED\n * scale = wave + BASE_SCALE\n * animPos = origPos × scale\n *\n * We evaluate a 5×5 neighbourhood around each fragment so dots that have\n * scaled away from their home cell are still drawn.\n */\nconst FRAG = `#version 300 es\nprecision highp float;\n\nuniform float u_time;\nuniform vec2 u_res;\nout vec4 fragColor;\n\n#define PI 3.14159265359\n#define CELL 18.0 /* px per grid cell */\n#define RADIUS 2.1 /* dot radius in px */\n#define SPEED 25.0 /* wave propagation */\n#define PERIOD 3.8 /* seconds per cycle */\n#define AMP 0.40 /* wave amplitude */\n#define BASE 1.30 /* resting scale */\n\nfloat swave(float t, float k) {\n return (2.0 * AMP / PI) * atan(sin(2.0 * PI * t / PERIOD) / k);\n}\n\nvoid main() {\n vec2 p = gl_FragCoord.xy;\n vec2 center = u_res * 0.5;\n vec2 gridP = p / CELL;\n\n float alpha = 0.0;\n\n for (int dy = -2; dy <= 2; dy++) {\n for (int dx = -2; dx <= 2; dx++) {\n /* grid cell index of this neighbour */\n vec2 cell = floor(gridP) + vec2(float(dx), float(dy));\n\n /* hex stagger: odd x-columns shift down half a cell */\n float hexY = mod(cell.x, 2.0) * 0.5;\n\n /* dot centre in grid units relative to screen centre */\n vec2 origGU = cell + vec2(0.5, 0.5 + hexY) - center / CELL;\n\n /* distance with 8-fold angular symmetry → petal wave-front */\n float d8 = length(origGU) + 0.5 * cos(8.0 * atan(origGU.y, origGU.x));\n\n /* smooth-square-wave breathing */\n float k = 0.15 + 0.2 * abs(d8) / 72.0;\n float wave = swave(u_time - d8 / SPEED, k);\n float scale = wave + BASE;\n\n /* animated dot centre in pixel space */\n vec2 animPx = origGU * scale * CELL + center;\n\n /* soft circle SDF */\n float dist = length(p - animPx);\n float a = 1.0 - smoothstep(RADIUS - 0.6, RADIUS + 0.6, dist);\n alpha = max(alpha, a);\n }\n }\n\n /* primary colour #ff4235 at low opacity — sits on frosted-glass overlay */\n fragColor = vec4(1.0, 0.259, 0.208, alpha * 0.28);\n}`;\n\n// ── WebGL helpers ──────────────────────────────────────────────────────────\nfunction buildProgram(gl: WebGL2RenderingContext): WebGLProgram {\n\tconst compile = (type: number, src: string) => {\n\t\t// biome-ignore lint/style/noNonNullAssertion: WebGL createShader returns null only on driver failure, which aborts rendering anyway\n\t\tconst s = gl.createShader(type)!;\n\t\tgl.shaderSource(s, src);\n\t\tgl.compileShader(s);\n\t\treturn s;\n\t};\n\t// biome-ignore lint/style/noNonNullAssertion: WebGL createProgram returns null only on driver failure, which aborts rendering anyway\n\tconst prog = gl.createProgram()!;\n\tgl.attachShader(prog, compile(gl.VERTEX_SHADER, VERT));\n\tgl.attachShader(prog, compile(gl.FRAGMENT_SHADER, FRAG));\n\tgl.linkProgram(prog);\n\treturn prog;\n}\n\n// ── Component ──────────────────────────────────────────────────────────────\ninterface BreathingDotsCanvasProps {\n\tactive: boolean;\n}\n\nexport function BreathingDotsCanvas({ active }: BreathingDotsCanvasProps) {\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\n\tuseEffect(() => {\n\t\tif (!active || !canvasRef.current) return;\n\t\tif (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n\n\t\tconst canvas = canvasRef.current;\n\t\tconst gl = canvas.getContext(\"webgl2\", { alpha: true, premultipliedAlpha: false });\n\t\tif (!gl) return;\n\n\t\tconst resize = () => {\n\t\t\tcanvas.width = window.innerWidth;\n\t\t\tcanvas.height = window.innerHeight;\n\t\t\tgl.viewport(0, 0, canvas.width, canvas.height);\n\t\t\tgl.uniform2f(uRes, canvas.width, canvas.height);\n\t\t};\n\n\t\tconst prog = buildProgram(gl);\n\t\t// biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL method, not a React hook\n\t\tgl.useProgram(prog);\n\n\t\t// Fullscreen quad\n\t\tconst buf = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buf);\n\t\tgl.bufferData(\n\t\t\tgl.ARRAY_BUFFER,\n\t\t\tnew Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),\n\t\t\tgl.STATIC_DRAW,\n\t\t);\n\t\tconst aPos = gl.getAttribLocation(prog, \"a_pos\");\n\t\tgl.enableVertexAttribArray(aPos);\n\t\tgl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);\n\n\t\tconst uTime = gl.getUniformLocation(prog, \"u_time\");\n\t\tconst uRes = gl.getUniformLocation(prog, \"u_res\");\n\t\tgl.enable(gl.BLEND);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n\t\tresize();\n\t\twindow.addEventListener(\"resize\", resize);\n\n\t\tconst start = performance.now();\n\t\tlet raf: number;\n\n\t\tconst draw = () => {\n\t\t\tgl.uniform1f(uTime, (performance.now() - start) / 1000);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tgl.drawArrays(gl.TRIANGLES, 0, 6);\n\t\t\traf = requestAnimationFrame(draw);\n\t\t};\n\t\traf = requestAnimationFrame(draw);\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(raf);\n\t\t\twindow.removeEventListener(\"resize\", resize);\n\t\t};\n\t}, [active]);\n\n\t// biome-ignore lint/a11y/noAriaHiddenOnFocusable: canvas is purely decorative and not keyboard-focusable\n\treturn <canvas ref={canvasRef} className={styles.canvas} aria-hidden=\"true\" />;\n}\n","@layer ds-components {\n /* ── Overlay shell — backdrop + WebGL canvas ──────────────────────── */\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ds-z-modal);\n\n /* Starting state */\n opacity: 0;\n pointer-events: none;\n backdrop-filter: blur(0px) saturate(100%);\n background-color: transparent;\n\n transition:\n opacity var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n backdrop-filter var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n background-color var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n overlay var(--ds-duration-base, 250ms) allow-discrete,\n display var(--ds-duration-base, 250ms) allow-discrete;\n }\n\n /* ── Open state ───────────────────────────────────────────────────── */\n .overlay[data-open=\"true\"] {\n opacity: 1;\n pointer-events: auto;\n backdrop-filter: blur(20px) saturate(160%);\n background-color: color-mix(in srgb, var(--ds-color-surface, #fff) 88%, transparent);\n\n @starting-style {\n opacity: 0;\n backdrop-filter: blur(0px) saturate(100%);\n background-color: transparent;\n }\n }\n\n /* ── Close state — faster than open ──────────────────────────────── */\n .overlay[data-open=\"false\"] {\n opacity: 0;\n pointer-events: none;\n transition:\n opacity var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n backdrop-filter var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n background-color var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n overlay var(--ds-duration-fast, 150ms) allow-discrete,\n display var(--ds-duration-fast, 150ms) allow-discrete;\n }\n\n /* ── Logo layer — sits above the backdrop stacking context ────────── */\n /*\n * Separate position: fixed layer above the overlay so the logo never\n * fights the WebGL canvas GPU layer inside a backdrop-filter stacking\n * context.\n *\n * z-index fallback (401) covers the case where --ds-z-modal is defined on\n * .tot-ds-root and is therefore NOT inherited by portal elements (they are\n * children of <body>, not of .tot-ds-root).\n */\n .logoLayer {\n position: fixed;\n inset: 0;\n z-index: calc(var(--ds-z-modal, 400) + 1);\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n\n /*\n * No @starting-style needed here — the element is always in the DOM\n * (portal fragment mounts once). [data-open] state changes drive the\n * opacity transition via regular CSS transitions.\n */\n .logoLayer[data-open=\"true\"] {\n opacity: 1;\n transition: opacity var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n .logoLayer[data-open=\"false\"] {\n opacity: 0;\n transition: opacity var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0);\n }\n\n /* ── Reduced motion ───────────────────────────────────────────────── */\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .overlay[data-open=\"true\"],\n .overlay[data-open=\"false\"],\n .logoLayer,\n .logoLayer[data-open=\"true\"],\n .logoLayer[data-open=\"false\"] {\n transition: none;\n backdrop-filter: none;\n }\n }\n\n /* ── Screen-reader text ───────────────────────────────────────────── */\n /*\n * Portal sibling of the overlay and logo divs — never inside any stacking\n * context. Uses clip-path (modern, non-deprecated) and an explicit\n * font-family because portal renders outside .tot-ds-root and cannot\n * inherit the token-root font.\n */\n .srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n font-family: var(--ds-font-family, \"Manrope\", system-ui, sans-serif);\n }\n}\n","@layer ds-components {\n /* ── Outer wrapper — rings radiate from here ──────────────────────── */\n /*\n * will-change: transform promotes this element to its own GPU compositing\n * layer. Combined with z-index: 1, the browser compositor places it above\n * the WebGL canvas layer (which Chrome always promotes to its own layer),\n * regardless of backdrop-filter stacking-context paint order.\n */\n .outer {\n position: relative;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 120px;\n height: 120px;\n }\n\n /* ── Elevated circle ──────────────────────────────────────────────── */\n .circle {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 96px;\n height: 96px;\n border-radius: 50%;\n background-color: var(--ds-color-surface);\n box-shadow:\n var(--ds-shadow-xl),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n animation: circle-lift var(--ds-duration-slow, 400ms) ease-in-out infinite alternate;\n }\n\n @keyframes circle-lift {\n from {\n box-shadow:\n var(--ds-shadow-xl),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n transform: translateY(0px);\n }\n to {\n box-shadow:\n var(--ds-shadow-xl),\n 0 24px 40px oklch(0% 0 0 / 0.14),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n transform: translateY(-4px);\n }\n }\n\n /* ── Logo SVG ─────────────────────────────────────────────────────── */\n .logo {\n width: 52px;\n height: 52px;\n }\n\n .pathDark {\n fill: var(--ds-color-text);\n }\n\n .pathRed {\n fill: var(--ds-color-primary);\n transform-origin: 47px 55px;\n animation: red-breathe 1.6s ease-in-out infinite alternate;\n }\n\n @keyframes red-breathe {\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(1.08); opacity: 0.85; }\n }\n\n /* ── Wave rings ───────────────────────────────────────────────────── */\n .ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n border: 1.5px solid var(--ds-color-primary);\n animation: wave-ring 2.2s cubic-bezier(0.16, 1, 0.3, 1) infinite;\n }\n\n .ring:nth-child(2) { animation-delay: -0.73s; }\n .ring:nth-child(3) { animation-delay: -1.47s; }\n\n @keyframes wave-ring {\n 0% { transform: scale(0.6); opacity: 0.6; }\n 100% { transform: scale(2.4); opacity: 0; }\n }\n\n /* ── Reduced motion ───────────────────────────────────────────────── */\n @media (prefers-reduced-motion: reduce) {\n .circle {\n animation: none;\n box-shadow: var(--ds-shadow-xl), 0 0 0 1px oklch(0% 0 0 / 0.04);\n }\n .pathRed { animation: none; }\n .ring { display: none; }\n }\n}\n","import styles from \"./ToteatLogo.module.css\";\n\n/**\n * Toteat isotipo inside an elevated circle, with radiating wave rings.\n * Ported from design_system_vue/LogoToteat/svg/toteat-isotipo-original.svg.\n */\nexport function ToteatLogo() {\n\treturn (\n\t\t<div className={styles.outer} aria-hidden=\"true\">\n\t\t\t{/* Wave rings radiate behind the circle */}\n\t\t\t<div className={styles.ring} />\n\t\t\t<div className={styles.ring} />\n\t\t\t<div className={styles.ring} />\n\n\t\t\t{/* Elevated circle card */}\n\t\t\t<div className={styles.circle}>\n\t\t\t\t<svg\n\t\t\t\t\tclassName={styles.logo}\n\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName={styles.pathDark}\n\t\t\t\t\t\td=\"M47.328 24.999V10H32.329v14.999h-15v15h15v14.999h14.999V39.999h14.999V25z\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName={styles.pathRed}\n\t\t\t\t\t\td=\"M32.328 40a15 15 0 0 0 14.998 15h15v15H47.329a15 15 0 0 1-15-15z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { createPortal } from \"react-dom\";\nimport { BreathingDotsCanvas } from \"./BreathingDotsCanvas\";\nimport styles from \"./PageLoadingOverlay.module.css\";\nimport { ToteatLogo } from \"./ToteatLogo\";\n\nexport interface PageLoadingOverlayProps {\n\tisOpen: boolean;\n\t/** Screen-reader announcement text. Defaults to \"Cargando…\" */\n\tlabel?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Full-screen blocking overlay for page-level loading states.\n *\n * Shows a frosted-glass backdrop with a WebGL breathing-dots animation and\n * the Toteat isotipo in an elevated circle. Renders via a React portal so it\n * always escapes any ancestor stacking context.\n *\n * Usage:\n * <PageLoadingOverlay isOpen={isPending} />\n * <PageLoadingOverlay isOpen={isPending} label=\"Guardando cambios…\" />\n */\nexport function PageLoadingOverlay({\n\tisOpen,\n\tlabel = \"Cargando…\",\n\t\"data-testid\": testId,\n}: PageLoadingOverlayProps) {\n\treturn createPortal(\n\t\t<>\n\t\t\t{/*\n\t\t\t * Layer 1 — backdrop + WebGL animation (z-index: --ds-z-modal).\n\t\t\t * backdrop-filter creates its own stacking context; the logo lives in a\n\t\t\t * separate layer above so there is no GPU-layer compositing fight.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tclassName={styles.overlay}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\trole=\"status\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-busy={isOpen}\n\t\t\t\taria-label={label}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t<BreathingDotsCanvas active={isOpen} />\n\t\t\t</div>\n\n\t\t\t{/*\n\t\t\t * Layer 2 — logo (z-index: --ds-z-modal + 1).\n\t\t\t * tot-ds-root is applied so CSS custom properties resolve inside the\n\t\t\t * portal — portal elements are children of <body>, not of .tot-ds-root,\n\t\t\t * so they cannot inherit --ds-* variables without this class.\n\t\t\t */}\n\t\t\t<div className={`${styles.logoLayer} tot-ds-root`} data-open={isOpen} aria-hidden=\"true\">\n\t\t\t\t<ToteatLogo />\n\t\t\t</div>\n\n\t\t\t{/* Live region — sr-only, outside both stacking contexts */}\n\t\t\t<span className={styles.srOnly} aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{isOpen ? label : \"\"}\n\t\t\t</span>\n\t\t</>,\n\t\tdocument.body,\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nexport interface PermissionGateProps {\n\t/** Permission decision resolved by the consumer app. When false, renders fallback. */\n\tallowed: boolean;\n\t/** Rendered when allowed is true. */\n\tchildren: ReactNode;\n\t/** Rendered when allowed is false. @default null */\n\tfallback?: ReactNode;\n\t/**\n\t * Accepted to satisfy the DS `data-testid` convention and to let consumers spread\n\t * a testid coming from a parent without a TypeScript error. It is intentionally\n\t * UNUSED: this component renders a React fragment with no DOM root to attach it to\n\t * (identical to `React.Fragment`, which also ignores `data-testid`). If you need a\n\t * testable DOM node, put it on the children you pass in.\n\t */\n\t\"data-testid\"?: string;\n}\n\n/**\n * PermissionGate — a purely PRESENTATIONAL / STRUCTURAL primitive.\n *\n * It contains NO RBAC logic: no scopes, no bitwise actions, no hooks, no stores.\n * Each consumer app computes the permission decision and passes it in as the\n * `allowed` boolean. When `allowed` is true the `children` are rendered, otherwise\n * the `fallback` (default `null`) is rendered.\n *\n * It renders a React fragment with NO DOM wrapper, so it never injects an anonymous\n * layout node into a flex/grid container. There is no `.module.css` for this\n * component because it has no visual surface of its own.\n */\nexport function PermissionGate({ allowed, children, fallback = null }: PermissionGateProps) {\n\treturn <>{allowed ? children : fallback}</>;\n}\n","@layer ang-components {\n .overlay {\n position: fixed;\n inset: 0;\n z-index: 100;\n background-color: var(--ds-ang-neutral-100);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow-y: auto;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./PinLockOverlay.module.css\";\n\nexport interface PinLockOverlayProps {\n\tisLocked: boolean;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function PinLockOverlay({ isLocked, children, \"data-testid\": testId }: PinLockOverlayProps) {\n\tif (!isLocked) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.overlay}\n\t\t\trole=\"dialog\"\n\t\t\taria-label=\"Pantalla bloqueada — ingresa tu PIN\"\n\t\t\taria-modal=\"true\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .tile {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-1);\n padding: var(--ds-space-3);\n background: var(--ds-color-surface);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-lg);\n cursor: pointer;\n text-align: center;\n min-height: 90px;\n position: relative;\n transition:\n background var(--ds-duration-fast) var(--ds-ease-out),\n border-color var(--ds-duration-fast) var(--ds-ease-out),\n transform var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover:not(:disabled) {\n background: var(--ds-color-primary-50);\n border-color: var(--ds-color-primary-light);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.96);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n\n &:disabled,\n &[data-stock=\"depleted\"] {\n opacity: 0.45;\n cursor: not-allowed;\n }\n\n &[data-stock=\"low\"] {\n border-color: var(--ds-color-warning);\n }\n }\n\n .image {\n width: 48px;\n height: 48px;\n object-fit: cover;\n border-radius: var(--ds-radius-sm);\n flex-shrink: 0;\n }\n\n .name {\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-semibold);\n color: var(--ds-color-text);\n line-height: var(--ds-leading-tight);\n word-break: break-word;\n }\n\n .price {\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-bold);\n color: var(--ds-color-primary);\n margin-top: auto;\n }\n\n .badge {\n position: absolute;\n top: var(--ds-space-1);\n right: var(--ds-space-1);\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-bold);\n border-radius: var(--ds-radius-full);\n padding: 1px 5px;\n line-height: 1.4;\n\n &[data-type=\"extras\"] {\n background: var(--ds-color-primary-100);\n color: var(--ds-color-primary);\n }\n\n &[data-type=\"weighed\"] {\n background: var(--ds-color-info-light);\n color: var(--ds-color-info-dark);\n }\n\n &[data-type=\"low-stock\"] {\n background: var(--ds-color-warning-light);\n color: var(--ds-color-warning-dark);\n }\n }\n}\n","import { memo } from \"react\";\n\nexport type StockStatusType = \"normal\" | \"low\" | \"depleted\";\n\nexport type ProductTileType = {\n\tid: string;\n\tname: string;\n\timageUrl: string | null;\n\tprice: number;\n\thasExtras: boolean;\n\tisWeighed: boolean;\n\tbarcode: string | null;\n\tstockStatus: StockStatusType;\n\tcategoryId: string;\n\textrasHierarchyIds: string[];\n};\n\nimport styles from \"./ProductTile.module.css\";\n\nexport type ProductTileProps = {\n\tproduct: ProductTileType;\n\tonAdd: (product: ProductTileType) => void;\n\t\"data-testid\"?: string;\n};\n\nfunction ProductTileComponent({ product, onAdd, \"data-testid\": testId }: ProductTileProps) {\n\tlet stockData: \"depleted\" | \"low\" | undefined;\n\tif (product.stockStatus === \"depleted\") stockData = \"depleted\";\n\telse if (product.stockStatus === \"low\") stockData = \"low\";\n\n\tconst isDisabled = product.stockStatus === \"depleted\";\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={styles.tile}\n\t\t\tdata-stock={stockData}\n\t\t\tonClick={() => {\n\t\t\t\tif (!isDisabled) onAdd(product);\n\t\t\t}}\n\t\t\tdisabled={isDisabled}\n\t\t\taria-label={`${product.name}, $${product.price.toLocaleString(\"es-CL\")}`}\n\t\t\taria-disabled={isDisabled}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{product.imageUrl && (\n\t\t\t\t<img\n\t\t\t\t\tsrc={product.imageUrl}\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className={styles.name}>{product.name}</span>\n\t\t\t<span className={styles.price}>${product.price.toLocaleString(\"es-CL\")}</span>\n\n\t\t\t{product.hasExtras && (\n\t\t\t\t<span className={styles.badge} data-type=\"extras\" role=\"img\" aria-label=\"Tiene extras\">\n\t\t\t\t\t+\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{product.isWeighed && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={styles.badge}\n\t\t\t\t\tdata-type=\"weighed\"\n\t\t\t\t\trole=\"img\"\n\t\t\t\t\taria-label=\"Producto por peso\"\n\t\t\t\t>\n\t\t\t\t\tkg\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{product.stockStatus === \"low\" && (\n\t\t\t\t<span className={styles.badge} data-type=\"low-stock\" role=\"img\" aria-label=\"Stock bajo\">\n\t\t\t\t\t!\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</button>\n\t);\n}\n\nexport const ProductTile = memo(ProductTileComponent);\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n .circle {\n flex-shrink: 0;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background-color: var(--color-surface);\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-circle);\n transition:\n background-color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n\n &::after {\n content: '';\n display: block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-circle);\n background-color: transparent;\n transition: background-color var(--duration-fast) var(--ease-out);\n }\n }\n\n .wrapper:hover:not(:has(.input:disabled)) .circle {\n border-color: var(--color-neutral-400);\n }\n\n .input:checked + .circle {\n border-color: var(--color-primary);\n\n &::after {\n background-color: var(--color-primary);\n }\n }\n\n .input:focus-visible + .circle {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n }\n\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n color: var(--color-text);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Radio.module.css\";\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Radio({ label, className, id, ref, \"data-testid\": testId, ...props }: RadioProps) {\n\tconst inputId = id ?? `radio-${props.value}`;\n\treturn (\n\t\t<label\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\thtmlFor={inputId}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<input ref={ref} type=\"radio\" id={inputId} className={styles.input} {...props} />\n\t\t\t<span className={styles.circle} aria-hidden=\"true\" />\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n\t.root {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tinline-size: 100%;\n\t}\n\n\t.input {\n\t\tinline-size: 100%;\n\t\tmargin: 0;\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tcolor: var(--ds-color-text);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-normal);\n\t\tpadding-block: var(--ds-space-2);\n\t\t/* Trailing space reserves room for the clear button tap target. */\n\t\tpadding-inline: var(--ds-space-3) var(--ds-target-size-min);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t\tborder-color: var(--ds-focus-color);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--ds-color-text-muted);\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t/* Hide the UA-native search clear affordance; we render our own. */\n\t\t&::-webkit-search-cancel-button {\n\t\t\tappearance: none;\n\t\t}\n\t}\n\n\t.root[data-size=\"sm\"] .input {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tpadding-block: var(--ds-space-1);\n\t}\n\n\t.root[data-size=\"lg\"] .input {\n\t\tfont-size: var(--ds-font-size-base);\n\t\tpadding-block: var(--ds-space-3);\n\t}\n\n\t.clear {\n\t\tposition: absolute;\n\t\tinset-inline-end: 0;\n\t\tinset-block-start: 50%;\n\t\ttranslate: 0 -50%;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: var(--ds-color-text-muted);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:hover {\n\t\t\tcolor: var(--ds-color-text);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.input {\n\t\t\ttransition: border-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\n\t\t.clear {\n\t\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./SearchInput.module.css\";\n\nexport type SearchInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SearchInputProps\n\textends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n\t/**\n\t * Fired on every input change, debounced by `debounceMs`.\n\t *\n\t * Controlled-mode note: when a `value` prop is provided the component is\n\t * controlled and the clear button also fires the debounced `onSearch(\"\")`,\n\t * but it CANNOT reset the input itself — the consumer owns `value`. Reset it\n\t * in your `onClear`/`onSearch` handler, otherwise the field keeps its value.\n\t */\n\tonSearch?: (value: string) => void;\n\t/**\n\t * Fired when the clear button is pressed.\n\t *\n\t * Uncontrolled: the internal value is reset to \"\" before this fires.\n\t * Controlled (a `value` prop is provided): the component does NOT (and\n\t * cannot) reset the input — you own `value`. Reset it here (or in\n\t * `onSearch`) to actually clear the field; the click already fired the\n\t * debounced `onSearch(\"\")` for you.\n\t */\n\tonClear?: () => void;\n\t/** Debounce window for `onSearch`, in milliseconds. Defaults to 300. */\n\tdebounceMs?: number;\n\t/** Visual size of the field. Maps to `data-size` on the root. */\n\tsize?: SearchInputSize;\n\t/** Accessible label for the clear button. */\n\tclearLabel?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function SearchInput({\n\tonSearch,\n\tonClear,\n\tdebounceMs = 300,\n\tsize = \"md\",\n\tclearLabel = \"Limpiar búsqueda\",\n\tclassName,\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tdisabled,\n\t\"data-testid\": testId,\n\t...rest\n}: SearchInputProps) {\n\tconst isControlled = value !== undefined;\n\tconst [internalValue, setInternalValue] = useState(() => (defaultValue ?? \"\").toString());\n\tconst currentValue = isControlled ? String(value) : internalValue;\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t// Native-timer cleanup on unmount — no library.\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timerRef.current !== null) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst fireSearch = (nextValue: string) => {\n\t\tif (!onSearch) return;\n\t\tif (timerRef.current !== null) {\n\t\t\tclearTimeout(timerRef.current);\n\t\t}\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tonSearch(nextValue);\n\t\t}, debounceMs);\n\t};\n\n\tconst handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst nextValue = event.target.value;\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(nextValue);\n\t\t}\n\t\tonChange?.(event);\n\t\tfireSearch(nextValue);\n\t};\n\n\tconst handleClear = () => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(\"\");\n\t\t}\n\t\tfireSearch(\"\");\n\t\tonClear?.();\n\t\tinputRef.current?.focus();\n\t};\n\n\tconst hasValue = currentValue.length > 0;\n\n\treturn (\n\t\t<div className={cn(styles.root, className)} data-size={size} data-testid={testId}>\n\t\t\t<input\n\t\t\t\t{...rest}\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"search\"\n\t\t\t\tclassName={styles.input}\n\t\t\t\tvalue={currentValue}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t/>\n\t\t\t{hasValue && !disabled && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.clear}\n\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close-outline\" size={20} aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .root {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-4);\n }\n\n .content {\n display: flex;\n align-items: center;\n gap: var(--ds-space-3);\n min-inline-size: 0;\n }\n\n .iconWrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--ds-color-text-muted);\n }\n\n .text {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n min-inline-size: 0;\n }\n\n .title {\n font-size: var(--ds-font-size-lg);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-tight);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .description {\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin: 0;\n }\n\n .actions {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n flex-shrink: 0;\n }\n}\n","import type { ReactNode } from \"react\";\nimport type { IconNameType as IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./SectionHeader.module.css\";\n\nexport interface SectionHeaderProps {\n\ttitle: string;\n\tdescription?: string;\n\ticon?: IconName;\n\ticonSize?: number;\n\theadingLevel?: 1 | 2 | 3 | 4;\n\tactions?: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function SectionHeader({\n\ttitle,\n\tdescription,\n\ticon,\n\ticonSize = 32,\n\theadingLevel = 2,\n\tactions,\n\tclassName,\n\t\"data-testid\": testId,\n}: SectionHeaderProps) {\n\tconst Heading = `h${headingLevel}` as const;\n\n\treturn (\n\t\t<header className={[styles.root, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t<div className={styles.content}>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className={styles.iconWrap} aria-hidden=\"true\">\n\t\t\t\t\t\t<Icon name={icon} size={iconSize} aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<div className={styles.text}>\n\t\t\t\t\t<Heading className={styles.title}>{title}</Heading>\n\t\t\t\t\t{description && <p className={styles.description}>{description}</p>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{actions && <div className={styles.actions}>{actions}</div>}\n\t\t</header>\n\t);\n}\n","@layer ds-components {\n\t.select {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t}\n\n\t.trigger {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.select[data-open] .trigger {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t}\n\n\t.select[data-error] .trigger {\n\t\tborder-color: var(--color-error);\n\n\t\t&:focus-visible {\n\t\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t\t}\n\t}\n\n\t.select[data-error][data-open] .trigger {\n\t\tborder-color: var(--color-error);\n\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t}\n\n\t.value {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.placeholder {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-neutral-400);\n\t}\n\n\t.chevron {\n\t\tflex-shrink: 0;\n\t\tmargin-left: var(--spacing-sm);\n\t\tcolor: var(--color-text-muted);\n\t\tfont-size: var(--text-sm);\n\t\ttransition: transform var(--duration-fast) var(--ease-out);\n\t}\n\n\t.select[data-open] .chevron {\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.dropdown {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tleft: 0;\n\t\tright: 0;\n\t\tz-index: var(--z-dropdown);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\tmax-height: 240px;\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: contain;\n\t}\n\n\t.search {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: none;\n\t\tborder-bottom: 1.5px solid var(--color-border);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t.option {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t}\n\n\t\t&[data-selected] {\n\t\t\tcolor: var(--color-primary);\n\t\t\tfont-weight: var(--font-medium);\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: -2px;\n\t\t}\n\t}\n\n\t.noResults {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t\ttext-align: center;\n\t}\n}\n","import { useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n}\n\nexport interface SelectProps {\n\toptions: SelectOption[];\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tplaceholder?: string;\n\tsearchable?: boolean;\n\tsearchPlaceholder?: string;\n\tnoResultsText?: string;\n\tdisabled?: boolean;\n\terror?: boolean;\n\tname?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Select({\n\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Seleccionar...\",\n\tsearchable = false,\n\tsearchPlaceholder = \"Buscar...\",\n\tnoResultsText = \"Sin resultados\",\n\tdisabled,\n\terror,\n\tname,\n\t\"data-testid\": dataTestId,\n}: SelectProps): React.ReactElement {\n\tconst [search, setSearch] = useState(\"\");\n\n\t// Shared dropdown core: open state, refs, toggle, focus-return-to-trigger.\n\t// Select keeps its own outside-click + Escape listeners because, unlike DropdownButton,\n\t// it returns focus to the trigger on outside-click; both reuse the hook's\n\t// `closeAndFocusTrigger`. Select has no roving keyboard nav (it relies on the optional\n\t// search field), so the hook's active-index handler is intentionally unused.\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\ttoggle,\n\t\tclose,\n\t\tcloseAndFocusTrigger: closeDropdown,\n\t} = useDropdown({ disabled, closeOnOutsideClick: false });\n\n\tconst selectedOption = options.find((o) => o.value === value);\n\tconst filteredOptions = searchable\n\t\t? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\n\t\t: options;\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: MouseEvent) => {\n\t\t\tif (!containerRef.current?.contains(e.target as Node)) closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handler);\n\t\treturn () => document.removeEventListener(\"mousedown\", handler);\n\t}, [isOpen, closeDropdown, containerRef]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handler);\n\t\treturn () => document.removeEventListener(\"keydown\", handler);\n\t}, [isOpen, closeDropdown]);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.select}\n\t\t\tdata-open={isOpen || undefined}\n\t\t\tdata-error={error || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<input type=\"hidden\" name={name} value={value ?? \"\"} />\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t<span className={selectedOption ? styles.value : styles.placeholder}>\n\t\t\t\t\t{selectedOption?.label ?? placeholder}\n\t\t\t\t</span>\n\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\">\n\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div className={styles.dropdown} role=\"listbox\">\n\t\t\t\t\t{searchable && (\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\t\t// biome-ignore lint/a11y/noAutofocus: search input needs focus when dropdown opens\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{filteredOptions.map((option) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\taria-selected={option.value === value}\n\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\tdata-selected={option.value === value || undefined}\n\t\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonChange?.(option.value);\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t\t{filteredOptions.length === 0 && <div className={styles.noResults}>{noResultsText}</div>}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n .item {\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-8);\n width: 100%;\n padding: var(--ds-ang-space-6) var(--ds-ang-space-8);\n background: none;\n border: none;\n border-radius: var(--ds-ang-radius-sm);\n text-align: left;\n cursor: pointer;\n color: var(--ds-ang-neutral-0);\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n line-height: 1.3;\n text-decoration: none;\n user-select: none;\n transition:\n background-color 100ms ease,\n font-weight 100ms ease,\n color 100ms ease;\n }\n\n /* Sub-items (inside .inner) inherit these overrides via CSS custom props */\n .item:hover {\n background-color: var(--_item-hover-bg, var(--ds-ang-tertiary));\n color: var(--_item-hover-color, var(--ds-ang-secondary));\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .item.active,\n .item[data-active] {\n background-color: var(--_item-hover-bg, var(--ds-ang-tertiary));\n color: var(--_item-hover-color, var(--ds-ang-secondary));\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .item:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./SidebarNavItem.module.css\";\n\nexport { styles as sidebarNavItemStyles };\nexport const sidebarNavItemClass = styles.item;\nexport const sidebarNavItemActiveClass = styles.active;\n\nexport interface SidebarNavItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tlabel: string;\n\tisActive?: boolean;\n}\n\nexport function SidebarNavItem({\n\tlabel,\n\tisActive = false,\n\tclassName,\n\ttype = \"button\",\n\t...rest\n}: SidebarNavItemProps) {\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tclassName={cn(styles.item, isActive && styles.active, className)}\n\t\t\tdata-active={isActive || undefined}\n\t\t\t{...rest}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n}\n","import { useCallback, useState } from \"react\";\n\nexport type UseToggleReturn = [boolean, () => void, React.Dispatch<React.SetStateAction<boolean>>];\n\n/**\n * Minimal boolean toggle state. Returns `[state, toggle, setState]`.\n * Internal hook — not part of the public API. Used to de-duplicate the\n * open/close booleans in Accordion and SidebarNavSection.\n */\nexport function useToggle(initial = false): UseToggleReturn {\n\tconst [state, setState] = useState(initial);\n\tconst toggle = useCallback(() => setState((s) => !s), []);\n\treturn [state, toggle, setState];\n}\n","@layer ang-components {\n .section {\n display: flex;\n flex-direction: column;\n }\n\n .trigger {\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-8);\n width: 100%;\n padding: var(--ds-ang-space-6) var(--ds-ang-space-8);\n background: none;\n border: none;\n border-radius: var(--ds-ang-radius-sm);\n text-align: left;\n cursor: pointer;\n color: var(--ds-ang-neutral-0);\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n line-height: 1.3;\n user-select: none;\n transition:\n background-color 100ms ease,\n font-weight 100ms ease,\n color 100ms ease;\n }\n\n .trigger:hover,\n .trigger[data-open],\n .trigger[data-active] {\n background-color: var(--ds-ang-tertiary);\n color: var(--ds-ang-secondary);\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .trigger:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .title {\n flex: 1;\n }\n\n .chevron {\n display: block;\n width: 6px;\n height: 6px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(45deg);\n transition: transform 200ms ease-in-out;\n flex-shrink: 0;\n margin-right: var(--ds-ang-space-4);\n }\n\n .trigger[data-open] .chevron {\n transform: rotate(-135deg);\n }\n\n .content {\n overflow: hidden;\n max-height: 0;\n transition: max-height 200ms ease-in-out;\n }\n\n .content[data-open] {\n max-height: 1000px;\n }\n\n .inner {\n margin-left: var(--ds-ang-space-16);\n padding-left: var(--ds-ang-space-12);\n padding-bottom: var(--ds-ang-space-4);\n margin-top: var(--ds-ang-space-8);\n border-left: 1.5px solid var(--ds-ang-neutral-500);\n /* Sub-items use neutral-500 bg + white text on hover/active */\n --_item-hover-bg: var(--ds-ang-neutral-500);\n --_item-hover-color: var(--ds-ang-neutral-0);\n }\n\n .suffix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useToggle } from \"../../hooks/useToggle\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./SidebarNavSection.module.css\";\n\nexport interface SidebarNavSectionProps {\n\ttitle: string;\n\ticon?: ReactNode;\n\ttitleSuffix?: ReactNode;\n\tdefaultOpen?: boolean;\n\tisActive?: boolean;\n\tclassName?: string;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function SidebarNavSection({\n\ttitle,\n\ticon,\n\ttitleSuffix,\n\tdefaultOpen = false,\n\tisActive = false,\n\tclassName,\n\tchildren,\n\t\"data-testid\": testId,\n}: SidebarNavSectionProps) {\n\tconst [isOpen, toggleOpen] = useToggle(defaultOpen);\n\n\treturn (\n\t\t<div className={cn(styles.section, className)} data-testid={testId}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tdata-open={isOpen || undefined}\n\t\t\t\tdata-active={isActive || undefined}\n\t\t\t\tonClick={toggleOpen}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t{titleSuffix && (\n\t\t\t\t\t<span className={styles.suffix} aria-hidden=\"true\">\n\t\t\t\t\t\t{titleSuffix}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\" />\n\t\t\t</button>\n\t\t\t<div className={styles.content} data-open={isOpen || undefined} inert={!isOpen || undefined}>\n\t\t\t\t<div className={styles.inner}>{children}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type React from \"react\";\nimport type { BadgeSize, BadgeVariant } from \"../Badge\";\nimport { Badge } from \"../Badge\";\n\nexport interface StatusBadgeProps {\n\tstatus: string;\n\tlabels: Record<string, string>;\n\tvariants: Record<string, BadgeVariant>;\n\tfallbackLabel?: string;\n\tfallbackVariant?: BadgeVariant;\n\tsize?: BadgeSize;\n\t\"data-testid\"?: string;\n}\n\nexport function StatusBadge({\n\tstatus,\n\tlabels,\n\tvariants,\n\tfallbackLabel,\n\tfallbackVariant = \"default\",\n\tsize,\n\t\"data-testid\": testId,\n}: StatusBadgeProps): React.ReactElement {\n\treturn (\n\t\t<Badge variant={variants[status] ?? fallbackVariant} size={size} data-testid={testId}>\n\t\t\t{labels[status] ?? fallbackLabel ?? status}\n\t\t</Badge>\n\t);\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { Icon } from \"../Icon\";\n\n/**\n * Shared presentational/ARIA shell for notification-surface primitives\n * (UserNotification, StatusBanner). INTERNAL — never exported from any index.ts.\n *\n * Owns only structure + ARIA. Each caller supplies its own CSS-module root\n * class (`rootClassName`) so visual variance (e.g. enter animation, inline-flex\n * vs flex) lives entirely in the caller's module.css.\n */\n\nexport type NotificationVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface NotificationBaseProps {\n\tvariant: NotificationVariant;\n\t/**\n\t * Caller's CSS-module root class (e.g. styles.notification / styles.statusBanner).\n\t * Typed loosely because CSS-module lookups widen to `string | undefined` under\n\t * `noUncheckedIndexedAccess`.\n\t */\n\trootClassName: string | undefined;\n\t/** Caller's content span class. */\n\tcontentClassName: string | undefined;\n\t/** Caller's action span class. */\n\tactionClassName: string | undefined;\n\ticon?: IconNameType;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\t/** Extra consumer-supplied className, merged after the module root class. */\n\tclassName?: string;\n\t\"data-testid\"?: string;\n\t/**\n\t * Trailing control (e.g. UserNotification passes <CloseButton/>).\n\t * StatusBanner omits it — no element is rendered when undefined.\n\t */\n\tdismissSlot?: React.ReactNode;\n\t/**\n\t * Adds aria-atomic=\"true\" to the root. Opt-in so callers that must keep a\n\t * frozen DOM (UserNotification) are unaffected.\n\t */\n\tariaAtomic?: boolean;\n}\n\nexport function NotificationBase({\n\tvariant,\n\trootClassName,\n\tcontentClassName,\n\tactionClassName,\n\ticon,\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n\tdismissSlot,\n\tariaAtomic,\n}: NotificationBaseProps): React.ReactElement {\n\tconst isError = variant === \"error\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[rootClassName, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\trole={isError ? \"alert\" : \"status\"}\n\t\t\taria-live={isError ? \"assertive\" : \"polite\"}\n\t\t\taria-atomic={ariaAtomic ? \"true\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{icon && <Icon name={icon} size={20} aria-hidden=\"true\" />}\n\t\t\t<span className={contentClassName}>{children}</span>\n\t\t\t{action && <span className={actionClassName}>{action}</span>}\n\t\t\t{dismissSlot}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.statusBanner {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t/*\n\t * Persistent surface — NO @starting-style enter animation. Only a soft\n\t * color transition when the variant changes, gated on motion preference.\n\t */\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.statusBanner {\n\t\t\ttransition:\n\t\t\t\tcolor var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\tbackground-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { NotificationBase } from \"../UserNotification/NotificationBase\";\nimport styles from \"./StatusBanner.module.css\";\n\nexport type StatusBannerVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface StatusBannerProps {\n\tvariant?: StatusBannerVariant;\n\ticon?: IconNameType;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Persistent, non-dismissable status surface (e.g. POS connectivity).\n * Shares the notification surface with UserNotification but never renders a\n * dismiss control. Uses `aria-atomic=\"true\"` so assistive tech re-announces the\n * full message when its content changes.\n */\nexport function StatusBanner({\n\tvariant = \"info\",\n\ticon,\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: StatusBannerProps): React.ReactElement {\n\treturn (\n\t\t<NotificationBase\n\t\t\tvariant={variant}\n\t\t\trootClassName={styles.statusBanner}\n\t\t\tcontentClassName={styles.content}\n\t\t\tactionClassName={styles.action}\n\t\t\ticon={icon}\n\t\t\taction={action}\n\t\t\tclassName={className}\n\t\t\tdata-testid={testId}\n\t\t\tariaAtomic\n\t\t>\n\t\t\t{children}\n\t\t</NotificationBase>\n\t);\n}\n","@layer ds-components {\n\t.stepper {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-1);\n\t\tpadding: var(--ds-space-1);\n\t\tborder: var(--ds-focus-width) solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tfont-family: var(--ds-font-family);\n\t}\n\n\t.button {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\tbackground-color: transparent;\n\t\tcolor: var(--ds-color-text);\n\t\tfont-size: var(--ds-font-size-lg);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tline-height: 1;\n\t\tcursor: pointer;\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--ds-color-text-muted);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.value {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-inline-size: var(--ds-space-8);\n\t\tpadding-inline: var(--ds-space-2);\n\t\tcolor: var(--ds-color-text);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tfont-variant-numeric: tabular-nums;\n\t\ttext-align: center;\n\t}\n\n\t/* Static (no-motion) baseline: instant background change. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.button {\n\t\t\ttransition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepperProps {\n\tvalue: number;\n\tonChange: (value: number) => void;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdisabled?: boolean;\n\tdecrementLabel?: string;\n\tincrementLabel?: string;\n\tclassName?: string;\n\t/** Accessible name for the `role=\"group\"` container. Required — an unnamed group is an a11y violation. */\n\t\"aria-label\": string;\n\t\"data-testid\"?: string;\n}\n\nexport function Stepper({\n\tvalue,\n\tonChange,\n\tmin = 0,\n\tmax,\n\tstep = 1,\n\tdisabled = false,\n\tdecrementLabel = \"Decrease\",\n\tincrementLabel = \"Increase\",\n\tclassName,\n\t\"aria-label\": ariaLabel,\n\t\"data-testid\": testId,\n}: StepperProps): React.ReactElement {\n\t// Defensive guards: a degenerate step (0, negative, NaN) must not no-op or invert\n\t// direction; a non-finite value must never be clamped/displayed/emitted as-is.\n\tconst effectiveStep = Number.isFinite(step) && step > 0 ? step : 1;\n\t// Normalize bounds to finite values first: a non-finite min/max must never leak\n\t// into safeValue, the atMin/atMax checks, or the clamps below (would emit NaN).\n\tconst safeMin = Number.isFinite(min) ? min : 0;\n\tconst safeMax = max !== undefined && Number.isFinite(max) ? max : undefined;\n\tconst safeValue = Number.isFinite(value) ? value : safeMin;\n\n\tconst atMin = safeValue <= safeMin;\n\tconst atMax = safeMax !== undefined && safeValue >= safeMax;\n\n\tconst decrement = (): void => {\n\t\tconst next = Math.max(safeMin, safeValue - effectiveStep);\n\t\tif (next !== safeValue) {\n\t\t\tonChange(next);\n\t\t}\n\t};\n\n\tconst increment = (): void => {\n\t\tconst upperBound =\n\t\t\tsafeMax !== undefined\n\t\t\t\t? Math.min(safeMax, safeValue + effectiveStep)\n\t\t\t\t: safeValue + effectiveStep;\n\t\tif (upperBound !== safeValue) {\n\t\t\tonChange(upperBound);\n\t\t}\n\t};\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: role=\"group\" per DS spec; a <fieldset> would force a layout-breaking border/legend wrapper and violate the minimal-DOM primitive rule\n\t\t<div\n\t\t\tclassName={cn(styles.stepper, className)}\n\t\t\trole=\"group\"\n\t\t\taria-label={ariaLabel}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.button}\n\t\t\t\tonClick={decrement}\n\t\t\t\tdisabled={disabled || atMin}\n\t\t\t\taria-label={decrementLabel}\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">&minus;</span>\n\t\t\t</button>\n\t\t\t<output className={styles.value} aria-live=\"polite\">\n\t\t\t\t{safeValue}\n\t\t\t</output>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.button}\n\t\t\t\tonClick={increment}\n\t\t\t\tdisabled={disabled || atMax}\n\t\t\t\taria-label={incrementLabel}\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">&plus;</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n /* Pills wrapper around the composed GroupedButtons segmented control */\n .tab {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm);\n background-color: var(--ds-color-white);\n border-radius: var(--radius-xl);\n box-shadow: var(--ds-shadow-1, 0 1px 2px color-mix(in srgb, var(--color-neutral-300) 54%, transparent));\n width: fit-content;\n flex-shrink: 0;\n\n &[data-full-width] {\n width: 100%;\n }\n }\n\n /* Make the composed fieldset behave like a row of independent pills */\n .tab .group {\n gap: var(--spacing-sm);\n overflow: visible;\n }\n\n /* Reset GroupedButtons' joined-segment look into standalone pills */\n .tab .group :is(button) {\n border: none;\n border-radius: var(--radius-xl);\n background-color: transparent;\n color: var(--color-neutral-500);\n font-weight: 500;\n }\n\n .tab .group :is(button):hover:not(:disabled):not([data-selected]) {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n .tab .group :is(button):disabled {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-300);\n opacity: 1;\n }\n\n /* Selected pill color — driven by data-selected-color on the wrapper */\n .tab[data-selected-color=\"primary\"] .group :is(button)[data-selected] {\n background-color: var(--color-primary);\n color: var(--ds-color-white);\n }\n\n .tab[data-selected-color=\"secondary\"] .group :is(button)[data-selected] {\n background-color: var(--color-secondary);\n color: var(--ds-color-white);\n }\n\n .tab[data-selected-color=\"tertiary\"] .group :is(button)[data-selected] {\n background-color: var(--color-tertiary);\n color: var(--color-secondary);\n }\n\n .tab[data-selected-color=\"neutral-100\"] .group :is(button)[data-selected] {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n /* Icon fill follows text color on tertiary / neutral-100 selected pills */\n .tab[data-selected-color=\"tertiary\"] .group :is(button)[data-selected] svg,\n .tab[data-selected-color=\"neutral-100\"] .group :is(button)[data-selected] svg {\n fill: var(--color-secondary);\n }\n}\n","import { useRef, useState } from \"react\";\nimport type { GroupedButtonOption, GroupedButtonSize } from \"../GroupedButtons\";\nimport { GroupedButtons } from \"../GroupedButtons\";\nimport type { IconName } from \"../Icon\";\nimport styles from \"./Tab.module.css\";\n\nexport type TabValue = string | number;\n\nexport type TabSelectedColor = \"primary\" | \"secondary\" | \"tertiary\" | \"neutral-100\";\n\nexport interface TabItem {\n\tvalue: TabValue;\n\tlabel: string;\n\tdisabled?: boolean;\n\ticon?: IconName;\n\t/** Forwarded to this tab's `<button>` for use as a test/Playwright locator. */\n\t\"data-testid\"?: string;\n}\n\nexport interface TabProps {\n\t/** Tabs to render as a segmented control. */\n\ttabs: TabItem[];\n\t/** Accessible label for the tablist / button group. */\n\tlabel: string;\n\t/** Controlled selected value. When provided the caller owns selection. */\n\tselectedTab?: TabValue;\n\t/** Size of the control. Defaults to \"medium\". */\n\tsize?: GroupedButtonSize;\n\t/** Stretch the control to fill its container. Defaults to true (Vue3 parity). */\n\tfullWidth?: boolean;\n\t/** Color applied to the selected pill. Defaults to \"secondary\". */\n\tselectedColor?: TabSelectedColor;\n\t/** Fired whenever a (non-disabled) tab is selected. */\n\tonChange?: (value: TabValue) => void;\n\t/** Fired on tab click with the full tab descriptor. */\n\tonTabClick?: (tab: { value: TabValue; label: string }) => void;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Tab({\n\ttabs,\n\tlabel,\n\tselectedTab,\n\tsize = \"medium\",\n\tfullWidth = true,\n\tselectedColor = \"secondary\",\n\tonChange,\n\tonTabClick,\n\tclassName,\n\t\"data-testid\": testId,\n}: TabProps) {\n\tconst [internalValue, setInternalValue] = useState<TabValue | undefined>(() => tabs[0]?.value);\n\n\tconst isControlled = selectedTab !== undefined;\n\tconst current = isControlled ? selectedTab : internalValue;\n\n\tconst wasControlled = useRef(isControlled);\n\tif (process.env.NODE_ENV !== \"production\" && wasControlled.current !== isControlled) {\n\t\tconsole.error(\n\t\t\t\"Tab: `selectedTab` prop changed from %s to %s. A component cannot switch between controlled and uncontrolled modes.\",\n\t\t\twasControlled.current ? \"controlled\" : \"uncontrolled\",\n\t\t\tisControlled ? \"controlled\" : \"uncontrolled\",\n\t\t);\n\t}\n\n\tconst options: GroupedButtonOption[] = tabs.map((tab) => ({\n\t\tvalue: tab.value,\n\t\tlabel: tab.label,\n\t\tdisabled: tab.disabled,\n\t\ticon: tab.icon,\n\t\t\"data-testid\": tab[\"data-testid\"],\n\t}));\n\n\tconst handleChange = (value: TabValue) => {\n\t\tif (!isControlled) setInternalValue(value);\n\t\tconst tab = tabs.find((t) => t.value === value);\n\t\tif (tab) onTabClick?.({ value: tab.value, label: tab.label });\n\t\tonChange?.(value);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.tab, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\tdata-selected-color={selectedColor}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<GroupedButtons\n\t\t\t\tclassName={styles.group}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t\tselectedButton={current}\n\t\t\t\tsize={size}\n\t\t\t\tfullWidth={fullWidth}\n\t\t\t\tonChange={handleChange}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n .tabbar {\n height: var(--ds-ang-tab-height);\n min-height: var(--ds-ang-tab-height);\n max-height: var(--ds-ang-tab-height);\n background-color: var(--ds-ang-neutral-500);\n padding: 5px 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .tabbar[data-variant=\"expanded\"] {\n height: calc(var(--ds-ang-tab-height) + 58px);\n min-height: calc(var(--ds-ang-tab-height) + 58px);\n max-height: calc(var(--ds-ang-tab-height) + 58px);\n }\n\n .tabbar[data-variant=\"expanded-billing\"] {\n height: calc(var(--ds-ang-tab-height) + 118px);\n min-height: calc(var(--ds-ang-tab-height) + 118px);\n max-height: calc(var(--ds-ang-tab-height) + 118px);\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./TabBar.module.css\";\n\nexport type TabBarVariant = \"default\" | \"expanded\" | \"expanded-billing\";\n\nexport interface TabBarProps {\n\tvariant?: TabBarVariant;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function TabBar({ variant = \"default\", children, \"data-testid\": testId }: TabBarProps) {\n\treturn (\n\t\t<div className={styles.tabbar} role=\"tablist\" data-variant={variant} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.tabs {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\t}\n\n\t.tabList {\n\t\tdisplay: flex;\n\t\tgap: 0;\n\t\tborder-bottom: 1.5px solid var(--color-border);\n\t\toverflow-x: auto;\n\t\toverscroll-behavior-x: contain;\n\t\tscrollbar-width: none;\n\n\t\t&::-webkit-scrollbar {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t.tab {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\tflex: 0 0 auto;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\tpadding: var(--spacing-sm) var(--spacing-lg);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text-muted);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tborder-bottom: 2px solid transparent;\n\t\tmargin-bottom: -1.5px;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tcolor var(--duration-fast) var(--ease-out),\n\t\t\tborder-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled):not([data-active]) {\n\t\t\tcolor: var(--color-text);\n\t\t\tborder-bottom-color: var(--color-neutral-300);\n\t\t}\n\n\t\t&[data-active] {\n\t\t\tcolor: var(--color-primary);\n\t\t\tfont-weight: var(--font-semibold);\n\t\t\tborder-bottom-color: var(--color-primary);\n\t\t}\n\n\t\t&:disabled {\n\t\t\topacity: 0.4;\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 2px;\n\t\t\tborder-radius: var(--radius-sm);\n\t\t}\n\t}\n\n\t.panel {\n\t\tpadding-top: var(--spacing-lg);\n\t}\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n\tid: string;\n\tlabel: string;\n\tcontent?: ReactNode;\n\tdisabled?: boolean;\n}\n\nexport interface TabsProps {\n\titems: TabItem[];\n\tdefaultTab?: string;\n\t/** Controlled active tab id. When provided the caller owns active state; Tabs only calls onChange. */\n\tactiveTab?: string;\n\t/** Accessible label for the tablist — required when multiple tablists exist on the page. */\n\t\"aria-label\"?: string;\n\tonChange?: (tabId: string) => void;\n\t\"data-testid\"?: string;\n}\n\nexport function Tabs({\n\titems,\n\tdefaultTab,\n\tactiveTab: controlledTab,\n\t\"aria-label\": ariaLabel,\n\tonChange,\n\t\"data-testid\": testId,\n}: TabsProps): React.ReactElement {\n\tconst [internalTab, setInternalTab] = useState(defaultTab ?? items[0]?.id ?? \"\");\n\tconst isControlled = controlledTab !== undefined;\n\tconst activeTab = isControlled ? controlledTab : internalTab;\n\tconst tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst wasControlled = useRef(isControlled);\n\tconst didMount = useRef(false);\n\n\tif (process.env.NODE_ENV !== \"production\" && wasControlled.current !== isControlled) {\n\t\tconsole.error(\n\t\t\t\"Tabs: `activeTab` prop changed from %s to %s. A component cannot switch between controlled and uncontrolled modes.\",\n\t\t\twasControlled.current ? \"controlled\" : \"uncontrolled\",\n\t\t\tisControlled ? \"controlled\" : \"uncontrolled\",\n\t\t);\n\t}\n\n\tconst handleTabClick = (id: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalTab(id);\n\t\t}\n\t\tonChange?.(id);\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent, currentIndex: number) => {\n\t\tconst enabledItems = items.filter((item) => !item.disabled);\n\t\tconst enabledIds = enabledItems.map((item) => item.id);\n\t\tconst currentEnabledIndex = enabledIds.indexOf(items[currentIndex]?.id ?? \"\");\n\t\tlet targetId: string | undefined;\n\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentEnabledIndex + 1) % enabledIds.length];\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentEnabledIndex - 1 + enabledIds.length) % enabledIds.length];\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[0];\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[enabledIds.length - 1];\n\t\t}\n\n\t\tif (targetId) {\n\t\t\thandleTabClick(targetId);\n\t\t\ttabRefs.current.get(targetId)?.focus();\n\t\t}\n\t};\n\n\tconst activeContent = items.find((item) => item.id === activeTab)?.content;\n\n\tuseEffect(() => {\n\t\tif (!didMount.current) {\n\t\t\tdidMount.current = true;\n\t\t\treturn;\n\t\t}\n\t\ttabRefs.current.get(activeTab)?.scrollIntoView({ inline: \"nearest\", block: \"nearest\" });\n\t}, [activeTab]);\n\n\treturn (\n\t\t<div className={styles.tabs} data-testid={testId}>\n\t\t\t<div className={styles.tabList} role=\"tablist\" aria-label={ariaLabel}>\n\t\t\t\t{items.map((item, index) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\tif (el) tabRefs.current.set(item.id, el);\n\t\t\t\t\t\t\telse tabRefs.current.delete(item.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-selected={item.id === activeTab}\n\t\t\t\t\t\taria-controls={activeContent != null ? `panel-${activeTab}` : undefined}\n\t\t\t\t\t\tid={`tab-${item.id}`}\n\t\t\t\t\t\tclassName={styles.tab}\n\t\t\t\t\t\tdata-active={item.id === activeTab || undefined}\n\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\ttabIndex={item.id === activeTab ? 0 : -1}\n\t\t\t\t\t\tonClick={() => !item.disabled && handleTabClick(item.id)}\n\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{activeContent != null && (\n\t\t\t\t<div\n\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\tid={`panel-${activeTab}`}\n\t\t\t\t\taria-labelledby={`tab-${activeTab}`}\n\t\t\t\t\tclassName={styles.panel}\n\t\t\t\t>\n\t\t\t\t\t{activeContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.textarea {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\tresize: vertical;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t\tresize: none;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { Ref, TextareaHTMLAttributes } from \"react\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n\terror?: boolean;\n\tref?: Ref<HTMLTextAreaElement>;\n}\n\nexport function Textarea({ error, className, rows = 3, ref, ...props }: TextareaProps) {\n\treturn (\n\t\t<textarea\n\t\t\tref={ref}\n\t\t\trows={rows}\n\t\t\tclassName={[styles.textarea, className].filter(Boolean).join(\" \")}\n\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\taria-invalid={error || undefined}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t/* ---- Bare input (also the root in the backward-compat fast path) ---- */\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\t/* Heights match the Vue3 DS TextInput scale: small 44px / medium 60px / large 80px. */\n\t\tmin-height: 3.75rem;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&[data-size=\"small\"] {\n\t\t\tmin-height: 2.75rem; /* 44px — Vue3 small */\n\t\t\tfont-size: var(--ds-font-size-sm); /* 14px — Vue3 text-sm */\n\t\t\tpadding: var(--ds-space-1) var(--ds-space-3);\n\t\t\tborder-radius: var(--ds-radius-md);\n\t\t}\n\n\t\t&[data-size=\"large\"] {\n\t\t\tmin-height: 5rem; /* 80px — Vue3 large */\n\t\t\t/* lg = 20px under [data-theme=vue3] (Vue3 text-lg); 18px under angular-legacy. */\n\t\t\tfont-size: var(--ds-font-size-lg);\n\t\t}\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* ---- Wrapped layout (label / adornments / meta) ---- */\n\t.root {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-2);\n\n\t\t&[data-full-width] {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t/* Inside the field the border lives on .field, so the input is borderless. */\n\t\t.field .input {\n\t\t\tflex: 1;\n\t\t\tmin-width: 0;\n\t\t\tmin-height: 0;\n\t\t\tpadding-block: 0;\n\t\t\tpadding-inline: 0;\n\t\t\tborder: none;\n\t\t\tborder-radius: 0;\n\t\t\tbackground: transparent;\n\t\t\ttext-overflow: ellipsis;\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\toutline: none;\n\t\t\t\tborder: none;\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\t\t}\n\n\t\t&[data-disabled] {\n\t\t\t.label,\n\t\t\t.helper,\n\t\t\t.counter {\n\t\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\t}\n\n\t\t\t.adornment,\n\t\t\t.statusIcon {\n\t\t\t\tcolor: var(--ds-color-gray-400);\n\t\t\t}\n\t\t}\n\t}\n\n\t.label {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-1);\n\t\tmargin-inline: var(--ds-space-3);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.required {\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.field {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tmin-height: 3.75rem;\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&:focus-within {\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\t}\n\n\t.root[data-size=\"small\"] .field {\n\t\tmin-height: 2.75rem;\n\t\tborder-radius: var(--ds-radius-md);\n\t}\n\n\t.root[data-size=\"large\"] .field {\n\t\tmin-height: 5rem;\n\t}\n\n\t.root[data-status=\"error\"] .field {\n\t\tborder-color: var(--ds-color-error);\n\n\t\t&:focus-within {\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t}\n\t}\n\n\t.root[data-status=\"success\"] .field {\n\t\tborder-color: var(--ds-color-success);\n\t}\n\n\t.root[data-status=\"warning\"] .field {\n\t\tborder-color: var(--ds-color-warning);\n\t}\n\n\t.root[data-disabled] .field {\n\t\tbackground-color: var(--ds-color-gray-50);\n\t\tborder-color: var(--ds-color-border);\n\t\tbox-shadow: none;\n\t}\n\n\t.adornment {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.statusIcon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.root[data-status=\"error\"] .statusIcon {\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.root[data-status=\"success\"] .statusIcon {\n\t\tcolor: var(--ds-color-success);\n\t}\n\n\t.root[data-status=\"warning\"] .statusIcon {\n\t\tcolor: var(--ds-color-warning);\n\t}\n\n\t/* ---- Action buttons (clear / password toggle) ---- */\n\t.actionButton {\n\t\tflex-shrink: 0;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: var(--ds-space-1);\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: var(--ds-color-text-muted);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tcolor: var(--ds-color-text);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcursor: not-allowed;\n\t\t\topacity: 0.5;\n\t\t}\n\t}\n\n\t/* ---- Meta row (helper / error message + counter) ---- */\n\t.meta {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: flex-start;\n\t\tgap: var(--ds-space-2);\n\t\tmin-height: 1rem;\n\t\tmargin-inline: var(--ds-space-3);\n\n\t\t&[data-helper-align=\"left\"] {\n\t\t\tflex-direction: row;\n\n\t\t\t.messages {\n\t\t\t\torder: 0;\n\t\t\t}\n\n\t\t\t.counter {\n\t\t\t\torder: 1;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\t\t}\n\n\t\t&[data-helper-align=\"right\"] {\n\t\t\tflex-direction: row-reverse;\n\n\t\t\t.messages {\n\t\t\t\torder: 1;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.counter {\n\t\t\t\torder: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t.messages {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.helper {\n\t\tmargin: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.error {\n\t\tmargin: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.counter {\n\t\tflex-shrink: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.input,\n\t\t.field,\n\t\t.actionButton {\n\t\t\ttransition: none;\n\t\t}\n\t}\n}\n","import {\n\ttype ChangeEvent,\n\tforwardRef,\n\ttype InputHTMLAttributes,\n\ttype ReactNode,\n\tuseCallback,\n\tuseId,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./TextInput.module.css\";\n\nexport type TextInputSize = \"small\" | \"medium\" | \"large\";\n\n/**\n * Validation state, mirroring the Vue3 DS `TextInput`. `default` is the resting\n * state; `success` / `warning` / `error` drive the field border, optional status\n * icon, and (for `error`) `aria-invalid`. The legacy `error` boolean prop is kept\n * for backward compatibility and is treated as `validationState=\"error\"`.\n */\nexport type TextInputValidationState = \"default\" | \"success\" | \"warning\" | \"error\";\n\nconst STATUS_ICON: Record<Exclude<TextInputValidationState, \"default\">, IconNameType> = {\n\tsuccess: \"success-filled-green\",\n\twarning: \"warning-outline\",\n\terror: \"error-filled-red\",\n};\n\nconst ICON_SIZE: Record<TextInputSize, number> = {\n\tsmall: 16,\n\tmedium: 20,\n\tlarge: 24,\n};\n\nexport interface TextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n\t/** Control height / typography scale. */\n\tsize?: TextInputSize;\n\t/**\n\t * Legacy shorthand for an error look. Equivalent to `validationState=\"error\"`.\n\t * Kept for backward compatibility — existing consumers pass `error`.\n\t */\n\terror?: boolean;\n\t/** Renders an eye toggle for `type=\"password\"` fields. */\n\tshowPasswordToggle?: boolean;\n\n\t// --- Robustness parity with the Vue3 DS (all optional, all additive) ---\n\t/** Visible `<label>` associated with the input. */\n\tlabel?: ReactNode;\n\t/** Shows a red `*` after the label and sets `aria-required`. */\n\trequired?: boolean;\n\t/** Validation state. Takes precedence over the legacy `error` boolean. */\n\tvalidationState?: TextInputValidationState;\n\t/** Error message; shown only when the resolved state is `error`. Wires `aria-describedby`. */\n\terrorMessage?: ReactNode;\n\t/** Helper / hint text shown below the field. Wires `aria-describedby`. */\n\thelperText?: ReactNode;\n\t/** Alignment of the helper text relative to the character counter. */\n\thelperTextAlign?: \"left\" | \"right\";\n\t/** Icon rendered before the input. */\n\tprefixIcon?: IconNameType;\n\t/** Icon rendered after the input (suppressed when clear / password / status icon shows). */\n\tsuffixIcon?: IconNameType;\n\t/** Shows a clear (×) button when the field has a value. Requires `value` + `onChange`. */\n\tclearable?: boolean;\n\t/** Callback fired when the clear button is pressed (after clearing the value). */\n\tonClear?: () => void;\n\t/** Accessible label for the clear button. @default \"Limpiar\" */\n\tclearLabel?: string;\n\t/** Accessible label for the password-reveal button while the password is hidden. @default \"Mostrar contraseña\" */\n\tshowPasswordLabel?: string;\n\t/** Accessible label for the password-reveal button while the password is shown. @default \"Ocultar contraseña\" */\n\thidePasswordLabel?: string;\n\t/** Shows a character counter. Implicitly enabled when `maxLength` is set. */\n\tshowCounter?: boolean;\n\t/** Renders the status icon (success / warning / error) inside the field. Defaults to `true`. */\n\tshowValidationIcon?: boolean;\n\t/** Makes the field span the full width of its container. */\n\tfullWidth?: boolean;\n\n\t\"data-testid\"?: string;\n}\n\nfunction resolveState(\n\tvalidationState: TextInputValidationState | undefined,\n\terror: boolean,\n): TextInputValidationState {\n\t// An explicit validationState (including \"default\") wins over the legacy `error` bool,\n\t// so callers can reset to default even while still passing `error`.\n\tif (validationState !== undefined) return validationState;\n\tif (error) return \"error\";\n\treturn \"default\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: this is a single field primitive; the branches (adornments, clear, password toggle, status icon, meta row) are all load-bearing and intentionally colocated to keep one source of truth.\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(function TextInput(\n\t{\n\t\tsize = \"medium\",\n\t\terror = false,\n\t\tshowPasswordToggle = false,\n\t\tlabel,\n\t\trequired = false,\n\t\tvalidationState,\n\t\terrorMessage,\n\t\thelperText,\n\t\thelperTextAlign = \"right\",\n\t\tprefixIcon,\n\t\tsuffixIcon,\n\t\tclearable = false,\n\t\tonClear,\n\t\tclearLabel = \"Limpiar\",\n\t\tshowPasswordLabel = \"Mostrar contraseña\",\n\t\thidePasswordLabel = \"Ocultar contraseña\",\n\t\tshowCounter = false,\n\t\tshowValidationIcon = true,\n\t\tfullWidth = false,\n\t\tclassName,\n\t\ttype = \"text\",\n\t\tid: idProp,\n\t\tvalue,\n\t\tonChange,\n\t\tdisabled,\n\t\treadOnly,\n\t\tmaxLength,\n\t\t\"aria-label\": ariaLabel,\n\t\t\"aria-describedby\": ariaDescribedByProp,\n\t\t\"data-testid\": testId,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst generatedId = useId();\n\tconst id = idProp ?? generatedId;\n\n\tconst innerRef = useRef<HTMLInputElement>(null);\n\tuseImperativeHandle(ref, () => innerRef.current as HTMLInputElement, []);\n\n\tconst [passwordVisible, setPasswordVisible] = useState(false);\n\tconst isPasswordField = type === \"password\";\n\tconst resolvedType = isPasswordField && passwordVisible ? \"text\" : type;\n\n\tconst state = resolveState(validationState, error);\n\tconst isError = state === \"error\";\n\n\tconst resolvedErrorMessage = isError ? errorMessage : undefined;\n\tconst showError = Boolean(resolvedErrorMessage);\n\tconst showHelper = Boolean(helperText) && !showError;\n\n\tconst helperId = showHelper ? `${id}-helper` : undefined;\n\tconst errorId = showError ? `${id}-error` : undefined;\n\tconst describedBy =\n\t\t[ariaDescribedByProp, helperId, errorId].filter(Boolean).join(\" \") || undefined;\n\n\tconst hasValue =\n\t\ttypeof value === \"string\" || typeof value === \"number\" ? `${value}`.length > 0 : false;\n\tconst charCount = typeof value === \"string\" || typeof value === \"number\" ? `${value}`.length : 0;\n\n\t// Require onChange: the clear handler synthesizes an input event the consumer must handle.\n\tconst showClear =\n\t\tclearable && Boolean(onChange) && hasValue && !disabled && !readOnly && !isPasswordField;\n\tconst showPasswordButton = isPasswordField && showPasswordToggle;\n\tconst statusIcon = showValidationIcon && state !== \"default\" ? STATUS_ICON[state] : undefined;\n\tconst showSuffixIcon = Boolean(suffixIcon) && !showClear && !showPasswordButton;\n\tconst hasCounter = showCounter || typeof maxLength === \"number\";\n\n\tconst showMeta = showHelper || showError || hasCounter;\n\tconst iconSize = ICON_SIZE[size];\n\n\tconst handleClear = useCallback(() => {\n\t\tif (disabled || readOnly) return;\n\t\tconst el = innerRef.current;\n\t\tif (el && onChange) {\n\t\t\t// Synthesize a native input event so controlled consumers receive `\"\"`.\n\t\t\tconst setter = Object.getOwnPropertyDescriptor(\n\t\t\t\twindow.HTMLInputElement.prototype,\n\t\t\t\t\"value\",\n\t\t\t)?.set;\n\t\t\tsetter?.call(el, \"\");\n\t\t\tel.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t}\n\t\tonClear?.();\n\t\tinnerRef.current?.focus();\n\t}, [disabled, readOnly, onChange, onClear]);\n\n\t// Backward-compat fast path: with no structural feature requested, the bare\n\t// <input> stays the root so existing consumers keep className + data-testid on it.\n\tconst needsWrapper =\n\t\tBoolean(label) ||\n\t\tshowMeta ||\n\t\tBoolean(prefixIcon) ||\n\t\tshowSuffixIcon ||\n\t\tshowClear ||\n\t\tshowPasswordButton ||\n\t\tBoolean(statusIcon) ||\n\t\tfullWidth;\n\n\t// When the input is the root (no wrapper), className/data-testid land on it.\n\t// When wrapped, those go to the <div>; an associated <label> supplies the name.\n\tconst inputEl = (\n\t\t<input\n\t\t\tref={innerRef}\n\t\t\tid={id}\n\t\t\tclassName={needsWrapper ? styles.input : [styles.input, className].filter(Boolean).join(\" \")}\n\t\t\ttype={resolvedType}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange as ((e: ChangeEvent<HTMLInputElement>) => void) | undefined}\n\t\t\tdisabled={disabled}\n\t\t\treadOnly={readOnly}\n\t\t\trequired={required}\n\t\t\tmaxLength={maxLength}\n\t\t\tdata-error={isError ? \"\" : undefined}\n\t\t\tdata-size={size}\n\t\t\taria-invalid={isError || undefined}\n\t\t\taria-required={required || undefined}\n\t\t\taria-describedby={describedBy}\n\t\t\taria-label={label ? undefined : ariaLabel}\n\t\t\tdata-testid={needsWrapper ? undefined : testId}\n\t\t\t{...props}\n\t\t/>\n\t);\n\n\tif (!needsWrapper) {\n\t\treturn inputEl;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.root, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-status={state}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-full-width={fullWidth || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={id} className={styles.label}>\n\t\t\t\t\t<span>{label}</span>\n\t\t\t\t\t{required && (\n\t\t\t\t\t\t<span className={styles.required} aria-hidden=\"true\">\n\t\t\t\t\t\t\t*\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</label>\n\t\t\t)}\n\n\t\t\t<div className={styles.field}>\n\t\t\t\t{prefixIcon && (\n\t\t\t\t\t<Icon name={prefixIcon} size={iconSize} aria-hidden=\"true\" className={styles.adornment} />\n\t\t\t\t)}\n\n\t\t\t\t{inputEl}\n\n\t\t\t\t{showClear && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{showPasswordButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\taria-label={passwordVisible ? hidePasswordLabel : showPasswordLabel}\n\t\t\t\t\t\taria-pressed={passwordVisible}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => setPasswordVisible((v) => !v)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname={passwordVisible ? \"eye-open-outline\" : \"eye-closed-outline\"}\n\t\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{showSuffixIcon && suffixIcon && (\n\t\t\t\t\t<Icon name={suffixIcon} size={iconSize} aria-hidden=\"true\" className={styles.adornment} />\n\t\t\t\t)}\n\n\t\t\t\t{statusIcon && (\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname={statusIcon}\n\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName={styles.statusIcon}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{showMeta && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.meta}\n\t\t\t\t\tdata-helper-align={helperTextAlign}\n\t\t\t\t\tdata-has-both={(showHelper || showError) && hasCounter ? \"\" : undefined}\n\t\t\t\t>\n\t\t\t\t\t{(showHelper || showError) && (\n\t\t\t\t\t\t<div className={styles.messages}>\n\t\t\t\t\t\t\t{showHelper && (\n\t\t\t\t\t\t\t\t<p id={helperId} className={styles.helper}>\n\t\t\t\t\t\t\t\t\t{helperText}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{showError && (\n\t\t\t\t\t\t\t\t<p id={errorId} className={styles.error} role=\"alert\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t{resolvedErrorMessage}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{hasCounter && (\n\t\t\t\t\t\t<span className={styles.counter}>\n\t\t\t\t\t\t\t{charCount}\n\t\t\t\t\t\t\t{typeof maxLength === \"number\" && `/${maxLength}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import type { ReactNode } from \"react\";\nimport type { DsTheme } from \"../DsProvider/DsProvider\";\n\nexport interface ThemeGateProps {\n\ttheme: DsTheme;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ThemeGate({ theme, children, className, \"data-testid\": testId }: ThemeGateProps) {\n\treturn (\n\t\t<div data-theme={theme} className={className} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tposition: fixed;\n\t\tbottom: var(--spacing-xl);\n\t\tright: var(--spacing-xl);\n\t\tz-index: var(--z-toast);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-sm);\n\t\tmax-width: 400px;\n\t\twidth: calc(100dvw - 2 * var(--spacing-xl));\n\t\tpointer-events: none;\n\n\t\t@media (max-width: 480px) {\n\t\t\tbottom: var(--spacing-md);\n\t\t\tright: var(--spacing-md);\n\t\t\tleft: var(--spacing-md);\n\t\t\twidth: auto;\n\t\t}\n\t}\n\n\t.toast {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-md);\n\t\tpadding: var(--spacing-md) var(--spacing-lg);\n\t\tborder-radius: var(--radius-lg);\n\t\tbox-shadow: var(--shadow-lg);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tline-height: var(--leading-snug);\n\t\tpointer-events: auto;\n\t\tanimation: ds-toast-enter var(--duration-base) var(--ease-spring);\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--color-success-light);\n\t\t\tcolor: var(--color-success-dark);\n\t\t\tborder-left: 4px solid var(--color-success);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--color-error-light);\n\t\t\tcolor: var(--color-error-dark);\n\t\t\tborder-left: 4px solid var(--color-error);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--color-warning-light);\n\t\t\tcolor: var(--color-warning-dark);\n\t\t\tborder-left: 4px solid var(--color-warning);\n\t\t}\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--color-info-light);\n\t\t\tcolor: var(--color-info-dark);\n\t\t\tborder-left: 4px solid var(--color-info);\n\t\t}\n\t}\n\n\t.toastMessage {\n\t\tflex: 1;\n\t}\n\n\t.dismissButton {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\tcolor: inherit;\n\t\topacity: 0.6;\n\t\tborder-radius: var(--radius-sm);\n\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid currentColor;\n\t\t\toutline-offset: 1px;\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ToastData, ToastVariant } from \"./Toast\";\n\ntype AddToastOptions = {\n\tmessage: string;\n\tvariant?: ToastVariant;\n\tduration?: number;\n\tdismissible?: boolean;\n\t\"data-testid\"?: string;\n};\n\ntype ToastStore = {\n\ttoasts: ToastData[];\n\taddToast: (opts: AddToastOptions) => string;\n\tdismissToast: (id: string) => void;\n};\n\n/* ── Global singleton store (module-level) ── */\n\ntype Listener = (toasts: ToastData[]) => void;\n\nlet toasts: ToastData[] = [];\nconst listeners = new Set<Listener>();\nlet counter = 0;\n\nfunction notify() {\n\tfor (const l of listeners) l([...toasts]);\n}\n\nfunction addToast(opts: AddToastOptions): string {\n\tconst id = `toast-${++counter}-${Date.now()}`;\n\ttoasts = [\n\t\t...toasts,\n\t\t{\n\t\t\tid,\n\t\t\tmessage: opts.message,\n\t\t\tvariant: opts.variant ?? \"info\",\n\t\t\tduration: opts.duration,\n\t\t\tdismissible: opts.dismissible,\n\t\t\t\"data-testid\": opts[\"data-testid\"],\n\t\t},\n\t];\n\tnotify();\n\treturn id;\n}\n\nfunction dismissToast(id: string) {\n\ttoasts = toasts.filter((t) => t.id !== id);\n\tnotify();\n}\n\n/* ── Hook ── */\n\nexport function useToast(): ToastStore {\n\tconst [localToasts, setLocalToasts] = useState<ToastData[]>(toasts);\n\tconst isMounted = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMounted.current = true;\n\t\tconst listener: Listener = (next) => {\n\t\t\tif (isMounted.current) setLocalToasts(next);\n\t\t};\n\t\tlisteners.add(listener);\n\t\treturn () => {\n\t\t\tisMounted.current = false;\n\t\t\tlisteners.delete(listener);\n\t\t};\n\t}, []);\n\n\tconst stableAdd = useCallback((opts: AddToastOptions) => addToast(opts), []);\n\tconst stableDismiss = useCallback((id: string) => dismissToast(id), []);\n\n\treturn {\n\t\ttoasts: localToasts,\n\t\taddToast: stableAdd,\n\t\tdismissToast: stableDismiss,\n\t};\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseButton } from \"../CloseButton\";\nimport styles from \"./Toast.module.css\";\nimport { useToast } from \"./useToast\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface ToastData {\n\tid: string;\n\tmessage: string;\n\tvariant: ToastVariant;\n\tduration?: number;\n\tdismissible?: boolean;\n\t\"data-testid\"?: string;\n}\n\n/* ── Toast Message ── */\n\ninterface ToastMessageProps {\n\ttoast: ToastData;\n\tonDismiss: (id: string) => void;\n\tdismissLabel?: string;\n}\n\nfunction ToastMessage({\n\ttoast,\n\tonDismiss,\n\tdismissLabel = \"Cerrar notificación\",\n}: ToastMessageProps) {\n\tconst {\n\t\tid,\n\t\tmessage,\n\t\tvariant,\n\t\tduration = 4000,\n\t\tdismissible = true,\n\t\t\"data-testid\": testId,\n\t} = toast;\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tonDismiss(id);\n\t\t}, duration);\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) clearTimeout(timerRef.current);\n\t\t};\n\t}, [id, duration, onDismiss]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.toast}\n\t\t\tdata-variant={variant}\n\t\t\trole={variant === \"error\" || variant === \"warning\" ? \"alert\" : \"status\"}\n\t\t\taria-atomic=\"true\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<span className={styles.toastMessage}>{message}</span>\n\t\t\t{dismissible && (\n\t\t\t\t<CloseButton\n\t\t\t\t\tclassName={styles.dismissButton}\n\t\t\t\t\tonClick={() => onDismiss(id)}\n\t\t\t\t\tlabel={dismissLabel}\n\t\t\t\t\tsize={14}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n/* ── Toast Container ── */\n\nexport interface ToastContainerProps {\n\tchildren?: ReactNode;\n\tnotificationsLabel?: string;\n\tdismissLabel?: string;\n}\n\nexport function ToastContainer({\n\tnotificationsLabel = \"Notificaciones\",\n\tdismissLabel,\n}: ToastContainerProps) {\n\tconst { toasts, dismissToast } = useToast();\n\n\tif (typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<section className={styles.container} aria-label={notificationsLabel}>\n\t\t\t{toasts.map((toast) => (\n\t\t\t\t<ToastMessage\n\t\t\t\t\tkey={toast.id}\n\t\t\t\t\ttoast={toast}\n\t\t\t\t\tonDismiss={dismissToast}\n\t\t\t\t\tdismissLabel={dismissLabel}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</section>,\n\t\tdocument.body,\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n /* ── Hidden native input ── */\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ── Track ── */\n .track {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 40px;\n height: 22px;\n border-radius: var(--radius-full);\n background-color: var(--color-neutral-200);\n transition: background-color var(--duration-fast) var(--ease-out);\n flex-shrink: 0;\n }\n\n /* Checked state: primary bg */\n .input:checked + .track {\n background-color: var(--color-primary);\n }\n\n /* Focus-visible ring on track */\n .input:focus-visible + .track {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n }\n\n /* ── Thumb ── */\n .thumb {\n position: absolute;\n left: 2px;\n width: 18px;\n height: 18px;\n border-radius: var(--radius-circle);\n background-color: var(--color-surface);\n box-shadow: var(--shadow-sm);\n transition: transform var(--duration-fast) var(--ease-spring);\n }\n\n .input:checked + .track .thumb {\n transform: translateX(18px);\n }\n\n /* ── Label text ── */\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-base);\n font-weight: var(--font-normal);\n color: var(--color-text);\n line-height: var(--leading-normal);\n }\n\n /* ── Size: small ── */\n .wrapper[data-size=\"small\"] .track {\n width: 32px;\n height: 18px;\n }\n\n .wrapper[data-size=\"small\"] .thumb {\n width: 14px;\n height: 14px;\n }\n\n .wrapper[data-size=\"small\"] .input:checked + .track .thumb {\n transform: translateX(14px);\n }\n\n .wrapper[data-size=\"small\"] .label {\n font-size: var(--text-sm);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Toggle.module.css\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n\tlabel?: string;\n\tsize?: \"small\" | \"medium\";\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Toggle({\n\tlabel,\n\tsize = \"medium\",\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: ToggleProps) {\n\tconst inputId =\n\t\tid ??\n\t\t`toggle-${String(label ?? \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/\\s+/g, \"-\")}`;\n\treturn (\n\t\t<label className={styles.wrapper} data-size={size} htmlFor={inputId} data-testid={testId}>\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked={props.checked ?? false}\n\t\t\t\tid={inputId}\n\t\t\t\tclassName={styles.input}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<span className={styles.track} aria-hidden=\"true\">\n\t\t\t\t<span className={styles.thumb} />\n\t\t\t</span>\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n\t.trigger {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t.tooltip {\n\t\tposition: fixed;\n\t\tz-index: var(--ds-z-tooltip);\n\t\tmax-width: 240px;\n\t\tpadding: var(--ds-space-1) var(--ds-space-2);\n\t\tbackground: var(--ds-color-gray-900);\n\t\tcolor: var(--ds-color-white);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-snug);\n\t\tborder-radius: var(--ds-radius-sm);\n\t\tpointer-events: none;\n\t\tword-break: break-word;\n\n\t\t&[data-placement=\"top\"] {\n\t\t\ttransform: translateX(-50%) translateY(-100%);\n\t\t}\n\n\t\t&[data-placement=\"bottom\"] {\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&[data-placement=\"left\"] {\n\t\t\ttransform: translateX(-100%) translateY(-50%);\n\t\t}\n\n\t\t&[data-placement=\"right\"] {\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\t}\n}\n","import { type ReactNode, useCallback, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Tooltip.module.css\";\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n\tcontent: ReactNode;\n\tchildren: ReactNode;\n\tplacement?: TooltipPlacement;\n\t\"data-testid\"?: string;\n}\n\ninterface Coords {\n\ttop: number;\n\tleft: number;\n}\n\nconst GAP = 8;\n\nfunction getCoords(rect: DOMRect, placement: TooltipPlacement): Coords {\n\tswitch (placement) {\n\t\tcase \"top\":\n\t\t\treturn { top: rect.top - GAP, left: rect.left + rect.width / 2 };\n\t\tcase \"bottom\":\n\t\t\treturn { top: rect.bottom + GAP, left: rect.left + rect.width / 2 };\n\t\tcase \"left\":\n\t\t\treturn { top: rect.top + rect.height / 2, left: rect.left - GAP };\n\t\tcase \"right\":\n\t\t\treturn { top: rect.top + rect.height / 2, left: rect.right + GAP };\n\t}\n}\n\nexport function Tooltip({\n\tcontent,\n\tchildren,\n\tplacement = \"top\",\n\t\"data-testid\": testId,\n}: TooltipProps) {\n\tconst [visible, setVisible] = useState(false);\n\tconst [coords, setCoords] = useState<Coords>({ top: 0, left: 0 });\n\tconst triggerRef = useRef<HTMLSpanElement>(null);\n\tconst id = useId();\n\n\tconst show = useCallback(() => {\n\t\tif (!triggerRef.current) return;\n\t\tsetCoords(getCoords(triggerRef.current.getBoundingClientRect(), placement));\n\t\tsetVisible(true);\n\t}, [placement]);\n\n\tconst hide = useCallback(() => setVisible(false), []);\n\n\treturn (\n\t\t<>\n\t\t\t{/* biome-ignore lint/a11y/noStaticElementInteractions: tooltip trigger wraps arbitrary children; mouse events are supplementary to the child's own keyboard/focus handlers */}\n\t\t\t<span\n\t\t\t\tref={triggerRef}\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\taria-describedby={visible ? id : undefined}\n\t\t\t\tonMouseEnter={show}\n\t\t\t\tonMouseLeave={hide}\n\t\t\t\tonFocus={show}\n\t\t\t\tonBlur={hide}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{visible &&\n\t\t\t\ttypeof document !== \"undefined\" &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={styles.tooltip}\n\t\t\t\t\t\tdata-placement={placement}\n\t\t\t\t\t\tstyle={{ top: coords.top, left: coords.left }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t</>\n\t);\n}\n","@layer ds-components {\n .treeItem {\n --tree-item-indent: 0px;\n width: 100%;\n background-color: var(--ds-color-white);\n\n &[data-odd-row] > .content {\n background-color: var(--color-neutral-50);\n &:hover { background-color: var(--color-neutral-100); }\n }\n\n &[data-bordered][data-level=\"0\"] {\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n margin-bottom: var(--spacing-xs);\n overflow: hidden;\n\n & > .content { padding-left: var(--spacing-md); }\n & > .childrenSlot { padding-bottom: var(--spacing-xs); }\n\n &[data-expanded] > .content:hover {\n border-radius: var(--radius-lg) var(--radius-lg) 0 0;\n }\n }\n\n &[data-expanded] > .content .expandBtn {\n transform: rotate(180deg);\n }\n\n &[data-disabled] > .content {\n opacity: 0.6;\n cursor: not-allowed;\n &:hover { background-color: transparent; }\n }\n\n &:focus-visible {\n outline: none;\n & > .content {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n }\n }\n }\n\n .content {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n padding-left: calc(var(--spacing-md) + var(--tree-item-indent));\n min-height: 44px;\n transition: background-color var(--duration-fast) var(--ease-out);\n &:hover { background-color: var(--color-neutral-100); }\n }\n\n .dragHandle {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: grab;\n color: var(--color-neutral-400);\n padding: var(--spacing-xs);\n margin: calc(-1 * var(--spacing-xs));\n border-radius: var(--radius-sm);\n flex-shrink: 0;\n transition: color var(--duration-fast) var(--ease-out), background-color var(--duration-fast) var(--ease-out);\n &:hover { color: var(--color-neutral-500); background-color: var(--color-neutral-200); }\n }\n\n .indent { width: 0; flex-shrink: 0; }\n\n .checkbox { flex-shrink: 0; }\n\n .slotsWrapper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 1;\n gap: var(--spacing-sm);\n min-width: 0;\n }\n\n .label {\n flex: 1;\n font-size: var(--text-sm);\n color: var(--color-neutral-500);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .meta {\n font-size: var(--text-sm);\n color: var(--color-neutral-400);\n flex-shrink: 0;\n }\n\n .expandBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n background: transparent;\n border-radius: var(--radius-sm);\n cursor: pointer;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n margin-left: auto;\n transition: color var(--duration-fast) var(--ease-out), background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);\n\n &:hover { background-color: var(--color-neutral-200); color: var(--color-neutral-500); }\n &:focus-visible { outline: 2px solid var(--color-primary); outline-offset: -2px; }\n &:disabled { cursor: not-allowed; opacity: 0.6; }\n }\n\n .expandPlaceholder { width: 28px; height: 28px; flex-shrink: 0; }\n\n .childrenSlot {\n display: block;\n width: 100%;\n &[hidden] { display: none; }\n }\n}\n","import type { DragEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./TreeItem.module.css\";\nimport type { TreeItemData } from \"./treeTypes\";\n\nexport interface TreeItemDragPayload {\n\tevent: globalThis.DragEvent;\n\titem: TreeItemData;\n\tparentId: string | number | null;\n}\n\nexport interface TreeItemProps {\n\titem: TreeItemData;\n\tlevel?: number;\n\texpanded?: boolean;\n\tselected?: boolean;\n\tdraggable?: boolean;\n\tselectable?: boolean;\n\thasChildren?: boolean;\n\tindentSize?: number;\n\tparentId?: string | number | null;\n\tbordered?: boolean;\n\tflatIndex?: number;\n\tstriped?: boolean;\n\tonToggleExpand: (id: string | number) => void;\n\tonToggleSelect: (id: string | number) => void;\n\tonDragStart?: (payload: TreeItemDragPayload) => void;\n\tonDragEnd?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDragOver?: (payload: TreeItemDragPayload) => void;\n\tonDragLeave?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDrop?: (payload: TreeItemDragPayload) => void;\n\tchildren?: ReactNode;\n\t\"data-testid\"?: string;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n}\n\nfunction on(v: boolean | undefined): \"\" | undefined {\n\treturn v ? \"\" : undefined;\n}\n\nfunction isEditableTarget(target: HTMLElement): boolean {\n\treturn [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName) || target.isContentEditable;\n}\n\nfunction isArrowToggle(key: string, hasChildren: boolean, expanded: boolean): boolean {\n\tif (key === \"ArrowRight\") return hasChildren && !expanded;\n\tif (key === \"ArrowLeft\") return hasChildren && expanded;\n\treturn false;\n}\n\nfunction handleTreeKeyDown(\n\te: KeyboardEvent<HTMLDivElement>,\n\titem: TreeItemData,\n\thasChildren: boolean,\n\texpanded: boolean,\n\tselectable: boolean,\n\tonToggleExpand: (id: string | number) => void,\n\tonToggleSelect: (id: string | number) => void,\n) {\n\tif (item.disabled || isEditableTarget(e.target as HTMLElement)) return;\n\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\te.preventDefault();\n\t\tif (hasChildren) onToggleExpand(item.id);\n\t\telse if (selectable) onToggleSelect(item.id);\n\t\treturn;\n\t}\n\tif (isArrowToggle(e.key, hasChildren, expanded)) {\n\t\te.preventDefault();\n\t\tonToggleExpand(item.id);\n\t}\n}\n\nfunction buildDragHandlers(\n\titem: TreeItemData,\n\tparentId: string | number | null,\n\tdraggable: boolean,\n\tdraggingFromHandle: React.MutableRefObject<boolean>,\n\tonDragStart?: (payload: TreeItemDragPayload) => void,\n\tonDragEnd?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void,\n\tonDragOver?: (payload: TreeItemDragPayload) => void,\n\tonDragLeave?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void,\n\tonDrop?: (payload: TreeItemDragPayload) => void,\n) {\n\treturn {\n\t\thandleDragStart(e: DragEvent) {\n\t\t\tif (!draggingFromHandle.current) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.dataTransfer.setData(\"application/json\", JSON.stringify({ id: item.id, parentId }));\n\t\t\te.dataTransfer.effectAllowed = \"move\";\n\t\t\tonDragStart?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t\thandleDragEnd(e: DragEvent) {\n\t\t\tdraggingFromHandle.current = false;\n\t\t\tonDragEnd?.({ event: e.nativeEvent, item });\n\t\t},\n\t\thandleDragOver(e: DragEvent) {\n\t\t\tif (!draggable) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"move\";\n\t\t\tonDragOver?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t\thandleDragLeave(e: DragEvent) {\n\t\t\tonDragLeave?.({ event: e.nativeEvent, item });\n\t\t},\n\t\thandleDrop(e: DragEvent) {\n\t\t\te.preventDefault();\n\t\t\tonDrop?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t};\n}\n\nfunction TreeItemSlots({\n\titem,\n\tlevel,\n\tselectable,\n\tselected,\n\tprefixSlot,\n\tlabelSlot,\n\tmetaSlot,\n\tsuffixSlot,\n\tonToggleSelect,\n}: {\n\titem: TreeItemData;\n\tlevel: number;\n\tselectable: boolean;\n\tselected: boolean;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tonToggleSelect: (id: string | number) => void;\n}) {\n\treturn (\n\t\t<>\n\t\t\t{selectable && (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={selected}\n\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\tclassName={styles.checkbox}\n\t\t\t\t\tonChange={() => !item.disabled && onToggleSelect(item.id)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{prefixSlot?.(item, level)}\n\t\t\t<div className={styles.slotsWrapper}>\n\t\t\t\t{labelSlot ? (\n\t\t\t\t\tlabelSlot(item, level)\n\t\t\t\t) : (\n\t\t\t\t\t<span className={styles.label} data-testid=\"tree-item-label\">\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{metaSlot\n\t\t\t\t\t? metaSlot(item, level)\n\t\t\t\t\t: item.meta && <span className={styles.meta}>{item.meta}</span>}\n\t\t\t\t{suffixSlot?.(item, level)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport function TreeItem({\n\titem,\n\tlevel = 0,\n\texpanded = false,\n\tselected = false,\n\tdraggable = false,\n\tselectable = false,\n\thasChildren = false,\n\tindentSize = 24,\n\tparentId = null,\n\tbordered = false,\n\tflatIndex = 0,\n\tstriped = false,\n\tonToggleExpand,\n\tonToggleSelect,\n\tonDragStart,\n\tonDragEnd,\n\tonDragOver,\n\tonDragLeave,\n\tonDrop,\n\tchildren,\n\t\"data-testid\": dataTestId,\n\tlabelSlot,\n\tmetaSlot,\n\tprefixSlot,\n\tsuffixSlot,\n}: TreeItemProps) {\n\tconst draggingFromHandle = useRef(false);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) =>\n\t\thandleTreeKeyDown(e, item, hasChildren, expanded, selectable, onToggleExpand, onToggleSelect);\n\n\tconst dragHandlers = buildDragHandlers(\n\t\titem,\n\t\tparentId,\n\t\tdraggable,\n\t\tdraggingFromHandle,\n\t\tonDragStart,\n\t\tonDragEnd,\n\t\tonDragOver,\n\t\tonDragLeave,\n\t\tonDrop,\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.treeItem}\n\t\t\tstyle={{ \"--tree-item-indent\": `${level * indentSize}px` } as React.CSSProperties}\n\t\t\tdata-level={level}\n\t\t\tdata-expanded={on(expanded)}\n\t\t\tdata-selected={on(selected)}\n\t\t\tdata-disabled={on(item.disabled)}\n\t\t\tdata-has-children={on(hasChildren)}\n\t\t\tdata-bordered={on(bordered)}\n\t\t\tdata-striped={on(striped)}\n\t\t\tdata-odd-row={on(striped && flatIndex % 2 === 1)}\n\t\t\tdata-testid={dataTestId}\n\t\t\trole=\"treeitem\"\n\t\t\taria-level={level + 1}\n\t\t\taria-expanded={hasChildren ? expanded : undefined}\n\t\t\taria-selected={selectable ? selected : undefined}\n\t\t\taria-disabled={item.disabled}\n\t\t\ttabIndex={0}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonMouseUp={() => {\n\t\t\t\tdraggingFromHandle.current = false;\n\t\t\t}}\n\t\t>\n\t\t\t{/* biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop container captures native DnD events; keyboard interaction is on the parent treeitem */}\n\t\t\t<div\n\t\t\t\tclassName={styles.content}\n\t\t\t\tdraggable={draggable && !item.disabled}\n\t\t\t\tonDragStart={dragHandlers.handleDragStart}\n\t\t\t\tonDragEnd={dragHandlers.handleDragEnd}\n\t\t\t\tonDragOver={dragHandlers.handleDragOver}\n\t\t\t\tonDragLeave={dragHandlers.handleDragLeave}\n\t\t\t\tonDrop={dragHandlers.handleDrop}\n\t\t\t>\n\t\t\t\t{draggable && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={styles.dragHandle}\n\t\t\t\t\t\tdata-testid=\"tree-item-drag-handle\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tdraggingFromHandle.current = true;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonTouchStart={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tdraggingFromHandle.current = true;\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"drag-handle-outline\" size={18} />\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\n\t\t\t\t<div className={styles.indent} aria-hidden=\"true\" />\n\n\t\t\t\t<TreeItemSlots\n\t\t\t\t\titem={item}\n\t\t\t\t\tlevel={level}\n\t\t\t\t\tselectable={selectable}\n\t\t\t\t\tselected={selected}\n\t\t\t\t\tprefixSlot={prefixSlot}\n\t\t\t\t\tlabelSlot={labelSlot}\n\t\t\t\t\tmetaSlot={metaSlot}\n\t\t\t\t\tsuffixSlot={suffixSlot}\n\t\t\t\t\tonToggleSelect={onToggleSelect}\n\t\t\t\t/>\n\n\t\t\t\t{hasChildren ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.expandBtn}\n\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\taria-label={expanded ? \"Collapse\" : \"Expand\"}\n\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tonToggleExpand(item.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} />\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span className={styles.expandPlaceholder} aria-hidden=\"true\" />\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{hasChildren && (\n\t\t\t\t<div className={styles.childrenSlot} hidden={!expanded}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .treeList {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { TreeItem } from \"../TreeItem/TreeItem\";\nimport type { TreeItemData } from \"../TreeItem/treeTypes\";\nimport styles from \"./TreeList.module.css\";\n\nexport interface TreeListProps {\n\titems?: TreeItemData[];\n\tdraggable?: boolean;\n\texpandedIds?: (string | number)[];\n\tselectedIds?: (string | number)[];\n\tselectable?: boolean;\n\tindentSize?: number;\n\tbordered?: boolean;\n\tstriped?: boolean;\n\tonExpandChange?: (expandedIds: (string | number)[]) => void;\n\tonSelectChange?: (selectedIds: (string | number)[]) => void;\n\tonReorder?: (payload: {\n\t\titemId: string | number;\n\t\tfromParentId: string | number | null;\n\t\ttoParentId: string | number | null;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t}) => void;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\t\"data-testid\"?: string;\n}\n\nfunction findItemById(items: TreeItemData[], id: string | number): TreeItemData | null {\n\tfor (const item of items) {\n\t\tif (item.id === id) return item;\n\t\tif (item.children) {\n\t\t\tconst found = findItemById(item.children, id);\n\t\t\tif (found) return found;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction buildFlatIndexMap(\n\titems: TreeItemData[],\n\texpandedIds: (string | number)[],\n): Map<string | number, number> {\n\tconst map = new Map<string | number, number>();\n\tlet idx = 0;\n\tfunction traverse(list: TreeItemData[]) {\n\t\tfor (const item of list) {\n\t\t\tmap.set(item.id, idx++);\n\t\t\tif (item.children?.length && expandedIds.includes(item.id)) traverse(item.children);\n\t\t}\n\t}\n\ttraverse(items);\n\treturn map;\n}\n\ninterface RecursiveProps {\n\titems: TreeItemData[];\n\tparentId: string | number | null;\n\tlevel: number;\n\texpandedIds: (string | number)[];\n\tselectedIds: (string | number)[];\n\tflatIndexMap: Map<string | number, number>;\n\tdraggable: boolean;\n\tselectable: boolean;\n\tbordered: boolean;\n\tstriped: boolean;\n\tindentSize: number;\n\tonToggleExpand: (id: string | number) => void;\n\tonToggleSelect: (id: string | number) => void;\n\tonDragStart: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tonDragEnd: (p: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDragOver: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tonDrop: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n}\n\nfunction TreeListRecursive(props: RecursiveProps): ReactNode {\n\tconst { items, parentId, level, expandedIds, selectedIds, flatIndexMap } = props;\n\treturn items.map((item) => {\n\t\tconst hasChildren = Boolean(item.children?.length);\n\t\tconst isExpanded = expandedIds.includes(item.id);\n\t\treturn (\n\t\t\t<TreeItem\n\t\t\t\tkey={item.id}\n\t\t\t\titem={item}\n\t\t\t\tlevel={level}\n\t\t\t\tparentId={parentId}\n\t\t\t\texpanded={isExpanded}\n\t\t\t\tselected={selectedIds.includes(item.id)}\n\t\t\t\tdraggable={props.draggable}\n\t\t\t\tselectable={props.selectable}\n\t\t\t\tbordered={props.bordered}\n\t\t\t\tstriped={props.striped}\n\t\t\t\tflatIndex={flatIndexMap.get(item.id) ?? 0}\n\t\t\t\thasChildren={hasChildren}\n\t\t\t\tindentSize={props.indentSize}\n\t\t\t\tonToggleExpand={props.onToggleExpand}\n\t\t\t\tonToggleSelect={props.onToggleSelect}\n\t\t\t\tonDragStart={props.onDragStart}\n\t\t\t\tonDragEnd={props.onDragEnd}\n\t\t\t\tonDragOver={props.onDragOver}\n\t\t\t\tonDrop={props.onDrop}\n\t\t\t\tlabelSlot={props.labelSlot}\n\t\t\t\tmetaSlot={props.metaSlot}\n\t\t\t\tprefixSlot={props.prefixSlot}\n\t\t\t\tsuffixSlot={props.suffixSlot}\n\t\t\t>\n\t\t\t\t{hasChildren && isExpanded && item.children && (\n\t\t\t\t\t<TreeListRecursive\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\titems={item.children}\n\t\t\t\t\t\tparentId={item.id}\n\t\t\t\t\t\tlevel={level + 1}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</TreeItem>\n\t\t);\n\t});\n}\n\nexport function TreeList({\n\titems = [],\n\tdraggable = false,\n\texpandedIds: controlledExpandedIds,\n\tselectedIds: controlledSelectedIds,\n\tselectable = false,\n\tindentSize = 24,\n\tbordered = false,\n\tstriped = false,\n\tonExpandChange,\n\tonSelectChange,\n\tonReorder,\n\tlabelSlot,\n\tmetaSlot,\n\tprefixSlot,\n\tsuffixSlot,\n\t\"data-testid\": dataTestId,\n}: TreeListProps) {\n\tconst [internalExpanded, setInternalExpanded] = useState<(string | number)[]>([]);\n\tconst [internalSelected, setInternalSelected] = useState<(string | number)[]>([]);\n\tconst dragStateRef = useRef<{ itemId: string | number; parentId: string | number | null } | null>(\n\t\tnull,\n\t);\n\n\tconst expandedIds = controlledExpandedIds ?? internalExpanded;\n\tconst selectedIds = controlledSelectedIds ?? internalSelected;\n\tconst flatIndexMap = useMemo(() => buildFlatIndexMap(items, expandedIds), [items, expandedIds]);\n\n\tconst toggleExpand = useCallback(\n\t\t(id: string | number) => {\n\t\t\tconst next = expandedIds.includes(id)\n\t\t\t\t? expandedIds.filter((i) => i !== id)\n\t\t\t\t: [...expandedIds, id];\n\t\t\tif (!controlledExpandedIds) setInternalExpanded(next);\n\t\t\tonExpandChange?.(next);\n\t\t},\n\t\t[expandedIds, controlledExpandedIds, onExpandChange],\n\t);\n\n\tconst toggleSelect = useCallback(\n\t\t(id: string | number) => {\n\t\t\tconst next = selectedIds.includes(id)\n\t\t\t\t? selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...selectedIds, id];\n\t\t\tif (!controlledSelectedIds) setInternalSelected(next);\n\t\t\tonSelectChange?.(next);\n\t\t},\n\t\t[selectedIds, controlledSelectedIds, onSelectChange],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tdragStateRef.current = { itemId: payload.item.id, parentId: payload.parentId };\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDragEnd = useCallback((_p: { event: globalThis.DragEvent; item: TreeItemData }) => {\n\t\tdragStateRef.current = null;\n\t}, []);\n\n\tconst handleDragOver = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tconst state = dragStateRef.current;\n\t\t\tif (!state || state.parentId !== payload.parentId) {\n\t\t\t\tif (payload.event.dataTransfer) payload.event.dataTransfer.dropEffect = \"none\";\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDrop = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tconst state = dragStateRef.current;\n\t\t\tif (!state || state.parentId !== payload.parentId) return;\n\n\t\t\tconst sourceId = state.itemId;\n\t\t\tconst targetId = payload.item.id;\n\t\t\tif (sourceId === targetId) return;\n\n\t\t\tconst parentArray =\n\t\t\t\tpayload.parentId === null ? items : findItemById(items, payload.parentId)?.children;\n\n\t\t\tif (!parentArray) return;\n\n\t\t\tconst fromIndex = parentArray.findIndex((i) => i.id === sourceId);\n\t\t\tconst toIndex = parentArray.findIndex((i) => i.id === targetId);\n\t\t\tif (fromIndex === -1 || toIndex === -1) return;\n\n\t\t\tonReorder?.({\n\t\t\t\titemId: sourceId,\n\t\t\t\tfromParentId: payload.parentId,\n\t\t\t\ttoParentId: payload.parentId,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t},\n\t\t[items, onReorder],\n\t);\n\n\tconst recursiveProps: RecursiveProps = {\n\t\titems,\n\t\tparentId: null,\n\t\tlevel: 0,\n\t\texpandedIds,\n\t\tselectedIds,\n\t\tflatIndexMap,\n\t\tdraggable,\n\t\tselectable,\n\t\tbordered,\n\t\tstriped,\n\t\tindentSize,\n\t\tonToggleExpand: toggleExpand,\n\t\tonToggleSelect: toggleSelect,\n\t\tonDragStart: handleDragStart,\n\t\tonDragEnd: handleDragEnd,\n\t\tonDragOver: handleDragOver,\n\t\tonDrop: handleDrop,\n\t\tlabelSlot,\n\t\tmetaSlot,\n\t\tprefixSlot,\n\t\tsuffixSlot,\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.treeList}\n\t\t\trole=\"tree\"\n\t\t\tdata-draggable={draggable ? \"\" : undefined}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<TreeListRecursive {...recursiveProps} />\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.notification {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t.dismiss {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tmargin-inline-start: var(--ds-space-2);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t/* Static (no-motion) baseline: visible immediately, no transition. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.notification {\n\t\t\ttransition:\n\t\t\t\topacity var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\ttranslate var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t@starting-style {\n\t\t\t\topacity: 0;\n\t\t\t\ttranslate: 0 calc(-1 * var(--ds-space-2));\n\t\t\t}\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport { CloseButton } from \"../CloseButton\";\nimport type { IconNameType } from \"../Icon\";\nimport { NotificationBase } from \"./NotificationBase\";\nimport styles from \"./UserNotification.module.css\";\n\nexport type UserNotificationVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface UserNotificationProps {\n\tvariant?: UserNotificationVariant;\n\ticon?: IconNameType;\n\t/** Required — a user notification is always dismissable. */\n\tonDismiss: () => void;\n\tdismissLabel?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function UserNotification({\n\tvariant = \"info\",\n\ticon,\n\tonDismiss,\n\tdismissLabel = \"Cerrar\",\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: UserNotificationProps): React.ReactElement {\n\treturn (\n\t\t<NotificationBase\n\t\t\tvariant={variant}\n\t\t\trootClassName={styles.notification}\n\t\t\tcontentClassName={styles.content}\n\t\t\tactionClassName={styles.action}\n\t\t\ticon={icon}\n\t\t\taction={action}\n\t\t\tclassName={className}\n\t\t\tdata-testid={testId}\n\t\t\tdismissSlot={\n\t\t\t\t<CloseButton\n\t\t\t\t\tclassName={styles.dismiss}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\tlabel={dismissLabel}\n\t\t\t\t\tsize={20}\n\t\t\t\t/>\n\t\t\t}\n\t\t>\n\t\t\t{children}\n\t\t</NotificationBase>\n\t);\n}\n","@layer ds-layouts {\n .header {\n min-height: 50px;\n width: 100%;\n max-width: 1440px;\n display: flex;\n align-items: flex-start;\n margin: auto;\n padding: 10px 16px;\n }\n\n .titleSection {\n flex: 0 0 48%;\n text-align: left;\n }\n\n .title {\n font-weight: 300;\n font-size: 28px;\n color: var(--ds-ang-primary);\n line-height: 30px;\n }\n\n .actions {\n flex: 0 0 50%;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n @media (max-width: 780px) {\n .header {\n flex-direction: column;\n align-items: center;\n }\n\n .titleSection {\n flex: none;\n width: 98%;\n text-align: center;\n margin-bottom: 20px;\n }\n\n .actions {\n flex: none;\n width: 98%;\n justify-content: center;\n }\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./AdminPageHeader.module.css\";\n\nexport interface AdminPageHeaderProps {\n\ttitle: string;\n\tactions?: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function AdminPageHeader({ title, actions, \"data-testid\": testId }: AdminPageHeaderProps) {\n\treturn (\n\t\t<header className={styles.header} data-testid={testId}>\n\t\t\t<div className={styles.titleSection}>\n\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t</div>\n\t\t\t{actions && <div className={styles.actions}>{actions}</div>}\n\t\t</header>\n\t);\n}\n","@layer ang-components {\n .shell {\n display: flex;\n flex-direction: column;\n height: 100dvh;\n width: 100%;\n overflow: hidden;\n }\n\n .body {\n display: flex;\n flex: 1;\n overflow: hidden;\n }\n\n .sidebarSlot {\n display: contents;\n }\n\n .contentArea {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n }\n\n .main {\n flex: 1;\n overflow: auto;\n position: relative;\n }\n\n .tabBarSlot {\n flex-shrink: 0;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { NavBar } from \"../../components/NavBar\";\nimport { PinLockOverlay } from \"../../components/PinLockOverlay\";\nimport styles from \"./AppShell.module.css\";\n\nexport interface AppShellProps {\n\trestaurantName: string;\n\tonMenuToggle: () => void;\n\tonLogoClick: () => void;\n\tonRightToggle: () => void;\n\tsidebar: ReactNode;\n\tchildren: ReactNode;\n\ttabBar?: ReactNode;\n\theaderRight?: ReactNode;\n\t/** Sidebar open state — reflected on the NavBar toggle (aria-expanded + label). */\n\tisSidebarOpen?: boolean;\n\tisPinLocked?: boolean;\n\tpinLockContent?: ReactNode;\n\tisLoading?: boolean;\n\t\"data-testid\"?: string;\n}\n\nexport function AppShell({\n\trestaurantName,\n\tonMenuToggle,\n\tonLogoClick,\n\tonRightToggle,\n\tsidebar,\n\tchildren,\n\ttabBar,\n\theaderRight,\n\tisSidebarOpen = false,\n\tisPinLocked = false,\n\tpinLockContent,\n\tisLoading = false,\n\t\"data-testid\": testId,\n}: AppShellProps) {\n\tif (isPinLocked) {\n\t\treturn <PinLockOverlay isLocked>{pinLockContent}</PinLockOverlay>;\n\t}\n\n\treturn (\n\t\t<div className={styles.shell} data-testid={testId}>\n\t\t\t<NavBar\n\t\t\t\trestaurantName={restaurantName}\n\t\t\t\tonMenuToggle={onMenuToggle}\n\t\t\t\tonLogoClick={onLogoClick}\n\t\t\t\tonRightToggle={onRightToggle}\n\t\t\t\tisMenuOpen={isSidebarOpen}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\trightSlot={headerRight}\n\t\t\t/>\n\t\t\t<div className={styles.body}>\n\t\t\t\t<div className={styles.sidebarSlot}>{sidebar}</div>\n\t\t\t\t<div className={styles.contentArea}>\n\t\t\t\t\t<main className={styles.main}>{children}</main>\n\t\t\t\t\t{tabBar && <div className={styles.tabBarSlot}>{tabBar}</div>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",".divider {\n border: none;\n background-color: var(--color-border, var(--color-neutral-200));\n flex-shrink: 0;\n}\n\n.divider[data-orientation='horizontal'] {\n width: 100%;\n height: 1px;\n}\n\n.divider[data-orientation='vertical'] {\n height: 100%;\n width: 1px;\n align-self: stretch;\n}\n\n.divider[data-spacing='sm'] {\n margin: var(--spacing-sm) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='sm'] {\n margin: 0 var(--spacing-sm);\n}\n\n.divider[data-spacing='md'] {\n margin: var(--spacing-md) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='md'] {\n margin: 0 var(--spacing-md);\n}\n\n.divider[data-spacing='lg'] {\n margin: var(--spacing-lg) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='lg'] {\n margin: 0 var(--spacing-lg);\n}\n","import styles from \"./Divider.module.css\";\n\nexport interface DividerProps {\n\torientation?: \"horizontal\" | \"vertical\";\n\tspacing?: \"sm\" | \"md\" | \"lg\";\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Divider({\n\torientation = \"horizontal\",\n\tspacing = \"md\",\n\tclassName,\n\t\"data-testid\": testId,\n}: DividerProps) {\n\treturn (\n\t\t<hr\n\t\t\tclassName={[styles.divider, className].filter(Boolean).join(\" \")}\n\t\t\tdata-orientation={orientation}\n\t\t\tdata-spacing={spacing}\n\t\t\taria-orientation={orientation}\n\t\t\tdata-testid={testId}\n\t\t/>\n\t);\n}\n","@layer ds-layouts {\n .grid {\n display: grid;\n grid-template-columns: var(--grid-columns, repeat(1, minmax(0, 1fr)));\n gap: var(--grid-gap, var(--ds-space-3));\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport styles from \"./Grid.module.css\";\n\nexport type GridGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface GridProps {\n\tcolumns?: number | string;\n\tgap?: GridGap;\n\tchildren: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\t\"data-testid\"?: string;\n}\n\nconst GAP_MAP: Record<GridGap, string> = {\n\txs: \"var(--ds-space-1)\",\n\tsm: \"var(--ds-space-2)\",\n\tmd: \"var(--ds-space-3)\",\n\tlg: \"var(--ds-space-4)\",\n\txl: \"var(--ds-space-6)\",\n};\n\nexport function Grid({\n\tcolumns = 1,\n\tgap = \"md\",\n\tchildren,\n\tclassName,\n\tstyle,\n\t\"data-testid\": testId,\n}: GridProps) {\n\tconst gridTemplateColumns =\n\t\ttypeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n\n\tconst gridStyle: CSSProperties = {\n\t\t\"--grid-columns\": gridTemplateColumns,\n\t\t\"--grid-gap\": GAP_MAP[gap],\n\t\t...style,\n\t} as CSSProperties;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.grid, className].filter(Boolean).join(\" \")}\n\t\t\tstyle={gridStyle}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-layouts {\n .footer {\n position: absolute;\n inset-block-end: var(--ds-space-4);\n inset-inline: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-3);\n flex-wrap: wrap;\n padding-inline: var(--ds-space-6);\n }\n\n .dot {\n inline-size: 0.1875rem;\n block-size: 0.1875rem;\n border-radius: var(--ds-radius-circle);\n background-color: var(--ds-color-gray-300);\n flex-shrink: 0;\n }\n\n .info {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-text-muted);\n white-space: nowrap;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./LoginFooter.module.css\";\n\nexport interface LoginFooterProps {\n\t/** Caller passes <LanguageSelector .../> or any language-picker node */\n\tlanguageSelector?: ReactNode;\n\t/** Application display name. @default \"Toteat©\" */\n\tappName?: string;\n\t/** Semver string, e.g. \"1.4.2\" */\n\tversion?: string;\n\t/** Environment label shown in non-prod builds, e.g. \"STAGING\" */\n\tenv?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function LoginFooter({\n\tlanguageSelector,\n\tappName = \"Toteat©\",\n\tversion,\n\tenv,\n\tclassName,\n\t\"data-testid\": testId,\n}: LoginFooterProps) {\n\treturn (\n\t\t<footer className={[styles.footer, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t{languageSelector}\n\t\t\t{languageSelector && <span className={styles.dot} aria-hidden=\"true\" />}\n\t\t\t<span className={styles.info}>{appName}</span>\n\t\t\t{(version || env) && <span className={styles.dot} aria-hidden=\"true\" />}\n\t\t\t{(version || env) && (\n\t\t\t\t<span className={styles.info}>\n\t\t\t\t\t{version && <>Ver: {version}</>}\n\t\t\t\t\t{version && env && <>&nbsp;&nbsp;</>}\n\t\t\t\t\t{env && <>Env: {env}</>}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</footer>\n\t);\n}\n","@layer ds-layouts {\n .page {\n text-align: center;\n background: #ffffff;\n color: var(--ds-ang-secondary);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100dvh;\n min-width: 100dvw;\n gap: 1rem;\n position: relative;\n background-image: url(\"/assets/angular/dsBgBottom.svg\");\n background-position: bottom;\n background-repeat: no-repeat;\n background-size: contain;\n font-size: var(--ds-ang-font-size-base);\n }\n\n @media (min-width: 768px) {\n .page {\n background-image: url(\"/assets/angular/login-background-default.svg\");\n background-position: right top;\n background-repeat: no-repeat;\n background-size: 30% auto;\n }\n\n .page::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 30%;\n height: 100%;\n background-image: url(\"/assets/angular/login-background-default.svg\");\n background-position: left 40px;\n background-repeat: no-repeat;\n background-size: 100% auto;\n transform: rotate(180deg);\n z-index: 0;\n }\n }\n\n .card {\n position: relative;\n z-index: 1;\n background-color: transparent;\n border-radius: 1rem;\n padding: 2rem 1rem;\n width: 100%;\n max-width: 460px;\n animation: cardEntrance 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.1s both;\n }\n\n @media (min-width: 768px) {\n .card {\n background-color: #ffffff;\n border-radius: 16px;\n border: 1px solid var(--ds-ang-neutral-200);\n box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25);\n }\n }\n}\n\n@keyframes cardEntrance {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(10px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.card {\n\t\tanimation: none;\n\t}\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./LoginPageLayout.module.css\";\n\nexport interface LoginPageLayoutProps {\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function LoginPageLayout({ children, \"data-testid\": testId }: LoginPageLayoutProps) {\n\treturn (\n\t\t<main className={styles.page} data-testid={testId}>\n\t\t\t<div className={styles.card}>{children}</div>\n\t\t</main>\n\t);\n}\n","@layer ds-layouts {\n .root {\n display: grid;\n grid-template-columns: var(--ds-sidebar-width) 1fr;\n grid-template-rows: 1fr;\n min-height: 100dvh;\n transition: grid-template-columns var(--ds-duration-base) var(--ds-ease-out);\n\n /* Collapsed sidebar */\n &[data-sidebar-collapsed] {\n grid-template-columns: var(--ds-sidebar-collapsed-width) 1fr;\n }\n\n /* Hide sidebar on mobile */\n @media (max-width: 768px) {\n grid-template-columns: 1fr;\n }\n }\n\n .sidebar {\n grid-row: 1;\n grid-column: 1;\n position: sticky;\n top: 0;\n height: 100dvh;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--ds-color-surface);\n border-right: 1px solid var(--ds-color-border);\n z-index: var(--ds-z-sticky);\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n\n .main {\n grid-row: 1;\n grid-column: 2;\n display: grid;\n grid-template-rows: auto 1fr;\n min-height: 100dvh;\n overflow: hidden;\n\n @media (max-width: 768px) {\n grid-column: 1;\n }\n }\n\n .header {\n grid-row: 1;\n position: sticky;\n top: 0;\n height: var(--ds-header-height);\n background-color: var(--ds-color-surface);\n border-bottom: 1px solid var(--ds-color-border);\n z-index: var(--ds-z-raised);\n display: flex;\n align-items: center;\n }\n\n .content {\n grid-row: 2;\n padding: var(--ds-space-6);\n overflow-y: auto;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./PageLayout.module.css\";\n\nexport interface PageLayoutProps {\n\tsidebar?: ReactNode;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n\tcollapsed?: boolean;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function PageLayout({\n\tsidebar,\n\theader,\n\tchildren,\n\tcollapsed = false,\n\tclassName,\n\t\"data-testid\": testId,\n}: PageLayoutProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.root, className].filter(Boolean).join(\" \")}\n\t\t\tdata-sidebar-collapsed={collapsed ? \"\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{sidebar && (\n\t\t\t\t<aside className={styles.sidebar} aria-label=\"Navegación lateral\">\n\t\t\t\t\t{sidebar}\n\t\t\t\t</aside>\n\t\t\t)}\n\t\t\t<div className={styles.main}>\n\t\t\t\t{header && <header className={styles.header}>{header}</header>}\n\t\t\t\t<main className={styles.content}>{children}</main>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode } from \"react\";\n\nexport type StackDirection = \"vertical\" | \"horizontal\";\nexport type StackGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\n\nexport interface StackProps<T extends ElementType = \"div\"> {\n\tas?: T;\n\tdirection?: StackDirection;\n\tgap?: StackGap;\n\talign?: StackAlign;\n\tjustify?: StackJustify;\n\twrap?: boolean;\n\tchildren: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nconst GAP_MAP: Record<StackGap, string> = {\n\txs: \"var(--ds-space-1)\",\n\tsm: \"var(--ds-space-2)\",\n\tmd: \"var(--ds-space-3)\",\n\tlg: \"var(--ds-space-4)\",\n\txl: \"var(--ds-space-6)\",\n\t\"2xl\": \"var(--ds-space-8)\",\n};\n\nconst JUSTIFY_MAP: Record<StackJustify, string> = {\n\tstart: \"flex-start\",\n\tcenter: \"center\",\n\tend: \"flex-end\",\n\tbetween: \"space-between\",\n\taround: \"space-around\",\n\tevenly: \"space-evenly\",\n};\n\nconst ALIGN_MAP: Record<StackAlign, string> = {\n\tstart: \"flex-start\",\n\tcenter: \"center\",\n\tend: \"flex-end\",\n\tstretch: \"stretch\",\n\tbaseline: \"baseline\",\n};\n\nexport function Stack<T extends ElementType = \"div\">({\n\tas,\n\tdirection = \"vertical\",\n\tgap = \"md\",\n\talign,\n\tjustify,\n\twrap = false,\n\tchildren,\n\tclassName,\n\tstyle,\n\t...rest\n}: StackProps<T> & Omit<ComponentPropsWithoutRef<T>, keyof StackProps<T>>) {\n\tconst Component = (as ?? \"div\") as ElementType;\n\n\tconst stackStyle: CSSProperties = {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: direction === \"vertical\" ? \"column\" : \"row\",\n\t\tgap: GAP_MAP[gap],\n\t\talignItems: align ? ALIGN_MAP[align] : undefined,\n\t\tjustifyContent: justify ? JUSTIFY_MAP[justify] : undefined,\n\t\tflexWrap: wrap ? \"wrap\" : undefined,\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<Component className={className} style={stackStyle} {...rest}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n","/**\n * Pure, dependency-free CSV helpers (RFC 4180). No DOM access.\n */\n\n/**\n * A scalar CSV cell value. DS CSV cells are scalar: passing objects, arrays, or\n * symbols is a compile error, not a silent `\"[object Object]\"`.\n */\nexport type CsvCell = string | number | boolean | null | undefined;\n\n/**\n * Converts a single cell value to a CSV-safe string (RFC 4180).\n *\n * - `null` / `undefined` → `\"\"`\n * - a non-finite `number` (`NaN`, `Infinity`, `-Infinity`) → `\"\"`\n * - otherwise `String(value)`\n * - if the result contains a comma, double-quote, CR or LF, the whole field is\n * wrapped in double quotes and internal double-quotes are doubled.\n */\nexport function escapeCell(value: CsvCell): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\tif (typeof value === \"number\" && !Number.isFinite(value)) {\n\t\treturn \"\";\n\t}\n\tconst str = String(value);\n\tif (/[\",\\r\\n]/.test(str)) {\n\t\treturn `\"${str.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn str;\n}\n\n/**\n * Joins a matrix of cells into an RFC 4180 CSV string: each cell is escaped via\n * {@link escapeCell}, cells are joined by `,`, and rows by `\\r\\n`.\n * Empty input → `\"\"`.\n */\nexport function rowsToCsv(rows: CsvCell[][]): string {\n\treturn rows.map((row) => row.map(escapeCell).join(\",\")).join(\"\\r\\n\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICGa,KAAoB,CAChC,43CACA,YACA,EAEY,KAAiC,CAC7C,mUACA,YACA,EAEY,KAAiC,CAC7C,gUACA,YACA,EAEY,KAAkC,CAC9C,mUACA,YACA,EAEY,IAA+B,CAC3C,gUACA,YACA,EAEY,IAA0B,CACtC,0MACA,YACA,EAEY,IAA0B,CACtC,qMACA,YACA,EAEY,KAA0B,CACtC,kOACA,YACA,EAEY,KAA+B,CAC3C,yMACA,YACA,EAEY,KAA+B,CAC3C,0MACA,YACA,EAEY,KAAgC,CAC5C,mNACA,YACA,EAEY,KAA6B,CACzC,gNACA,YACA,EAEY,KAA2B,CACvC,0MACA,YACA,EAEY,IAAwB,CACpC,sMACA,YACA,EAEY,KAAuB,CACnC,qzBACA,YACA,EAEY,KAAoB,CAChC,ykBACA,YACA,EAEY,KAA4B,CACxC,02EACA,YACA,EAEY,KAA+B,CAC3C,02BACA,YACA,EAEY,KAAwB,CACpC,29EACA,YACA,EAEY,KAAqB,CACjC,6uBACA,YACA,EAEY,KAAqB,CACjC,iJACA,YACA,EAEY,KAAwB,CACpC,sKACA,YACA,EAEY,KAA0B,CACtC,uHACA,YACA,EAEY,KAA4B,CACxC,+MACA,YACA,EAEY,KAA4B,CACxC,oYACA,YACA,EAEY,KAA4B,CACxC,8MACA,YACA,EAEY,KAA6B,CACzC,mYACA,YACA,EAEY,KAA6B,CACzC,kNACA,YACA,EAEY,KAA0B,CACtC,kNACA,YACA,EAEY,KAAsB,CAClC,obACA,YACA,EAEY,KAAoB,CAChC,mnBACA,YACA,EAEY,KAAqB,CACjC,qMACA,YACA,EAEY,KAA8B,CAC1C,2oBACA,YACA,EAEY,KAA4B,CACxC,koBACA,YACA,EAEY,KAA4B,CACxC,moBACA,YACA,EAEY,KAA2B,CACvC,2gBACA,YACA,EAEY,KAAsB,CAClC,iyBACA,YACA,EAEY,KAAwB,CACpC,01CACA,YACA,EAEY,KAAgC,CAC5C,6gBACA,YACA,EAEY,KAAoC,CAChD,wKACA,YACA,EAEY,KAAgC,CAC5C,+YACA,YACA,EAEY,KAA6B,CACzC,6tBACA,YACA,EAEY,KAA2B,CACvC,mTACA,YACA,EAEY,KAAwB,CACpC,iUACA,YACA,EAEY,KAAqB,CACjC,+YACA,YACA,EAEY,KAA2B,CACvC,mWACA,YACA,EAEY,KAAsB,CAClC,qlBACA,YACA,EAEY,KAAsB,CAClC,uhBACA,YACA,EAEY,KAA0B,CACtC,4tBACA,YACA,EAEY,KAAuB,CACnC,kdACA,YACA,EAEY,KAAwB,CACpC,69BACA,YACA,EAEY,KAAuB,CACnC,wTACA,YACA,EAEY,KAAmB,CAC/B,8mBACA,YACA,EAEY,KAAmB,CAC/B,ykCACA,YACA,EAEY,KAAqB,CACjC,m2BACA,YACA,EAEY,KAAqB,CACjC,wZACA,YACA,EAEY,KAAuB,CACnC,kvCACA,YACA,EAEY,KAAoB,CAChC,8vBACA,YACA,EAEY,KAAsB,CAClC,2hBACA,YACA,EAEY,KAAwB,CACpC,yWACA,YACA,EAEY,KAAoB,CAChC,kYACA,YACA,EAEY,KAAwB,CACpC,s1BACA,YACA,EAEY,KAAmB,CAC/B,ojBACA,YACA,EAEY,KAAiC,CAC7C,6sBACA,YACA,EAEY,KAAwB,CACpC,4iBACA,YACA,EAEY,KAAwB,CACpC,igBACA,YACA,EAEY,KAAwB,CACpC,4iBACA,YACA,EAEY,KAAwB,CACpC,qgBACA,YACA,EAEY,KAAwB,CACpC,orBACA,YACA,EAEY,KAAmB,CAC/B,ohBACA,YACA,EAEY,KAAuB,CACnC,siBACA,YACA,EAEY,KAAuB,CACnC,0IACA,YACA,EAEY,KAA+B,CAC3C,w2BACA,YACA,EAEY,KAA+B,CAC3C,m0BACA,YACA,EAEY,KAAoB,CAChC,2YACA,YACA,EAEY,KAA0B,CACtC,4PACA,YACA,EAEY,KAA8B,CAC1C,mTACA,YACA,EAEY,KAAoC,CAChD,6NACA,YACA,EAEY,KAA8B,CAC1C,6NACA,YACA,EAEY,KAAoB,CAChC,mJACA,YACA,EAEY,KAA0B,CACtC,szDACA,YACA,EAEY,KAA0B,CACtC,8sCACA,YACA,EAEY,KAA0B,CACtC,8kBACA,YACA,EAEY,KAAiC,CAC7C,84BACA,YACA,EAEY,KAAkB,CAC9B,yWACA,YACA,EAEY,KAAmB,CAC/B,sbACA,YACA,EAEY,KAAsB,CAClC,2eACA,YACA,EAEY,KAAc,CAC1B,0fACA,YACA,EAEY,KAAqB,CACjC,k3CACA,YACA,EAEY,KAAmC,CAC/C,gQACA,YACA,EAEY,KAA6B,CACzC,gQACA,YACA,EAEY,KAAmB,CAC/B,yNACA,YACA,EAEY,KAAuB,CACnC,qyBACA,YACA,EAEY,KAAmC,CAC/C,g6DACA,YACA,EAEY,KAAmC,CAC/C,6vBACA,YACA,EAEY,KAAqC,CACjD,2oBACA,YACA,EAEY,KAA+B,CAC3C,sRACA,YACA,EAEY,KAAoC,CAChD,kIACA,YACA,EAEY,KAAsC,CAClD,qFACA,YACA,EAEY,KAA8B,CAC1C,yeACA,YACA,EAEY,KAA8B,CAC1C,wRACA,YACA,EAEY,KAAsB,CAClC,8nDACA,YACA,EAEY,KAAsB,CAClC,8NACA,YACA,EAEY,KAAwB,CACpC,usBACA,YACA,EAEY,KAA0B,CACtC,sxBACA,YACA,EAEY,KAA6B,CACzC,gqBACA,YACA,EAEY,KAA0B,CACtC,k8BACA,YACA,EAEY,KAA4B,CACxC,gvBACA,YACA,EAEY,KAA+B,CAC3C,yvBACA,YACA,EAEY,KAA6B,CACzC,ohBACA,YACA,EAEY,KAAmC,CAC/C,g6DACA,YACA,EAEY,KAAmC,CAC/C,6hIACA,YACA,EAEY,KAAmB,CAC/B,gSACA,YACA,EAEY,KAA4B,CACxC,kNACA,YACA,EAEY,KAAuB,CACnC,wTACA,YACA,EAEY,KAAyB,CACrC,gbACA,YACA,EAEY,KAAkB,CAC9B,qPACA,YACA,EAEY,KAAmB,CAC/B,umBACA,YACA,EAEY,KAA8B,CAC1C,8wBACA,YACA,EAEY,KAAsB,CAClC,unCACA,YACA,EAEY,KAAuB,CACnC,gkFACA,YACA,EAEY,KA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"}
1
+ {"version":3,"file":"index.es.js","names":[],"sources":["../src/components/Icon/Icon.module.css","../src/components/Icon/icons.ts","../src/components/Icon/Icon.tsx","../src/components/Accordion/Accordion.module.css","../src/components/Accordion/Accordion.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.tsx","../src/components/AppleSignInButton/AppleSignInButton.module.css","../src/components/AppleSignInButton/AppleSignInButton.tsx","../src/components/BackgroundWrapper/BackgroundWrapper.module.css","../src/components/BackgroundWrapper/BackgroundWrapper.tsx","../src/utils/cn.ts","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.tsx","../src/components/Breadcrumb/Breadcrumb.module.css","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Charts/Charts.module.css","../src/components/Charts/Charts.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/ComingSoon/ComingSoon.module.css","../src/components/ComingSoon/ComingSoon.tsx","../src/components/ConfigRow/ConfigRow.module.css","../src/components/ConfigRow/ConfigRow.tsx","../src/components/DataTable/DataTable.module.css","../src/components/DataTable/DataTable.tsx","../src/components/DatePicker/DatePicker.module.css","../src/components/DatePicker/DatePicker.tsx","../src/components/DateRangePicker/DateRangePicker.module.css","../src/components/DateRangePicker/DateRangePicker.tsx","../src/hooks/useScrollLock.ts","../src/utils/focusTrap.ts","../src/components/CloseButton/CloseButton.module.css","../src/components/CloseButton/CloseButton.tsx","../src/components/Dialog/Dialog.module.css","../src/components/Dialog/Dialog.tsx","../src/hooks/useDropdown.ts","../src/utils/portal.ts","../src/components/DropdownButton/DropdownButton.module.css","../src/components/DropdownButton/DropdownButton.tsx","../src/components/DropdownMenu/DropdownMenu.module.css","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/ImagePreview/ImagePreview.module.css","../src/components/ImagePreview/ImagePreview.tsx","../src/components/DropZone/DropZone.module.css","../src/components/DropZone/dropZoneConstants.ts","../src/components/DropZone/DropZone.tsx","../src/components/DsProvider/DsProvider.tsx","../src/components/EmptyState/EmptyState.module.css","../src/components/EmptyState/EmptyState.tsx","../src/components/ErrorBoundary/ErrorBoundary.module.css","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/ExtrasDialog/ExtrasDialog.module.css","../src/components/ExtrasDialog/ExtrasDialog.tsx","../src/components/FormField/FormField.module.css","../src/components/FormField/FormField.tsx","../src/components/GoogleSignInButton/GoogleSignInButton.module.css","../src/components/GoogleSignInButton/GoogleSignInButton.tsx","../src/components/GroupedButtons/GroupedButtons.module.css","../src/components/GroupedButtons/GroupedButtons.tsx","../src/components/Header/Header.module.css","../src/components/Header/Header.tsx","../src/components/LanguageSelector/LanguageSelector.tsx","../src/components/LogoToteat/LogoToteat.module.css","../src/components/LogoToteat/LogoToteat.tsx","../src/components/Multiselect/Multiselect.module.css","../src/components/Multiselect/Multiselect.tsx","../src/components/Sidebar/Sidebar.module.css","../src/components/Sidebar/Sidebar.tsx","../src/components/NavBar/NavBar.module.css","../src/components/NavBar/NavBar.tsx","../src/components/Overlay/Overlay.module.css","../src/components/Overlay/Overlay.tsx","../src/components/OverlayMessage/OverlayMessage.module.css","../src/components/OverlayMessage/OverlayMessage.tsx","../src/components/PageLoadingOverlay/BreathingDotsCanvas.module.css","../src/components/PageLoadingOverlay/BreathingDotsCanvas.tsx","../src/components/PageLoadingOverlay/PageLoadingOverlay.module.css","../src/components/PageLoadingOverlay/ToteatLogo.module.css","../src/components/PageLoadingOverlay/ToteatLogo.tsx","../src/components/PageLoadingOverlay/PageLoadingOverlay.tsx","../src/components/PermissionGate/PermissionGate.tsx","../src/components/PinLockOverlay/PinLockOverlay.module.css","../src/components/PinLockOverlay/PinLockOverlay.tsx","../src/components/ProductTile/ProductTile.module.css","../src/components/ProductTile/ProductTile.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/SearchInput/SearchInput.module.css","../src/components/SearchInput/SearchInput.tsx","../src/components/SectionHeader/SectionHeader.module.css","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/components/SidebarNavItem/SidebarNavItem.module.css","../src/components/SidebarNavItem/SidebarNavItem.tsx","../src/hooks/useToggle.ts","../src/components/SidebarNavSection/SidebarNavSection.module.css","../src/components/SidebarNavSection/SidebarNavSection.tsx","../src/components/StatusBadge/StatusBadge.tsx","../src/components/UserNotification/NotificationBase.tsx","../src/components/StatusBanner/StatusBanner.module.css","../src/components/StatusBanner/StatusBanner.tsx","../src/components/Stepper/Stepper.module.css","../src/components/Stepper/Stepper.tsx","../src/components/Tab/Tab.module.css","../src/components/Tab/Tab.tsx","../src/components/TabBar/TabBar.module.css","../src/components/TabBar/TabBar.tsx","../src/components/Tabs/Tabs.module.css","../src/components/Tabs/Tabs.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/TextInput/TextInput.module.css","../src/components/TextInput/TextInput.tsx","../src/components/ThemeGate/ThemeGate.tsx","../src/components/Toast/Toast.module.css","../src/components/Toast/useToast.ts","../src/components/Toast/Toast.tsx","../src/components/Toggle/Toggle.module.css","../src/components/Toggle/Toggle.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx","../src/components/TreeItem/TreeItem.module.css","../src/components/TreeItem/TreeItem.tsx","../src/components/TreeList/TreeList.module.css","../src/components/TreeList/TreeList.tsx","../src/components/UserNotification/UserNotification.module.css","../src/components/UserNotification/UserNotification.tsx","../src/layouts/AdminPageHeader/AdminPageHeader.module.css","../src/layouts/AdminPageHeader/AdminPageHeader.tsx","../src/layouts/AppShell/AppShell.module.css","../src/layouts/AppShell/AppShell.tsx","../src/layouts/Divider/Divider.module.css","../src/layouts/Divider/Divider.tsx","../src/layouts/Grid/Grid.module.css","../src/layouts/Grid/Grid.tsx","../src/layouts/LoginFooter/LoginFooter.module.css","../src/layouts/LoginFooter/LoginFooter.tsx","../src/layouts/LoginPageLayout/LoginPageLayout.module.css","../src/layouts/LoginPageLayout/LoginPageLayout.tsx","../src/layouts/PageLayout/PageLayout.module.css","../src/layouts/PageLayout/PageLayout.tsx","../src/layouts/Stack/Stack.tsx","../src/utils/csv.ts"],"sourcesContent":["@layer ds-components {\n .icon {\n display: inline-block;\n flex-shrink: 0;\n vertical-align: middle;\n }\n}\n","// This file is auto-generated by generateIcons.ts. Do not edit directly.\n// Run: npx tsx src/components/Icon/generateIcons.ts\n\nexport const ICON_APPLE_FILLED = [\n\t\"<path d='M16.102 2.01c-.042-.047-1.573.019-2.906 1.465C11.864 4.92 12.07 6.577 12.1 6.62c.03.042 1.9.109 3.093-1.573 1.194-1.68.953-2.988.91-3.037Zm4.143 14.666c-.06-.12-2.906-1.542-2.641-4.277.265-2.737 2.093-3.487 2.122-3.568.029-.081-.746-.987-1.567-1.446a4.615 4.615 0 0 0-1.954-.543c-.135-.003-.604-.118-1.568.145-.635.174-2.066.737-2.46.76-.395.022-1.57-.653-2.833-.832-.81-.156-1.667.164-2.28.41-.613.245-1.778.942-2.593 2.796-.815 1.853-.389 4.788-.084 5.7.305.911.782 2.405 1.592 3.495.72 1.23 1.675 2.084 2.073 2.374.4.29 1.524.482 2.304.084.628-.385 1.76-.607 2.208-.59.446.016 1.326.192 2.227.673.714.247 1.389.144 2.065-.13.676-.277 1.655-1.325 2.798-3.448.433-.988.63-1.522.59-1.603Z'/><path d='M16.102 2.01c-.042-.047-1.573.019-2.906 1.465C11.864 4.92 12.07 6.577 12.1 6.62c.03.042 1.9.109 3.093-1.573 1.194-1.68.953-2.988.91-3.037Zm4.143 14.666c-.06-.12-2.906-1.542-2.641-4.277.265-2.737 2.093-3.487 2.122-3.568.029-.081-.746-.987-1.567-1.446a4.615 4.615 0 0 0-1.954-.543c-.135-.003-.604-.118-1.568.145-.635.174-2.066.737-2.46.76-.395.022-1.57-.653-2.833-.832-.81-.156-1.667.164-2.28.41-.613.245-1.778.942-2.593 2.796-.815 1.853-.389 4.788-.084 5.7.305.911.782 2.405 1.592 3.495.72 1.23 1.675 2.084 2.073 2.374.4.29 1.524.482 2.304.084.628-.385 1.76-.607 2.208-.59.446.016 1.326.192 2.227.673.714.247 1.389.144 2.065-.13.676-.277 1.655-1.325 2.798-3.448.433-.988.63-1.522.59-1.603Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_DOWN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M8.354 11.854a.5.5 0 0 1-.707 0L4.465 8.672a.5.5 0 1 1 .707-.708L7.5 10.293V4.5a.5.5 0 1 1 1 0v5.793l2.329-2.329a.5.5 0 1 1 .707.708l-3.182 3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_LEFT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.146 8.353a.5.5 0 0 1 0-.707l3.182-3.182a.5.5 0 0 1 .708.707L5.707 7.5H11.5a.5.5 0 0 1 0 1H5.707l2.329 2.328a.5.5 0 1 1-.708.707L4.146 8.353Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_RIGHT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M11.854 7.646a.5.5 0 0 1 0 .707l-3.182 3.182a.5.5 0 1 1-.708-.707L10.293 8.5H4.5a.5.5 0 0 1 0-1h5.793L7.964 5.17a.5.5 0 1 1 .708-.707l3.182 3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_CIRCLE_UP_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.646 4.146a.5.5 0 0 1 .707 0l3.182 3.182a.5.5 0 1 1-.707.708L8.5 5.707V11.5a.5.5 0 0 1-1 0V5.707L5.17 8.036a.5.5 0 1 1-.707-.708l3.182-3.182Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_DOWN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m11.535 11.172-3.182 3.182a.5.5 0 0 1-.707 0l-3.182-3.182a.5.5 0 1 1 .707-.708L7.5 12.793V2a.5.5 0 0 1 1 0v10.793l2.328-2.329a.5.5 0 1 1 .707.708Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_LEFT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.646 8.353a.5.5 0 0 1 0-.707l3.182-3.182a.5.5 0 0 1 .708.707L3.207 7.5H14a.5.5 0 0 1 0 1H3.207l2.329 2.328a.5.5 0 1 1-.708.707L1.646 8.353Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_LIST_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M4.25 2.6c.22 0 .4.18.4.4v6.6h6.353L9.417 7.222a.4.4 0 1 1 .666-.444l2 3a.4.4 0 0 1 0 .444l-2 3a.4.4 0 1 1-.666-.444l1.586-2.378H4.25a.4.4 0 0 1-.4-.4V3c0-.22.18-.4.4-.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_DOWN_FILLED = [\n\t\"<path d='m7.5 9.5 3-3h-6l3 3Z'/><path fill-rule='evenodd' d='M7.854 9.854a.5.5 0 0 1-.708 0l-3-3A.5.5 0 0 1 4.5 6h6a.5.5 0 0 1 .354.854l-3 3ZM9.293 7H5.707L7.5 8.793 9.293 7Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_LEFT_FILLED = [\n\t\"<path d='m6.5 7.5 3 3v-6l-3 3Z'/><path fill-rule='evenodd' d='M6.146 7.854a.5.5 0 0 1 0-.708l3-3A.5.5 0 0 1 10 4.5v6a.5.5 0 0 1-.854.354l-3-3ZM9 9.293V5.707L7.207 7.5 9 9.293Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_RIGHT_FILLED = [\n\t\"<path d='m10 7.962-3 3v-6l3 3Z'/><path fill-rule='evenodd' d='M10.354 8.315a.5.5 0 0 0 0-.707l-3-3a.5.5 0 0 0-.854.354v6a.5.5 0 0 0 .854.354l3-3ZM7.5 9.755V6.169l1.793 1.793L7.5 9.755Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_POINT_UP_FILLED = [\n\t\"<path d='m8.25 7-3 3h6l-3-3Z'/><path fill-rule='evenodd' d='M7.896 6.646a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.354.854h-6a.5.5 0 0 1-.354-.854l3-3ZM6.457 9.5h3.586L8.25 7.707 6.457 9.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_RIGHT_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m11.172 4.464 3.182 3.182a.5.5 0 0 1 0 .707l-3.182 3.182a.5.5 0 0 1-.708-.707L12.793 8.5H2a.5.5 0 0 1 0-1h10.793L10.464 5.17a.5.5 0 1 1 .708-.707Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ARROW_UP_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='m4.465 4.828 3.182-3.182a.5.5 0 0 1 .707 0l3.182 3.182a.5.5 0 1 1-.707.708L8.5 3.207V14a.5.5 0 0 1-1 0V3.207L5.172 5.536a.5.5 0 1 1-.707-.708Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_BARCODE_OUTLINE = [\n\t\"<path d='M13.76 8a.48.48 0 0 1-.48.48H2.72a.48.48 0 1 1 0-.96h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96v-2.4h.96v2.4h.96a.48.48 0 0 1 .48.48ZM4.64 10.88h-.96V9.44h.96v1.44ZM12.32 10.88h-.96V9.44h.96v1.44ZM6.56 10.4H5.6v-.96h.96v.96ZM8.48 10.4h-.96v-.96h.96v.96ZM10.4 10.4h-.96v-.96h.96v.96ZM1.28 5.12V3.68c0-.794.646-1.44 1.44-1.44h1.44a.48.48 0 1 1 0 .96H2.72a.48.48 0 0 0-.48.48v1.44a.48.48 0 1 1-.96 0ZM14.72 3.68v1.44a.48.48 0 1 1-.96 0V3.68a.48.48 0 0 0-.48-.48h-1.44a.48.48 0 1 1 0-.96h1.44c.794 0 1.44.646 1.44 1.44ZM4.64 13.28a.48.48 0 0 1-.48.48H2.72c-.794 0-1.44-.646-1.44-1.44v-1.44a.48.48 0 1 1 .96 0v1.44c0 .265.215.48.48.48h1.44a.48.48 0 0 1 .48.48ZM14.72 10.88v1.44c0 .794-.646 1.44-1.44 1.44h-1.44a.48.48 0 1 1 0-.96h1.44a.48.48 0 0 0 .48-.48v-1.44a.48.48 0 1 1 .96 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_BELL_OUTLINE = [\n\t\"<path d='M13.98 12.667h-.525V8.139c0-2.424-1.483-4.488-3.563-5.288V1.96C9.892.877 9.042 0 7.995 0 6.95 0 6.103.88 6.103 1.96v.885C4.025 3.643 2.54 5.71 2.54 8.136v4.53h-.525a.526.526 0 0 0-.515.534c0 .293.232.533.515.533H5.45C5.64 15.013 6.708 16 8 16s2.36-.987 2.549-2.267h3.436c.283 0 .515-.24.515-.533a.53.53 0 0 0-.52-.533M7.132 1.96A.88.88 0 0 1 8 1.067c.476 0 .862.4.862.893v.608a5 5 0 0 0-.872-.08c-.294 0-.577.032-.858.077zM8 14.8c-.72 0-1.216-.376-1.39-1.067h2.812C9.249 14.424 8.72 14.8 8 14.8m-4.297-2.3V8.139C3.703 5.613 5.895 3.8 8 3.8s4.203 1.813 4.203 4.339V12.5z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_ALT_OUTLINE = [\n\t\"<path d='M7.47 10.14a.842.842 0 0 1-.205-.724c.01-.053.025-.102.04-.15.02-.048.045-.096.07-.14.03-.042.06-.085.095-.122a.617.617 0 0 1 .245-.171.662.662 0 0 1 .57 0c.045.015.09.042.13.069.04.032.08.064.115.102.035.037.065.08.095.123.025.043.05.09.065.14a.777.777 0 0 1 .06.305c0 .208-.08.417-.22.567-.034.038-.075.07-.115.102-.04.027-.085.054-.13.075a1.1 1.1 0 0 1-.14.043.636.636 0 0 1-.29 0c-.05-.01-.095-.027-.14-.043a1.048 1.048 0 0 1-.13-.075 1.07 1.07 0 0 1-.115-.102Zm3.335 2.951a.77.77 0 0 0 .165.262c.035.038.075.07.115.103.04.026.085.053.13.075.045.015.09.032.14.042a.725.725 0 0 0 .675-.22.699.699 0 0 0 .16-.262.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.694.694 0 0 0-.16-.263.716.716 0 0 0-.675-.22.624.624 0 0 0-.14.049.617.617 0 0 0-.245.171 1.19 1.19 0 0 0-.095.123c-.025.043-.05.091-.07.14-.014.048-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-3.5 0c.02.048.045.097.07.14.03.042.06.085.095.123a.621.621 0 0 0 .245.171.624.624 0 0 0 .285.064.636.636 0 0 0 .284-.064.61.61 0 0 0 .131-.07c.04-.032.08-.064.115-.101a.699.699 0 0 0 .16-.262.777.777 0 0 0 .06-.305.843.843 0 0 0-.22-.569.607.607 0 0 0-.246-.171.663.663 0 0 0-.57 0 .617.617 0 0 0-.244.171.843.843 0 0 0-.165.873Zm3.5-3.214a.77.77 0 0 0 .165.263c.035.037.075.069.115.101.04.027.085.054.13.075.045.016.09.032.14.043a.636.636 0 0 0 .29 0c.05-.01.095-.027.14-.043a1.02 1.02 0 0 0 .13-.075c.04-.032.08-.064.115-.102a.699.699 0 0 0 .16-.263.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.697.697 0 0 0-.16-.262.716.716 0 0 0-1.06 0 .806.806 0 0 0-.165.262c-.014.048-.03.097-.04.15a.777.777 0 0 0 0 .31c.01.054.025.103.04.15Zm-6.305.498c.195 0 .39-.086.53-.236s.22-.353.22-.567a.843.843 0 0 0-.22-.568c-.28-.3-.78-.3-1.06 0a.843.843 0 0 0 0 1.135c.14.15.33.236.53.236ZM15 4.215v10.178c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607H4V1.536C4 1.24 4.224 1 4.5 1s.5.24.5.536v1.071h6V1.536c0-.296.224-.536.5-.536s.5.24.5.536v1.071h1.5c.827 0 1.5.721 1.5 1.607Zm-1 3.214H2v6.964c0 .295.224.536.5.536h11c.276 0 .5-.24.5-.536V7.429Zm0-3.215c0-.295-.224-.535-.5-.535H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.679H5V4.75c0 .296-.224.536-.5.536S4 5.046 4 4.75V3.679H2.5c-.276 0-.5.24-.5.535v2.143h12V4.214ZM4.5 13.59c.2 0 .39-.085.53-.235.14-.15.22-.354.22-.568a.833.833 0 0 0-.22-.568.737.737 0 0 0-1.06 0 .833.833 0 0 0-.22.568c0 .214.08.418.22.568.14.15.33.235.53.235Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_LOCKED_OUTLINE = [\n\t\"<path d='M15 4.214v10.179c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607h11c.827 0 1.5.721 1.5 1.607Zm-1 3.214H2v6.965c0 .295.224.535.5.535h11c.276 0 .5-.24.5-.535V7.428Zm0-3.214c0-.295-.224-.536-.5-.536H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.678H6V4.75c0 .296-.224.536-.5.536S5 5.046 5 4.75V3.678H2.5c-.276 0-.5.24-.5.536v2.143h12V4.214Z'/><path stroke='currentColor' d='M5.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5M11.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5'/><path d='M10.063 10.25h-.376v-.375A1.877 1.877 0 0 0 7.813 8a1.877 1.877 0 0 0-1.875 1.875v.375h-.375a.375.375 0 0 0-.375.375v3c0 .207.167.375.375.375h4.5a.375.375 0 0 0 .374-.375v-3a.375.375 0 0 0-.374-.375Zm-3.376-.375a1.125 1.125 0 0 1 2.25 0v.375h-2.25v-.375Zm3 3.375h-3.75V11h3.75v2.25Z'/><path d='M7.813 12.5a.375.375 0 1 0 0-.75.375.375 0 0 0 0 .75Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CALENDAR_OUTLINE = [\n\t\"<path d='M7.47 10.14a.843.843 0 0 1-.205-.724c.01-.054.025-.102.04-.15.02-.048.045-.097.07-.14.03-.042.06-.085.095-.123a.616.616 0 0 1 .245-.171.662.662 0 0 1 .57 0c.045.016.09.043.13.07.04.032.08.064.115.101a.697.697 0 0 1 .16.262.777.777 0 0 1 .06.305c0 .21-.08.42-.22.57-.034.037-.075.069-.115.1-.04.028-.085.054-.13.076a1.1 1.1 0 0 1-.14.043.636.636 0 0 1-.29 0 1.08 1.08 0 0 1-.14-.043 1.048 1.048 0 0 1-.13-.075 1.07 1.07 0 0 1-.115-.102Zm3.335 2.951a.767.767 0 0 0 .28.364c.04.027.085.054.13.075.045.016.09.032.14.043a.725.725 0 0 0 .675-.22.696.696 0 0 0 .16-.263.778.778 0 0 0 .045-.46.74.74 0 0 0-.045-.15.696.696 0 0 0-.16-.262.716.716 0 0 0-.675-.22.624.624 0 0 0-.14.048.617.617 0 0 0-.245.172 1.19 1.19 0 0 0-.095.123c-.025.043-.05.091-.07.14-.014.047-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-3.5 0c.02.048.045.096.07.14.03.042.06.085.095.123a.617.617 0 0 0 .245.171.624.624 0 0 0 .285.064.636.636 0 0 0 .284-.064.607.607 0 0 0 .131-.07c.04-.032.08-.064.115-.101a.696.696 0 0 0 .16-.263.778.778 0 0 0 .06-.305.843.843 0 0 0-.22-.568c-.034-.038-.075-.07-.115-.102a.607.607 0 0 0-.13-.07.663.663 0 0 0-.57 0 .617.617 0 0 0-.13.07c-.04.032-.08.064-.115.102a.843.843 0 0 0-.205.723c.01.053.025.102.04.15Zm3.5-3.214a.77.77 0 0 0 .165.263c.035.037.075.069.115.101.04.027.085.053.13.075.045.016.09.032.14.043a.636.636 0 0 0 .29 0c.05-.01.095-.027.14-.043.045-.022.09-.048.13-.075.04-.032.08-.064.115-.102a.699.699 0 0 0 .16-.263.777.777 0 0 0 .045-.46.737.737 0 0 0-.045-.15.697.697 0 0 0-.16-.263.716.716 0 0 0-.675-.22c-.05.012-.095.028-.14.044-.045.021-.09.048-.13.075-.04.032-.08.064-.115.101a.806.806 0 0 0-.165.263c-.014.048-.03.096-.04.15a.777.777 0 0 0 0 .31c.01.054.025.102.04.15Zm-6.305.498c.195 0 .39-.086.53-.236s.22-.353.22-.568a.843.843 0 0 0-.22-.568c-.28-.3-.78-.3-1.06 0a.843.843 0 0 0 0 1.136c.14.15.33.236.53.236ZM15 4.215v10.178c0 .886-.673 1.607-1.5 1.607h-11c-.827 0-1.5-.721-1.5-1.607V4.214c0-.886.673-1.607 1.5-1.607h11c.827 0 1.5.721 1.5 1.607Zm-1 3.213H2v6.965c0 .295.224.535.5.535h11c.276 0 .5-.24.5-.535V7.428Zm0-3.214c0-.295-.224-.536-.5-.536H12V4.75c0 .296-.224.536-.5.536s-.5-.24-.5-.536V3.678H6V4.75c0 .296-.224.536-.5.536S5 5.046 5 4.75V3.678H2.5c-.276 0-.5.24-.5.536v2.143h12V4.214ZM4.5 13.59c.2 0 .39-.086.53-.236s.22-.353.22-.567a.833.833 0 0 0-.22-.568.737.737 0 0 0-1.06 0 .833.833 0 0 0-.22.568c0 .214.08.417.22.567.14.15.33.236.53.236Z'/><path stroke='currentColor' d='M5.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5M11.5 4V2c0-.333-.2-1-1-1s-1 .667-1 1v1.5'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CARROT_FILLED = [\n\t\"<path d='M1.4 22.116c1.812 1.632 13.968-5.604 15.768-8.652.864-1.464-.156-3.612-1.824-5.328 1.896-1.26 3.564 2.664 5.148 1.836.72-.384 1.188-1.572.84-2.304-.624-1.296-2.7-1.296-4.104-1.452.996-.24 3.384-1.26 3.432-2.7.048-1.104-1.356-2.364-2.46-2.232-1.452.168-1.98 2.256-2.472 3.6-.06-.852-.24-2.724-1.176-3.54-1.248-1.092-2.748-.06-2.784 1.26-.048 1.596 3.384 2.484 2.304 4.404C12.248 5.604 10.1 4.836 8.72 5.64c-.588.372-1.26 1.092-1.956 2.028 1.068 1.128 2.544 2.484 3.708 3.264.24.168.312.504.132.744a.53.53 0 0 1-.744.144c-1.188-.804-2.64-2.136-3.72-3.252a32.183 32.183 0 0 0-1.608 2.676c1.02 1.032 2.316 2.196 3.348 2.892.24.168.3.504.132.744a.541.541 0 0 1-.756.144c-1.02-.696-2.232-1.776-3.252-2.784C1.88 16.428.32 21.156 1.4 22.116Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CHECK_OUTLINE = [\n\t\"<path d='M14.04 4.04a.65.65 0 0 1 .92.92l-9 9a.651.651 0 0 1-.968-.054l-4-5-.071-.11A.65.65 0 0 1 1.915 8l.093.094 3.546 4.431L14.04 4.04Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHECKBOX_CHECKED = [\n\t\"<path fill='#1B1B1B' d='M11 0H1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1Zm-6 8.75L2.5 6.271l.795-.771L5 7.173 8.704 3.5l.796.788L5 8.75Z'/>\",\n\t\"0 0 12 12\",\n] as const;\n\nexport const ICON_CHECKBOX_UNCHECKED = [\n\t\"<path fill='#1B1B1B' d='M11 0H1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1ZM1 11V1h10v10H1Z'/>\",\n\t\"0 0 12 12\",\n] as const;\n\nexport const ICON_CHEVRON_DOWN_OUTLINE = [\n\t\"<path d='M15.761 4.197c.263.245.31.638.135.938l-.09.122-6.762 7.5a.732.732 0 0 1-1.088 0l-6.762-7.5a.759.759 0 0 1 .045-1.06.73.73 0 0 1 1.043.046L8.5 11.14l6.219-6.896.111-.1a.729.729 0 0 1 .931.054Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_LEFT_BICOLOR = [\n\t\"<path fill='#F2F2F2' d='M17.005 12.982a4 4 0 0 1-3.992 4.008l-8 .015a4 4 0 0 1-4.008-3.992l-.015-8a4 4 0 0 1 3.993-4.008l8-.015a4 4 0 0 1 4.007 3.992l.015 8Z'/><path fill='#1B1B1B' fill-rule='evenodd' d='M10.825 14.493a.432.432 0 0 1-.61-.008l-5.11-5.256a.432.432 0 0 1 .009-.611l5.256-5.11a.432.432 0 0 1 .602.62L6.025 8.936l4.809 4.947a.432.432 0 0 1-.009.61Z' clip-rule='evenodd'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_CHEVRON_LEFT_OUTLINE = [\n\t\"<path d='M12.803 15.761a.759.759 0 0 1-.938.135l-.122-.09-7.5-6.762a.732.732 0 0 1 0-1.088l7.5-6.762a.759.759 0 0 1 1.06.045.73.73 0 0 1-.046 1.043L5.86 8.5l6.897 6.219.1.111a.729.729 0 0 1-.054.931Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_RIGHT_BICOLOR = [\n\t\"<path fill='#F2F2F2' d='M17.005 12.982a4 4 0 0 1-3.992 4.008l-8 .015a4 4 0 0 1-4.008-3.992l-.015-8a4 4 0 0 1 3.993-4.008l8-.015a4 4 0 0 1 4.007 3.992l.015 8Z'/><path fill='#1B1B1B' fill-rule='evenodd' d='M7.189 14.493a.432.432 0 0 0 .61-.008l5.11-5.256a.432.432 0 0 0-.008-.611l-5.256-5.11a.432.432 0 0 0-.603.62l4.947 4.808-4.809 4.947a.432.432 0 0 0 .009.61Z' clip-rule='evenodd'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_CHEVRON_RIGHT_OUTLINE = [\n\t\"<path d='M4.197 1.239a.759.759 0 0 1 .938-.134l.122.088 7.5 6.763a.732.732 0 0 1 0 1.088l-7.5 6.762a.759.759 0 0 1-1.06-.045.73.73 0 0 1 .046-1.043L11.14 8.5 4.244 2.28l-.1-.111a.729.729 0 0 1 .054-.931Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHEVRON_UP_OUTLINE = [\n\t\"<path d='M1.239 12.803a.759.759 0 0 1-.134-.938l.088-.122 6.763-7.5a.732.732 0 0 1 1.088 0l6.762 7.5a.759.759 0 0 1-.045 1.06.73.73 0 0 1-1.043-.046L8.5 5.86 2.28 12.757l-.111.1a.729.729 0 0 1-.931-.054Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CHICKEN_FILLED = [\n\t\"<path d='M20.16 12.73A6.27 6.27 0 0 0 19.09 3c-2.01-1.33-4.7-1.34-6.73-.03-1.76 1.13-2.73 2.89-2.9 4.71-.13 1.32-.63 2.55-1.55 3.47l-.03.03c-1.16 1.16-1.16 2.93-.07 4.01l.99.99a2.794 2.794 0 0 0 3.95 0c.97-.97 2.25-1.5 3.64-1.65 1.37-.15 2.71-.75 3.77-1.8Zm-13.9 7.13c.27.56.18 1.24-.29 1.7a1.49 1.49 0 0 1-2.55-.98 1.49 1.49 0 0 1-.98-2.55c.46-.46 1.15-.56 1.7-.29l2.48-2.43c.14.19.3.41.48.59l.99.99c.21.2.41.37.67.52l-2.5 2.45Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CHILI_FILLED = [\n\t\"<path d='M18.73 2.118a.936.936 0 0 1 1.274.363l.187.34a4.682 4.682 0 0 1 .133 4.297A6.214 6.214 0 0 1 22 11.376c0 .722-.121 1.418-.348 2.062-.238.676-1.113.637-1.437-.004l-.457-.914a.944.944 0 0 0-.84-.52h-2.855a.935.935 0 0 1-.938-.937V7.938a.935.935 0 0 0-.938-.937h-.667c-.832 0-1.172-.934-.422-1.286a6.206 6.206 0 0 1 2.652-.59c1.105 0 2.14.286 3.04.79a2.81 2.81 0 0 0-.235-2.18l-.188-.34a.936.936 0 0 1 .363-1.273v-.004ZM8.688 15.497l3.626-7.246h1.562v3.125c0 1.035.84 1.875 1.875 1.875h2.977l.933 1.867A16.934 16.934 0 0 1 6.031 22H3.734a1.734 1.734 0 0 1-.375-3.426l1.946-.434a4.999 4.999 0 0 0 3.386-2.644h-.004Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_CLOSE_OUTLINE = [\n\t\"<path d='m8 7.293 5.646-5.647a.502.502 0 0 1 .708.708L8.707 8l5.647 5.646a.502.502 0 0 1-.708.708L8 8.707l-5.646 5.647a.502.502 0 0 1-.708-.708L7.293 8 1.646 2.354a.502.502 0 0 1 .708-.708z' />\",\n\t\"0 0 15 15\",\n] as const;\n\nexport const ICON_CLOUD_DOWNLOAD_OUTLINE = [\n\t\"<path d='M4.406 1.342A5.53 5.53 0 0 1 8 0c2.69 0 4.923 2 5.166 4.579C14.758 4.804 16 6.137 16 7.773c0 1.796-1.498 3.226-3.313 3.226H10a.5.5 0 0 1 0-1h2.688C13.979 10 15 8.988 15 7.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 2.825 10.328 1 8 1a4.53 4.53 0 0 0-2.941 1.1c-.757.652-1.153 1.438-1.153 2.055v.448l-.445.049C2.064 4.805 1 5.952 1 7.318c0 1.467 1.23 2.681 2.781 2.681H6a.5.5 0 1 1 0 1H3.781C1.708 11 0 9.366 0 7.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383Z'/><path d='M8.354 15.794a.5.5 0 0 1-.708 0L5 13a.5.5 0 0 1 .708-.708L7.5 14.233V5.441a.5.5 0 0 1 1 0v8.792l1.792-1.941A.5.5 0 0 1 11 13l-2.646 2.794Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_CLOUD_UPLOAD_OUTLINE = [\n\t\"<path d='M4.406 1.342A5.53 5.53 0 0 1 8 0c2.69 0 4.923 2 5.166 4.579C14.758 4.804 16 6.137 16 7.773c0 1.796-1.498 3.226-3.313 3.226H10a.5.5 0 0 1 0-1h2.688C13.979 10 15 8.988 15 7.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 2.825 10.328 1 8 1a4.53 4.53 0 0 0-2.941 1.1c-.757.652-1.153 1.438-1.153 2.055v.448l-.445.049C2.064 4.805 1 5.952 1 7.318c0 1.467 1.23 2.681 2.781 2.681H6a.5.5 0 1 1 0 1H3.781C1.708 11 0 9.366 0 7.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383Z'/><path d='M7.646 3.206a.5.5 0 0 1 .708 0l3 3a.5.5 0 1 1-.708.708L8.5 4.767v9.792a.5.5 0 1 1-1 0V4.767L5.354 6.914a.5.5 0 0 1-.708-.708l3-3Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_COPY_GENERIC_OUTLINE = [\n\t\"<path d='M9.5 11.5a.5.5 0 0 1-.5.5H5a.5.5 0 0 1 0-1h4a.5.5 0 0 1 .5.5ZM9 9H5a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1Zm4.5-4.421V11a1.502 1.502 0 0 1-1.5 1.5h-.5v1A1.502 1.502 0 0 1 10 15H4a1.502 1.502 0 0 1-1.5-1.5V5A1.502 1.502 0 0 1 4 3.5h.5v-1A1.502 1.502 0 0 1 6 1h4a.5.5 0 0 1 .358.151l3 3.079a.498.498 0 0 1 .142.349Zm-3-1.079a.5.5 0 0 0 .5.5h.738L10.5 2.73v.77Zm0 10v-6H9A1.502 1.502 0 0 1 7.5 6V4.5H4a.5.5 0 0 0-.5.5v8.5a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 .5-.5ZM8.5 6a.5.5 0 0 0 .5.5h.738L8.5 5.23V6Zm4 5V5H11a1.502 1.502 0 0 1-1.5-1.5V2H6a.5.5 0 0 0-.5.5v1H8a.499.499 0 0 1 .358.151l3 3.079a.498.498 0 0 1 .142.349V11.5h.5a.5.5 0 0 0 .5-.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_COPY_SQUARE_OUTLINE = [\n\t\"<path d='M11.77 4.23A2.728 2.728 0 0 0 9.09 2H4.728A2.727 2.727 0 0 0 2 4.727v4.364a2.727 2.727 0 0 0 2.23 2.678A2.727 2.727 0 0 0 6.91 14h4.363A2.726 2.726 0 0 0 14 11.273V6.909a2.727 2.727 0 0 0-2.23-2.678ZM3.09 9.09V4.728a1.636 1.636 0 0 1 1.637-1.636h4.364a1.636 1.636 0 0 1 1.636 1.636v4.364a1.636 1.636 0 0 1-1.636 1.636H4.727a1.636 1.636 0 0 1-1.636-1.636Zm9.82 2.183a1.636 1.636 0 0 1-1.637 1.636H6.909a1.637 1.637 0 0 1-1.538-1.09h3.72a2.728 2.728 0 0 0 2.727-2.728V5.37a1.636 1.636 0 0 1 1.091 1.538v4.364Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DELETE_OUTLINE = [\n\t\"<path d='M3.098 3.297a.634.634 0 0 0-.634.638v9.543c0 1.046.86 1.907 1.907 1.907h7.639c1.046 0 1.907-.86 1.907-1.907V3.935a.637.637 0 0 0-.635-.638H3.098Zm.638 1.272h8.907v8.909a.623.623 0 0 1-.634.634H4.371a.623.623 0 0 1-.634-.634V4.569Z'/><path d='M1.825 3.3a.636.636 0 0 0 0 1.272h12.731a.638.638 0 0 0 0-1.272H1.825Z'/><path d='M5.644.117c-1.047 0-1.908.86-1.908 1.907v1.911a.637.637 0 0 0 1.274 0V2.024c0-.359.275-.634.634-.634h5.093c.359 0 .634.275.634.634v1.911a.64.64 0 0 0 .639.634.636.636 0 0 0 .634-.634V2.024c0-1.047-.861-1.907-1.908-1.907H5.644ZM6.283 5.845a.64.64 0 0 0-.639.634v5.725a.64.64 0 0 0 1.088.45.635.635 0 0 0 .185-.45V6.479a.636.636 0 0 0-.634-.634ZM10.102 5.845a.64.64 0 0 0-.639.634v5.725a.64.64 0 0 0 1.088.45.632.632 0 0 0 .185-.45V6.479a.636.636 0 0 0-.634-.634Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DISCOUNT_OUTLINE = [\n\t\"<path d='M9.273 9.91a.636.636 0 1 0 0-1.274.636.636 0 0 0 0 1.273ZM6.727 7.364a.636.636 0 1 0 0-1.273.636.636 0 0 0 0 1.273ZM6.546 9.91a.455.455 0 0 1-.322-.778L9.127 6.23a.455.455 0 1 1 .643.643L6.868 9.776a.453.453 0 0 1-.322.133Z'/><path d='M8 15a1.93 1.93 0 0 1-1.369-.566l-.665-.665a.853.853 0 0 0-.607-.251h-.941a1.94 1.94 0 0 1-1.936-1.936v-.942a.852.852 0 0 0-.252-.606l-.665-.666a1.94 1.94 0 0 1 0-2.737l.665-.666a.852.852 0 0 0 .252-.606v-.942a1.94 1.94 0 0 1 1.935-1.935h.942a.853.853 0 0 0 .606-.252l.666-.665a1.94 1.94 0 0 1 2.738 0l.665.665a.853.853 0 0 0 .607.251h.942a1.94 1.94 0 0 1 1.935 1.936v.942a.854.854 0 0 0 .252.606l.665.666a1.94 1.94 0 0 1 0 2.737l-.665.665a.855.855 0 0 0-.252.607v.942a1.94 1.94 0 0 1-1.935 1.935h-.942a.85.85 0 0 0-.607.252l-.665.665A1.93 1.93 0 0 1 8 15ZM8 2.077a.857.857 0 0 0-.607.251l-.665.664a1.924 1.924 0 0 1-1.368.567h-.942a.86.86 0 0 0-.858.858v.942a1.924 1.924 0 0 1-.567 1.368l-.666.666a.86.86 0 0 0 0 1.214l.665.665a1.924 1.924 0 0 1 .567 1.368v.942a.86.86 0 0 0 .859.858h.942a1.925 1.925 0 0 1 1.368.567l.665.665a.86.86 0 0 0 1.214 0l.666-.665a1.923 1.923 0 0 1 1.368-.567h.941a.86.86 0 0 0 .859-.858v-.942a1.924 1.924 0 0 1 .567-1.368l.665-.665a.86.86 0 0 0 0-1.214l-.665-.666a1.925 1.925 0 0 1-.567-1.368v-.941a.86.86 0 0 0-.858-.859h-.942a1.924 1.924 0 0 1-1.368-.566l-.666-.666A.857.857 0 0 0 8 2.077Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_GENERIC_OUTLINE = [\n\t\"<path d='M5.703 4.333a.417.417 0 0 0 0 .834h4.53a.417.417 0 0 0 0-.834h-4.53ZM5.286 7.678c0-.23.187-.416.417-.416h4.53a.417.417 0 0 1 0 .833h-4.53a.417.417 0 0 1-.417-.417ZM5.703 10.167a.417.417 0 1 0 0 .833H8.41a.417.417 0 1 0 0-.833H5.703Z'/><path d='M3 2.667C3 1.747 3.746 1 4.667 1h6.666C12.253 1 13 1.746 13 2.667v10c0 .92-.746 1.666-1.667 1.666H4.667c-.92 0-1.667-.746-1.667-1.666v-10Zm8.333-.834H4.667a.833.833 0 0 0-.834.834v10c0 .46.373.833.834.833h6.666c.46 0 .834-.373.834-.833v-10a.833.833 0 0 0-.834-.834Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_HISTORY_ALT_OUTLINE = [\n\t\"<path stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M7.5 5v4H11'/><circle cx='8' cy='8' r='6.4' stroke='currentColor' stroke-width='1.2'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_HISTORY_OUTLINE = [\n\t\"<path d='M14.17 3.44A6.928 6.928 0 1 1 3.264 11.99a.533.533 0 1 1 .839-.658 5.884 5.884 0 1 0-1.207-4.246s-.077.117-.308.298l-.81-.098.095-.526A6.922 6.922 0 0 1 14.169 3.44Z'/><path d='m.486 5.994 4.531-.29a.289.289 0 0 1 .252.458L3.177 9.026a.289.289 0 0 1-.442.029L.295 6.48a.289.289 0 0 1 .191-.486Z'/><path stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='M8 5v4h4'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DOCUMENT_LIST_OUTLINE = [\n\t\"<path d='M7.524 4.333a.417.417 0 0 0 0 .834h2.708a.417.417 0 0 0 0-.834H7.524ZM7.107 7.678c0-.23.187-.416.417-.416h2.708a.417.417 0 0 1 0 .833H7.524a.417.417 0 0 1-.417-.417ZM7.524 10.167a.417.417 0 1 0 0 .833h2.708a.417.417 0 1 0 0-.833H7.524Z'/><path d='M3 2.667C3 1.747 3.746 1 4.667 1h6.666C12.253 1 13 1.746 13 2.667v10c0 .92-.746 1.666-1.667 1.666H4.667c-.92 0-1.667-.746-1.667-1.666v-10Zm8.333-.834H4.667a.833.833 0 0 0-.834.834v10c0 .46.373.833.834.833h6.666c.46 0 .834-.373.834-.833v-10a.833.833 0 0 0-.834-.834Z'/><path d='M5.5 4.333a.417.417 0 0 0 0 .834h.292a.417.417 0 0 0 0-.834H5.5ZM5.5 7.262a.417.417 0 1 0 0 .833h.292a.417.417 0 0 0 0-.833H5.5ZM5.5 10.167a.417.417 0 1 0 0 .833h.292a.417.417 0 1 0 0-.833H5.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_DRAG_HANDLE_OUTLINE = [\n\t\"<path d='M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_ERROR_FILLED_RED = [\n\t\"<path fill='#E12845' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14ZM3.353 3.044a.571.571 0 0 0-.185.933L6.192 7l-3.024 3.023a.572.572 0 0 0 .809.81L7 7.807l3.024 3.024a.573.573 0 0 0 .808-.809L7.808 7l3.024-3.023a.571.571 0 1 0-.809-.81L7 6.193 3.977 3.168a.571.571 0 0 0-.624-.124Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_ERROR_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.164 4.13a.5.5 0 0 1 .706.034l5 5.5a.5.5 0 1 1-.74.672l-5-5.5a.5.5 0 0 1 .034-.706Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M9.836 4.13a.5.5 0 0 0-.706.034l-5 5.5a.5.5 0 1 0 .74.672l5-5.5a.5.5 0 0 0-.034-.706Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_EXCLAMATION_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 15.2A7.2 7.2 0 1 0 8 .8a7.2 7.2 0 0 0 0 14.4Zm0 .8A8 8 0 1 0 8 0a8 8 0 0 0 0 16Z' clip-rule='evenodd'/><path d='M7.53 12.8v-1.056h.94V12.8h-.94Zm0-2.304V2.784h.94v7.712h-.94Z'/><path fill-rule='evenodd' d='M8 15.04A7.04 7.04 0 1 0 8 .96a7.04 7.04 0 0 0 0 14.08ZM8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EXPAND_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M.35 6.5V1L.363.87A.65.65 0 0 1 1 .35h6l.13.013a.65.65 0 0 1 0 1.274L7 1.65H1.65V6.5a.65.65 0 0 1-1.3 0ZM15.65 10v5.5l-.013.13a.65.65 0 0 1-.637.52H9l-.13-.013a.65.65 0 0 1 0-1.274L9 14.85h5.35V10a.65.65 0 0 1 1.3 0Z'/><path d='M1.063 1.019a.65.65 0 0 1 .82-.044l.098.088 5 5.5.079.106a.65.65 0 0 1-.943.856l-.098-.088-5-5.5-.079-.106a.65.65 0 0 1 .123-.812ZM9.063 9.019a.65.65 0 0 1 .82-.044l.098.088 5 5.5.079.106a.65.65 0 0 1-.943.856l-.098-.088-5-5.5-.079-.106a.65.65 0 0 1 .123-.812Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EXPORT_OUTLINE = [\n\t\"<g fill-rule='evenodd' clip-path='url(#a)' clip-rule='evenodd'><path d='M0 4.435c0-.317.257-.574.574-.574h6.694a.574.574 0 1 1 0 1.147h-6.12v9.844h9.85V8.258a.574.574 0 0 1 1.147 0v7.168a.574.574 0 0 1-.574.573H.574A.574.574 0 0 1 0 15.426V4.435Z'/><path d='M7.973 1.049c0-.317.256-.574.573-.574L14.78.467c.317 0 .574.255.575.572l.008 6.232a.574.574 0 0 1-1.148.001l-.006-4.847-8.29 8.308a.574.574 0 0 1-.813-.81l8.29-8.308-4.85.006a.574.574 0 0 1-.574-.572Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_CLOSED_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.884 5.18a.5.5 0 0 0-.704-.064l.704.063Zm0 0 .005.006.022.025a8.287 8.287 0 0 0 .464.478c.327.31.803.717 1.398 1.104C4.76 7.434 6.045 8 7.5 8c1.241 0 2.333-.411 3.253-.935.668-.38 1.264-.855 1.696-1.24a11.508 11.508 0 0 0 .672-.651l.007-.008.002-.002a.5.5 0 0 1 .74.672L13.5 5.5l.37.336-.001.002-.003.003-.011.012-.041.043c-.035.037-.085.09-.15.155a12.526 12.526 0 0 1-1.8 1.5l1.948 1.559a.5.5 0 0 1-.624.78l-2.24-1.792c-.839.44-1.828.799-2.948.883V11.5a.5.5 0 1 1-1 0V8.981c-1.319-.099-2.478-.576-3.403-1.12l-1.72 1.968a.5.5 0 1 1-.753-.658l1.63-1.866A10.935 10.935 0 0 1 1.27 5.993a6.076 6.076 0 0 1-.141-.158l-.009-.01-.003-.003V5.82L1.5 5.5l-.383.32a.5.5 0 0 1 .063-.704' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_OPEN_FILLED = [\n\t\"<path d='M14.333 7.583S11.833 3 7.667 3C3.5 3 1 7.583 1 7.583s2.5 4.584 6.667 4.584c4.166 0 6.666-4.584 6.666-4.584Zm-12.356 0 .162-.24c.28-.4.691-.932 1.221-1.462C4.434 4.807 5.9 3.833 7.667 3.833c1.766 0 3.232.974 4.306 2.048a10.934 10.934 0 0 1 1.383 1.702 10.934 10.934 0 0 1-1.383 1.702c-1.074 1.075-2.54 2.048-4.306 2.048S4.434 10.36 3.36 9.286a10.946 10.946 0 0 1-1.383-1.703Z'/><path d='M4.75 7.583a2.917 2.917 0 1 1 5.833 0 2.917 2.917 0 0 1-5.833 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_EYE_OPEN_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7.43 2.208c-1.228.09-2.46.475-3.69 1.16L2.118 1.808a.588.588 0 0 0-.808 0 .535.535 0 0 0 0 .777l1.447 1.391C1.887 4.573 1.02 5.32.153 6.22a.534.534 0 0 0 0 .748C2.763 9.674 5.39 10.999 8 11c2.61.001 5.238-1.32 7.848-4.034l.004-.004.057-.072.047-.085.029-.086.014-.095-.002-.089-.02-.094-.032-.084-.043-.071-.054-.066c-.866-.9-1.734-1.648-2.604-2.244l1.446-1.39a.535.535 0 0 0 0-.777.588.588 0 0 0-.808 0l-1.62 1.557C11.033 2.68 9.8 2.298 8.572 2.207V.549A.561.561 0 0 0 8.001 0a.561.561 0 0 0-.572.55v1.658Zm.683 1.078a.629.629 0 0 1-.224 0c-2.182.038-4.348 1.159-6.529 3.307C3.578 8.778 5.781 9.9 8 9.901c2.22.001 4.424-1.119 6.642-3.308-2.18-2.152-4.348-3.271-6.53-3.307ZM8 3.846c-1.578 0-2.858 1.23-2.858 2.747 0 1.516 1.28 2.747 2.858 2.747 1.577 0 2.857-1.23 2.857-2.747 0-1.516-1.28-2.747-2.857-2.747Zm0 1.099c.946 0 1.714.738 1.714 1.648 0 .91-.768 1.648-1.714 1.648-.947 0-1.715-.738-1.715-1.648 0-.91.768-1.648 1.715-1.648Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 11\",\n] as const;\n\nexport const ICON_FACEBOOK_FILLED = [\n\t\"<path d='M22 12.061C22 6.504 17.523 2 12.001 2 6.477 2.001 2 6.504 2 12.063c0 5.02 3.657 9.182 8.436 9.937v-7.03H7.9v-2.908h2.54V9.845c0-2.52 1.493-3.913 3.777-3.913 1.095 0 2.238.196 2.238.196v2.475h-1.26c-1.242 0-1.63.776-1.63 1.572v1.887h2.773l-.442 2.907h-2.331v7.03C18.343 21.245 22 17.083 22 12.062Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_FIRE_FILLED = [\n\t\"<path d='M19.069 11.051a7.768 7.768 0 0 0-1.853-2.575l-.65-.597a.18.18 0 0 0-.291.074l-.291.834c-.181.523-.514 1.057-.986 1.582a.14.14 0 0 1-.091.045.124.124 0 0 1-.097-.034.131.131 0 0 1-.044-.107c.082-1.346-.32-2.863-1.2-4.515-.73-1.373-1.742-2.444-3.007-3.19l-.924-.543a.18.18 0 0 0-.268.163l.05 1.073c.033.733-.052 1.381-.253 1.92-.246.66-.6 1.272-1.05 1.822a6.61 6.61 0 0 1-1.063 1.03A7.882 7.882 0 0 0 4.81 10.75a7.774 7.774 0 0 0-.19 6.49 7.854 7.854 0 0 0 4.19 4.149c.97.406 1.998.612 3.06.612 1.061 0 2.09-.206 3.06-.61a7.791 7.791 0 0 0 2.501-1.67 7.737 7.737 0 0 0 2.307-5.52c0-1.09-.223-2.15-.668-3.149Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_FISH_FILLED = [\n\t\"<path d='M24 12c0-.775-.669-2.192-2.138-3.469a9.705 9.705 0 0 0-2.826-1.693.148.148 0 0 0-.184.073.89.89 0 0 1-.022.04l-.45.746a8.589 8.589 0 0 0 .004 8.615l.01.018.41.75a.187.187 0 0 0 .232.085C22.483 15.817 24 13.195 24 12Zm-4.402-.007a.75.75 0 1 1-.195-1.487.75.75 0 0 1 .195 1.487Z'/><path d='M15.724 12c0-1.778.47-3.525 1.363-5.062l.006-.01.216-.36a.187.187 0 0 0-.12-.281 13.325 13.325 0 0 0-1.841-.253.372.372 0 0 1-.201-.075c-.904-.687-2.696-1.889-4.522-2.198a.75.75 0 0 0-.844.946l.498 1.743a.187.187 0 0 1-.113.226c-1.728.642-3.215 1.817-4.3 2.712a.375.375 0 0 1-.472.003 14.548 14.548 0 0 0-.454-.346C3.082 7.688.899 7.509.807 7.502a.75.75 0 0 0-.79.91c.02.09.432 1.907 1.487 3.356a.38.38 0 0 1 0 .448C.449 13.666.037 15.482.018 15.573a.75.75 0 0 0 .789.91c.093-.007 2.275-.188 4.13-1.542.152-.111.3-.224.444-.338a.375.375 0 0 1 .472.003c1.09.9 2.58 2.075 4.312 2.719a.187.187 0 0 1 .114.226l-.5 1.743a.75.75 0 0 0 .844.946c.804-.136 2.432-.603 4.502-2.195a.383.383 0 0 1 .204-.078c.618-.04 1.233-.123 1.839-.248a.188.188 0 0 0 .126-.274l-.211-.388A10.069 10.069 0 0 1 15.724 12Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_GLOBE_OUTLINE = [\n\t\"<path d='M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm7.934 9h-2.938a14.86 14.86 0 0 0-1.186-5.079A8.013 8.013 0 0 1 19.934 11zM12 20c-.491 0-1.48-1.819-1.888-5H13.888C13.48 18.181 12.491 20 12 20zm-2-7h4c-.086 1.183-.297 2.24-.606 3.11C13.077 16.922 12.545 18 12 18c-.545 0-1.077-1.078-1.394-1.89C10.297 15.24 10.086 14.183 10 13zm0-2c.086-1.183.297-2.24.606-3.11C10.923 7.078 11.455 6 12 6c.545 0 1.077 1.078 1.394 1.89C13.703 8.76 13.914 9.817 14 11h-4zm-2.81 5.079A14.86 14.86 0 0 0 8.004 11H5.066a8.013 8.013 0 0 0 4.124 5.079zM5.066 13h2.938c.205 1.842.61 3.561 1.186 5.079A8.013 8.013 0 0 1 5.066 13zm9.748 5.079A14.86 14.86 0 0 0 15.996 13h2.938a8.013 8.013 0 0 1-4.18 5.079zM15.996 11a14.86 14.86 0 0 0-1.186-5.079A8.013 8.013 0 0 1 18.934 11h-2.938zM9.19 5.921A14.86 14.86 0 0 0 8.004 11H5.066A8.013 8.013 0 0 1 9.19 5.921z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_GOOGLE_FILLED = [\n\t\"<path d='M21.823 10.363c.119.685.178 1.379.177 2.074 0 3.104-1.11 5.728-3.04 7.504h.002c-1.688 1.56-4.009 2.463-6.76 2.463a10.202 10.202 0 0 1 0-20.403 9.805 9.805 0 0 1 6.824 2.655l-2.912 2.912a5.543 5.543 0 0 0-3.913-1.53c-2.66 0-4.922 1.795-5.728 4.213a6.11 6.11 0 0 0 0 3.906h.004c.81 2.414 3.067 4.21 5.728 4.21 1.375 0 2.556-.353 3.471-.975h-.004a4.72 4.72 0 0 0 2.04-3.1h-5.51v-3.927l9.62-.002Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_HASHTAG_OUTLINE = [\n\t\"<path d='M4.758 13.704c-.192 0-.325-.059-.4-.176-.064-.107-.074-.288-.032-.544l.352-2.096h-1.76c-.149 0-.25-.037-.304-.112-.053-.085-.069-.224-.048-.416.022-.192.059-.336.112-.432a.459.459 0 0 1 .256-.192c.118-.043.246-.064.384-.064H4.87l.48-2.928H3.606c-.149 0-.256-.037-.32-.112-.053-.075-.069-.203-.048-.384.022-.203.064-.352.128-.448a.459.459 0 0 1 .256-.192c.107-.043.235-.064.384-.064h1.536l.4-2.4c.043-.235.096-.41.16-.528a.495.495 0 0 1 .288-.24c.128-.053.304-.08.528-.08.224 0 .363.064.416.192.064.117.07.325.016.624l-.416 2.432h3.264l.368-2.336c.043-.235.091-.416.144-.544a.494.494 0 0 1 .256-.272c.118-.064.294-.096.528-.096.224 0 .374.059.448.176.075.107.091.293.048.56l-.4 2.512h1.472c.182 0 .294.048.336.144.054.096.059.24.016.432a1.096 1.096 0 0 1-.176.432.475.475 0 0 1-.256.16 1.265 1.265 0 0 1-.304.032h-1.312l-.448 2.928h1.456c.182 0 .294.053.336.16a.624.624 0 0 1 .032.352 1.84 1.84 0 0 1-.176.464.463.463 0 0 1-.24.192.975.975 0 0 1-.336.048h-1.296l-.32 1.952a1.427 1.427 0 0 1-.128.48.616.616 0 0 1-.304.288c-.128.064-.314.096-.56.096-.17 0-.293-.059-.368-.176-.074-.107-.09-.293-.048-.56l.32-2.08H6.07l-.32 1.92c-.032.203-.08.373-.144.512a.628.628 0 0 1-.288.288c-.128.064-.314.096-.56.096Zm1.488-4.032H9.51l.464-2.928h-3.2l-.528 2.928Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_HOME_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M2.642 6.408c0-.339.165-.656.442-.85l4.321-3.025c.357-.25.833-.25 1.19 0l4.32 3.025c.278.194.443.511.443.85v6.913c0 .573-.464 1.037-1.037 1.037H3.679a1.037 1.037 0 0 1-1.037-1.037V6.408ZM8 3.383 3.679 6.408v6.913h8.642V6.408L8 3.383Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M10.765 14.358h-5.53v-3.917h1.037v2.88h3.456v-2.88h1.037v3.917Zm-1.037-3.917S9.728 9 8 9s-1.728 1.44-1.728 1.44c-1.038 0-1.038 0-1.038-.002v-.023a1.617 1.617 0 0 1 .008-.126 2.602 2.602 0 0 1 .357-1.103c.41-.683 1.185-1.224 2.4-1.224 1.216 0 1.993.54 2.403 1.224a2.601 2.601 0 0 1 .363 1.23v.023H9.728ZM7.693 2.1a.519.519 0 0 1 .614 0l6.481 4.753a.519.519 0 0 1-.613.837L8 3.162 1.825 7.69a.519.519 0 1 1-.613-.837L7.693 2.1Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_IMPORT_OUTLINE = [\n\t\"<g fill-rule='evenodd' clip-path='url(#a)' clip-rule='evenodd'><path d='M16 11.565a.574.574 0 0 1-.574.573H8.732a.574.574 0 1 1 0-1.147h6.12V1.147h-9.85v6.595a.574.574 0 0 1-1.147 0V.574c0-.317.257-.574.574-.574h10.997c.317 0 .574.257.574.574v10.99Z'/><path d='M8.027 14.95a.574.574 0 0 1-.573.574l-6.235.009a.574.574 0 0 1-.575-.573L.636 8.728a.574.574 0 0 1 1.148-.002l.006 4.848 8.29-8.308a.574.574 0 0 1 .813.81l-8.29 8.308 4.85-.007c.317 0 .574.256.574.573Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_INFO_FILLED_BLUE = [\n\t\"<path fill='#275FFD' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm.32-9.24a.88.88 0 1 0 0-1.76.88.88 0 0 0 0 1.76ZM6.123 5.97l2.015-.253-.881 4.139c-.062.299.026.469.268.469.17 0 .428-.062.603-.217l-.077.366c-.253.304-.81.526-1.289.526-.618 0-.881-.371-.711-1.16L6.7 6.79c.056-.258.004-.35-.253-.413l-.397-.072.072-.335Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_INFO_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path d='m8.138 5.716-2.015.253-.072.335.397.072c.257.062.309.155.252.413L6.05 9.84c-.17.789.094 1.16.712 1.16.48 0 1.036-.222 1.289-.526l.077-.366a.974.974 0 0 1-.603.217c-.242 0-.33-.17-.268-.47l.881-4.139ZM8.2 3.88a.88.88 0 1 1-1.76 0 .88.88 0 0 1 1.76 0Z'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_INSTAGRAM_FILLED = [\n\t\"<path d='M12 8.876A3.13 3.13 0 0 0 8.876 12 3.13 3.13 0 0 0 12 15.124 3.13 3.13 0 0 0 15.124 12 3.13 3.13 0 0 0 12 8.876ZM21.37 12c0-1.294.012-2.576-.06-3.867-.073-1.5-.415-2.831-1.512-3.928-1.1-1.1-2.428-1.44-3.928-1.512-1.294-.073-2.576-.061-3.868-.061-1.293 0-2.575-.012-3.867.061-1.5.073-2.831.415-3.928 1.512-1.1 1.099-1.439 2.428-1.512 3.928-.072 1.294-.06 2.576-.06 3.867s-.012 2.576.06 3.867c.073 1.5.415 2.831 1.512 3.928 1.1 1.1 2.428 1.44 3.928 1.512 1.294.073 2.576.061 3.867.061 1.294 0 2.576.012 3.867-.061 1.5-.073 2.832-.415 3.929-1.512 1.099-1.099 1.439-2.428 1.511-3.928.075-1.291.061-2.573.061-3.867ZM12 16.807A4.8 4.8 0 0 1 7.193 12 4.8 4.8 0 0 1 12 7.193 4.8 4.8 0 0 1 16.807 12 4.8 4.8 0 0 1 12 16.807Zm5.004-8.688a1.121 1.121 0 0 1-1.123-1.123c0-.621.502-1.123 1.123-1.123a1.121 1.121 0 0 1 .43 2.16 1.12 1.12 0 0 1-.43.086Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_KEY_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M12.888 4.373c0-1.205-.912-2.191-2.038-2.191s-2.038.986-2.038 2.19c0 1.207.912 2.183 2.038 2.183s2.038-.976 2.038-2.182m1.112 0C14 2.51 12.59 1 10.85 1S7.7 2.51 7.7 4.373c0 .717.21 1.382.565 1.93l-6.102 6.534a.625.625 0 0 0 0 .841.53.53 0 0 0 .786 0l.834-.892q.021.03.047.058l.918.982a.53.53 0 0 0 .786 0 .625.625 0 0 0 0-.842l-.917-.982a1 1 0 0 0-.055-.051l.545-.584.02.023.525.56a.53.53 0 0 0 .786 0 .625.625 0 0 0 0-.84l-.524-.563-.021-.02 3.16-3.383c.51.38 1.129.602 1.797.602 1.74 0 3.15-1.51 3.15-3.373' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_LACTOSE_INTOLERANT_FILLED = [\n\t\"<path fill-rule='evenodd' d='M1.293 1.293a1 1 0 0 1 1.414 0L8.494 7.08a.99.99 0 0 1 .028.027l7.613 7.614.015.015 6.557 6.557a1 1 0 0 1-1.414 1.414L18 19.414V20a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3v-9.788a5 5 0 0 1 .539-2.259L1.293 2.707a1 1 0 0 1 0-1.414ZM8.086 9.5a3 3 0 0 0-.086.712v3.438a7.472 7.472 0 0 1 4.386.428c.145.06.292.114.44.162L8.086 9.5Zm3.528 6.422a7.472 7.472 0 0 0 3.453.56l-3.453-.56Zm3.453.56.933.932V20a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-4.293a5.467 5.467 0 0 1 3.614.215M7 2a1 1 0 0 1 1-1h8a1 1 0 1 1 0 2v1.789a3 3 0 0 0 .504 1.664l.656.984a5 5 0 0 1 .84 2.775v1.131a1 1 0 1 1-2 0v-1.131a3 3 0 0 0-.504-1.665l-.656-.984A5 5 0 0 1 14 4.789V3h-4v.343a1 1 0 0 1-2 0V3a1 1 0 0 1-1-1Z' clip-rule='evenodd'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LAYOUT_1_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.733 1.444c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444V5.89a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V1.444Zm.89.445v3.556h3.555V1.889H2.622ZM1.733 8.111c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444v4.445a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V8.111Zm.89.445v3.556h3.555V8.555H2.622ZM9.067 1.444c0-.245.186-.444.416-.444h4.167c.23 0 .417.199.417.444v11.112c0 .245-.187.444-.417.444H9.483c-.23 0-.416-.199-.416-.444V1.444Zm.833.445V12.11h3.333V1.89H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_2_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7.241 1.305a.439.439 0 0 0-.439-.44h-4.39a.439.439 0 0 0-.439.44v4.39c0 .242.197.439.44.439h4.39a.439.439 0 0 0 .438-.439v-4.39Zm-.878.439v3.512H2.851V1.744h3.512ZM11.266 5.11a1.683 1.683 0 1 1 0-3.366 1.683 1.683 0 0 1 0 3.366Zm0 .878a2.561 2.561 0 1 1 0-5.122 2.561 2.561 0 0 1 0 5.122ZM2.344 8.134c-.245 0-.444.187-.444.417v4.167c0 .23.199.416.444.416h11.111c.246 0 .445-.186.445-.416V8.55c0-.23-.2-.417-.444-.417H2.344Zm.445.834H13.01V12.3H2.789V8.968Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_3_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.733 1.444c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444V5.89a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V1.444Zm.89.445v3.556h3.555V1.889H2.622ZM1.733 8.111c0-.245.2-.444.445-.444h4.444c.246 0 .445.199.445.444v4.445a.444.444 0 0 1-.445.444H2.178a.444.444 0 0 1-.445-.444V8.111Zm.89.445v3.556h3.555V8.555H2.622ZM9.067 1.444c0-.245.186-.444.416-.444h4.167c.23 0 .417.199.417.444v11.112c0 .245-.187.444-.417.444H9.483c-.23 0-.416-.199-.416-.444V1.444Zm.833.445V12.11h3.333V1.89H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_4_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M2.178 7.667a.444.444 0 0 0-.445.444v4.444c0 .246.2.445.445.445h4.444a.444.444 0 0 0 .445-.445V8.111a.444.444 0 0 0-.445-.445H2.178Zm.444.888h3.556v3.556H2.622V8.555ZM6.03 3.593a1.704 1.704 0 1 1-3.408 0 1.704 1.704 0 0 1 3.408 0Zm.888 0a2.593 2.593 0 1 1-5.185 0 2.593 2.593 0 0 1 5.185 0ZM9.067 12.556c0 .245.186.444.416.444h4.167c.23 0 .416-.199.416-.444V1.444c0-.245-.186-.444-.416-.444H9.483c-.23 0-.416.199-.416.444v11.112Zm.833-.445V1.89h3.333V12.11H9.9Z' clip-rule='evenodd'/>\",\n\t\"0 0 15 14\",\n] as const;\n\nexport const ICON_LAYOUT_5_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.668 3.588a1.744 1.744 0 1 0 3.488 0 1.744 1.744 0 0 0-3.488 0Zm-.91 0a2.654 2.654 0 1 0 5.308 0 2.654 2.654 0 0 0-5.308 0ZM1.668 10.412a1.744 1.744 0 1 0 3.488 0 1.744 1.744 0 0 0-3.488 0Zm-.91 0a2.654 2.654 0 1 0 5.308 0 2.654 2.654 0 0 0-5.308 0ZM15.042 2.223a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 5.408a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 8.592a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455ZM15.042 11.777a.455.455 0 0 0-.455-.455H8.52a.455.455 0 1 0 0 .91h6.066a.455.455 0 0 0 .455-.455Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 14\",\n] as const;\n\nexport const ICON_LEAF_FILLED = [\n\t\"<path d='M20.977 3.27 20.857 2l-1.21.403c-2.072.72-4.285.94-6.458.645a11.96 11.96 0 0 0-6.73.907 7.285 7.285 0 0 0-4.323 5.45 9.068 9.068 0 0 0 .393 4.615c.34-.768.737-1.508 1.189-2.216a9.925 9.925 0 0 1 4.1-3.456 11.244 11.244 0 0 1 5.099-1.008c-1.67.255-3.27.856-4.696 1.763a9.553 9.553 0 0 0-1.874 1.542 11.465 11.465 0 0 0-1.4 1.924 16.514 16.514 0 0 0-1.582 4.575A26.62 26.62 0 0 0 2.841 22h2.015a30.92 30.92 0 0 1 .595-4.353 9.32 9.32 0 0 0 4.554 1.119 11.083 11.083 0 0 0 4.312-.877c7.668-3.274 6.66-14.166 6.66-14.62Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LINKEDIN_FILLED = [\n\t\"<path d='M2 3.433C2 2.64 2.658 2 3.469 2H20.53C21.343 2 22 2.641 22 3.433v17.134C22 21.36 21.343 22 20.531 22H3.47C2.658 22 2 21.359 2 20.567V3.433Zm6.179 15.31V9.71H5.177v9.031H8.18Zm-1.5-10.265c1.046 0 1.697-.693 1.697-1.56-.018-.887-.65-1.56-1.677-1.56C5.67 5.357 5 6.032 5 6.918c0 .867.651 1.56 1.659 1.56h.02Zm6.135 10.264V13.7c0-.27.02-.54.1-.733.216-.538.71-1.097 1.54-1.097 1.086 0 1.52.827 1.52 2.042v4.832h3.001v-5.18c0-2.776-1.48-4.066-3.455-4.066-1.592 0-2.306.876-2.706 1.492v.031h-.02l.02-.031V9.71h-3c.037.848 0 9.031 0 9.031h3Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LOCATION_FILLED = [\n\t\"<path d='M11.5 22S19 14.892 19 9.5a7.5 7.5 0 0 0-15 0C4 14.892 11.5 22 11.5 22Zm0-8.75a3.75 3.75 0 1 1 0-7.5 3.75 3.75 0 0 1 0 7.5Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_LOCK_PASSWORD_1_OUTLINE = [\n\t\"<path d='M5.961 9.278h4.088c.844 0 1.531-.687 1.531-1.532V5.151a1.53 1.53 0 0 0-1.453-1.524V2.623C10.127 1.453 9.175.5 8.005.5s-2.123.952-2.123 2.123v1.003A1.53 1.53 0 0 0 4.43 5.15v2.595c0 .846.687 1.533 1.531 1.533M8 1.5c.676 0 1.231.558 1.231 1.234v.885H6.778v-.885A1.23 1.23 0 0 1 8 1.5m-2.5 4c0-.35 0-.781.547-.781h4.002c.451 0 .53.43.53.781v2c0 .35-.089.828-.618.828H6.07c-.462 0-.571-.478-.571-.828zM13.553 10.543H2.602C1.547 10.543 1 11.197 1 12v2.117c0 .804.653 1.458 1.457 1.458h11.096c.803 0 1.457-.654 1.457-1.457V12c0-.804-.653-1.457-1.457-1.457M14 14.118c0 .308-.138.482-.447.482H2.457c-.31 0-.457-.174-.457-.482V12c0-.309.293-.49.602-.49h10.951c.31 0 .447.181.447.49z'/><path d='M4.653 13.806a.652.652 0 1 0 0-1.306.652.652 0 1 0 0 1.306M8 13.806A.652.652 0 1 0 8 12.5a.652.652 0 1 0 0 1.306M11.653 13.806a.652.652 0 1 0 0-1.306.652.652 0 1 0 0 1.306'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_LOCK_PASSWORD_2_OUTLINE = [\n\t\"<path d='M14.41 9.018a2.11 2.11 0 0 0-1.642-.601V7.1c.001-.908-.735-1.646-1.645-1.648H9.845v-2A2.96 2.96 0 0 0 8.364.895a2.97 2.97 0 0 0-2.96 0 2.96 2.96 0 0 0-1.48 2.558v2H2.644C1.735 5.455.999 6.193 1 7.1v6.75c0 .908.735 1.647 1.645 1.649h8.478a1.65 1.65 0 0 0 1.645-1.65v-1.315a2.073 2.073 0 0 0 1.641-3.517M4.936 3.453a1.947 1.947 0 0 1 3.897 0v2H4.936zm6.82 10.398a.636.636 0 0 1-.633.638H2.645a.636.636 0 0 1-.633-.638V7.1a.635.635 0 0 1 .633-.637h1.782c.001-.004 4.906.003 4.91 0h1.786a.635.635 0 0 1 .633.637v1.316H8.443a2.06 2.06 0 0 0 0 4.118h3.313zm1.197-2.327c-.36-.002-4.035.002-4.499 0a1.049 1.049 0 0 1-.01-2.096h4.51a1.049 1.049 0 0 1-.001 2.096m-2.258-.542a.506.506 0 0 1 0-1.012.506.506 0 0 1 0 1.011m1.796 0a.506.506 0 0 1 .001-1.012.506.506 0 0 1 0 1.011m-3.593 0a.506.506 0 0 1 0-1.012.506.506 0 0 1 0 1.011'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MAIL_OUTLINE = [\n\t\"<path d='M1.714 2.5C.763 2.5 0 3.303 0 4.256v7.91c0 .954.763 1.763 1.714 1.763h12.572c.951 0 1.714-.81 1.714-1.762V4.256c0-.953-.763-1.756-1.714-1.756H1.714Zm.084 1.143h12.41L8.34 9.214c-.213.203-.452.203-.666 0L1.798 3.643Zm-.655.952 3.893 3.69-3.893 3.882V4.595Zm13.714 0v7.572l-3.88-3.887 3.88-3.685Zm-4.702 4.47 3.708 3.72H2.143l3.72-3.714 1.024.97c.62.589 1.618.59 2.238 0l1.03-.976Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MENU_CLOSE_OUTLINE = [\n\t\"<path d='m13.003 1.013.107-.097a1.413 1.413 0 0 1 1.988 1.988L15 3.01 3.01 15a1.413 1.413 0 1 1-1.998-1.999l11.99-11.99Z'/><path d='m14.987 12.989.097.107a1.413 1.413 0 0 1-1.988 1.988l-.107-.097L.999 2.997A1.413 1.413 0 0 1 2.997 1l11.99 11.99Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MENU_HAMBURGER_OUTLINE = [\n\t\"<path d='m14.857 0 .117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 1 1 0-2.286h13.714ZM14.857 6.857l.117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 0 1 0-2.286h13.714ZM14.857 13.714l.117.006a1.143 1.143 0 0 1 0 2.274l-.117.006H1.143a1.143 1.143 0 0 1 0-2.286h13.714Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_BICOLOR_TERTIARY_LIGHT = [\n\t\"<circle cx='8' cy='8' r='8' fill='#F7F3EE'/><path fill='#1B1B1B' fill-rule='evenodd' d='M3.929 8.5c0-.276.191-.5.428-.5H11.5c.237 0 .429.224.429.5s-.192.5-.429.5H4.357c-.237 0-.428-.224-.428-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_BICOLOR_TERTIARY = [\n\t\"<circle cx='8' cy='8' r='8' fill='#E6D9CA'/><path fill='#1B1B1B' fill-rule='evenodd' d='M3.929 8.5c0-.276.191-.5.428-.5H11.5c.237 0 .429.224.429.5s-.192.5-.429.5H4.357c-.237 0-.428-.224-.428-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MINUS_FILLED = [\n\t\"<path d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM4.357 8c-.236 0-.428.224-.428.5s.192.5.428.5H11.5c.237 0 .429-.224.429-.5S11.737 8 11.5 8H4.357Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_BILL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M0 12.167V4.833c0-.053.002-.107.006-.16.072-.885.731-1.59 1.558-1.666.05-.005.1-.007.15-.007h12.572c.05 0 .1.002.15.007.827.076 1.486.781 1.558 1.666a2 2 0 0 1 .006.16v7.334c0 .053-.002.107-.006.16-.072.885-.731 1.59-1.558 1.666-.05.005-.1.007-.15.007H1.714c-.05 0-.1-.002-.15-.007-.827-.076-1.486-.781-1.558-1.666a2.009 2.009 0 0 1-.006-.16Zm2.829-7.945H1.714c-.315 0-.571.274-.571.611v1.192c.093.02.188.03.286.03.788 0 1.428-.684 1.428-1.527 0-.105-.01-.206-.028-.306Zm9.187 0H3.984c.011.1.016.203.016.306 0 1.518-1.152 2.75-2.571 2.75-.097 0-.192-.006-.286-.017v2.478c.094-.012.19-.017.286-.017C2.848 9.722 4 10.954 4 12.472c0 .103-.005.206-.016.306h8.032a2.88 2.88 0 0 1-.016-.306c0-1.518 1.152-2.75 2.571-2.75.097 0 .193.005.286.017V7.261c-.093.011-.19.017-.286.017-1.419 0-2.571-1.232-2.571-2.75 0-.103.005-.206.016-.306ZM8 10.111c.301 0 .571-.207.571-.5 0-.217-.167-.288-.332-.366-.246-.114-.528-.198-.784-.304-.67-.278-1.17-.705-1.17-1.552 0-.738.471-1.385 1.144-1.625v-.32c0-.337.255-.61.571-.61.316 0 .571.273.571.61v.32c.382.137.7.403.901.741.17.285.09.663-.176.844a.55.55 0 0 1-.788-.187A.584.584 0 0 0 8 6.889c-.301 0-.571.207-.571.5 0 .217.167.288.332.365.246.115.528.199.784.305.67.278 1.17.705 1.17 1.552 0 .738-.471 1.385-1.144 1.624v.32c0 .338-.255.612-.571.612-.316 0-.571-.274-.571-.611v-.32a1.73 1.73 0 0 1-.901-.742.637.637 0 0 1 .176-.843.55.55 0 0 1 .788.187c.1.17.293.273.508.273Zm5.171 2.667h1.115c.315 0 .571-.274.571-.611v-1.192a1.357 1.357 0 0 0-.286-.03c-.788 0-1.428.684-1.428 1.527 0 .105.01.207.028.306ZM1.143 10.975v1.192c0 .337.256.61.571.61H2.83c.018-.098.028-.2.028-.305 0-.843-.64-1.528-1.428-1.528-.098 0-.193.011-.286.031Zm13.714-4.95V4.833c0-.337-.256-.61-.571-.61H13.17c-.018.099-.028.2-.028.305 0 .843.64 1.528 1.428 1.528.098 0 .193-.011.286-.03Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_CASH_OUTLINE = [\n\t\"<path d='M16 6.417C16 3.432 13.605 1 10.667 1c-1.739 0-3.28.856-4.256 2.167H1.6c-.88 0-1.6.73-1.6 1.625v1.083c0 .417.16.796.416 1.083A1.625 1.625 0 0 0 0 8.042v1.083c0 .417.16.796.416 1.083A1.625 1.625 0 0 0 0 11.292v1.083C0 13.269.72 14 1.6 14h8.533c.88 0 1.6-.731 1.6-1.625v-.65C14.165 11.221 16 9.033 16 6.417ZM1.067 9.125V8.042A.54.54 0 0 1 1.6 7.5h3.84c.16.802.501 1.538.97 2.167H1.6a.539.539 0 0 1-.533-.542Zm0-4.333A.54.54 0 0 1 1.6 4.25h4.181a5.443 5.443 0 0 0-.448 2.167H1.6a.54.54 0 0 1-.533-.542V4.792Zm9.6 7.583a.54.54 0 0 1-.534.542H1.6a.54.54 0 0 1-.533-.542v-1.083a.54.54 0 0 1 .533-.542h5.883a5.24 5.24 0 0 0 3.184 1.083v.542Zm0-1.625C8.315 10.75 6.4 8.805 6.4 6.417c0-2.389 1.915-4.334 4.267-4.334 2.352 0 4.266 1.945 4.266 4.334 0 2.388-1.914 4.333-4.266 4.333Z'/><path d='M10.207 5.27h1.467c.22 0 .4-.208.4-.462s-.18-.462-.4-.462h-.7v-.384c0-.254-.18-.462-.399-.462-.22 0-.4.208-.4.462v.389c-.607.023-1.098.596-1.098 1.303s.507 1.308 1.13 1.308h.732c.183 0 .331.171.331.384s-.148.384-.331.384H9.473c-.22 0-.4.208-.4.462s.18.462.4.462h.699v.384c0 .254.18.462.4.462.219 0 .399-.208.399-.462v-.389c.607-.023 1.098-.596 1.098-1.303s-.507-1.308-1.13-1.308h-.732c-.183 0-.331-.171-.331-.384s.148-.384.332-.384Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_COIN_OUTLINE = [\n\t\"<path d='M14.7 8A6.7 6.7 0 1 0 8 14.7V16A8 8 0 1 1 8 0a8 8 0 0 1 0 16v-1.3c3.7 0 6.7-3 6.7-6.7Z'/><path d='M7.513 6.36h1.954c.293 0 .533-.277.533-.616 0-.339-.24-.616-.533-.616h-.932v-.512c0-.339-.24-.616-.532-.616-.293 0-.533.277-.533.616v.518c-.81.03-1.465.795-1.465 1.738s.677 1.744 1.508 1.744h.974c.245 0 .442.228.442.512 0 .283-.197.511-.442.511H6.533c-.293 0-.533.278-.533.617 0 .339.24.616.533.616h.932v.512c0 .339.24.616.532.616.293 0 .533-.277.533-.616v-.518c.81-.03 1.465-.795 1.465-1.738s-.677-1.744-1.508-1.744h-.974c-.245 0-.442-.228-.442-.512 0-.283.197-.511.442-.511Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_MONEY_CREDIT_CARD_OUTLINE = [\n\t\"<path d='M13.143 3H2.857C1.28 3 0 4.232 0 5.75v5.5C0 12.768 1.28 14 2.857 14h10.286C14.72 14 16 12.768 16 11.25v-5.5C16 4.232 14.72 3 13.143 3ZM2.857 4.1h10.286c.943 0 1.714.743 1.714 1.65v.275H1.143V5.75c0-.907.771-1.65 1.714-1.65Zm10.286 8.8H2.857c-.943 0-1.714-.742-1.714-1.65V7.125h13.714v4.125c0 .908-.771 1.65-1.714 1.65Z'/><path d='M10.591 9c.332 0 .647.1.909.265A1.57 1.57 0 0 1 12.409 9C13.283 9 14 9.68 14 10.508c0 .83-.717 1.492-1.591 1.492-.332 0-.647-.1-.909-.265-.262.165-.56.265-.909.265C9.717 12 9 11.32 9 10.492 9 9.662 9.717 9 10.591 9Zm1.38 2.22c.123.066.28.1.42.1.49 0 .892-.381.892-.829 0-.464-.402-.845-.892-.845a.862.862 0 0 0-.42.1c.123.215.21.464.21.729 0 .282-.07.53-.21.745Zm-1.38.117c.49 0 .892-.381.892-.845 0-.465-.402-.846-.892-.846s-.892.381-.892.845c0 .465.402.846.892.846ZM5 8.5l.1.01a.5.5 0 0 1 0 .98L5 9.5H3a.5.5 0 0 1 0-1h2ZM7 10.5a.5.5 0 0 1 0 1H3a.5.5 0 0 1 0-1h4Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_NFC_FILLED = [\n\t\"<path d='M15 .5A2.5 2.5 0 0 1 17.5 3v12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12ZM5.994 4.622a.5.5 0 0 0-.822.306L5.167 5v8.667a.5.5 0 0 0 1 0V6.095l3.173 2.75.082.057a.5.5 0 0 0 .641-.74l-.069-.073-4-3.467Zm6.34-.122a.5.5 0 0 0-.5.5v7.69l-3.208-2.318a.5.5 0 0 0-.585.812l4 2.888.06.036a.5.5 0 0 0 .733-.441V5a.5.5 0 0 0-.5-.5Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_NFC_OUTLINE = [\n\t\"<path d='M16.5 3A1.5 1.5 0 0 0 15 1.5H3A1.5 1.5 0 0 0 1.5 3v12A1.5 1.5 0 0 0 3 16.5h12a1.5 1.5 0 0 0 1.5-1.5V3ZM5.167 13.667V5a.5.5 0 0 1 .827-.378l4 3.467.07.073a.5.5 0 0 1-.642.74l-.083-.057-3.172-2.75v7.572a.5.5 0 0 1-1 0ZM11.833 5a.5.5 0 0 1 1 0v8.667a.5.5 0 0 1-.792.405l-4-2.888-.076-.068a.5.5 0 0 1 .661-.744l3.207 2.316V5ZM17.5 15a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12A2.5 2.5 0 0 1 17.5 3v12Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_PENCIL_OUTLINE = [\n\t\"<path d='M10.944 1c-.44 0-.88.165-1.213.498L1.737 9.497A2.515 2.515 0 0 0 1 11.275v2.148C1 14.286 1.714 15 2.577 15h2.148c.667 0 1.307-.265 1.778-.737l7.999-7.994a1.724 1.724 0 0 0 0-2.424l-2.347-2.347A1.708 1.708 0 0 0 10.943 1Zm.002 1.16c.14 0 .278.055.387.165l2.342 2.341a.54.54 0 0 1 0 .775l-1.15 1.15L9.41 3.474l1.15-1.15a.545.545 0 0 1 .387-.163ZM8.582 4.302 11.7 7.418 5.68 13.436a1.353 1.353 0 0 1-.956.395H2.577a.4.4 0 0 1-.41-.409v-2.148c0-.358.143-.703.396-.956l6.02-6.017Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PENCIL = [\n\t\"<path fill='#1B1B1B' d='M10.944 1c-.44 0-.88.165-1.213.498L1.737 9.497A2.515 2.515 0 0 0 1 11.275v2.148C1 14.286 1.714 15 2.577 15h2.148c.667 0 1.307-.265 1.778-.737l7.999-7.994a1.724 1.724 0 0 0 0-2.424l-2.347-2.347A1.708 1.708 0 0 0 10.943 1Zm.002 1.16c.14 0 .278.055.387.165l2.342 2.341a.54.54 0 0 1 0 .775l-1.15 1.15L9.41 3.474l1.15-1.15a.545.545 0 0 1 .387-.163ZM8.582 4.302 11.7 7.418 5.68 13.436a1.353 1.353 0 0 1-.956.395H2.577a.4.4 0 0 1-.41-.409v-2.148c0-.358.143-.703.396-.956l6.02-6.017Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PHONE_OUTLINE = [\n\t\"<path d='M9.951 15c-1.058 0-2.108-.347-2.927-1.029a26.112 26.112 0 0 1-3.52-3.553A24.78 24.78 0 0 1 .811 6.37C-.1 4.65.463 2.58 2.152 1.447l.168-.113c.402-.27.897-.383 1.393-.314a1.9 1.9 0 0 1 1.23.67l1.488 1.825c.615.755.44 1.823-.392 2.38l-.661.444A6.543 6.543 0 0 0 6.52 8.394a7.198 7.198 0 0 0 1.84 1.597l.655-.447c.403-.27.899-.382 1.393-.316.496.068.934.306 1.23.671l1.488 1.825c.615.754.44 1.822-.393 2.38l-.168.113c-.782.523-1.701.782-2.616.782l.002.001ZM3.434 2.136c-.13 0-.26.035-.372.111l-.167.112c-1.206.81-1.608 2.29-.956 3.519a23.758 23.758 0 0 0 2.57 3.866 25.05 25.05 0 0 0 3.361 3.392c1.087.906 2.75.977 3.952.17l.169-.113a.533.533 0 0 0 .13-.793l-1.488-1.825a.637.637 0 0 0-.41-.224.678.678 0 0 0-.465.105l-.66.443c-.425.285-1.003.299-1.438.032A8.466 8.466 0 0 1 5.514 9.07a7.687 7.687 0 0 1-1.34-2.414c-.15-.45.034-.944.46-1.23l.66-.443a.533.533 0 0 0 .13-.793L3.936 2.365a.646.646 0 0 0-.502-.23Zm9.415 5.973c.26-2.177-1.48-4.14-3.882-4.376-.345-.032-.652.192-.69.503-.037.311.212.592.555.626 1.715.168 2.958 1.57 2.773 3.125-.037.311.211.591.554.625a.74.74 0 0 0 .068.004c.316 0 .588-.217.622-.507Zm2.488.244c.199-1.657-.327-3.285-1.48-4.583-1.151-1.3-2.791-2.114-4.619-2.294-.342-.033-.652.192-.69.503-.037.311.212.591.555.625 1.495.147 2.838.814 3.78 1.877.942 1.063 1.372 2.394 1.21 3.75-.037.312.211.592.555.626a.747.747 0 0 0 .068.003c.315 0 .587-.216.621-.507Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_BICOLOR_TERTIARY_LIGHT = [\n\t\"<circle cx='8' cy='8' r='8' fill='#F7F3EE'/><path fill='#1B1B1B' fill-rule='evenodd' d='M8.522 4.078a.522.522 0 0 0-1.045 0v3.4h-3.4a.522.522 0 1 0 0 1.044h3.4v3.4a.522.522 0 0 0 1.045 0v-3.4h3.4a.522.522 0 0 0 0-1.045h-3.4v-3.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_BICOLOR_TERTIARY = [\n\t\"<circle cx='8' cy='8' r='8' fill='#E6D9CA'/><path fill='#1B1B1B' fill-rule='evenodd' d='M8.522 4.078a.522.522 0 0 0-1.045 0v3.4h-3.4a.522.522 0 1 0 0 1.044h3.4v3.4a.522.522 0 0 0 1.045 0v-3.4h3.4a.522.522 0 0 0 0-1.045h-3.4v-3.4Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PLUS_FILLED = [\n\t\"<path d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0Zm-.001 3.556a.522.522 0 0 0-.521.522v3.4h-3.4a.523.523 0 0 0 0 1.043h3.4v3.402a.522.522 0 0 0 1.043 0V8.52h3.4a.522.522 0 1 0 0-1.043h-3.4v-3.4A.523.523 0 0 0 8 3.556Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PRINTER_OUTLINE = [\n\t\"<path d='M13.035 3.69h-.547V1.368a.407.407 0 0 0-.407-.406H4.139a.407.407 0 0 0-.408.406V3.69h-.547a2.072 2.072 0 0 0-2.075 2.063v4.437c0 .224.183.406.408.406h2.214v2.958c0 .225.182.406.408.406h7.94a.406.406 0 0 0 .409-.406v-2.958H14.7a.407.407 0 0 0 .408-.406V5.754c0-1.137-.93-2.063-2.074-2.063ZM4.547 1.774h7.125V3.69H4.547V1.773Zm7.125 11.376H4.547V8.602h7.125v4.547Zm2.621-3.363H12.49V8.602h.596a.407.407 0 1 0 0-.811H3.135a.407.407 0 1 0 0 .811h.597v1.184H1.926V5.754c0-.69.565-1.251 1.259-1.251h9.85c.694 0 1.258.561 1.258 1.251v4.032Z'/><path d='M4.11 6.461c0 .667-1 .667-1 0s1-.667 1 0ZM10.519 9.367H5.558a.51.51 0 0 0-.52.5c0 .276.232.5.52.5h4.96a.51.51 0 0 0 .52-.5.51.51 0 0 0-.52-.5ZM10.519 11.367H5.558a.51.51 0 0 0-.52.5c0 .276.232.5.52.5h4.96a.51.51 0 0 0 .52-.5.51.51 0 0 0-.52-.5Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_BILL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.5 4a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM7.5 6.5A.5.5 0 0 1 8 6h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM4.5 9a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/><path d='M5.162 6.588v.28c0 .073.052.132.116.132h.297c.064 0 .116-.059.116-.132v-.28c.219-.044.4-.147.528-.309a.986.986 0 0 0 .22-.647c0-.073 0-.132-.013-.19a2.637 2.637 0 0 0-.04-.163c-.012-.058-.038-.103-.064-.147-.025-.044-.064-.088-.09-.117-.026-.03-.064-.074-.116-.103-.039-.03-.09-.06-.129-.088-.039-.03-.09-.045-.142-.074a.668.668 0 0 0-.154-.059c-.052-.014-.103-.044-.168-.059a1.912 1.912 0 0 1-.31-.147c-.05-.044-.077-.088-.077-.147s.013-.103.065-.132c.051-.044.116-.059.206-.059.168 0 .348.074.541.206.052.044.117.03.155-.03l.245-.338c.026-.03.026-.073.026-.103a.1.1 0 0 0-.052-.088c-.077-.073-.18-.132-.27-.191a1.356 1.356 0 0 0-.336-.132v-.339C5.716 3.06 5.665 3 5.6 3h-.296c-.065 0-.116.059-.116.132v.31a.935.935 0 0 0-.529.293.986.986 0 0 0-.219.647c0 .06 0 .118.013.177s.026.103.039.162c.013.044.038.088.051.132a.816.816 0 0 0 .078.118c.025.029.064.058.09.088.026.03.064.059.116.088.039.03.077.044.116.059.039.015.077.044.129.059.051.014.09.029.129.044.038.014.077.03.142.044.051.015.103.03.141.059a.43.43 0 0 1 .116.059l.078.044c.013.014.038.03.051.059.013.014.026.029.026.058 0 .015.013.045.013.074a.224.224 0 0 1-.065.162c-.116.088-.335.088-.54-.015a.953.953 0 0 1-.285-.206c-.025-.03-.064-.044-.09-.03-.038 0-.064.015-.077.045L4.466 6a.153.153 0 0 0 .013.191c.155.191.4.338.683.397Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_LIST_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M4.5 3.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM4.5 6.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM4.5 9.5a.5.5 0 1 1 1 0 .5.5 0 0 1-1 0ZM6.5 3.5A.5.5 0 0 1 7 3h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5ZM6.5 6.5A.5.5 0 0 1 7 6h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5ZM6.5 9.5A.5.5 0 0 1 7 9h4a.5.5 0 0 1 0 1H7a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_PURCHASE_ORDER_TICKET_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M5 3.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM5 6.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5ZM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_QUESTION_CIRCLE_OUTLINE = [\n\t\"<path d='M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm0 18a8 8 0 1 1 0-16 8 8 0 0 1 0 16zm-.5-5h1v1.5h-1V15zm.74-7.93A3.5 3.5 0 0 0 8.5 10.5h1.5a2 2 0 1 1 2.87 1.79C11.63 12.87 11 13.8 11 15h1.5c0-.71.37-1.22 1.06-1.61A3.5 3.5 0 0 0 12.24 7.07z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_RADIO_BUTTON_CHECKED_OUTLINE = [\n\t\"<path d='M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm0 13A6 6 0 1 1 8 2a6 6 0 0 1 0 12Z'/><path d='M8 5a3 3 0 1 0 0 6 3 3 0 0 0 0-6Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_RADIO_BUTTON_UNCHECKED_OUTLINE = [\n\t\"<path d='M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1Zm0 13A6 6 0 1 1 8 2a6 6 0 0 1 0 12Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_REFRESH_DOUBLE_OUTLINE = [\n\t\"<path d='M11.534 7h3.932a.25.25 0 0 1 .192.41l-1.966 2.36a.25.25 0 0 1-.384 0l-1.966-2.36a.25.25 0 0 1 .192-.41Zm-11 2h3.932a.25.25 0 0 0 .192-.41L2.692 6.23a.25.25 0 0 0-.384 0L.342 8.59A.25.25 0 0 0 .534 9Z'/><path fill-rule='evenodd' d='M8 3c-1.552 0-2.94.707-3.857 1.818a.5.5 0 1 1-.771-.636A6.002 6.002 0 0 1 13.917 7H12.9A5.002 5.002 0 0 0 8 3ZM3.1 9a5.002 5.002 0 0 0 8.757 2.182.502.502 0 0 1 .84.075.499.499 0 0 1-.069.561A6.002 6.002 0 0 1 2.083 9H3.1Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_REFRESH_SINGLE_OUTLINE = [\n\t\"<path d='M14 7.986a6 6 0 1 1-12 0 .461.461 0 1 1 .923 0A5.096 5.096 0 1 0 4.37 4.448s-.115.038-.369.038l-.5-.5.346-.307A5.994 5.994 0 0 1 14 7.986Z'/><path d='m3.015 2.344 3.243 2.223a.25.25 0 0 1-.073.447l-2.956.835a.25.25 0 0 1-.317-.217l-.287-3.059a.25.25 0 0 1 .39-.23Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_ROCKET_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M9.752 6.193c.599.6 1.73.437 2.528-.362.798-.799.96-1.932.362-2.531-.599-.6-1.73-.438-2.528.361-.798.8-.96 1.933-.362 2.532Z'/><path d='M15.811 3.312c-.363 1.534-1.334 3.626-3.64 6.218l-.24 2.408a2.56 2.56 0 0 1-.732 1.526L8.817 15.85a.51.51 0 0 1-.867-.434l.27-1.899c.04-.28-.013-.593-.131-.956-.076-.233-.16-.439-.249-.657l-.082-.202c-.815-.197-1.578-.662-2.191-1.277-.614-.615-1.079-1.379-1.275-2.195l-.203-.083c-.218-.089-.423-.172-.655-.248-.363-.119-.675-.172-.955-.132l-1.896.27A.51.51 0 0 1 .15 7.17l2.382-2.386c.41-.41.947-.67 1.524-.734h.006l2.4-.238C9.005 1.55 11.087.582 12.623.208c.89-.217 1.59-.232 2.08-.188.244.023.435.06.57.093.067.017.12.033.16.045.184.06.279.13.351.295l.029.073c.014.038.032.091.05.158.038.133.08.322.107.563.055.485.051 1.178-.159 2.065Zm-4.828 7.475.04-.04-.107 1.081a1.536 1.536 0 0 1-.44.913l-1.298 1.3.054-.38c.072-.506-.034-.993-.172-1.418a8.548 8.548 0 0 0-.164-.45c.738-.065 1.462-.38 2.087-1.006ZM5.205 5c-.625.626-.94 1.351-1.004 2.09a8.497 8.497 0 0 0-.45-.164c-.424-.138-.91-.244-1.416-.172l-.38.054 1.3-1.3c.245-.246.566-.401.91-.44l1.08-.107-.04.039Zm9.406-3.961c-.38-.034-.967-.027-1.746.163-1.558.38-3.917 1.496-6.937 4.521-.62.62-.799 1.34-.687 2.051.107.676.483 1.362 1.048 1.928.564.565 1.25.941 1.924 1.049.71.112 1.429-.067 2.048-.688 3.079-3.083 4.192-5.444 4.556-6.987.183-.771.18-1.345.138-1.713a2.835 2.835 0 0 0-.045-.283 3.078 3.078 0 0 0-.3-.041Z'/><path d='M6.803 12.352A7.632 7.632 0 0 1 5 11a7.568 7.568 0 0 1-1.411-1.925c-1.102.991-1.965 5.054-1.84 5.18.126.125 3.936-.896 5.054-1.903Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SEARCH_OUTLINE = [\n\t\"<path d='M11.118 9.953a5.417 5.417 0 1 0-1.164 1.165.833.833 0 0 0 .081.096l3.21 3.209a.833.833 0 0 0 1.178-1.179l-3.21-3.208a.834.834 0 0 0-.095-.083Zm.215-3.203a4.583 4.583 0 1 1-9.166 0 4.583 4.583 0 0 1 9.166 0Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SETTINGS_OUTLINE = [\n\t\"<path d='M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.22 7.22 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96a.48.48 0 0 0-.59.22L2.74 8.87a.47.47 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.47.47 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_SHEET_BENT_OUTLINE = [\n\t\"<path d='M11.491.5H4.509C3.122.5 2 1.638 2 3.045v9.91c0 .68.265 1.328.732 1.802a2.494 2.494 0 0 0 1.777.743l5.346-.016c.67 0 1.293-.268 1.776-.743l1.637-1.66A2.566 2.566 0 0 0 14 11.28V3.045C14 1.638 12.878.5 11.491.5ZM4.509 14.33c-.358 0-.701-.142-.966-.395-.25-.253-.405-.6-.405-.98v-9.91c0-.759.608-1.375 1.356-1.375h6.981c.748 0 1.356.616 1.356 1.375v7.808h-1.839c-.872 0-1.574.711-1.574 1.597v1.88H4.51Zm6.312-.395c-.063.063-.14.127-.234.19v-1.676c0-.237.187-.41.405-.41h1.637a1.25 1.25 0 0 1-.187.237l-1.621 1.66Z'/><path d='M10.456 4.5H5.529c-.298 0-.537.258-.537.581 0 .323.239.581.537.581h4.927c.298 0 .536-.258.536-.58 0-.324-.238-.582-.536-.582ZM10.456 8.338H5.529c-.298 0-.537.258-.537.58 0 .324.239.582.537.582h4.927c.298 0 .536-.258.536-.581 0-.323-.238-.581-.536-.581Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHEET_GENERIC_OUTLINE = [\n\t\"<path d='M12.465.983H3.523c-.841 0-1.52.68-1.52 1.535v10.964c0 .841.679 1.535 1.535 1.535h8.927c.841 0 1.535-.679 1.535-1.535V2.518A1.543 1.543 0 0 0 12.465.983Zm.458 12.485a.466.466 0 0 1-.472.472H3.523a.466.466 0 0 1-.472-.473V2.518c0-.266.206-.472.472-.472h8.928c.265 0 .472.206.472.472v10.95Z'/><path d='M10.872 5.348H5.117a.529.529 0 0 0-.531.531c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.532.529.529 0 0 0-.531-.53ZM10.872 7.932H5.117a.529.529 0 0 0-.531.53c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.531.529.529 0 0 0-.531-.531ZM10.872 10.515H5.117a.53.53 0 0 0-.531.53c0 .296.236.532.53.532h5.756a.529.529 0 0 0 .531-.531.53.53 0 0 0-.531-.531Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHEET_LIST_OUTLINE = [\n\t\"<path d='M13.21 0H2.776c-.981 0-1.774.774-1.774 1.75v12.5c0 .96.793 1.75 1.791 1.75h10.419c.981 0 1.79-.774 1.79-1.75V1.75A1.78 1.78 0 0 0 13.212 0Zm.534 14.233a.538.538 0 0 1-.55.539H2.774a.538.538 0 0 1-.55-.539V1.75c0-.303.24-.539.55-.539h10.418c.31 0 .551.236.551.539v12.483Z'/><path d='M11.351 4.976H7.544a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606h3.807a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM4.88 4.976h-.345a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606h.345a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM5 7.945l-.501-.017a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.606L5 9.157a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.606ZM5 10.867l-.501-.017a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.605l.501.017a.61.61 0 0 0 .62-.605.61.61 0 0 0-.62-.606ZM11.351 7.922H7.453a.61.61 0 0 0-.62.605.61.61 0 0 0 .62.606h3.898a.61.61 0 0 0 .62-.606.61.61 0 0 0-.62-.605ZM11.351 10.867H7.453a.61.61 0 0 0-.62.606.61.61 0 0 0 .62.605h3.898a.61.61 0 0 0 .62-.605.61.61 0 0 0-.62-.606Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_BAG_OUTLINE = [\n\t\"<path d='M3.381 15h9.659a1.216 1.216 0 0 0 .898-.395 1.233 1.233 0 0 0 .322-.931l-.69-9.032a1.24 1.24 0 0 0-.39-.807 1.225 1.225 0 0 0-.83-.33H4.07a1.225 1.225 0 0 0-.83.33 1.24 1.24 0 0 0-.39.807l-.69 9.032a1.24 1.24 0 0 0 .322.931 1.224 1.224 0 0 0 .898.395Zm.286-10.295a.412.412 0 0 1 .407-.379h8.28a.407.407 0 0 1 .409.38l.69 9.03a.413.413 0 0 1-.244.409.407.407 0 0 1-.164.034H3.38a.406.406 0 0 1-.386-.275.413.413 0 0 1-.022-.167l.694-9.032Z'/><path d='M8.04 1c.54 0 1.059.217 1.44.602.383.385.598.906.599 1.45v.822a.412.412 0 0 1-.408.41.407.407 0 0 1-.408-.41v-.821c0-.327-.129-.64-.358-.871a1.22 1.22 0 0 0-1.73 0c-.23.23-.36.544-.36.87v.822a.412.412 0 0 1-.407.41.407.407 0 0 1-.408-.41v-.821c0-.545.216-1.066.598-1.451S7.498 1 8.04 1Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_BASKET_OUTLINE = [\n\t\"<path d='M2.947 8h.26l.494 3.946a1.263 1.263 0 0 0 1.253 1.107h6.934a1.263 1.263 0 0 0 1.254-1.107L13.635 8h.26a.842.842 0 0 0 .842-.842V5.474a.842.842 0 0 0-.842-.842H12.87l-1.376-2.32a.421.421 0 0 0-.724.43l1.121 1.89H4.95l1.122-1.89a.42.42 0 1 0-.725-.43l-1.376 2.32H2.947a.842.842 0 0 0-.842.842v1.684A.842.842 0 0 0 2.947 8Zm9.36 3.842a.421.421 0 0 1-.419.369H4.954a.422.422 0 0 1-.418-.37l-.48-3.84h8.73l-.48 3.84Zm-9.36-6.368h10.948v1.684H2.947V5.474Z'/><path d='M8.421 11.369a.421.421 0 0 0 .421-.421V9.262a.421.421 0 1 0-.842 0v1.684a.42.42 0 0 0 .421.422ZM6.316 11.369a.421.421 0 0 0 .42-.421V9.262a.421.421 0 1 0-.841 0v1.684a.42.42 0 0 0 .42.422ZM10.526 11.369a.421.421 0 0 0 .421-.421V9.262a.421.421 0 0 0-.842 0v1.684a.42.42 0 0 0 .421.422Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SHOPPING_CART_OUTLINE = [\n\t\"<path d='M14.892 3.98a.466.466 0 0 0-.369-.182H4.34l-.541-2.434A.466.466 0 0 0 3.332 1H1.466a.466.466 0 0 0 0 .933H2.96l2.14 9.424a1.865 1.865 0 1 0 2.43 1.767 1.823 1.823 0 0 0-.262-.932h2.854c-.17.281-.26.604-.261.932a1.866 1.866 0 1 0 1.865-1.865H6.036L5.72 9.86h6.692a1.399 1.399 0 0 0 1.352-1.03l1.226-4.444a.466.466 0 0 0-.098-.406Zm-8.296 9.144a.932.932 0 1 1-1.865 0 .932.932 0 0 1 1.865 0Zm6.062 0a.932.932 0 1 1-1.864 0 .932.932 0 0 1 1.864 0Zm.205-4.542a.466.466 0 0 1-.466.345H5.505l-.933-4.196h9.34l-1.049 3.851Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SPLIT_BILL_TICKET_1_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M1.5.536C1.5.24 1.743 0 2.042 0h11.916c.3 0 .542.24.542.536v13.928c0 .198-.11.38-.287.473a.547.547 0 0 1-.558-.029l-2.676-1.787-2.676 1.787a.546.546 0 0 1-.622-.01l-2.66-1.914-2.66 1.914a.547.547 0 0 1-.565.044.535.535 0 0 1-.296-.478V.536Zm1.083.535v12.341l2.12-1.524a.547.547 0 0 1 .636 0l2.673 1.922 2.664-1.78a.547.547 0 0 1 .606 0l2.135 1.426V1.071H2.583Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7.5 4a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM7.5 6.5A.5.5 0 0 1 8 6h3a.5.5 0 0 1 0 1H8a.5.5 0 0 1-.5-.5ZM4.5 9a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5Z' clip-rule='evenodd'/><path d='M5.162 6.588v.28c0 .073.052.132.116.132h.297c.064 0 .116-.059.116-.132v-.28c.219-.044.4-.147.528-.309a.986.986 0 0 0 .22-.647c0-.073 0-.132-.013-.19a2.637 2.637 0 0 0-.04-.163c-.012-.058-.038-.103-.064-.147-.025-.044-.064-.088-.09-.117-.026-.03-.064-.074-.116-.103-.039-.03-.09-.06-.129-.088-.039-.03-.09-.045-.142-.074a.668.668 0 0 0-.154-.059c-.052-.014-.103-.044-.168-.059a1.912 1.912 0 0 1-.31-.147c-.05-.044-.077-.088-.077-.147s.013-.103.065-.132c.051-.044.116-.059.206-.059.168 0 .348.074.541.206.052.044.117.03.155-.03l.245-.338c.026-.03.026-.073.026-.103a.1.1 0 0 0-.052-.088c-.077-.073-.18-.132-.27-.191a1.356 1.356 0 0 0-.336-.132v-.339C5.716 3.06 5.665 3 5.6 3h-.296c-.065 0-.116.059-.116.132v.31a.935.935 0 0 0-.529.293.986.986 0 0 0-.219.647c0 .06 0 .118.013.177s.026.103.039.162c.013.044.038.088.051.132a.816.816 0 0 0 .078.118c.025.029.064.058.09.088.026.03.064.059.116.088.039.03.077.044.116.059.039.015.077.044.129.059.051.014.09.029.129.044.038.014.077.03.142.044.051.015.103.03.141.059a.43.43 0 0 1 .116.059l.078.044c.013.014.038.03.051.059.013.014.026.029.026.058 0 .015.013.045.013.074a.224.224 0 0 1-.065.162c-.116.088-.335.088-.54-.015a.953.953 0 0 1-.285-.206c-.025-.03-.064-.044-.09-.03-.038 0-.064.015-.077.045L4.466 6a.153.153 0 0 0 .013.191c.155.191.4.338.683.397Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SPLIT_BILL_TICKET_2_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M15.914 1.675a.406.406 0 0 0-.262-.164L7.324.036a.432.432 0 0 0-.476.328l-.64 3.64H.833c-.23 0-.41.18-.41.409v10.131c0 .197.115.377.279.476.18.098.393.082.557-.033l.984-.656 1.114.738a.492.492 0 0 0 .59 0l1.115-.738 1.115.738c.18.114.41.114.607 0l1.114-.738.984.656a.563.563 0 0 0 .557.033.532.532 0 0 0 .28-.476v-3.59l.95.918c.164.148.393.18.59.098l1.23-.54.852.82a.52.52 0 0 0 .541.114.54.54 0 0 0 .36-.41l1.755-9.967a.43.43 0 0 0-.082-.312ZM8.88 14.036l-.705-.475a.549.549 0 0 0-.59 0l-1.115.737-1.115-.737a.577.577 0 0 0-.606 0l-1.115.737-1.115-.737a.491.491 0 0 0-.59 0l-.705.459V4.84h7.64v9.196h.016Zm4.64-2.738-.607-.573a.52.52 0 0 0-.377-.148.505.505 0 0 0-.213.05l-1.23.54-.967-.934a.529.529 0 0 0-.426-.148V8.888l2.492.443h.065a.39.39 0 0 0 .394-.344.422.422 0 0 0-.328-.476l-2.64-.459v-.934l2.804.492h.065a.39.39 0 0 0 .394-.345.422.422 0 0 0-.328-.475l-2.935-.525v-.934l.951.164h.066a.39.39 0 0 0 .393-.344.432.432 0 0 0-.328-.476l-1.098-.197V4.38c0-.23-.18-.41-.41-.41H7.045l.54-3.098L15.112 2.2l-1.59 9.098Z'/><path d='m12.31 5.804-.033.213c-.016.066.033.115.082.131l.262.05c.066.016.115-.033.132-.083l.033-.213c.196 0 .377-.049.508-.164a.747.747 0 0 0 .278-.475c.017-.05.017-.115.017-.164 0-.05 0-.098-.017-.131 0-.05-.016-.082-.049-.131-.016-.033-.033-.082-.065-.099-.017-.032-.05-.065-.082-.098a.432.432 0 0 0-.099-.082c-.032-.033-.065-.05-.114-.082-.05-.033-.099-.05-.132-.082-.032-.016-.082-.05-.147-.082a1.048 1.048 0 0 1-.263-.164.186.186 0 0 1-.049-.131c.017-.05.033-.082.066-.098a.369.369 0 0 1 .197-.017c.147.033.311.115.459.246.049.033.098.033.147 0l.262-.23a.125.125 0 0 0 .033-.081.125.125 0 0 0-.033-.082c-.065-.066-.13-.131-.229-.197a1.557 1.557 0 0 0-.279-.164l.05-.262c.016-.066-.033-.115-.082-.131l-.263-.05c-.065-.016-.114.033-.13.082l-.05.246a.847.847 0 0 0-.508.148.747.747 0 0 0-.279.475c-.016.05-.016.099-.016.131 0 .05 0 .082.016.132.016.032.016.082.033.114l.049.099c.016.032.05.065.066.082.016.032.049.049.082.082.032.032.065.049.098.065.033.017.065.05.115.066.032.016.082.049.114.065.033.017.066.033.115.066.05.016.082.05.115.066s.066.032.098.065c.033.016.05.033.066.05.016.016.033.032.033.048 0 .017.016.033.016.05v.049a.19.19 0 0 1-.082.115c-.115.065-.311.016-.492-.099a.937.937 0 0 1-.23-.213c-.016-.016-.048-.033-.081-.05-.033 0-.066 0-.082.034l-.262.23c-.05.032-.05.098-.017.147.164.262.377.41.623.508ZM8.798 3.417l2.148.378h.065c.197 0 .36-.148.41-.345.033-.23-.115-.442-.328-.475l-2.147-.377c-.214-.033-.443.115-.476.328-.033.246.115.459.328.491ZM6.568 9.306v.23c0 .065.05.114.115.114h.279c.065 0 .114-.049.114-.115v-.213a.786.786 0 0 0 .476-.246.718.718 0 0 0 .196-.524c0-.05 0-.115-.016-.164-.016-.05-.016-.099-.033-.131a.264.264 0 0 0-.065-.115c-.033-.033-.05-.066-.082-.098-.033-.033-.066-.05-.099-.082-.032-.033-.082-.05-.114-.066-.033-.016-.082-.033-.132-.066l-.147-.049c-.05-.016-.098-.032-.164-.049-.131-.05-.23-.082-.279-.115-.049-.032-.065-.065-.065-.114 0-.05.016-.082.049-.115a.294.294 0 0 1 .18-.05c.164 0 .328.05.492.165.05.032.115.016.148-.017l.213-.278c.016-.017.033-.05.016-.082 0-.033-.016-.05-.05-.066l-.245-.148a1.042 1.042 0 0 0-.295-.098v-.262a.112.112 0 0 0-.115-.115h-.278a.112.112 0 0 0-.115.115v.23a.786.786 0 0 0-.476.245.705.705 0 0 0-.196.508c0 .05 0 .099.016.132 0 .049.016.082.033.13l.049.099c.016.033.05.066.082.098.033.033.05.05.082.066.033.016.065.05.098.066l.099.049c.032.016.065.033.114.049.05.016.082.033.115.033.033.016.082.016.131.032.05.017.099.033.131.05l.099.049c.033.016.049.033.065.033l.05.049c.016.016.016.033.016.049v.05a.15.15 0 0 1-.066.13c-.098.082-.295.066-.491-.016a.88.88 0 0 1-.263-.164.125.125 0 0 0-.082-.033c-.032 0-.049.017-.082.033l-.23.279c-.032.049-.032.114.017.147.213.197.443.312.705.36ZM2.64 7.515h1.728c.23 0 .41-.18.41-.41 0-.229-.18-.41-.41-.41H2.64c-.23 0-.41.181-.41.41 0 .214.18.41.41.41ZM2.64 9.652h1.728c.23 0 .41-.18.41-.41 0-.23-.18-.41-.41-.41H2.64c-.23 0-.41.18-.41.41 0 .213.18.41.41.41ZM2.94 11.788h4.1c.23 0 .41-.18.41-.41 0-.229-.18-.41-.41-.41h-4.1c-.23 0-.41.181-.41.41 0 .23.18.41.41.41Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_STAR_FILLED = [\n\t\"<path d='m21.284 8.276-5.951-.865-2.66-5.393a.753.753 0 0 0-1.345 0l-2.66 5.393-5.952.865a.749.749 0 0 0-.414 1.28l4.305 4.197L5.59 19.68a.749.749 0 0 0 1.087.79L12 17.672l5.323 2.798a.749.749 0 0 0 1.087-.79l-1.017-5.927 4.305-4.197a.748.748 0 0 0 .218-.43.747.747 0 0 0-.632-.85Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_SUCCESS_FILLED_GREEN = [\n\t\"<path fill='#46D281' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm4.384-9.18a.5.5 0 0 0-.768-.64L5.995 9.725 3.38 6.675a.5.5 0 1 0-.76.65l3 3.5a.5.5 0 0 0 .764-.005l5-6Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_SUCCESS_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 8 1a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M11.835 5.628a.5.5 0 0 1 .037.706l-4.5 5a.5.5 0 0 1-.726.02l-2.5-2.5a.5.5 0 1 1 .708-.708l2.127 2.128 4.147-4.608a.5.5 0 0 1 .707-.038Z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_SUGAR_FREE_FILLED = [\n\t\"<path d='M22.11 21.46 2.39 1.73 1.11 3 4.3 6.19l-.77.43c-.32.17-.53.5-.53.88v9c0 .38.21.71.53.88l7.9 4.44c.16.12.36.18.57.18.21 0 .41-.06.57-.18l4.71-2.65 3.56 3.56 1.27-1.27ZM5 15.91v-6.7l5.29 2.97.71.71v6.4l-6-3.38Zm8 3.38v-4.4l2.82 2.81L13 19.29ZM9 5.82 7.56 4.36l3.87-2.18c.16-.12.36-.18.57-.18.21 0 .41.06.57.18l7.9 4.44c.32.17.53.5.53.88v9c0 .35-.18.66-.47.83L19 15.8V9.21l-4.22 2.37-1.47-1.47 4.65-2.61L12 4.15 9 5.82Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_TAG_FILLED = [\n\t\"<path d='M5.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3Zm15.91 4.58-9-9C12.05 2.22 11.55 2 11 2H4c-1.11 0-2 .89-2 2v7c0 .55.22 1.05.59 1.41l8.99 9c.37.36.87.59 1.42.59.55 0 1.05-.23 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.56-.23-1.06-.59-1.42Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_TAG_OUTLINE = [\n\t\"<path d='M6.739 1c.99 0 1.94.394 2.64 1.094l5.071 5.072a1.9 1.9 0 0 1 0 2.673L9.84 14.45a1.895 1.895 0 0 1-2.67 0L2.094 9.375C1.394 8.674 1 7.725 1 6.734V3.43A2.438 2.438 0 0 1 3.429 1h3.31Zm0 1.167h-3.31c-.704 0-1.262.557-1.262 1.26v3.307c0 .681.272 1.336.753 1.817l5.072 5.072a.713.713 0 0 0 1.021 0l4.611-4.611a.713.713 0 0 0 0-1.02L8.552 2.918a2.562 2.562 0 0 0-1.812-.753h-.001Z'/><path d='M6.489 3.872c.717.717.717 1.9 0 2.618-.717.717-1.9.717-2.618 0a1.861 1.861 0 0 1 0-2.618 1.861 1.861 0 0 1 2.618 0Zm-.827.827a.672.672 0 0 0-.964 0 .672.672 0 0 0 0 .964.672.672 0 0 0 .964 0 .672.672 0 0 0 0-.964Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TAP_CLICK_HAND_OUTLINE = [\n\t\"<path d='M13.063 6.388c-.205 0-.407.04-.597.117a1.597 1.597 0 0 0-1.533-1.182 1.566 1.566 0 0 0-.782.213 1.597 1.597 0 0 0-1.88-.65V1.598a1.597 1.597 0 1 0-3.193 0v8.3l-.48-.48a2.337 2.337 0 0 0-3.3 0 1.011 1.011 0 0 0-.037 1.395l3.833 4.258a2.732 2.732 0 0 0 2.028.9h4.455a2.73 2.73 0 0 0 2.55-1.714 7.73 7.73 0 0 0 .533-2.859V7.985a1.597 1.597 0 0 0-1.597-1.597Zm.532 5.01a6.586 6.586 0 0 1-.474 2.443 1.656 1.656 0 0 1-1.544 1.064H7.122a1.677 1.677 0 0 1-1.24-.532l-3.796-4.259a1.272 1.272 0 0 1 1.762.032l1.384 1.39a.533.533 0 0 0 .814-.075.532.532 0 0 0 .096-.282V1.597a.532.532 0 0 1 1.065 0v6.388a.532.532 0 1 0 1.065 0V6.388a.532.532 0 0 1 1.064 0v2.13a.532.532 0 1 0 1.065 0V6.92a.532.532 0 1 1 1.065 0v2.13a.532.532 0 0 0 1.064 0V7.985a.532.532 0 0 1 1.065 0v3.412Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TICKET_OUTLINE = [\n\t\"<g clip-path='url(#a)'><path d='M2.552 4.405a.555.555 0 0 0-.772.058L.306 6.126c-.472.537-.436 1.34.08 1.804l8.593 7.622c.52.456 1.323.396 1.8-.136l1.475-1.663a.555.555 0 0 0-.034-.773c-.371-.328-.397-.905-.057-1.287.339-.383.915-.426 1.285-.098a.555.555 0 0 0 .772-.058l1.474-1.662c.471-.538.436-1.342-.08-1.804L7.021.448c-.52-.456-1.323-.395-1.8.137L3.746 2.247c-.2.23-.184.574.034.773.37.329.396.905.057 1.288-.339.382-.915.426-1.285.097Zm2.32-1.804L6.026 1.3a.188.188 0 0 1 .127-.063.177.177 0 0 1 .13.044l5.506 4.883-.614.692a.547.547 0 0 0 .034.773.547.547 0 0 0 .771-.058l.615-.693 2.282 2.025c.075.066.08.181.012.258l-1.155 1.302c-.802-.371-1.768-.159-2.371.521s-.699 1.665-.235 2.416l-1.154 1.302a.182.182 0 0 1-.258.02l-2.282-2.025.614-.692a.547.547 0 0 0-.034-.773.547.547 0 0 0-.772.058l-.614.692-5.505-4.883a.177.177 0 0 1-.06-.125.189.189 0 0 1 .048-.133l1.155-1.302c.802.372 1.768.16 2.37-.52.604-.681.7-1.665.236-2.417Zm3.845 7.025L9.7 8.518a.547.547 0 0 1 .772-.059.547.547 0 0 1 .034.773l-.984 1.109a.547.547 0 0 1-.771.058.548.548 0 0 1-.034-.773Z'/></g><defs><clipPath id='a'><path d='M0 0h16v16H0z'/></clipPath></defs>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TICKETS_OUTLINE = [\n\t\"<path d='M1.123 3h11.609c.31 0 .591.125.795.326l.015.016c.194.2.315.472.315.768v.15h1.017c.31 0 .59.124.794.326a1.1 1.1 0 0 1 .331.785v1.38c0 .14-.115.254-.258.254-.314 0-.6.126-.805.33a1.115 1.115 0 0 0 0 1.59c.206.203.491.33.806.33.142 0 .258.114.258.254v1.38c0 .306-.127.584-.33.785l-.016.015a1.127 1.127 0 0 1-.778.311H3.268c-.31 0-.592-.125-.795-.326a1.1 1.1 0 0 1-.33-.784v-.15H1.125c-.31 0-.591-.125-.795-.325A1.101 1.101 0 0 1 0 9.629V8.25c0-.14.116-.255.258-.255.315 0 .6-.126.805-.329a1.116 1.116 0 0 0 0-1.59 1.144 1.144 0 0 0-.805-.33A.257.257 0 0 1 0 5.493v-1.38a1.124 1.124 0 0 1 1.125-1.11L1.123 3Zm6.959 4.311a1.258 1.258 0 0 1 0 1.796 1.293 1.293 0 0 1-1.82 0l-.014-.016a1.258 1.258 0 0 1 .014-1.778 1.29 1.29 0 0 1 .91-.373c.33 0 .659.123.91.371Zm-.14.898a.754.754 0 0 0-.225-.537.774.774 0 0 0-1.09 0 .75.75 0 0 0-.011 1.064l.012.01a.774.774 0 0 0 1.09 0 .753.753 0 0 0 .224-.537ZM5.368 4.633l.016.016a1.258 1.258 0 0 1-.014 1.778l-.016.016a1.29 1.29 0 0 1-1.801-.014 1.256 1.256 0 0 1-.002-1.795c.252-.249.58-.373.91-.373.328 0 .656.123.907.372Zm-.364.36a.773.773 0 0 0-1.09 0 .752.752 0 0 0 0 1.075.775.775 0 0 0 1.078.012l.01-.012a.752.752 0 0 0 .013-1.064l-.012-.011h.001Zm2.597-.247c.1-.1.264-.1.365 0 .1.1.1.261 0 .36L4.224 8.803c-.1.1-.264.1-.365 0-.1-.1-.1-.261 0-.36l3.742-3.696Zm6.254.024v.72c0 .14-.115.255-.258.255-.314 0-.6.126-.805.33a1.115 1.115 0 0 0 0 1.59c.206.202.49.328.805.328.143 0 .258.115.258.255v1.38c0 .305-.127.583-.33.785a1.13 1.13 0 0 1-.795.325H2.656v.15a.611.611 0 0 0 .609.6h11.608c.162 0 .31-.063.42-.165l.01-.011a.596.596 0 0 0 .179-.425V9.742a1.656 1.656 0 0 1-.912-.458 1.623 1.623 0 0 1 0-2.311c.242-.24.558-.404.912-.459V5.37a.61.61 0 0 0-.609-.601h-1.018v.002ZM12.73 3.51H1.122a.613.613 0 0 0-.43.176.594.594 0 0 0-.18.424v1.145c.354.055.671.22.913.459a1.62 1.62 0 0 1 0 2.31 1.656 1.656 0 0 1-.912.46v1.143c0 .166.068.316.179.425.11.109.262.177.43.177H12.73c.168 0 .32-.068.43-.177a.597.597 0 0 0 .18-.425V8.483a1.656 1.656 0 0 1-.913-.458 1.62 1.62 0 0 1 0-2.311c.242-.24.559-.404.912-.459V4.11a.595.595 0 0 0-.167-.413l-.012-.01a.61.61 0 0 0-.43-.177Z'/><path d='M10.439 4.16a.242.242 0 0 1 .346 0c.046.046.071.11.071.176v.875c0 .066-.025.13-.071.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.071-.177v-.875c0-.066.025-.13.07-.177ZM10.44 6.066a.242.242 0 0 1 .345 0c.046.047.072.11.072.177V7.2c0 .067-.026.13-.072.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.071-.177v-.956c0-.066.025-.13.071-.177ZM10.44 8.243a.242.242 0 0 1 .345 0c.046.047.072.11.072.176v1.073c0 .067-.026.13-.071.177a.242.242 0 0 1-.346 0 .253.253 0 0 1-.072-.177V8.42c0-.066.025-.13.071-.176Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_TWITTER_FILLED = [\n\t\"<path d='M21.75 5.96a8.015 8.015 0 0 1-2.302.619 3.987 3.987 0 0 0 1.758-2.203 7.89 7.89 0 0 1-2.536.965 3.986 3.986 0 0 0-2.92-1.263 3.996 3.996 0 0 0-3.996 3.999c0 .309.037.618.098.916a11.358 11.358 0 0 1-8.24-4.184 3.968 3.968 0 0 0-.544 2.018c0 1.388.705 2.611 1.781 3.33a4.03 4.03 0 0 1-1.807-.508v.05a3.997 3.997 0 0 0 3.204 3.923c-.344.09-.697.135-1.052.136a5.31 5.31 0 0 1-.755-.061 4.004 4.004 0 0 0 3.736 2.773 8.01 8.01 0 0 1-4.962 1.708c-.335 0-.644-.012-.965-.05a11.317 11.317 0 0 0 6.138 1.794c7.35 0 11.372-6.09 11.372-11.374 0-.174 0-.347-.012-.52A8.607 8.607 0 0 0 21.75 5.96Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_USER_OUTLINE = [\n\t\"<path d='M8 1C4.14 1 1 4.14 1 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7ZM4.32 12.633A4.473 4.473 0 0 1 8 10.693c1.48 0 2.85.737 3.68 1.94a5.891 5.891 0 0 1-7.36 0Zm1.347-5.35A2.336 2.336 0 0 1 8 4.948a2.336 2.336 0 0 1 2.333 2.333A2.336 2.336 0 0 1 8 9.615a2.336 2.336 0 0 1-2.333-2.333Zm6.792 4.603a5.55 5.55 0 0 0-2.43-1.879 3.398 3.398 0 0 0 1.381-2.725c0-1.88-1.53-3.41-3.41-3.41-1.88 0-3.41 1.53-3.41 3.41 0 1.118.548 2.103 1.382 2.725a5.56 5.56 0 0 0-2.43 1.88A5.893 5.893 0 0 1 2.077 8 5.93 5.93 0 0 1 8 2.077 5.93 5.93 0 0 1 13.923 8a5.891 5.891 0 0 1-1.464 3.886Z'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_WARNING_FILLED_YELLOW = [\n\t\"<path fill='#FBCC29' fill-rule='evenodd' d='M7 14A7 7 0 1 0 7 0a7 7 0 0 0 0 14Zm.14-12c.374 0 .677.304.677.678V9a.678.678 0 1 1-1.356 0V2.678c0-.374.304-.678.678-.678Zm.677 9.169a.678.678 0 1 1-1.356 0 .678.678 0 0 1 1.356 0Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_WARNING_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12Zm0 1A7 7 0 1 0 7 0a7 7 0 0 0 0 14Z' clip-rule='evenodd'/><path fill-rule='evenodd' d='M7 10a.5.5 0 0 1 .5.5v.5a.5.5 0 0 1-1 0v-.5A.5.5 0 0 1 7 10ZM7 3a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-1 0v-5A.5.5 0 0 1 7 3Z' clip-rule='evenodd'/>\",\n\t\"0 0 14 14\",\n] as const;\n\nexport const ICON_WHATSAPP_OUTLINE = [\n\t\"<path d='M16.723 14.06c-.256-.131-1.528-.755-1.765-.839-.237-.089-.41-.131-.582.131-.173.26-.665.84-.82 1.015-.15.174-.302.195-.558.066-1.518-.76-2.514-1.355-3.515-3.073-.265-.457.265-.424.76-1.41.083-.174.041-.322-.024-.453-.066-.131-.582-1.402-.797-1.92-.209-.504-.424-.433-.581-.443-.15-.009-.321-.009-.495-.009a.956.956 0 0 0-.689.321c-.237.26-.905.886-.905 2.156s.926 2.501 1.053 2.675c.13.173 1.82 2.78 4.415 3.902 1.64.708 2.283.769 3.103.647.5-.075 1.529-.624 1.742-1.23.213-.605.213-1.123.15-1.231-.064-.115-.237-.18-.492-.305Z'/><path d='M21.684 7.931a10.505 10.505 0 0 0-5.615-5.615A10.45 10.45 0 0 0 12 1.5h-.047A10.475 10.475 0 0 0 1.5 12.05a10.533 10.533 0 0 0 1.125 4.684v3.563c0 .595.483 1.078 1.078 1.078h3.565a10.532 10.532 0 0 0 4.685 1.125h.05c1.403 0 2.765-.272 4.047-.804a10.418 10.418 0 0 0 3.347-2.231 10.475 10.475 0 0 0 3.103-7.418 10.46 10.46 0 0 0-.816-4.116Zm-3.541 10.266A8.673 8.673 0 0 1 12 20.719h-.04a8.75 8.75 0 0 1-4.057-1.02l-.197-.105h-3.3v-3.3l-.105-.197a8.75 8.75 0 0 1-1.02-4.057 8.665 8.665 0 0 1 2.522-6.183 8.653 8.653 0 0 1 6.16-2.576h.04c1.171 0 2.308.228 3.379.678a8.662 8.662 0 0 1 2.79 1.875 8.684 8.684 0 0 1 2.552 6.206 8.686 8.686 0 0 1-2.581 6.157Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_WHEAT_FILLED = [\n\t\"<path d='M21.725 3.598A.937.937 0 0 0 20.4 2.274l-3.442 3.433a.937.937 0 0 0 1.324 1.324l3.438-3.437.004.004Zm-7.793-.535a.627.627 0 0 0-.883 0l-.445.441a3.75 3.75 0 0 0 0 5.305l.406.406-1.191 1.191a4.989 4.989 0 0 0-1.426-2.921l-.441-.442a.627.627 0 0 0-.883 0l-.441.442a3.75 3.75 0 0 0 0 5.304l.406.406-1.192 1.192a4.988 4.988 0 0 0-1.425-2.922l-.442-.445a.627.627 0 0 0-.882 0l-.442.441a3.75 3.75 0 0 0 0 5.304l.406.407-2.69 2.69a1.252 1.252 0 0 0 1.769 1.77l2.69-2.69.477.476a3.75 3.75 0 0 0 5.305 0l.441-.442a.627.627 0 0 0 0-.883l-.441-.44a4.992 4.992 0 0 0-3.05-1.442l1.245-1.246.477.476a3.75 3.75 0 0 0 5.304 0l.442-.441a.627.627 0 0 0 0-.883l-.442-.441a4.992 4.992 0 0 0-3.05-1.442l1.246-1.246.476.477a3.751 3.751 0 0 0 5.305 0l.44-.445a.627.627 0 0 0 0-.883l-.44-.445a4.922 4.922 0 0 0-.641-.543l1.805-1.801A.937.937 0 0 0 20.4 6.024l-2.32 2.32a5.033 5.033 0 0 0-2.434.082c.238-.832.258-1.71.054-2.55l2.274-2.278a.937.937 0 0 0-1.324-1.324l-1.797 1.789a4.642 4.642 0 0 0-.484-.559l-.438-.441Z'/>\",\n\t\"0 0 24 24\",\n] as const;\n\nexport const ICON_WIFI_NO_SIGNAL_OUTLINE = [\n\t\"<path fill-rule='evenodd' d='M15.784 6.009q-.23-.223-.472-.433a11 11 0 0 0-2.043-1.398l-.946 1.065a9.7 9.7 0 0 1 2.465 1.738.72.72 0 0 0 .967.037.672.672 0 0 0 .029-1.01M12.868 7.66a7.9 7.9 0 0 0-1.772-1.033l-.975 1.098c.845.288 1.62.747 2.273 1.347a.71.71 0 0 0 .938.013.667.667 0 0 0 .024-1.014 8 8 0 0 0-.488-.41m-1.966 2.473a4.6 4.6 0 0 0-2.092-.93l-1.172 1.319c.846-.1 1.697.139 2.36.663a.69.69 0 0 0 .875-.005l.05-.044h.001a.625.625 0 0 0-.021-1.003M8 12.26c-.405 0-.79.171-1.057.47a1.34 1.34 0 0 0-.347.862c-.009.761.606 1.388 1.382 1.408.375.007.737-.135 1.005-.392a1.342 1.342 0 0 0 .073-1.878A1.42 1.42 0 0 0 8 12.26m1.223-4.772 1.03-1.162 1.271-1.431.968-1.09 1.482-1.67a.675.675 0 0 0-.066-.966.716.716 0 0 0-.991.065L11.082 3.3h.001a11 11 0 0 0-1.679-.34c-.932-.12-1.876-.12-2.808 0a11.1 11.1 0 0 0-6.38 3.049.672.672 0 0 0 .03 1.01.72.72 0 0 0 .966-.039q.263-.255.545-.491h.001a9.7 9.7 0 0 1 4.838-2.15 9.8 9.8 0 0 1 3.46.117L8.661 6.03a8 8 0 0 0-.66-.03H8q-.708.002-1.404.126a7.87 7.87 0 0 0-3.952 1.947.666.666 0 0 0 .023 1.013c.27.231.675.226.939-.012a6.46 6.46 0 0 1 3.84-1.677l-5.024 5.66a.68.68 0 0 0 .07.97.71.71 0 0 0 .988-.069l2.388-2.691L7.756 9.14z' clip-rule='evenodd'/>\",\n\t\"0 0 16 16\",\n] as const;\n\nexport const ICON_WIFI_SIGNAL_FILLED = [\n\t\"<path d='M15 .5A2.5 2.5 0 0 1 17.5 3v12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12ZM3.985 8.685a.585.585 0 0 0-.562.58c0 .312.254.555.562.546a3.777 3.777 0 0 1 2.78 1.08 3.773 3.773 0 0 1 1.14 2.755.544.544 0 0 0 .559.551.584.584 0 0 0 .567-.575 4.862 4.862 0 0 0-1.468-3.548 4.863 4.863 0 0 0-3.578-1.39ZM4 5.682a.583.583 0 0 0-.564.577.543.543 0 0 0 .56.549c1.855-.047 3.596.63 4.9 1.906 1.305 1.276 2.02 3.002 2.013 4.857a.544.544 0 0 0 .56.548.582.582 0 0 0 .565-.577c.008-2.157-.824-4.161-2.34-5.645C8.178 6.414 6.155 5.627 4 5.682Zm.012-3.004a.584.584 0 0 0-.566.576.543.543 0 0 0 .56.549c2.661-.063 5.154.908 7.02 2.733 1.865 1.825 2.89 4.297 2.885 6.96a.542.542 0 0 0 .562.547.583.583 0 0 0 .563-.58c.005-2.961-1.135-5.71-3.212-7.742-2.076-2.032-4.85-3.113-7.812-3.043Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const ICON_WIFI_SIGNAL_OUTLINE = [\n\t\"<path d='M16.5 3A1.5 1.5 0 0 0 15 1.5H3A1.5 1.5 0 0 0 1.5 3v12A1.5 1.5 0 0 0 3 16.5h12a1.5 1.5 0 0 0 1.5-1.5V3Zm1 12a2.5 2.5 0 0 1-2.5 2.5H3A2.5 2.5 0 0 1 .5 15V3A2.5 2.5 0 0 1 3 .5h12A2.5 2.5 0 0 1 17.5 3v12Z'/><path d='M14.01 14.806a.553.553 0 0 1-.165-.396c.004-2.688-1.03-5.183-2.914-7.026-1.883-1.843-4.4-2.823-7.088-2.76a.549.549 0 0 1-.564-.554.59.59 0 0 1 .57-.582c2.99-.07 5.792 1.02 7.888 3.072 2.097 2.051 3.249 4.828 3.243 7.819a.589.589 0 0 1-.569.583.547.547 0 0 1-.401-.156Zm-2.63.234a.588.588 0 0 0 .57-.583c.007-2.177-.832-4.2-2.363-5.698C8.057 7.26 6.014 6.466 3.838 6.52a.588.588 0 0 0-.57.583.548.548 0 0 0 .566.554c1.872-.048 3.63.636 4.947 1.925 1.317 1.288 2.039 3.03 2.032 4.904a.55.55 0 0 0 .566.553Zm-3.035.078a.589.589 0 0 0 .572-.58 4.908 4.908 0 0 0-1.481-3.582 4.91 4.91 0 0 0-3.613-1.403.59.59 0 0 0-.568.585c0 .316.256.561.568.552a3.812 3.812 0 0 1 2.806 1.09 3.808 3.808 0 0 1 1.15 2.781.55.55 0 0 0 .566.557Z'/>\",\n\t\"0 0 18 18\",\n] as const;\n\nexport const iconNames = [\n\t\"apple-filled\",\n\t\"arrow-circle-down-outline\",\n\t\"arrow-circle-left-outline\",\n\t\"arrow-circle-right-outline\",\n\t\"arrow-circle-up-outline\",\n\t\"arrow-down-outline\",\n\t\"arrow-left-outline\",\n\t\"arrow-list-outline\",\n\t\"arrow-point-down-filled\",\n\t\"arrow-point-left-filled\",\n\t\"arrow-point-right-filled\",\n\t\"arrow-point-up-filled\",\n\t\"arrow-right-outline\",\n\t\"arrow-up-outline\",\n\t\"barcode-outline\",\n\t\"bell-outline\",\n\t\"calendar-alt-outline\",\n\t\"calendar-locked-outline\",\n\t\"calendar-outline\",\n\t\"carrot-filled\",\n\t\"check-outline\",\n\t\"checkbox-checked\",\n\t\"checkbox-unchecked\",\n\t\"chevron-down-outline\",\n\t\"chevron-left-bicolor\",\n\t\"chevron-left-outline\",\n\t\"chevron-right-bicolor\",\n\t\"chevron-right-outline\",\n\t\"chevron-up-outline\",\n\t\"chicken-filled\",\n\t\"chili-filled\",\n\t\"close-outline\",\n\t\"cloud-download-outline\",\n\t\"cloud-upload-outline\",\n\t\"copy-generic-outline\",\n\t\"copy-square-outline\",\n\t\"delete-outline\",\n\t\"discount-outline\",\n\t\"document-generic-outline\",\n\t\"document-history-alt-outline\",\n\t\"document-history-outline\",\n\t\"document-list-outline\",\n\t\"drag-handle-outline\",\n\t\"error-filled-red\",\n\t\"error-outline\",\n\t\"exclamation-outline\",\n\t\"expand-outline\",\n\t\"export-outline\",\n\t\"eye-closed-outline\",\n\t\"eye-open-filled\",\n\t\"eye-open-outline\",\n\t\"facebook-filled\",\n\t\"fire-filled\",\n\t\"fish-filled\",\n\t\"globe-outline\",\n\t\"google-filled\",\n\t\"hashtag-outline\",\n\t\"home-outline\",\n\t\"import-outline\",\n\t\"info-filled-blue\",\n\t\"info-outline\",\n\t\"instagram-filled\",\n\t\"key-outline\",\n\t\"lactose-intolerant-filled\",\n\t\"layout-1-outline\",\n\t\"layout-2-outline\",\n\t\"layout-3-outline\",\n\t\"layout-4-outline\",\n\t\"layout-5-outline\",\n\t\"leaf-filled\",\n\t\"linkedin-filled\",\n\t\"location-filled\",\n\t\"lock-password-1-outline\",\n\t\"lock-password-2-outline\",\n\t\"mail-outline\",\n\t\"menu-close-outline\",\n\t\"menu-hamburger-outline\",\n\t\"minus-bicolor-tertiary-light\",\n\t\"minus-bicolor-tertiary\",\n\t\"minus-filled\",\n\t\"money-bill-outline\",\n\t\"money-cash-outline\",\n\t\"money-coin-outline\",\n\t\"money-credit-card-outline\",\n\t\"nfc-filled\",\n\t\"nfc-outline\",\n\t\"pencil-outline\",\n\t\"pencil\",\n\t\"phone-outline\",\n\t\"plus-bicolor-tertiary-light\",\n\t\"plus-bicolor-tertiary\",\n\t\"plus-filled\",\n\t\"printer-outline\",\n\t\"purchase-order-bill-outline\",\n\t\"purchase-order-list-outline\",\n\t\"purchase-order-ticket-outline\",\n\t\"question-circle-outline\",\n\t\"radio-button-checked-outline\",\n\t\"radio-button-unchecked-outline\",\n\t\"refresh-double-outline\",\n\t\"refresh-single-outline\",\n\t\"rocket-outline\",\n\t\"search-outline\",\n\t\"settings-outline\",\n\t\"sheet-bent-outline\",\n\t\"sheet-generic-outline\",\n\t\"sheet-list-outline\",\n\t\"shopping-bag-outline\",\n\t\"shopping-basket-outline\",\n\t\"shopping-cart-outline\",\n\t\"split-bill-ticket-1-outline\",\n\t\"split-bill-ticket-2-outline\",\n\t\"star-filled\",\n\t\"success-filled-green\",\n\t\"success-outline\",\n\t\"sugar-free-filled\",\n\t\"tag-filled\",\n\t\"tag-outline\",\n\t\"tap-click-hand-outline\",\n\t\"ticket-outline\",\n\t\"tickets-outline\",\n\t\"twitter-filled\",\n\t\"user-outline\",\n\t\"warning-filled-yellow\",\n\t\"warning-outline\",\n\t\"whatsapp-outline\",\n\t\"wheat-filled\",\n\t\"wifi-no-signal-outline\",\n\t\"wifi-signal-filled\",\n\t\"wifi-signal-outline\",\n] as const;\n\nexport type IconNameType = (typeof iconNames)[number];\n","import { useMemo } from \"react\";\nimport styles from \"./Icon.module.css\";\nimport type { IconNameType } from \"./icons\";\nimport * as Icons from \"./icons\";\n\nexport type { IconNameType };\n\nexport interface IconProps {\n\tname: IconNameType;\n\tsize?: number | string;\n\tclassName?: string;\n\tcolor?: string;\n\t\"aria-label\"?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n\t\"data-testid\"?: string;\n}\n\nfunction resolveIcon(name: IconNameType): { path: string; viewBox: string } {\n\tconst key = `ICON_${name.replace(/-/g, \"_\").toUpperCase()}` as keyof typeof Icons;\n\t// biome-ignore lint/performance/noDynamicNamespaceImportAccess: dynamic icon resolution by name (matches Vue DS pattern)\n\tconst entry = Icons[key];\n\tif (Array.isArray(entry) && entry.length === 2) {\n\t\treturn { path: entry[0] as string, viewBox: entry[1] as string };\n\t}\n\t// Warn (dev only) instead of silently rendering an empty SVG — mirrors the Vue 3\n\t// DS. Gated so a published library never spams consumer production logs.\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconsole.warn(`[Icon] Icon content not found for name: ${name} (resolved to key: ${key})`);\n\t}\n\treturn { path: \"\", viewBox: \"0 0 16 16\" };\n}\n\nexport function Icon({\n\tname,\n\tsize = 20,\n\tclassName,\n\tcolor,\n\t\"aria-label\": ariaLabel,\n\t\"aria-hidden\": ariaHidden,\n\t\"data-testid\": testId,\n}: IconProps) {\n\tconst { path, viewBox } = useMemo(() => resolveIcon(name), [name]);\n\tconst isDecorative = !ariaLabel;\n\t// Only -outline / -filled icons take the color (matches the Vue 3 DS). All\n\t// other icons (bicolor, checkbox, pencil…) carry their own fills in the sprite\n\t// and must NOT receive a component-level fill or stroke — doing so repaints or\n\t// outlines them. Stroke-drawn geometry (e.g. calendar-outline) keeps its stroke\n\t// in the sprite, normalized to currentColor by generateIcons. Driving the color\n\t// via the element's CSS `color` keeps the (currentColor) fills and strokes in\n\t// sync — including when the `color` prop is set.\n\tconst applyFill = name.endsWith(\"-outline\") || name.endsWith(\"-filled\");\n\tconst tokenColor = applyFill && color ? `var(--ds-color-${color})` : undefined;\n\tconst fill = applyFill ? (tokenColor ?? \"currentColor\") : undefined;\n\n\treturn (\n\t\t<svg\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox={viewBox}\n\t\t\tfill={fill}\n\t\t\tstyle={tokenColor ? { color: tokenColor } : undefined}\n\t\t\tclassName={[styles.icon, className].filter(Boolean).join(\" \")}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-hidden={ariaHidden ?? (isDecorative ? \"true\" : undefined)}\n\t\t\trole={ariaLabel ? \"img\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: SVG content from auto-generated icons.ts (not user input)\n\t\t\tdangerouslySetInnerHTML={{ __html: path }}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n .accordion {\n display: flex;\n flex-direction: column;\n font-family: var(--font-family-base);\n color: var(--color-text);\n }\n\n /* ── Item ── */\n .item {\n border-bottom: 1px solid var(--color-border);\n\n &:first-child {\n border-top: 1px solid var(--color-border);\n }\n }\n\n /* ── Trigger ── */\n .trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--spacing-md) var(--spacing-lg);\n background: none;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: var(--font-family-base);\n font-size: var(--text-base);\n font-weight: var(--font-medium);\n color: var(--color-text);\n line-height: var(--leading-normal);\n transition: background-color var(--duration-fast) var(--ease-out);\n\n &:hover {\n background-color: var(--color-neutral-50);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n }\n }\n\n /* ── Chevron ── */\n .chevron {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-size: var(--text-base);\n color: var(--color-text-muted);\n transition: transform var(--duration-base) var(--ease-in-out);\n transform-origin: center;\n }\n\n .item[data-open] .chevron {\n transform: rotate(180deg);\n }\n\n /* ── Content panel ── */\n .content {\n /* `hidden` attribute sets display:none natively — no extra CSS needed */\n }\n\n /* ── Inner padding ── */\n .inner {\n padding: var(--spacing-sm) var(--spacing-lg) var(--spacing-lg);\n font-size: var(--text-base);\n line-height: var(--leading-relaxed);\n color: var(--color-text);\n }\n}\n","import { type ReactElement, type ReactNode, useState } from \"react\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Accordion.module.css\";\n\ninterface AccordionItem {\n\tid: string;\n\ttitle: string;\n\tcontent: ReactNode;\n\tdefaultOpen?: boolean;\n}\n\ninterface AccordionProps {\n\titems: AccordionItem[];\n\tmultiple?: boolean;\n\t\"data-testid\"?: string;\n}\n\nexport function Accordion({\n\titems,\n\tmultiple = false,\n\t\"data-testid\": testId,\n}: AccordionProps): ReactElement {\n\tconst [openIds, setOpenIds] = useState<Set<string>>(() => {\n\t\tconst defaults = items.filter((i) => i.defaultOpen).map((i) => i.id);\n\t\treturn new Set(defaults);\n\t});\n\n\tconst toggle = (id: string) => {\n\t\tsetOpenIds((prev) => {\n\t\t\tconst next = new Set(prev);\n\t\t\tif (next.has(id)) {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tif (!multiple) next.clear();\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\treturn (\n\t\t<div className={styles.accordion} data-testid={testId}>\n\t\t\t{items.map((item) => {\n\t\t\t\tconst isOpen = openIds.has(item.id);\n\t\t\t\treturn (\n\t\t\t\t\t<div key={item.id} className={styles.item} data-open={isOpen || undefined}>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tid={`accordion-trigger-${item.id}`}\n\t\t\t\t\t\t\tclassName={styles.trigger}\n\t\t\t\t\t\t\tonClick={() => toggle(item.id)}\n\t\t\t\t\t\t\taria-expanded={isOpen}\n\t\t\t\t\t\t\taria-controls={`accordion-${item.id}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span>{item.title}</span>\n\t\t\t\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<section\n\t\t\t\t\t\t\tid={`accordion-${item.id}`}\n\t\t\t\t\t\t\tclassName={styles.content}\n\t\t\t\t\t\t\taria-labelledby={`accordion-trigger-${item.id}`}\n\t\t\t\t\t\t\thidden={!isOpen}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isOpen && <div className={styles.inner}>{item.content}</div>}\n\t\t\t\t\t\t</section>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .spinner[data-size=\"small\"] {\n width: 16px;\n height: 16px;\n }\n\n .spinner[data-size=\"medium\"] {\n width: 24px;\n height: 24px;\n }\n\n .spinner[data-size=\"large\"] {\n width: 40px;\n height: 40px;\n }\n\n .track {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--ds-radius-circle);\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: spin var(--ds-duration-slow, 400ms) linear infinite;\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"small\" | \"medium\" | \"large\";\n\nexport interface SpinnerProps {\n\tsize?: SpinnerSize;\n\tlabel?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Spinner({\n\tsize = \"medium\",\n\tlabel = \"Cargando\",\n\tclassName,\n\t\"data-testid\": testId,\n}: SpinnerProps) {\n\treturn (\n\t\t<span\n\t\t\trole=\"status\"\n\t\t\taria-label={label}\n\t\t\tclassName={[styles.spinner, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<span className={styles.track} aria-hidden=\"true\" />\n\t\t</span>\n\t);\n}\n","@layer ds-components {\n .button {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-2);\n font-family: var(--ds-font-family);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-tight);\n border: none;\n border-radius: var(--ds-radius-full);\n cursor: pointer;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background-color var(--ds-duration-fast) var(--ds-ease-out),\n color var(--ds-duration-fast) var(--ds-ease-out),\n box-shadow var(--ds-duration-fast) var(--ds-ease-out),\n opacity var(--ds-duration-fast) var(--ds-ease-out);\n\n &:focus-visible {\n outline: var(--ds-focus-width) solid var(--ds-focus-color);\n outline-offset: var(--ds-focus-offset);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n /* ── Sizes (font-size + padding + height aligned with Vue3 DS btn-size-*) ── */\n .button[data-size=\"small\"] {\n padding: 0 var(--ds-space-3); /* 12px — matches spacing-md */\n font-size: var(--ds-font-size-xs); /* 12px — matches text-xs */\n min-height: 2.75rem; /* 44px — matches btn-size-small */\n }\n\n .button[data-size=\"medium\"] {\n padding: 0 var(--ds-space-4); /* 16px — matches spacing-lg */\n font-size: var(--ds-font-size-base); /* 16px — matches text-base */\n min-height: 3.75rem; /* 60px — matches btn-size-medium */\n }\n\n .button[data-size=\"large\"] {\n padding: 0 var(--ds-space-6); /* 24px — matches spacing-xl */\n /* 32px in both themes via a dedicated token. Do NOT replace with\n --ds-font-size-2xl: that's 32px only under vue3 (24px under angular-legacy). */\n font-size: var(--ds-button-font-size-lg);\n min-height: 5rem; /* 80px — matches btn-size-large */\n }\n\n /* ── Variants ── */\n .button[data-variant=\"primary\"] {\n background-color: var(--ds-color-primary);\n color: var(--ds-color-text-on-primary);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-primary-900);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-primary-900);\n transform: translateY(1px);\n }\n }\n\n .button[data-variant=\"secondary\"] {\n background-color: var(--ds-color-secondary);\n color: var(--ds-color-white, #ffffff);\n\n &:hover:not(:disabled) {\n opacity: 0.85;\n }\n\n &:active:not(:disabled) {\n opacity: 0.75;\n transform: translateY(1px);\n }\n }\n\n .button[data-variant=\"ghost\"] {\n background-color: transparent;\n color: var(--ds-color-text);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-gray-200);\n }\n }\n\n .button[data-variant=\"outline\"] {\n background-color: transparent;\n color: var(--ds-color-text);\n border: 1.5px solid var(--ds-color-border);\n\n &:hover:not(:disabled) {\n border-color: var(--ds-color-gray-400);\n background-color: var(--ds-color-gray-50);\n }\n\n &:active:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n }\n }\n\n /* ── Full width ── */\n .button[data-full-width] {\n width: 100%;\n }\n\n /* ── Loading state ── */\n .button[data-loading] {\n cursor: wait;\n }\n\n .spinnerWrap {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .content {\n display: contents;\n }\n\n .content[data-hidden] {\n visibility: hidden;\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { Spinner } from \"../Spinner\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"outline\";\nexport type ButtonSize = \"small\" | \"medium\" | \"large\";\nexport type ButtonIconPosition = \"left\" | \"right\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tvariant?: ButtonVariant;\n\tsize?: ButtonSize;\n\tloading?: boolean;\n\tfullWidth?: boolean;\n\ticon?: ReactNode;\n\ticonPosition?: ButtonIconPosition;\n\tchildren: ReactNode;\n}\n\nexport function Button({\n\tvariant = \"primary\",\n\tsize = \"medium\",\n\tloading = false,\n\tfullWidth = false,\n\ticon,\n\ticonPosition = \"left\",\n\tdisabled,\n\tchildren,\n\tclassName,\n\ttype = \"button\",\n\t...props\n}: ButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tclassName={[styles.button, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tdata-loading={loading ? \"\" : undefined}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\tdisabled={disabled || loading}\n\t\t\taria-busy={loading}\n\t\t\t{...props}\n\t\t>\n\t\t\t{loading && (\n\t\t\t\t<span className={styles.spinnerWrap} aria-hidden=\"true\">\n\t\t\t\t\t<Spinner size=\"small\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span className={styles.content} data-hidden={loading ? \"\" : undefined}>\n\t\t\t\t{icon && iconPosition === \"left\" && icon}\n\t\t\t\t{children}\n\t\t\t\t{icon && iconPosition === \"right\" && icon}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.error {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tcolor: var(--ds-color-error);\n\t}\n}\n","import { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./AppleSignInButton.module.css\";\n\nexport interface AppleSignInButtonProps {\n\tonSignIn: () => void;\n\tisPending?: boolean;\n\tisError?: boolean;\n\terror?: Error | null;\n\t\"data-testid\"?: string;\n}\n\nexport function AppleSignInButton({\n\tonSignIn,\n\tisPending = false,\n\tisError = false,\n\terror,\n\t\"data-testid\": testId,\n}: AppleSignInButtonProps) {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tfullWidth\n\t\t\t\tonClick={onSignIn}\n\t\t\t\tloading={isPending}\n\t\t\t\taria-label=\"Continuar con Apple\"\n\t\t\t>\n\t\t\t\t<Icon name=\"apple-filled\" size={18} aria-hidden=\"true\" />\n\t\t\t\tApple\n\t\t\t</Button>\n\t\t\t{isError && (\n\t\t\t\t<span role=\"alert\" className={styles.error}>\n\t\t\t\t\t{error instanceof Error ? error.message : \"Error al iniciar sesión con Apple\"}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-height: 100dvh;\n\t\tflex: 1;\n\t\twidth: 100%;\n\t\tbackground-color: var(--ds-color-white);\n\t\tbackground-image: url(\"./assets/login-background-mobile.svg\");\n\t\tbackground-position: bottom;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: 100% auto;\n\n\t\t@media (width >= 768px) {\n\t\t\tbackground-image: url(\"./assets/login-background-desktop.svg\");\n\t\t\tbackground-position: right top;\n\t\t\tbackground-size: 30% auto;\n\n\t\t\t&::before {\n\t\t\t\tcontent: \"\";\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 30%;\n\t\t\t\theight: 35%;\n\t\t\t\tbackground-image: url(\"./assets/login-background-desktop.svg\");\n\t\t\t\tbackground-size: contain;\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\ttransform: rotateZ(180deg);\n\t\t\t\tpointer-events: none;\n\t\t\t\tz-index: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t.content {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-2xl);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-lg);\n\t}\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./BackgroundWrapper.module.css\";\n\nexport interface BackgroundWrapperProps extends HTMLAttributes<HTMLDivElement> {\n\tchildren: ReactNode;\n}\n\nexport function BackgroundWrapper({ children, className, ...props }: BackgroundWrapperProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\tdata-full-bleed=\"\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className={styles.content}>{children}</div>\n\t\t</div>\n\t);\n}\n","/**\n * Utility to merge CSS class names, filtering out falsy values.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n\treturn classes.filter(Boolean).join(\" \");\n}\n","@layer ds-components {\n .badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-full);\n font-family: var(--font-family-base);\n font-weight: var(--font-medium);\n line-height: var(--leading-tight);\n white-space: nowrap;\n }\n\n /* ── Sizes ── */\n .badge[data-size=\"small\"] {\n padding: 0.125rem var(--spacing-sm);\n font-size: var(--text-xs);\n }\n\n .badge[data-size=\"medium\"] {\n padding: 0.1875rem var(--spacing-md);\n font-size: var(--text-sm);\n }\n\n /* ── Variants ── */\n .badge[data-variant=\"default\"] {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-500);\n }\n\n .badge[data-variant=\"success\"] {\n background-color: var(--color-success-light);\n color: var(--color-success-dark);\n }\n\n .badge[data-variant=\"warning\"] {\n background-color: var(--color-warning-light);\n color: var(--color-warning-dark);\n }\n\n .badge[data-variant=\"error\"] {\n background-color: var(--color-error-light);\n color: var(--color-error-dark);\n }\n\n .badge[data-variant=\"info\"] {\n background-color: var(--color-info-light);\n color: var(--color-info-dark);\n }\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type BadgeSize = \"small\" | \"medium\";\n\nexport interface BadgeProps {\n\tvariant?: BadgeVariant;\n\tsize?: BadgeSize;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Badge({\n\tvariant = \"default\",\n\tsize = \"medium\",\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: BadgeProps): React.ReactElement {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(styles.badge, className)}\n\t\t\tdata-variant={variant}\n\t\t\tdata-size={size}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n","@layer ds-components {\n\t.banner {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t.dismiss {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tmargin-inline-start: var(--ds-space-2);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t/* Static (no-motion) baseline: visible immediately, no transition. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.banner {\n\t\t\ttransition:\n\t\t\t\topacity var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\ttranslate var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t@starting-style {\n\t\t\t\topacity: 0;\n\t\t\t\ttranslate: 0 calc(-1 * var(--ds-space-2));\n\t\t\t}\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface BannerProps {\n\tvariant?: BannerVariant;\n\ticon?: IconNameType;\n\tonDismiss?: () => void;\n\tdismissLabel?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Banner({\n\tvariant = \"info\",\n\ticon,\n\tonDismiss,\n\tdismissLabel = \"Cerrar\",\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: BannerProps): React.ReactElement {\n\tconst isError = variant === \"error\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.banner, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\trole={isError ? \"alert\" : \"status\"}\n\t\t\taria-live={isError ? \"assertive\" : \"polite\"}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{icon && <Icon name={icon} size={20} aria-hidden=\"true\" />}\n\t\t\t<span className={styles.content}>{children}</span>\n\t\t\t{action && <span className={styles.action}>{action}</span>}\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.dismiss}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\taria-label={dismissLabel}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close-outline\" size={20} aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.breadcrumb {\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-snug);\n\t}\n\n\t.list {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t}\n\n\t.item {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tmin-inline-size: 0;\n\t}\n\n\t/* CSS-generated separator between items (decorative). */\n\t.item + .item::before {\n\t\tcontent: \"/\";\n\t\tcolor: var(--ds-color-text-muted);\n\t\tuser-select: none;\n\t}\n\n\t.link {\n\t\tcolor: var(--ds-color-primary);\n\t\ttext-decoration: none;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:hover {\n\t\t\ttext-decoration: underline;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t@media (prefers-reduced-motion: no-preference) {\n\t\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n\n\t.current {\n\t\tcolor: var(--ds-color-text-muted);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t}\n}\n","import type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Breadcrumb.module.css\";\n\nexport interface BreadcrumbItem {\n\tlabel: string;\n\thref?: string;\n}\n\nexport interface BreadcrumbProps {\n\titems: BreadcrumbItem[];\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Breadcrumb({\n\titems,\n\t\"aria-label\": ariaLabel = \"Breadcrumb\",\n\tclassName,\n\t\"data-testid\": testId,\n}: BreadcrumbProps): React.ReactElement | null {\n\tif (items.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst lastIndex = items.length - 1;\n\n\treturn (\n\t\t<nav aria-label={ariaLabel} className={cn(styles.breadcrumb, className)} data-testid={testId}>\n\t\t\t<ol className={styles.list}>\n\t\t\t\t{items.map((item, index) => {\n\t\t\t\t\tconst isLast = index === lastIndex;\n\t\t\t\t\tconst key = `${index}-${item.label}`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={key} className={styles.item}>\n\t\t\t\t\t\t\t{isLast || !item.href ? (\n\t\t\t\t\t\t\t\t<span className={styles.current} aria-current={isLast ? \"page\" : undefined}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<a href={item.href} className={styles.link}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ol>\n\t\t</nav>\n\t);\n}\n","@layer ds-components {\n .card {\n background-color: var(--ds-color-surface);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-xl);\n width: 100%;\n }\n\n /* ── Padding ── */\n .card[data-padding=\"none\"] {\n padding: 0;\n }\n\n .card[data-padding=\"small\"] {\n padding: var(--ds-space-4);\n }\n\n .card[data-padding=\"medium\"] {\n padding: var(--ds-space-6);\n }\n\n .card[data-padding=\"large\"] {\n padding: var(--ds-space-8);\n }\n\n /* ── Elevation ── */\n .card[data-elevation=\"none\"] {\n box-shadow: none;\n }\n\n .card[data-elevation=\"small\"] {\n box-shadow: var(--ds-shadow-sm);\n }\n\n .card[data-elevation=\"medium\"] {\n box-shadow: var(--ds-shadow-md);\n }\n\n .card[data-elevation=\"large\"] {\n box-shadow: var(--ds-shadow-lg);\n }\n\n /* ── Hoverable ── */\n .card[data-hoverable] {\n cursor: pointer;\n transition: box-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover {\n box-shadow: var(--ds-shadow-md);\n }\n }\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport styles from \"./Card.module.css\";\n\nexport type CardPadding = \"none\" | \"small\" | \"medium\" | \"large\";\nexport type CardElevation = \"none\" | \"small\" | \"medium\" | \"large\";\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n\tpadding?: CardPadding;\n\televation?: CardElevation;\n\thoverable?: boolean;\n\tmaxWidth?: string;\n\tchildren: ReactNode;\n}\n\nexport function Card({\n\tpadding = \"small\",\n\televation = \"none\",\n\thoverable = false,\n\tmaxWidth,\n\tchildren,\n\tclassName,\n\tstyle,\n\t...props\n}: CardProps) {\n\treturn (\n\t\t<section\n\t\t\tclassName={[styles.card, className].filter(Boolean).join(\" \")}\n\t\t\tdata-padding={padding}\n\t\t\tdata-elevation={elevation}\n\t\t\tdata-hoverable={hoverable ? \"\" : undefined}\n\t\t\tstyle={maxWidth ? { maxWidth, ...style } : style}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</section>\n\t);\n}\n","@layer ds-components {\n\t.chartWrapper {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t}\n\n\t.chartTitle {\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-semibold);\n\t\tcolor: var(--color-text-muted);\n\t\tmargin-bottom: var(--spacing-sm);\n\t\ttext-transform: uppercase;\n\t\tletter-spacing: 0.05em;\n\t}\n\n\t.kpiCard {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-md);\n\t\tbackground: var(--color-surface);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t}\n\n\t.kpiLabel {\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t}\n\n\t.kpiValue {\n\t\tfont-size: var(--text-2xl);\n\t\tfont-weight: var(--font-bold);\n\t\tcolor: var(--color-text);\n\t\tline-height: var(--leading-tight);\n\t}\n\n\t.kpiChange {\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t}\n\n\t.kpiChange[data-trend=\"up\"] {\n\t\tcolor: var(--color-success);\n\t}\n\n\t.kpiChange[data-trend=\"down\"] {\n\t\tcolor: var(--color-error);\n\t}\n\n\t.kpiChange[data-trend=\"neutral\"] {\n\t\tcolor: var(--color-text-muted);\n\t}\n\n\t.emptyState {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: 200px;\n\t\tcolor: var(--color-text-muted);\n\t\tfont-size: var(--text-sm);\n\t}\n}\n","import type { ReactElement } from \"react\";\nimport {\n\tArea,\n\tBar,\n\tCartesianGrid,\n\tLegend,\n\tLine,\n\tAreaChart as ReAreaChart,\n\tBarChart as ReBarChart,\n\tLineChart as ReLineChart,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from \"recharts\";\nimport styles from \"./Charts.module.css\";\n\n/* ── DS color palette: recharts stroke/fill accept only resolved colors, not CSS custom properties.\n Keep in sync with --ds-color-primary, blue-600, green-600, amber-600, violet-700, cyan-600. ── */\nconst DS_COLORS = [\n\t\"#ff4235\", // --ds-color-primary\n\t\"#2563eb\", // blue\n\t\"#16a34a\", // green\n\t\"#d97706\", // amber\n\t\"#7c3aed\", // violet\n\t\"#0891b2\", // cyan\n];\n\nexport interface ChartSeries {\n\tdataKey: string;\n\tlabel?: string;\n\tcolor?: string;\n}\n\nexport interface BaseChartProps {\n\t/** Data array — each object must have the keys referenced by series[].dataKey */\n\tdata: Record<string, unknown>[];\n\t/** X-axis data key */\n\txKey: string;\n\tseries: ChartSeries[];\n\theight?: number;\n\ttitle?: string;\n\t/** Y-axis tick formatter */\n\tformatY?: (value: number) => string;\n\t/** Tooltip value formatter */\n\tformatValue?: (value: number) => string;\n\t/** Hide recharts legend */\n\thideLegend?: boolean;\n\t\"data-testid\"?: string;\n}\n\n/* ── LineChart ── */\nexport function LineChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReLineChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => (\n\t\t\t\t\t\t<Line\n\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\tstroke={s.color ?? DS_COLORS[i % DS_COLORS.length]}\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\tdot={false}\n\t\t\t\t\t\t\tactiveDot={{ r: 4 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ReLineChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── BarChart ── */\nexport function BarChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReBarChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => (\n\t\t\t\t\t\t<Bar\n\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\tfill={s.color ?? DS_COLORS[i % DS_COLORS.length]}\n\t\t\t\t\t\t\tradius={[2, 2, 0, 0]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ReBarChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── AreaChart ── */\nexport function AreaChart({\n\tdata,\n\txKey,\n\tseries,\n\theight = 300,\n\ttitle,\n\tformatY,\n\tformatValue,\n\thideLegend,\n\t\"data-testid\": testId,\n}: BaseChartProps): ReactElement {\n\tif (!data?.length) return <div className={styles.emptyState}>Sin datos</div>;\n\n\treturn (\n\t\t<div className={styles.chartWrapper} data-testid={testId}>\n\t\t\t{title && <div className={styles.chartTitle}>{title}</div>}\n\t\t\t<ResponsiveContainer width=\"100%\" height={height}>\n\t\t\t\t<ReAreaChart data={data} margin={{ top: 4, right: 8, left: 0, bottom: 4 }}>\n\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--color-border)\" />\n\t\t\t\t\t<XAxis dataKey={xKey} tick={{ fontSize: 12 }} />\n\t\t\t\t\t<YAxis tick={{ fontSize: 12 }} tickFormatter={formatY} />\n\t\t\t\t\t<Tooltip formatter={formatValue ? (v) => formatValue(v as number) : undefined} />\n\t\t\t\t\t{!hideLegend && <Legend />}\n\t\t\t\t\t{series.map((s, i) => {\n\t\t\t\t\t\tconst color = s.color ?? DS_COLORS[i % DS_COLORS.length];\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\t\tkey={s.dataKey}\n\t\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\t\tdataKey={s.dataKey}\n\t\t\t\t\t\t\t\tname={s.label ?? s.dataKey}\n\t\t\t\t\t\t\t\tstroke={color}\n\t\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\t\tfillOpacity={0.12}\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</ReAreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n\n/* ── KpiCard ── */\nexport interface KpiCardProps {\n\tlabel: string;\n\tvalue: string | number;\n\t/** e.g. \"+12.5%\" or \"-3.2%\" */\n\tchange?: string;\n\ttrend?: \"up\" | \"down\" | \"neutral\";\n\t\"data-testid\"?: string;\n}\n\nexport function KpiCard({\n\tlabel,\n\tvalue,\n\tchange,\n\ttrend = \"neutral\",\n\t\"data-testid\": testId,\n}: KpiCardProps): ReactElement {\n\treturn (\n\t\t<div className={styles.kpiCard} data-testid={testId}>\n\t\t\t<div className={styles.kpiLabel}>{label}</div>\n\t\t\t<div className={styles.kpiValue}>{value}</div>\n\t\t\t{change && (\n\t\t\t\t<div className={styles.kpiChange} data-trend={trend}>\n\t\t\t\t\t{change}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n .checkmark {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background-color: var(--color-surface);\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-sm);\n transition:\n background-color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n }\n\n .wrapper:hover:not(:has(.input:disabled)) .checkmark {\n border-color: var(--color-neutral-400);\n }\n\n .input:checked + .checkmark {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 10' fill='none'%3E%3Cpath d='M1 5l3.5 3.5L11 1' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n background-size: 10px 8px;\n }\n\n .input:indeterminate + .checkmark {\n background-color: var(--color-primary);\n border-color: var(--color-primary);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 2' fill='none'%3E%3Cpath d='M1 1h8' stroke='%23ffffff' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: center;\n background-size: 10px 2px;\n }\n\n .input:focus-visible + .checkmark {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n }\n\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n color: var(--color-text);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Checkbox.module.css\";\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Checkbox({\n\tlabel,\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: CheckboxProps) {\n\tconst inputId =\n\t\tid ??\n\t\t`checkbox-${String(label ?? \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/\\s+/g, \"-\")}`;\n\treturn (\n\t\t<label\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\thtmlFor={inputId}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<input ref={ref} type=\"checkbox\" id={inputId} className={styles.input} {...props} />\n\t\t\t<span className={styles.checkmark} aria-hidden=\"true\" />\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-3);\n padding: var(--ds-space-12) var(--ds-space-4);\n color: var(--ds-color-text-muted);\n }\n\n .icon {\n opacity: 0.6;\n\n @media (prefers-reduced-motion: no-preference) {\n animation: ds-coming-soon-fade-in var(--ds-duration-slow) var(--ds-ease-out) both;\n }\n }\n\n .message {\n margin: 0;\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-medium);\n text-align: center;\n color: var(--ds-color-text-muted);\n }\n}\n\n@layer ds-components {\n @keyframes ds-coming-soon-fade-in {\n from {\n opacity: 0;\n transform: translateY(var(--ds-space-2));\n }\n to {\n opacity: 0.6;\n transform: translateY(0);\n }\n }\n}\n","import type React from \"react\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./ComingSoon.module.css\";\n\nexport interface ComingSoonProps {\n\tmessage?: string;\n\ticon?: IconNameType;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ComingSoon({\n\tmessage,\n\ticon = \"lock-password-1-outline\",\n\tclassName,\n\t\"data-testid\": testId,\n}: ComingSoonProps): React.ReactElement {\n\t// A default parameter only substitutes for `undefined`, not for an empty/\n\t// whitespace string — which would render a blank live region. Coalesce on\n\t// content so a falsy message still shows the placeholder text.\n\tconst resolvedMessage = message?.trim() ? message : \"Próximamente\";\n\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<Icon name={icon} size={40} aria-hidden=\"true\" className={styles.icon} />\n\t\t\t<p className={styles.message}>{resolvedMessage}</p>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-4);\n padding-block: var(--ds-space-3);\n padding-inline: var(--ds-space-4);\n cursor: default;\n\n @media (prefers-reduced-motion: no-preference) {\n transition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n }\n\n &:hover {\n background-color: var(--ds-color-gray-50);\n }\n\n &[data-divider] {\n border-block-end: thin solid var(--ds-color-border);\n }\n\n /* Purely visual — must not block interaction (the caller disables the\n control itself). No pointer-events:none, which would asymmetrically\n block pointer but not keyboard. */\n &[data-dimmed] {\n opacity: 0.5;\n }\n }\n\n .labelCol {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n flex: 1;\n min-inline-size: 0;\n }\n\n .label {\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-medium);\n color: var(--ds-color-text);\n line-height: var(--ds-leading-snug);\n }\n\n .description {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n }\n\n .controlCol {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n justify-content: flex-end;\n }\n}\n","import type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport styles from \"./ConfigRow.module.css\";\n\nexport interface ConfigRowProps {\n\tlabel: string;\n\tdescription?: string;\n\t/** The control slot — Toggle, Select, Button, etc. */\n\tchildren: ReactNode;\n\t/**\n\t * When provided the label is rendered as `<label htmlFor>`, linking it to\n\t * the control by id. The CALLER MUST put a matching `id={htmlFor}` on the\n\t * child control — ConfigRow renders `children` opaquely and cannot verify\n\t * it; without a match the label associates with nothing. Omit when the\n\t * control manages its own label.\n\t */\n\thtmlFor?: string;\n\t/**\n\t * Purely visual muted state (reduced opacity). Does NOT affect\n\t * interactivity — to disable the control, pass `disabled` to the control\n\t * inside `children` yourself.\n\t */\n\tdimmed?: boolean;\n\t/** Bottom border separator. Defaults to `true`. */\n\tdivider?: boolean;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ConfigRow({\n\tlabel,\n\tdescription,\n\tchildren,\n\thtmlFor,\n\tdimmed = false,\n\tdivider = true,\n\tclassName,\n\t\"data-testid\": testId,\n}: ConfigRowProps): React.ReactElement {\n\tconst LabelEl = htmlFor ? \"label\" : \"span\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.row, className].filter(Boolean).join(\" \")}\n\t\t\tdata-dimmed={dimmed || undefined}\n\t\t\tdata-divider={divider || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<div className={styles.labelCol}>\n\t\t\t\t<LabelEl htmlFor={htmlFor} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</LabelEl>\n\t\t\t\t{description && <span className={styles.description}>{description}</span>}\n\t\t\t</div>\n\t\t\t<div className={styles.controlCol}>{children}</div>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-md);\n\t\tbackground: var(--ds-color-white);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-md);\n\t\tpadding: var(--spacing-md);\n\t}\n\n\t.search {\n\t\twidth: 100%;\n\t\tmax-width: 320px;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-family: var(--font-family-base);\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px\n\t\t\t\tcolor-mix(in oklch, var(--color-primary) 20%, transparent);\n\t\t}\n\t}\n\n\t.tableContainer {\n\t\toverflow-x: auto;\n\t\toverflow-y: auto;\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t}\n\n\t.table {\n\t\twidth: 100%;\n\t\tborder-collapse: collapse;\n\t\tfont-size: var(--text-sm);\n\t}\n\n\t.th {\n\t\ttext-align: left;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-weight: 600;\n\t\tcolor: var(--color-neutral-400);\n\t\tbackground: var(--color-neutral-50);\n\t\tborder-bottom: 1px solid var(--color-neutral-200);\n\t\twhite-space: nowrap;\n\t\tuser-select: none;\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tz-index: 1;\n\n\t\t&[data-sortable] {\n\t\t\tcursor: pointer;\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--color-neutral-500);\n\t\t\t}\n\t\t}\n\t}\n\n\t.tr {\n\t\tborder-top: 1px solid var(--color-neutral-200);\n\t\ttransition: background var(--duration-fast) var(--ease-out);\n\n\t\t&:last-child {\n\t\t\tborder-bottom: none;\n\t\t}\n\n\t\t&:nth-child(even) {\n\t\t\tbackground: var(--color-neutral-100);\n\t\t\tborder-bottom: 1px solid var(--color-neutral-200);\n\t\t}\n\n\t\t/* biome-ignore lint/style/noDescendingSpecificity: .th and .tr are unrelated elements; no cascade conflict */\n\t\t&:hover {\n\t\t\tbackground: var(--color-tertiary);\n\t\t}\n\t\t&[data-clickable] {\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&[data-selected] {\n\t\t\tbackground: color-mix(in oklch, var(--color-primary) 6%, transparent);\n\t\t\t&:hover {\n\t\t\t\tbackground: color-mix(in oklch, var(--color-primary) 10%, transparent);\n\t\t\t}\n\t\t}\n\t}\n\n\t.td {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tcolor: var(--color-neutral-500);\n\t}\n\n\t.empty {\n\t\ttext-align: center;\n\t\tpadding: var(--spacing-2xl);\n\t\tcolor: var(--color-neutral-400);\n\t}\n\n\t.loading {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\tpadding: var(--spacing-2xl);\n\t}\n\n\t.pagination {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: var(--spacing-md);\n\t\tpadding: var(--spacing-sm) 0;\n\t}\n\n\t.pageButton {\n\t\tpadding: var(--spacing-xs) var(--spacing-md);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-base);\n\t\tfont-size: var(--text-sm);\n\t\tcursor: pointer;\n\t\ttransition: all var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground: var(--color-neutral-50);\n\t\t}\n\t\t&:disabled {\n\t\t\topacity: 0.5;\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.pageInfo {\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-neutral-400);\n\t}\n}\n","import {\n\ttype Column,\n\ttype ColumnDef,\n\tflexRender,\n\tgetCoreRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\ttype PaginationState,\n\ttype RowSelectionState,\n\ttype SortingState,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Spinner } from \"../Spinner\";\nimport styles from \"./DataTable.module.css\";\n\nfunction getAriaSortValue<T>(\n\tcolumn: Column<T, unknown>,\n): \"ascending\" | \"descending\" | \"none\" | undefined {\n\tconst sorted = column.getIsSorted();\n\tif (sorted === \"asc\") return \"ascending\";\n\tif (sorted === \"desc\") return \"descending\";\n\tif (column.getCanSort()) return \"none\";\n\treturn undefined;\n}\n\nexport interface DataTableProps<T> {\n\tdata: T[];\n\tcolumns: ColumnDef<T, unknown>[];\n\tisLoading?: boolean;\n\tloadingSlot?: ReactNode;\n\tpageSize?: number;\n\tsearchable?: boolean;\n\tsortable?: boolean;\n\tpaginated?: boolean;\n\temptyMessage?: ReactNode;\n\tsearchPlaceholder?: string;\n\tpreviousLabel?: string;\n\tnextLabel?: string;\n\tonRowClick?: (row: T) => void;\n\tselectable?: boolean;\n\tonSelectionChange?: (rows: T[]) => void;\n\tmanualPagination?: boolean;\n\tpageCount?: number;\n\t/** Wrap with useCallback in the parent to avoid redundant fetches on re-render. */\n\tonPageChange?: (pageIndex: number, pageSize: number) => void;\n\t\"data-testid\"?: string;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pagination + selection + loading branches are all load-bearing\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tisLoading = false,\n\tloadingSlot,\n\tpageSize = 20,\n\tsearchable = false,\n\tsortable = true,\n\tpaginated = true,\n\temptyMessage = \"Sin resultados\",\n\tsearchPlaceholder = \"Buscar...\",\n\tpreviousLabel = \"Anterior\",\n\tnextLabel = \"Siguiente\",\n\tonRowClick,\n\tselectable = false,\n\tonSelectionChange,\n\tmanualPagination = false,\n\tpageCount,\n\tonPageChange,\n\t\"data-testid\": testId,\n}: DataTableProps<T>): React.ReactElement {\n\tconst [sorting, setSorting] = useState<SortingState>([]);\n\tconst [globalFilter, setGlobalFilter] = useState(\"\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize,\n\t});\n\tconst [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n\n\tconst selectionColumn: ColumnDef<T, unknown> = useMemo(\n\t\t() => ({\n\t\t\tid: \"__select__\",\n\t\t\tsize: 40,\n\t\t\tenableSorting: false,\n\t\t\theader: ({ table }) => (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\t\tonChange={table.getToggleAllPageRowsSelectedHandler()}\n\t\t\t\t\taria-label=\"Select all rows\"\n\t\t\t\t/>\n\t\t\t),\n\t\t\tcell: ({ row }) => (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\tonChange={row.getToggleSelectedHandler()}\n\t\t\t\t\taria-label={`Select row ${row.index + 1}`}\n\t\t\t\t/>\n\t\t\t),\n\t\t}),\n\t\t[],\n\t);\n\n\tconst resolvedColumns = useMemo(\n\t\t() => (selectable ? [selectionColumn, ...columns] : columns),\n\t\t[selectable, columns, selectionColumn],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: resolvedColumns,\n\t\tstate: { sorting, globalFilter, pagination, rowSelection },\n\t\tonSortingChange: setSorting,\n\t\tonGlobalFilterChange: setGlobalFilter,\n\t\tonPaginationChange: setPagination,\n\t\tonRowSelectionChange: setRowSelection,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\t...(sortable ? { getSortedRowModel: getSortedRowModel() } : {}),\n\t\t...(paginated ? { getPaginationRowModel: getPaginationRowModel() } : {}),\n\t\t...(searchable ? { getFilteredRowModel: getFilteredRowModel() } : {}),\n\t\tenableRowSelection: selectable,\n\t\tmanualPagination,\n\t\tpageCount: manualPagination ? (pageCount ?? -1) : undefined,\n\t});\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: rowSelection change must trigger recompute because table.getSelectedRowModel() reads current state\n\tconst selectedRows = useMemo(\n\t\t() => (selectable ? table.getSelectedRowModel().rows.map((row) => row.original) : []),\n\t\t[selectable, table, rowSelection],\n\t);\n\n\tconst isMountedRef = useRef(false);\n\tuseEffect(() => {\n\t\tif (!isMountedRef.current) {\n\t\t\tisMountedRef.current = true;\n\t\t\treturn;\n\t\t}\n\t\tonSelectionChange?.(selectedRows);\n\t}, [selectedRows, onSelectionChange]);\n\n\tuseEffect(() => {\n\t\tif (!manualPagination || !onPageChange) return;\n\t\tonPageChange(pagination.pageIndex, pagination.pageSize);\n\t}, [pagination.pageIndex, pagination.pageSize, manualPagination, onPageChange]);\n\n\tif (isLoading) {\n\t\treturn <div className={styles.loading}>{loadingSlot ?? <Spinner size=\"large\" />}</div>;\n\t}\n\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t{searchable && (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\tvalue={globalFilter}\n\t\t\t\t\tonChange={(e) => setGlobalFilter(e.target.value)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<div className={styles.tableContainer}>\n\t\t\t\t<table className={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t\t\t<tr key={headerGroup.id}>\n\t\t\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.th}\n\t\t\t\t\t\t\t\t\t\tdata-sortable={header.column.getCanSort() || undefined}\n\t\t\t\t\t\t\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\t\t\t\t\t\t\taria-sort={getAriaSortValue(header.column)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{flexRender(header.column.columnDef.header, header.getContext())}\n\t\t\t\t\t\t\t\t\t\t{header.column.getIsSorted() === \"asc\" && \" ▲\"}\n\t\t\t\t\t\t\t\t\t\t{header.column.getIsSorted() === \"desc\" && \" ▼\"}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{table.getRowModel().rows.length === 0 ? (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td colSpan={resolvedColumns.length} className={styles.empty}>\n\t\t\t\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\ttable.getRowModel().rows.map((row) => (\n\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\tclassName={styles.tr}\n\t\t\t\t\t\t\t\t\tdata-clickable={!!onRowClick || undefined}\n\t\t\t\t\t\t\t\t\tdata-selected={row.getIsSelected() || undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => onRowClick?.(row.original)}\n\t\t\t\t\t\t\t\t\ttabIndex={onRowClick ? 0 : undefined}\n\t\t\t\t\t\t\t\t\trole={onRowClick ? \"button\" : undefined}\n\t\t\t\t\t\t\t\t\tonKeyDown={\n\t\t\t\t\t\t\t\t\t\tonRowClick\n\t\t\t\t\t\t\t\t\t\t\t? (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonRowClick(row.original);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t\t\t\t<td key={cell.id} className={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{flexRender(cell.column.columnDef.cell, cell.getContext())}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t)}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\n\t\t\t{paginated && (manualPagination ? (pageCount ?? 0) > 1 : table.getPageCount() > 1) && (\n\t\t\t\t<div className={styles.pagination}>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.pageButton}\n\t\t\t\t\t\tonClick={() => table.previousPage()}\n\t\t\t\t\t\tdisabled={!table.getCanPreviousPage()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{previousLabel}\n\t\t\t\t\t</button>\n\t\t\t\t\t<span className={styles.pageInfo}>\n\t\t\t\t\t\t{table.getState().pagination.pageIndex + 1} /{\" \"}\n\t\t\t\t\t\t{manualPagination ? (pageCount ?? \"?\") : table.getPageCount()}\n\t\t\t\t\t</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.pageButton}\n\t\t\t\t\t\tonClick={() => table.nextPage()}\n\t\t\t\t\t\tdisabled={!table.getCanNextPage()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{nextLabel}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-xs);\n\t}\n\n\t.label {\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-semibold);\n\t\tline-height: var(--leading-snug);\n\t\tcolor: var(--color-text);\n\t}\n\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t/* Normalize native date picker appearance */\n\t\tappearance: none;\n\t\t-webkit-appearance: none;\n\n\t\t&::-webkit-calendar-picker-indicator {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.6;\n\t\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t\t&:hover {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { InputHTMLAttributes, Ref } from \"react\";\nimport { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./DatePicker.module.css\";\n\nexport interface DatePickerProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\terror?: boolean;\n\tlabel?: string;\n\tref?: Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function DatePicker({\n\terror,\n\tlabel,\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: DatePickerProps) {\n\tconst generatedId = useId();\n\tconst inputId = id ?? generatedId;\n\treturn (\n\t\t<div className={cn(styles.wrapper, className)} data-testid={testId}>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={inputId} className={styles.label}>\n\t\t\t\t\t{label}\n\t\t\t\t</label>\n\t\t\t)}\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"date\"\n\t\t\t\tid={inputId}\n\t\t\t\tclassName={styles.input}\n\t\t\t\tdata-error={error || undefined}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\talign-items: flex-end;\n\t\tgap: var(--ds-space-2);\n\t}\n\n\t.field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.label {\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-semibold);\n\t\tline-height: var(--ds-leading-snug);\n\t\tcolor: var(--ds-color-text);\n\t}\n\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\tappearance: none;\n\t\t-webkit-appearance: none;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&::-webkit-calendar-picker-indicator {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.6;\n\t\t\ttransition: opacity var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t&:hover {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n\n\t.separator {\n\t\tfont-size: var(--ds-font-size-base);\n\t\tcolor: var(--ds-color-text-muted);\n\t\tpadding-bottom: var(--ds-space-2);\n\t\tflex-shrink: 0;\n\t}\n}\n","import { useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./DateRangePicker.module.css\";\n\nexport interface DateRangePickerProps {\n\tstartDate?: string;\n\tendDate?: string;\n\tonStartChange?: (date: string) => void;\n\tonEndChange?: (date: string) => void;\n\tstartLabel?: string;\n\tendLabel?: string;\n\terror?: boolean;\n\tdisabled?: boolean;\n\tminDate?: string;\n\tmaxDate?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function DateRangePicker({\n\tstartDate = \"\",\n\tendDate = \"\",\n\tonStartChange,\n\tonEndChange,\n\tstartLabel = \"Desde\",\n\tendLabel = \"Hasta\",\n\terror,\n\tdisabled,\n\tminDate,\n\tmaxDate,\n\tclassName,\n\t\"data-testid\": testId,\n}: DateRangePickerProps) {\n\tconst startId = useId();\n\tconst endId = useId();\n\n\treturn (\n\t\t<div className={cn(styles.wrapper, className)} data-testid={testId}>\n\t\t\t<div className={styles.field}>\n\t\t\t\t<label htmlFor={startId} className={styles.label}>\n\t\t\t\t\t{startLabel}\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid={startId}\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tvalue={startDate}\n\t\t\t\t\tmin={minDate}\n\t\t\t\t\tmax={endDate || maxDate}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t\tonChange={(e) => onStartChange?.(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<span className={styles.separator} aria-hidden=\"true\">\n\t\t\t\t—\n\t\t\t</span>\n\t\t\t<div className={styles.field}>\n\t\t\t\t<label htmlFor={endId} className={styles.label}>\n\t\t\t\t\t{endLabel}\n\t\t\t\t</label>\n\t\t\t\t<input\n\t\t\t\t\tid={endId}\n\t\t\t\t\ttype=\"date\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tvalue={endDate}\n\t\t\t\t\tmin={startDate || minDate}\n\t\t\t\t\tmax={maxDate}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\t\t\taria-invalid={error || undefined}\n\t\t\t\t\tonChange={(e) => onEndChange?.(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useEffect } from \"react\";\n\nexport interface UseScrollLockOptions {\n\t/**\n\t * Locking strategy.\n\t * - `\"fixed\"` (default): pins `document.body` with `position: fixed` and\n\t * restores the scroll position on release. This is Dialog's behavior —\n\t * it prevents the page from jumping when the scrollbar disappears.\n\t * - `\"overflow\"`: only sets `document.body.style.overflow = \"hidden\"`.\n\t * This is Overlay's lighter behavior.\n\t */\n\tstrategy?: \"fixed\" | \"overflow\";\n}\n\n/**\n * Locks body scroll while `lock` is true and restores the previous state on\n * cleanup (release / unmount). Internal hook — not part of the public API.\n *\n * Behavior is extracted verbatim from Dialog (`strategy: \"fixed\"`) and Overlay\n * (`strategy: \"overflow\"`) so neither consumer changes visually or behaviorally.\n */\nexport function useScrollLock(lock: boolean, options: UseScrollLockOptions = {}): void {\n\tconst { strategy = \"fixed\" } = options;\n\n\tuseEffect(() => {\n\t\tif (!lock) return;\n\n\t\tif (strategy === \"overflow\") {\n\t\t\tdocument.body.style.overflow = \"hidden\";\n\t\t\treturn () => {\n\t\t\t\tdocument.body.style.overflow = \"\";\n\t\t\t};\n\t\t}\n\n\t\tconst scrollY = window.scrollY;\n\t\tdocument.body.style.overflow = \"hidden\";\n\t\tdocument.body.style.position = \"fixed\";\n\t\tdocument.body.style.top = `-${scrollY}px`;\n\t\tdocument.body.style.width = \"100%\";\n\t\treturn () => {\n\t\t\tdocument.body.style.overflow = \"\";\n\t\t\tdocument.body.style.position = \"\";\n\t\t\tdocument.body.style.top = \"\";\n\t\t\tdocument.body.style.width = \"\";\n\t\t\twindow.scrollTo(0, scrollY);\n\t\t};\n\t}, [lock, strategy]);\n}\n","import { type RefObject, useEffect } from \"react\";\n\nconst FOCUSABLE_SELECTOR =\n\t'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Traps keyboard focus inside the referenced element while `active` is true.\n * On activation the first focusable child receives focus.\n * On deactivation focus returns to the element that was focused before the trap.\n */\nexport function useFocusTrap(ref: RefObject<HTMLElement | null>, active: boolean): void {\n\tuseEffect(() => {\n\t\tif (!active || !ref.current) return;\n\n\t\tconst container = ref.current;\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\n\t\tconst focusables = () =>\n\t\t\tArray.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n\n\t\t// Focus first element on activation\n\t\tconst first = focusables()[0];\n\t\tfirst?.focus();\n\n\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: focus trap requires Tab/Shift-Tab × first/last boundary branches\n\t\tfunction handleKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key !== \"Tab\") return;\n\n\t\t\tconst items = focusables();\n\t\t\tif (items.length === 0) return;\n\n\t\t\tconst firstItem = items[0];\n\t\t\tconst lastItem = items[items.length - 1];\n\n\t\t\tif (e.shiftKey && document.activeElement === firstItem) {\n\t\t\t\te.preventDefault();\n\t\t\t\tlastItem?.focus();\n\t\t\t} else if (!e.shiftKey && document.activeElement === lastItem) {\n\t\t\t\te.preventDefault();\n\t\t\t\tfirstItem?.focus();\n\t\t\t}\n\t\t}\n\n\t\tcontainer.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => {\n\t\t\tcontainer.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tpreviouslyFocused?.focus();\n\t\t};\n\t}, [active, ref]);\n}\n","@layer ds-components {\n\t/*\n\t * Zero-specificity baseline so any consumer-supplied className (Dialog,\n\t * Toast, UserNotification, OverlayMessage) overrides every property here. This lets\n\t * each consumer keep its exact existing look while CloseButton provides a\n\t * sane standalone default (transparent bg, min target size, focus ring).\n\t */\n\t:where(.closeButton) {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\ttransition:\n\t\t\tbackground-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tcolor var(--ds-duration-fast) var(--ds-ease-out);\n\t}\n\n\t:where(.closeButton):focus-visible {\n\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\toutline-offset: var(--ds-focus-offset);\n\t}\n}\n","import { cn } from \"../../utils/cn\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./CloseButton.module.css\";\n\nexport interface CloseButtonProps {\n\tonClick?: () => void;\n\t/** Accessible name for the dismiss button. */\n\tlabel?: string;\n\t/** Icon size in px (also drives the rendered close glyph size). */\n\tsize?: number;\n\t/** Consumer class applied alongside the zero-specificity baseline, so the\n\t * host component's exact look is preserved. */\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Internal dismiss-button primitive. NOT part of the public API — used to\n * de-duplicate the bespoke close buttons across Dialog, Toast, UserNotification and\n * OverlayMessage. Renders a single native `<button>` containing the canonical\n * `close-outline` icon.\n */\nexport function CloseButton({\n\tonClick,\n\tlabel = \"Cerrar\",\n\tsize = 20,\n\tclassName,\n\t\"data-testid\": testId,\n}: CloseButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cn(styles.closeButton, className)}\n\t\t\tonClick={onClick}\n\t\t\taria-label={label}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<Icon name=\"close-outline\" size={size} aria-hidden=\"true\" />\n\t\t</button>\n\t);\n}\n","@layer ds-components {\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ds-z-modal);\n background-color: var(--ds-color-surface-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--ds-space-4);\n animation: ds-fade-in var(--ds-duration-fast) var(--ds-ease-out);\n }\n\n .overlayBackdrop {\n position: absolute;\n inset: 0;\n background: transparent;\n border: none;\n cursor: default;\n padding: 0;\n }\n\n .dialog {\n position: relative;\n background-color: var(--ds-color-surface);\n border-radius: var(--ds-radius-xl);\n box-shadow: var(--ds-shadow-xl);\n display: flex;\n flex-direction: column;\n max-height: calc(100dvh - 2 * var(--ds-space-4));\n overflow: hidden;\n animation: ds-dialog-open var(--ds-duration-base) var(--ds-ease-spring);\n\n /* Remove default focus ring from programmatic focus */\n &:focus {\n outline: none;\n }\n\n &[data-size=\"small\"] {\n width: 100%;\n max-width: 400px;\n }\n\n &[data-size=\"medium\"] {\n width: 100%;\n max-width: 560px;\n }\n\n &[data-size=\"large\"] {\n width: 100%;\n max-width: 800px;\n }\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-3);\n padding: var(--ds-space-6) var(--ds-space-6) var(--ds-space-4);\n border-bottom: 1px solid var(--ds-color-border);\n flex-shrink: 0;\n }\n\n .title {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-xl);\n font-weight: var(--ds-font-weight-bold);\n line-height: var(--ds-leading-tight);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--ds-color-text-muted);\n border-radius: var(--ds-radius-md);\n transition:\n background-color var(--ds-duration-fast) var(--ds-ease-out),\n color var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover {\n background-color: var(--ds-color-gray-100);\n color: var(--ds-color-text);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 1px;\n }\n }\n\n .body {\n padding: var(--ds-space-6);\n overflow-y: auto;\n flex: 1;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useScrollLock } from \"../../hooks/useScrollLock\";\nimport { useFocusTrap } from \"../../utils/focusTrap\";\nimport { CloseButton } from \"../CloseButton\";\nimport styles from \"./Dialog.module.css\";\n\nexport type DialogSize = \"small\" | \"medium\" | \"large\";\n\nexport interface DialogProps {\n\topen: boolean;\n\tonClose: () => void;\n\ttitle: string;\n\tchildren: ReactNode;\n\tsize?: DialogSize;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Dialog({\n\topen,\n\tonClose,\n\ttitle,\n\tchildren,\n\tsize = \"medium\",\n\tclassName,\n\t\"data-testid\": testId,\n}: DialogProps) {\n\tconst titleId = useId();\n\tconst dialogRef = useRef<HTMLDivElement>(null);\n\n\t/* ── Lock scroll ── */\n\tuseScrollLock(open);\n\n\t/* ── Focus trap (handles focus save/restore + Tab wrapping) ── */\n\tuseFocusTrap(dialogRef, open);\n\n\t/* ── Escape key ── */\n\tuseEffect(() => {\n\t\tif (!open) return;\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => document.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [open, onClose]);\n\n\tif (!open || typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<div className={styles.overlay}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.overlayBackdrop}\n\t\t\t\tonClick={onClose}\n\t\t\t\taria-label=\"Cerrar\"\n\t\t\t\ttabIndex={-1}\n\t\t\t/>\n\n\t\t\t<div\n\t\t\t\tref={dialogRef}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={titleId}\n\t\t\t\tclassName={[styles.dialog, className].filter(Boolean).join(\" \")}\n\t\t\t\tdata-size={size}\n\t\t\t\ttabIndex={-1}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t<div className={styles.header}>\n\t\t\t\t\t<h2 id={titleId} className={styles.title}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<CloseButton\n\t\t\t\t\t\tclassName={styles.closeButton}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tlabel=\"Cerrar diálogo\"\n\t\t\t\t\t\tsize={20}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.body}>{children}</div>\n\t\t\t</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseDropdownOptions {\n\t/** Number of navigable items. Used to clamp the active index for roving keyboard nav. */\n\titemCount?: number;\n\t/** Called when an item is chosen via keyboard (Enter/Space) at the active index. */\n\tonSelectIndex?: (index: number) => void;\n\t/** Fired after the dropdown opens. */\n\tonOpen?: () => void;\n\t/** Fired after the dropdown closes (any cause: toggle, Escape, outside-click, select). */\n\tonClose?: () => void;\n\t/** When true, toggle/open are no-ops. */\n\tdisabled?: boolean;\n\t/**\n\t * When false, the document `mousedown` outside-click handler is disabled.\n\t * Defaults to true. (Some legacy components historically used `click` instead of\n\t * `mousedown`; this option lets a component skip the shared handler if it must.)\n\t */\n\tcloseOnOutsideClick?: boolean;\n}\n\nexport interface UseDropdownReturn {\n\t/** Whether the dropdown is currently open. */\n\tisOpen: boolean;\n\t/** Attach to the dropdown root: scopes outside-click detection. */\n\tcontainerRef: React.RefObject<HTMLDivElement | null>;\n\t/** Attach to the trigger: focus is returned here on Escape / close. */\n\ttriggerRef: React.RefObject<HTMLButtonElement | null>;\n\t/** Attach to the (possibly portaled) menu element: keeps it \"inside\" for outside-click detection. */\n\tmenuRef: React.RefObject<HTMLDivElement | null>;\n\t/** Index of the keyboard-active item (-1 when none). */\n\tactiveIndex: number;\n\t/** Imperatively set the keyboard-active item index. */\n\tsetActiveIndex: (index: number) => void;\n\t/** Open the dropdown (no-op when disabled). Resets active index to -1. */\n\topen: () => void;\n\t/** Close the dropdown. Resets active index to -1. Does NOT move focus. */\n\tclose: () => void;\n\t/** Close the dropdown AND return focus to the trigger. */\n\tcloseAndFocusTrigger: () => void;\n\t/** Toggle open/closed (no-op when disabled). */\n\ttoggle: () => void;\n\t/**\n\t * Roving keyboard handler modeled on DropdownButton's interaction:\n\t * - closed: Enter/Space/ArrowDown open and focus the first item\n\t * - open: ArrowDown/ArrowUp move the active index (clamped), Home/End jump to ends,\n\t * Enter/Space select the active item, Escape closes + returns focus, Tab closes.\n\t * Components that own a different keyboard model can ignore this and use the\n\t * primitives (open/close/activeIndex) directly.\n\t */\n\thandleTriggerKeyDown: (e: React.KeyboardEvent) => void;\n}\n\n/**\n * Shared, headless dropdown interaction core. Internal — NOT part of the public API.\n *\n * Models the canonical Toteat dropdown UX used by `DropdownButton` (TRM login's\n * `LanguageSelector`): open/close/toggle, document outside-click-to-close, Escape-to-close,\n * roving Arrow/Home/End keyboard navigation with an active index, Enter/Space to select,\n * and focus-return-to-trigger on close.\n *\n * Markup, ARIA, and selection semantics stay in the consuming component; this hook owns\n * only the behaviour that every dropdown shares.\n */\nexport function useDropdown(options: UseDropdownOptions = {}): UseDropdownReturn {\n\tconst {\n\t\titemCount = 0,\n\t\tonSelectIndex,\n\t\tonOpen,\n\t\tonClose,\n\t\tdisabled = false,\n\t\tcloseOnOutsideClick = true,\n\t} = options;\n\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [activeIndex, setActiveIndex] = useState(-1);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLButtonElement>(null);\n\tconst menuRef = useRef<HTMLDivElement>(null);\n\n\t// Keep callbacks in refs so the document listeners never need to re-bind on\n\t// every render (and so we don't churn the effect dependency arrays).\n\tconst onCloseRef = useRef(onClose);\n\tonCloseRef.current = onClose;\n\tconst onSelectIndexRef = useRef(onSelectIndex);\n\tonSelectIndexRef.current = onSelectIndex;\n\n\tconst open = useCallback(() => {\n\t\tif (disabled) return;\n\t\tsetIsOpen(true);\n\t\tsetActiveIndex(-1);\n\t\tonOpen?.();\n\t}, [disabled, onOpen]);\n\n\tconst close = useCallback(() => {\n\t\tsetIsOpen(false);\n\t\tsetActiveIndex(-1);\n\t\tonCloseRef.current?.();\n\t}, []);\n\n\tconst closeAndFocusTrigger = useCallback(() => {\n\t\tclose();\n\t\ttriggerRef.current?.focus();\n\t}, [close]);\n\n\tconst toggle = useCallback(() => {\n\t\tif (disabled) return;\n\t\tsetIsOpen((wasOpen) => {\n\t\t\tconst next = !wasOpen;\n\t\t\tsetActiveIndex(-1);\n\t\t\tif (next) onOpen?.();\n\t\t\telse onCloseRef.current?.();\n\t\t\treturn next;\n\t\t});\n\t}, [disabled, onOpen]);\n\n\t// Outside-click (document mousedown) closes the dropdown.\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnOutsideClick) return;\n\t\tfunction handlePointerDown(e: MouseEvent) {\n\t\t\tconst target = e.target as Node;\n\t\t\tconst insideContainer = containerRef.current?.contains(target) ?? false;\n\t\t\tconst insideMenu = menuRef.current?.contains(target) ?? false;\n\t\t\tif (insideContainer || insideMenu) return;\n\t\t\tsetIsOpen(false);\n\t\t\tsetActiveIndex(-1);\n\t\t\tonCloseRef.current?.();\n\t\t}\n\t\tdocument.addEventListener(\"mousedown\", handlePointerDown);\n\t\treturn () => document.removeEventListener(\"mousedown\", handlePointerDown);\n\t}, [isOpen, closeOnOutsideClick]);\n\n\tconst handleTriggerKeyDown = useCallback(\n\t\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: keyboard nav requires a branch per key × open/closed state\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (!isOpen) {\n\t\t\t\tif (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\topen();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? 0 : -1);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tcloseAndFocusTrigger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => Math.min(i + 1, itemCount - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? 0 : -1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetActiveIndex(itemCount > 0 ? itemCount - 1 : -1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Enter\":\n\t\t\t\tcase \" \":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (activeIndex >= 0) onSelectIndexRef.current?.(activeIndex);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Tab\":\n\t\t\t\t\tclose();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t[isOpen, itemCount, activeIndex, open, close, closeAndFocusTrigger],\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\tmenuRef,\n\t\tactiveIndex,\n\t\tsetActiveIndex,\n\t\topen,\n\t\tclose,\n\t\tcloseAndFocusTrigger,\n\t\ttoggle,\n\t\thandleTriggerKeyDown,\n\t};\n}\n","import type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function portal(children: ReactNode, container?: Element): ReturnType<typeof createPortal> {\n\treturn createPortal(children, container ?? document.body);\n}\n","@layer ds-components {\n .root {\n position: relative;\n display: inline-block;\n\n /* ── Trigger button ── */\n .trigger {\n display: flex;\n align-items: center;\n gap: 0;\n border: none;\n border-radius: var(--ds-radius-full);\n font-weight: var(--ds-font-weight-semibold);\n font-family: inherit;\n cursor: pointer;\n transition: opacity 200ms ease-in-out;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n user-select: none;\n\n &:hover:not(:disabled) {\n opacity: 0.85;\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-focus-color, var(--ds-color-primary));\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n filter: grayscale(1) opacity(0.3);\n }\n }\n\n .triggerText {\n white-space: nowrap;\n }\n\n /* Separator between text and chevron */\n .separator {\n width: 1px;\n align-self: stretch;\n }\n\n .iconWrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .root .iconWrapper svg {\n transition: transform 200ms ease-out;\n }\n\n /* ── Variants ── */\n &[data-variant=\"primary\"] {\n .trigger {\n background-color: var(--ds-color-info);\n color: var(--ds-color-white);\n }\n .separator {\n background-color: rgba(255, 255, 255, 0.3);\n }\n }\n\n &[data-variant=\"ghost\"] {\n .trigger {\n background-color: transparent;\n color: var(--ds-color-text-muted);\n border: 1px solid var(--ds-color-border);\n\n &:hover:not(:disabled) {\n background-color: var(--ds-color-gray-100);\n color: var(--ds-color-text);\n opacity: 1;\n }\n }\n .separator {\n background-color: var(--ds-color-border);\n }\n }\n\n /* ── Sizes ── */\n &[data-size=\"tiny\"] {\n .trigger {\n font-size: var(--ds-font-size-xs);\n min-height: 1.75rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-3);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-2);\n }\n .separator {\n margin: var(--ds-space-1) 0;\n }\n }\n\n &[data-size=\"small\"] {\n .trigger {\n font-size: var(--ds-font-size-sm);\n min-height: 2.25rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-3);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-2);\n }\n .separator {\n margin: var(--ds-space-1) 0;\n }\n }\n\n &[data-size=\"medium\"] {\n .trigger {\n font-size: var(--ds-font-size-base);\n min-height: 3rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-4);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-3);\n }\n .separator {\n margin: var(--ds-space-2) 0;\n }\n }\n\n &[data-size=\"large\"] {\n .trigger {\n font-size: var(--ds-font-size-lg);\n min-height: 4rem;\n }\n .triggerText {\n padding: 0 var(--ds-space-6);\n }\n .iconWrapper {\n padding: 0 var(--ds-space-4);\n }\n .separator {\n margin: var(--ds-space-2) 0;\n }\n }\n\n /* Chevron rotates when open */\n &[data-open] .iconWrapper svg {\n transform: rotate(180deg);\n }\n }\n\n /* ── Dropdown menu (portaled to document.body, position: fixed) ── */\n .menu {\n position: fixed;\n z-index: 1000;\n min-width: max-content;\n background-color: var(--ds-color-surface);\n border: 1.5px solid var(--ds-color-border);\n border-radius: var(--ds-radius-lg);\n box-shadow: var(--ds-shadow-lg);\n padding: var(--ds-space-1) 0;\n list-style: none;\n overflow: hidden;\n animation: menuEnter 150ms ease-out;\n }\n\n .menuItem {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n padding: var(--ds-space-2) var(--ds-space-4);\n font-size: var(--ds-font-size-sm);\n font-family: inherit;\n text-align: left;\n background: none;\n cursor: pointer;\n color: var(--ds-color-text);\n transition: background-color 150ms ease-in-out;\n white-space: nowrap;\n\n &:hover:not([data-disabled]) {\n background-color: var(--ds-color-gray-100);\n }\n\n &[data-disabled] {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n &[data-focused] {\n background-color: var(--ds-color-gray-100);\n }\n }\n\n .menuIcon {\n flex-shrink: 0;\n }\n\n .menuLabel {\n flex: 1;\n }\n\n @keyframes menuEnter {\n from {\n opacity: 0;\n transform: scaleY(0.95) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scaleY(1) translateY(0);\n }\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport { cn } from \"../../utils/cn\";\nimport { portal } from \"../../utils/portal\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./DropdownButton.module.css\";\n\nexport interface DropdownMenuItemType {\n\tvalue: string;\n\tlabel: string;\n\ticon?: IconNameType;\n\tdisabled?: boolean;\n}\n\nexport interface DropdownButtonProps {\n\ttext: string;\n\tmenuItems: DropdownMenuItemType[];\n\tsize?: \"tiny\" | \"small\" | \"medium\" | \"large\";\n\tvariant?: \"primary\" | \"ghost\";\n\tdisabled?: boolean;\n\tonSelect?: (item: DropdownMenuItemType) => void;\n\tonOpen?: () => void;\n\tonClose?: () => void;\n\t\"data-testid\"?: string;\n}\n\nconst ICON_SIZE: Record<NonNullable<DropdownButtonProps[\"size\"]>, number> = {\n\ttiny: 14,\n\tsmall: 16,\n\tmedium: 20,\n\tlarge: 24,\n};\n\n/** Gap between trigger bottom and menu top (px). */\nconst MENU_GAP = 4;\n\n/** Minimum clearance between menu edge and viewport edge (px). */\nconst VIEWPORT_GUTTER = 8;\n\ninterface TriggerRect {\n\ttop: number;\n\tbottom: number;\n\tleft: number;\n\twidth: number;\n}\n\ninterface MenuSize {\n\twidth: number;\n\theight: number;\n}\n\ninterface ViewportSize {\n\twidth: number;\n\theight: number;\n}\n\ninterface MenuPosition {\n\ttop: number;\n\tleft: number;\n\tplacement: \"top\" | \"bottom\";\n}\n\n/**\n * Compute fixed viewport-aware position for the portaled menu.\n * Exported for unit tests: placement values (\"top\"/\"bottom\") are written to\n * the menu's data-placement attribute and drive the CSS enter animation direction.\n */\nexport function computeMenuPosition(\n\ttrigger: TriggerRect,\n\tmenu: MenuSize,\n\tviewport: ViewportSize,\n): MenuPosition {\n\t// Prefer above (top); flip to below (bottom) only when there isn't room above.\n\tconst fitsAbove = trigger.top - MENU_GAP - menu.height >= VIEWPORT_GUTTER;\n\tconst fitsBelow = trigger.bottom + MENU_GAP + menu.height <= viewport.height - VIEWPORT_GUTTER;\n\tconst placement: \"top\" | \"bottom\" = fitsAbove || !fitsBelow ? \"top\" : \"bottom\";\n\n\tconst top =\n\t\tplacement === \"top\" ? trigger.top - MENU_GAP - menu.height : trigger.bottom + MENU_GAP;\n\n\tconst centeredLeft = trigger.left + trigger.width / 2 - menu.width / 2;\n\tconst maxLeft = viewport.width - VIEWPORT_GUTTER - menu.width;\n\tconst left = Math.max(VIEWPORT_GUTTER, Math.min(centeredLeft, maxLeft));\n\n\treturn { top, left, placement };\n}\n\nexport function DropdownButton({\n\ttext,\n\tmenuItems,\n\tsize = \"medium\",\n\tvariant = \"primary\",\n\tdisabled = false,\n\tonSelect,\n\tonOpen,\n\tonClose,\n\t\"data-testid\": testId,\n}: DropdownButtonProps) {\n\tfunction selectItem(item: DropdownMenuItemType) {\n\t\tif (item.disabled) return;\n\t\tonSelect?.(item);\n\t\tclose();\n\t}\n\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef: buttonRef,\n\t\tmenuRef,\n\t\tactiveIndex: focusedIndex,\n\t\tclose,\n\t\ttoggle,\n\t\thandleTriggerKeyDown: handleKeyDown,\n\t} = useDropdown({\n\t\titemCount: menuItems.length,\n\t\tdisabled,\n\t\tonOpen,\n\t\tonClose,\n\t\tonSelectIndex: (index) => {\n\t\t\tconst item = menuItems[index];\n\t\t\tif (item && !item.disabled) selectItem(item);\n\t\t},\n\t});\n\n\tconst [menuPos, setMenuPos] = useState<{\n\t\ttop: number;\n\t\tleft: number;\n\t\tplacement: \"top\" | \"bottom\";\n\t} | null>(null);\n\tconst [menuTheme, setMenuTheme] = useState<string | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetMenuPos(null);\n\t\t\treturn;\n\t\t}\n\n\t\tconst theme = buttonRef.current?.closest<HTMLElement>(\"[data-theme]\")?.dataset.theme;\n\t\tsetMenuTheme(theme);\n\n\t\tfunction measure() {\n\t\t\tconst triggerEl = buttonRef.current;\n\t\t\tconst menuEl = menuRef.current;\n\t\t\tif (!triggerEl || !menuEl) return;\n\n\t\t\tconst triggerRect = triggerEl.getBoundingClientRect();\n\n\t\t\tconst pos = computeMenuPosition(\n\t\t\t\t{\n\t\t\t\t\ttop: triggerRect.top,\n\t\t\t\t\tbottom: triggerRect.bottom,\n\t\t\t\t\tleft: triggerRect.left,\n\t\t\t\t\twidth: triggerRect.width,\n\t\t\t\t},\n\t\t\t\t// Use offsetWidth/offsetHeight (layout size) instead of getBoundingClientRect\n\t\t\t\t// so the CSS scaleY transform on the menuEnter keyframe doesn't skew measurements.\n\t\t\t\t{ width: menuEl.offsetWidth, height: menuEl.offsetHeight },\n\t\t\t\t{ width: window.innerWidth, height: window.innerHeight },\n\t\t\t);\n\n\t\t\tsetMenuPos(pos);\n\t\t}\n\n\t\t// First measure (menu just mounted, visibility:hidden).\n\t\tmeasure();\n\n\t\twindow.addEventListener(\"scroll\", measure, { capture: true, passive: true });\n\t\twindow.addEventListener(\"resize\", measure, { passive: true });\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"scroll\", measure, { capture: true });\n\t\t\twindow.removeEventListener(\"resize\", measure);\n\t\t};\n\t}, [isOpen, buttonRef, menuRef]);\n\n\tconst iconSize = ICON_SIZE[size];\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.root}\n\t\t\tdata-size={size}\n\t\t\tdata-variant={variant}\n\t\t\tdata-open={isOpen || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={buttonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\tonClick={toggle}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t>\n\t\t\t\t<span className={styles.triggerText}>{text}</span>\n\t\t\t\t<span className={styles.separator} aria-hidden=\"true\" />\n\t\t\t\t<span className={styles.iconWrapper}>\n\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={iconSize} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t{isOpen &&\n\t\t\t\tportal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={menuRef}\n\t\t\t\t\t\tclassName={cn(\"tot-ds-root\", styles.menu)}\n\t\t\t\t\t\tdata-theme={menuTheme || undefined}\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\taria-label={`${text} options`}\n\t\t\t\t\t\tdata-placement={menuPos?.placement ?? \"top\"}\n\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\tmenuPos\n\t\t\t\t\t\t\t\t? { top: menuPos.top, left: menuPos.left, visibility: \"visible\" }\n\t\t\t\t\t\t\t\t: { visibility: \"hidden\" }\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{menuItems.map((item, index) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={item.value}\n\t\t\t\t\t\t\t\tclassName={styles.menuItem}\n\t\t\t\t\t\t\t\tdata-focused={focusedIndex === index || undefined}\n\t\t\t\t\t\t\t\tdata-disabled={item.disabled || undefined}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={false}\n\t\t\t\t\t\t\t\ttabIndex={isOpen ? 0 : -1}\n\t\t\t\t\t\t\t\tonClick={() => selectItem(item)}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tselectItem(item);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.icon && (\n\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\tname={item.icon}\n\t\t\t\t\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.menuIcon}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className={styles.menuLabel}>{item.label}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>,\n\t\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n\n\t/* ── Trigger wrapper (accessible button) ── */\n\t.triggerWrapper {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tcolor: inherit;\n\t}\n\n\t/* ── Menu panel ── */\n\t.menu {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tz-index: var(--z-dropdown);\n\t\tmin-width: 160px;\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\toverflow: hidden;\n\t\tpadding: var(--spacing-xs) 0;\n\t}\n\n\t/* ── Alignment ── */\n\t.menu[data-align=\"left\"] {\n\t\tleft: 0;\n\t}\n\n\t.menu[data-align=\"right\"] {\n\t\tright: 0;\n\t}\n\n\t/* ── Menu items ── */\n\t.menuItem {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tbackground: none;\n\t\tborder: none;\n\t\ttext-align: left;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-normal);\n\t\tcolor: var(--color-text);\n\t\tcursor: pointer;\n\t\tline-height: var(--leading-normal);\n\t\twhite-space: nowrap;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t/* ── Danger variant ── */\n\t.menuItem[data-danger] {\n\t\tcolor: var(--color-error);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-error-light);\n\t\t}\n\t}\n\n\t/* ── Icon slot ── */\n\t.icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 16px;\n\t\theight: 16px;\n\t\tcolor: inherit;\n\t}\n}\n","import { type ReactElement, type ReactNode, useEffect, useRef } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport styles from \"./DropdownMenu.module.css\";\n\nexport interface DropdownMenuItem {\n\tid: string;\n\tlabel: string;\n\ticon?: ReactNode;\n\tonClick: () => void;\n\tdanger?: boolean;\n\tdisabled?: boolean;\n}\n\nexport interface DropdownMenuProps {\n\ttrigger: ReactNode;\n\titems: DropdownMenuItem[];\n\talign?: \"left\" | \"right\";\n\t\"data-testid\"?: string;\n}\n\nexport function DropdownMenu({\n\ttrigger,\n\titems,\n\talign = \"left\",\n\t\"data-testid\": testId,\n}: DropdownMenuProps): ReactElement {\n\tconst itemRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n\t// Shared dropdown core: open state, outside-click (mousedown), focus-return-to-trigger.\n\t// DropdownMenu keeps its own DOM-focus roving keyboard model (real focus on each\n\t// <menuitem> with wrap-around + Home/End), so the hook's active-index nav is unused here.\n\tconst { isOpen, containerRef, triggerRef, toggle, close, closeAndFocusTrigger } = useDropdown();\n\n\t// Focus first enabled item when menu opens\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst firstEnabled = items.find((item) => !item.disabled);\n\t\tif (firstEnabled) itemRefs.current.get(firstEnabled.id)?.focus();\n\t}, [isOpen, items]);\n\n\t// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: keyboard nav requires a branch per key\n\tconst handleMenuKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"Escape\") {\n\t\t\te.preventDefault();\n\t\t\tcloseAndFocusTrigger();\n\t\t\treturn;\n\t\t}\n\n\t\tconst enabledItems = items.filter((item) => !item.disabled);\n\t\tconst enabledIds = enabledItems.map((item) => item.id);\n\t\tconst focused = document.activeElement as HTMLButtonElement;\n\t\tconst focusedId = [...itemRefs.current.entries()].find(([, el]) => el === focused)?.[0];\n\t\tconst currentIndex = focusedId ? enabledIds.indexOf(focusedId) : -1;\n\n\t\tlet targetId: string | undefined;\n\t\tif (e.key === \"ArrowDown\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentIndex + 1) % enabledIds.length];\n\t\t} else if (e.key === \"ArrowUp\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentIndex - 1 + enabledIds.length) % enabledIds.length];\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[0];\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[enabledIds.length - 1];\n\t\t}\n\n\t\tif (targetId) itemRefs.current.get(targetId)?.focus();\n\t};\n\n\treturn (\n\t\t<div ref={containerRef} className={styles.container} data-testid={testId}>\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.triggerWrapper}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t>\n\t\t\t\t{trigger}\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div className={styles.menu} data-align={align} role=\"menu\" onKeyDown={handleMenuKeyDown}>\n\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(item.id, el);\n\t\t\t\t\t\t\t\telse itemRefs.current.delete(item.id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t\t\tclassName={styles.menuItem}\n\t\t\t\t\t\t\tdata-danger={item.danger || undefined}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\titem.onClick();\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.icon && <span className={styles.icon}>{item.icon}</span>}\n\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .skeleton {\n display: block;\n background: linear-gradient(\n 90deg,\n var(--ds-color-gray-100) 25%,\n var(--ds-color-gray-200) 50%,\n var(--ds-color-gray-100) 75%\n );\n background-size: 200% 100%;\n animation: ds-skeleton-shimmer 1.5s ease-in-out infinite;\n }\n\n .skeleton[data-variant=\"text\"] {\n height: 1em;\n border-radius: var(--ds-radius-sm);\n\n &:not([style*=\"width\"]) {\n width: 100%;\n }\n }\n\n .skeleton[data-variant=\"circular\"] {\n border-radius: var(--ds-radius-circle);\n }\n\n .skeleton[data-variant=\"rectangular\"] {\n border-radius: var(--ds-radius-md);\n }\n}\n","import styles from \"./Skeleton.module.css\";\n\nexport type SkeletonVariant = \"text\" | \"circular\" | \"rectangular\";\n\nexport interface SkeletonProps {\n\twidth?: string | number;\n\theight?: string | number;\n\tvariant?: SkeletonVariant;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nfunction toCssValue(val: string | number | undefined): string | undefined {\n\tif (val === undefined) return undefined;\n\treturn typeof val === \"number\" ? `${val}px` : val;\n}\n\nexport function Skeleton({\n\twidth,\n\theight,\n\tvariant = \"rectangular\",\n\tclassName,\n\t\"data-testid\": testId,\n}: SkeletonProps) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={[styles.skeleton, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\tdata-testid={testId}\n\t\t\tstyle={{\n\t\t\t\twidth: toCssValue(width),\n\t\t\t\theight: toCssValue(height),\n\t\t\t}}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t.imagePreview {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground-color: var(--color-neutral-100);\n\t\toverflow: hidden;\n\t\tflex-shrink: 0;\n\t\twidth: var(--ip-width, 40px);\n\t\theight: var(--ip-height, 40px);\n\t\tborder-radius: var(--ip-radius, 8px);\n\n\t\t& img {\n\t\t\tobject-fit: cover;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\t}\n\n\t.hidden {\n\t\topacity: 0;\n\t\tposition: absolute;\n\t\tpointer-events: none;\n\t}\n\n\t.errorIcon {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcolor: var(--color-neutral-300);\n\t}\n}\n","import { useEffect, useState } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\nimport styles from \"./ImagePreview.module.css\";\n\nexport interface ImagePreviewProps {\n\timageSrc: string;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n\tborderRadius?: number;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\ntype LoadState = \"loading\" | \"loaded\" | \"error\";\n\nfunction isBase64Image(src: string): boolean {\n\treturn src.startsWith(\"data:image/\");\n}\n\nfunction isValidUrl(src: string): boolean {\n\ttry {\n\t\tnew URL(src);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function ImagePreview({\n\timageSrc,\n\twidth = 40,\n\theight = 40,\n\talt = \"Image without alt text\",\n\tborderRadius = 8,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: ImagePreviewProps) {\n\tconst [state, setState] = useState<LoadState>(() => (!imageSrc ? \"error\" : \"loading\"));\n\n\tuseEffect(() => {\n\t\tif (!imageSrc) {\n\t\t\tsetState(\"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isBase64Image(imageSrc) && !isValidUrl(imageSrc)) {\n\t\t\tsetState(\"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (isBase64Image(imageSrc)) {\n\t\t\tsetState(\"loaded\");\n\t\t\treturn;\n\t\t}\n\n\t\tsetState(\"loading\");\n\t\tconst img = new Image();\n\t\timg.onload = () => setState(\"loaded\");\n\t\timg.onerror = () => setState(\"error\");\n\t\timg.src = imageSrc;\n\t\treturn () => {\n\t\t\timg.onload = null;\n\t\t\timg.onerror = null;\n\t\t};\n\t}, [imageSrc]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.imagePreview, className].filter(Boolean).join(\" \")}\n\t\t\tdata-state={state}\n\t\t\tdata-testid={dataTestId}\n\t\t\trole={state === \"error\" ? \"img\" : undefined}\n\t\t\taria-label={state === \"error\" ? \"Image failed to load\" : undefined}\n\t\t\tstyle={\n\t\t\t\t{\n\t\t\t\t\t\"--ip-width\": `${width}px`,\n\t\t\t\t\t\"--ip-height\": `${height}px`,\n\t\t\t\t\t\"--ip-radius\": `${borderRadius}px`,\n\t\t\t\t} as React.CSSProperties\n\t\t\t}\n\t\t>\n\t\t\t{state !== \"error\" && (\n\t\t\t\t<img\n\t\t\t\t\tsrc={imageSrc}\n\t\t\t\t\talt={alt}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\tloading={isBase64Image(imageSrc) ? undefined : \"lazy\"}\n\t\t\t\t\tclassName={state === \"loading\" ? styles.hidden : undefined}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{state === \"loading\" && <Skeleton width={width} height={height} />}\n\t\t\t{state === \"error\" && (\n\t\t\t\t<span className={styles.errorIcon}>\n\t\t\t\t\t<Icon name=\"error-outline\" size={Math.round(width * 0.6)} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-2xl);\n\t\twidth: 100%;\n\t}\n\n\t.previewGrid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(auto-fill, minmax(70px, 1fr));\n\t\tgap: var(--spacing-xl);\n\t\twidth: 100%;\n\t\tjustify-items: center;\n\t}\n\n\t.previewBtn {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-xs) 0.125rem 0.5rem;\n\t\tborder: none;\n\t\tborder-radius: var(--radius-lg);\n\t\tbackground-color: transparent;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tbackground-color var(--duration-fast) var(--ease-out),\n\t\t\ttransform var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t\ttransform: scale(1.25);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t.zone {\n\t\tborder: 0.125rem dashed var(--color-neutral-300);\n\t\tborder-radius: var(--radius-lg);\n\t\tpadding: var(--spacing-2xl);\n\t\ttext-align: center;\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast),\n\t\t\tbackground var(--duration-fast),\n\t\t\topacity var(--duration-fast);\n\t\tbackground: var(--color-neutral-100);\n\t\toutline: none;\n\t\twidth: 100%;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t&:hover {\n\t\t\topacity: 0.5;\n\t\t}\n\n\t\t&[data-dragging] {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbackground: var(--color-primary-50);\n\t\t}\n\n\t\t&[data-processing] {\n\t\t\topacity: 0.6;\n\t\t\tcursor: wait;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 2px;\n\t\t}\n\t}\n\n\t.input {\n\t\tdisplay: none;\n\t}\n\n\t.zoneLabel {\n\t\tdisplay: block;\n\t\tmargin-top: var(--spacing-sm);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-secondary);\n\t}\n\n\t.description {\n\t\tfont-size: var(--text-xs);\n\t\tcolor: var(--color-neutral-400);\n\t\tmargin: 0;\n\t}\n\n\t.fileList {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\tgap: var(--spacing-sm);\n\t\twidth: 100%;\n\t}\n}\n","export type AllowedFileTypes = \"images\" | \"video\" | \"text\" | \"spreadsheet\";\n\nexport const ALLOWED_TYPES_MAP: Record<AllowedFileTypes, { types: string[]; mimeTypes: string[] }> =\n\t{\n\t\timages: {\n\t\t\ttypes: [\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"heif\"],\n\t\t\tmimeTypes: [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\", \"image/heic\", \"image/heif\"],\n\t\t},\n\t\tvideo: {\n\t\t\ttypes: [\"mp4\", \"mov\", \"webm\"],\n\t\t\tmimeTypes: [\"video/mp4\", \"video/quicktime\", \"video/webm\"],\n\t\t},\n\t\ttext: {\n\t\t\ttypes: [\"csv\"],\n\t\t\tmimeTypes: [\"text/csv\", \"text/plain\"],\n\t\t},\n\t\tspreadsheet: {\n\t\t\ttypes: [\"xls\", \"xlsx\"],\n\t\t\tmimeTypes: [\n\t\t\t\t\"application/vnd.ms-excel\",\n\t\t\t\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n\t\t\t],\n\t\t},\n\t};\n\nexport function getAllowedMimeTypes(fileType: AllowedFileTypes): string {\n\treturn ALLOWED_TYPES_MAP[fileType].mimeTypes.join(\",\");\n}\n\nexport function validateFiles(files: FileList, allowedFileTypes: AllowedFileTypes): File[] {\n\tconst { types, mimeTypes } = ALLOWED_TYPES_MAP[allowedFileTypes];\n\treturn Array.from(files).filter((file) => {\n\t\tconst mimeMatch = mimeTypes.some((m) => file.type === m);\n\t\tconst extMatch = types.some((t) => file.name.toLowerCase().endsWith(`.${t}`));\n\t\treturn mimeMatch || extMatch;\n\t});\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { ImagePreview } from \"../ImagePreview\";\nimport styles from \"./DropZone.module.css\";\nimport type { AllowedFileTypes } from \"./dropZoneConstants\";\nimport { ALLOWED_TYPES_MAP, getAllowedMimeTypes, validateFiles } from \"./dropZoneConstants\";\n\nexport interface FileWithPreview {\n\tid: string;\n\tfile: File;\n\tname: string;\n\tpreview: string;\n}\n\nexport interface DropZoneProps {\n\tlabel?: string;\n\tallowedFileTypes?: AllowedFileTypes;\n\tmultiple?: boolean;\n\tdisplayPreview?: boolean;\n\tdisplayFileList?: boolean;\n\tvalue?: FileWithPreview[] | null;\n\tonDrop: (files: FileList) => void;\n\tonDropError?: (message: string) => void;\n\tonRemove?: (file: FileWithPreview) => void;\n\tonChange?: (files: FileWithPreview[]) => void;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nasync function buildPreview(file: File, isImage: boolean): Promise<string> {\n\tif (!isImage) return \"\";\n\treturn new Promise((resolve) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = (e) => resolve((e.target?.result as string) ?? \"\");\n\t\treader.readAsDataURL(file);\n\t});\n}\n\nasync function buildFileEntries(valid: File[], isImage: boolean): Promise<FileWithPreview[]> {\n\treturn Promise.all(\n\t\tvalid.map(async (file) => ({\n\t\t\tid: crypto.randomUUID(),\n\t\t\tfile,\n\t\t\tname: file.name,\n\t\t\tpreview: await buildPreview(file, isImage),\n\t\t})),\n\t);\n}\n\nexport function DropZone({\n\tlabel = \"Haz click o arrastra un archivo para subir\",\n\tallowedFileTypes = \"images\",\n\tmultiple = true,\n\tdisplayPreview = true,\n\tdisplayFileList = false,\n\tvalue,\n\tonDrop,\n\tonDropError,\n\tonRemove,\n\tonChange,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: DropZoneProps) {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [isProcessing, setIsProcessing] = useState(false);\n\tconst [internalFiles, setInternalFiles] = useState<FileWithPreview[]>(value ?? []);\n\n\tuseEffect(() => {\n\t\tif (value !== undefined) setInternalFiles(value ?? []);\n\t}, [value]);\n\n\tconst files = value !== undefined ? (value ?? []) : internalFiles;\n\tconst showFileList =\n\t\t(displayFileList || (!displayPreview && !displayFileList)) && files.length > 0;\n\tconst extensions = ALLOWED_TYPES_MAP[allowedFileTypes].types;\n\tconst mimeAccept = getAllowedMimeTypes(allowedFileTypes);\n\tconst isImageType = allowedFileTypes === \"images\";\n\n\tasync function applyFiles(valid: File[], list: FileList) {\n\t\tif (valid.length === 0) {\n\t\t\tonDropError?.(`No files match the allowed types: ${allowedFileTypes}`);\n\t\t\treturn;\n\t\t}\n\t\tconst processed = await buildFileEntries(valid, isImageType);\n\t\tconst next = multiple ? [...files, ...processed] : processed;\n\t\tif (value === undefined) setInternalFiles(next);\n\t\tonChange?.(next);\n\t\tonDrop(list);\n\t}\n\n\tasync function processFiles(list: FileList) {\n\t\tif (isProcessing) return;\n\t\tsetIsProcessing(true);\n\t\ttry {\n\t\t\tawait applyFiles(validateFiles(list, allowedFileTypes), list);\n\t\t} catch (err) {\n\t\t\tonDropError?.(err instanceof Error ? err.message : \"Unknown error\");\n\t\t} finally {\n\t\t\tsetIsProcessing(false);\n\t\t}\n\t}\n\n\tfunction removeFile(index: number) {\n\t\tconst removed = files[index];\n\t\tconst next = files.filter((_, i) => i !== index);\n\t\tif (value === undefined) setInternalFiles(next);\n\t\tonChange?.(next);\n\t\tif (removed) onRemove?.(removed);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.container, className].filter(Boolean).join(\" \")}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t{displayPreview && files.length > 0 && (\n\t\t\t\t<div className={styles.previewGrid}>\n\t\t\t\t\t{files.map((f, i) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={f.id}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={styles.previewBtn}\n\t\t\t\t\t\t\tonClick={() => removeFile(i)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ImagePreview\n\t\t\t\t\t\t\t\timageSrc={f.preview}\n\t\t\t\t\t\t\t\twidth={70}\n\t\t\t\t\t\t\t\theight={70}\n\t\t\t\t\t\t\t\tborderRadius={8}\n\t\t\t\t\t\t\t\talt={f.name}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Icon name=\"delete-outline\" size={14} aria-hidden=\"true\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.zone}\n\t\t\t\tdata-dragging={isDragging ? \"\" : undefined}\n\t\t\t\tdata-processing={isProcessing ? \"\" : undefined}\n\t\t\t\taria-label={label}\n\t\t\t\tonClick={() => inputRef.current?.click()}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === \"Enter\" || e.key === \" \") inputRef.current?.click();\n\t\t\t\t}}\n\t\t\t\tonDragOver={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}}\n\t\t\t\tonDragLeave={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(false);\n\t\t\t\t}}\n\t\t\t\tonDrop={async (e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetIsDragging(false);\n\t\t\t\t\tconst dropped = e.dataTransfer?.files;\n\t\t\t\t\tif (dropped?.length) await processFiles(dropped);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Icon name=\"cloud-upload-outline\" size={48} aria-hidden=\"true\" />\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\tclassName={styles.input}\n\t\t\t\t\tmultiple={multiple}\n\t\t\t\t\taccept={mimeAccept}\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tonChange={async (e) => {\n\t\t\t\t\t\tconst list = e.target.files;\n\t\t\t\t\t\tif (list?.length) await processFiles(list);\n\t\t\t\t\t\te.target.value = \"\";\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<strong className={styles.zoneLabel}>{label}</strong>\n\t\t\t\t<p className={styles.description}>({extensions.join(\", \")})</p>\n\t\t\t</button>\n\n\t\t\t{showFileList && (\n\t\t\t\t<div className={styles.fileList}>\n\t\t\t\t\t{files.map((f, i) => (\n\t\t\t\t\t\t<Button key={f.id} variant=\"outline\" size=\"small\" onClick={() => removeFile(i)}>\n\t\t\t\t\t\t\t{f.name}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport type DsTheme = \"toteat-react-ds\" | \"angular-legacy\";\n\nexport interface DsProviderProps {\n\ttheme: DsTheme;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function DsProvider({ theme, children, className, \"data-testid\": testId }: DsProviderProps) {\n\treturn (\n\t\t<div className={cn(\"tot-ds-root\", className)} data-theme={theme} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n",".wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-3);\n padding: var(--ds-space-8) var(--ds-space-4);\n color: var(--ds-color-text-muted);\n}\n\n.message {\n margin: 0;\n font-size: var(--ds-font-size-sm);\n text-align: center;\n}\n","import type React from \"react\";\nimport styles from \"./EmptyState.module.css\";\n\nexport interface EmptyStateProps {\n\tmessage: string;\n\taction?: React.ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function EmptyState({\n\tmessage,\n\taction,\n\t\"data-testid\": testId,\n}: EmptyStateProps): React.ReactElement {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<p className={styles.message}>{message}</p>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .errorContainer {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n padding: var(--ds-space-6);\n }\n\n .errorCard {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-3);\n max-width: 480px;\n text-align: center;\n }\n\n .icon {\n color: var(--ds-color-error);\n flex-shrink: 0;\n }\n\n .title {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-xl);\n font-weight: var(--ds-font-weight-bold);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .message {\n font-size: var(--ds-font-size-base);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin: 0;\n }\n\n .details {\n width: 100%;\n text-align: left;\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n\n summary {\n cursor: pointer;\n font-weight: var(--ds-font-weight-medium);\n padding: var(--ds-space-1) 0;\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n }\n }\n\n .stack {\n margin-top: var(--ds-space-2);\n padding: var(--ds-space-3);\n background-color: var(--ds-color-gray-50);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-md);\n font-size: var(--ds-font-size-xs);\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--ds-color-error);\n }\n\n .retryButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--ds-space-2) var(--ds-space-6);\n background-color: var(--ds-color-primary);\n color: var(--ds-color-text-on-primary);\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-base);\n font-weight: var(--ds-font-weight-semibold);\n border: none;\n border-radius: var(--ds-radius-md);\n cursor: pointer;\n transition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n margin-top: var(--ds-space-2);\n\n &:hover {\n background-color: var(--ds-color-primary-900);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n }\n}\n","/// <reference types=\"node\" />\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport { Component } from \"react\";\nimport styles from \"./ErrorBoundary.module.css\";\n\nexport interface ErrorBoundaryProps {\n\tchildren: ReactNode;\n\tfallback?: ReactNode | ((error: Error, retry: () => void) => ReactNode);\n\tonError?: (error: Error, info: ErrorInfo) => void;\n\t\"data-testid\"?: string;\n}\n\ninterface ErrorBoundaryState {\n\thasError: boolean;\n\terror: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\tcomponentDidCatch(error: Error, info: ErrorInfo) {\n\t\tthis.props.onError?.(error, info);\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tconsole.error(\"[ErrorBoundary] Uncaught error:\", error, info);\n\t\t}\n\t}\n\n\thandleRetry = () => {\n\t\tthis.setState({ hasError: false, error: null });\n\t};\n\n\trender() {\n\t\tconst { hasError, error } = this.state;\n\t\tconst { children, fallback } = this.props;\n\t\tconst testId = this.props[\"data-testid\"];\n\n\t\tif (hasError && error) {\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(error, this.handleRetry);\n\t\t\t}\n\n\t\t\tif (fallback) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<div role=\"alert\" className={styles.errorContainer} data-testid={testId}>\n\t\t\t\t\t<div className={styles.errorCard}>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"48\"\n\t\t\t\t\t\t\theight=\"48\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tclassName={styles.icon}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path 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-3Z\" />\n\t\t\t\t\t\t\t<path d=\"M12 9v4\" />\n\t\t\t\t\t\t\t<path d=\"M12 17h.01\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<h2 className={styles.title}>Algo salió mal</h2>\n\t\t\t\t\t\t<p className={styles.message}>\n\t\t\t\t\t\t\tHa ocurrido un error inesperado. Por favor intenta de nuevo.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t{process.env.NODE_ENV !== \"production\" && (\n\t\t\t\t\t\t\t<details className={styles.details}>\n\t\t\t\t\t\t\t\t<summary>Detalle del error</summary>\n\t\t\t\t\t\t\t\t<pre className={styles.stack}>{error.message}</pre>\n\t\t\t\t\t\t\t</details>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button type=\"button\" className={styles.retryButton} onClick={this.handleRetry}>\n\t\t\t\t\t\t\tIntentar de nuevo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn children;\n\t}\n}\n","@layer ds-components {\n .content {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-4);\n }\n\n .category {\n border: none;\n border-bottom: 1px solid var(--ds-color-gray-100);\n padding: 0 0 var(--ds-space-3);\n margin: 0;\n }\n\n .categoryName {\n display: flex;\n align-items: baseline;\n gap: var(--ds-space-2);\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-semibold);\n margin-bottom: var(--ds-space-2);\n padding: 0;\n float: none;\n width: 100%;\n }\n\n .categoryHint {\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-normal);\n color: var(--ds-color-gray-400);\n }\n\n .options {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ds-space-2);\n }\n\n .option {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n padding: var(--ds-space-2) var(--ds-space-3);\n border: 1px solid var(--ds-color-gray-200);\n border-radius: var(--ds-radius-md);\n background: var(--ds-color-white);\n cursor: pointer;\n font-size: var(--ds-font-size-sm);\n transition: all var(--ds-duration-fast) var(--ds-easing-default);\n\n &:hover:not(:disabled) {\n border-color: var(--ds-color-primary);\n }\n\n &[data-selected] {\n border-color: var(--ds-color-primary);\n background: color-mix(in oklch, var(--ds-color-primary) 8%, var(--ds-color-white));\n color: var(--ds-color-primary);\n font-weight: var(--ds-font-weight-medium);\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .extraPrice {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-gray-500);\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--ds-space-2);\n padding-top: var(--ds-space-2);\n }\n}\n","import { useState } from \"react\";\nimport { Button } from \"../Button\";\nimport { Dialog } from \"../Dialog\";\n\nexport type ExtraProductType = {\n\tproductId: string;\n\tname: string;\n\tprice: number;\n\tinStock: boolean;\n};\n\nexport type ExtrasCategoryType = {\n\tid: string;\n\tname: string;\n\tselectionType: \"multi\" | \"single\";\n\tminSelections: number;\n\tmaxSelections: number;\n\tproducts: ExtraProductType[];\n};\n\nexport type SelectedExtraType = {\n\tproductId: string;\n\tquantity: number;\n\tcategoryId: string;\n};\n\nimport styles from \"./ExtrasDialog.module.css\";\n\nexport type ExtrasDialogProps = {\n\topen: boolean;\n\tonClose: () => void;\n\t/** Called with all selections when user confirms.\n\t * NOTE: maxSelections is enforced client-side (FIFO). The server must\n\t * also validate extras counts to prevent tampered requests. */\n\tonConfirm: (selections: SelectedExtraType[]) => void;\n\tcategories: ExtrasCategoryType[];\n\tproductName: string;\n\t/** Forwarded to the underlying Dialog's root element. */\n\t\"data-testid\"?: string;\n};\n\nexport function ExtrasDialog({\n\topen,\n\tonClose,\n\tonConfirm,\n\tcategories,\n\tproductName,\n\t\"data-testid\": testId,\n}: ExtrasDialogProps) {\n\tconst [selections, setSelections] = useState<Map<string, SelectedExtraType[]>>(new Map());\n\n\tconst toggleExtra = (\n\t\tcategoryId: string,\n\t\tproductId: string,\n\t\tselectionType: \"multi\" | \"single\",\n\t\tmaxSelections: number,\n\t) => {\n\t\tsetSelections((prev) => {\n\t\t\tconst next = new Map(prev);\n\t\t\tconst current = next.get(categoryId) ?? [];\n\n\t\t\tif (selectionType === \"single\") {\n\t\t\t\tnext.set(categoryId, [{ productId, quantity: 1, categoryId }]);\n\t\t\t\treturn next;\n\t\t\t}\n\n\t\t\tconst existsAt = current.findIndex((s) => s.productId === productId);\n\t\t\tif (existsAt >= 0) {\n\t\t\t\tnext.set(\n\t\t\t\t\tcategoryId,\n\t\t\t\t\tcurrent.filter((_, i) => i !== existsAt),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst updated = [...current, { productId, quantity: 1, categoryId }];\n\t\t\t\tif (updated.length > maxSelections) {\n\t\t\t\t\tupdated.shift(); // FIFO: drop oldest when limit exceeded\n\t\t\t\t}\n\t\t\t\tnext.set(categoryId, updated);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst allSelections = Array.from(selections.values()).flat();\n\n\tconst handleConfirm = () => {\n\t\tonConfirm(allSelections);\n\t\tsetSelections(new Map());\n\t};\n\n\tconst handleClose = () => {\n\t\tsetSelections(new Map());\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Dialog\n\t\t\topen={open}\n\t\t\tonClose={handleClose}\n\t\t\ttitle={`Extras — ${productName}`}\n\t\t\tsize=\"large\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<div className={styles.content}>\n\t\t\t\t{categories.map((cat) => (\n\t\t\t\t\t<fieldset key={cat.id} className={styles.category}>\n\t\t\t\t\t\t<legend className={styles.categoryName}>\n\t\t\t\t\t\t\t{cat.name}\n\t\t\t\t\t\t\t<span className={styles.categoryHint}>\n\t\t\t\t\t\t\t\t{cat.selectionType === \"single\" ? \"Elige 1\" : `Máx. ${cat.maxSelections}`}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</legend>\n\t\t\t\t\t\t<div className={styles.options}>\n\t\t\t\t\t\t\t{cat.products.map((product: ExtraProductType) => {\n\t\t\t\t\t\t\t\tconst isSelected = (selections.get(cat.id) ?? []).some(\n\t\t\t\t\t\t\t\t\t(s) => s.productId === product.productId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={product.productId}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\t\t\t\tdata-selected={isSelected ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\t\t\t\t\tdisabled={!product.inStock}\n\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\ttoggleExtra(cat.id, product.productId, cat.selectionType, cat.maxSelections)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span>{product.name}</span>\n\t\t\t\t\t\t\t\t\t\t{product.price > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.extraPrice}>+${product.price}</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</fieldset>\n\t\t\t\t))}\n\n\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t<Button variant=\"ghost\" onClick={handleClose}>\n\t\t\t\t\t\tCancelar\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button variant=\"primary\" onClick={handleConfirm}>\n\t\t\t\t\t\tAgregar {allSelections.length > 0 ? `(${allSelections.length})` : \"\"}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Dialog>\n\t);\n}\n","@layer ds-components {\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n }\n\n .label {\n font-family: var(--ds-font-family);\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-snug);\n color: var(--ds-color-text);\n /* Inset to align with the text inside bordered controls (matches TextInput's .label) */\n margin-inline: var(--ds-space-3);\n }\n\n .required {\n color: var(--ds-color-error);\n }\n\n .description {\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin-top: calc(-1 * var(--ds-space-1));\n /* Align with the inset label */\n margin-inline: var(--ds-space-3);\n }\n\n .error {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-error);\n font-weight: var(--ds-font-weight-medium);\n line-height: var(--ds-leading-snug);\n display: flex;\n align-items: center;\n gap: var(--ds-space-1);\n /* Align with the inset label */\n margin-inline: var(--ds-space-3);\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./FormField.module.css\";\n\nexport interface FormFieldProps {\n\tlabel: string;\n\thtmlFor?: string;\n\terror?: string;\n\tdescription?: string;\n\trequired?: boolean;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function FormField({\n\tlabel,\n\thtmlFor,\n\terror,\n\tdescription,\n\trequired = false,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: FormFieldProps) {\n\tconst errorId = htmlFor ? `${htmlFor}-error` : undefined;\n\tconst descriptionId = htmlFor ? `${htmlFor}-description` : undefined;\n\n\treturn (\n\t\t<div className={[styles.field, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t<label htmlFor={htmlFor} className={styles.label}>\n\t\t\t\t{label}\n\t\t\t\t{required && (\n\t\t\t\t\t<span className={styles.required} aria-hidden=\"true\">\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t*\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</label>\n\n\t\t\t{description && (\n\t\t\t\t<p id={descriptionId} className={styles.description}>\n\t\t\t\t\t{description}\n\t\t\t\t</p>\n\t\t\t)}\n\n\t\t\t{children}\n\n\t\t\t{error && (\n\t\t\t\t<p id={errorId} className={styles.error} role=\"alert\" aria-live=\"polite\">\n\t\t\t\t\t{error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.wrapper {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t}\n\n\t.error {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tcolor: var(--ds-color-error);\n\t}\n}\n","import { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./GoogleSignInButton.module.css\";\n\nexport interface GoogleSignInButtonProps {\n\tonSignIn: () => void;\n\tisPending?: boolean;\n\tisError?: boolean;\n\terror?: Error | null;\n\t\"data-testid\"?: string;\n}\n\nexport function GoogleSignInButton({\n\tonSignIn,\n\tisPending = false,\n\tisError = false,\n\terror,\n\t\"data-testid\": testId,\n}: GoogleSignInButtonProps) {\n\treturn (\n\t\t<div className={styles.wrapper} data-testid={testId}>\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"small\"\n\t\t\t\tfullWidth\n\t\t\t\tonClick={onSignIn}\n\t\t\t\tloading={isPending}\n\t\t\t\taria-label=\"Continuar con Google\"\n\t\t\t>\n\t\t\t\t<Icon name=\"google-filled\" size={18} aria-hidden=\"true\" />\n\t\t\t\tGoogle\n\t\t\t</Button>\n\t\t\t{isError && (\n\t\t\t\t<span role=\"alert\" className={styles.error}>\n\t\t\t\t\t{error instanceof Error ? error.message : \"Error al iniciar sesión con Google\"}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .groupedButtons {\n display: flex;\n gap: 0;\n overflow: hidden;\n margin: 0;\n padding: 0;\n border: none;\n width: fit-content;\n\n &[data-full-width] {\n width: 100%;\n overflow-x: auto;\n\n & .button {\n flex: 1;\n flex-shrink: 0;\n min-width: max-content;\n }\n }\n }\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-xs);\n border: 1px solid var(--color-neutral-300);\n background-color: var(--ds-color-white);\n color: var(--color-neutral-500);\n font-family: inherit;\n font-weight: 500;\n cursor: pointer;\n white-space: nowrap;\n transition:\n background-color var(--duration-fast) var(--ease-out),\n color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out);\n\n &[data-size=\"small\"] {\n padding: var(--spacing-xs) var(--spacing-md);\n font-size: var(--text-sm);\n min-height: 2.75rem;\n }\n\n &[data-size=\"medium\"] {\n padding: var(--spacing-sm) var(--spacing-lg);\n font-size: var(--text-sm);\n min-height: 3.75rem;\n }\n\n &[data-size=\"large\"] {\n padding: var(--spacing-md) var(--spacing-xl);\n font-size: var(--text-base);\n min-height: 5rem;\n }\n\n &[data-position=\"standalone\"] {\n border-radius: var(--radius-xl);\n }\n\n &[data-position=\"left\"] {\n border-radius: var(--radius-xl) 0 0 var(--radius-xl);\n }\n\n &[data-position=\"center\"] {\n border-radius: 0;\n border-left-width: 0;\n }\n\n &[data-position=\"right\"] {\n border-radius: 0 var(--radius-xl) var(--radius-xl) 0;\n border-left-width: 0;\n }\n\n &[data-selected] {\n background-color: var(--color-secondary);\n color: var(--ds-color-white);\n border-color: var(--color-secondary);\n }\n\n &:hover:not(:disabled):not([data-selected]) {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n position: relative;\n z-index: 1;\n }\n }\n}\n","import type { HTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport type { IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./GroupedButtons.module.css\";\n\nexport type GroupedButtonSize = \"small\" | \"medium\" | \"large\";\nexport type GroupPosition = \"standalone\" | \"left\" | \"center\" | \"right\";\n\nexport interface GroupedButtonOption {\n\tvalue: string | number;\n\tlabel: string;\n\tdisabled?: boolean;\n\ticon?: IconName;\n\t/** Forwarded to this option's `<button>` for use as a test/Playwright locator. */\n\t\"data-testid\"?: string;\n}\n\nexport interface GroupedButtonsProps extends Omit<HTMLAttributes<HTMLFieldSetElement>, \"onChange\"> {\n\tlabel: string;\n\toptions: GroupedButtonOption[];\n\tselectedButton?: string | number;\n\tsize?: GroupedButtonSize;\n\tfullWidth?: boolean;\n\tdisabled?: boolean;\n\tonChange?: (value: string | number) => void;\n}\n\nfunction getGroupPosition(index: number, total: number): GroupPosition {\n\tif (total === 1) return \"standalone\";\n\tif (index === 0) return \"left\";\n\tif (index === total - 1) return \"right\";\n\treturn \"center\";\n}\n\nexport function GroupedButtons({\n\tlabel,\n\toptions,\n\tselectedButton,\n\tsize = \"medium\",\n\tfullWidth = false,\n\tdisabled = false,\n\tonChange,\n\tclassName,\n\t...props\n}: GroupedButtonsProps) {\n\tconst [internalSelected, setInternalSelected] = useState<string | number | undefined>(\n\t\t() => options[0]?.value,\n\t);\n\n\tconst isControlled = selectedButton !== undefined;\n\tconst current = isControlled ? selectedButton : internalSelected;\n\n\tconst handleClick = (value: string | number) => {\n\t\tconst option = options.find((o) => o.value === value);\n\t\tif (disabled || option?.disabled) return;\n\t\tif (!isControlled) setInternalSelected(value);\n\t\tonChange?.(value);\n\t};\n\n\treturn (\n\t\t<fieldset\n\t\t\taria-label={label}\n\t\t\tclassName={[styles.groupedButtons, className].filter(Boolean).join(\" \")}\n\t\t\tdisabled={disabled}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{options.map((option, i) => (\n\t\t\t\t<button\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\tdata-size={size}\n\t\t\t\t\tdata-position={getGroupPosition(i, options.length)}\n\t\t\t\t\tdata-selected={current === option.value ? \"\" : undefined}\n\t\t\t\t\tdata-testid={option[\"data-testid\"]}\n\t\t\t\t\tdisabled={disabled || option.disabled}\n\t\t\t\t\tonClick={() => handleClick(option.value)}\n\t\t\t\t>\n\t\t\t\t\t{option.icon && <Icon name={option.icon} size={16} />}\n\t\t\t\t\t{option.label}\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</fieldset>\n\t);\n}\n","@layer ds-components {\n\t.header {\n\t\tdisplay: grid;\n\t\tgrid-auto-flow: column;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\tpadding: var(--spacing-sm) var(--spacing-2xl);\n\t\tborder: 1px solid var(--color-neutral-200);\n\t\tborder-radius: var(--radius-lg);\n\t\tbackground-color: var(--color-neutral-100);\n\n\t\t&[data-space-between] {\n\t\t\tjustify-content: space-between;\n\t\t}\n\t}\n\n\t.item {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: auto;\n\t\tpadding: 0 var(--spacing-md);\n\t}\n\n\t.title {\n\t\tfont-size: var(--text-base);\n\t\tfont-weight: 800;\n\t\tcolor: var(--color-secondary);\n\t\tmargin: 0;\n\t}\n\n\t.description {\n\t\tfont-size: 0.625rem;\n\t\tline-height: 1;\n\t\tfont-weight: 400;\n\t\tcolor: var(--color-neutral-500);\n\t\tmargin: 0;\n\t}\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./Header.module.css\";\n\nexport interface HeaderItem {\n\ttitle: string;\n\tdescription?: string;\n}\n\nexport interface HeaderProps extends HTMLAttributes<HTMLElement> {\n\theaders?: HeaderItem[];\n\tspaceBetween?: boolean;\n}\n\nexport function Header({ headers = [], spaceBetween = false, className, ...props }: HeaderProps) {\n\treturn (\n\t\t<section\n\t\t\tclassName={[styles.header, className].filter(Boolean).join(\" \")}\n\t\t\tdata-space-between={spaceBetween ? \"\" : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{headers.map((header) => (\n\t\t\t\t<div key={header.title} className={styles.item}>\n\t\t\t\t\t<p className={styles.title}>{header.title}</p>\n\t\t\t\t\t{header.description && <p className={styles.description}>{header.description}</p>}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</section>\n\t);\n}\n","import { useMemo } from \"react\";\nimport { DropdownButton, type DropdownMenuItemType } from \"../DropdownButton\";\n\nexport interface LanguageOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface LanguageSelectorProps {\n\tvalue: string;\n\toptions: LanguageOption[];\n\tonChange: (value: string) => void;\n\t\"data-testid\"?: string;\n}\n\nexport function LanguageSelector({\n\tvalue,\n\toptions,\n\tonChange,\n\t\"data-testid\": testId,\n}: LanguageSelectorProps) {\n\tconst menuItems = useMemo<DropdownMenuItemType[]>(\n\t\t() => options.map(({ value: v, label }) => ({ value: v, label })),\n\t\t[options],\n\t);\n\n\tconst currentLabel = options.find((o) => o.value === value)?.label ?? value;\n\n\treturn (\n\t\t<DropdownButton\n\t\t\ttext={currentLabel}\n\t\t\tmenuItems={menuItems}\n\t\t\tsize=\"small\"\n\t\t\tvariant=\"ghost\"\n\t\t\tonSelect={(item) => onChange(item.value)}\n\t\t\tdata-testid={testId}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n .logo {\n --logo-icon-max-size: 100px;\n --logo-complete-max-width: 400px;\n --logo-complete-max-height: 100px;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n line-height: 0;\n vertical-align: middle;\n transition: opacity var(--duration-fast) ease-in-out;\n\n &:hover {\n opacity: 0.9;\n }\n\n &[data-mode=\"icon\"] {\n max-width: var(--logo-icon-max-size);\n max-height: var(--logo-icon-max-size);\n }\n\n &[data-mode=\"complete\"] {\n max-width: var(--logo-complete-max-width);\n max-height: var(--logo-complete-max-height);\n }\n }\n}\n","import type { HTMLAttributes } from \"react\";\nimport styles from \"./LogoToteat.module.css\";\nimport iconCreamOrange from \"./svg/toteat-isotipo-crema-naranja.svg?raw\";\nimport iconBlackCream from \"./svg/toteat-isotipo-crema-negro.svg?raw\";\nimport iconOriginal from \"./svg/toteat-isotipo-original.svg?raw\";\nimport logoCreamOrange from \"./svg/toteat-logo-crema-naranja.svg?raw\";\nimport logoBlackCream from \"./svg/toteat-logo-negro-crema.svg?raw\";\nimport logoOriginal from \"./svg/toteat-logo-original.svg?raw\";\n\nexport type LogoToteatMode = \"icon\" | \"complete\";\nexport type LogoToteatVariant = \"original\" | \"cream-orange\" | \"black-cream\";\n\nexport interface LogoToteatProps extends HTMLAttributes<HTMLSpanElement> {\n\tmode?: LogoToteatMode;\n\tvariant?: LogoToteatVariant;\n\twidth?: number;\n\theight?: number;\n\talt?: string;\n}\n\nfunction escapeAttr(value: string): string {\n\treturn value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\");\n}\n\nconst LOGO_MAP: Record<LogoToteatVariant, string> = {\n\toriginal: logoOriginal,\n\t\"cream-orange\": logoCreamOrange,\n\t\"black-cream\": logoBlackCream,\n};\n\nconst ICON_MAP: Record<LogoToteatVariant, string> = {\n\toriginal: iconOriginal,\n\t\"cream-orange\": iconCreamOrange,\n\t\"black-cream\": iconBlackCream,\n};\n\nfunction getDimensions(\n\tmode: LogoToteatMode,\n\twidth?: number,\n\theight?: number,\n): { width: number; height: number } {\n\tif (width !== undefined && height !== undefined) return { width, height };\n\tif (mode === \"icon\") {\n\t\tconst size = width ?? height ?? 44;\n\t\treturn { width: size, height: size };\n\t}\n\tif (width !== undefined) return { width, height: Math.round((width / 317) * 80) };\n\tif (height !== undefined) return { width: Math.round((height / 80) * 317), height };\n\treturn { width: 160, height: 40 };\n}\n\nexport function LogoToteat({\n\tmode = \"complete\",\n\tvariant = \"original\",\n\twidth,\n\theight,\n\talt = \"Logo Toteat\",\n\tclassName,\n\t...props\n}: LogoToteatProps) {\n\tconst rawSvg = mode === \"icon\" ? ICON_MAP[variant] : LOGO_MAP[variant];\n\tconst dims = getDimensions(mode, width, height);\n\t// SVG content is bundled package assets, not user input — safe for dangerouslySetInnerHTML\n\tconst modifiedSvg = rawSvg\n\t\t.replace(/width=\"\\d+\"/, `width=\"${dims.width}\"`)\n\t\t.replace(/height=\"\\d+\"/, `height=\"${dims.height}\"`)\n\t\t.replace(/<svg/, `<svg role=\"img\" aria-label=\"${escapeAttr(alt)}\"`);\n\n\treturn (\n\t\t<span\n\t\t\tclassName={[styles.logo, className].filter(Boolean).join(\" \")}\n\t\t\tdata-mode={mode}\n\t\t\tdata-variant={variant}\n\t\t\t{...props}\n\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: SVG is a bundled package asset, not user content\n\t\t\tdangerouslySetInnerHTML={{ __html: modifiedSvg }}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t.multiselect {\n\t\tposition: relative;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tcolor: var(--color-text);\n\t}\n\n\t/* ── Trigger ── */\n\t.trigger {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tmin-height: 40px;\n\t\tpadding: var(--spacing-xs) var(--spacing-sm);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tcursor: pointer;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\t}\n\n\t.multiselect[data-error] .trigger {\n\t\tborder-color: var(--color-error);\n\t}\n\n\t.multiselect[data-disabled] .trigger {\n\t\tbackground-color: var(--color-neutral-50);\n\t\tcolor: var(--color-neutral-400);\n\t\tcursor: not-allowed;\n\t\tpointer-events: none;\n\t}\n\n\t/* ── Placeholder ── */\n\t.placeholder {\n\t\tcolor: var(--color-neutral-400);\n\t\tline-height: var(--leading-normal);\n\t\tpadding: var(--spacing-xs) 0;\n\t}\n\n\t/* ── Tags ── */\n\t.tag {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: 2px var(--spacing-sm);\n\t\tbackground-color: var(--color-primary-100);\n\t\tcolor: var(--color-primary-900);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tborder-radius: var(--radius-full);\n\t\tline-height: var(--leading-tight);\n\t\twhite-space: nowrap;\n\t}\n\n\t.tagRemove {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 14px;\n\t\theight: 14px;\n\t\tpadding: 0;\n\t\tbackground: none;\n\t\tborder: none;\n\t\tborder-radius: var(--radius-circle);\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tfont-size: var(--text-base);\n\t\tline-height: 1;\n\t\topacity: 0.7;\n\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 1px;\n\t\t}\n\t}\n\n\t/* ── Dropdown ── */\n\t.dropdown {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tleft: 0;\n\t\tright: 0;\n\t\tz-index: var(--z-dropdown);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\toverflow: hidden;\n\t\tmax-height: 240px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n\n\t/* ── Options list (scrollable) ── */\n\t.optionsList {\n\t\toverflow-y: auto;\n\t\tflex: 1;\n\t}\n\n\t/* ── Flip upward when not enough space below ── */\n\t.dropdown[data-upward] {\n\t\ttop: auto;\n\t\tbottom: calc(100% + var(--spacing-xs));\n\t}\n\n\t/* ── Search input ── */\n\t.search {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: none;\n\t\tborder-bottom: 1px solid var(--color-border);\n\t\toutline: none;\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t}\n\t}\n\n\t/* ── Option buttons ── */\n\t.option {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\ttext-align: left;\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text);\n\t\tbackground: none;\n\t\tborder: none;\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\tbackground-color: var(--color-neutral-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\t}\n\n\t/* ── No results ── */\n\t.noResults {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t\ttext-align: center;\n\t}\n}\n","import { type ReactElement, useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport styles from \"./Multiselect.module.css\";\n\nexport interface MultiselectOption {\n\tvalue: string;\n\tlabel: string;\n}\n\nexport interface MultiselectProps {\n\toptions: MultiselectOption[];\n\tvalue: string[];\n\tonChange: (values: string[]) => void;\n\tplaceholder?: string;\n\tsearchPlaceholder?: string;\n\tnoResultsText?: string;\n\tremoveLabel?: string;\n\tdisabled?: boolean;\n\terror?: boolean;\n\t\"data-testid\"?: string;\n}\n\nconst DROPDOWN_MAX_HEIGHT = 240;\n\nexport function Multiselect({\n\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Seleccionar...\",\n\tsearchPlaceholder = \"Buscar...\",\n\tnoResultsText = \"Sin resultados\",\n\tremoveLabel = \"Eliminar\",\n\tdisabled,\n\terror,\n\t\"data-testid\": testId,\n}: MultiselectProps): ReactElement {\n\tconst [openUpward, setOpenUpward] = useState(false);\n\tconst [search, setSearch] = useState(\"\");\n\n\t// Shared dropdown core: open state, refs, toggle, focus-return-to-trigger.\n\t// Multiselect keeps its own outside-click + Escape listeners because it returns focus\n\t// to the trigger on outside-click; both reuse the hook's `closeAndFocusTrigger`.\n\t// Selection is multi-value via the always-on search field, so the hook's roving\n\t// active-index keyboard handler is intentionally unused here.\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\ttoggle,\n\t\tcloseAndFocusTrigger: closeDropdown,\n\t} = useDropdown({ disabled, closeOnOutsideClick: false });\n\n\tconst selectedOptions = options.filter((o) => value.includes(o.value));\n\tconst filteredOptions = options.filter(\n\t\t(o) => !value.includes(o.value) && o.label.toLowerCase().includes(search.toLowerCase()),\n\t);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: MouseEvent) => {\n\t\t\tif (!containerRef.current?.contains(e.target as Node)) closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handler);\n\t\treturn () => document.removeEventListener(\"mousedown\", handler);\n\t}, [isOpen, closeDropdown, containerRef]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handler);\n\t\treturn () => document.removeEventListener(\"keydown\", handler);\n\t}, [isOpen, closeDropdown]);\n\n\t// Determine flip direction when opening\n\tuseEffect(() => {\n\t\tif (!isOpen || !containerRef.current) return;\n\t\tconst rect = containerRef.current.getBoundingClientRect();\n\t\tconst spaceBelow = window.innerHeight - rect.bottom;\n\t\tsetOpenUpward(spaceBelow < DROPDOWN_MAX_HEIGHT + 8);\n\t}, [isOpen, containerRef]);\n\n\tconst addValue = (v: string) => onChange([...value, v]);\n\tconst removeValue = (v: string) => onChange(value.filter((x) => x !== v));\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.multiselect}\n\t\t\tdata-error={error || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t{selectedOptions.length === 0 && <span className={styles.placeholder}>{placeholder}</span>}\n\t\t\t\t{selectedOptions.map((opt) => (\n\t\t\t\t\t<span key={opt.value} className={styles.tag}>\n\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName={styles.tagRemove}\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tremoveValue(opt.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label={`${removeLabel} ${opt.label}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t×\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.dropdown}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=\"true\"\n\t\t\t\t\tdata-upward={openUpward || undefined}\n\t\t\t\t>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\t// biome-ignore lint/a11y/noAutofocus: search input needs focus when dropdown opens\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t/>\n\t\t\t\t\t<div className={styles.optionsList}>\n\t\t\t\t\t\t{filteredOptions.map((opt) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={opt.value}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={value.includes(opt.value)}\n\t\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\taddValue(opt.value);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{filteredOptions.length === 0 && (\n\t\t\t\t\t\t\t<div className={styles.noResults}>{noResultsText}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n /* Dimming scrim — overlay mode only, while open. Provides click-to-close. */\n .backdrop {\n display: none;\n position: fixed;\n inset: var(--ds-ang-navbar-height) 0 0 0;\n z-index: 19;\n background-color: var(--ds-color-surface-overlay);\n }\n\n .backdrop[data-open=\"true\"][data-mode=\"overlay\"] {\n display: block;\n }\n\n /* Shared drawer chrome (both modes). */\n .sidebar {\n background-color: var(--ds-ang-secondary);\n color: var(--ds-ang-neutral-0);\n display: flex;\n flex-direction: column;\n gap: var(--ds-ang-space-8);\n overflow-y: auto;\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n user-select: none;\n }\n\n /* Overlay: fixed off-canvas drawer that slides over content, never reflows it. */\n .sidebar[data-mode=\"overlay\"] {\n position: fixed;\n top: var(--ds-ang-navbar-height);\n left: 0;\n height: calc(100dvh - var(--ds-ang-navbar-height));\n width: 100dvw;\n padding: var(--ds-ang-space-24) var(--ds-ang-space-16);\n z-index: 20;\n transform: translateX(-100%);\n }\n\n .sidebar[data-mode=\"overlay\"][data-open=\"true\"] {\n transform: translateX(0);\n }\n\n /* Push: in-flow column that collapses to 0 width when closed, pushing content. */\n .sidebar[data-mode=\"push\"] {\n position: static;\n height: 100%;\n width: 0;\n padding-block: var(--ds-ang-space-24);\n padding-inline: 0;\n overflow-x: hidden;\n }\n\n .sidebar[data-mode=\"push\"][data-open=\"true\"] {\n width: var(--ds-ang-sidebar-width);\n padding-inline: var(--ds-ang-space-16);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .sidebar[data-mode=\"overlay\"] {\n transition: transform 200ms ease-out;\n }\n .sidebar[data-mode=\"push\"] {\n transition: width 200ms ease-out, padding-inline 200ms ease-out;\n }\n }\n}\n","import { type ReactNode, useEffect, useRef } from \"react\";\nimport styles from \"./Sidebar.module.css\";\n\n/**\n * Stable id for the sidebar drawer `<nav>`. The NavBar toggle references it via\n * `aria-controls` so assistive tech associates the hamburger with the drawer.\n */\nexport const SIDEBAR_DRAWER_ID = \"ds-sidebar-drawer\";\n\nexport type SidebarMode = \"overlay\" | \"push\";\n\nexport interface SidebarProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\t/**\n\t * \"overlay\" (default, mobile): fixed drawer over content, dimming scrim, modal\n\t * focus-trap + Escape + focus-return. \"push\" (desktop): in-flow drawer that\n\t * pushes content, no scrim, non-modal (no focus-trap / Escape).\n\t */\n\tmode?: SidebarMode;\n\tisPinLocked?: boolean;\n\tisModal?: boolean;\n\t/**\n\t * In overlay (modal) mode, provide at least one focusable child. If none\n\t * are focusable (e.g. a loading state or icon-only content), focus rests\n\t * on the drawer container itself and Tab/Shift+Tab stay trapped there —\n\t * the modal focus-trap never leaks into the background content.\n\t */\n\tchildren: ReactNode;\n}\n\nconst FOCUSABLE_SELECTOR =\n\t'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction getFocusables(nav: HTMLElement): HTMLElement[] {\n\treturn Array.from(nav.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n}\n\n/** Wraps Tab/Shift+Tab at the drawer's edges so focus never escapes it. */\nfunction trapTabKey(nav: HTMLElement, event: KeyboardEvent): void {\n\tconst items = getFocusables(nav);\n\tconst first = items[0];\n\tconst last = items[items.length - 1];\n\tif (!first || !last) {\n\t\t// No focusable children: keep focus pinned on the drawer container\n\t\t// itself rather than letting Tab escape into the background content.\n\t\tevent.preventDefault();\n\t\tnav.focus();\n\t\treturn;\n\t}\n\tconst active = document.activeElement;\n\tif (event.shiftKey) {\n\t\tif (active === first || !nav.contains(active)) {\n\t\t\tevent.preventDefault();\n\t\t\tlast.focus();\n\t\t}\n\t} else if (active === last || !nav.contains(active)) {\n\t\tevent.preventDefault();\n\t\tfirst.focus();\n\t}\n}\n\nexport function Sidebar({\n\tisOpen,\n\tonClose,\n\tmode = \"overlay\",\n\tisPinLocked = false,\n\tisModal = false,\n\tchildren,\n}: SidebarProps) {\n\tconst navRef = useRef<HTMLElement>(null);\n\t// Keep the latest onClose without making it an effect dependency: an inline\n\t// onClose changes identity every render; as a dep it would re-run the modal\n\t// effect, whose cleanup re-captures `previouslyFocused` and flickers focus.\n\tconst onCloseRef = useRef(onClose);\n\tonCloseRef.current = onClose;\n\n\tconst isOverlay = mode === \"overlay\";\n\n\t// Modal affordances apply ONLY in overlay mode: move focus to the first\n\t// focusable child, trap Tab within the drawer, close on Escape, and restore\n\t// focus to the opener on close. Push mode is non-modal — focus stays put.\n\tuseEffect(() => {\n\t\tif (!isOpen || isPinLocked || isModal || !isOverlay) return;\n\t\tconst nav = navRef.current;\n\t\tif (!nav) return;\n\t\tconst previouslyFocused = document.activeElement as HTMLElement | null;\n\n\t\t(getFocusables(nav)[0] ?? nav).focus();\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonCloseRef.current();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.key === \"Tab\") trapTabKey(nav, event);\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handleKeyDown);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"keydown\", handleKeyDown);\n\t\t\tpreviouslyFocused?.focus?.();\n\t\t};\n\t}, [isOpen, isPinLocked, isModal, isOverlay]);\n\n\tif (isPinLocked || isModal) return null;\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName={styles.backdrop}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\tdata-mode={mode}\n\t\t\t\tdata-testid=\"sidebar-backdrop\"\n\t\t\t\tonClick={onClose}\n\t\t\t\trole=\"presentation\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t\t{/* When closed the drawer is off-canvas (overlay) or 0-width (push); in\n\t\t\t both cases `inert` keeps its controls out of the tab order + a11y tree. */}\n\t\t\t<nav\n\t\t\t\tref={navRef}\n\t\t\t\tid={SIDEBAR_DRAWER_ID}\n\t\t\t\tclassName={styles.sidebar}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\tdata-mode={mode}\n\t\t\t\tdata-testid=\"sidebar\"\n\t\t\t\taria-label=\"Menú principal\"\n\t\t\t\tinert={isOpen ? undefined : true}\n\t\t\t\ttabIndex={-1}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</nav>\n\t\t</>\n\t);\n}\n","@layer ang-components {\n .navbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--ds-ang-navbar-height);\n min-height: var(--ds-ang-navbar-height);\n max-height: var(--ds-ang-navbar-height);\n background-color: var(--ds-ang-secondary);\n position: relative;\n z-index: 10;\n padding: 0;\n user-select: none;\n }\n\n .navLeft {\n position: absolute;\n left: 0;\n top: 0;\n height: var(--ds-ang-navbar-height);\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-4);\n padding-left: var(--ds-ang-space-8);\n }\n\n .menuButton {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--ds-ang-space-8);\n color: var(--ds-ang-neutral-0);\n min-width: var(--ds-ang-min-touch-target);\n min-height: var(--ds-ang-min-touch-target);\n }\n\n .menuButton:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .spinner {\n position: absolute;\n left: 55px;\n top: 10px;\n }\n\n .navCenter {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-ang-space-8);\n height: var(--ds-ang-navbar-height);\n padding: 0 50px;\n flex: 1;\n }\n\n .logoBrand {\n display: flex;\n align-items: center;\n cursor: pointer;\n height: var(--ds-ang-navbar-height);\n background: none;\n border: none;\n padding: 0;\n }\n\n .logoBrand:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .logo {\n width: 83px;\n height: 21px;\n }\n\n @media (max-width: 780px) {\n .logo {\n width: 78px;\n height: 16px;\n }\n }\n\n .restaurantName {\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n color: var(--ds-ang-neutral-0);\n cursor: pointer;\n }\n\n .navRight {\n position: absolute;\n right: 0;\n top: 0;\n height: var(--ds-ang-navbar-height);\n display: flex;\n align-items: center;\n padding-right: var(--ds-ang-space-8);\n }\n\n .rightButton {\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--ds-ang-space-8);\n min-width: var(--ds-ang-min-touch-target);\n min-height: var(--ds-ang-min-touch-target);\n }\n\n .rightButton:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n}\n","import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { SIDEBAR_DRAWER_ID } from \"../Sidebar\";\nimport styles from \"./NavBar.module.css\";\n\nexport interface NavBarProps {\n\trestaurantName: string;\n\tonMenuToggle: () => void;\n\tonLogoClick: () => void;\n\tonRightToggle: () => void;\n\t/** Reflects the sidebar's open state so the toggle exposes aria-expanded + the right label. */\n\tisMenuOpen?: boolean;\n\tisLoading?: boolean;\n\tisPinLocked?: boolean;\n\trightSlot?: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function NavBar({\n\trestaurantName,\n\tonMenuToggle,\n\tonLogoClick,\n\tonRightToggle,\n\tisMenuOpen = false,\n\tisLoading = false,\n\tisPinLocked = false,\n\trightSlot,\n\t\"data-testid\": testId,\n}: NavBarProps) {\n\tif (isPinLocked) return null;\n\n\treturn (\n\t\t<header className={styles.navbar} data-testid={testId}>\n\t\t\t<div className={styles.navLeft}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.menuButton}\n\t\t\t\t\tonClick={onMenuToggle}\n\t\t\t\t\taria-label={isMenuOpen ? \"Cerrar menú\" : \"Abrir menú\"}\n\t\t\t\t\taria-expanded={isMenuOpen}\n\t\t\t\t\taria-controls={SIDEBAR_DRAWER_ID}\n\t\t\t\t>\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname={isMenuOpen ? \"menu-close-outline\" : \"menu-hamburger-outline\"}\n\t\t\t\t\t\tsize={24}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t{isLoading && (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/assets/angular/dsSpinner.svg\"\n\t\t\t\t\t\talt=\"Cargando\"\n\t\t\t\t\t\twidth={20}\n\t\t\t\t\t\theight={20}\n\t\t\t\t\t\tclassName={styles.spinner}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className={styles.navCenter}>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.logoBrand}\n\t\t\t\t\tonClick={onLogoClick}\n\t\t\t\t\taria-label=\"Ir al inicio\"\n\t\t\t\t>\n\t\t\t\t\t<img src=\"/assets/angular/dsLogo.svg\" alt=\"Toteat\" className={styles.logo} />\n\t\t\t\t</button>\n\t\t\t\t<span className={styles.restaurantName}>{restaurantName}</span>\n\t\t\t</div>\n\n\t\t\t<div className={styles.navRight}>\n\t\t\t\t{rightSlot}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.rightButton}\n\t\t\t\t\tonClick={onRightToggle}\n\t\t\t\t\taria-label=\"Pantalla completa\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/assets/angular/dsIconLogo.svg\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\twidth={24}\n\t\t\t\t\t\theight={24}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</header>\n\t);\n}\n","@layer ds-components {\n .overlay {\n position: fixed;\n inset: 0;\n display: flex;\n width: 100dvw;\n height: 100dvh;\n padding: clamp(1.5rem, 4vw, 3rem);\n z-index: var(--overlay-z-index, 1200);\n justify-content: center;\n animation: overlay-fade-in 200ms ease-in-out;\n\n &[data-blur] {\n backdrop-filter: blur(0.75rem);\n }\n\n &[data-placement=\"top\"] { align-items: flex-start; }\n &[data-placement=\"center\"] { align-items: center; }\n &[data-placement=\"bottom\"] { align-items: flex-end; }\n }\n\n .backdrop {\n position: absolute;\n inset: 0;\n background-color: color-mix(in srgb, var(--color-secondary) 60%, transparent);\n border: none;\n cursor: default;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .content {\n position: relative;\n z-index: 1;\n width: min(100%, 64rem);\n display: flex;\n justify-content: center;\n pointer-events: none;\n\n & > * {\n pointer-events: auto;\n width: 100%;\n }\n }\n\n @keyframes overlay-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay { animation: none; }\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useScrollLock } from \"../../hooks/useScrollLock\";\nimport styles from \"./Overlay.module.css\";\n\nexport type OverlayPlacement = \"top\" | \"center\" | \"bottom\";\n\nexport interface OverlayProps {\n\tvisible?: boolean;\n\tonClose: () => void;\n\tchildren: ReactNode;\n\tdismissible?: boolean;\n\tcloseOnBackdrop?: boolean;\n\tcloseOnEsc?: boolean;\n\tlockScroll?: boolean;\n\tblur?: boolean;\n\tplacement?: OverlayPlacement;\n\tzIndex?: number;\n\trole?: \"presentation\" | \"dialog\";\n\t\"aria-label\"?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Overlay({\n\tvisible = false,\n\tonClose,\n\tchildren,\n\tdismissible = true,\n\tcloseOnBackdrop = true,\n\tcloseOnEsc = true,\n\tlockScroll = true,\n\tblur = false,\n\tplacement = \"center\",\n\tzIndex = 1200,\n\trole = \"presentation\",\n\t\"aria-label\": ariaLabel,\n\tclassName,\n\t\"data-testid\": dataTestId,\n}: OverlayProps) {\n\tconst handleClose = useCallback(() => {\n\t\tif (dismissible) onClose();\n\t}, [dismissible, onClose]);\n\n\tuseScrollLock(visible && lockScroll, { strategy: \"overflow\" });\n\n\tuseEffect(() => {\n\t\tif (!visible || !closeOnEsc) return;\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") handleClose();\n\t\t};\n\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [visible, closeOnEsc, handleClose]);\n\n\tif (!visible || typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<div\n\t\t\tdata-testid={dataTestId}\n\t\t\tclassName={[styles.overlay, className].filter(Boolean).join(\" \")}\n\t\t\tdata-blur={blur ? \"\" : undefined}\n\t\t\tdata-placement={placement}\n\t\t\tstyle={{ \"--overlay-z-index\": String(zIndex) } as React.CSSProperties}\n\t\t\trole={role}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.backdrop}\n\t\t\t\tdata-backdrop=\"\"\n\t\t\t\tonClick={closeOnBackdrop ? handleClose : undefined}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\ttabIndex={-1}\n\t\t\t/>\n\t\t\t<div className={styles.content}>{children}</div>\n\t\t</div>,\n\t\tdocument.body,\n\t);\n}\n","@layer ds-components {\n .overlayMessage {\n background-color: var(--ds-color-white);\n border-radius: var(--radius-xl);\n padding: clamp(1.5rem, 4vw, 2.75rem);\n box-shadow: 0 35px 100px rgba(0, 0, 0, 0.2);\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n width: 100%;\n max-width: var(--om-max-width, 400px);\n\n &[data-standalone] {\n box-shadow: none;\n border: 1px solid var(--color-neutral-200);\n min-height: 16.625rem;\n }\n }\n\n .header {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: var(--spacing-md);\n position: relative;\n padding-inline: var(--spacing-sm);\n }\n\n .iconWrap {\n width: 3.5rem;\n height: 3.5rem;\n display: grid;\n place-items: center;\n }\n\n .iconColor {\n display: contents;\n color: var(--om-icon-color);\n }\n\n .headline {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n align-items: center;\n }\n\n .eyebrow {\n font-size: var(--text-xs);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n font-weight: 600;\n margin: 0;\n }\n\n .title {\n font-size: clamp(var(--text-lg), 2vw, var(--text-xl));\n line-height: 1.2;\n font-weight: 600;\n color: var(--color-secondary);\n margin: var(--spacing-xl) 0 0;\n }\n\n .closeBtn {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: var(--radius-circle);\n border: 1px solid transparent;\n background: transparent;\n color: var(--color-neutral-400);\n display: grid;\n place-items: center;\n cursor: pointer;\n position: absolute;\n top: 0;\n right: 0;\n padding: 0;\n transition:\n border-color var(--duration-fast) var(--ease-out),\n color var(--duration-fast) var(--ease-out);\n\n &:hover {\n color: var(--color-secondary);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n }\n }\n\n .body {\n font-size: var(--text-base);\n color: var(--color-neutral-500);\n line-height: 1.5;\n text-align: center;\n }\n\n .actions {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-md);\n width: 100%;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { Button } from \"../Button\";\nimport { CloseButton } from \"../CloseButton\";\nimport type { IconNameType as IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport type { OverlayPlacement } from \"../Overlay\";\nimport { Overlay } from \"../Overlay\";\nimport styles from \"./OverlayMessage.module.css\";\n\nexport type OverlayMessageStatus = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst STATUS_ICON_MAP: Record<OverlayMessageStatus, IconName> = {\n\tsuccess: \"success-outline\",\n\tinfo: \"info-outline\",\n\twarning: \"exclamation-outline\",\n\terror: \"error-outline\",\n};\n\nconst STATUS_COLOR_VAR_MAP: Record<OverlayMessageStatus, string> = {\n\tsuccess: \"var(--ds-color-success)\",\n\tinfo: \"var(--ds-color-info)\",\n\twarning: \"var(--ds-color-warning)\",\n\terror: \"var(--ds-color-primary)\",\n};\n\nexport interface OverlayMessageProps {\n\tvisible?: boolean;\n\tonClose: () => void;\n\ttitle: string;\n\teyebrow?: string;\n\tchildren?: ReactNode;\n\tstatus?: OverlayMessageStatus;\n\ticonName?: IconName;\n\ticonSize?: number;\n\tdismissible?: boolean;\n\tshowCloseButton?: boolean;\n\tcloseButtonLabel?: string;\n\tcloseOnBackdrop?: boolean;\n\tcloseOnEsc?: boolean;\n\tlockScroll?: boolean;\n\tzIndex?: number;\n\tblur?: boolean;\n\tplacement?: OverlayPlacement;\n\t\"aria-label\"?: string;\n\tprimaryButtonLabel?: string;\n\tsecondaryButtonLabel?: string;\n\tloadingPrimary?: boolean;\n\tloadingSecondary?: boolean;\n\tmaxWidth?: number;\n\tstandalone?: boolean;\n\tonPrimaryClick?: () => void;\n\tonSecondaryClick?: () => void;\n\t\"data-testid\"?: string;\n}\n\ninterface CardProps {\n\ttitle: string;\n\teyebrow?: string;\n\tchildren?: ReactNode;\n\tstatus?: OverlayMessageStatus;\n\ticonName?: IconName;\n\ticonSize?: number;\n\tdismissible?: boolean;\n\tshowCloseButton?: boolean;\n\tcloseButtonLabel?: string;\n\tprimaryButtonLabel?: string;\n\tsecondaryButtonLabel?: string;\n\tloadingPrimary?: boolean;\n\tloadingSecondary?: boolean;\n\tmaxWidth?: number;\n\tstandalone?: boolean;\n\tonClose: () => void;\n\tonPrimaryClick?: () => void;\n\tonSecondaryClick?: () => void;\n\t\"data-testid\"?: string;\n}\n\nfunction OverlayMessageCard({\n\ttitle,\n\teyebrow,\n\tchildren,\n\tstatus = \"success\",\n\ticonName,\n\ticonSize = 44,\n\tdismissible = true,\n\tshowCloseButton = true,\n\tcloseButtonLabel = \"Close overlay message\",\n\tprimaryButtonLabel,\n\tsecondaryButtonLabel,\n\tloadingPrimary = false,\n\tloadingSecondary = false,\n\tmaxWidth = 400,\n\tstandalone = false,\n\tonClose,\n\tonPrimaryClick,\n\tonSecondaryClick,\n\t\"data-testid\": dataTestId,\n}: CardProps) {\n\tconst titleId = useId();\n\tconst bodyId = useId();\n\tconst resolvedIcon = iconName ?? STATUS_ICON_MAP[status];\n\tconst iconColor = STATUS_COLOR_VAR_MAP[status];\n\tconst hasBody = Boolean(children);\n\tconst hasActions = Boolean(primaryButtonLabel) || Boolean(secondaryButtonLabel);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.overlayMessage}\n\t\t\tdata-status={status}\n\t\t\tdata-standalone={standalone ? \"\" : undefined}\n\t\t\trole={standalone ? \"region\" : \"alertdialog\"}\n\t\t\taria-modal={standalone ? undefined : \"true\"}\n\t\t\taria-labelledby={titleId}\n\t\t\taria-describedby={hasBody ? bodyId : undefined}\n\t\t\tstyle={{ \"--om-max-width\": `${maxWidth}px` } as React.CSSProperties}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<header className={styles.header}>\n\t\t\t\t<div className={styles.iconWrap} aria-hidden=\"true\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={styles.iconColor}\n\t\t\t\t\t\tstyle={{ \"--om-icon-color\": iconColor } as React.CSSProperties}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name={resolvedIcon} size={iconSize} />\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className={styles.headline}>\n\t\t\t\t\t{eyebrow && <p className={styles.eyebrow}>{eyebrow}</p>}\n\t\t\t\t\t<h2 className={styles.title} id={titleId}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h2>\n\t\t\t\t</div>\n\t\t\t\t{dismissible && showCloseButton && (\n\t\t\t\t\t<CloseButton\n\t\t\t\t\t\tclassName={styles.closeBtn}\n\t\t\t\t\t\tlabel={closeButtonLabel}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tsize={20}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</header>\n\t\t\t{hasBody && (\n\t\t\t\t<div className={styles.body} id={bodyId}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{hasActions && (\n\t\t\t\t<footer className={styles.actions}>\n\t\t\t\t\t{secondaryButtonLabel && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\t\tloading={loadingSecondary}\n\t\t\t\t\t\t\tonClick={onSecondaryClick}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{secondaryButtonLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t{primaryButtonLabel && (\n\t\t\t\t\t\t<Button variant=\"primary\" fullWidth loading={loadingPrimary} onClick={onPrimaryClick}>\n\t\t\t\t\t\t\t{primaryButtonLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</footer>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function OverlayMessage({\n\tvisible = false,\n\tonClose,\n\tdismissible = true,\n\tcloseOnBackdrop = true,\n\tcloseOnEsc = true,\n\tlockScroll = true,\n\tzIndex = 1200,\n\tblur = false,\n\tplacement = \"center\",\n\t\"aria-label\": ariaLabel,\n\tstandalone = false,\n\t\"data-testid\": dataTestId,\n\t...cardProps\n}: OverlayMessageProps) {\n\tif (!visible) return null;\n\n\tif (standalone) {\n\t\treturn (\n\t\t\t<OverlayMessageCard\n\t\t\t\t{...cardProps}\n\t\t\t\tstandalone\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tonClose={onClose}\n\t\t\t\tdata-testid={dataTestId}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Overlay\n\t\t\tvisible={visible}\n\t\t\tonClose={onClose}\n\t\t\tdismissible={dismissible}\n\t\t\tcloseOnBackdrop={closeOnBackdrop}\n\t\t\tcloseOnEsc={closeOnEsc}\n\t\t\tlockScroll={lockScroll}\n\t\t\tzIndex={zIndex}\n\t\t\tblur={blur}\n\t\t\tplacement={placement}\n\t\t\taria-label={ariaLabel}\n\t\t>\n\t\t\t<OverlayMessageCard\n\t\t\t\t{...cardProps}\n\t\t\t\tdismissible={dismissible}\n\t\t\t\tonClose={onClose}\n\t\t\t\tdata-testid={dataTestId}\n\t\t\t/>\n\t\t</Overlay>\n\t);\n}\n","@layer ds-components {\n /*\n * Grid overlap pattern — sits in the same 1/1 cell as siblings.\n * stretch fills the cell without position: absolute, so the logo div\n * (later in DOM) naturally paints on top. No z-index needed.\n */\n .canvas {\n grid-area: 1 / 1;\n align-self: stretch;\n justify-self: stretch;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n}\n","import { useEffect, useRef } from \"react\";\nimport styles from \"./BreathingDotsCanvas.module.css\";\n\n// ── Shaders ────────────────────────────────────────────────────────────────\nconst VERT = `#version 300 es\nin vec2 a_pos;\nvoid main() { gl_Position = vec4(a_pos, 0.0, 1.0); }`;\n\n/**\n * Breathing Dots — inspired by the Codrops / Dave Whyte technique.\n *\n * Each dot in a hex-offset grid has its position scaled radially by a smooth\n * square wave whose phase is delayed by distance from the screen centre.\n * An 8-fold cosine term on the distance metric creates the flower-like\n * distortion on the wave-front edge.\n *\n * wave(t, dist) = (2A/π) · atan(sin(2π·t·f) / k)\n * phase = u_time − dist / SPEED\n * scale = wave + BASE_SCALE\n * animPos = origPos × scale\n *\n * We evaluate a 5×5 neighbourhood around each fragment so dots that have\n * scaled away from their home cell are still drawn.\n */\nconst FRAG = `#version 300 es\nprecision highp float;\n\nuniform float u_time;\nuniform vec2 u_res;\nout vec4 fragColor;\n\n#define PI 3.14159265359\n#define CELL 18.0 /* px per grid cell */\n#define RADIUS 2.1 /* dot radius in px */\n#define SPEED 25.0 /* wave propagation */\n#define PERIOD 3.8 /* seconds per cycle */\n#define AMP 0.40 /* wave amplitude */\n#define BASE 1.30 /* resting scale */\n\nfloat swave(float t, float k) {\n return (2.0 * AMP / PI) * atan(sin(2.0 * PI * t / PERIOD) / k);\n}\n\nvoid main() {\n vec2 p = gl_FragCoord.xy;\n vec2 center = u_res * 0.5;\n vec2 gridP = p / CELL;\n\n float alpha = 0.0;\n\n for (int dy = -2; dy <= 2; dy++) {\n for (int dx = -2; dx <= 2; dx++) {\n /* grid cell index of this neighbour */\n vec2 cell = floor(gridP) + vec2(float(dx), float(dy));\n\n /* hex stagger: odd x-columns shift down half a cell */\n float hexY = mod(cell.x, 2.0) * 0.5;\n\n /* dot centre in grid units relative to screen centre */\n vec2 origGU = cell + vec2(0.5, 0.5 + hexY) - center / CELL;\n\n /* distance with 8-fold angular symmetry → petal wave-front */\n float d8 = length(origGU) + 0.5 * cos(8.0 * atan(origGU.y, origGU.x));\n\n /* smooth-square-wave breathing */\n float k = 0.15 + 0.2 * abs(d8) / 72.0;\n float wave = swave(u_time - d8 / SPEED, k);\n float scale = wave + BASE;\n\n /* animated dot centre in pixel space */\n vec2 animPx = origGU * scale * CELL + center;\n\n /* soft circle SDF */\n float dist = length(p - animPx);\n float a = 1.0 - smoothstep(RADIUS - 0.6, RADIUS + 0.6, dist);\n alpha = max(alpha, a);\n }\n }\n\n /* primary colour #ff4235 at low opacity — sits on frosted-glass overlay */\n fragColor = vec4(1.0, 0.259, 0.208, alpha * 0.28);\n}`;\n\n// ── WebGL helpers ──────────────────────────────────────────────────────────\nfunction buildProgram(gl: WebGL2RenderingContext): WebGLProgram {\n\tconst compile = (type: number, src: string) => {\n\t\t// biome-ignore lint/style/noNonNullAssertion: WebGL createShader returns null only on driver failure, which aborts rendering anyway\n\t\tconst s = gl.createShader(type)!;\n\t\tgl.shaderSource(s, src);\n\t\tgl.compileShader(s);\n\t\treturn s;\n\t};\n\t// biome-ignore lint/style/noNonNullAssertion: WebGL createProgram returns null only on driver failure, which aborts rendering anyway\n\tconst prog = gl.createProgram()!;\n\tgl.attachShader(prog, compile(gl.VERTEX_SHADER, VERT));\n\tgl.attachShader(prog, compile(gl.FRAGMENT_SHADER, FRAG));\n\tgl.linkProgram(prog);\n\treturn prog;\n}\n\n// ── Component ──────────────────────────────────────────────────────────────\ninterface BreathingDotsCanvasProps {\n\tactive: boolean;\n}\n\nexport function BreathingDotsCanvas({ active }: BreathingDotsCanvasProps) {\n\tconst canvasRef = useRef<HTMLCanvasElement>(null);\n\n\tuseEffect(() => {\n\t\tif (!active || !canvasRef.current) return;\n\t\tif (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n\n\t\tconst canvas = canvasRef.current;\n\t\tconst gl = canvas.getContext(\"webgl2\", { alpha: true, premultipliedAlpha: false });\n\t\tif (!gl) return;\n\n\t\tconst resize = () => {\n\t\t\tcanvas.width = window.innerWidth;\n\t\t\tcanvas.height = window.innerHeight;\n\t\t\tgl.viewport(0, 0, canvas.width, canvas.height);\n\t\t\tgl.uniform2f(uRes, canvas.width, canvas.height);\n\t\t};\n\n\t\tconst prog = buildProgram(gl);\n\t\t// biome-ignore lint/correctness/useHookAtTopLevel: gl.useProgram is a WebGL method, not a React hook\n\t\tgl.useProgram(prog);\n\n\t\t// Fullscreen quad\n\t\tconst buf = gl.createBuffer();\n\t\tgl.bindBuffer(gl.ARRAY_BUFFER, buf);\n\t\tgl.bufferData(\n\t\t\tgl.ARRAY_BUFFER,\n\t\t\tnew Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),\n\t\t\tgl.STATIC_DRAW,\n\t\t);\n\t\tconst aPos = gl.getAttribLocation(prog, \"a_pos\");\n\t\tgl.enableVertexAttribArray(aPos);\n\t\tgl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);\n\n\t\tconst uTime = gl.getUniformLocation(prog, \"u_time\");\n\t\tconst uRes = gl.getUniformLocation(prog, \"u_res\");\n\t\tgl.enable(gl.BLEND);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n\t\tresize();\n\t\twindow.addEventListener(\"resize\", resize);\n\n\t\tconst start = performance.now();\n\t\tlet raf: number;\n\n\t\tconst draw = () => {\n\t\t\tgl.uniform1f(uTime, (performance.now() - start) / 1000);\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(gl.COLOR_BUFFER_BIT);\n\t\t\tgl.drawArrays(gl.TRIANGLES, 0, 6);\n\t\t\traf = requestAnimationFrame(draw);\n\t\t};\n\t\traf = requestAnimationFrame(draw);\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(raf);\n\t\t\twindow.removeEventListener(\"resize\", resize);\n\t\t};\n\t}, [active]);\n\n\t// biome-ignore lint/a11y/noAriaHiddenOnFocusable: canvas is purely decorative and not keyboard-focusable\n\treturn <canvas ref={canvasRef} className={styles.canvas} aria-hidden=\"true\" />;\n}\n","@layer ds-components {\n /* ── Overlay shell — backdrop + WebGL canvas ──────────────────────── */\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--ds-z-modal);\n\n /* Starting state */\n opacity: 0;\n pointer-events: none;\n backdrop-filter: blur(0px) saturate(100%);\n background-color: transparent;\n\n transition:\n opacity var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n backdrop-filter var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n background-color var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1),\n overlay var(--ds-duration-base, 250ms) allow-discrete,\n display var(--ds-duration-base, 250ms) allow-discrete;\n }\n\n /* ── Open state ───────────────────────────────────────────────────── */\n .overlay[data-open=\"true\"] {\n opacity: 1;\n pointer-events: auto;\n backdrop-filter: blur(20px) saturate(160%);\n background-color: color-mix(in srgb, var(--ds-color-surface, #fff) 88%, transparent);\n\n @starting-style {\n opacity: 0;\n backdrop-filter: blur(0px) saturate(100%);\n background-color: transparent;\n }\n }\n\n /* ── Close state — faster than open ──────────────────────────────── */\n .overlay[data-open=\"false\"] {\n opacity: 0;\n pointer-events: none;\n transition:\n opacity var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n backdrop-filter var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n background-color var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0),\n overlay var(--ds-duration-fast, 150ms) allow-discrete,\n display var(--ds-duration-fast, 150ms) allow-discrete;\n }\n\n /* ── Logo layer — sits above the backdrop stacking context ────────── */\n /*\n * Separate position: fixed layer above the overlay so the logo never\n * fights the WebGL canvas GPU layer inside a backdrop-filter stacking\n * context.\n *\n * z-index fallback (401) covers the case where --ds-z-modal is defined on\n * .tot-ds-root and is therefore NOT inherited by portal elements (they are\n * children of <body>, not of .tot-ds-root).\n */\n .logoLayer {\n position: fixed;\n inset: 0;\n z-index: calc(var(--ds-z-modal, 400) + 1);\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n }\n\n /*\n * No @starting-style needed here — the element is always in the DOM\n * (portal fragment mounts once). [data-open] state changes drive the\n * opacity transition via regular CSS transitions.\n */\n .logoLayer[data-open=\"true\"] {\n opacity: 1;\n transition: opacity var(--ds-duration-base, 250ms) cubic-bezier(0.16, 1, 0.3, 1);\n }\n\n .logoLayer[data-open=\"false\"] {\n opacity: 0;\n transition: opacity var(--ds-duration-fast, 150ms) cubic-bezier(0.7, 0, 0.84, 0);\n }\n\n /* ── Reduced motion ───────────────────────────────────────────────── */\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .overlay[data-open=\"true\"],\n .overlay[data-open=\"false\"],\n .logoLayer,\n .logoLayer[data-open=\"true\"],\n .logoLayer[data-open=\"false\"] {\n transition: none;\n backdrop-filter: none;\n }\n }\n\n /* ── Screen-reader text ───────────────────────────────────────────── */\n /*\n * Portal sibling of the overlay and logo divs — never inside any stacking\n * context. Uses clip-path (modern, non-deprecated) and an explicit\n * font-family because portal renders outside .tot-ds-root and cannot\n * inherit the token-root font.\n */\n .srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n font-family: var(--ds-font-family, \"Manrope\", system-ui, sans-serif);\n }\n}\n","@layer ds-components {\n /* ── Outer wrapper — rings radiate from here ──────────────────────── */\n /*\n * will-change: transform promotes this element to its own GPU compositing\n * layer. Combined with z-index: 1, the browser compositor places it above\n * the WebGL canvas layer (which Chrome always promotes to its own layer),\n * regardless of backdrop-filter stacking-context paint order.\n */\n .outer {\n position: relative;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 120px;\n height: 120px;\n }\n\n /* ── Elevated circle ──────────────────────────────────────────────── */\n .circle {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 96px;\n height: 96px;\n border-radius: 50%;\n background-color: var(--ds-color-surface);\n box-shadow:\n var(--ds-shadow-xl),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n animation: circle-lift var(--ds-duration-slow, 400ms) ease-in-out infinite alternate;\n }\n\n @keyframes circle-lift {\n from {\n box-shadow:\n var(--ds-shadow-xl),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n transform: translateY(0px);\n }\n to {\n box-shadow:\n var(--ds-shadow-xl),\n 0 24px 40px oklch(0% 0 0 / 0.14),\n 0 0 0 1px oklch(0% 0 0 / 0.04);\n transform: translateY(-4px);\n }\n }\n\n /* ── Logo SVG ─────────────────────────────────────────────────────── */\n .logo {\n width: 52px;\n height: 52px;\n }\n\n .pathDark {\n fill: var(--ds-color-text);\n }\n\n .pathRed {\n fill: var(--ds-color-primary);\n transform-origin: 47px 55px;\n animation: red-breathe 1.6s ease-in-out infinite alternate;\n }\n\n @keyframes red-breathe {\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(1.08); opacity: 0.85; }\n }\n\n /* ── Wave rings ───────────────────────────────────────────────────── */\n .ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n border: 1.5px solid var(--ds-color-primary);\n animation: wave-ring 2.2s cubic-bezier(0.16, 1, 0.3, 1) infinite;\n }\n\n .ring:nth-child(2) { animation-delay: -0.73s; }\n .ring:nth-child(3) { animation-delay: -1.47s; }\n\n @keyframes wave-ring {\n 0% { transform: scale(0.6); opacity: 0.6; }\n 100% { transform: scale(2.4); opacity: 0; }\n }\n\n /* ── Reduced motion ───────────────────────────────────────────────── */\n @media (prefers-reduced-motion: reduce) {\n .circle {\n animation: none;\n box-shadow: var(--ds-shadow-xl), 0 0 0 1px oklch(0% 0 0 / 0.04);\n }\n .pathRed { animation: none; }\n .ring { display: none; }\n }\n}\n","import styles from \"./ToteatLogo.module.css\";\n\n/**\n * Toteat isotipo inside an elevated circle, with radiating wave rings.\n * Ported from design_system_vue/LogoToteat/svg/toteat-isotipo-original.svg.\n */\nexport function ToteatLogo() {\n\treturn (\n\t\t<div className={styles.outer} aria-hidden=\"true\">\n\t\t\t{/* Wave rings radiate behind the circle */}\n\t\t\t<div className={styles.ring} />\n\t\t\t<div className={styles.ring} />\n\t\t\t<div className={styles.ring} />\n\n\t\t\t{/* Elevated circle card */}\n\t\t\t<div className={styles.circle}>\n\t\t\t\t<svg\n\t\t\t\t\tclassName={styles.logo}\n\t\t\t\t\tviewBox=\"0 0 80 80\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName={styles.pathDark}\n\t\t\t\t\t\td=\"M47.328 24.999V10H32.329v14.999h-15v15h15v14.999h14.999V39.999h14.999V25z\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tclassName={styles.pathRed}\n\t\t\t\t\t\td=\"M32.328 40a15 15 0 0 0 14.998 15h15v15H47.329a15 15 0 0 1-15-15z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { createPortal } from \"react-dom\";\nimport { BreathingDotsCanvas } from \"./BreathingDotsCanvas\";\nimport styles from \"./PageLoadingOverlay.module.css\";\nimport { ToteatLogo } from \"./ToteatLogo\";\n\nexport interface PageLoadingOverlayProps {\n\tisOpen: boolean;\n\t/** Screen-reader announcement text. Defaults to \"Cargando…\" */\n\tlabel?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Full-screen blocking overlay for page-level loading states.\n *\n * Shows a frosted-glass backdrop with a WebGL breathing-dots animation and\n * the Toteat isotipo in an elevated circle. Renders via a React portal so it\n * always escapes any ancestor stacking context.\n *\n * Usage:\n * <PageLoadingOverlay isOpen={isPending} />\n * <PageLoadingOverlay isOpen={isPending} label=\"Guardando cambios…\" />\n */\nexport function PageLoadingOverlay({\n\tisOpen,\n\tlabel = \"Cargando…\",\n\t\"data-testid\": testId,\n}: PageLoadingOverlayProps) {\n\treturn createPortal(\n\t\t<>\n\t\t\t{/*\n\t\t\t * Layer 1 — backdrop + WebGL animation (z-index: --ds-z-modal).\n\t\t\t * backdrop-filter creates its own stacking context; the logo lives in a\n\t\t\t * separate layer above so there is no GPU-layer compositing fight.\n\t\t\t */}\n\t\t\t<div\n\t\t\t\tclassName={styles.overlay}\n\t\t\t\tdata-open={isOpen}\n\t\t\t\trole=\"status\"\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-busy={isOpen}\n\t\t\t\taria-label={label}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t<BreathingDotsCanvas active={isOpen} />\n\t\t\t</div>\n\n\t\t\t{/*\n\t\t\t * Layer 2 — logo (z-index: --ds-z-modal + 1).\n\t\t\t * tot-ds-root is applied so CSS custom properties resolve inside the\n\t\t\t * portal — portal elements are children of <body>, not of .tot-ds-root,\n\t\t\t * so they cannot inherit --ds-* variables without this class.\n\t\t\t */}\n\t\t\t<div className={`${styles.logoLayer} tot-ds-root`} data-open={isOpen} aria-hidden=\"true\">\n\t\t\t\t<ToteatLogo />\n\t\t\t</div>\n\n\t\t\t{/* Live region — sr-only, outside both stacking contexts */}\n\t\t\t<span className={styles.srOnly} aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t{isOpen ? label : \"\"}\n\t\t\t</span>\n\t\t</>,\n\t\tdocument.body,\n\t);\n}\n","import type { ReactNode } from \"react\";\n\nexport interface PermissionGateProps {\n\t/** Permission decision resolved by the consumer app. When false, renders fallback. */\n\tallowed: boolean;\n\t/** Rendered when allowed is true. */\n\tchildren: ReactNode;\n\t/** Rendered when allowed is false. @default null */\n\tfallback?: ReactNode;\n\t/**\n\t * Accepted to satisfy the DS `data-testid` convention and to let consumers spread\n\t * a testid coming from a parent without a TypeScript error. It is intentionally\n\t * UNUSED: this component renders a React fragment with no DOM root to attach it to\n\t * (identical to `React.Fragment`, which also ignores `data-testid`). If you need a\n\t * testable DOM node, put it on the children you pass in.\n\t */\n\t\"data-testid\"?: string;\n}\n\n/**\n * PermissionGate — a purely PRESENTATIONAL / STRUCTURAL primitive.\n *\n * It contains NO RBAC logic: no scopes, no bitwise actions, no hooks, no stores.\n * Each consumer app computes the permission decision and passes it in as the\n * `allowed` boolean. When `allowed` is true the `children` are rendered, otherwise\n * the `fallback` (default `null`) is rendered.\n *\n * It renders a React fragment with NO DOM wrapper, so it never injects an anonymous\n * layout node into a flex/grid container. There is no `.module.css` for this\n * component because it has no visual surface of its own.\n */\nexport function PermissionGate({ allowed, children, fallback = null }: PermissionGateProps) {\n\treturn <>{allowed ? children : fallback}</>;\n}\n","@layer ang-components {\n .overlay {\n position: fixed;\n inset: 0;\n z-index: 100;\n background-color: var(--ds-ang-neutral-100);\n display: flex;\n align-items: center;\n justify-content: center;\n overflow-y: auto;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./PinLockOverlay.module.css\";\n\nexport interface PinLockOverlayProps {\n\tisLocked: boolean;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function PinLockOverlay({ isLocked, children, \"data-testid\": testId }: PinLockOverlayProps) {\n\tif (!isLocked) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.overlay}\n\t\t\trole=\"dialog\"\n\t\t\taria-label=\"Pantalla bloqueada — ingresa tu PIN\"\n\t\t\taria-modal=\"true\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .tile {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--ds-space-1);\n padding: var(--ds-space-3);\n background: var(--ds-color-surface);\n border: 1px solid var(--ds-color-border);\n border-radius: var(--ds-radius-lg);\n cursor: pointer;\n text-align: center;\n min-height: 90px;\n position: relative;\n transition:\n background var(--ds-duration-fast) var(--ds-ease-out),\n border-color var(--ds-duration-fast) var(--ds-ease-out),\n transform var(--ds-duration-fast) var(--ds-ease-out);\n\n &:hover:not(:disabled) {\n background: var(--ds-color-primary-50);\n border-color: var(--ds-color-primary-light);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.96);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ds-color-primary);\n outline-offset: 2px;\n }\n\n &:disabled,\n &[data-stock=\"depleted\"] {\n opacity: 0.45;\n cursor: not-allowed;\n }\n\n &[data-stock=\"low\"] {\n border-color: var(--ds-color-warning);\n }\n }\n\n .image {\n width: 48px;\n height: 48px;\n object-fit: cover;\n border-radius: var(--ds-radius-sm);\n flex-shrink: 0;\n }\n\n .name {\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-semibold);\n color: var(--ds-color-text);\n line-height: var(--ds-leading-tight);\n word-break: break-word;\n }\n\n .price {\n font-size: var(--ds-font-size-sm);\n font-weight: var(--ds-font-weight-bold);\n color: var(--ds-color-primary);\n margin-top: auto;\n }\n\n .badge {\n position: absolute;\n top: var(--ds-space-1);\n right: var(--ds-space-1);\n font-size: var(--ds-font-size-xs);\n font-weight: var(--ds-font-weight-bold);\n border-radius: var(--ds-radius-full);\n padding: 1px 5px;\n line-height: 1.4;\n\n &[data-type=\"extras\"] {\n background: var(--ds-color-primary-100);\n color: var(--ds-color-primary);\n }\n\n &[data-type=\"weighed\"] {\n background: var(--ds-color-info-light);\n color: var(--ds-color-info-dark);\n }\n\n &[data-type=\"low-stock\"] {\n background: var(--ds-color-warning-light);\n color: var(--ds-color-warning-dark);\n }\n }\n}\n","import { memo } from \"react\";\n\nexport type StockStatusType = \"normal\" | \"low\" | \"depleted\";\n\nexport type ProductTileType = {\n\tid: string;\n\tname: string;\n\timageUrl: string | null;\n\tprice: number;\n\thasExtras: boolean;\n\tisWeighed: boolean;\n\tbarcode: string | null;\n\tstockStatus: StockStatusType;\n\tcategoryId: string;\n\textrasHierarchyIds: string[];\n};\n\nimport styles from \"./ProductTile.module.css\";\n\nexport type ProductTileProps = {\n\tproduct: ProductTileType;\n\tonAdd: (product: ProductTileType) => void;\n\t\"data-testid\"?: string;\n};\n\nfunction ProductTileComponent({ product, onAdd, \"data-testid\": testId }: ProductTileProps) {\n\tlet stockData: \"depleted\" | \"low\" | undefined;\n\tif (product.stockStatus === \"depleted\") stockData = \"depleted\";\n\telse if (product.stockStatus === \"low\") stockData = \"low\";\n\n\tconst isDisabled = product.stockStatus === \"depleted\";\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={styles.tile}\n\t\t\tdata-stock={stockData}\n\t\t\tonClick={() => {\n\t\t\t\tif (!isDisabled) onAdd(product);\n\t\t\t}}\n\t\t\tdisabled={isDisabled}\n\t\t\taria-label={`${product.name}, $${product.price.toLocaleString(\"es-CL\")}`}\n\t\t\taria-disabled={isDisabled}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{product.imageUrl && (\n\t\t\t\t<img\n\t\t\t\t\tsrc={product.imageUrl}\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tclassName={styles.image}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className={styles.name}>{product.name}</span>\n\t\t\t<span className={styles.price}>${product.price.toLocaleString(\"es-CL\")}</span>\n\n\t\t\t{product.hasExtras && (\n\t\t\t\t<span className={styles.badge} data-type=\"extras\" role=\"img\" aria-label=\"Tiene extras\">\n\t\t\t\t\t+\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{product.isWeighed && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={styles.badge}\n\t\t\t\t\tdata-type=\"weighed\"\n\t\t\t\t\trole=\"img\"\n\t\t\t\t\taria-label=\"Producto por peso\"\n\t\t\t\t>\n\t\t\t\t\tkg\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{product.stockStatus === \"low\" && (\n\t\t\t\t<span className={styles.badge} data-type=\"low-stock\" role=\"img\" aria-label=\"Stock bajo\">\n\t\t\t\t\t!\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</button>\n\t);\n}\n\nexport const ProductTile = memo(ProductTileComponent);\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n opacity: 0.4;\n cursor: not-allowed;\n }\n }\n\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n .circle {\n flex-shrink: 0;\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n background-color: var(--color-surface);\n border: 1.5px solid var(--color-border);\n border-radius: var(--radius-circle);\n transition:\n background-color var(--duration-fast) var(--ease-out),\n border-color var(--duration-fast) var(--ease-out),\n box-shadow var(--duration-fast) var(--ease-out);\n\n &::after {\n content: '';\n display: block;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-circle);\n background-color: transparent;\n transition: background-color var(--duration-fast) var(--ease-out);\n }\n }\n\n .wrapper:hover:not(:has(.input:disabled)) .circle {\n border-color: var(--color-neutral-400);\n }\n\n .input:checked + .circle {\n border-color: var(--color-primary);\n\n &::after {\n background-color: var(--color-primary);\n }\n }\n\n .input:focus-visible + .circle {\n outline: none;\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n }\n\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-sm);\n line-height: var(--leading-normal);\n color: var(--color-text);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Radio.module.css\";\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n\tlabel?: string;\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Radio({ label, className, id, ref, \"data-testid\": testId, ...props }: RadioProps) {\n\tconst inputId = id ?? `radio-${props.value}`;\n\treturn (\n\t\t<label\n\t\t\tclassName={[styles.wrapper, className].filter(Boolean).join(\" \")}\n\t\t\thtmlFor={inputId}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<input ref={ref} type=\"radio\" id={inputId} className={styles.input} {...props} />\n\t\t\t<span className={styles.circle} aria-hidden=\"true\" />\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n\t.root {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tinline-size: 100%;\n\t}\n\n\t.input {\n\t\tinline-size: 100%;\n\t\tmargin: 0;\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tcolor: var(--ds-color-text);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-normal);\n\t\tpadding-block: var(--ds-space-2);\n\t\t/* Trailing space reserves room for the clear button tap target. */\n\t\tpadding-inline: var(--ds-space-3) var(--ds-target-size-min);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t\tborder-color: var(--ds-focus-color);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--ds-color-text-muted);\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t/* Hide the UA-native search clear affordance; we render our own. */\n\t\t&::-webkit-search-cancel-button {\n\t\t\tappearance: none;\n\t\t}\n\t}\n\n\t.root[data-size=\"sm\"] .input {\n\t\tfont-size: var(--ds-font-size-xs);\n\t\tpadding-block: var(--ds-space-1);\n\t}\n\n\t.root[data-size=\"lg\"] .input {\n\t\tfont-size: var(--ds-font-size-base);\n\t\tpadding-block: var(--ds-space-3);\n\t}\n\n\t.clear {\n\t\tposition: absolute;\n\t\tinset-inline-end: 0;\n\t\tinset-block-start: 50%;\n\t\ttranslate: 0 -50%;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: var(--ds-color-text-muted);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:hover {\n\t\t\tcolor: var(--ds-color-text);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.input {\n\t\t\ttransition: border-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\n\t\t.clear {\n\t\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./SearchInput.module.css\";\n\nexport type SearchInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SearchInputProps\n\textends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n\t/**\n\t * Fired on every input change, debounced by `debounceMs`.\n\t *\n\t * Controlled-mode note: when a `value` prop is provided the component is\n\t * controlled and the clear button also fires the debounced `onSearch(\"\")`,\n\t * but it CANNOT reset the input itself — the consumer owns `value`. Reset it\n\t * in your `onClear`/`onSearch` handler, otherwise the field keeps its value.\n\t */\n\tonSearch?: (value: string) => void;\n\t/**\n\t * Fired when the clear button is pressed.\n\t *\n\t * Uncontrolled: the internal value is reset to \"\" before this fires.\n\t * Controlled (a `value` prop is provided): the component does NOT (and\n\t * cannot) reset the input — you own `value`. Reset it here (or in\n\t * `onSearch`) to actually clear the field; the click already fired the\n\t * debounced `onSearch(\"\")` for you.\n\t */\n\tonClear?: () => void;\n\t/** Debounce window for `onSearch`, in milliseconds. Defaults to 300. */\n\tdebounceMs?: number;\n\t/** Visual size of the field. Maps to `data-size` on the root. */\n\tsize?: SearchInputSize;\n\t/** Accessible label for the clear button. */\n\tclearLabel?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function SearchInput({\n\tonSearch,\n\tonClear,\n\tdebounceMs = 300,\n\tsize = \"md\",\n\tclearLabel = \"Limpiar búsqueda\",\n\tclassName,\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tdisabled,\n\t\"data-testid\": testId,\n\t...rest\n}: SearchInputProps) {\n\tconst isControlled = value !== undefined;\n\tconst [internalValue, setInternalValue] = useState(() => (defaultValue ?? \"\").toString());\n\tconst currentValue = isControlled ? String(value) : internalValue;\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\t// Native-timer cleanup on unmount — no library.\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timerRef.current !== null) {\n\t\t\t\tclearTimeout(timerRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst fireSearch = (nextValue: string) => {\n\t\tif (!onSearch) return;\n\t\tif (timerRef.current !== null) {\n\t\t\tclearTimeout(timerRef.current);\n\t\t}\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tonSearch(nextValue);\n\t\t}, debounceMs);\n\t};\n\n\tconst handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tconst nextValue = event.target.value;\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(nextValue);\n\t\t}\n\t\tonChange?.(event);\n\t\tfireSearch(nextValue);\n\t};\n\n\tconst handleClear = () => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalValue(\"\");\n\t\t}\n\t\tfireSearch(\"\");\n\t\tonClear?.();\n\t\tinputRef.current?.focus();\n\t};\n\n\tconst hasValue = currentValue.length > 0;\n\n\treturn (\n\t\t<div className={cn(styles.root, className)} data-size={size} data-testid={testId}>\n\t\t\t<input\n\t\t\t\t{...rest}\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"search\"\n\t\t\t\tclassName={styles.input}\n\t\t\t\tvalue={currentValue}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t/>\n\t\t\t{hasValue && !disabled && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={styles.clear}\n\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t>\n\t\t\t\t\t<Icon name=\"close-outline\" size={20} aria-hidden=\"true\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .root {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--ds-space-4);\n }\n\n .content {\n display: flex;\n align-items: center;\n gap: var(--ds-space-3);\n min-inline-size: 0;\n }\n\n .iconWrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--ds-color-text-muted);\n }\n\n .text {\n display: flex;\n flex-direction: column;\n gap: var(--ds-space-1);\n min-inline-size: 0;\n }\n\n .title {\n font-size: var(--ds-font-size-lg);\n font-weight: var(--ds-font-weight-semibold);\n line-height: var(--ds-leading-tight);\n color: var(--ds-color-text);\n margin: 0;\n }\n\n .description {\n font-size: var(--ds-font-size-sm);\n color: var(--ds-color-text-muted);\n line-height: var(--ds-leading-normal);\n margin: 0;\n }\n\n .actions {\n display: flex;\n align-items: center;\n gap: var(--ds-space-2);\n flex-shrink: 0;\n }\n}\n","import type { ReactNode } from \"react\";\nimport type { IconNameType as IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./SectionHeader.module.css\";\n\nexport interface SectionHeaderProps {\n\ttitle: string;\n\tdescription?: string;\n\ticon?: IconName;\n\ticonSize?: number;\n\theadingLevel?: 1 | 2 | 3 | 4;\n\tactions?: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function SectionHeader({\n\ttitle,\n\tdescription,\n\ticon,\n\ticonSize = 32,\n\theadingLevel = 2,\n\tactions,\n\tclassName,\n\t\"data-testid\": testId,\n}: SectionHeaderProps) {\n\tconst Heading = `h${headingLevel}` as const;\n\n\treturn (\n\t\t<header className={[styles.root, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t<div className={styles.content}>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className={styles.iconWrap} aria-hidden=\"true\">\n\t\t\t\t\t\t<Icon name={icon} size={iconSize} aria-hidden=\"true\" />\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<div className={styles.text}>\n\t\t\t\t\t<Heading className={styles.title}>{title}</Heading>\n\t\t\t\t\t{description && <p className={styles.description}>{description}</p>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{actions && <div className={styles.actions}>{actions}</div>}\n\t\t</header>\n\t);\n}\n","@layer ds-components {\n\t.select {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t}\n\n\t.trigger {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-base);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tcursor: pointer;\n\t\ttext-align: left;\n\t\ttransition:\n\t\t\tborder-color var(--duration-fast) var(--ease-out),\n\t\t\tbox-shadow var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tborder-color: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.select[data-open] .trigger {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0 0 0 3px var(--color-primary-light);\n\t}\n\n\t.select[data-error] .trigger {\n\t\tborder-color: var(--color-error);\n\n\t\t&:focus-visible {\n\t\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t\t}\n\t}\n\n\t.select[data-error][data-open] .trigger {\n\t\tborder-color: var(--color-error);\n\t\tbox-shadow: 0 0 0 3px var(--color-error-light);\n\t}\n\n\t.value {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t}\n\n\t.placeholder {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-neutral-400);\n\t}\n\n\t.chevron {\n\t\tflex-shrink: 0;\n\t\tmargin-left: var(--spacing-sm);\n\t\tcolor: var(--color-text-muted);\n\t\tfont-size: var(--text-sm);\n\t\ttransition: transform var(--duration-fast) var(--ease-out);\n\t}\n\n\t.select[data-open] .chevron {\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.dropdown {\n\t\tposition: absolute;\n\t\ttop: calc(100% + var(--spacing-xs));\n\t\tleft: 0;\n\t\tright: 0;\n\t\tz-index: var(--z-dropdown);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: 1.5px solid var(--color-border);\n\t\tborder-radius: var(--radius-md);\n\t\tbox-shadow: var(--shadow-lg);\n\t\tmax-height: 240px;\n\t\toverflow-y: auto;\n\t\toverscroll-behavior: contain;\n\t}\n\n\t.search {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground-color: var(--color-surface);\n\t\tborder: none;\n\t\tborder-bottom: 1.5px solid var(--color-border);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t}\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t.option {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\ttext-align: left;\n\t\tcursor: pointer;\n\t\ttransition: background-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-neutral-50);\n\t\t}\n\n\t\t&[data-selected] {\n\t\t\tcolor: var(--color-primary);\n\t\t\tfont-weight: var(--font-medium);\n\t\t\tbackground-color: var(--color-primary-50);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--color-neutral-400);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: -2px;\n\t\t}\n\t}\n\n\t.noResults {\n\t\tpadding: var(--spacing-sm) var(--spacing-md);\n\t\tfont-size: var(--text-sm);\n\t\tcolor: var(--color-text-muted);\n\t\ttext-align: center;\n\t}\n}\n","import { useEffect, useState } from \"react\";\nimport { useDropdown } from \"../../hooks/useDropdown\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./Select.module.css\";\n\nexport interface SelectOption {\n\tvalue: string;\n\tlabel: string;\n\tdisabled?: boolean;\n}\n\nexport interface SelectProps {\n\toptions: SelectOption[];\n\tvalue?: string;\n\tonChange?: (value: string) => void;\n\tplaceholder?: string;\n\tsearchable?: boolean;\n\tsearchPlaceholder?: string;\n\tnoResultsText?: string;\n\tdisabled?: boolean;\n\terror?: boolean;\n\tname?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Select({\n\toptions,\n\tvalue,\n\tonChange,\n\tplaceholder = \"Seleccionar...\",\n\tsearchable = false,\n\tsearchPlaceholder = \"Buscar...\",\n\tnoResultsText = \"Sin resultados\",\n\tdisabled,\n\terror,\n\tname,\n\t\"data-testid\": dataTestId,\n}: SelectProps): React.ReactElement {\n\tconst [search, setSearch] = useState(\"\");\n\n\t// Shared dropdown core: open state, refs, toggle, focus-return-to-trigger.\n\t// Select keeps its own outside-click + Escape listeners because, unlike DropdownButton,\n\t// it returns focus to the trigger on outside-click; both reuse the hook's\n\t// `closeAndFocusTrigger`. Select has no roving keyboard nav (it relies on the optional\n\t// search field), so the hook's active-index handler is intentionally unused.\n\tconst {\n\t\tisOpen,\n\t\tcontainerRef,\n\t\ttriggerRef,\n\t\ttoggle,\n\t\tclose,\n\t\tcloseAndFocusTrigger: closeDropdown,\n\t} = useDropdown({ disabled, closeOnOutsideClick: false });\n\n\tconst selectedOption = options.find((o) => o.value === value);\n\tconst filteredOptions = searchable\n\t\t? options.filter((o) => o.label.toLowerCase().includes(search.toLowerCase()))\n\t\t: options;\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: MouseEvent) => {\n\t\t\tif (!containerRef.current?.contains(e.target as Node)) closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handler);\n\t\treturn () => document.removeEventListener(\"mousedown\", handler);\n\t}, [isOpen, closeDropdown, containerRef]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\t\tconst handler = (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") closeDropdown();\n\t\t};\n\t\tdocument.addEventListener(\"keydown\", handler);\n\t\treturn () => document.removeEventListener(\"keydown\", handler);\n\t}, [isOpen, closeDropdown]);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={styles.select}\n\t\t\tdata-open={isOpen || undefined}\n\t\t\tdata-error={error || undefined}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<input type=\"hidden\" name={name} value={value ?? \"\"} />\n\t\t\t<button\n\t\t\t\tref={triggerRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tonClick={toggle}\n\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t<span className={selectedOption ? styles.value : styles.placeholder}>\n\t\t\t\t\t{selectedOption?.label ?? placeholder}\n\t\t\t\t</span>\n\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\">\n\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t\t{isOpen && (\n\t\t\t\t<div className={styles.dropdown} role=\"listbox\">\n\t\t\t\t\t{searchable && (\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tclassName={styles.search}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\n\t\t\t\t\t\t\t// biome-ignore lint/a11y/noAutofocus: search input needs focus when dropdown opens\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{filteredOptions.map((option) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\taria-selected={option.value === value}\n\t\t\t\t\t\t\tclassName={styles.option}\n\t\t\t\t\t\t\tdata-selected={option.value === value || undefined}\n\t\t\t\t\t\t\tdisabled={option.disabled}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonChange?.(option.value);\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t\t{filteredOptions.length === 0 && <div className={styles.noResults}>{noResultsText}</div>}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n .item {\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-8);\n width: 100%;\n padding: var(--ds-ang-space-6) var(--ds-ang-space-8);\n background: none;\n border: none;\n border-radius: var(--ds-ang-radius-sm);\n text-align: left;\n cursor: pointer;\n color: var(--ds-ang-neutral-0);\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n line-height: 1.3;\n text-decoration: none;\n user-select: none;\n transition:\n background-color 100ms ease,\n font-weight 100ms ease,\n color 100ms ease;\n }\n\n /* Sub-items (inside .inner) inherit these overrides via CSS custom props */\n .item:hover {\n background-color: var(--_item-hover-bg, var(--ds-ang-tertiary));\n color: var(--_item-hover-color, var(--ds-ang-secondary));\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .item.active,\n .item[data-active] {\n background-color: var(--_item-hover-bg, var(--ds-ang-tertiary));\n color: var(--_item-hover-color, var(--ds-ang-secondary));\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .item:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./SidebarNavItem.module.css\";\n\nexport { styles as sidebarNavItemStyles };\nexport const sidebarNavItemClass = styles.item;\nexport const sidebarNavItemActiveClass = styles.active;\n\nexport interface SidebarNavItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tlabel: string;\n\tisActive?: boolean;\n}\n\nexport function SidebarNavItem({\n\tlabel,\n\tisActive = false,\n\tclassName,\n\ttype = \"button\",\n\t...rest\n}: SidebarNavItemProps) {\n\treturn (\n\t\t<button\n\t\t\ttype={type}\n\t\t\tclassName={cn(styles.item, isActive && styles.active, className)}\n\t\t\tdata-active={isActive || undefined}\n\t\t\t{...rest}\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n}\n","import { useCallback, useState } from \"react\";\n\nexport type UseToggleReturn = [boolean, () => void, React.Dispatch<React.SetStateAction<boolean>>];\n\n/**\n * Minimal boolean toggle state. Returns `[state, toggle, setState]`.\n * Internal hook — not part of the public API. Used to de-duplicate the\n * open/close booleans in Accordion and SidebarNavSection.\n */\nexport function useToggle(initial = false): UseToggleReturn {\n\tconst [state, setState] = useState(initial);\n\tconst toggle = useCallback(() => setState((s) => !s), []);\n\treturn [state, toggle, setState];\n}\n","@layer ang-components {\n .section {\n display: flex;\n flex-direction: column;\n }\n\n .trigger {\n display: flex;\n align-items: center;\n gap: var(--ds-ang-space-8);\n width: 100%;\n padding: var(--ds-ang-space-6) var(--ds-ang-space-8);\n background: none;\n border: none;\n border-radius: var(--ds-ang-radius-sm);\n text-align: left;\n cursor: pointer;\n color: var(--ds-ang-neutral-0);\n font-family: var(--ds-ang-font-family);\n font-size: var(--ds-ang-font-size-menu);\n font-weight: var(--ds-ang-font-weight-normal);\n line-height: 1.3;\n user-select: none;\n transition:\n background-color 100ms ease,\n font-weight 100ms ease,\n color 100ms ease;\n }\n\n .trigger:hover,\n .trigger[data-open],\n .trigger[data-active] {\n background-color: var(--ds-ang-tertiary);\n color: var(--ds-ang-secondary);\n font-weight: var(--ds-ang-font-weight-bold);\n }\n\n .trigger:focus-visible {\n outline: var(--ds-ang-focus-width) solid var(--ds-ang-focus-color);\n outline-offset: var(--ds-ang-focus-offset);\n border-radius: var(--ds-ang-radius-sm);\n }\n\n .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .title {\n flex: 1;\n }\n\n .chevron {\n display: block;\n width: 6px;\n height: 6px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(45deg);\n transition: transform 200ms ease-in-out;\n flex-shrink: 0;\n margin-right: var(--ds-ang-space-4);\n }\n\n .trigger[data-open] .chevron {\n transform: rotate(-135deg);\n }\n\n .content {\n overflow: hidden;\n max-height: 0;\n transition: max-height 200ms ease-in-out;\n }\n\n .content[data-open] {\n max-height: 1000px;\n }\n\n .inner {\n margin-left: var(--ds-ang-space-16);\n padding-left: var(--ds-ang-space-12);\n padding-bottom: var(--ds-ang-space-4);\n margin-top: var(--ds-ang-space-8);\n border-left: 1.5px solid var(--ds-ang-neutral-500);\n /* Sub-items use neutral-500 bg + white text on hover/active */\n --_item-hover-bg: var(--ds-ang-neutral-500);\n --_item-hover-color: var(--ds-ang-neutral-0);\n }\n\n .suffix {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n line-height: 1;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useToggle } from \"../../hooks/useToggle\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./SidebarNavSection.module.css\";\n\nexport interface SidebarNavSectionProps {\n\ttitle: string;\n\ticon?: ReactNode;\n\ttitleSuffix?: ReactNode;\n\tdefaultOpen?: boolean;\n\tisActive?: boolean;\n\tclassName?: string;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function SidebarNavSection({\n\ttitle,\n\ticon,\n\ttitleSuffix,\n\tdefaultOpen = false,\n\tisActive = false,\n\tclassName,\n\tchildren,\n\t\"data-testid\": testId,\n}: SidebarNavSectionProps) {\n\tconst [isOpen, toggleOpen] = useToggle(defaultOpen);\n\n\treturn (\n\t\t<div className={cn(styles.section, className)} data-testid={testId}>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\tdata-open={isOpen || undefined}\n\t\t\t\tdata-active={isActive || undefined}\n\t\t\t\tonClick={toggleOpen}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t\t{titleSuffix && (\n\t\t\t\t\t<span className={styles.suffix} aria-hidden=\"true\">\n\t\t\t\t\t\t{titleSuffix}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className={styles.chevron} aria-hidden=\"true\" />\n\t\t\t</button>\n\t\t\t<div className={styles.content} data-open={isOpen || undefined} inert={!isOpen || undefined}>\n\t\t\t\t<div className={styles.inner}>{children}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type React from \"react\";\nimport type { BadgeSize, BadgeVariant } from \"../Badge\";\nimport { Badge } from \"../Badge\";\n\nexport interface StatusBadgeProps {\n\tstatus: string;\n\tlabels: Record<string, string>;\n\tvariants: Record<string, BadgeVariant>;\n\tfallbackLabel?: string;\n\tfallbackVariant?: BadgeVariant;\n\tsize?: BadgeSize;\n\t\"data-testid\"?: string;\n}\n\nexport function StatusBadge({\n\tstatus,\n\tlabels,\n\tvariants,\n\tfallbackLabel,\n\tfallbackVariant = \"default\",\n\tsize,\n\t\"data-testid\": testId,\n}: StatusBadgeProps): React.ReactElement {\n\treturn (\n\t\t<Badge variant={variants[status] ?? fallbackVariant} size={size} data-testid={testId}>\n\t\t\t{labels[status] ?? fallbackLabel ?? status}\n\t\t</Badge>\n\t);\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { Icon } from \"../Icon\";\n\n/**\n * Shared presentational/ARIA shell for notification-surface primitives\n * (UserNotification, StatusBanner). INTERNAL — never exported from any index.ts.\n *\n * Owns only structure + ARIA. Each caller supplies its own CSS-module root\n * class (`rootClassName`) so visual variance (e.g. enter animation, inline-flex\n * vs flex) lives entirely in the caller's module.css.\n */\n\nexport type NotificationVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface NotificationBaseProps {\n\tvariant: NotificationVariant;\n\t/**\n\t * Caller's CSS-module root class (e.g. styles.notification / styles.statusBanner).\n\t * Typed loosely because CSS-module lookups widen to `string | undefined` under\n\t * `noUncheckedIndexedAccess`.\n\t */\n\trootClassName: string | undefined;\n\t/** Caller's content span class. */\n\tcontentClassName: string | undefined;\n\t/** Caller's action span class. */\n\tactionClassName: string | undefined;\n\ticon?: IconNameType;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\t/** Extra consumer-supplied className, merged after the module root class. */\n\tclassName?: string;\n\t\"data-testid\"?: string;\n\t/**\n\t * Trailing control (e.g. UserNotification passes <CloseButton/>).\n\t * StatusBanner omits it — no element is rendered when undefined.\n\t */\n\tdismissSlot?: React.ReactNode;\n\t/**\n\t * Adds aria-atomic=\"true\" to the root. Opt-in so callers that must keep a\n\t * frozen DOM (UserNotification) are unaffected.\n\t */\n\tariaAtomic?: boolean;\n}\n\nexport function NotificationBase({\n\tvariant,\n\trootClassName,\n\tcontentClassName,\n\tactionClassName,\n\ticon,\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n\tdismissSlot,\n\tariaAtomic,\n}: NotificationBaseProps): React.ReactElement {\n\tconst isError = variant === \"error\";\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[rootClassName, className].filter(Boolean).join(\" \")}\n\t\t\tdata-variant={variant}\n\t\t\trole={isError ? \"alert\" : \"status\"}\n\t\t\taria-live={isError ? \"assertive\" : \"polite\"}\n\t\t\taria-atomic={ariaAtomic ? \"true\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{icon && <Icon name={icon} size={20} aria-hidden=\"true\" />}\n\t\t\t<span className={contentClassName}>{children}</span>\n\t\t\t{action && <span className={actionClassName}>{action}</span>}\n\t\t\t{dismissSlot}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.statusBanner {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t/*\n\t * Persistent surface — NO @starting-style enter animation. Only a soft\n\t * color transition when the variant changes, gated on motion preference.\n\t */\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.statusBanner {\n\t\t\ttransition:\n\t\t\t\tcolor var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\tbackground-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport type { IconNameType } from \"../Icon\";\nimport { NotificationBase } from \"../UserNotification/NotificationBase\";\nimport styles from \"./StatusBanner.module.css\";\n\nexport type StatusBannerVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface StatusBannerProps {\n\tvariant?: StatusBannerVariant;\n\ticon?: IconNameType;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\n/**\n * Persistent, non-dismissable status surface (e.g. POS connectivity).\n * Shares the notification surface with UserNotification but never renders a\n * dismiss control. Uses `aria-atomic=\"true\"` so assistive tech re-announces the\n * full message when its content changes.\n */\nexport function StatusBanner({\n\tvariant = \"info\",\n\ticon,\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: StatusBannerProps): React.ReactElement {\n\treturn (\n\t\t<NotificationBase\n\t\t\tvariant={variant}\n\t\t\trootClassName={styles.statusBanner}\n\t\t\tcontentClassName={styles.content}\n\t\t\tactionClassName={styles.action}\n\t\t\ticon={icon}\n\t\t\taction={action}\n\t\t\tclassName={className}\n\t\t\tdata-testid={testId}\n\t\t\tariaAtomic\n\t\t>\n\t\t\t{children}\n\t\t</NotificationBase>\n\t);\n}\n","@layer ds-components {\n\t.stepper {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-1);\n\t\tpadding: var(--ds-space-1);\n\t\tborder: var(--ds-focus-width) solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tfont-family: var(--ds-font-family);\n\t}\n\n\t.button {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\tbackground-color: transparent;\n\t\tcolor: var(--ds-color-text);\n\t\tfont-size: var(--ds-font-size-lg);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tline-height: 1;\n\t\tcursor: pointer;\n\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcolor: var(--ds-color-text-muted);\n\t\t\tcursor: not-allowed;\n\t\t}\n\t}\n\n\t.value {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmin-inline-size: var(--ds-space-8);\n\t\tpadding-inline: var(--ds-space-2);\n\t\tcolor: var(--ds-color-text);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tfont-variant-numeric: tabular-nums;\n\t\ttext-align: center;\n\t}\n\n\t/* Static (no-motion) baseline: instant background change. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.button {\n\t\t\ttransition: background-color var(--ds-duration-fast) var(--ds-ease-out);\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepperProps {\n\tvalue: number;\n\tonChange: (value: number) => void;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdisabled?: boolean;\n\tdecrementLabel?: string;\n\tincrementLabel?: string;\n\tclassName?: string;\n\t/** Accessible name for the `role=\"group\"` container. Required — an unnamed group is an a11y violation. */\n\t\"aria-label\": string;\n\t\"data-testid\"?: string;\n}\n\nexport function Stepper({\n\tvalue,\n\tonChange,\n\tmin = 0,\n\tmax,\n\tstep = 1,\n\tdisabled = false,\n\tdecrementLabel = \"Decrease\",\n\tincrementLabel = \"Increase\",\n\tclassName,\n\t\"aria-label\": ariaLabel,\n\t\"data-testid\": testId,\n}: StepperProps): React.ReactElement {\n\t// Defensive guards: a degenerate step (0, negative, NaN) must not no-op or invert\n\t// direction; a non-finite value must never be clamped/displayed/emitted as-is.\n\tconst effectiveStep = Number.isFinite(step) && step > 0 ? step : 1;\n\t// Normalize bounds to finite values first: a non-finite min/max must never leak\n\t// into safeValue, the atMin/atMax checks, or the clamps below (would emit NaN).\n\tconst safeMin = Number.isFinite(min) ? min : 0;\n\tconst safeMax = max !== undefined && Number.isFinite(max) ? max : undefined;\n\tconst safeValue = Number.isFinite(value) ? value : safeMin;\n\n\tconst atMin = safeValue <= safeMin;\n\tconst atMax = safeMax !== undefined && safeValue >= safeMax;\n\n\tconst decrement = (): void => {\n\t\tconst next = Math.max(safeMin, safeValue - effectiveStep);\n\t\tif (next !== safeValue) {\n\t\t\tonChange(next);\n\t\t}\n\t};\n\n\tconst increment = (): void => {\n\t\tconst upperBound =\n\t\t\tsafeMax !== undefined\n\t\t\t\t? Math.min(safeMax, safeValue + effectiveStep)\n\t\t\t\t: safeValue + effectiveStep;\n\t\tif (upperBound !== safeValue) {\n\t\t\tonChange(upperBound);\n\t\t}\n\t};\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: role=\"group\" per DS spec; a <fieldset> would force a layout-breaking border/legend wrapper and violate the minimal-DOM primitive rule\n\t\t<div\n\t\t\tclassName={cn(styles.stepper, className)}\n\t\t\trole=\"group\"\n\t\t\taria-label={ariaLabel}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.button}\n\t\t\t\tonClick={decrement}\n\t\t\t\tdisabled={disabled || atMin}\n\t\t\t\taria-label={decrementLabel}\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">&minus;</span>\n\t\t\t</button>\n\t\t\t<output className={styles.value} aria-live=\"polite\">\n\t\t\t\t{safeValue}\n\t\t\t</output>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.button}\n\t\t\t\tonClick={increment}\n\t\t\t\tdisabled={disabled || atMax}\n\t\t\t\taria-label={incrementLabel}\n\t\t\t>\n\t\t\t\t<span aria-hidden=\"true\">&plus;</span>\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n /* Pills wrapper around the composed GroupedButtons segmented control */\n .tab {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm);\n background-color: var(--ds-color-white);\n border-radius: var(--radius-xl);\n box-shadow: var(--ds-shadow-1, 0 1px 2px color-mix(in srgb, var(--color-neutral-300) 54%, transparent));\n width: fit-content;\n flex-shrink: 0;\n\n &[data-full-width] {\n width: 100%;\n }\n }\n\n /* Make the composed fieldset behave like a row of independent pills */\n .tab .group {\n gap: var(--spacing-sm);\n overflow: visible;\n }\n\n /* Reset GroupedButtons' joined-segment look into standalone pills */\n .tab .group :is(button) {\n border: none;\n border-radius: var(--radius-xl);\n background-color: transparent;\n color: var(--color-neutral-500);\n font-weight: 500;\n }\n\n .tab .group :is(button):hover:not(:disabled):not([data-selected]) {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n .tab .group :is(button):disabled {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-300);\n opacity: 1;\n }\n\n /* Selected pill color — driven by data-selected-color on the wrapper */\n .tab[data-selected-color=\"primary\"] .group :is(button)[data-selected] {\n background-color: var(--color-primary);\n color: var(--ds-color-white);\n }\n\n .tab[data-selected-color=\"secondary\"] .group :is(button)[data-selected] {\n background-color: var(--color-secondary);\n color: var(--ds-color-white);\n }\n\n .tab[data-selected-color=\"tertiary\"] .group :is(button)[data-selected] {\n background-color: var(--color-tertiary);\n color: var(--color-secondary);\n }\n\n .tab[data-selected-color=\"neutral-100\"] .group :is(button)[data-selected] {\n background-color: var(--color-neutral-100);\n color: var(--color-secondary);\n }\n\n /* Icon fill follows text color on tertiary / neutral-100 selected pills */\n .tab[data-selected-color=\"tertiary\"] .group :is(button)[data-selected] svg,\n .tab[data-selected-color=\"neutral-100\"] .group :is(button)[data-selected] svg {\n fill: var(--color-secondary);\n }\n}\n","import { useRef, useState } from \"react\";\nimport type { GroupedButtonOption, GroupedButtonSize } from \"../GroupedButtons\";\nimport { GroupedButtons } from \"../GroupedButtons\";\nimport type { IconName } from \"../Icon\";\nimport styles from \"./Tab.module.css\";\n\nexport type TabValue = string | number;\n\nexport type TabSelectedColor = \"primary\" | \"secondary\" | \"tertiary\" | \"neutral-100\";\n\nexport interface TabItem {\n\tvalue: TabValue;\n\tlabel: string;\n\tdisabled?: boolean;\n\ticon?: IconName;\n\t/** Forwarded to this tab's `<button>` for use as a test/Playwright locator. */\n\t\"data-testid\"?: string;\n}\n\nexport interface TabProps {\n\t/** Tabs to render as a segmented control. */\n\ttabs: TabItem[];\n\t/** Accessible label for the tablist / button group. */\n\tlabel: string;\n\t/** Controlled selected value. When provided the caller owns selection. */\n\tselectedTab?: TabValue;\n\t/** Size of the control. Defaults to \"medium\". */\n\tsize?: GroupedButtonSize;\n\t/** Stretch the control to fill its container. Defaults to true (Vue3 parity). */\n\tfullWidth?: boolean;\n\t/** Color applied to the selected pill. Defaults to \"secondary\". */\n\tselectedColor?: TabSelectedColor;\n\t/** Fired whenever a (non-disabled) tab is selected. */\n\tonChange?: (value: TabValue) => void;\n\t/** Fired on tab click with the full tab descriptor. */\n\tonTabClick?: (tab: { value: TabValue; label: string }) => void;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Tab({\n\ttabs,\n\tlabel,\n\tselectedTab,\n\tsize = \"medium\",\n\tfullWidth = true,\n\tselectedColor = \"secondary\",\n\tonChange,\n\tonTabClick,\n\tclassName,\n\t\"data-testid\": testId,\n}: TabProps) {\n\tconst [internalValue, setInternalValue] = useState<TabValue | undefined>(() => tabs[0]?.value);\n\n\tconst isControlled = selectedTab !== undefined;\n\tconst current = isControlled ? selectedTab : internalValue;\n\n\tconst wasControlled = useRef(isControlled);\n\tif (process.env.NODE_ENV !== \"production\" && wasControlled.current !== isControlled) {\n\t\tconsole.error(\n\t\t\t\"Tab: `selectedTab` prop changed from %s to %s. A component cannot switch between controlled and uncontrolled modes.\",\n\t\t\twasControlled.current ? \"controlled\" : \"uncontrolled\",\n\t\t\tisControlled ? \"controlled\" : \"uncontrolled\",\n\t\t);\n\t}\n\n\tconst options: GroupedButtonOption[] = tabs.map((tab) => ({\n\t\tvalue: tab.value,\n\t\tlabel: tab.label,\n\t\tdisabled: tab.disabled,\n\t\ticon: tab.icon,\n\t\t\"data-testid\": tab[\"data-testid\"],\n\t}));\n\n\tconst handleChange = (value: TabValue) => {\n\t\tif (!isControlled) setInternalValue(value);\n\t\tconst tab = tabs.find((t) => t.value === value);\n\t\tif (tab) onTabClick?.({ value: tab.value, label: tab.label });\n\t\tonChange?.(value);\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.tab, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-full-width={fullWidth ? \"\" : undefined}\n\t\t\tdata-selected-color={selectedColor}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<GroupedButtons\n\t\t\t\tclassName={styles.group}\n\t\t\t\tlabel={label}\n\t\t\t\toptions={options}\n\t\t\t\tselectedButton={current}\n\t\t\t\tsize={size}\n\t\t\t\tfullWidth={fullWidth}\n\t\t\t\tonChange={handleChange}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","@layer ang-components {\n .tabbar {\n height: var(--ds-ang-tab-height);\n min-height: var(--ds-ang-tab-height);\n max-height: var(--ds-ang-tab-height);\n background-color: var(--ds-ang-neutral-500);\n padding: 5px 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .tabbar[data-variant=\"expanded\"] {\n height: calc(var(--ds-ang-tab-height) + 58px);\n min-height: calc(var(--ds-ang-tab-height) + 58px);\n max-height: calc(var(--ds-ang-tab-height) + 58px);\n }\n\n .tabbar[data-variant=\"expanded-billing\"] {\n height: calc(var(--ds-ang-tab-height) + 118px);\n min-height: calc(var(--ds-ang-tab-height) + 118px);\n max-height: calc(var(--ds-ang-tab-height) + 118px);\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./TabBar.module.css\";\n\nexport type TabBarVariant = \"default\" | \"expanded\" | \"expanded-billing\";\n\nexport interface TabBarProps {\n\tvariant?: TabBarVariant;\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function TabBar({ variant = \"default\", children, \"data-testid\": testId }: TabBarProps) {\n\treturn (\n\t\t<div className={styles.tabbar} role=\"tablist\" data-variant={variant} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.tabs {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\t}\n\n\t.tabList {\n\t\tdisplay: flex;\n\t\tgap: 0;\n\t\tborder-bottom: 1.5px solid var(--color-border);\n\t\toverflow-x: auto;\n\t\toverscroll-behavior-x: contain;\n\t\tscrollbar-width: none;\n\n\t\t&::-webkit-scrollbar {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t.tab {\n\t\tposition: relative;\n\t\tdisplay: inline-flex;\n\t\tflex: 0 0 auto;\n\t\talign-items: center;\n\t\tgap: var(--spacing-sm);\n\t\tpadding: var(--spacing-sm) var(--spacing-lg);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tline-height: var(--leading-normal);\n\t\tcolor: var(--color-text-muted);\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\tborder-bottom: 2px solid transparent;\n\t\tmargin-bottom: -1.5px;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttransition:\n\t\t\tcolor var(--duration-fast) var(--ease-out),\n\t\t\tborder-color var(--duration-fast) var(--ease-out);\n\n\t\t&:hover:not(:disabled):not([data-active]) {\n\t\t\tcolor: var(--color-text);\n\t\t\tborder-bottom-color: var(--color-neutral-300);\n\t\t}\n\n\t\t&[data-active] {\n\t\t\tcolor: var(--color-primary);\n\t\t\tfont-weight: var(--font-semibold);\n\t\t\tborder-bottom-color: var(--color-primary);\n\t\t}\n\n\t\t&:disabled {\n\t\t\topacity: 0.4;\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid var(--color-primary);\n\t\t\toutline-offset: 2px;\n\t\t\tborder-radius: var(--radius-sm);\n\t\t}\n\t}\n\n\t.panel {\n\t\tpadding-top: var(--spacing-lg);\n\t}\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n\tid: string;\n\tlabel: string;\n\tcontent?: ReactNode;\n\tdisabled?: boolean;\n}\n\nexport interface TabsProps {\n\titems: TabItem[];\n\tdefaultTab?: string;\n\t/** Controlled active tab id. When provided the caller owns active state; Tabs only calls onChange. */\n\tactiveTab?: string;\n\t/** Accessible label for the tablist — required when multiple tablists exist on the page. */\n\t\"aria-label\"?: string;\n\tonChange?: (tabId: string) => void;\n\t\"data-testid\"?: string;\n}\n\nexport function Tabs({\n\titems,\n\tdefaultTab,\n\tactiveTab: controlledTab,\n\t\"aria-label\": ariaLabel,\n\tonChange,\n\t\"data-testid\": testId,\n}: TabsProps): React.ReactElement {\n\tconst [internalTab, setInternalTab] = useState(defaultTab ?? items[0]?.id ?? \"\");\n\tconst isControlled = controlledTab !== undefined;\n\tconst activeTab = isControlled ? controlledTab : internalTab;\n\tconst tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\tconst wasControlled = useRef(isControlled);\n\tconst didMount = useRef(false);\n\n\tif (process.env.NODE_ENV !== \"production\" && wasControlled.current !== isControlled) {\n\t\tconsole.error(\n\t\t\t\"Tabs: `activeTab` prop changed from %s to %s. A component cannot switch between controlled and uncontrolled modes.\",\n\t\t\twasControlled.current ? \"controlled\" : \"uncontrolled\",\n\t\t\tisControlled ? \"controlled\" : \"uncontrolled\",\n\t\t);\n\t}\n\n\tconst handleTabClick = (id: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalTab(id);\n\t\t}\n\t\tonChange?.(id);\n\t};\n\n\tconst handleKeyDown = (e: React.KeyboardEvent, currentIndex: number) => {\n\t\tconst enabledItems = items.filter((item) => !item.disabled);\n\t\tconst enabledIds = enabledItems.map((item) => item.id);\n\t\tconst currentEnabledIndex = enabledIds.indexOf(items[currentIndex]?.id ?? \"\");\n\t\tlet targetId: string | undefined;\n\n\t\tif (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentEnabledIndex + 1) % enabledIds.length];\n\t\t} else if (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[(currentEnabledIndex - 1 + enabledIds.length) % enabledIds.length];\n\t\t} else if (e.key === \"Home\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[0];\n\t\t} else if (e.key === \"End\") {\n\t\t\te.preventDefault();\n\t\t\ttargetId = enabledIds[enabledIds.length - 1];\n\t\t}\n\n\t\tif (targetId) {\n\t\t\thandleTabClick(targetId);\n\t\t\ttabRefs.current.get(targetId)?.focus();\n\t\t}\n\t};\n\n\tconst activeContent = items.find((item) => item.id === activeTab)?.content;\n\n\tuseEffect(() => {\n\t\tif (!didMount.current) {\n\t\t\tdidMount.current = true;\n\t\t\treturn;\n\t\t}\n\t\ttabRefs.current.get(activeTab)?.scrollIntoView({ inline: \"nearest\", block: \"nearest\" });\n\t}, [activeTab]);\n\n\treturn (\n\t\t<div className={styles.tabs} data-testid={testId}>\n\t\t\t<div className={styles.tabList} role=\"tablist\" aria-label={ariaLabel}>\n\t\t\t\t{items.map((item, index) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\tif (el) tabRefs.current.set(item.id, el);\n\t\t\t\t\t\t\telse tabRefs.current.delete(item.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-selected={item.id === activeTab}\n\t\t\t\t\t\taria-controls={activeContent != null ? `panel-${activeTab}` : undefined}\n\t\t\t\t\t\tid={`tab-${item.id}`}\n\t\t\t\t\t\tclassName={styles.tab}\n\t\t\t\t\t\tdata-active={item.id === activeTab || undefined}\n\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\ttabIndex={item.id === activeTab ? 0 : -1}\n\t\t\t\t\t\tonClick={() => !item.disabled && handleTabClick(item.id)}\n\t\t\t\t\t\tonKeyDown={(e) => handleKeyDown(e, index)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t\t{activeContent != null && (\n\t\t\t\t<div\n\t\t\t\t\trole=\"tabpanel\"\n\t\t\t\t\tid={`panel-${activeTab}`}\n\t\t\t\t\taria-labelledby={`tab-${activeTab}`}\n\t\t\t\t\tclassName={styles.panel}\n\t\t\t\t>\n\t\t\t\t\t{activeContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.textarea {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\tresize: vertical;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t\tresize: none;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { Ref, TextareaHTMLAttributes } from \"react\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n\terror?: boolean;\n\tref?: Ref<HTMLTextAreaElement>;\n}\n\nexport function Textarea({ error, className, rows = 3, ref, ...props }: TextareaProps) {\n\treturn (\n\t\t<textarea\n\t\t\tref={ref}\n\t\t\trows={rows}\n\t\t\tclassName={[styles.textarea, className].filter(Boolean).join(\" \")}\n\t\t\tdata-error={error ? \"\" : undefined}\n\t\t\taria-invalid={error || undefined}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","@layer ds-components {\n\t/* ---- Bare input (also the root in the backward-compat fast path) ---- */\n\t.input {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-base);\n\t\tline-height: var(--ds-leading-normal);\n\t\tcolor: var(--ds-color-text);\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\t/* Heights match the Vue3 DS TextInput scale: small 44px / medium 60px / large 80px. */\n\t\tmin-height: 3.75rem;\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&[data-size=\"small\"] {\n\t\t\tmin-height: 2.75rem; /* 44px — Vue3 small */\n\t\t\tfont-size: var(--ds-font-size-sm); /* 14px — Vue3 text-sm */\n\t\t\tpadding: var(--ds-space-1) var(--ds-space-3);\n\t\t\tborder-radius: var(--ds-radius-md);\n\t\t}\n\n\t\t&[data-size=\"large\"] {\n\t\t\tmin-height: 5rem; /* 80px — Vue3 large */\n\t\t\t/* lg = 20px under [data-theme=vue3] (Vue3 text-lg); 18px under angular-legacy. */\n\t\t\tfont-size: var(--ds-font-size-lg);\n\t\t}\n\n\t\t&::placeholder {\n\t\t\tcolor: var(--ds-color-placeholder);\n\t\t}\n\n\t\t&:hover:not(:disabled):not([data-error]) {\n\t\t\tborder-color: var(--ds-color-gray-400);\n\t\t}\n\n\t\t&:focus,\n\t\t&:focus-visible {\n\t\t\toutline: none;\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tbackground-color: var(--ds-color-gray-50);\n\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\tcursor: not-allowed;\n\t\t}\n\n\t\t&[data-error] {\n\t\t\tborder-color: var(--ds-color-error);\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* ---- Wrapped layout (label / adornments / meta) ---- */\n\t.root {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-2);\n\n\t\t&[data-full-width] {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t/* Inside the field the border lives on .field, so the input is borderless. */\n\t\t.field .input {\n\t\t\tflex: 1;\n\t\t\tmin-width: 0;\n\t\t\tmin-height: 0;\n\t\t\tpadding-block: 0;\n\t\t\tpadding-inline: 0;\n\t\t\tborder: none;\n\t\t\tborder-radius: 0;\n\t\t\tbackground: transparent;\n\t\t\ttext-overflow: ellipsis;\n\n\t\t\t&:focus,\n\t\t\t&:focus-visible {\n\t\t\t\toutline: none;\n\t\t\t\tborder: none;\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\t\t}\n\n\t\t&[data-disabled] {\n\t\t\t.label,\n\t\t\t.helper,\n\t\t\t.counter {\n\t\t\t\tcolor: var(--ds-color-gray-500);\n\t\t\t}\n\n\t\t\t.adornment,\n\t\t\t.statusIcon {\n\t\t\t\tcolor: var(--ds-color-gray-400);\n\t\t\t}\n\t\t}\n\t}\n\n\t.label {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-1);\n\t\tmargin-inline: var(--ds-space-3);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-semibold);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.required {\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.field {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding: var(--ds-space-2) var(--ds-space-3);\n\t\tmin-height: 3.75rem;\n\t\tbackground-color: var(--ds-color-surface);\n\t\tborder: 1px solid var(--ds-color-border);\n\t\tborder-radius: var(--ds-radius-lg);\n\t\ttransition:\n\t\t\tborder-color var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\tbox-shadow var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&:focus-within {\n\t\t\tborder-color: var(--ds-color-primary);\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-primary-light);\n\t\t}\n\t}\n\n\t.root[data-size=\"small\"] .field {\n\t\tmin-height: 2.75rem;\n\t\tborder-radius: var(--ds-radius-md);\n\t}\n\n\t.root[data-size=\"large\"] .field {\n\t\tmin-height: 5rem;\n\t}\n\n\t.root[data-status=\"error\"] .field {\n\t\tborder-color: var(--ds-color-error);\n\n\t\t&:focus-within {\n\t\t\tbox-shadow: 0 0 0 3px var(--ds-color-error-light);\n\t\t}\n\t}\n\n\t.root[data-status=\"success\"] .field {\n\t\tborder-color: var(--ds-color-success);\n\t}\n\n\t.root[data-status=\"warning\"] .field {\n\t\tborder-color: var(--ds-color-warning);\n\t}\n\n\t.root[data-disabled] .field {\n\t\tbackground-color: var(--ds-color-gray-50);\n\t\tborder-color: var(--ds-color-border);\n\t\tbox-shadow: none;\n\t}\n\n\t.adornment {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.statusIcon {\n\t\tflex-shrink: 0;\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.root[data-status=\"error\"] .statusIcon {\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.root[data-status=\"success\"] .statusIcon {\n\t\tcolor: var(--ds-color-success);\n\t}\n\n\t.root[data-status=\"warning\"] .statusIcon {\n\t\tcolor: var(--ds-color-warning);\n\t}\n\n\t/* ---- Action buttons (clear / password toggle) ---- */\n\t.actionButton {\n\t\tflex-shrink: 0;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tpadding: var(--ds-space-1);\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: var(--ds-color-text-muted);\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\t\ttransition: color var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t&:hover:not(:disabled) {\n\t\t\tcolor: var(--ds-color-text);\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcursor: not-allowed;\n\t\t\topacity: 0.5;\n\t\t}\n\t}\n\n\t/* ---- Meta row (helper / error message + counter) ---- */\n\t.meta {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: flex-start;\n\t\tgap: var(--ds-space-2);\n\t\tmin-height: 1rem;\n\t\tmargin-inline: var(--ds-space-3);\n\n\t\t&[data-helper-align=\"left\"] {\n\t\t\tflex-direction: row;\n\n\t\t\t.messages {\n\t\t\t\torder: 0;\n\t\t\t}\n\n\t\t\t.counter {\n\t\t\t\torder: 1;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\t\t}\n\n\t\t&[data-helper-align=\"right\"] {\n\t\t\tflex-direction: row-reverse;\n\n\t\t\t.messages {\n\t\t\t\torder: 1;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.counter {\n\t\t\t\torder: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t.messages {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--ds-space-1);\n\t\tflex: 1;\n\t\tmin-width: 0;\n\t}\n\n\t.helper {\n\t\tmargin: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t.error {\n\t\tmargin: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-error);\n\t}\n\n\t.counter {\n\t\tflex-shrink: 0;\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tcolor: var(--ds-color-text-muted);\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.input,\n\t\t.field,\n\t\t.actionButton {\n\t\t\ttransition: none;\n\t\t}\n\t}\n}\n","import {\n\ttype ChangeEvent,\n\tforwardRef,\n\ttype InputHTMLAttributes,\n\ttype ReactNode,\n\tuseCallback,\n\tuseId,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { Icon } from \"../Icon/Icon\";\nimport type { IconNameType } from \"../Icon/icons\";\nimport styles from \"./TextInput.module.css\";\n\nexport type TextInputSize = \"small\" | \"medium\" | \"large\";\n\n/**\n * Validation state, mirroring the Vue3 DS `TextInput`. `default` is the resting\n * state; `success` / `warning` / `error` drive the field border, optional status\n * icon, and (for `error`) `aria-invalid`. The legacy `error` boolean prop is kept\n * for backward compatibility and is treated as `validationState=\"error\"`.\n */\nexport type TextInputValidationState = \"default\" | \"success\" | \"warning\" | \"error\";\n\nconst STATUS_ICON: Record<Exclude<TextInputValidationState, \"default\">, IconNameType> = {\n\tsuccess: \"success-filled-green\",\n\twarning: \"warning-outline\",\n\terror: \"error-filled-red\",\n};\n\nconst ICON_SIZE: Record<TextInputSize, number> = {\n\tsmall: 16,\n\tmedium: 20,\n\tlarge: 24,\n};\n\nexport interface TextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n\t/** Control height / typography scale. */\n\tsize?: TextInputSize;\n\t/**\n\t * Legacy shorthand for an error look. Equivalent to `validationState=\"error\"`.\n\t * Kept for backward compatibility — existing consumers pass `error`.\n\t */\n\terror?: boolean;\n\t/** Renders an eye toggle for `type=\"password\"` fields. */\n\tshowPasswordToggle?: boolean;\n\n\t// --- Robustness parity with the Vue3 DS (all optional, all additive) ---\n\t/** Visible `<label>` associated with the input. */\n\tlabel?: ReactNode;\n\t/** Shows a red `*` after the label and sets `aria-required`. */\n\trequired?: boolean;\n\t/** Validation state. Takes precedence over the legacy `error` boolean. */\n\tvalidationState?: TextInputValidationState;\n\t/** Error message; shown only when the resolved state is `error`. Wires `aria-describedby`. */\n\terrorMessage?: ReactNode;\n\t/** Helper / hint text shown below the field. Wires `aria-describedby`. */\n\thelperText?: ReactNode;\n\t/** Alignment of the helper text relative to the character counter. */\n\thelperTextAlign?: \"left\" | \"right\";\n\t/** Icon rendered before the input. */\n\tprefixIcon?: IconNameType;\n\t/** Icon rendered after the input (suppressed when clear / password / status icon shows). */\n\tsuffixIcon?: IconNameType;\n\t/** Shows a clear (×) button when the field has a value. Requires `value` + `onChange`. */\n\tclearable?: boolean;\n\t/** Callback fired when the clear button is pressed (after clearing the value). */\n\tonClear?: () => void;\n\t/** Accessible label for the clear button. @default \"Limpiar\" */\n\tclearLabel?: string;\n\t/** Accessible label for the password-reveal button while the password is hidden. @default \"Mostrar contraseña\" */\n\tshowPasswordLabel?: string;\n\t/** Accessible label for the password-reveal button while the password is shown. @default \"Ocultar contraseña\" */\n\thidePasswordLabel?: string;\n\t/** Shows a character counter. Implicitly enabled when `maxLength` is set. */\n\tshowCounter?: boolean;\n\t/** Renders the status icon (success / warning / error) inside the field. Defaults to `true`. */\n\tshowValidationIcon?: boolean;\n\t/** Makes the field span the full width of its container. */\n\tfullWidth?: boolean;\n\n\t\"data-testid\"?: string;\n}\n\nfunction resolveState(\n\tvalidationState: TextInputValidationState | undefined,\n\terror: boolean,\n): TextInputValidationState {\n\t// An explicit validationState (including \"default\") wins over the legacy `error` bool,\n\t// so callers can reset to default even while still passing `error`.\n\tif (validationState !== undefined) return validationState;\n\tif (error) return \"error\";\n\treturn \"default\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: this is a single field primitive; the branches (adornments, clear, password toggle, status icon, meta row) are all load-bearing and intentionally colocated to keep one source of truth.\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(function TextInput(\n\t{\n\t\tsize = \"medium\",\n\t\terror = false,\n\t\tshowPasswordToggle = false,\n\t\tlabel,\n\t\trequired = false,\n\t\tvalidationState,\n\t\terrorMessage,\n\t\thelperText,\n\t\thelperTextAlign = \"right\",\n\t\tprefixIcon,\n\t\tsuffixIcon,\n\t\tclearable = false,\n\t\tonClear,\n\t\tclearLabel = \"Limpiar\",\n\t\tshowPasswordLabel = \"Mostrar contraseña\",\n\t\thidePasswordLabel = \"Ocultar contraseña\",\n\t\tshowCounter = false,\n\t\tshowValidationIcon = true,\n\t\tfullWidth = false,\n\t\tclassName,\n\t\ttype = \"text\",\n\t\tid: idProp,\n\t\tvalue,\n\t\tonChange,\n\t\tdisabled,\n\t\treadOnly,\n\t\tmaxLength,\n\t\t\"aria-label\": ariaLabel,\n\t\t\"aria-describedby\": ariaDescribedByProp,\n\t\t\"data-testid\": testId,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst generatedId = useId();\n\tconst id = idProp ?? generatedId;\n\n\tconst innerRef = useRef<HTMLInputElement>(null);\n\tuseImperativeHandle(ref, () => innerRef.current as HTMLInputElement, []);\n\n\tconst [passwordVisible, setPasswordVisible] = useState(false);\n\tconst isPasswordField = type === \"password\";\n\tconst resolvedType = isPasswordField && passwordVisible ? \"text\" : type;\n\n\tconst state = resolveState(validationState, error);\n\tconst isError = state === \"error\";\n\n\tconst resolvedErrorMessage = isError ? errorMessage : undefined;\n\tconst showError = Boolean(resolvedErrorMessage);\n\tconst showHelper = Boolean(helperText) && !showError;\n\n\tconst helperId = showHelper ? `${id}-helper` : undefined;\n\tconst errorId = showError ? `${id}-error` : undefined;\n\tconst describedBy =\n\t\t[ariaDescribedByProp, helperId, errorId].filter(Boolean).join(\" \") || undefined;\n\n\tconst hasValue =\n\t\ttypeof value === \"string\" || typeof value === \"number\" ? `${value}`.length > 0 : false;\n\tconst charCount = typeof value === \"string\" || typeof value === \"number\" ? `${value}`.length : 0;\n\n\t// Require onChange: the clear handler synthesizes an input event the consumer must handle.\n\tconst showClear =\n\t\tclearable && Boolean(onChange) && hasValue && !disabled && !readOnly && !isPasswordField;\n\tconst showPasswordButton = isPasswordField && showPasswordToggle;\n\tconst statusIcon = showValidationIcon && state !== \"default\" ? STATUS_ICON[state] : undefined;\n\tconst showSuffixIcon = Boolean(suffixIcon) && !showClear && !showPasswordButton;\n\tconst hasCounter = showCounter || typeof maxLength === \"number\";\n\n\tconst showMeta = showHelper || showError || hasCounter;\n\tconst iconSize = ICON_SIZE[size];\n\n\tconst handleClear = useCallback(() => {\n\t\tif (disabled || readOnly) return;\n\t\tconst el = innerRef.current;\n\t\tif (el && onChange) {\n\t\t\t// Synthesize a native input event so controlled consumers receive `\"\"`.\n\t\t\tconst setter = Object.getOwnPropertyDescriptor(\n\t\t\t\twindow.HTMLInputElement.prototype,\n\t\t\t\t\"value\",\n\t\t\t)?.set;\n\t\t\tsetter?.call(el, \"\");\n\t\t\tel.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t}\n\t\tonClear?.();\n\t\tinnerRef.current?.focus();\n\t}, [disabled, readOnly, onChange, onClear]);\n\n\t// Backward-compat fast path: with no structural feature requested, the bare\n\t// <input> stays the root so existing consumers keep className + data-testid on it.\n\tconst needsWrapper =\n\t\tBoolean(label) ||\n\t\tshowMeta ||\n\t\tBoolean(prefixIcon) ||\n\t\tshowSuffixIcon ||\n\t\tshowClear ||\n\t\tshowPasswordButton ||\n\t\tBoolean(statusIcon) ||\n\t\tfullWidth;\n\n\t// When the input is the root (no wrapper), className/data-testid land on it.\n\t// When wrapped, those go to the <div>; an associated <label> supplies the name.\n\tconst inputEl = (\n\t\t<input\n\t\t\tref={innerRef}\n\t\t\tid={id}\n\t\t\tclassName={needsWrapper ? styles.input : [styles.input, className].filter(Boolean).join(\" \")}\n\t\t\ttype={resolvedType}\n\t\t\tvalue={value}\n\t\t\tonChange={onChange as ((e: ChangeEvent<HTMLInputElement>) => void) | undefined}\n\t\t\tdisabled={disabled}\n\t\t\treadOnly={readOnly}\n\t\t\trequired={required}\n\t\t\tmaxLength={maxLength}\n\t\t\tdata-error={isError ? \"\" : undefined}\n\t\t\tdata-size={size}\n\t\t\taria-invalid={isError || undefined}\n\t\t\taria-required={required || undefined}\n\t\t\taria-describedby={describedBy}\n\t\t\taria-label={label ? undefined : ariaLabel}\n\t\t\tdata-testid={needsWrapper ? undefined : testId}\n\t\t\t{...props}\n\t\t/>\n\t);\n\n\tif (!needsWrapper) {\n\t\treturn inputEl;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.root, className].filter(Boolean).join(\" \")}\n\t\t\tdata-size={size}\n\t\t\tdata-status={state}\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-full-width={fullWidth || undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{label && (\n\t\t\t\t<label htmlFor={id} className={styles.label}>\n\t\t\t\t\t<span>{label}</span>\n\t\t\t\t\t{required && (\n\t\t\t\t\t\t<span className={styles.required} aria-hidden=\"true\">\n\t\t\t\t\t\t\t*\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</label>\n\t\t\t)}\n\n\t\t\t<div className={styles.field}>\n\t\t\t\t{prefixIcon && (\n\t\t\t\t\t<Icon name={prefixIcon} size={iconSize} aria-hidden=\"true\" className={styles.adornment} />\n\t\t\t\t)}\n\n\t\t\t\t{inputEl}\n\n\t\t\t\t{showClear && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close-outline\" size={16} aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{showPasswordButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.actionButton}\n\t\t\t\t\t\taria-label={passwordVisible ? hidePasswordLabel : showPasswordLabel}\n\t\t\t\t\t\taria-pressed={passwordVisible}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => setPasswordVisible((v) => !v)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tname={passwordVisible ? \"eye-open-outline\" : \"eye-closed-outline\"}\n\t\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\n\t\t\t\t{showSuffixIcon && suffixIcon && (\n\t\t\t\t\t<Icon name={suffixIcon} size={iconSize} aria-hidden=\"true\" className={styles.adornment} />\n\t\t\t\t)}\n\n\t\t\t\t{statusIcon && (\n\t\t\t\t\t<Icon\n\t\t\t\t\t\tname={statusIcon}\n\t\t\t\t\t\tsize={iconSize}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName={styles.statusIcon}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{showMeta && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={styles.meta}\n\t\t\t\t\tdata-helper-align={helperTextAlign}\n\t\t\t\t\tdata-has-both={(showHelper || showError) && hasCounter ? \"\" : undefined}\n\t\t\t\t>\n\t\t\t\t\t{(showHelper || showError) && (\n\t\t\t\t\t\t<div className={styles.messages}>\n\t\t\t\t\t\t\t{showHelper && (\n\t\t\t\t\t\t\t\t<p id={helperId} className={styles.helper}>\n\t\t\t\t\t\t\t\t\t{helperText}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{showError && (\n\t\t\t\t\t\t\t\t<p id={errorId} className={styles.error} role=\"alert\" aria-live=\"polite\">\n\t\t\t\t\t\t\t\t\t{resolvedErrorMessage}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{hasCounter && (\n\t\t\t\t\t\t<span className={styles.counter}>\n\t\t\t\t\t\t\t{charCount}\n\t\t\t\t\t\t\t{typeof maxLength === \"number\" && `/${maxLength}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import type { ReactNode } from \"react\";\nimport type { DsTheme } from \"../DsProvider/DsProvider\";\n\nexport interface ThemeGateProps {\n\ttheme: DsTheme;\n\tchildren: ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function ThemeGate({ theme, children, className, \"data-testid\": testId }: ThemeGateProps) {\n\treturn (\n\t\t<div data-theme={theme} className={className} data-testid={testId}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.container {\n\t\tposition: fixed;\n\t\tbottom: var(--spacing-xl);\n\t\tright: var(--spacing-xl);\n\t\tz-index: var(--z-toast);\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: var(--spacing-sm);\n\t\tmax-width: 400px;\n\t\twidth: calc(100dvw - 2 * var(--spacing-xl));\n\t\tpointer-events: none;\n\n\t\t@media (max-width: 480px) {\n\t\t\tbottom: var(--spacing-md);\n\t\t\tright: var(--spacing-md);\n\t\t\tleft: var(--spacing-md);\n\t\t\twidth: auto;\n\t\t}\n\t}\n\n\t.toast {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: var(--spacing-md);\n\t\tpadding: var(--spacing-md) var(--spacing-lg);\n\t\tborder-radius: var(--radius-lg);\n\t\tbox-shadow: var(--shadow-lg);\n\t\tfont-family: var(--font-family-base);\n\t\tfont-size: var(--text-sm);\n\t\tfont-weight: var(--font-medium);\n\t\tline-height: var(--leading-snug);\n\t\tpointer-events: auto;\n\t\tanimation: ds-toast-enter var(--duration-base) var(--ease-spring);\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--color-success-light);\n\t\t\tcolor: var(--color-success-dark);\n\t\t\tborder-left: 4px solid var(--color-success);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--color-error-light);\n\t\t\tcolor: var(--color-error-dark);\n\t\t\tborder-left: 4px solid var(--color-error);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--color-warning-light);\n\t\t\tcolor: var(--color-warning-dark);\n\t\t\tborder-left: 4px solid var(--color-warning);\n\t\t}\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--color-info-light);\n\t\t\tcolor: var(--color-info-dark);\n\t\t\tborder-left: 4px solid var(--color-info);\n\t\t}\n\t}\n\n\t.toastMessage {\n\t\tflex: 1;\n\t}\n\n\t.dismissButton {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\tcolor: inherit;\n\t\topacity: 0.6;\n\t\tborder-radius: var(--radius-sm);\n\t\ttransition: opacity var(--duration-fast) var(--ease-out);\n\n\t\t&:hover {\n\t\t\topacity: 1;\n\t\t}\n\n\t\t&:focus-visible {\n\t\t\toutline: 2px solid currentColor;\n\t\t\toutline-offset: 1px;\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ToastData, ToastVariant } from \"./Toast\";\n\ntype AddToastOptions = {\n\tmessage: string;\n\tvariant?: ToastVariant;\n\tduration?: number;\n\tdismissible?: boolean;\n\t\"data-testid\"?: string;\n};\n\ntype ToastStore = {\n\ttoasts: ToastData[];\n\taddToast: (opts: AddToastOptions) => string;\n\tdismissToast: (id: string) => void;\n};\n\n/* ── Global singleton store (module-level) ── */\n\ntype Listener = (toasts: ToastData[]) => void;\n\nlet toasts: ToastData[] = [];\nconst listeners = new Set<Listener>();\nlet counter = 0;\n\nfunction notify() {\n\tfor (const l of listeners) l([...toasts]);\n}\n\nfunction addToast(opts: AddToastOptions): string {\n\tconst id = `toast-${++counter}-${Date.now()}`;\n\ttoasts = [\n\t\t...toasts,\n\t\t{\n\t\t\tid,\n\t\t\tmessage: opts.message,\n\t\t\tvariant: opts.variant ?? \"info\",\n\t\t\tduration: opts.duration,\n\t\t\tdismissible: opts.dismissible,\n\t\t\t\"data-testid\": opts[\"data-testid\"],\n\t\t},\n\t];\n\tnotify();\n\treturn id;\n}\n\nfunction dismissToast(id: string) {\n\ttoasts = toasts.filter((t) => t.id !== id);\n\tnotify();\n}\n\n/* ── Hook ── */\n\nexport function useToast(): ToastStore {\n\tconst [localToasts, setLocalToasts] = useState<ToastData[]>(toasts);\n\tconst isMounted = useRef(true);\n\n\tuseEffect(() => {\n\t\tisMounted.current = true;\n\t\tconst listener: Listener = (next) => {\n\t\t\tif (isMounted.current) setLocalToasts(next);\n\t\t};\n\t\tlisteners.add(listener);\n\t\treturn () => {\n\t\t\tisMounted.current = false;\n\t\t\tlisteners.delete(listener);\n\t\t};\n\t}, []);\n\n\tconst stableAdd = useCallback((opts: AddToastOptions) => addToast(opts), []);\n\tconst stableDismiss = useCallback((id: string) => dismissToast(id), []);\n\n\treturn {\n\t\ttoasts: localToasts,\n\t\taddToast: stableAdd,\n\t\tdismissToast: stableDismiss,\n\t};\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseButton } from \"../CloseButton\";\nimport styles from \"./Toast.module.css\";\nimport { useToast } from \"./useToast\";\n\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface ToastData {\n\tid: string;\n\tmessage: string;\n\tvariant: ToastVariant;\n\tduration?: number;\n\tdismissible?: boolean;\n\t\"data-testid\"?: string;\n}\n\n/* ── Toast Message ── */\n\ninterface ToastMessageProps {\n\ttoast: ToastData;\n\tonDismiss: (id: string) => void;\n\tdismissLabel?: string;\n}\n\nfunction ToastMessage({\n\ttoast,\n\tonDismiss,\n\tdismissLabel = \"Cerrar notificación\",\n}: ToastMessageProps) {\n\tconst {\n\t\tid,\n\t\tmessage,\n\t\tvariant,\n\t\tduration = 4000,\n\t\tdismissible = true,\n\t\t\"data-testid\": testId,\n\t} = toast;\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n\tuseEffect(() => {\n\t\ttimerRef.current = setTimeout(() => {\n\t\t\tonDismiss(id);\n\t\t}, duration);\n\n\t\treturn () => {\n\t\t\tif (timerRef.current) clearTimeout(timerRef.current);\n\t\t};\n\t}, [id, duration, onDismiss]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.toast}\n\t\t\tdata-variant={variant}\n\t\t\trole={variant === \"error\" || variant === \"warning\" ? \"alert\" : \"status\"}\n\t\t\taria-atomic=\"true\"\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t<span className={styles.toastMessage}>{message}</span>\n\t\t\t{dismissible && (\n\t\t\t\t<CloseButton\n\t\t\t\t\tclassName={styles.dismissButton}\n\t\t\t\t\tonClick={() => onDismiss(id)}\n\t\t\t\t\tlabel={dismissLabel}\n\t\t\t\t\tsize={14}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n/* ── Toast Container ── */\n\nexport interface ToastContainerProps {\n\tchildren?: ReactNode;\n\tnotificationsLabel?: string;\n\tdismissLabel?: string;\n}\n\nexport function ToastContainer({\n\tnotificationsLabel = \"Notificaciones\",\n\tdismissLabel,\n}: ToastContainerProps) {\n\tconst { toasts, dismissToast } = useToast();\n\n\tif (typeof document === \"undefined\") return null;\n\n\treturn createPortal(\n\t\t<section className={styles.container} aria-label={notificationsLabel}>\n\t\t\t{toasts.map((toast) => (\n\t\t\t\t<ToastMessage\n\t\t\t\t\tkey={toast.id}\n\t\t\t\t\ttoast={toast}\n\t\t\t\t\tonDismiss={dismissToast}\n\t\t\t\t\tdismissLabel={dismissLabel}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</section>,\n\t\tdocument.body,\n\t);\n}\n","@layer ds-components {\n .wrapper {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-sm);\n cursor: pointer;\n user-select: none;\n\n &:has(.input:disabled) {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n /* ── Hidden native input ── */\n .input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ── Track ── */\n .track {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 40px;\n height: 22px;\n border-radius: var(--radius-full);\n background-color: var(--color-neutral-200);\n transition: background-color var(--duration-fast) var(--ease-out);\n flex-shrink: 0;\n }\n\n /* Checked state: primary bg */\n .input:checked + .track {\n background-color: var(--color-primary);\n }\n\n /* Focus-visible ring on track */\n .input:focus-visible + .track {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n }\n\n /* ── Thumb ── */\n .thumb {\n position: absolute;\n left: 2px;\n width: 18px;\n height: 18px;\n border-radius: var(--radius-circle);\n background-color: var(--color-surface);\n box-shadow: var(--shadow-sm);\n transition: transform var(--duration-fast) var(--ease-spring);\n }\n\n .input:checked + .track .thumb {\n transform: translateX(18px);\n }\n\n /* ── Label text ── */\n .label {\n font-family: var(--font-family-base);\n font-size: var(--text-base);\n font-weight: var(--font-normal);\n color: var(--color-text);\n line-height: var(--leading-normal);\n }\n\n /* ── Size: small ── */\n .wrapper[data-size=\"small\"] .track {\n width: 32px;\n height: 18px;\n }\n\n .wrapper[data-size=\"small\"] .thumb {\n width: 14px;\n height: 14px;\n }\n\n .wrapper[data-size=\"small\"] .input:checked + .track .thumb {\n transform: translateX(14px);\n }\n\n .wrapper[data-size=\"small\"] .label {\n font-size: var(--text-sm);\n }\n}\n","import type { InputHTMLAttributes } from \"react\";\nimport styles from \"./Toggle.module.css\";\n\nexport interface ToggleProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n\tlabel?: string;\n\tsize?: \"small\" | \"medium\";\n\tref?: React.Ref<HTMLInputElement>;\n\t\"data-testid\"?: string;\n}\n\nexport function Toggle({\n\tlabel,\n\tsize = \"medium\",\n\tclassName,\n\tid,\n\tref,\n\t\"data-testid\": testId,\n\t...props\n}: ToggleProps) {\n\tconst inputId =\n\t\tid ??\n\t\t`toggle-${String(label ?? \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/\\s+/g, \"-\")}`;\n\treturn (\n\t\t<label className={styles.wrapper} data-size={size} htmlFor={inputId} data-testid={testId}>\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked={props.checked ?? false}\n\t\t\t\tid={inputId}\n\t\t\t\tclassName={styles.input}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t<span className={styles.track} aria-hidden=\"true\">\n\t\t\t\t<span className={styles.thumb} />\n\t\t\t</span>\n\t\t\t{label && <span className={styles.label}>{label}</span>}\n\t\t</label>\n\t);\n}\n","@layer ds-components {\n\t.trigger {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t.tooltip {\n\t\tposition: fixed;\n\t\tz-index: var(--ds-z-tooltip);\n\t\tmax-width: 240px;\n\t\tpadding: var(--ds-space-1) var(--ds-space-2);\n\t\tbackground: var(--ds-color-gray-900);\n\t\tcolor: var(--ds-color-white);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tline-height: var(--ds-leading-snug);\n\t\tborder-radius: var(--ds-radius-sm);\n\t\tpointer-events: none;\n\t\tword-break: break-word;\n\n\t\t&[data-placement=\"top\"] {\n\t\t\ttransform: translateX(-50%) translateY(-100%);\n\t\t}\n\n\t\t&[data-placement=\"bottom\"] {\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&[data-placement=\"left\"] {\n\t\t\ttransform: translateX(-100%) translateY(-50%);\n\t\t}\n\n\t\t&[data-placement=\"right\"] {\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\t}\n}\n","import { type ReactNode, useCallback, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styles from \"./Tooltip.module.css\";\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n\tcontent: ReactNode;\n\tchildren: ReactNode;\n\tplacement?: TooltipPlacement;\n\t\"data-testid\"?: string;\n}\n\ninterface Coords {\n\ttop: number;\n\tleft: number;\n}\n\nconst GAP = 8;\n\nfunction getCoords(rect: DOMRect, placement: TooltipPlacement): Coords {\n\tswitch (placement) {\n\t\tcase \"top\":\n\t\t\treturn { top: rect.top - GAP, left: rect.left + rect.width / 2 };\n\t\tcase \"bottom\":\n\t\t\treturn { top: rect.bottom + GAP, left: rect.left + rect.width / 2 };\n\t\tcase \"left\":\n\t\t\treturn { top: rect.top + rect.height / 2, left: rect.left - GAP };\n\t\tcase \"right\":\n\t\t\treturn { top: rect.top + rect.height / 2, left: rect.right + GAP };\n\t}\n}\n\nexport function Tooltip({\n\tcontent,\n\tchildren,\n\tplacement = \"top\",\n\t\"data-testid\": testId,\n}: TooltipProps) {\n\tconst [visible, setVisible] = useState(false);\n\tconst [coords, setCoords] = useState<Coords>({ top: 0, left: 0 });\n\tconst triggerRef = useRef<HTMLSpanElement>(null);\n\tconst id = useId();\n\n\tconst show = useCallback(() => {\n\t\tif (!triggerRef.current) return;\n\t\tsetCoords(getCoords(triggerRef.current.getBoundingClientRect(), placement));\n\t\tsetVisible(true);\n\t}, [placement]);\n\n\tconst hide = useCallback(() => setVisible(false), []);\n\n\treturn (\n\t\t<>\n\t\t\t{/* biome-ignore lint/a11y/noStaticElementInteractions: tooltip trigger wraps arbitrary children; mouse events are supplementary to the child's own keyboard/focus handlers */}\n\t\t\t<span\n\t\t\t\tref={triggerRef}\n\t\t\t\tclassName={styles.trigger}\n\t\t\t\taria-describedby={visible ? id : undefined}\n\t\t\t\tonMouseEnter={show}\n\t\t\t\tonMouseLeave={hide}\n\t\t\t\tonFocus={show}\n\t\t\t\tonBlur={hide}\n\t\t\t\tdata-testid={testId}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{visible &&\n\t\t\t\ttypeof document !== \"undefined\" &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={styles.tooltip}\n\t\t\t\t\t\tdata-placement={placement}\n\t\t\t\t\t\tstyle={{ top: coords.top, left: coords.left }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body,\n\t\t\t\t)}\n\t\t</>\n\t);\n}\n","@layer ds-components {\n .treeItem {\n --tree-item-indent: 0px;\n width: 100%;\n background-color: var(--ds-color-white);\n\n &[data-odd-row] > .content {\n background-color: var(--color-neutral-50);\n &:hover { background-color: var(--color-neutral-100); }\n }\n\n &[data-bordered][data-level=\"0\"] {\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n margin-bottom: var(--spacing-xs);\n overflow: hidden;\n\n & > .content { padding-left: var(--spacing-md); }\n & > .childrenSlot { padding-bottom: var(--spacing-xs); }\n\n &[data-expanded] > .content:hover {\n border-radius: var(--radius-lg) var(--radius-lg) 0 0;\n }\n }\n\n &[data-expanded] > .content .expandBtn {\n transform: rotate(180deg);\n }\n\n &[data-disabled] > .content {\n opacity: 0.6;\n cursor: not-allowed;\n &:hover { background-color: transparent; }\n }\n\n &:focus-visible {\n outline: none;\n & > .content {\n outline: 2px solid var(--color-primary);\n outline-offset: -2px;\n }\n }\n }\n\n .content {\n display: flex;\n align-items: center;\n gap: var(--spacing-sm);\n padding: var(--spacing-sm) var(--spacing-md);\n padding-left: calc(var(--spacing-md) + var(--tree-item-indent));\n min-height: 44px;\n transition: background-color var(--duration-fast) var(--ease-out);\n &:hover { background-color: var(--color-neutral-100); }\n }\n\n .dragHandle {\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: grab;\n color: var(--color-neutral-400);\n padding: var(--spacing-xs);\n margin: calc(-1 * var(--spacing-xs));\n border-radius: var(--radius-sm);\n flex-shrink: 0;\n transition: color var(--duration-fast) var(--ease-out), background-color var(--duration-fast) var(--ease-out);\n &:hover { color: var(--color-neutral-500); background-color: var(--color-neutral-200); }\n }\n\n .indent { width: 0; flex-shrink: 0; }\n\n .checkbox { flex-shrink: 0; }\n\n .slotsWrapper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 1;\n gap: var(--spacing-sm);\n min-width: 0;\n }\n\n .label {\n flex: 1;\n font-size: var(--text-sm);\n color: var(--color-neutral-500);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .meta {\n font-size: var(--text-sm);\n color: var(--color-neutral-400);\n flex-shrink: 0;\n }\n\n .expandBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n background: transparent;\n border-radius: var(--radius-sm);\n cursor: pointer;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n margin-left: auto;\n transition: color var(--duration-fast) var(--ease-out), background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);\n\n &:hover { background-color: var(--color-neutral-200); color: var(--color-neutral-500); }\n &:focus-visible { outline: 2px solid var(--color-primary); outline-offset: -2px; }\n &:disabled { cursor: not-allowed; opacity: 0.6; }\n }\n\n .expandPlaceholder { width: 28px; height: 28px; flex-shrink: 0; }\n\n .childrenSlot {\n display: block;\n width: 100%;\n &[hidden] { display: none; }\n }\n}\n","import type { DragEvent, KeyboardEvent, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Icon } from \"../Icon\";\nimport styles from \"./TreeItem.module.css\";\nimport type { TreeItemData } from \"./treeTypes\";\n\nexport interface TreeItemDragPayload {\n\tevent: globalThis.DragEvent;\n\titem: TreeItemData;\n\tparentId: string | number | null;\n}\n\nexport interface TreeItemProps {\n\titem: TreeItemData;\n\tlevel?: number;\n\texpanded?: boolean;\n\tselected?: boolean;\n\tdraggable?: boolean;\n\tselectable?: boolean;\n\thasChildren?: boolean;\n\tindentSize?: number;\n\tparentId?: string | number | null;\n\tbordered?: boolean;\n\tflatIndex?: number;\n\tstriped?: boolean;\n\tonToggleExpand: (id: string | number) => void;\n\tonToggleSelect: (id: string | number) => void;\n\tonDragStart?: (payload: TreeItemDragPayload) => void;\n\tonDragEnd?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDragOver?: (payload: TreeItemDragPayload) => void;\n\tonDragLeave?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDrop?: (payload: TreeItemDragPayload) => void;\n\tchildren?: ReactNode;\n\t\"data-testid\"?: string;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n}\n\nfunction on(v: boolean | undefined): \"\" | undefined {\n\treturn v ? \"\" : undefined;\n}\n\nfunction isEditableTarget(target: HTMLElement): boolean {\n\treturn [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName) || target.isContentEditable;\n}\n\nfunction isArrowToggle(key: string, hasChildren: boolean, expanded: boolean): boolean {\n\tif (key === \"ArrowRight\") return hasChildren && !expanded;\n\tif (key === \"ArrowLeft\") return hasChildren && expanded;\n\treturn false;\n}\n\nfunction handleTreeKeyDown(\n\te: KeyboardEvent<HTMLDivElement>,\n\titem: TreeItemData,\n\thasChildren: boolean,\n\texpanded: boolean,\n\tselectable: boolean,\n\tonToggleExpand: (id: string | number) => void,\n\tonToggleSelect: (id: string | number) => void,\n) {\n\tif (item.disabled || isEditableTarget(e.target as HTMLElement)) return;\n\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\te.preventDefault();\n\t\tif (hasChildren) onToggleExpand(item.id);\n\t\telse if (selectable) onToggleSelect(item.id);\n\t\treturn;\n\t}\n\tif (isArrowToggle(e.key, hasChildren, expanded)) {\n\t\te.preventDefault();\n\t\tonToggleExpand(item.id);\n\t}\n}\n\nfunction buildDragHandlers(\n\titem: TreeItemData,\n\tparentId: string | number | null,\n\tdraggable: boolean,\n\tdraggingFromHandle: React.MutableRefObject<boolean>,\n\tonDragStart?: (payload: TreeItemDragPayload) => void,\n\tonDragEnd?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void,\n\tonDragOver?: (payload: TreeItemDragPayload) => void,\n\tonDragLeave?: (payload: { event: globalThis.DragEvent; item: TreeItemData }) => void,\n\tonDrop?: (payload: TreeItemDragPayload) => void,\n) {\n\treturn {\n\t\thandleDragStart(e: DragEvent) {\n\t\t\tif (!draggingFromHandle.current) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.dataTransfer.setData(\"application/json\", JSON.stringify({ id: item.id, parentId }));\n\t\t\te.dataTransfer.effectAllowed = \"move\";\n\t\t\tonDragStart?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t\thandleDragEnd(e: DragEvent) {\n\t\t\tdraggingFromHandle.current = false;\n\t\t\tonDragEnd?.({ event: e.nativeEvent, item });\n\t\t},\n\t\thandleDragOver(e: DragEvent) {\n\t\t\tif (!draggable) return;\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = \"move\";\n\t\t\tonDragOver?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t\thandleDragLeave(e: DragEvent) {\n\t\t\tonDragLeave?.({ event: e.nativeEvent, item });\n\t\t},\n\t\thandleDrop(e: DragEvent) {\n\t\t\te.preventDefault();\n\t\t\tonDrop?.({ event: e.nativeEvent, item, parentId });\n\t\t},\n\t};\n}\n\nfunction TreeItemSlots({\n\titem,\n\tlevel,\n\tselectable,\n\tselected,\n\tprefixSlot,\n\tlabelSlot,\n\tmetaSlot,\n\tsuffixSlot,\n\tonToggleSelect,\n}: {\n\titem: TreeItemData;\n\tlevel: number;\n\tselectable: boolean;\n\tselected: boolean;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tonToggleSelect: (id: string | number) => void;\n}) {\n\treturn (\n\t\t<>\n\t\t\t{selectable && (\n\t\t\t\t<Checkbox\n\t\t\t\t\tchecked={selected}\n\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\tclassName={styles.checkbox}\n\t\t\t\t\tonChange={() => !item.disabled && onToggleSelect(item.id)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{prefixSlot?.(item, level)}\n\t\t\t<div className={styles.slotsWrapper}>\n\t\t\t\t{labelSlot ? (\n\t\t\t\t\tlabelSlot(item, level)\n\t\t\t\t) : (\n\t\t\t\t\t<span className={styles.label} data-testid=\"tree-item-label\">\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{metaSlot\n\t\t\t\t\t? metaSlot(item, level)\n\t\t\t\t\t: item.meta && <span className={styles.meta}>{item.meta}</span>}\n\t\t\t\t{suffixSlot?.(item, level)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport function TreeItem({\n\titem,\n\tlevel = 0,\n\texpanded = false,\n\tselected = false,\n\tdraggable = false,\n\tselectable = false,\n\thasChildren = false,\n\tindentSize = 24,\n\tparentId = null,\n\tbordered = false,\n\tflatIndex = 0,\n\tstriped = false,\n\tonToggleExpand,\n\tonToggleSelect,\n\tonDragStart,\n\tonDragEnd,\n\tonDragOver,\n\tonDragLeave,\n\tonDrop,\n\tchildren,\n\t\"data-testid\": dataTestId,\n\tlabelSlot,\n\tmetaSlot,\n\tprefixSlot,\n\tsuffixSlot,\n}: TreeItemProps) {\n\tconst draggingFromHandle = useRef(false);\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) =>\n\t\thandleTreeKeyDown(e, item, hasChildren, expanded, selectable, onToggleExpand, onToggleSelect);\n\n\tconst dragHandlers = buildDragHandlers(\n\t\titem,\n\t\tparentId,\n\t\tdraggable,\n\t\tdraggingFromHandle,\n\t\tonDragStart,\n\t\tonDragEnd,\n\t\tonDragOver,\n\t\tonDragLeave,\n\t\tonDrop,\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.treeItem}\n\t\t\tstyle={{ \"--tree-item-indent\": `${level * indentSize}px` } as React.CSSProperties}\n\t\t\tdata-level={level}\n\t\t\tdata-expanded={on(expanded)}\n\t\t\tdata-selected={on(selected)}\n\t\t\tdata-disabled={on(item.disabled)}\n\t\t\tdata-has-children={on(hasChildren)}\n\t\t\tdata-bordered={on(bordered)}\n\t\t\tdata-striped={on(striped)}\n\t\t\tdata-odd-row={on(striped && flatIndex % 2 === 1)}\n\t\t\tdata-testid={dataTestId}\n\t\t\trole=\"treeitem\"\n\t\t\taria-level={level + 1}\n\t\t\taria-expanded={hasChildren ? expanded : undefined}\n\t\t\taria-selected={selectable ? selected : undefined}\n\t\t\taria-disabled={item.disabled}\n\t\t\ttabIndex={0}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonMouseUp={() => {\n\t\t\t\tdraggingFromHandle.current = false;\n\t\t\t}}\n\t\t>\n\t\t\t{/* biome-ignore lint/a11y/noStaticElementInteractions: drag-and-drop container captures native DnD events; keyboard interaction is on the parent treeitem */}\n\t\t\t<div\n\t\t\t\tclassName={styles.content}\n\t\t\t\tdraggable={draggable && !item.disabled}\n\t\t\t\tonDragStart={dragHandlers.handleDragStart}\n\t\t\t\tonDragEnd={dragHandlers.handleDragEnd}\n\t\t\t\tonDragOver={dragHandlers.handleDragOver}\n\t\t\t\tonDragLeave={dragHandlers.handleDragLeave}\n\t\t\t\tonDrop={dragHandlers.handleDrop}\n\t\t\t>\n\t\t\t\t{draggable && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={styles.dragHandle}\n\t\t\t\t\t\tdata-testid=\"tree-item-drag-handle\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tdraggingFromHandle.current = true;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonTouchStart={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tdraggingFromHandle.current = true;\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"drag-handle-outline\" size={18} />\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\n\t\t\t\t<div className={styles.indent} aria-hidden=\"true\" />\n\n\t\t\t\t<TreeItemSlots\n\t\t\t\t\titem={item}\n\t\t\t\t\tlevel={level}\n\t\t\t\t\tselectable={selectable}\n\t\t\t\t\tselected={selected}\n\t\t\t\t\tprefixSlot={prefixSlot}\n\t\t\t\t\tlabelSlot={labelSlot}\n\t\t\t\t\tmetaSlot={metaSlot}\n\t\t\t\t\tsuffixSlot={suffixSlot}\n\t\t\t\t\tonToggleSelect={onToggleSelect}\n\t\t\t\t/>\n\n\t\t\t\t{hasChildren ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName={styles.expandBtn}\n\t\t\t\t\t\taria-expanded={expanded}\n\t\t\t\t\t\taria-label={expanded ? \"Collapse\" : \"Expand\"}\n\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\tonToggleExpand(item.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"chevron-down-outline\" size={16} />\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span className={styles.expandPlaceholder} aria-hidden=\"true\" />\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{hasChildren && (\n\t\t\t\t<div className={styles.childrenSlot} hidden={!expanded}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n .treeList {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { TreeItem } from \"../TreeItem/TreeItem\";\nimport type { TreeItemData } from \"../TreeItem/treeTypes\";\nimport styles from \"./TreeList.module.css\";\n\nexport interface TreeListProps {\n\titems?: TreeItemData[];\n\tdraggable?: boolean;\n\texpandedIds?: (string | number)[];\n\tselectedIds?: (string | number)[];\n\tselectable?: boolean;\n\tindentSize?: number;\n\tbordered?: boolean;\n\tstriped?: boolean;\n\tonExpandChange?: (expandedIds: (string | number)[]) => void;\n\tonSelectChange?: (selectedIds: (string | number)[]) => void;\n\tonReorder?: (payload: {\n\t\titemId: string | number;\n\t\tfromParentId: string | number | null;\n\t\ttoParentId: string | number | null;\n\t\tfromIndex: number;\n\t\ttoIndex: number;\n\t}) => void;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\t\"data-testid\"?: string;\n}\n\nfunction findItemById(items: TreeItemData[], id: string | number): TreeItemData | null {\n\tfor (const item of items) {\n\t\tif (item.id === id) return item;\n\t\tif (item.children) {\n\t\t\tconst found = findItemById(item.children, id);\n\t\t\tif (found) return found;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction buildFlatIndexMap(\n\titems: TreeItemData[],\n\texpandedIds: (string | number)[],\n): Map<string | number, number> {\n\tconst map = new Map<string | number, number>();\n\tlet idx = 0;\n\tfunction traverse(list: TreeItemData[]) {\n\t\tfor (const item of list) {\n\t\t\tmap.set(item.id, idx++);\n\t\t\tif (item.children?.length && expandedIds.includes(item.id)) traverse(item.children);\n\t\t}\n\t}\n\ttraverse(items);\n\treturn map;\n}\n\ninterface RecursiveProps {\n\titems: TreeItemData[];\n\tparentId: string | number | null;\n\tlevel: number;\n\texpandedIds: (string | number)[];\n\tselectedIds: (string | number)[];\n\tflatIndexMap: Map<string | number, number>;\n\tdraggable: boolean;\n\tselectable: boolean;\n\tbordered: boolean;\n\tstriped: boolean;\n\tindentSize: number;\n\tonToggleExpand: (id: string | number) => void;\n\tonToggleSelect: (id: string | number) => void;\n\tonDragStart: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tonDragEnd: (p: { event: globalThis.DragEvent; item: TreeItemData }) => void;\n\tonDragOver: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tonDrop: (p: {\n\t\tevent: globalThis.DragEvent;\n\t\titem: TreeItemData;\n\t\tparentId: string | number | null;\n\t}) => void;\n\tlabelSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tmetaSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tprefixSlot?: (item: TreeItemData, level: number) => ReactNode;\n\tsuffixSlot?: (item: TreeItemData, level: number) => ReactNode;\n}\n\nfunction TreeListRecursive(props: RecursiveProps): ReactNode {\n\tconst { items, parentId, level, expandedIds, selectedIds, flatIndexMap } = props;\n\treturn items.map((item) => {\n\t\tconst hasChildren = Boolean(item.children?.length);\n\t\tconst isExpanded = expandedIds.includes(item.id);\n\t\treturn (\n\t\t\t<TreeItem\n\t\t\t\tkey={item.id}\n\t\t\t\titem={item}\n\t\t\t\tlevel={level}\n\t\t\t\tparentId={parentId}\n\t\t\t\texpanded={isExpanded}\n\t\t\t\tselected={selectedIds.includes(item.id)}\n\t\t\t\tdraggable={props.draggable}\n\t\t\t\tselectable={props.selectable}\n\t\t\t\tbordered={props.bordered}\n\t\t\t\tstriped={props.striped}\n\t\t\t\tflatIndex={flatIndexMap.get(item.id) ?? 0}\n\t\t\t\thasChildren={hasChildren}\n\t\t\t\tindentSize={props.indentSize}\n\t\t\t\tonToggleExpand={props.onToggleExpand}\n\t\t\t\tonToggleSelect={props.onToggleSelect}\n\t\t\t\tonDragStart={props.onDragStart}\n\t\t\t\tonDragEnd={props.onDragEnd}\n\t\t\t\tonDragOver={props.onDragOver}\n\t\t\t\tonDrop={props.onDrop}\n\t\t\t\tlabelSlot={props.labelSlot}\n\t\t\t\tmetaSlot={props.metaSlot}\n\t\t\t\tprefixSlot={props.prefixSlot}\n\t\t\t\tsuffixSlot={props.suffixSlot}\n\t\t\t>\n\t\t\t\t{hasChildren && isExpanded && item.children && (\n\t\t\t\t\t<TreeListRecursive\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\titems={item.children}\n\t\t\t\t\t\tparentId={item.id}\n\t\t\t\t\t\tlevel={level + 1}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</TreeItem>\n\t\t);\n\t});\n}\n\nexport function TreeList({\n\titems = [],\n\tdraggable = false,\n\texpandedIds: controlledExpandedIds,\n\tselectedIds: controlledSelectedIds,\n\tselectable = false,\n\tindentSize = 24,\n\tbordered = false,\n\tstriped = false,\n\tonExpandChange,\n\tonSelectChange,\n\tonReorder,\n\tlabelSlot,\n\tmetaSlot,\n\tprefixSlot,\n\tsuffixSlot,\n\t\"data-testid\": dataTestId,\n}: TreeListProps) {\n\tconst [internalExpanded, setInternalExpanded] = useState<(string | number)[]>([]);\n\tconst [internalSelected, setInternalSelected] = useState<(string | number)[]>([]);\n\tconst dragStateRef = useRef<{ itemId: string | number; parentId: string | number | null } | null>(\n\t\tnull,\n\t);\n\n\tconst expandedIds = controlledExpandedIds ?? internalExpanded;\n\tconst selectedIds = controlledSelectedIds ?? internalSelected;\n\tconst flatIndexMap = useMemo(() => buildFlatIndexMap(items, expandedIds), [items, expandedIds]);\n\n\tconst toggleExpand = useCallback(\n\t\t(id: string | number) => {\n\t\t\tconst next = expandedIds.includes(id)\n\t\t\t\t? expandedIds.filter((i) => i !== id)\n\t\t\t\t: [...expandedIds, id];\n\t\t\tif (!controlledExpandedIds) setInternalExpanded(next);\n\t\t\tonExpandChange?.(next);\n\t\t},\n\t\t[expandedIds, controlledExpandedIds, onExpandChange],\n\t);\n\n\tconst toggleSelect = useCallback(\n\t\t(id: string | number) => {\n\t\t\tconst next = selectedIds.includes(id)\n\t\t\t\t? selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...selectedIds, id];\n\t\t\tif (!controlledSelectedIds) setInternalSelected(next);\n\t\t\tonSelectChange?.(next);\n\t\t},\n\t\t[selectedIds, controlledSelectedIds, onSelectChange],\n\t);\n\n\tconst handleDragStart = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tdragStateRef.current = { itemId: payload.item.id, parentId: payload.parentId };\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDragEnd = useCallback((_p: { event: globalThis.DragEvent; item: TreeItemData }) => {\n\t\tdragStateRef.current = null;\n\t}, []);\n\n\tconst handleDragOver = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tconst state = dragStateRef.current;\n\t\t\tif (!state || state.parentId !== payload.parentId) {\n\t\t\t\tif (payload.event.dataTransfer) payload.event.dataTransfer.dropEffect = \"none\";\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleDrop = useCallback(\n\t\t(payload: {\n\t\t\tevent: globalThis.DragEvent;\n\t\t\titem: TreeItemData;\n\t\t\tparentId: string | number | null;\n\t\t}) => {\n\t\t\tconst state = dragStateRef.current;\n\t\t\tif (!state || state.parentId !== payload.parentId) return;\n\n\t\t\tconst sourceId = state.itemId;\n\t\t\tconst targetId = payload.item.id;\n\t\t\tif (sourceId === targetId) return;\n\n\t\t\tconst parentArray =\n\t\t\t\tpayload.parentId === null ? items : findItemById(items, payload.parentId)?.children;\n\n\t\t\tif (!parentArray) return;\n\n\t\t\tconst fromIndex = parentArray.findIndex((i) => i.id === sourceId);\n\t\t\tconst toIndex = parentArray.findIndex((i) => i.id === targetId);\n\t\t\tif (fromIndex === -1 || toIndex === -1) return;\n\n\t\t\tonReorder?.({\n\t\t\t\titemId: sourceId,\n\t\t\t\tfromParentId: payload.parentId,\n\t\t\t\ttoParentId: payload.parentId,\n\t\t\t\tfromIndex,\n\t\t\t\ttoIndex,\n\t\t\t});\n\t\t},\n\t\t[items, onReorder],\n\t);\n\n\tconst recursiveProps: RecursiveProps = {\n\t\titems,\n\t\tparentId: null,\n\t\tlevel: 0,\n\t\texpandedIds,\n\t\tselectedIds,\n\t\tflatIndexMap,\n\t\tdraggable,\n\t\tselectable,\n\t\tbordered,\n\t\tstriped,\n\t\tindentSize,\n\t\tonToggleExpand: toggleExpand,\n\t\tonToggleSelect: toggleSelect,\n\t\tonDragStart: handleDragStart,\n\t\tonDragEnd: handleDragEnd,\n\t\tonDragOver: handleDragOver,\n\t\tonDrop: handleDrop,\n\t\tlabelSlot,\n\t\tmetaSlot,\n\t\tprefixSlot,\n\t\tsuffixSlot,\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={styles.treeList}\n\t\t\trole=\"tree\"\n\t\t\tdata-draggable={draggable ? \"\" : undefined}\n\t\t\tdata-testid={dataTestId}\n\t\t>\n\t\t\t<TreeListRecursive {...recursiveProps} />\n\t\t</div>\n\t);\n}\n","@layer ds-components {\n\t.notification {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: var(--ds-space-2);\n\t\tpadding-block: var(--ds-space-3);\n\t\tpadding-inline: var(--ds-space-4);\n\t\tborder-radius: var(--ds-radius-md);\n\t\tfont-family: var(--ds-font-family);\n\t\tfont-size: var(--ds-font-size-sm);\n\t\tfont-weight: var(--ds-font-weight-medium);\n\t\tline-height: var(--ds-leading-snug);\n\n\t\t&[data-variant=\"info\"] {\n\t\t\tbackground-color: var(--ds-color-info-light);\n\t\t\tcolor: var(--ds-color-info-dark);\n\t\t}\n\n\t\t&[data-variant=\"success\"] {\n\t\t\tbackground-color: var(--ds-color-success-light);\n\t\t\tcolor: var(--ds-color-success-dark);\n\t\t}\n\n\t\t&[data-variant=\"warning\"] {\n\t\t\tbackground-color: var(--ds-color-warning-light);\n\t\t\tcolor: var(--ds-color-warning-dark);\n\t\t}\n\n\t\t&[data-variant=\"error\"] {\n\t\t\tbackground-color: var(--ds-color-error-light);\n\t\t\tcolor: var(--ds-color-error-dark);\n\t\t}\n\n\t\t&[data-variant=\"neutral\"] {\n\t\t\tbackground-color: var(--ds-color-gray-100);\n\t\t\tcolor: var(--ds-color-gray-700);\n\t\t}\n\t}\n\n\t.content {\n\t\tflex: 1;\n\t\tmin-inline-size: 0;\n\t}\n\n\t.action {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tmargin-inline-start: var(--ds-space-2);\n\t}\n\n\t.dismiss {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\tmin-inline-size: var(--ds-target-size-min);\n\t\tmin-block-size: var(--ds-target-size-min);\n\t\tmargin-inline-start: var(--ds-space-2);\n\t\tpadding: 0;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcolor: inherit;\n\t\tcursor: pointer;\n\t\tborder-radius: var(--ds-radius-sm);\n\n\t\t&:focus-visible {\n\t\t\toutline: var(--ds-focus-width) solid var(--ds-focus-color);\n\t\t\toutline-offset: var(--ds-focus-offset);\n\t\t}\n\t}\n\n\t/* Static (no-motion) baseline: visible immediately, no transition. */\n\n\t@media (prefers-reduced-motion: no-preference) {\n\t\t.notification {\n\t\t\ttransition:\n\t\t\t\topacity var(--ds-duration-fast) var(--ds-ease-out),\n\t\t\t\ttranslate var(--ds-duration-fast) var(--ds-ease-out);\n\n\t\t\t@starting-style {\n\t\t\t\topacity: 0;\n\t\t\t\ttranslate: 0 calc(-1 * var(--ds-space-2));\n\t\t\t}\n\t\t}\n\t}\n}\n","import type React from \"react\";\nimport { CloseButton } from \"../CloseButton\";\nimport type { IconNameType } from \"../Icon\";\nimport { NotificationBase } from \"./NotificationBase\";\nimport styles from \"./UserNotification.module.css\";\n\nexport type UserNotificationVariant = \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\";\n\nexport interface UserNotificationProps {\n\tvariant?: UserNotificationVariant;\n\ticon?: IconNameType;\n\t/** Required — a user notification is always dismissable. */\n\tonDismiss: () => void;\n\tdismissLabel?: string;\n\taction?: React.ReactNode;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function UserNotification({\n\tvariant = \"info\",\n\ticon,\n\tonDismiss,\n\tdismissLabel = \"Cerrar\",\n\taction,\n\tchildren,\n\tclassName,\n\t\"data-testid\": testId,\n}: UserNotificationProps): React.ReactElement {\n\treturn (\n\t\t<NotificationBase\n\t\t\tvariant={variant}\n\t\t\trootClassName={styles.notification}\n\t\t\tcontentClassName={styles.content}\n\t\t\tactionClassName={styles.action}\n\t\t\ticon={icon}\n\t\t\taction={action}\n\t\t\tclassName={className}\n\t\t\tdata-testid={testId}\n\t\t\tdismissSlot={\n\t\t\t\t<CloseButton\n\t\t\t\t\tclassName={styles.dismiss}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\tlabel={dismissLabel}\n\t\t\t\t\tsize={20}\n\t\t\t\t/>\n\t\t\t}\n\t\t>\n\t\t\t{children}\n\t\t</NotificationBase>\n\t);\n}\n","@layer ds-layouts {\n .header {\n min-height: 50px;\n width: 100%;\n max-width: 1440px;\n display: flex;\n align-items: flex-start;\n margin: auto;\n padding: 10px 16px;\n }\n\n .titleSection {\n flex: 0 0 48%;\n text-align: left;\n }\n\n .title {\n font-weight: 300;\n font-size: 28px;\n color: var(--ds-ang-primary);\n line-height: 30px;\n }\n\n .actions {\n flex: 0 0 50%;\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n @media (max-width: 780px) {\n .header {\n flex-direction: column;\n align-items: center;\n }\n\n .titleSection {\n flex: none;\n width: 98%;\n text-align: center;\n margin-bottom: 20px;\n }\n\n .actions {\n flex: none;\n width: 98%;\n justify-content: center;\n }\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./AdminPageHeader.module.css\";\n\nexport interface AdminPageHeaderProps {\n\ttitle: string;\n\tactions?: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function AdminPageHeader({ title, actions, \"data-testid\": testId }: AdminPageHeaderProps) {\n\treturn (\n\t\t<header className={styles.header} data-testid={testId}>\n\t\t\t<div className={styles.titleSection}>\n\t\t\t\t<span className={styles.title}>{title}</span>\n\t\t\t</div>\n\t\t\t{actions && <div className={styles.actions}>{actions}</div>}\n\t\t</header>\n\t);\n}\n","@layer ang-components {\n .shell {\n display: flex;\n flex-direction: column;\n height: 100dvh;\n width: 100%;\n overflow: hidden;\n }\n\n .body {\n display: flex;\n flex: 1;\n overflow: hidden;\n }\n\n /* Overlay (default): the drawer is fixed, so the slot takes no layout space. */\n .sidebarSlot {\n display: contents;\n }\n\n /* Push: the slot participates in the flex row so the in-flow drawer occupies\n space and pushes the content area; the drawer itself animates its width. */\n .shell[data-sidebar-mode=\"push\"] .sidebarSlot {\n display: flex;\n flex-shrink: 0;\n }\n\n .contentArea {\n display: flex;\n flex-direction: column;\n flex: 1;\n /* Allow the content column to shrink below its content width when the\n push drawer claims space (prevents horizontal overflow). */\n min-width: 0;\n overflow: hidden;\n }\n\n /* Push: content keeps its initial (full shell) width and is pushed right by\n the sidebar's width instead of shrinking/reflowing. The overflowing\n portion is clipped by the shell's own overflow: hidden. */\n .shell[data-sidebar-mode=\"push\"] .contentArea {\n flex: 0 0 100%;\n }\n\n .main {\n flex: 1;\n overflow: auto;\n position: relative;\n }\n\n .tabBarSlot {\n flex-shrink: 0;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { NavBar } from \"../../components/NavBar\";\nimport { PinLockOverlay } from \"../../components/PinLockOverlay\";\nimport styles from \"./AppShell.module.css\";\n\nexport interface AppShellProps {\n\trestaurantName: string;\n\tonMenuToggle: () => void;\n\tonLogoClick: () => void;\n\tonRightToggle: () => void;\n\tsidebar: ReactNode;\n\tchildren: ReactNode;\n\ttabBar?: ReactNode;\n\theaderRight?: ReactNode;\n\t/** Sidebar open state — reflected on the NavBar toggle (aria-expanded + label). */\n\tisSidebarOpen?: boolean;\n\t/** Sidebar layout mode — \"overlay\" (default) or \"push\" (desktop). */\n\tsidebarMode?: \"overlay\" | \"push\";\n\tisPinLocked?: boolean;\n\tpinLockContent?: ReactNode;\n\tisLoading?: boolean;\n\t\"data-testid\"?: string;\n}\n\nexport function AppShell({\n\trestaurantName,\n\tonMenuToggle,\n\tonLogoClick,\n\tonRightToggle,\n\tsidebar,\n\tchildren,\n\ttabBar,\n\theaderRight,\n\tisSidebarOpen = false,\n\tsidebarMode = \"overlay\",\n\tisPinLocked = false,\n\tpinLockContent,\n\tisLoading = false,\n\t\"data-testid\": testId,\n}: AppShellProps) {\n\tif (isPinLocked) {\n\t\treturn <PinLockOverlay isLocked>{pinLockContent}</PinLockOverlay>;\n\t}\n\n\treturn (\n\t\t<div className={styles.shell} data-sidebar-mode={sidebarMode} data-testid={testId}>\n\t\t\t<NavBar\n\t\t\t\trestaurantName={restaurantName}\n\t\t\t\tonMenuToggle={onMenuToggle}\n\t\t\t\tonLogoClick={onLogoClick}\n\t\t\t\tonRightToggle={onRightToggle}\n\t\t\t\tisMenuOpen={isSidebarOpen}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\trightSlot={headerRight}\n\t\t\t/>\n\t\t\t<div className={styles.body}>\n\t\t\t\t<div className={styles.sidebarSlot}>{sidebar}</div>\n\t\t\t\t<div className={styles.contentArea}>\n\t\t\t\t\t<main className={styles.main}>{children}</main>\n\t\t\t\t\t{tabBar && <div className={styles.tabBarSlot}>{tabBar}</div>}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",".divider {\n border: none;\n background-color: var(--color-border, var(--color-neutral-200));\n flex-shrink: 0;\n}\n\n.divider[data-orientation='horizontal'] {\n width: 100%;\n height: 1px;\n}\n\n.divider[data-orientation='vertical'] {\n height: 100%;\n width: 1px;\n align-self: stretch;\n}\n\n.divider[data-spacing='sm'] {\n margin: var(--spacing-sm) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='sm'] {\n margin: 0 var(--spacing-sm);\n}\n\n.divider[data-spacing='md'] {\n margin: var(--spacing-md) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='md'] {\n margin: 0 var(--spacing-md);\n}\n\n.divider[data-spacing='lg'] {\n margin: var(--spacing-lg) 0;\n}\n\n.divider[data-orientation='vertical'][data-spacing='lg'] {\n margin: 0 var(--spacing-lg);\n}\n","import styles from \"./Divider.module.css\";\n\nexport interface DividerProps {\n\torientation?: \"horizontal\" | \"vertical\";\n\tspacing?: \"sm\" | \"md\" | \"lg\";\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function Divider({\n\torientation = \"horizontal\",\n\tspacing = \"md\",\n\tclassName,\n\t\"data-testid\": testId,\n}: DividerProps) {\n\treturn (\n\t\t<hr\n\t\t\tclassName={[styles.divider, className].filter(Boolean).join(\" \")}\n\t\t\tdata-orientation={orientation}\n\t\t\tdata-spacing={spacing}\n\t\t\taria-orientation={orientation}\n\t\t\tdata-testid={testId}\n\t\t/>\n\t);\n}\n","@layer ds-layouts {\n .grid {\n display: grid;\n grid-template-columns: var(--grid-columns, repeat(1, minmax(0, 1fr)));\n gap: var(--grid-gap, var(--ds-space-3));\n }\n}\n","import type { CSSProperties, ReactNode } from \"react\";\nimport styles from \"./Grid.module.css\";\n\nexport type GridGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface GridProps {\n\tcolumns?: number | string;\n\tgap?: GridGap;\n\tchildren: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n\t\"data-testid\"?: string;\n}\n\nconst GAP_MAP: Record<GridGap, string> = {\n\txs: \"var(--ds-space-1)\",\n\tsm: \"var(--ds-space-2)\",\n\tmd: \"var(--ds-space-3)\",\n\tlg: \"var(--ds-space-4)\",\n\txl: \"var(--ds-space-6)\",\n};\n\nexport function Grid({\n\tcolumns = 1,\n\tgap = \"md\",\n\tchildren,\n\tclassName,\n\tstyle,\n\t\"data-testid\": testId,\n}: GridProps) {\n\tconst gridTemplateColumns =\n\t\ttypeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n\n\tconst gridStyle: CSSProperties = {\n\t\t\"--grid-columns\": gridTemplateColumns,\n\t\t\"--grid-gap\": GAP_MAP[gap],\n\t\t...style,\n\t} as CSSProperties;\n\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.grid, className].filter(Boolean).join(\" \")}\n\t\t\tstyle={gridStyle}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","@layer ds-layouts {\n .footer {\n position: absolute;\n inset-block-end: var(--ds-space-4);\n inset-inline: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-space-3);\n flex-wrap: wrap;\n padding-inline: var(--ds-space-6);\n }\n\n .dot {\n inline-size: 0.1875rem;\n block-size: 0.1875rem;\n border-radius: var(--ds-radius-circle);\n background-color: var(--ds-color-gray-300);\n flex-shrink: 0;\n }\n\n .info {\n font-size: var(--ds-font-size-xs);\n color: var(--ds-color-text-muted);\n white-space: nowrap;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./LoginFooter.module.css\";\n\nexport interface LoginFooterProps {\n\t/** Caller passes <LanguageSelector .../> or any language-picker node */\n\tlanguageSelector?: ReactNode;\n\t/** Application display name. @default \"Toteat©\" */\n\tappName?: string;\n\t/** Semver string, e.g. \"1.4.2\" */\n\tversion?: string;\n\t/** Environment label shown in non-prod builds, e.g. \"STAGING\" */\n\tenv?: string;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function LoginFooter({\n\tlanguageSelector,\n\tappName = \"Toteat©\",\n\tversion,\n\tenv,\n\tclassName,\n\t\"data-testid\": testId,\n}: LoginFooterProps) {\n\treturn (\n\t\t<footer className={[styles.footer, className].filter(Boolean).join(\" \")} data-testid={testId}>\n\t\t\t{languageSelector}\n\t\t\t{languageSelector && <span className={styles.dot} aria-hidden=\"true\" />}\n\t\t\t<span className={styles.info}>{appName}</span>\n\t\t\t{(version || env) && <span className={styles.dot} aria-hidden=\"true\" />}\n\t\t\t{(version || env) && (\n\t\t\t\t<span className={styles.info}>\n\t\t\t\t\t{version && <>Ver: {version}</>}\n\t\t\t\t\t{version && env && <>&nbsp;&nbsp;</>}\n\t\t\t\t\t{env && <>Env: {env}</>}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</footer>\n\t);\n}\n","@layer ds-layouts {\n .page {\n text-align: center;\n background: #ffffff;\n color: var(--ds-ang-secondary);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100dvh;\n min-width: 100dvw;\n gap: 1rem;\n position: relative;\n background-image: url(\"/assets/angular/dsBgBottom.svg\");\n background-position: bottom;\n background-repeat: no-repeat;\n background-size: contain;\n font-size: var(--ds-ang-font-size-base);\n }\n\n @media (min-width: 768px) {\n .page {\n background-image: url(\"/assets/angular/login-background-default.svg\");\n background-position: right top;\n background-repeat: no-repeat;\n background-size: 30% auto;\n }\n\n .page::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 0;\n width: 30%;\n height: 100%;\n background-image: url(\"/assets/angular/login-background-default.svg\");\n background-position: left 40px;\n background-repeat: no-repeat;\n background-size: 100% auto;\n transform: rotate(180deg);\n z-index: 0;\n }\n }\n\n .card {\n position: relative;\n z-index: 1;\n background-color: transparent;\n border-radius: 1rem;\n padding: 2rem 1rem;\n width: 100%;\n max-width: 460px;\n animation: cardEntrance 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.1s both;\n }\n\n @media (min-width: 768px) {\n .card {\n background-color: #ffffff;\n border-radius: 16px;\n border: 1px solid var(--ds-ang-neutral-200);\n box-shadow: 0px 4px 4px 0px rgba(0, 0, 0, 0.25);\n }\n }\n}\n\n@keyframes cardEntrance {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(10px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.card {\n\t\tanimation: none;\n\t}\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./LoginPageLayout.module.css\";\n\nexport interface LoginPageLayoutProps {\n\tchildren: ReactNode;\n\t\"data-testid\"?: string;\n}\n\nexport function LoginPageLayout({ children, \"data-testid\": testId }: LoginPageLayoutProps) {\n\treturn (\n\t\t<main className={styles.page} data-testid={testId}>\n\t\t\t<div className={styles.card}>{children}</div>\n\t\t</main>\n\t);\n}\n","@layer ds-layouts {\n .root {\n display: grid;\n grid-template-columns: var(--ds-sidebar-width) 1fr;\n grid-template-rows: 1fr;\n min-height: 100dvh;\n transition: grid-template-columns var(--ds-duration-base) var(--ds-ease-out);\n\n /* Collapsed sidebar */\n &[data-sidebar-collapsed] {\n grid-template-columns: var(--ds-sidebar-collapsed-width) 1fr;\n }\n\n /* Hide sidebar on mobile */\n @media (max-width: 768px) {\n grid-template-columns: 1fr;\n }\n }\n\n .sidebar {\n grid-row: 1;\n grid-column: 1;\n position: sticky;\n top: 0;\n height: 100dvh;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--ds-color-surface);\n border-right: 1px solid var(--ds-color-border);\n z-index: var(--ds-z-sticky);\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n\n .main {\n grid-row: 1;\n grid-column: 2;\n display: grid;\n grid-template-rows: auto 1fr;\n min-height: 100dvh;\n overflow: hidden;\n\n @media (max-width: 768px) {\n grid-column: 1;\n }\n }\n\n .header {\n grid-row: 1;\n position: sticky;\n top: 0;\n height: var(--ds-header-height);\n background-color: var(--ds-color-surface);\n border-bottom: 1px solid var(--ds-color-border);\n z-index: var(--ds-z-raised);\n display: flex;\n align-items: center;\n }\n\n .content {\n grid-row: 2;\n padding: var(--ds-space-6);\n overflow-y: auto;\n }\n}\n","import type { ReactNode } from \"react\";\nimport styles from \"./PageLayout.module.css\";\n\nexport interface PageLayoutProps {\n\tsidebar?: ReactNode;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n\tcollapsed?: boolean;\n\tclassName?: string;\n\t\"data-testid\"?: string;\n}\n\nexport function PageLayout({\n\tsidebar,\n\theader,\n\tchildren,\n\tcollapsed = false,\n\tclassName,\n\t\"data-testid\": testId,\n}: PageLayoutProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={[styles.root, className].filter(Boolean).join(\" \")}\n\t\t\tdata-sidebar-collapsed={collapsed ? \"\" : undefined}\n\t\t\tdata-testid={testId}\n\t\t>\n\t\t\t{sidebar && (\n\t\t\t\t<aside className={styles.sidebar} aria-label=\"Navegación lateral\">\n\t\t\t\t\t{sidebar}\n\t\t\t\t</aside>\n\t\t\t)}\n\t\t\t<div className={styles.main}>\n\t\t\t\t{header && <header className={styles.header}>{header}</header>}\n\t\t\t\t<main className={styles.content}>{children}</main>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import type { ComponentPropsWithoutRef, CSSProperties, ElementType, ReactNode } from \"react\";\n\nexport type StackDirection = \"vertical\" | \"horizontal\";\nexport type StackGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\n\nexport interface StackProps<T extends ElementType = \"div\"> {\n\tas?: T;\n\tdirection?: StackDirection;\n\tgap?: StackGap;\n\talign?: StackAlign;\n\tjustify?: StackJustify;\n\twrap?: boolean;\n\tchildren: ReactNode;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\nconst GAP_MAP: Record<StackGap, string> = {\n\txs: \"var(--ds-space-1)\",\n\tsm: \"var(--ds-space-2)\",\n\tmd: \"var(--ds-space-3)\",\n\tlg: \"var(--ds-space-4)\",\n\txl: \"var(--ds-space-6)\",\n\t\"2xl\": \"var(--ds-space-8)\",\n};\n\nconst JUSTIFY_MAP: Record<StackJustify, string> = {\n\tstart: \"flex-start\",\n\tcenter: \"center\",\n\tend: \"flex-end\",\n\tbetween: \"space-between\",\n\taround: \"space-around\",\n\tevenly: \"space-evenly\",\n};\n\nconst ALIGN_MAP: Record<StackAlign, string> = {\n\tstart: \"flex-start\",\n\tcenter: \"center\",\n\tend: \"flex-end\",\n\tstretch: \"stretch\",\n\tbaseline: \"baseline\",\n};\n\nexport function Stack<T extends ElementType = \"div\">({\n\tas,\n\tdirection = \"vertical\",\n\tgap = \"md\",\n\talign,\n\tjustify,\n\twrap = false,\n\tchildren,\n\tclassName,\n\tstyle,\n\t...rest\n}: StackProps<T> & Omit<ComponentPropsWithoutRef<T>, keyof StackProps<T>>) {\n\tconst Component = (as ?? \"div\") as ElementType;\n\n\tconst stackStyle: CSSProperties = {\n\t\tdisplay: \"flex\",\n\t\tflexDirection: direction === \"vertical\" ? \"column\" : \"row\",\n\t\tgap: GAP_MAP[gap],\n\t\talignItems: align ? ALIGN_MAP[align] : undefined,\n\t\tjustifyContent: justify ? JUSTIFY_MAP[justify] : undefined,\n\t\tflexWrap: wrap ? \"wrap\" : undefined,\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<Component className={className} style={stackStyle} {...rest}>\n\t\t\t{children}\n\t\t</Component>\n\t);\n}\n","/**\n * Pure, dependency-free CSV helpers (RFC 4180). No DOM access.\n */\n\n/**\n * A scalar CSV cell value. DS CSV cells are scalar: passing objects, arrays, or\n * symbols is a compile error, not a silent `\"[object Object]\"`.\n */\nexport type CsvCell = string | number | boolean | null | undefined;\n\n/**\n * Converts a single cell value to a CSV-safe string (RFC 4180).\n *\n * - `null` / `undefined` → `\"\"`\n * - a non-finite `number` (`NaN`, `Infinity`, `-Infinity`) → `\"\"`\n * - otherwise `String(value)`\n * - if the result contains a comma, double-quote, CR or LF, the whole field is\n * wrapped in double quotes and internal double-quotes are doubled.\n */\nexport function escapeCell(value: CsvCell): string {\n\tif (value === null || value === undefined) {\n\t\treturn \"\";\n\t}\n\tif (typeof value === \"number\" && !Number.isFinite(value)) {\n\t\treturn \"\";\n\t}\n\tconst str = String(value);\n\tif (/[\",\\r\\n]/.test(str)) {\n\t\treturn `\"${str.replace(/\"/g, '\"\"')}\"`;\n\t}\n\treturn str;\n}\n\n/**\n * Joins a matrix of cells into an RFC 4180 CSV string: each cell is escaped via\n * {@link escapeCell}, cells are joined by `,`, and rows by `\\r\\n`.\n * Empty input → `\"\"`.\n */\nexport function rowsToCsv(rows: CsvCell[][]): string {\n\treturn rows.map((row) => row.map(escapeCell).join(\",\")).join(\"\\r\\n\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ICGa,KAAoB,CAChC,43CACA,YACA,EAEY,KAAiC,CAC7C,mUACA,YACA,EAEY,KAAiC,CAC7C,gUACA,YACA,EAEY,KAAkC,CAC9C,mUACA,YACA,EAEY,KAA+B,CAC3C,gUACA,YACA,EAEY,IAA0B,CACtC,0MACA,YACA,EAEY,KAA0B,CACtC,qMACA,YACA,EAEY,KAA0B,CACtC,kOACA,YACA,EAEY,KAA+B,CAC3C,yMACA,YACA,EAEY,KAA+B,CAC3C,0MACA,YACA,EAEY,KAAgC,CAC5C,mNACA,YACA,EAEY,KAA6B,CACzC,gNACA,YACA,EAEY,KAA2B,CACvC,0MACA,YACA,EAEY,IAAwB,CACpC,sMACA,YACA,EAEY,KAAuB,CACnC,qzBACA,YACA,EAEY,KAAoB,CAChC,ykBACA,YACA,EAEY,KAA4B,CACxC,02EACA,YACA,EAEY,KAA+B,CAC3C,02BACA,YACA,EAEY,KAAwB,CACpC,29EACA,YACA,EAEY,KAAqB,CACjC,6uBACA,YACA,EAEY,KAAqB,CACjC,iJACA,YACA,EAEY,KAAwB,CACpC,sKACA,YACA,EAEY,KAA0B,CACtC,uHACA,YACA,EAEY,KAA4B,CACxC,+MACA,YACA,EAEY,KAA4B,CACxC,oYACA,YACA,EAEY,KAA4B,CACxC,8MACA,YACA,EAEY,KAA6B,CACzC,mYACA,YACA,EAEY,KAA6B,CACzC,kNACA,YACA,EAEY,KAA0B,CACtC,kNACA,YACA,EAEY,KAAsB,CAClC,obACA,YACA,EAEY,KAAoB,CAChC,mnBACA,YACA,EAEY,KAAqB,CACjC,qMACA,YACA,EAEY,KAA8B,CAC1C,2oBACA,YACA,EAEY,KAA4B,CACxC,koBACA,YACA,EAEY,KAA4B,CACxC,moBACA,YACA,EAEY,KAA2B,CACvC,2gBACA,YACA,EAEY,KAAsB,CAClC,iyBACA,YACA,EAEY,KAAwB,CACpC,01CACA,YACA,EAEY,KAAgC,CAC5C,6gBACA,YACA,EAEY,KAAoC,CAChD,wKACA,YACA,EAEY,KAAgC,CAC5C,+YACA,YACA,EAEY,KAA6B,CACzC,6tBACA,YACA,EAEY,KAA2B,CACvC,mTACA,YACA,EAEY,KAAwB,CACpC,iUACA,YACA,EAEY,KAAqB,CACjC,+YACA,YACA,EAEY,KAA2B,CACvC,mWACA,YACA,EAEY,KAAsB,CAClC,qlBACA,YACA,EAEY,KAAsB,CAClC,uhBACA,YACA,EAEY,KAA0B,CACtC,4tBACA,YACA,EAEY,KAAuB,CACnC,kdACA,YACA,EAEY,KAAwB,CACpC,69BACA,YACA,EAEY,KAAuB,CACnC,wTACA,YACA,EAEY,KAAmB,CAC/B,8mBACA,YACA,EAEY,KAAmB,CAC/B,ykCACA,YACA,EAEY,KAAqB,CACjC,m2BACA,YACA,EAEY,KAAqB,CACjC,wZACA,YACA,EAEY,KAAuB,CACnC,kvCACA,YACA,EAEY,KAAoB,CAChC,8vBACA,YACA,EAEY,KAAsB,CAClC,2hBACA,YACA,EAEY,KAAwB,CACpC,yWACA,YACA,EAEY,KAAoB,CAChC,kYACA,YACA,EAEY,KAAwB,CACpC,s1BACA,YACA,EAEY,KAAmB,CAC/B,ojBACA,YACA,EAEY,KAAiC,CAC7C,6sBACA,YACA,EAEY,KAAwB,CACpC,4iBACA,YACA,EAEY,KAAwB,CACpC,igBACA,YACA,EAEY,KAAwB,CACpC,4iBACA,YACA,EAEY,KAAwB,CACpC,qgBACA,YACA,EAEY,KAAwB,CACpC,orBACA,YACA,EAEY,KAAmB,CAC/B,ohBACA,YACA,EAEY,KAAuB,CACnC,siBACA,YACA,EAEY,KAAuB,CACnC,0IACA,YACA,EAEY,KAA+B,CAC3C,w2BACA,YACA,EAEY,KAA+B,CAC3C,m0BACA,YACA,EAEY,KAAoB,CAChC,2YACA,YACA,EAEY,KAA0B,CACtC,4PACA,YACA,EAEY,KAA8B,CAC1C,mTACA,YACA,EAEY,KAAoC,CAChD,6NACA,YACA,EAEY,KAA8B,CAC1C,6NACA,YACA,EAEY,KAAoB,CAChC,mJACA,YACA,EAEY,KAA0B,CACtC,szDACA,YACA,EAEY,KAA0B,CACtC,8sCACA,YACA,EAEY,KAA0B,CACtC,8kBACA,YACA,EAEY,KAAiC,CAC7C,84BACA,YACA,EAEY,KAAkB,CAC9B,yWACA,YACA,EAEY,KAAmB,CAC/B,sbACA,YACA,EAEY,KAAsB,CAClC,2eACA,YACA,EAEY,KAAc,CAC1B,0fACA,YACA,EAEY,KAAqB,CACjC,k3CACA,YACA,EAEY,KAAmC,CAC/C,gQACA,YACA,EAEY,KAA6B,CACzC,gQACA,YACA,EAEY,KAAmB,CAC/B,yNACA,YACA,EAEY,KAAuB,CACnC,qyBACA,YACA,EAEY,KAAmC,CAC/C,g6DACA,YACA,EAEY,KAAmC,CAC/C,6vBACA,YACA,EAEY,KAAqC,CACjD,2oBACA,YACA,EAEY,KAA+B,CAC3C,sRACA,YACA,EAEY,KAAoC,CAChD,kIACA,YACA,EAEY,KAAsC,CAClD,qFACA,YACA,EAEY,KAA8B,CAC1C,yeACA,YACA,EAEY,KAA8B,CAC1C,wRACA,YACA,EAEY,KAAsB,CAClC,8nDACA,YACA,EAEY,KAAsB,CAClC,8NACA,YACA,EAEY,KAAwB,CACpC,usBACA,YACA,EAEY,KAA0B,CACtC,sxBACA,YACA,EAEY,KAA6B,CACzC,gqBACA,YACA,EAEY,KAA0B,CACtC,k8BACA,YACA,EAEY,KAA4B,CACxC,gvBACA,YACA,EAEY,KAA+B,CAC3C,yvBACA,YACA,EAEY,KAA6B,CACzC,ohBACA,YACA,EAEY,KAAmC,CAC/C,g6DACA,YACA,EAEY,KAAmC,CAC/C,6hIACA,YACA,EAEY,KAAmB,CAC/B,gSACA,YACA,EAEY,KAA4B,CACxC,kNACA,YACA,EAEY,KAAuB,CACnC,wTACA,YACA,EAEY,KAAyB,CACrC,gbACA,YACA,EAEY,KAAkB,CAC9B,qPACA,YACA,EAEY,KAAmB,CAC/B,umBACA,YACA,EAEY,KAA8B,CAC1C,8wBACA,YACA,EAEY,KAAsB,CAClC,unCACA,YACA,EAEY,KAAuB,CACnC,gkFACA,YACA,EAEY,KA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"}