siesa-ui-kit 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -115
- package/bin/install.cjs +502 -502
- package/bin/prepare-publish.cjs +28 -28
- package/bin/restore-folders.cjs +28 -28
- package/dist/index.cjs +1479 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1479 -0
- package/dist/index.js.map +1 -0
- package/package.json +92 -111
- package/claude/agents/siesa-ui-kit-specialist.md +0 -2445
- package/claude/prompts/component-template.md +0 -121
- package/claude/prompts/siesa-ui-kit.md +0 -28
- package/claude/settings.local.json +0 -72
- package/dist/ButtonTest.d.ts +0 -6
- package/dist/ButtonTest.d.ts.map +0 -1
- package/dist/components/Alert/Alert.d.ts +0 -23
- package/dist/components/Alert/Alert.d.ts.map +0 -1
- package/dist/components/Alert/Alert.types.d.ts +0 -46
- package/dist/components/Alert/Alert.types.d.ts.map +0 -1
- package/dist/components/Avatar/Avatar.d.ts +0 -41
- package/dist/components/Avatar/Avatar.d.ts.map +0 -1
- package/dist/components/Avatar/Avatar.types.d.ts +0 -46
- package/dist/components/Avatar/Avatar.types.d.ts.map +0 -1
- package/dist/components/Badge/Badge.d.ts +0 -42
- package/dist/components/Badge/Badge.d.ts.map +0 -1
- package/dist/components/Badge/Badge.types.d.ts +0 -32
- package/dist/components/Badge/Badge.types.d.ts.map +0 -1
- package/dist/components/Button/Button.d.ts +0 -84
- package/dist/components/Button/Button.d.ts.map +0 -1
- package/dist/components/Button/Button.types.d.ts +0 -162
- package/dist/components/Button/Button.types.d.ts.map +0 -1
- package/dist/components/Button/icons.d.ts +0 -27
- package/dist/components/Button/icons.d.ts.map +0 -1
- package/dist/components/Button/index.d.ts +0 -4
- package/dist/components/Button/index.d.ts.map +0 -1
- package/dist/components/Checkbox/Checkbox.d.ts +0 -31
- package/dist/components/Checkbox/Checkbox.d.ts.map +0 -1
- package/dist/components/Checkbox/Checkbox.types.d.ts +0 -53
- package/dist/components/Checkbox/Checkbox.types.d.ts.map +0 -1
- package/dist/components/DescriptionList/DescriptionList.d.ts +0 -38
- package/dist/components/DescriptionList/DescriptionList.d.ts.map +0 -1
- package/dist/components/DescriptionList/DescriptionList.types.d.ts +0 -27
- package/dist/components/DescriptionList/DescriptionList.types.d.ts.map +0 -1
- package/dist/components/Divider/Divider.d.ts +0 -33
- package/dist/components/Divider/Divider.d.ts.map +0 -1
- package/dist/components/Divider/Divider.types.d.ts +0 -22
- package/dist/components/Divider/Divider.types.d.ts.map +0 -1
- package/dist/components/Dropdown/Dropdown.d.ts +0 -66
- package/dist/components/Dropdown/Dropdown.d.ts.map +0 -1
- package/dist/components/Dropdown/Dropdown.types.d.ts +0 -124
- package/dist/components/Dropdown/Dropdown.types.d.ts.map +0 -1
- package/dist/components/Dropdown/icons.d.ts +0 -10
- package/dist/components/Dropdown/icons.d.ts.map +0 -1
- package/dist/components/Dropdown/index.d.ts +0 -4
- package/dist/components/Dropdown/index.d.ts.map +0 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts +0 -101
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +0 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +0 -116
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +0 -1
- package/dist/components/DropdownItemCollapsible/icons.d.ts +0 -19
- package/dist/components/DropdownItemCollapsible/icons.d.ts.map +0 -1
- package/dist/components/DropdownItemCollapsible/index.d.ts +0 -9
- package/dist/components/DropdownItemCollapsible/index.d.ts.map +0 -1
- package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts +0 -75
- package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts.map +0 -1
- package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts +0 -85
- package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts.map +0 -1
- package/dist/components/DropdownItemHeading/icons.d.ts +0 -48
- package/dist/components/DropdownItemHeading/icons.d.ts.map +0 -1
- package/dist/components/DropdownItemHeading/index.d.ts +0 -4
- package/dist/components/DropdownItemHeading/index.d.ts.map +0 -1
- package/dist/components/Input/Input.d.ts +0 -40
- package/dist/components/Input/Input.d.ts.map +0 -1
- package/dist/components/Input/Input.types.d.ts +0 -71
- package/dist/components/Input/Input.types.d.ts.map +0 -1
- package/dist/components/Input/icons.d.ts +0 -15
- package/dist/components/Input/icons.d.ts.map +0 -1
- package/dist/components/Input/index.d.ts +0 -3
- package/dist/components/Input/index.d.ts.map +0 -1
- package/dist/components/LoginView/LoginView.d.ts +0 -36
- package/dist/components/LoginView/LoginView.d.ts.map +0 -1
- package/dist/components/LoginView/LoginView.types.d.ts +0 -46
- package/dist/components/LoginView/LoginView.types.d.ts.map +0 -1
- package/dist/components/LoginView/icons.d.ts +0 -18
- package/dist/components/LoginView/icons.d.ts.map +0 -1
- package/dist/components/LoginView/index.d.ts +0 -4
- package/dist/components/LoginView/index.d.ts.map +0 -1
- package/dist/components/Navbar/Navbar.d.ts +0 -63
- package/dist/components/Navbar/Navbar.d.ts.map +0 -1
- package/dist/components/Navbar/Navbar.types.d.ts +0 -194
- package/dist/components/Navbar/Navbar.types.d.ts.map +0 -1
- package/dist/components/Navbar/icons.d.ts +0 -12
- package/dist/components/Navbar/icons.d.ts.map +0 -1
- package/dist/components/Navbar/index.d.ts +0 -4
- package/dist/components/Navbar/index.d.ts.map +0 -1
- package/dist/components/NavigationBar/NavigationBar.d.ts +0 -75
- package/dist/components/NavigationBar/NavigationBar.d.ts.map +0 -1
- package/dist/components/NavigationBar/NavigationBar.types.d.ts +0 -63
- package/dist/components/NavigationBar/NavigationBar.types.d.ts.map +0 -1
- package/dist/components/NavigationBar/index.d.ts +0 -3
- package/dist/components/NavigationBar/index.d.ts.map +0 -1
- package/dist/components/NavigationRail/NavigationRail.d.ts +0 -7
- package/dist/components/NavigationRail/NavigationRail.d.ts.map +0 -1
- package/dist/components/NavigationRail/NavigationRail.types.d.ts +0 -92
- package/dist/components/NavigationRail/NavigationRail.types.d.ts.map +0 -1
- package/dist/components/NavigationRail/index.d.ts +0 -3
- package/dist/components/NavigationRail/index.d.ts.map +0 -1
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +0 -122
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +0 -1
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +0 -139
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +0 -1
- package/dist/components/NavigationRailCommercial/icons.d.ts +0 -33
- package/dist/components/NavigationRailCommercial/icons.d.ts.map +0 -1
- package/dist/components/NavigationRailCommercial/index.d.ts +0 -4
- package/dist/components/NavigationRailCommercial/index.d.ts.map +0 -1
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts +0 -90
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +0 -1
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +0 -162
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +0 -1
- package/dist/components/NavigationRailItem/index.d.ts +0 -3
- package/dist/components/NavigationRailItem/index.d.ts.map +0 -1
- package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts +0 -124
- package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts.map +0 -1
- package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts +0 -154
- package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts.map +0 -1
- package/dist/components/NavigationRailPanel/index.d.ts +0 -3
- package/dist/components/NavigationRailPanel/index.d.ts.map +0 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts +0 -99
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +0 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +0 -152
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +0 -1
- package/dist/components/NavigationRailTypes/icons.d.ts +0 -44
- package/dist/components/NavigationRailTypes/icons.d.ts.map +0 -1
- package/dist/components/NavigationRailTypes/index.d.ts +0 -4
- package/dist/components/NavigationRailTypes/index.d.ts.map +0 -1
- package/dist/components/Notification/Notification.d.ts +0 -52
- package/dist/components/Notification/Notification.d.ts.map +0 -1
- package/dist/components/Notification/Notification.types.d.ts +0 -138
- package/dist/components/Notification/Notification.types.d.ts.map +0 -1
- package/dist/components/Notification/index.d.ts +0 -3
- package/dist/components/Notification/index.d.ts.map +0 -1
- package/dist/components/POSConvention/POSConvention.d.ts +0 -55
- package/dist/components/POSConvention/POSConvention.d.ts.map +0 -1
- package/dist/components/POSConvention/POSConvention.types.d.ts +0 -37
- package/dist/components/POSConvention/POSConvention.types.d.ts.map +0 -1
- package/dist/components/POSConvention/icons.d.ts +0 -21
- package/dist/components/POSConvention/icons.d.ts.map +0 -1
- package/dist/components/POSConvention/index.d.ts +0 -4
- package/dist/components/POSConvention/index.d.ts.map +0 -1
- package/dist/components/POSLocationButton/POSLocationButton.d.ts +0 -73
- package/dist/components/POSLocationButton/POSLocationButton.d.ts.map +0 -1
- package/dist/components/POSLocationButton/POSLocationButton.types.d.ts +0 -75
- package/dist/components/POSLocationButton/POSLocationButton.types.d.ts.map +0 -1
- package/dist/components/POSLocationButton/icons.d.ts +0 -37
- package/dist/components/POSLocationButton/icons.d.ts.map +0 -1
- package/dist/components/POSLocationButton/index.d.ts +0 -4
- package/dist/components/POSLocationButton/index.d.ts.map +0 -1
- package/dist/components/POSNumberButton/POSNumberButton.d.ts +0 -61
- package/dist/components/POSNumberButton/POSNumberButton.d.ts.map +0 -1
- package/dist/components/POSNumberButton/POSNumberButton.types.d.ts +0 -43
- package/dist/components/POSNumberButton/POSNumberButton.types.d.ts.map +0 -1
- package/dist/components/POSNumberButton/index.d.ts +0 -3
- package/dist/components/POSNumberButton/index.d.ts.map +0 -1
- package/dist/components/POSProductButton/POSProductButton.d.ts +0 -59
- package/dist/components/POSProductButton/POSProductButton.d.ts.map +0 -1
- package/dist/components/POSProductButton/POSProductButton.types.d.ts +0 -40
- package/dist/components/POSProductButton/POSProductButton.types.d.ts.map +0 -1
- package/dist/components/POSProductButton/index.d.ts +0 -3
- package/dist/components/POSProductButton/index.d.ts.map +0 -1
- package/dist/components/POSProductCard/POSProductCard.d.ts +0 -68
- package/dist/components/POSProductCard/POSProductCard.d.ts.map +0 -1
- package/dist/components/POSProductCard/POSProductCard.types.d.ts +0 -67
- package/dist/components/POSProductCard/POSProductCard.types.d.ts.map +0 -1
- package/dist/components/POSProductCard/icons.d.ts +0 -10
- package/dist/components/POSProductCard/icons.d.ts.map +0 -1
- package/dist/components/POSProductCard/index.d.ts +0 -3
- package/dist/components/POSProductCard/index.d.ts.map +0 -1
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts +0 -57
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts.map +0 -1
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts +0 -85
- package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts.map +0 -1
- package/dist/components/POSProductSidebarItems/icons.d.ts +0 -9
- package/dist/components/POSProductSidebarItems/icons.d.ts.map +0 -1
- package/dist/components/POSProductSidebarItems/index.d.ts +0 -4
- package/dist/components/POSProductSidebarItems/index.d.ts.map +0 -1
- package/dist/components/POSTable/POSTable.d.ts +0 -75
- package/dist/components/POSTable/POSTable.d.ts.map +0 -1
- package/dist/components/POSTable/POSTable.types.d.ts +0 -71
- package/dist/components/POSTable/POSTable.types.d.ts.map +0 -1
- package/dist/components/POSTable/index.d.ts +0 -3
- package/dist/components/POSTable/index.d.ts.map +0 -1
- package/dist/components/Pagination/Pagination.d.ts +0 -29
- package/dist/components/Pagination/Pagination.d.ts.map +0 -1
- package/dist/components/Pagination/Pagination.types.d.ts +0 -79
- package/dist/components/Pagination/Pagination.types.d.ts.map +0 -1
- package/dist/components/Pagination/icons.d.ts +0 -18
- package/dist/components/Pagination/icons.d.ts.map +0 -1
- package/dist/components/Pagination/index.d.ts +0 -4
- package/dist/components/Pagination/index.d.ts.map +0 -1
- package/dist/components/Quantity/Quantity.d.ts +0 -38
- package/dist/components/Quantity/Quantity.d.ts.map +0 -1
- package/dist/components/Quantity/Quantity.types.d.ts +0 -59
- package/dist/components/Quantity/Quantity.types.d.ts.map +0 -1
- package/dist/components/Radio/Radio.d.ts +0 -45
- package/dist/components/Radio/Radio.d.ts.map +0 -1
- package/dist/components/Radio/Radio.types.d.ts +0 -115
- package/dist/components/Radio/Radio.types.d.ts.map +0 -1
- package/dist/components/Select/Select.d.ts +0 -37
- package/dist/components/Select/Select.d.ts.map +0 -1
- package/dist/components/Select/Select.types.d.ts +0 -124
- package/dist/components/Select/Select.types.d.ts.map +0 -1
- package/dist/components/Select/icons.d.ts +0 -20
- package/dist/components/Select/icons.d.ts.map +0 -1
- package/dist/components/Select/index.d.ts +0 -4
- package/dist/components/Select/index.d.ts.map +0 -1
- package/dist/components/SignUpView/SignUpView.d.ts +0 -38
- package/dist/components/SignUpView/SignUpView.d.ts.map +0 -1
- package/dist/components/SignUpView/SignUpView.types.d.ts +0 -51
- package/dist/components/SignUpView/SignUpView.types.d.ts.map +0 -1
- package/dist/components/SignUpView/icons.d.ts +0 -18
- package/dist/components/SignUpView/icons.d.ts.map +0 -1
- package/dist/components/SignUpView/index.d.ts +0 -4
- package/dist/components/SignUpView/index.d.ts.map +0 -1
- package/dist/components/Switch/Switch.d.ts +0 -46
- package/dist/components/Switch/Switch.d.ts.map +0 -1
- package/dist/components/Switch/Switch.types.d.ts +0 -58
- package/dist/components/Switch/Switch.types.d.ts.map +0 -1
- package/dist/components/Table/Table.d.ts +0 -64
- package/dist/components/Table/Table.d.ts.map +0 -1
- package/dist/components/Table/Table.types.d.ts +0 -173
- package/dist/components/Table/Table.types.d.ts.map +0 -1
- package/dist/components/Table/index.d.ts +0 -3
- package/dist/components/Table/index.d.ts.map +0 -1
- package/dist/components/Tabs/Tabs.d.ts +0 -76
- package/dist/components/Tabs/Tabs.d.ts.map +0 -1
- package/dist/components/Tabs/Tabs.types.d.ts +0 -107
- package/dist/components/Tabs/Tabs.types.d.ts.map +0 -1
- package/dist/components/Tabs/icons.d.ts +0 -45
- package/dist/components/Tabs/icons.d.ts.map +0 -1
- package/dist/components/Tabs/index.d.ts +0 -4
- package/dist/components/Tabs/index.d.ts.map +0 -1
- package/dist/components/Textarea/Textarea.d.ts +0 -38
- package/dist/components/Textarea/Textarea.d.ts.map +0 -1
- package/dist/components/Textarea/Textarea.types.d.ts +0 -46
- package/dist/components/Textarea/Textarea.types.d.ts.map +0 -1
- package/dist/context/ThemeContext.d.ts +0 -46
- package/dist/context/ThemeContext.d.ts.map +0 -1
- package/dist/context/index.d.ts +0 -2
- package/dist/context/index.d.ts.map +0 -1
- package/dist/index.d.ts +0 -88
- package/dist/index.d.ts.map +0 -1
- package/dist/siesa-ui-kit.cjs +0 -1474
- package/dist/siesa-ui-kit.cjs.map +0 -1
- package/dist/siesa-ui-kit.mjs +0 -9580
- package/dist/siesa-ui-kit.mjs.map +0 -1
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +0 -48
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +0 -1
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +0 -49
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +0 -1
- package/dist/views/LayoutCommercial/index.d.ts +0 -3
- package/dist/views/LayoutCommercial/index.d.ts.map +0 -1
- package/dist/views/ListView/ListView.d.ts +0 -47
- package/dist/views/ListView/ListView.d.ts.map +0 -1
- package/dist/views/ListView/ListView.types.d.ts +0 -177
- package/dist/views/ListView/ListView.types.d.ts.map +0 -1
- package/dist/views/ListView/icons.d.ts +0 -60
- package/dist/views/ListView/icons.d.ts.map +0 -1
- package/dist/views/ListView/index.d.ts +0 -3
- package/dist/views/ListView/index.d.ts.map +0 -1
- package/dist/views/LoginView/LoginView.d.ts +0 -36
- package/dist/views/LoginView/LoginView.d.ts.map +0 -1
- package/dist/views/LoginView/LoginView.types.d.ts +0 -46
- package/dist/views/LoginView/LoginView.types.d.ts.map +0 -1
- package/dist/views/LoginView/icons.d.ts +0 -18
- package/dist/views/LoginView/icons.d.ts.map +0 -1
- package/dist/views/LoginView/index.d.ts +0 -4
- package/dist/views/LoginView/index.d.ts.map +0 -1
- package/dist/views/ProductsView/ProductsView.d.ts +0 -56
- package/dist/views/ProductsView/ProductsView.d.ts.map +0 -1
- package/dist/views/ProductsView/ProductsView.types.d.ts +0 -184
- package/dist/views/ProductsView/ProductsView.types.d.ts.map +0 -1
- package/dist/views/ProductsView/icons.d.ts +0 -12
- package/dist/views/ProductsView/icons.d.ts.map +0 -1
- package/dist/views/ProductsView/index.d.ts +0 -3
- package/dist/views/ProductsView/index.d.ts.map +0 -1
- package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts +0 -34
- package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts.map +0 -1
- package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts +0 -50
- package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts.map +0 -1
- package/dist/views/RecoverPasswordView/icons.d.ts +0 -9
- package/dist/views/RecoverPasswordView/icons.d.ts.map +0 -1
- package/dist/views/RecoverPasswordView/index.d.ts +0 -3
- package/dist/views/RecoverPasswordView/index.d.ts.map +0 -1
- package/dist/views/SignUpView/SignUpView.d.ts +0 -38
- package/dist/views/SignUpView/SignUpView.d.ts.map +0 -1
- package/dist/views/SignUpView/SignUpView.types.d.ts +0 -51
- package/dist/views/SignUpView/SignUpView.types.d.ts.map +0 -1
- package/dist/views/SignUpView/icons.d.ts +0 -18
- package/dist/views/SignUpView/icons.d.ts.map +0 -1
- package/dist/views/SignUpView/index.d.ts +0 -4
- package/dist/views/SignUpView/index.d.ts.map +0 -1
- package/dist/views/TableLayoutView/TableLayoutView.d.ts +0 -46
- package/dist/views/TableLayoutView/TableLayoutView.d.ts.map +0 -1
- package/dist/views/TableLayoutView/TableLayoutView.types.d.ts +0 -170
- package/dist/views/TableLayoutView/TableLayoutView.types.d.ts.map +0 -1
- package/dist/views/TableLayoutView/icons.d.ts +0 -27
- package/dist/views/TableLayoutView/icons.d.ts.map +0 -1
- package/dist/views/TableLayoutView/index.d.ts +0 -3
- package/dist/views/TableLayoutView/index.d.ts.map +0 -1
- package/docs/border-radius.md +0 -1261
- package/docs/colors.md +0 -832
- package/docs/dark-mode-guide.md +0 -1426
- package/docs/filters.md +0 -1243
- package/docs/icons.md +0 -1264
- package/docs/shadows.md +0 -1377
- package/docs/spacing.md +0 -1684
- package/docs/typography.md +0 -1268
- package/postcss.config.cjs +0 -6
- package/src/App.css +0 -42
- package/src/App.tsx +0 -8
- package/src/ButtonTest.tsx +0 -147
- package/src/assets/fonts/README.md +0 -261
- package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
- package/src/assets/react.svg +0 -1
- package/src/components/Alert/Alert.stories.tsx +0 -332
- package/src/components/Alert/Alert.tsx +0 -106
- package/src/components/Alert/Alert.types.ts +0 -54
- package/src/components/Avatar/Avatar.stories.tsx +0 -494
- package/src/components/Avatar/Avatar.tsx +0 -143
- package/src/components/Avatar/Avatar.types.ts +0 -53
- package/src/components/Badge/Badge.stories.tsx +0 -339
- package/src/components/Badge/Badge.tsx +0 -278
- package/src/components/Badge/Badge.types.ts +0 -58
- package/src/components/Button/Button.stories.tsx +0 -950
- package/src/components/Button/Button.tsx +0 -337
- package/src/components/Button/Button.types.ts +0 -180
- package/src/components/Button/icons.tsx +0 -48
- package/src/components/Button/index.ts +0 -3
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -453
- package/src/components/Checkbox/Checkbox.tsx +0 -208
- package/src/components/Checkbox/Checkbox.types.ts +0 -61
- package/src/components/DescriptionList/DescriptionList.stories.tsx +0 -250
- package/src/components/DescriptionList/DescriptionList.tsx +0 -96
- package/src/components/DescriptionList/DescriptionList.types.ts +0 -29
- package/src/components/Divider/Divider.stories.tsx +0 -263
- package/src/components/Divider/Divider.tsx +0 -80
- package/src/components/Divider/Divider.types.ts +0 -24
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -552
- package/src/components/Dropdown/Dropdown.tsx +0 -422
- package/src/components/Dropdown/Dropdown.types.ts +0 -146
- package/src/components/Dropdown/README.md +0 -266
- package/src/components/Dropdown/icons.tsx +0 -72
- package/src/components/Dropdown/index.ts +0 -8
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +0 -317
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +0 -307
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +0 -136
- package/src/components/DropdownItemCollapsible/README.md +0 -264
- package/src/components/DropdownItemCollapsible/icons.tsx +0 -57
- package/src/components/DropdownItemCollapsible/index.ts +0 -12
- package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +0 -386
- package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +0 -216
- package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +0 -93
- package/src/components/DropdownItemHeading/README.md +0 -573
- package/src/components/DropdownItemHeading/icons.tsx +0 -125
- package/src/components/DropdownItemHeading/index.ts +0 -3
- package/src/components/Input/Input.stories.tsx +0 -583
- package/src/components/Input/Input.tsx +0 -204
- package/src/components/Input/Input.types.ts +0 -80
- package/src/components/Input/icons.tsx +0 -145
- package/src/components/Input/index.ts +0 -2
- package/src/components/LoginView/LoginView.stories.tsx +0 -148
- package/src/components/LoginView/LoginView.tsx +0 -426
- package/src/components/LoginView/LoginView.types.ts +0 -52
- package/src/components/LoginView/README.md +0 -396
- package/src/components/LoginView/icons.tsx +0 -85
- package/src/components/LoginView/index.ts +0 -3
- package/src/components/Navbar/Navbar.stories.tsx +0 -810
- package/src/components/Navbar/Navbar.tsx +0 -755
- package/src/components/Navbar/Navbar.types.ts +0 -219
- package/src/components/Navbar/README.md +0 -279
- package/src/components/Navbar/icons.tsx +0 -102
- package/src/components/Navbar/index.ts +0 -8
- package/src/components/NavigationBar/NavigationBar.stories.tsx +0 -406
- package/src/components/NavigationBar/NavigationBar.tsx +0 -246
- package/src/components/NavigationBar/NavigationBar.types.ts +0 -74
- package/src/components/NavigationBar/README.md +0 -469
- package/src/components/NavigationBar/index.ts +0 -2
- package/src/components/NavigationRail/NavigationRail.stories.tsx +0 -417
- package/src/components/NavigationRail/NavigationRail.tsx +0 -418
- package/src/components/NavigationRail/NavigationRail.types.ts +0 -109
- package/src/components/NavigationRail/README.md +0 -224
- package/src/components/NavigationRail/index.ts +0 -2
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +0 -464
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +0 -301
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +0 -162
- package/src/components/NavigationRailCommercial/README.md +0 -251
- package/src/components/NavigationRailCommercial/icons.tsx +0 -54
- package/src/components/NavigationRailCommercial/index.ts +0 -6
- package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +0 -667
- package/src/components/NavigationRailItem/NavigationRailItem.tsx +0 -314
- package/src/components/NavigationRailItem/NavigationRailItem.types.ts +0 -175
- package/src/components/NavigationRailItem/README.md +0 -476
- package/src/components/NavigationRailItem/index.ts +0 -2
- package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +0 -462
- package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +0 -332
- package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +0 -178
- package/src/components/NavigationRailPanel/README.md +0 -461
- package/src/components/NavigationRailPanel/index.ts +0 -6
- package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +0 -682
- package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +0 -363
- package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +0 -178
- package/src/components/NavigationRailTypes/README.md +0 -573
- package/src/components/NavigationRailTypes/icons.tsx +0 -76
- package/src/components/NavigationRailTypes/index.ts +0 -7
- package/src/components/Notification/Notification.stories.tsx +0 -513
- package/src/components/Notification/Notification.tsx +0 -145
- package/src/components/Notification/Notification.types.ts +0 -142
- package/src/components/Notification/README.md +0 -409
- package/src/components/Notification/index.ts +0 -3
- package/src/components/POSConvention/POSConvention.stories.tsx +0 -235
- package/src/components/POSConvention/POSConvention.tsx +0 -129
- package/src/components/POSConvention/POSConvention.types.ts +0 -38
- package/src/components/POSConvention/README.md +0 -123
- package/src/components/POSConvention/icons.tsx +0 -45
- package/src/components/POSConvention/index.ts +0 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +0 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +0 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +0 -87
- package/src/components/POSLocationButton/README.md +0 -253
- package/src/components/POSLocationButton/icons.tsx +0 -120
- package/src/components/POSLocationButton/index.ts +0 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +0 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +0 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +0 -51
- package/src/components/POSNumberButton/README.md +0 -321
- package/src/components/POSNumberButton/index.ts +0 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +0 -318
- package/src/components/POSProductButton/POSProductButton.tsx +0 -152
- package/src/components/POSProductButton/POSProductButton.types.ts +0 -46
- package/src/components/POSProductButton/README.md +0 -269
- package/src/components/POSProductButton/index.ts +0 -2
- package/src/components/POSProductCard/POSProductCard.stories.tsx +0 -642
- package/src/components/POSProductCard/POSProductCard.tsx +0 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +0 -76
- package/src/components/POSProductCard/README.md +0 -179
- package/src/components/POSProductCard/icons.tsx +0 -26
- package/src/components/POSProductCard/index.ts +0 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +0 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +0 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +0 -119
- package/src/components/POSProductSidebarItems/README.md +0 -198
- package/src/components/POSProductSidebarItems/icons.tsx +0 -21
- package/src/components/POSProductSidebarItems/index.ts +0 -3
- package/src/components/POSTable/POSTable.stories.tsx +0 -737
- package/src/components/POSTable/POSTable.tsx +0 -401
- package/src/components/POSTable/POSTable.types.ts +0 -83
- package/src/components/POSTable/README.md +0 -286
- package/src/components/POSTable/index.ts +0 -7
- package/src/components/Pagination/Pagination.stories.tsx +0 -555
- package/src/components/Pagination/Pagination.tsx +0 -286
- package/src/components/Pagination/Pagination.types.ts +0 -93
- package/src/components/Pagination/README.md +0 -298
- package/src/components/Pagination/icons.tsx +0 -47
- package/src/components/Pagination/index.ts +0 -3
- package/src/components/Quantity/Quantity.stories.tsx +0 -457
- package/src/components/Quantity/Quantity.tsx +0 -289
- package/src/components/Quantity/Quantity.types.ts +0 -70
- package/src/components/Radio/Radio.stories.tsx +0 -523
- package/src/components/Radio/Radio.tsx +0 -170
- package/src/components/Radio/Radio.types.ts +0 -122
- package/src/components/Select/README.md +0 -299
- package/src/components/Select/Select.stories.tsx +0 -705
- package/src/components/Select/Select.tsx +0 -457
- package/src/components/Select/Select.types.ts +0 -148
- package/src/components/Select/icons.tsx +0 -25
- package/src/components/Select/index.ts +0 -3
- package/src/components/SignUpView/SignUpView.stories.tsx +0 -129
- package/src/components/SignUpView/SignUpView.tsx +0 -503
- package/src/components/SignUpView/SignUpView.types.ts +0 -58
- package/src/components/SignUpView/icons.tsx +0 -71
- package/src/components/SignUpView/index.ts +0 -3
- package/src/components/Switch/README.md +0 -112
- package/src/components/Switch/Switch.stories.tsx +0 -550
- package/src/components/Switch/Switch.tsx +0 -246
- package/src/components/Switch/Switch.types.ts +0 -67
- package/src/components/Table/README.md +0 -369
- package/src/components/Table/Table.stories.tsx +0 -805
- package/src/components/Table/Table.tsx +0 -688
- package/src/components/Table/Table.types.ts +0 -204
- package/src/components/Table/index.ts +0 -9
- package/src/components/Tabs/README.md +0 -201
- package/src/components/Tabs/Tabs.stories.tsx +0 -580
- package/src/components/Tabs/Tabs.tsx +0 -356
- package/src/components/Tabs/Tabs.types.ts +0 -127
- package/src/components/Tabs/icons.tsx +0 -129
- package/src/components/Tabs/index.ts +0 -11
- package/src/components/Textarea/Textarea.stories.tsx +0 -535
- package/src/components/Textarea/Textarea.tsx +0 -188
- package/src/components/Textarea/Textarea.types.ts +0 -54
- package/src/context/ThemeContext.tsx +0 -99
- package/src/context/index.ts +0 -1
- package/src/index.css +0 -29
- package/src/index.ts +0 -133
- package/src/main.tsx +0 -10
- package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +0 -374
- package/src/views/LayoutCommercial/LayoutCommercial.tsx +0 -125
- package/src/views/LayoutCommercial/LayoutCommercial.types.ts +0 -54
- package/src/views/LayoutCommercial/README.md +0 -286
- package/src/views/LayoutCommercial/index.ts +0 -2
- package/src/views/ListView/ListView.stories.tsx +0 -329
- package/src/views/ListView/ListView.tsx +0 -570
- package/src/views/ListView/ListView.types.ts +0 -211
- package/src/views/ListView/icons.tsx +0 -282
- package/src/views/ListView/index.ts +0 -11
- package/src/views/LoginView/LoginView.stories.tsx +0 -148
- package/src/views/LoginView/LoginView.tsx +0 -426
- package/src/views/LoginView/LoginView.types.ts +0 -52
- package/src/views/LoginView/README.md +0 -396
- package/src/views/LoginView/icons.tsx +0 -85
- package/src/views/LoginView/index.ts +0 -3
- package/src/views/ProductsView/ProductsView.stories.tsx +0 -344
- package/src/views/ProductsView/ProductsView.tsx +0 -480
- package/src/views/ProductsView/ProductsView.types.ts +0 -238
- package/src/views/ProductsView/README.md +0 -312
- package/src/views/ProductsView/icons.tsx +0 -38
- package/src/views/ProductsView/index.ts +0 -8
- package/src/views/RecoverPasswordView/README.md +0 -269
- package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +0 -131
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +0 -376
- package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +0 -56
- package/src/views/RecoverPasswordView/icons.tsx +0 -17
- package/src/views/RecoverPasswordView/index.ts +0 -2
- package/src/views/SignUpView/SignUpView.stories.tsx +0 -129
- package/src/views/SignUpView/SignUpView.tsx +0 -503
- package/src/views/SignUpView/SignUpView.types.ts +0 -58
- package/src/views/SignUpView/icons.tsx +0 -71
- package/src/views/SignUpView/index.ts +0 -3
- package/src/views/TableLayoutView/README.md +0 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +0 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +0 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +0 -209
- package/src/views/TableLayoutView/icons.tsx +0 -113
- package/src/views/TableLayoutView/index.ts +0 -6
- package/storybook/main.ts +0 -20
- package/storybook/preview.tsx +0 -84
- package/storybook/vitest.setup.ts +0 -7
- package/tailwind.config.js +0 -128
- /package/{public → dist}/,Business Logo.png +0 -0
- /package/{public → dist}/.Siesa Logo.png +0 -0
- /package/{public → dist}/bg_siesa.png +0 -0
- /package/{public → dist}/siesa_logo_mobile.png +0 -0
- /package/{public → dist}/vite.svg +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"siesa-ui-kit.mjs","sources":["../src/components/Button/Button.tsx","../src/components/Input/Input.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Radio/Radio.tsx","../src/components/Switch/Switch.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Divider/Divider.tsx","../src/components/DescriptionList/DescriptionList.tsx","../src/components/Alert/Alert.tsx","../src/components/Badge/Badge.tsx","../src/components/Quantity/Quantity.tsx","../src/components/NavigationRailItem/NavigationRailItem.tsx","../src/components/Dropdown/icons.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/DropdownItemCollapsible/icons.tsx","../src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx","../src/components/DropdownItemHeading/icons.tsx","../src/components/DropdownItemHeading/DropdownItemHeading.tsx","../src/components/Notification/Notification.tsx","../src/components/Pagination/icons.tsx","../src/components/Pagination/Pagination.tsx","../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../node_modules/@heroicons/react/24/outline/esm/ChevronUpDownIcon.js","../node_modules/@heroicons/react/24/outline/esm/ClockIcon.js","../src/components/Select/icons.tsx","../src/components/Select/Select.tsx","../src/components/NavigationRail/NavigationRail.tsx","../src/components/NavigationRailPanel/NavigationRailPanel.tsx","../node_modules/@heroicons/react/20/solid/esm/ChevronLeftIcon.js","../node_modules/@heroicons/react/20/solid/esm/ChevronRightIcon.js","../node_modules/@heroicons/react/20/solid/esm/MagnifyingGlassIcon.js","../src/components/NavigationRailTypes/icons.tsx","../src/components/NavigationRailTypes/NavigationRailTypes.tsx","../src/components/NavigationRailCommercial/icons.tsx","../src/components/NavigationRailCommercial/NavigationRailCommercial.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Navbar/icons.tsx","../src/components/Navbar/Navbar.tsx","../src/components/NavigationBar/NavigationBar.tsx","../src/components/POSConvention/icons.tsx","../src/components/POSConvention/POSConvention.tsx","../src/components/POSLocationButton/icons.tsx","../src/components/POSLocationButton/POSLocationButton.tsx","../src/components/POSNumberButton/POSNumberButton.tsx","../src/components/POSProductButton/POSProductButton.tsx","../src/components/POSProductCard/icons.tsx","../src/components/POSProductCard/POSProductCard.tsx","../src/components/POSProductSidebarItems/icons.tsx","../src/components/POSProductSidebarItems/POSProductSidebarItems.tsx","../src/components/POSTable/POSTable.tsx","../src/components/LoginView/icons.tsx","../src/components/LoginView/LoginView.tsx","../src/components/SignUpView/icons.tsx","../src/components/SignUpView/SignUpView.tsx","../src/views/LayoutCommercial/LayoutCommercial.tsx","../src/views/ListView/icons.tsx","../src/views/ListView/ListView.tsx","../src/views/LoginView/icons.tsx","../src/views/LoginView/LoginView.tsx","../src/views/ProductsView/icons.tsx","../src/views/ProductsView/ProductsView.tsx","../src/views/RecoverPasswordView/icons.tsx","../src/views/RecoverPasswordView/RecoverPasswordView.tsx","../src/views/SignUpView/icons.tsx","../src/views/SignUpView/SignUpView.tsx","../src/views/TableLayoutView/icons.tsx","../src/views/TableLayoutView/TableLayoutView.tsx","../src/context/ThemeContext.tsx"],"sourcesContent":["import React from 'react';\nimport type { ButtonProps } from './Button.types';\n\n/**\n * Componente Button del sistema de diseño Siesa\n *\n * Implementación pixel-perfect basada en Figma (node 4001-17240)\n * con soporte completo para todos los estados, tamaños y variantes.\n *\n * **Variantes (type):**\n * - `default`: Botón primario con fondo sólido (#0e79fd) y borde (#3c9bf6)\n * - Sombra interna para efecto de profundidad\n * - Usar para acciones principales (Guardar, Enviar, Confirmar)\n * - `outline`: Botón secundario con borde (#93d1fd) y shadow-sm\n * - Usar para acciones secundarias (Cancelar, Volver)\n * - `plain`: Botón terciario sin borde visible\n * - Hover overlay sutil\n * - Usar para acciones sutiles (Cerrar, Ver más, Links)\n *\n * **Tamaños (size):**\n * - `xs` (24px): Espacios muy compactos, inline actions. Padding: 8px h, 4px v\n * - `sm` (28px): Barras de herramientas, acciones secundarias. Padding: 8px h, 4px v\n * - `base` (32px): Tamaño estándar para la mayoría de casos. Padding: 10px h, 6px v\n * - `l` (36px): Botones destacados, CTAs. Padding: 12px h, 8px v\n * - `xl` (40px): Heroes, landing pages. Padding: 16px h, 8px v\n *\n * **Estados:**\n * - `default`: Estado normal con colores base\n * - `hover`: Overlay visual sutil (bg-primary-custom-500 para default)\n * - `focus`: Focus ring de 4px (#60b6fa) con offset de 2px (#dbeefe)\n * - `active`: Scale animation (scale-95) para feedback táctil\n * - `disabled`: Opacity 50% con pointer-events-none\n *\n * **Badges de notificación:**\n * - `badge`: Muestra un dot de notificación en la esquina superior derecha\n * - `badgeCount`: Muestra un badge con número (99+ para >99)\n * - `badgeColor`: Color del badge (por defecto: red - #b91c1c)\n *\n * **Especificaciones de Figma:**\n * - Border radius: 6px (rounded-md)\n * - Tipografía: Label Small (14px Bold) para sm/base/l/xl, Label Tiny (12px Bold) para xs\n * - Iconos: 16x16px en todos los tamaños\n * - Gap entre elementos: 8px (xs/sm/base), 12px (l/xl)\n *\n * **Dark Mode:**\n * Los botones invierten colores en dark mode:\n * - Default: fondo celeste claro (#bfe2fe), texto azul (#0e79fd), borde celeste (#93d1fd)\n * - Outline: texto celeste (#93d1fd), borde azul (#0f6ae3)\n * - Plain: texto celeste (#93d1fd), hover overlay blanco 20%\n * - Focus ring adaptativo con offset oscuro\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/shadows.md - Sistema de sombras (shadow-button-inset, shadow-sm)\n * @see docs/typography.md - Sistema tipográfico (Label Small/Tiny)\n * @see docs/spacing.md - Sistema de espaciado\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4001-17240 - Diseño Figma\n *\n * @example\n * ```tsx\n * // Botón primario con icono\n * <Button type=\"default\" size=\"base\" leftIcon={<SaveIcon />}>\n * Guardar\n * </Button>\n *\n * // Botón secundario\n * <Button type=\"outline\" size=\"base\">\n * Cancelar\n * </Button>\n *\n * // Botón solo icono para barra de herramientas\n * <Button type=\"plain\" size=\"sm\" iconOnly leftIcon={<CloseIcon />} ariaLabel=\"Cerrar\" />\n *\n * // Botón con badge de notificación (dot)\n * <Button type=\"default\" size=\"base\" badge>\n * Notificaciones\n * </Button>\n *\n * // Botón con badge contador\n * <Button type=\"default\" size=\"base\" badgeCount={5} badgeColor=\"red\">\n * Mensajes\n * </Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n type = 'default',\n size = 'base',\n iconOnly = false,\n leftIcon,\n rightIcon,\n children,\n disabled = false,\n className = '',\n onClick,\n htmlType = 'button',\n fullWidth = false,\n ariaLabel,\n badge = false,\n badgeCount,\n badgeColor = 'red',\n ...rest\n}) => {\n // ===== CLASES DE TAMAÑO =====\n const sizeClasses = {\n xs: iconOnly ? 'h-6 w-6 p-1' : 'h-6 py-1 px-2 gap-2',\n sm: iconOnly ? 'h-7 w-7 p-1.5' : 'h-7 py-1 px-2 gap-2',\n base: iconOnly ? 'h-8 w-8 p-2' : 'h-8 py-1.5 px-2.5 gap-2',\n l: iconOnly ? 'h-9 w-9 p-2.5' : 'h-9 py-2 px-3 gap-3',\n xl: iconOnly ? 'h-10 w-10 p-3' : 'h-10 py-2 px-4 gap-3',\n };\n\n // ===== CLASES DE TAMAÑO DE ICONO =====\n const iconSizeClasses = {\n xs: 'w-4 h-4',\n sm: 'w-4 h-4',\n base: 'w-4 h-4',\n l: 'w-4 h-4',\n xl: 'w-4 h-4',\n };\n\n // ===== CLASES DE TAMAÑO DE TEXTO =====\n // Usando el sistema de tipografía Label del design system (typography.md)\n const textSizeClasses = {\n xs: 'text-xs', // Label Tiny - 12px\n sm: 'text-sm', // Label Small - 14px\n base: 'text-sm', // Label Small - 14px (default para base)\n l: 'text-sm', // Label Small - 14px (corregido según Figma)\n xl: 'text-sm', // Label Small - 14px (corregido según Figma)\n };\n\n // ===== CLASES DE TIPO (Default, Outline, Plain) =====\n // Especificaciones de Figma node 4001-17240\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n // Dark mode: Los botones invierten colores (fondo claro, texto oscuro)\n // - Light: fondo #0e79fd (azul), texto #eff8ff (blanco)\n // - Dark: fondo #bfe2fe (celeste claro), texto #0e79fd (azul)\n const typeClasses = {\n default: `\n bg-primary-custom-600\n text-primary-inverse-content\n border\n border-primary-inverse-border\n shadow-button-inset\n hover:bg-primary-custom-500\n active:scale-95\n transition-all\n duration-150\n dark:bg-dark-bg-inverse\n dark:text-dark-content-inverse\n dark:border-dark-border-inverse\n dark:hover:bg-dark-bg-inverse/90\n `,\n outline: `\n bg-transparent\n text-primary-custom-600\n border\n border-primary-custom-300\n shadow-sm\n hover:bg-primary-custom-100\n active:scale-95\n transition-all\n duration-150\n dark:text-dark-content-custom\n dark:border-dark-border-custom\n dark:hover:bg-dark-bg-custom/20\n `,\n plain: `\n bg-transparent\n text-primary-custom-600\n border\n border-transparent\n hover:bg-hover-overlay\n active:scale-95\n transition-all\n duration-150\n dark:text-dark-content-custom\n dark:hover:bg-hover-overlay-dark\n `,\n };\n\n // ===== CLASES BASE =====\n // Especificaciones de Figma: Focus ring = 4px spread primary-custom-400 + 2px offset primary-custom-100\n // Dark mode: Focus ring adaptativo con offset oscuro\n const baseClasses = `\n inline-flex\n items-center\n justify-center\n rounded-md\n font-bold\n whitespace-nowrap\n focus:outline-none\n focus:ring-4\n focus:ring-primary-custom-400\n focus:ring-offset-2\n focus:ring-offset-primary-custom-100\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n disabled:opacity-50\n disabled:cursor-not-allowed\n disabled:pointer-events-none\n `;\n\n // ===== CLASE FULL WIDTH =====\n const widthClass = fullWidth ? 'w-full' : '';\n\n // ===== COMBINAR TODAS LAS CLASES =====\n const buttonClasses = [\n baseClasses,\n sizeClasses[size],\n typeClasses[type],\n widthClass,\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== RENDERIZAR ICONO =====\n const renderIcon = (icon: React.ReactNode) => {\n if (!icon) return null;\n return (\n <span className={`inline-flex items-center justify-center ${iconSizeClasses[size]}`}>\n {icon}\n </span>\n );\n };\n\n // ===== RENDERIZAR CONTENIDO =====\n const renderContent = () => {\n // Si es iconOnly, solo mostrar leftIcon\n if (iconOnly) {\n return renderIcon(leftIcon);\n }\n\n // Si tiene texto y/o iconos\n return (\n <>\n {leftIcon && renderIcon(leftIcon)}\n {children && <span className={textSizeClasses[size]}>{children}</span>}\n {rightIcon && renderIcon(rightIcon)}\n </>\n );\n };\n\n // ===== MAPA DE COLORES DE BADGE =====\n // Basado en el componente Badge existente\n const badgeColorClasses: Record<string, { bg: string; text: string }> = {\n zinc: { bg: 'bg-zinc-600', text: 'text-white' },\n red: { bg: 'bg-red-700', text: 'text-white' },\n orange: { bg: 'bg-orange-700', text: 'text-white' },\n amber: { bg: 'bg-amber-700', text: 'text-white' },\n yellow: { bg: 'bg-yellow-700', text: 'text-white' },\n lime: { bg: 'bg-lime-700', text: 'text-white' },\n green: { bg: 'bg-green-700', text: 'text-white' },\n emerald: { bg: 'bg-emerald-700', text: 'text-white' },\n teal: { bg: 'bg-teal-700', text: 'text-white' },\n cyan: { bg: 'bg-cyan-700', text: 'text-white' },\n sky: { bg: 'bg-sky-700', text: 'text-white' },\n blue: { bg: 'bg-blue-700', text: 'text-white' },\n indigo: { bg: 'bg-indigo-700', text: 'text-white' },\n violet: { bg: 'bg-violet-700', text: 'text-white' },\n purple: { bg: 'bg-purple-700', text: 'text-white' },\n fuchsia: { bg: 'bg-fuchsia-700', text: 'text-white' },\n pink: { bg: 'bg-pink-700', text: 'text-white' },\n rose: { bg: 'bg-rose-700', text: 'text-white' },\n primary: { bg: 'bg-primary-custom-600', text: 'text-white' },\n secondary: { bg: 'bg-zinc-600', text: 'text-white' },\n tertiary: { bg: 'bg-zinc-600', text: 'text-white' },\n };\n\n const badgeColors = badgeColorClasses[badgeColor] || badgeColorClasses.red;\n\n // ===== RENDERIZAR BADGE =====\n const renderBadge = () => {\n // Si no hay badge ni badgeCount, no renderizar nada\n if (!badge && badgeCount === undefined) return null;\n\n // Si hay badgeCount, renderizar badge con número\n if (badgeCount !== undefined) {\n return (\n <span\n className={`\n absolute\n -top-1\n -right-1\n flex\n items-center\n justify-center\n min-w-[16px]\n h-4\n px-1\n rounded-full\n text-[10px]\n font-bold\n leading-none\n ${badgeColors.bg}\n ${badgeColors.text}\n pointer-events-none\n `.trim().replace(/\\s+/g, ' ')}\n aria-label={`${badgeCount} notificaciones`}\n >\n {badgeCount > 99 ? '99+' : badgeCount}\n </span>\n );\n }\n\n // Si solo hay badge (sin número), renderizar dot\n return (\n <span\n className={`\n absolute\n -top-1\n -right-1\n w-2\n h-2\n rounded-full\n ${badgeColors.bg}\n pointer-events-none\n `.trim().replace(/\\s+/g, ' ')}\n aria-label=\"Notificación\"\n />\n );\n };\n\n return (\n <button\n type={htmlType}\n className={`${buttonClasses} ${(badge || badgeCount !== undefined) ? 'relative' : ''}`}\n disabled={disabled}\n onClick={onClick}\n aria-label={ariaLabel}\n {...rest}\n >\n {renderContent()}\n {renderBadge()}\n </button>\n );\n};\n","import React, { forwardRef, cloneElement } from 'react';\nimport type { InputProps } from './Input.types';\n\n/**\n * Input - Componente de campo de entrada del sistema de diseño Siesa\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Focus rings adaptativos para light y dark mode\n * - Tokens de color consistentes con la documentación\n * - Sombra base para inputs con focus\n * - Estados hover, focus, disabled y error completos\n * - Typography: Paragraph Regular para texto, Label Bold para labels\n *\n * Campo de entrada de texto con soporte para:\n * - Estados: default, hover, focus, filled, disabled\n * - Validación con mensajes de error\n * - Iconos izquierdo y derecho\n * - Label y helper text\n * - Dark mode completo\n * - Accesibilidad completa\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/shadows.md - Sistema de sombras\n * @see docs/typography.md - Sistema tipográfico (Paragraph, Label)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Input\n * label=\"Email\"\n * placeholder=\"tu@email.com\"\n * leftIcon={<EnvelopeIcon />}\n * helperText=\"Ingresa tu correo electrónico\"\n * />\n * ```\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n labelSecondary,\n helperText,\n error = false,\n errorMessage,\n leftIcon,\n rightIcon,\n fullWidth = false,\n className = '',\n disabled = false,\n id,\n ...props\n },\n ref\n ) => {\n // Generar ID único si no se proporciona\n const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;\n\n // ===== CLASES BASE DEL INPUT =====\n // Usando el sistema tipográfico Paragraph Regular (14px = text-sm)\n // Border radius rounded-md (6px) consistente con Button\n const baseInputClasses = `\n w-full\n px-3\n py-1.5\n text-sm\n leading-6\n font-normal\n text-content-primary\n bg-bg-primary\n border\n border-border-primary\n rounded-md\n outline-none\n transition-all\n duration-150\n placeholder:text-content-tertiary\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n dark:text-dark-content-primary\n dark:placeholder:text-dark-content-tertiary\n `;\n\n // ===== CLASES PARA ESTADOS INTERACTIVOS =====\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n // Focus rings adaptativos siguiendo el patrón de Button\n const interactiveClasses = !disabled\n ? `\n hover:border-primary-custom-600\n focus:border-primary-custom-600\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:hover:border-dark-border-custom\n dark:focus:border-dark-border-custom\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n `\n : `\n opacity-50\n cursor-not-allowed\n bg-bg-secondary\n dark:bg-dark-bg-secondary\n `;\n\n // ===== CLASES PARA ESTADO DE ERROR =====\n // Los colores de error son los mismos en light y dark mode\n const errorClasses = error\n ? `\n !border-error-border\n focus:!ring-error-border/30\n focus:!ring-offset-2\n dark:!border-error-border\n dark:focus:!ring-error-border/30\n dark:focus:!ring-offset-dark-bg-primary\n `\n : '';\n\n // ===== CLASES DEL CONTENEDOR =====\n const containerClasses = fullWidth ? 'w-full' : 'w-[265px]';\n\n // ===== RENDERIZAR ICONOS =====\n // Clonar iconos con estilos apropiados y dark mode completo\n const renderIcon = (icon: React.ReactElement | undefined) => {\n if (!icon) return null;\n const existingClassName = (icon.props as any).className || '';\n return cloneElement(icon as React.ReactElement<any>, {\n className: `w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary ${existingClassName}`,\n });\n };\n\n return (\n <div className={`flex flex-col gap-2 ${containerClasses} ${className}`}>\n {/* Label */}\n {label && (\n <label\n htmlFor={inputId}\n className=\"flex items-center w-full font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n <span className=\"flex-1\">{label}</span>\n {labelSecondary && (\n <span className=\"text-xs leading-4 text-primary-custom-600 dark:text-primary-custom-600\">\n {labelSecondary}\n </span>\n )}\n </label>\n )}\n\n {/* Input Container */}\n <div className=\"relative flex items-center\">\n {/* Left Icon */}\n {leftIcon && (\n <div className=\"absolute left-3 pointer-events-none\">\n {renderIcon(leftIcon)}\n </div>\n )}\n\n {/* Input Field */}\n <input\n ref={ref}\n id={inputId}\n disabled={disabled}\n className={`\n ${baseInputClasses}\n ${interactiveClasses}\n ${errorClasses}\n ${leftIcon ? 'pl-9' : ''}\n ${rightIcon ? 'pr-9' : ''}\n `.trim().replace(/\\s+/g, ' ')}\n {...props}\n />\n\n {/* Right Icon */}\n {rightIcon && (\n <div className=\"absolute right-3 pointer-events-none\">\n {renderIcon(rightIcon)}\n </div>\n )}\n </div>\n\n {/* Helper Text or Error Message */}\n {(helperText || errorMessage) && (\n <p\n className={`\n text-xs\n leading-5\n ${\n error\n ? 'text-error-content dark:text-error-content'\n : 'text-content-tertiary dark:text-dark-content-tertiary'\n }\n `.trim().replace(/\\s+/g, ' ')}\n >\n {error && errorMessage ? errorMessage : helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n","import { forwardRef } from 'react';\nimport type { TextareaProps } from './Textarea.types';\n\n/**\n * Textarea - Componente de área de texto del sistema de diseño Siesa\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Focus rings adaptativos para light y dark mode\n * - Tokens de color consistentes con la documentación\n * - Estados hover, focus, disabled y error completos\n * - Typography: Paragraph Base (16px) para texto\n *\n * Campo de entrada de texto multi-línea con soporte para:\n * - Estados: default, hover, focus, filled, disabled\n * - Validación con mensajes de error\n * - Label, description y helper text\n * - Resize vertical, horizontal, both o none\n * - Dark mode completo\n * - Accesibilidad completa\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/shadows.md - Sistema de sombras\n * @see docs/typography.md - Sistema tipográfico (Paragraph, Label)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Textarea\n * label=\"About\"\n * description=\"Tell us about yourself\"\n * placeholder=\"Write a few sentences...\"\n * helperText=\"Minimum 50 characters\"\n * />\n * ```\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n label,\n description,\n helperText,\n error = false,\n errorMessage,\n fullWidth = false,\n resize = 'vertical',\n className = '',\n disabled = false,\n id,\n rows = 4,\n ...props\n },\n ref\n ) => {\n // Generar ID único si no se proporciona\n const textareaId = id || `textarea-${Math.random().toString(36).substr(2, 9)}`;\n\n // ===== CLASES BASE DEL TEXTAREA =====\n // Usando el sistema tipográfico Paragraph Base (16px = text-base)\n // Border radius rounded-lg (8px) según especificaciones de Figma\n // Padding: px-3 (12px) izquierda, pr-1.5 (6px) derecha para el indicador de resize\n const baseTextareaClasses = `\n w-full\n px-3\n pr-1.5\n py-1.5\n text-base\n leading-6\n font-normal\n bg-bg-primary\n border\n border-border-primary\n rounded-lg\n outline-none\n transition-all\n duration-150\n placeholder:text-content-tertiary\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n dark:text-dark-content-primary\n dark:placeholder:text-dark-content-tertiary\n `;\n\n // ===== CLASES PARA ESTADOS INTERACTIVOS =====\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n // Hover: borde más opaco (zinc-400) según especificaciones de Figma\n // Focus: solo border-2 sin ring, según especificaciones de Figma\n const interactiveClasses = !disabled\n ? `\n hover:border-zinc-400\n focus:border-2\n focus:border-primary-custom-600\n dark:hover:border-zinc-500\n dark:focus:border-2\n dark:focus:border-dark-border-custom\n `\n : `\n opacity-50\n cursor-not-allowed\n bg-bg-secondary\n dark:bg-dark-bg-secondary\n `;\n\n // ===== CLASES PARA ESTADO DE ERROR =====\n // Los colores de error son los mismos en light y dark mode\n // Focus en error: solo border-2 sin ring, según especificaciones de Figma\n const errorClasses = error\n ? `\n !border-error-border\n focus:!border-2\n focus:!border-error-border\n dark:!border-error-border\n dark:focus:!border-2\n dark:focus:!border-error-border\n `\n : '';\n\n // ===== CLASES DE RESIZE =====\n const resizeClasses =\n resize === 'none'\n ? 'resize-none'\n : resize === 'vertical'\n ? 'resize-y'\n : resize === 'horizontal'\n ? 'resize-x'\n : 'resize';\n\n // ===== CLASES DEL CONTENEDOR =====\n // Ancho por defecto: 312px (según especificaciones de Figma)\n const containerClasses = fullWidth ? 'w-full' : 'w-[312px]';\n\n return (\n <div className={`flex flex-col gap-2 ${containerClasses} ${className}`}>\n {/* Label and Description */}\n {(label || description) && (\n <div className=\"flex flex-col gap-1 w-full\">\n {label && (\n <label\n htmlFor={textareaId}\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n {label}\n </label>\n )}\n {description && (\n <p className=\"text-sm leading-5 text-content-secondary dark:text-dark-content-secondary\">\n {description}\n </p>\n )}\n </div>\n )}\n\n {/* Textarea Field */}\n <textarea\n ref={ref}\n id={textareaId}\n disabled={disabled}\n rows={rows}\n className={`\n ${baseTextareaClasses}\n ${interactiveClasses}\n ${errorClasses}\n ${resizeClasses}\n `.trim().replace(/\\s+/g, ' ')}\n {...props}\n />\n\n {/* Helper Text or Error Message */}\n {(helperText || errorMessage) && (\n <p\n className={`\n text-sm\n leading-5\n text-content-tertiary\n dark:text-dark-content-tertiary\n `.trim().replace(/\\s+/g, ' ')}\n >\n {error && errorMessage ? errorMessage : helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n","import { forwardRef, useEffect, useRef } from 'react';\nimport type { CheckboxProps } from './Checkbox.types';\n\n/**\n * Checkbox del sistema de diseño Siesa\n *\n * Componente de checkbox con soporte completo para estados interactivos,\n * indeterminate, y dark mode pixel-perfect según especificaciones de Figma.\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Sombra button-inset para estado checked\n * - Type safety con TypeScript estricto\n * - Accesibilidad con input nativo y ARIA\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label/Paragraph)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Checkbox\n * label=\"Show on Events Page\"\n * description=\"Make this event visible on your profile\"\n * checked={true}\n * onChange={(e) => console.log(e.target.checked)}\n * />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n label,\n description,\n checked = false,\n indeterminate = false,\n disabled = false,\n className = '',\n id,\n onChange,\n ...props\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = (ref as any) || inputRef;\n\n // Generar ID único si no se proporciona\n const checkboxId = id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\n\n // Manejar el estado indeterminate\n useEffect(() => {\n if (combinedRef.current) {\n combinedRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate, combinedRef]);\n\n // ===== CLASES BASE DEL CHECKBOX =====\n const baseCheckboxClasses = `\n w-4\n h-4\n rounded\n border\n border-border-primary\n bg-bg-primary\n transition-all\n duration-150\n flex\n items-center\n justify-center\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n `;\n\n // ===== CLASES PARA ESTADOS INTERACTIVOS =====\n const interactiveClasses = !disabled\n ? (checked || indeterminate)\n ? `\n peer-hover:border-[#50a5f7]\n peer-focus:ring-2\n peer-focus:ring-primary-custom-400/20\n peer-focus:border-primary-custom-600\n dark:peer-hover:border-[#50a5f7]\n dark:peer-focus:border-dark-border-custom\n dark:peer-focus:ring-dark-border-custom/20\n `\n : `\n peer-hover:border-[#b6b6b9]\n peer-focus:ring-2\n peer-focus:ring-primary-custom-400/20\n peer-focus:border-primary-custom-600\n dark:peer-hover:border-[#b6b6b9]\n dark:peer-focus:border-dark-border-custom\n dark:peer-focus:ring-dark-border-custom/20\n `\n : `\n opacity-50\n cursor-not-allowed\n `;\n\n // ===== CLASES PARA ESTADO CHECKED/INDETERMINATE =====\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n const checkedClasses = checked || indeterminate\n ? `\n !bg-primary-custom-600\n !border-primary-custom-500\n shadow-button-inset\n dark:!bg-dark-bg-inverse\n dark:!border-dark-bg-inverse\n `\n : '';\n\n // ===== COMBINAR TODAS LAS CLASES DEL CHECKBOX =====\n const checkboxClasses = [\n baseCheckboxClasses,\n interactiveClasses,\n checkedClasses,\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div className={`inline-flex gap-3 items-start ${className}`}>\n {/* Checkbox Input Container */}\n <div className=\"flex items-center justify-center h-5 w-4 shrink-0\">\n {/* Native Input (hidden but accessible) */}\n <input\n ref={combinedRef}\n type=\"checkbox\"\n id={checkboxId}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n className=\"peer sr-only\"\n {...props}\n />\n\n {/* Custom Checkbox Visual */}\n <label htmlFor={checkboxId} className={checkboxClasses}>\n {/* Check Icon - Usar primary-inverse-content para consistencia */}\n {checked && !indeterminate && (\n <svg\n className=\"w-3 h-3 text-primary-inverse-content pointer-events-none\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {/* Indeterminate Icon (minus) - Usar primary-inverse-content */}\n {indeterminate && (\n <svg\n className=\"w-3 h-3 text-primary-inverse-content pointer-events-none\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 6H10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </label>\n </div>\n\n {/* Label and Description */}\n {(label || description) && (\n <label\n htmlFor={checkboxId}\n className={`flex-1 flex flex-col gap-1 text-sm leading-5 ${\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\n }`}\n >\n {/* Label - Label/Small (14px, Bold) */}\n {label && (\n <span className=\"font-bold text-content-primary dark:text-dark-content-primary\">\n {label}\n </span>\n )}\n {/* Description - Paragraph/Small (14px, Regular) */}\n {description && (\n <span className=\"font-normal text-content-secondary dark:text-content-secondary\">\n {description}\n </span>\n )}\n </label>\n )}\n </div>\n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef } from 'react';\nimport type { RadioProps } from './Radio.types';\n\n/**\n * Radio - Componente de radio button del sistema de diseño Siesa\n *\n * Campo de selección única diseñado para cumplir con las especificaciones\n * de Figma con soporte completo para dark mode y accesibilidad.\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con keyboard navigation y ARIA\n * - Inner shadow en estado checked según especificaciones Figma\n *\n * Estados soportados:\n * - Default, Hover, Focus, Disabled\n * - Checked / Unchecked\n * - Label y description opcionales\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Radio simple\n * <Radio\n * label=\"Allow tickets to be resold\"\n * description=\"Customers can resell or transfer their tickets\"\n * value=\"resell\"\n * name=\"ticketOptions\"\n * checked={true}\n * onChange={(e) => console.log(e.target.checked)}\n * />\n *\n * // Radio group\n * <div>\n * <Radio label=\"Option 1\" name=\"group\" value=\"1\" checked={selected === \"1\"} onChange={handleChange} />\n * <Radio label=\"Option 2\" name=\"group\" value=\"2\" checked={selected === \"2\"} onChange={handleChange} />\n * </div>\n * ```\n */\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n description,\n checked = false,\n disabled = false,\n className = '',\n id,\n onChange,\n value,\n name,\n ...props\n },\n ref\n ) => {\n // Generar ID único si no se proporciona\n const radioId = id || `radio-${Math.random().toString(36).substr(2, 9)}`;\n\n // ===== CLASES BASE DEL RADIO BUTTON =====\n const baseRadioClasses = `\n w-4\n h-4\n rounded-full\n border\n border-border-primary\n bg-bg-primary\n transition-all\n duration-150\n flex\n items-center\n justify-center\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n `;\n\n // ===== CLASES PARA ESTADOS INTERACTIVOS =====\n const interactiveClasses = !disabled\n ? `\n peer-hover:border-primary-custom-600\n peer-focus:ring-2\n peer-focus:ring-primary-custom-400\n peer-focus:border-primary-custom-600\n dark:peer-hover:border-dark-border-custom\n dark:peer-focus:ring-dark-border-custom\n dark:peer-focus:border-dark-border-custom\n `\n : `\n opacity-50\n cursor-not-allowed\n `;\n\n // ===== CLASES PARA CHECKED STATE =====\n // Según Figma: bg #0e79fd, border #3c9bf6, inner shadow\n const checkedClasses = checked\n ? `\n !bg-primary-custom-600\n !border-primary-inverse-border\n shadow-inner\n dark:!bg-dark-bg-inverse\n dark:!border-dark-bg-inverse\n `\n : '';\n\n return (\n <div className={`flex gap-3 items-start ${className}`}>\n {/* Radio Input Container */}\n <div className=\"flex items-center justify-center h-5 w-4 shrink-0\">\n {/* Native Input (hidden but accessible) */}\n <input\n ref={ref}\n type=\"radio\"\n id={radioId}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n value={value}\n name={name}\n className=\"peer sr-only\"\n {...props}\n />\n\n {/* Custom Radio Visual */}\n <label\n htmlFor={radioId}\n className={`\n ${baseRadioClasses}\n ${interactiveClasses}\n ${checkedClasses}\n ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}\n `.trim().replace(/\\s+/g, ' ')}\n >\n {/* Inner Circle (checked state) - 6px white dot según Figma */}\n {checked && (\n <div className=\"w-1.5 h-1.5 bg-white rounded-full dark:bg-dark-content-inverse\" />\n )}\n </label>\n </div>\n\n {/* Label and Description */}\n {(label || description) && (\n <label\n htmlFor={radioId}\n className={`flex-1 flex flex-col gap-1 text-sm leading-5 ${\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\n }`}\n >\n {label && (\n <span className=\"font-bold text-content-primary dark:text-dark-content-primary\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"font-normal text-content-secondary dark:text-content-secondary\">\n {description}\n </span>\n )}\n </label>\n )}\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n","import { forwardRef } from 'react';\nimport type { SwitchProps } from './Switch.types';\n\n/**\n * Switch - Componente de switch del sistema de diseño Siesa\n *\n * Campo de activación/desactivación con soporte para:\n * - Estados: default, hover, focus, disabled\n * - On, off\n * - Label y description opcionales\n * - Posición del label: leading (izquierda) o trailing (derecha)\n * - Animación suave de transición\n * - Dark mode completo\n * - Accesibilidad completa\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Focus ring con shadow especial según Figma\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Label a la izquierda (default)\n * <Switch\n * label=\"Permitir inserción\"\n * description=\"Permite que otros inserten los detalles de tu evento.\"\n * checked={true}\n * onChange={(e) => console.log(e.target.checked)}\n * />\n *\n * // Label a la derecha\n * <Switch\n * label=\"Activar notificaciones\"\n * labelPosition=\"trailing\"\n * checked={false}\n * onChange={(e) => console.log(e.target.checked)}\n * />\n * ```\n */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(\n (\n {\n label,\n description,\n labelPosition = 'leading',\n checked = false,\n disabled = false,\n className = '',\n id,\n onChange,\n ariaLabel,\n ...props\n },\n ref\n ) => {\n // Generar ID único si no se proporciona\n const switchId = id || `switch-${Math.random().toString(36).substr(2, 9)}`;\n\n // ===== CLASES BASE DEL TRACK =====\n const baseTrackClasses = `\n w-8\n h-5\n rounded-xl\n border\n overflow-hidden\n relative\n transition-all\n duration-200\n `;\n\n // ===== CLASES DE ESTADO DEL TRACK =====\n const getTrackStateClasses = () => {\n if (disabled) {\n return checked\n ? `\n bg-primary-custom-600\n border-primary-inverse-border\n opacity-50\n cursor-not-allowed\n dark:bg-primary-custom-600\n dark:border-primary-inverse-border\n `\n : `\n bg-[#fafafa]\n border-border-primary\n opacity-50\n cursor-not-allowed\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n `;\n }\n\n return checked\n ? `\n bg-primary-custom-600\n border-primary-inverse-border\n cursor-pointer\n peer-hover:border-[#307cc5]\n peer-focus:shadow-lg\n dark:bg-primary-custom-600\n dark:border-primary-inverse-border\n dark:peer-hover:border-[#307cc5]\n dark:peer-focus:shadow-lg\n `\n : `\n bg-[#fafafa]\n border-border-primary\n cursor-pointer\n peer-hover:border-[#b6b6b9]\n peer-focus:shadow-lg\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n dark:peer-hover:border-[#b6b6b9]\n dark:peer-focus:shadow-lg\n `;\n };\n\n // ===== CLASES DEL BOTÓN (CÍRCULO) =====\n const getButtonClasses = () => {\n const baseButtonClasses = `\n absolute\n w-4\n h-4\n bg-white\n rounded-[10px]\n border\n top-1/2\n -translate-y-1/2\n transition-all\n duration-200\n `;\n\n // Posición: OFF = left-px (1px), ON = left-[13px]\n const positionClass = checked ? 'left-[13px]' : 'left-px';\n\n if (disabled) {\n const borderClass = checked\n ? 'border-primary-inverse-border dark:border-primary-inverse-border'\n : 'border-border-primary dark:border-dark-border-primary';\n return `${baseButtonClasses} ${positionClass} ${borderClass}`;\n }\n\n const borderClass = checked\n ? `\n border-primary-inverse-border\n peer-hover:border-[#307cc5]\n dark:border-primary-inverse-border\n dark:peer-hover:border-[#307cc5]\n `\n : `\n border-border-primary\n peer-hover:border-[#b6b6b9]\n dark:border-dark-border-primary\n dark:peer-hover:border-[#b6b6b9]\n `;\n\n return `${baseButtonClasses} ${positionClass} ${borderClass}`;\n };\n\n // ===== COMBINAR CLASES =====\n const trackClasses = [\n baseTrackClasses,\n getTrackStateClasses(),\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n const buttonClasses = getButtonClasses()\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== COMPONENTES REUTILIZABLES =====\n const LabelContent = (label || description) ? (\n <label\n htmlFor={switchId}\n className={`flex-1 flex flex-col gap-1 text-sm leading-5 ${\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\n }`}\n >\n {label && (\n <span className=\"font-bold text-content-primary dark:text-dark-content-primary\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"font-normal text-content-secondary dark:text-content-secondary\">\n {description}\n </span>\n )}\n </label>\n ) : null;\n\n const SwitchInput = (\n <div className=\"flex items-center justify-center shrink-0\">\n {/* Native Input (hidden but accessible) */}\n <input\n ref={ref}\n type=\"checkbox\"\n id={switchId}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n className=\"peer sr-only\"\n aria-label={ariaLabel || label}\n {...props}\n />\n\n {/* Custom Switch Visual */}\n <label\n htmlFor={switchId}\n className={trackClasses}\n aria-hidden=\"true\"\n >\n {/* Button (sliding circle) */}\n <div className={buttonClasses} />\n </label>\n </div>\n );\n\n return (\n <div className={`flex gap-2 items-center w-[344px] ${className}`}>\n {labelPosition === 'leading' ? (\n <>\n {LabelContent}\n {SwitchInput}\n </>\n ) : (\n <>\n {SwitchInput}\n {LabelContent}\n </>\n )}\n </div>\n );\n }\n);\n\nSwitch.displayName = 'Switch';\n","import { forwardRef } from 'react';\nimport type { AvatarProps } from './Avatar.types';\n\n/**\n * Avatar - Componente de avatar del sistema de diseño Siesa\n *\n * Componente para mostrar imágenes de usuario o iniciales con soporte para:\n * - Tamaños: 4 (20px), 6 (24px), 8 (32px), 10 (40px)\n * - Tipos: circular (completamente redondo) y rounded (esquinas redondeadas)\n * - Imagen o iniciales\n * - Dark mode completo\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Tipografía adaptativa según tamaño\n * - Type safety con TypeScript estricto\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Con imagen\n * <Avatar\n * src=\"/path/to/image.jpg\"\n * alt=\"John Doe\"\n * size=\"10\"\n * type=\"circular\"\n * />\n *\n * // Con iniciales\n * <Avatar\n * initials=\"JD\"\n * size=\"10\"\n * type=\"circular\"\n * />\n * ```\n */\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n size = '10',\n type = 'circular',\n src,\n alt = '',\n initials,\n className = '',\n ...props\n },\n ref\n ) => {\n // ===== CLASES DE TAMAÑO =====\n // Tamaño del contenedor del avatar\n const containerSizeClasses = {\n '4': 'w-5 h-5',\n '6': 'w-6 h-6',\n '8': 'w-8 h-8',\n '10': 'w-10 h-10',\n };\n\n // ===== CLASES DE TEXTO =====\n // Tamaño de texto para iniciales (basado en sistema tipográfico)\n const textSizeClasses = {\n '4': 'text-xs', // 12px - Paragraph Tiny\n '6': 'text-xs', // 12px - Paragraph Tiny\n '8': 'text-sm', // 14px - Paragraph Small\n '10': 'text-base', // 16px - Paragraph Base\n };\n\n // ===== CLASES DE TIPO (Forma) =====\n const typeClasses = {\n circular: 'rounded-full',\n rounded: 'rounded-md',\n };\n\n // ===== CLASES BASE =====\n const baseClasses = `\n relative\n inline-flex\n items-center\n justify-center\n overflow-hidden\n ${containerSizeClasses[size]}\n ${typeClasses[type]}\n `;\n\n // Si hay imagen, mostrarla\n if (src) {\n return (\n <div\n ref={ref}\n className={`${baseClasses} ${className}`.trim().replace(/\\s+/g, ' ')}\n >\n <img\n src={src}\n alt={alt}\n className=\"w-full h-full object-cover\"\n {...(props as any)}\n />\n </div>\n );\n }\n\n // Si hay iniciales, mostrarlas\n if (initials) {\n return (\n <div\n ref={ref}\n className={`\n ${baseClasses}\n ${textSizeClasses[size]}\n bg-content-primary\n text-white\n font-normal\n dark:bg-dark-bg-inverse\n dark:text-dark-content-inverse\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n >\n <span className=\"leading-none\">{initials}</span>\n </div>\n );\n }\n\n // Fallback: avatar vacío\n return (\n <div\n ref={ref}\n className={`\n ${baseClasses}\n bg-background-secondary\n dark:bg-dark-bg-primary\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n />\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n","import { forwardRef } from 'react';\nimport type { DividerProps } from './Divider.types';\n\n/**\n * Divider del sistema de diseño Siesa\n *\n * Línea horizontal de 1px para separar contenido visual o semánticamente.\n * Implementa dos variantes con soporte completo de dark mode.\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Componente semántico usando elemento <hr>\n *\n * @see docs/colors.md - Sistema de colores (border-primary, border-secondary)\n * @see docs/spacing.md - Sistema de espaciado (altura de 1px)\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4096-8445 - Especificaciones Figma\n *\n * @example\n * ```tsx\n * // Default divider (más visible)\n * <Divider />\n * <Divider type=\"default\" />\n *\n * // Soft divider (más sutil)\n * <Divider type=\"soft\" />\n *\n * // Con clases personalizadas\n * <Divider className=\"my-6\" />\n * ```\n */\nexport const Divider = forwardRef<HTMLHRElement, DividerProps>(\n (\n {\n type = 'default',\n className = '',\n ...props\n },\n ref\n ) => {\n // ===== CLASES DE TIPO =====\n // Orden de modificadores: {dark}:{utility}\n const typeClasses = {\n // Default: Línea más visible para separaciones claras\n // Light: border-primary (#e4e4e7)\n // Dark: dark-border-primary (#71717a)\n default: 'bg-border-primary dark:bg-dark-border-primary',\n\n // Soft: Línea más sutil para separaciones suaves\n // Light: border-secondary (#f4f4f5 - muy claro)\n // Dark: gray-700 (#374151 - gris medio-oscuro, más sutil que dark-border-primary)\n soft: 'bg-border-secondary dark:bg-gray-700',\n };\n\n // ===== CLASES BASE =====\n const baseClasses = 'w-full h-px border-0';\n\n // ===== COMBINAR CLASES =====\n const finalClasses = [\n baseClasses,\n typeClasses[type],\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <hr\n ref={ref}\n className={finalClasses}\n {...props}\n />\n );\n }\n);\n\nDivider.displayName = 'Divider';\n","import { forwardRef } from 'react';\nimport type { DescriptionListProps } from './DescriptionList.types';\n\n/**\n * DescriptionList del sistema de diseño Siesa\n *\n * Componente para mostrar información estructurada en formato clave-valor (term/details).\n * Layout de dos columnas con separador inferior entre items.\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Layout flexible y responsive\n * - Tipografía del sistema (Paragraph/Small - 14px)\n *\n * @see docs/colors.md - Sistema de colores (content-primary, content-secondary)\n * @see docs/typography.md - Sistema tipográfico (Paragraph/Small)\n * @see docs/spacing.md - Sistema de espaciado (padding, gaps)\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4103-8449 - Especificaciones Figma\n *\n * @example\n * ```tsx\n * // Item básico\n * <DescriptionList\n * term=\"Customer\"\n * details=\"Jhonatan Diaz\"\n * />\n *\n * // Lista completa\n * <div>\n * <DescriptionList term=\"Event\" details=\"Bear Hug: Live in Concert\" />\n * <DescriptionList term=\"Amount\" details=\"$120,000 COP\" />\n * <DescriptionList term=\"Fee\" details=\"$20,000 COP\" />\n * </div>\n * ```\n */\nexport const DescriptionList = forwardRef<HTMLDivElement, DescriptionListProps>(\n (\n {\n term,\n details,\n className = '',\n ...props\n },\n ref\n ) => {\n // ===== CLASES BASE =====\n const baseClasses = `\n flex\n flex-wrap\n gap-1\n items-start\n py-2.5\n border-b\n border-border-secondary\n dark:border-gray-700\n `;\n\n // ===== CLASES DE COLUMNA =====\n // Cada columna ocupa el 50% del espacio disponible (flex-1)\n // con un ancho mínimo de 180px para mantener legibilidad\n const columnClasses = 'flex-1 min-w-[180px]';\n\n // ===== COMBINAR CLASES =====\n const finalClasses = [baseClasses, className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div ref={ref} className={finalClasses} {...props}>\n {/* Term Column (izquierda) */}\n {/* Light: content-secondary (#a1a1aa) */}\n {/* Dark: gray-400 (#9ca3af - gris medio claro para mantener contraste) */}\n <div className={columnClasses}>\n <p className=\"text-sm leading-5 text-content-secondary dark:text-gray-400 font-normal\">\n {term}\n </p>\n </div>\n\n {/* Details Column (derecha) */}\n {/* Light: content-primary (#18181b) */}\n {/* Dark: dark-content-primary (#ffffff) */}\n <div className={columnClasses}>\n <p className=\"text-sm leading-5 text-content-primary dark:text-dark-content-primary font-normal\">\n {details}\n </p>\n </div>\n </div>\n );\n }\n);\n\nDescriptionList.displayName = 'DescriptionList';\n","import { forwardRef } from 'react';\nimport type { AlertProps } from './Alert.types';\nimport { Button } from '../Button/Button';\n\n/**\n * Alert - Componente de alerta/diálogo del sistema de diseño Siesa\n *\n * Componente modal para confirmaciones con soporte para:\n * - Título y descripción\n * - Contenido personalizado (children)\n * - Botones de acción personalizados o por defecto\n * - Dark mode\n *\n * @example\n * ```tsx\n * <Alert\n * title=\"Are you sure you want to refund this payment?\"\n * description=\"The refund will be reflected in 2 to 3 business days.\"\n * onCancel={() => console.log('Cancelled')}\n * onConfirm={() => console.log('Confirmed')}\n * confirmText=\"Refund\"\n * />\n * ```\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n title,\n description,\n children,\n actions,\n onCancel,\n onConfirm,\n cancelText = 'Cancelar',\n confirmText = 'Confirmar',\n className = '',\n ...props\n },\n ref\n ) => {\n // Si se proveen actions personalizadas, usarlas. Si no, usar botones por defecto\n const actionButtons = actions || (\n <>\n {onCancel && (\n <Button type=\"plain\" size=\"base\" onClick={onCancel}>\n {cancelText}\n </Button>\n )}\n {onConfirm && (\n <Button type=\"default\" size=\"base\" onClick={onConfirm}>\n {confirmText}\n </Button>\n )}\n </>\n );\n\n return (\n <div\n ref={ref}\n className={`\n w-[512px]\n bg-white\n dark:bg-dark-bg-primary\n border\n border-border-primary\n dark:border-dark-border-primary\n rounded-xl\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n {...props}\n >\n {/* Content Container */}\n <div className=\"p-6 flex flex-col gap-4\">\n {/* Text Section */}\n <div className=\"flex flex-col gap-3\">\n {/* Title */}\n <p className=\"text-sm leading-5 font-bold text-content-primary dark:text-dark-content-primary\">\n {title}\n </p>\n\n {/* Description (optional) */}\n {description && (\n <p className=\"text-sm leading-5 font-normal text-content-tertiary dark:text-content-tertiary\">\n {description}\n </p>\n )}\n </div>\n\n {/* Body Content (optional) */}\n {children && (\n <div className=\"flex flex-col gap-3\">\n {children}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-3 items-center justify-end\">\n {actionButtons}\n </div>\n </div>\n </div>\n );\n }\n);\n\nAlert.displayName = 'Alert';\n","import { forwardRef, cloneElement } from 'react';\nimport type { BadgeProps, BadgeColor } from './Badge.types';\n\n/**\n * Badge del sistema de diseño Siesa\n *\n * Componente para mostrar etiquetas con múltiples variantes de color.\n * Los badges mantienen sus colores vibrantes en light y dark mode para\n * garantizar visibilidad y consistencia visual.\n *\n * Características implementadas:\n * - 21 variantes de color (zinc, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose, primary, secondary, tertiary)\n * - Icono opcional a la izquierda (12x12px)\n * - Contador/notification badge opcional\n * - Estados hover con transiciones suaves\n * - Los colores se mantienen vibrantes en dark mode (según diseño Figma)\n * - Tipografía: Label Tiny (12px Bold)\n *\n * Mejores prácticas implementadas:\n * - Tokens de color de Tailwind estándar para badges\n * - Font-family explícita (SiesaBT via font-sans)\n * - Transiciones suaves (duration-200)\n * - Estructura clara y mantenible\n *\n * @see docs/typography.md - Sistema tipográfico (Label Tiny)\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4130-9382\n *\n * @example\n * ```tsx\n * // Badge simple\n * <Badge color=\"blue\" label=\"Label\" />\n *\n * // Badge con icono\n * <Badge color=\"green\" label=\"Success\" leftIcon={<CheckIcon />} />\n *\n * // Badge con contador\n * <Badge color=\"red\" label=\"Errors\" count={5} />\n *\n * // Badge completo\n * <Badge color=\"primary\" label=\"Messages\" leftIcon={<MailIcon />} count={12} />\n * ```\n */\nexport const Badge = forwardRef<HTMLDivElement, BadgeProps>(\n (\n {\n color = 'zinc',\n leftIcon,\n label,\n count,\n className = '',\n ...props\n },\n ref\n ) => {\n // Map de colores - En dark mode mantienen los mismos colores vibrantes según Figma\n const colorClasses: Record<BadgeColor, { bg: string; text: string; hover: string; notificationBg: string; notificationText: string }> = {\n zinc: {\n bg: 'bg-zinc-100',\n text: 'text-zinc-600',\n hover: 'hover:bg-zinc-200',\n notificationBg: 'bg-zinc-600',\n notificationText: 'text-zinc-100',\n },\n red: {\n bg: 'bg-red-100',\n text: 'text-red-700',\n hover: 'hover:bg-red-200',\n notificationBg: 'bg-red-700',\n notificationText: 'text-red-100',\n },\n orange: {\n bg: 'bg-orange-100',\n text: 'text-orange-700',\n hover: 'hover:bg-orange-200',\n notificationBg: 'bg-orange-700',\n notificationText: 'text-orange-100',\n },\n amber: {\n bg: 'bg-amber-100',\n text: 'text-amber-700',\n hover: 'hover:bg-amber-200',\n notificationBg: 'bg-amber-700',\n notificationText: 'text-amber-100',\n },\n yellow: {\n bg: 'bg-yellow-100',\n text: 'text-yellow-700',\n hover: 'hover:bg-yellow-200',\n notificationBg: 'bg-yellow-700',\n notificationText: 'text-yellow-100',\n },\n lime: {\n bg: 'bg-lime-100',\n text: 'text-lime-700',\n hover: 'hover:bg-lime-200',\n notificationBg: 'bg-lime-700',\n notificationText: 'text-lime-100',\n },\n green: {\n bg: 'bg-green-100',\n text: 'text-green-700',\n hover: 'hover:bg-green-200',\n notificationBg: 'bg-green-700',\n notificationText: 'text-green-100',\n },\n emerald: {\n bg: 'bg-emerald-100',\n text: 'text-emerald-700',\n hover: 'hover:bg-emerald-200',\n notificationBg: 'bg-emerald-700',\n notificationText: 'text-emerald-100',\n },\n teal: {\n bg: 'bg-teal-100',\n text: 'text-teal-700',\n hover: 'hover:bg-teal-200',\n notificationBg: 'bg-teal-700',\n notificationText: 'text-teal-100',\n },\n cyan: {\n bg: 'bg-cyan-100',\n text: 'text-cyan-700',\n hover: 'hover:bg-cyan-200',\n notificationBg: 'bg-cyan-700',\n notificationText: 'text-cyan-100',\n },\n sky: {\n bg: 'bg-sky-100',\n text: 'text-sky-700',\n hover: 'hover:bg-sky-200',\n notificationBg: 'bg-sky-700',\n notificationText: 'text-sky-100',\n },\n blue: {\n bg: 'bg-blue-100',\n text: 'text-blue-700',\n hover: 'hover:bg-blue-200',\n notificationBg: 'bg-blue-700',\n notificationText: 'text-blue-100',\n },\n indigo: {\n bg: 'bg-indigo-100',\n text: 'text-indigo-700',\n hover: 'hover:bg-indigo-200',\n notificationBg: 'bg-indigo-700',\n notificationText: 'text-indigo-100',\n },\n violet: {\n bg: 'bg-violet-100',\n text: 'text-violet-700',\n hover: 'hover:bg-violet-200',\n notificationBg: 'bg-violet-700',\n notificationText: 'text-violet-100',\n },\n purple: {\n bg: 'bg-purple-100',\n text: 'text-purple-700',\n hover: 'hover:bg-purple-200',\n notificationBg: 'bg-purple-700',\n notificationText: 'text-purple-100',\n },\n fuchsia: {\n bg: 'bg-fuchsia-100',\n text: 'text-fuchsia-700',\n hover: 'hover:bg-fuchsia-200',\n notificationBg: 'bg-fuchsia-700',\n notificationText: 'text-fuchsia-100',\n },\n pink: {\n bg: 'bg-pink-100',\n text: 'text-pink-700',\n hover: 'hover:bg-pink-200',\n notificationBg: 'bg-pink-700',\n notificationText: 'text-pink-100',\n },\n rose: {\n bg: 'bg-rose-100',\n text: 'text-rose-700',\n hover: 'hover:bg-rose-200',\n notificationBg: 'bg-rose-700',\n notificationText: 'text-rose-100',\n },\n primary: {\n bg: 'bg-primary-custom-100',\n text: 'text-primary-custom-600',\n hover: 'hover:bg-primary-custom-200',\n notificationBg: 'bg-primary-custom-600',\n notificationText: 'text-primary-custom-100',\n },\n secondary: {\n bg: 'bg-zinc-100',\n text: 'text-zinc-600',\n hover: 'hover:bg-zinc-200',\n notificationBg: 'bg-zinc-600',\n notificationText: 'text-zinc-100',\n },\n tertiary: {\n bg: 'bg-zinc-100',\n text: 'text-zinc-600',\n hover: 'hover:bg-zinc-200',\n notificationBg: 'bg-zinc-600',\n notificationText: 'text-zinc-100',\n },\n };\n\n const colors = colorClasses[color];\n\n // Renderizar icono con tamaño correcto (12x12)\n const renderIcon = (icon: React.ReactElement) => {\n const existingClassName = (icon.props as any).className || '';\n return cloneElement(icon as React.ReactElement<any>, {\n className: `w-3 h-3 ${existingClassName}`.trim(),\n });\n };\n\n // ===== COMBINAR CLASES =====\n const finalClasses = [\n 'inline-flex',\n 'items-center',\n 'gap-1',\n 'px-1.5',\n 'py-1',\n 'rounded-md',\n 'font-sans',\n colors.bg,\n colors.hover,\n 'transition-colors',\n 'duration-200',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div\n ref={ref}\n className={finalClasses}\n {...props}\n >\n {/* Icono izquierdo */}\n {leftIcon && (\n <div className={`flex items-center justify-center ${colors.text}`}>\n {renderIcon(leftIcon)}\n </div>\n )}\n\n {/* Label del badge */}\n <span className={`font-sans text-xs leading-4 ${colors.text}`}>\n {label}\n </span>\n\n {/* Notification badge (contador) */}\n {count !== undefined && (\n <div\n className={`\n h-3\n flex\n items-center\n justify-center\n px-0.5\n rounded-sm\n min-w-[12px]\n ${colors.notificationBg}\n `.trim().replace(/\\s+/g, ' ')}\n >\n <span className={`font-sans text-xs leading-4 ${colors.notificationText}`}>\n {count}\n </span>\n </div>\n )}\n </div>\n );\n }\n);\n\nBadge.displayName = 'Badge';\n","import { forwardRef, useState, useEffect } from 'react';\nimport type { QuantityProps } from './Quantity.types';\n\n/**\n * Quantity - Componente de cantidad del sistema de diseño Siesa\n *\n * Componente para seleccionar cantidades con soporte para:\n * - Botones de incremento/decremento\n * - Valores mínimo y máximo\n * - Label opcional con link\n * - Texto de ayuda opcional\n * - Estado de error\n * - Estado deshabilitado\n * - Dark mode completo\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Focus rings adaptativos para light y dark mode\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Quantity\n * label=\"Cantidad\"\n * value={5}\n * min={0}\n * max={10}\n * onChange={(value) => console.log(value)}\n * />\n * ```\n */\nexport const Quantity = forwardRef<HTMLDivElement, QuantityProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n onChange,\n min = 0,\n max,\n label,\n linkText,\n onLinkClick,\n helperText,\n error = false,\n disabled = false,\n className = '',\n ...props\n },\n ref\n ) => {\n // Estado interno para valor no controlado\n const [internalValue, setInternalValue] = useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n\n // Sincronizar valor interno con defaultValue cuando cambia\n useEffect(() => {\n if (!isControlled) {\n setInternalValue(defaultValue);\n }\n }, [defaultValue, isControlled]);\n\n // Handler para cambio de valor\n const handleValueChange = (newValue: number) => {\n // Aplicar restricciones de min/max\n let clampedValue = newValue;\n if (min !== undefined && clampedValue < min) {\n clampedValue = min;\n }\n if (max !== undefined && clampedValue > max) {\n clampedValue = max;\n }\n\n // Actualizar estado interno si no está controlado\n if (!isControlled) {\n setInternalValue(clampedValue);\n }\n\n // Llamar onChange si existe\n onChange?.(clampedValue);\n };\n\n // Handlers para botones\n const handleDecrement = () => {\n if (disabled) return;\n handleValueChange(currentValue - 1);\n };\n\n const handleIncrement = () => {\n if (disabled) return;\n handleValueChange(currentValue + 1);\n };\n\n // Verificar si los botones deben estar deshabilitados\n const isDecrementDisabled = disabled || (min !== undefined && currentValue <= min);\n const isIncrementDisabled = disabled || (max !== undefined && currentValue >= max);\n\n // Iconos SVG inline\n const MinusIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n const PlusIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // Clases para el estado (usando especificaciones exactas de Figma)\n const borderClass = error\n ? 'border-error-border dark:border-error-border'\n : 'border-border-primary dark:border-dark-border-primary';\n\n const hoverClass = !disabled && !error\n ? 'hover:border-[#f9f9f9] dark:hover:border-[#f9f9f9]'\n : '';\n\n const focusClass = !disabled && !error\n ? 'focus-within:border-2 focus-within:border-[#329cff] dark:focus-within:border-[#329cff]'\n : '';\n\n return (\n <div\n ref={ref}\n className={`flex flex-col gap-2 ${className}`.trim()}\n {...props}\n >\n {/* Label con link opcional */}\n {label && (\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm leading-5 font-bold text-content-primary dark:text-dark-content-primary\">\n {label}\n </label>\n {linkText && (\n <button\n type=\"button\"\n onClick={onLinkClick}\n disabled={disabled}\n className={`\n text-xs leading-4\n text-primary-custom-600\n hover:underline\n dark:text-primary-custom-600\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\n transition-colors\n duration-200\n `.trim().replace(/\\s+/g, ' ')}\n >\n {linkText}\n </button>\n )}\n </div>\n )}\n\n {/* Input con botones */}\n <div\n className={`\n flex\n items-center\n gap-2\n px-3\n py-1.5\n bg-white\n dark:bg-dark-bg-primary\n border\n ${borderClass}\n ${hoverClass}\n ${focusClass}\n rounded-lg\n transition-colors\n duration-200\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `.trim().replace(/\\s+/g, ' ')}\n >\n {/* Botón decrementar */}\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={isDecrementDisabled}\n className={`\n flex\n items-center\n justify-center\n w-4\n h-4\n ${isDecrementDisabled\n ? 'text-content-tertiary dark:text-content-tertiary cursor-not-allowed'\n : 'text-content-primary dark:text-dark-content-primary hover:text-content-secondary dark:hover:text-content-secondary cursor-pointer'\n }\n transition-colors\n duration-200\n `.trim().replace(/\\s+/g, ' ')}\n aria-label=\"Decrementar\"\n >\n <MinusIcon />\n </button>\n\n {/* Valor actual */}\n <div className=\"flex-1 text-center\">\n <span\n className={`\n text-base leading-6\n ${currentValue === 0\n ? 'text-content-tertiary dark:text-content-tertiary'\n : 'text-content-primary dark:text-dark-content-primary'\n }\n `.trim().replace(/\\s+/g, ' ')}\n >\n {currentValue}\n </span>\n </div>\n\n {/* Botón incrementar */}\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={isIncrementDisabled}\n className={`\n flex\n items-center\n justify-center\n w-4\n h-4\n ${isIncrementDisabled\n ? 'text-content-tertiary dark:text-content-tertiary cursor-not-allowed'\n : 'text-content-primary dark:text-dark-content-primary hover:text-content-secondary dark:hover:text-content-secondary cursor-pointer'\n }\n transition-colors\n duration-200\n `.trim().replace(/\\s+/g, ' ')}\n aria-label=\"Incrementar\"\n >\n <PlusIcon />\n </button>\n </div>\n\n {/* Helper text */}\n {helperText && (\n <p\n className={`\n text-sm leading-5\n ${error\n ? 'text-error-content dark:text-error-content'\n : 'text-content-tertiary dark:text-content-tertiary'\n }\n `.trim().replace(/\\s+/g, ' ')}\n >\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nQuantity.displayName = 'Quantity';\n","import React from 'react';\nimport type { NavigationRailItemProps } from './NavigationRailItem.types';\n\n/**\n * NavigationRailItem - Componente independiente para items de NavigationRail\n *\n * Item individual de navegación vertical (rail) para aplicaciones. Proporciona\n * un punto de acceso a destinos mediante un icono, label opcional y badges.\n *\n * **Características principales:**\n * - Ancho fijo de 56px según Figma\n * - Estados completos: normal, hover, selected, focus, disabled\n * - Badges de notificación con contador opcional\n * - Tipografía Label XXSmall (10px Bold) según sistema de diseño\n * - Dark mode completo con estrategia 'class'\n * - Focus rings adaptativos para accesibilidad\n * - Soporte para iconos 16x16px\n *\n * **Especificaciones de Figma (node 4294-22931):**\n * - Ancho: 56px (w-14)\n * - Icon container: 32px altura, px-4 py-1, rounded-full\n * - Label: 10px Bold, leading 12px (Label XXSmall)\n * - Gap: 4px (gap-1)\n * - Badge: 13x13px, posición absolute\n *\n * **Estados visuales (según Figma):**\n * - **Enabled**: Icon transparent, label text-content-primary\n * - **Hover**: Icon container bg-primary-custom-100 (#dbeefe), icon text-primary-custom-600\n * - **Selected**: Icon container bg-primary-custom-100 con overlay, icon text-primary-custom-600\n * - **Focus**: Focus ring 2px (#60b6fa) con offset 2px (#dbeefe), sombras combinadas\n * - **Disabled**: Opacity 55%, no interactivo\n *\n * **Dark Mode:**\n * - Background: dark-bg-primary\n * - Hover icon container: dark-bg-primary/20\n * - Selected icon container: dark-primary-custom-600/30\n * - Icon colors: dark-content-primary, dark-white on selected\n * - Focus ring: dark-border-custom\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Tokens de color consistentes con documentación\n * - Accesibilidad ARIA completa\n * - Focus visible para keyboard navigation\n * - Badge positioning absoluto para no afectar layout\n *\n * @see docs/colors.md - Sistema de colores (primary-custom, dark-*, content-*)\n * @see docs/typography.md - Tipografía (Label XXSmall)\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras y focus rings\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4294-22931\n *\n * @example\n * ```tsx\n * // Item básico\n * <NavigationRailItem\n * id=\"home\"\n * icon={<HomeIcon />}\n * label=\"Inicio\"\n * selected={true}\n * onClick={() => navigate('/')}\n * />\n *\n * // Con badge de notificación\n * <NavigationRailItem\n * id=\"notifications\"\n * icon={<BellIcon />}\n * label=\"Notificaciones\"\n * badgeCount={5}\n * onClick={() => navigate('/notifications')}\n * />\n *\n * // Item deshabilitado\n * <NavigationRailItem\n * id=\"premium\"\n * icon={<StarIcon />}\n * label=\"Premium\"\n * disabled={true}\n * />\n *\n * // Solo icono (sin label)\n * <NavigationRailItem\n * id=\"home\"\n * icon={<HomeIcon />}\n * label=\"Inicio\"\n * showLabelText={false}\n * />\n * ```\n */\nexport const NavigationRailItem: React.FC<NavigationRailItemProps> = ({\n icon,\n label,\n selected = false,\n disabled = false,\n badge = false,\n badgeCount,\n onClick,\n onMouseEnter,\n ariaLabel,\n id,\n showLabelText = true,\n showIcon = true,\n className = '',\n}) => {\n // ===== CLASES DEL ICON CONTAINER =====\n // Según Figma node 4294-22931, el icon container tiene comportamiento diferente\n // según el estado:\n // - Enabled: bg-transparent, hover:bg-primary-custom-100\n // - Hover: bg-primary-custom-100\n // - Selected: bg-primary-custom-100 con overlay (rgba(0,0,0,0.024))\n // - Focus: bg-primary-custom-100 con focus ring y sombras\n // - Disabled: opacidad 55%\n const iconContainerClasses = [\n // Base layout\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'px-4', // 16px horizontal según Figma\n 'py-1', // 4px vertical según Figma\n 'rounded-full',\n 'overflow-hidden',\n 'shrink-0',\n\n // Estados - Background\n selected\n ? // Selected: bg-primary-custom-100 con overlay\n 'bg-primary-custom-100 dark:bg-primary-custom-600/30'\n : // Default/Hover: transparent → hover:bg-primary-custom-100\n 'bg-transparent hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20',\n\n // Transiciones\n 'transition-colors',\n 'duration-150',\n ].join(' ');\n\n // ===== CLASES DEL ICONO =====\n // Tamaño fijo 16x16px según Figma\n // Colores según estado:\n // - Default: text-content-primary\n // - Hover: text-primary-custom-600\n // - Selected: text-primary-custom-600\n // - Disabled: text-content-tertiary\n // Dark mode: invierte colores\n const iconClasses = [\n 'w-4', // 16px\n 'h-4', // 16px\n 'shrink-0',\n\n // Colores según estado\n selected\n ? // Selected: primary-custom-600 (azul oscuro)\n 'text-primary-custom-600 dark:text-white'\n : disabled\n ? // Disabled: content-tertiary\n 'text-content-tertiary dark:text-content-tertiary'\n : // Default/Hover: content-primary → hover:primary-custom-600\n 'text-content-primary hover:text-primary-custom-600 dark:text-dark-content-primary dark:hover:text-white',\n\n 'transition-colors',\n 'duration-150',\n ].join(' ');\n\n // ===== CLASES DEL LABEL =====\n // Tipografía: Label XXSmall (10px Bold, leading 12px) según Figma\n // Color: text-content-primary, dark:text-dark-content-primary\n const labelClasses = [\n // Tipografía: Label XXSmall (10px Bold)\n 'text-xs', // 12px en lugar de text-[10px]\n 'leading-3', // 12px\n 'font-bold',\n 'text-center',\n 'w-full',\n 'min-w-full',\n\n // Colores\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n\n // Para multiline labels, agregar truncate o text-nowrap si es necesario\n 'break-words',\n ].join(' ');\n\n // ===== CLASES DEL CONTENEDOR PRINCIPAL =====\n // Según Figma: ancho 56px, flex-col, gap-1, items-center\n const containerClasses = [\n 'relative',\n 'flex',\n 'flex-col',\n 'items-center',\n 'gap-1', // 4px según Figma\n 'px-0.5', // 2px horizontal según Figma\n 'py-0',\n 'w-14', // 56px según Figma\n 'shrink-0',\n\n // Interactividad\n disabled\n ? 'cursor-not-allowed opacity-55 pointer-events-none'\n : 'cursor-pointer',\n\n // Focus visible (accesibilidad)\n 'focus:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-primary-custom-400', // 4px ring\n 'focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-primary-custom-100', // offset #dbeefe según Figma\n 'dark:focus-visible:ring-dark-border-custom',\n 'dark:focus-visible:ring-offset-dark-bg-primary',\n\n // Focus sombras adicionales según Figma:\n 'focus-visible:shadow-lg',\n 'dark:focus-visible:shadow-2xl',\n\n 'rounded-lg',\n\n // Clases personalizadas\n className,\n ].join(' ');\n\n // ===== RENDERIZAR BADGE =====\n const renderBadge = () => {\n if (!badge && badgeCount === undefined) return null;\n\n // Badge con número\n if (badgeCount !== undefined) {\n return (\n <span\n className=\"\n absolute\n -top-0.5\n left-8\n flex\n items-center\n justify-center\n min-w-3\n h-3\n px-1\n rounded-full\n text-xs\n font-bold\n leading-none\n bg-red-700\n text-white\n dark:bg-red-700\n dark:text-white\n pointer-events-none\n select-none\n \"\n aria-label={`${badgeCount} notificaciones`}\n data-badge\n >\n {badgeCount > 99 ? '99+' : badgeCount}\n </span>\n );\n }\n\n // Badge dot simple\n return (\n <span\n className=\"\n absolute\n -top-0.5\n left-8\n w-3\n h-3\n rounded-full\n bg-red-700\n dark:bg-red-700\n pointer-events-none\n select-none\n \"\n aria-label=\"Notificación\"\n data-badge\n />\n );\n };\n\n return (\n <button\n type=\"button\"\n className={containerClasses}\n disabled={disabled}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n aria-label={ariaLabel || label}\n aria-current={selected ? 'page' : undefined}\n aria-disabled={disabled}\n data-item-id={id}\n data-testid={`navigation-rail-item-${id}`}\n >\n {/* Icon Container */}\n {showIcon && (\n <div className={iconContainerClasses}>\n <span className={iconClasses}>\n {icon}\n </span>\n </div>\n )}\n\n {/* Label */}\n {showLabelText && (\n <p className={labelClasses}>\n {label}\n </p>\n )}\n\n {/* Badge */}\n {renderBadge()}\n </button>\n );\n};\n\nNavigationRailItem.displayName = 'NavigationRailItem';\n","/**\n * Iconos para el componente Dropdown\n * Usando heroicons-micro según especificaciones de Figma\n */\n\nexport const ChevronDownIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const CogIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.455 1.45A.5.5 0 0 1 6.952 1h2.096a.5.5 0 0 1 .497.45l.186 1.858a4.996 4.996 0 0 1 1.466.848l1.703-.769a.5.5 0 0 1 .639.206l1.047 1.814a.5.5 0 0 1-.14.656l-1.517 1.09a5.026 5.026 0 0 1 0 1.694l1.516 1.09a.5.5 0 0 1 .141.656l-1.047 1.814a.5.5 0 0 1-.639.206l-1.703-.768c-.433.36-.928.649-1.466.847l-.186 1.858a.5.5 0 0 1-.497.45H6.952a.5.5 0 0 1-.497-.45l-.186-1.858a4.993 4.993 0 0 1-1.466-.848l-1.703.769a.5.5 0 0 1-.639-.206l-1.047-1.814a.5.5 0 0 1 .14-.656l1.517-1.09a5.033 5.033 0 0 1 0-1.694l-1.516-1.09a.5.5 0 0 1-.141-.656L2.461 3.39a.5.5 0 0 1 .639-.206l1.703.768c.433-.36.928-.649 1.466-.847l.186-1.858ZM8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const UserIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path d=\"M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM12.735 14c.618 0 1.093-.561.872-1.139a6.002 6.002 0 0 0-11.215 0c-.22.578.254 1.139.872 1.139h9.47Z\" />\n </svg>\n);\n\nexport const BellIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12 5a4 4 0 0 0-8 0v2.379a1.5 1.5 0 0 1-.44 1.06L2.294 9.707a1 1 0 0 0-.293.707V11a1 1 0 0 0 1 1h2a3 3 0 1 0 6 0h2a1 1 0 0 0 1-1v-.586a1 1 0 0 0-.293-.707L12.44 8.44A1.5 1.5 0 0 1 12 7.38V5Zm-5.5 7a1.5 1.5 0 0 0 3 0h-3Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const CreditCardIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n","import React, { useState, useRef, useEffect } from 'react';\nimport type {\n DropdownProps,\n DropdownItemProps,\n DropdownHeadingProps,\n DropdownDividerProps,\n} from './Dropdown.types';\nimport { ChevronDownIcon } from './icons';\n\n/**\n * Componente Dropdown del sistema de diseño Siesa\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y keyboard navigation\n * - Cierre automático al hacer click fuera\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <Dropdown\n * placeholder=\"Options\"\n * items={[\n * { children: 'Account', icon: <UserIcon /> },\n * { children: 'Settings', icon: <CogIcon /> },\n * { isDivider: true },\n * { children: 'Logout' },\n * ]}\n * />\n * ```\n */\nexport const Dropdown: React.FC<DropdownProps> = ({\n variant = 'default',\n children,\n items,\n open: controlledOpen,\n onOpenChange,\n disabled = false,\n className = '',\n menuClassName = '',\n ariaLabel,\n placeholder = 'Options',\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Determinar si es controlado o no controlado\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n // Función para cambiar el estado\n const handleToggle = () => {\n if (disabled) return;\n\n const newOpen = !isOpen;\n\n if (!isControlled) {\n setInternalOpen(newOpen);\n }\n\n onOpenChange?.(newOpen);\n };\n\n // Cerrar al hacer click fuera\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n if (!isControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n // Cerrar al presionar Escape\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n if (!isControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => {\n document.removeEventListener('keydown', handleEscape);\n };\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n // Handler para item click\n const handleItemClick = (item: DropdownItemProps) => {\n if (item.disabled || item.isDivider || item.isHeading) return;\n\n // Ejecutar el onClick del item\n if (item.onClick) {\n item.onClick({} as React.MouseEvent<HTMLButtonElement>);\n }\n\n // Cerrar el dropdown\n if (!isControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n\n // ===== CLASES DEL TRIGGER BUTTON =====\n const triggerClasses = [\n // Base\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-lg',\n 'font-bold',\n 'text-sm',\n 'whitespace-nowrap',\n 'transition-all',\n 'duration-150',\n\n // Variant-specific sizing\n variant === 'icon-only' ? 'w-9 h-9' : 'gap-3 px-3 py-2',\n\n // Colores y estados (Light Mode)\n 'bg-bg-primary',\n 'text-content-secondary',\n 'border',\n 'border-border-primary',\n 'hover:bg-background-secondary',\n 'active:scale-95',\n\n // Dark Mode\n 'dark:bg-dark-bg-primary',\n 'dark:text-content-secondary',\n 'dark:border-dark-border-primary',\n 'dark:hover:bg-dark-bg-primary',\n\n // Focus ring\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'focus:ring-offset-2',\n 'dark:focus:ring-dark-border-custom',\n 'dark:focus:ring-offset-dark-bg-primary',\n\n // Disabled\n disabled && 'opacity-50',\n disabled && 'cursor-not-allowed',\n disabled && 'pointer-events-none',\n\n // Custom classes\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL MENU =====\n const menuClasses = [\n // Base\n 'absolute',\n 'top-full',\n 'left-0',\n 'mt-2',\n 'min-w-[182px]',\n 'rounded-xl',\n 'p-1',\n 'border',\n 'z-50',\n\n // Colores (Light Mode)\n 'bg-background-secondary',\n 'border-border-primary',\n\n // Dark Mode\n 'dark:bg-dark-bg-primary',\n 'dark:border-dark-border-primary',\n\n // Shadow\n 'shadow-menu',\n\n // Custom classes\n menuClassName,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div ref={dropdownRef} className=\"relative inline-block\">\n {/* Trigger Button */}\n <button\n type=\"button\"\n className={triggerClasses}\n onClick={handleToggle}\n disabled={disabled}\n aria-label={ariaLabel || (variant === 'icon-only' ? 'Abrir menú' : undefined)}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n {variant === 'default' && <span>{children || placeholder}</span>}\n <ChevronDownIcon />\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div className={menuClasses}>\n {items.map((item, index) => {\n if (item.isDivider) {\n return <DropdownDivider key={index} className={item.className} />;\n }\n\n if (item.isHeading) {\n return (\n <DropdownHeading key={index} className={item.className}>\n {item.children}\n </DropdownHeading>\n );\n }\n\n return (\n <DropdownItem\n key={index}\n {...item}\n onClick={() => handleItemClick(item)}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Componente DropdownItem\n * Item individual dentro del menú dropdown\n *\n * @example\n * ```tsx\n * <DropdownItem icon={<UserIcon />} shortcut=\"⌘ P\">\n * Profile\n * </DropdownItem>\n * ```\n */\nexport const DropdownItem: React.FC<DropdownItemProps> = ({\n children,\n icon,\n description,\n shortcut,\n disabled = false,\n selected = false,\n onClick,\n className = '',\n}) => {\n // ===== CLASES DEL ITEM =====\n const itemClasses = [\n // Base\n 'flex',\n 'items-center',\n 'gap-3',\n 'px-4',\n 'py-2',\n 'rounded-lg',\n 'text-sm',\n 'w-full',\n 'text-left',\n 'transition-colors',\n 'duration-150',\n\n // Colores y estados (Light Mode)\n 'text-content-primary',\n !disabled && 'hover:bg-white',\n selected && 'bg-white',\n\n // Dark Mode\n 'dark:text-dark-content-primary',\n !disabled && 'dark:hover:bg-dark-bg-primary',\n selected && 'dark:bg-dark-bg-primary',\n\n // Disabled\n disabled && 'opacity-50',\n disabled && 'cursor-not-allowed',\n !disabled && 'cursor-pointer',\n\n // Custom classes\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n type=\"button\"\n className={itemClasses}\n onClick={onClick}\n disabled={disabled}\n >\n {/* Icon */}\n {icon && (\n <span className=\"inline-flex items-center justify-center w-4 h-4 text-content-secondary dark:text-content-secondary\">\n {icon}\n </span>\n )}\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {/* Label */}\n <div className=\"text-content-primary dark:text-dark-content-primary\">\n {children}\n </div>\n\n {/* Description */}\n {description && (\n <div className=\"text-xs text-content-secondary dark:text-content-secondary mt-0.5\">\n {description}\n </div>\n )}\n </div>\n\n {/* Shortcut */}\n {shortcut && (\n <span className=\"text-xs text-content-secondary dark:text-content-secondary ml-auto whitespace-nowrap\">\n {shortcut}\n </span>\n )}\n </button>\n );\n};\n\n/**\n * Componente DropdownHeading\n * Encabezado de sección dentro del menú dropdown\n *\n * @example\n * ```tsx\n * <DropdownHeading>My events</DropdownHeading>\n * ```\n */\nexport const DropdownHeading: React.FC<DropdownHeadingProps> = ({\n children,\n className = '',\n}) => {\n // ===== CLASES DEL HEADING =====\n const headingClasses = [\n // Base\n 'px-4',\n 'py-1',\n 'text-xs',\n 'font-normal',\n\n // Colores\n 'text-content-tertiary',\n\n // Dark Mode\n 'dark:text-content-tertiary',\n\n // Custom classes\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return <div className={headingClasses}>{children}</div>;\n};\n\n/**\n * Componente DropdownDivider\n * Separador visual entre items del menú dropdown\n *\n * @example\n * ```tsx\n * <DropdownDivider />\n * ```\n */\nexport const DropdownDivider: React.FC<DropdownDividerProps> = ({\n className = '',\n}) => {\n // ===== CLASES DEL DIVIDER =====\n const dividerClasses = [\n // Base\n 'px-4',\n 'py-1',\n\n // Custom classes\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div className={dividerClasses}>\n <div className=\"h-px bg-border-primary dark:bg-dark-border-primary\" />\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Icono ChevronDown para el toggle del colapsable\n * Diseño basado en heroicons-micro/chevron-down\n * Tamaño: 16x16px\n *\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374\n */\nexport const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * Icono de usuario placeholder para ejemplos en stories\n * Tamaño: 16x16px\n */\nexport const UserIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M8 8C9.10457 8 10 7.10457 10 6C10 4.89543 9.10457 4 8 4C6.89543 4 6 4.89543 6 6C6 7.10457 6.89543 8 8 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 13C4.5 11.3431 6.13401 10 8 10C9.86599 10 11.5 11.3431 11.5 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n","import React, { useState } from 'react';\nimport type {\n DropdownItemCollapsibleProps,\n DropdownItemCollapsibleChildProps,\n} from './DropdownItemCollapsible.types';\nimport { ChevronDownIcon } from './icons';\nimport { Badge } from '../Badge/Badge';\n\n/**\n * Componente DropdownItemCollapsible del sistema de diseño Siesa\n *\n * Item colapsable para uso dentro de Dropdowns que permite agrupar\n * items relacionados en secciones expandibles.\n *\n * **Características:**\n * - Soporte completo para expandir/colapsar\n * - Iconos personalizables en header y children\n * - Items anidados indentados automáticamente\n * - Dark mode completo con inversión de colores\n * - Estados: default, hover, active, disabled\n * - Focus rings adaptativos\n * - Animación suave de rotación del chevron\n *\n * **Estados visuales:**\n * - `collapsed`: Muestra solo el header con chevron apuntando down\n * - `expanded`: Muestra header y lista de items anidados\n * - `disabled`: Opacidad 50%, sin interacción\n * - `hover`: Fondo de hover sutil, color primario del icono\n * - `active`: Item anidado seleccionado con fondo custom-primary\n *\n * **Espaciado según Figma:**\n * - Header padding: px-4 py-2 (16px horizontal, 8px vertical)\n * - Item anidado padding: pl-6 pr-4 py-2 (24px left, 16px right, 8px vertical)\n * - Gap entre elementos: gap-3 (12px)\n * - Gap interno (icon + text): gap-3 (12px)\n * - Indent entre niveles: 8px adicional por nivel\n * - Divisor: borde top de 1px con spacing-0.5 (2px) arriba\n * - Sección heading: pt-3 pb-1 px-0 (12px top, 4px bottom, sin horizontal)\n *\n * **Tipografía:**\n * - Header: Paragraph/Small (14px, Regular, line-height 20px) - text-content-primary\n * - Items anidados: Paragraph/Small (14px, Regular, line-height 20px) - text-content-primary\n * - Heading: Paragraph/Tiny (12px, Regular, line-height 16px) - text-content-tertiary\n *\n * **Colores (Light Mode):**\n * - Header text: content-primary (#18181b)\n * - Header icon: content-secondary (#a1a1aa)\n * - Header hover: bg-background-custom-primary (#dbeefe)\n * - Header text hover: content-custom-primary (#0e79fd)\n * - Item text: content-primary (#18181b)\n * - Item hover: bg-transparent (sin fondo)\n * - Divider: border-border-primary (#e4e4e7)\n * - Heading text: content-tertiary (#71717a)\n *\n * **Colores (Dark Mode):**\n * - Header text: content-primary/dark (#fafafa)\n * - Header icon: content-secondary/dark (#a1a1aa)\n * - Header hover: bg-background-custom-primary/dark (#0e5ab0)\n * - Header text hover: content-custom-primary/dark (#bfe2fe)\n * - Item text: content-primary/dark (#fafafa)\n * - Divider: border-border-primary/dark (#3f3f46)\n * - Heading text: content-tertiary/dark (#a1a1aa)\n *\n * **Border radius:**\n * - Todos los items: rounded-lg (8px)\n *\n * **Sombras:**\n * - Ninguna (usado dentro de dropdowns)\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374\n *\n * @example\n * ```tsx\n * // Item colapsable simple\n * <DropdownItemCollapsible\n * label=\"Users\"\n * icon={<UserIcon />}\n * children={[\n * { label: \"Active Users\", icon: <CheckIcon /> },\n * { label: \"Inactive Users\", icon: <CloseIcon /> },\n * ]}\n * />\n *\n * // Con encabezado de sección\n * <DropdownItemCollapsible\n * label=\"Customers\"\n * icon={<BuildingIcon />}\n * showHeading={true}\n * headingLabel=\"SECTION 1\"\n * children={[...]}\n * />\n *\n * // Item no colapsable (actúa como botón normal)\n * <DropdownItemCollapsible\n * label=\"Single Item\"\n * icon={<StarIcon />}\n * isCollapsible={false}\n * onClick={() => console.log('clicked')}\n * />\n * ```\n */\nexport const DropdownItemCollapsible: React.FC<DropdownItemCollapsibleProps> = ({\n label,\n icon,\n children = [],\n defaultOpen = false,\n disabled = false,\n onOpenChange,\n onClick,\n isCollapsible = children.length > 0,\n showHeading = false,\n headingLabel,\n showDivider = true,\n selected = false,\n badge = false,\n badgeCount,\n badgeColor = 'red',\n className = '',\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const handleToggle = () => {\n if (disabled || !isCollapsible) return;\n\n const newOpen = !isOpen;\n setIsOpen(newOpen);\n onOpenChange?.(newOpen);\n };\n\n const handleHeaderClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n\n if (isCollapsible) {\n handleToggle();\n } else {\n onClick?.(e);\n }\n };\n\n const handleChildClick = (child: DropdownItemCollapsibleChildProps) => (\n e: React.MouseEvent<HTMLDivElement>,\n ) => {\n if (child.disabled) return;\n child.onClick?.(e);\n };\n\n return (\n <div className={`flex flex-col gap-0.5 w-full ${className}`}>\n {/* Section Heading */}\n {showHeading && headingLabel && (\n <div className=\"flex flex-col gap-0 items-start pb-1 pt-3 px-0 w-full\">\n <p className=\"font-['Inter:Regular',sans-serif] font-normal leading-4 not-italic text-xs text-content-tertiary dark:text-content-tertiary w-full\">\n {headingLabel}\n </p>\n </div>\n )}\n\n {/* Header Button */}\n <button\n onClick={handleHeaderClick}\n disabled={disabled}\n className={[\n // Base\n 'flex items-center gap-3 px-4 py-2 w-full',\n 'rounded-lg cursor-pointer',\n 'transition-all duration-150',\n\n // Colores y estados (Light Mode)\n selected && !disabled && 'bg-primary-custom-100 text-primary-custom-600',\n !selected && !disabled && 'text-content-primary',\n !disabled && 'hover:bg-primary-custom-100',\n !disabled && 'hover:text-primary-custom-600',\n\n // Dark Mode\n selected && !disabled && 'dark:bg-dark-bg-custom dark:text-dark-content-custom',\n !selected && !disabled && 'dark:text-content-primary',\n !disabled && 'dark:hover:bg-dark-bg-custom',\n !disabled && 'dark:hover:text-dark-content-custom',\n\n // Focus ring\n !disabled && 'focus:outline-none',\n !disabled && 'focus:ring-2',\n !disabled && 'focus:ring-offset-2',\n !disabled && 'focus:ring-primary-custom-400',\n !disabled && 'focus:ring-offset-bg-primary',\n !disabled && 'dark:focus:ring-offset-dark-bg-primary',\n\n // Disabled\n disabled && 'opacity-50',\n disabled && 'cursor-not-allowed',\n ]\n .filter(Boolean)\n .join(' ')}\n aria-expanded={isOpen && isCollapsible}\n aria-disabled={disabled}\n >\n {/* Icon Wrapper */}\n {icon && (\n <div className=\"flex items-center justify-center w-4 h-4 shrink-0 text-content-secondary dark:text-content-secondary\">\n {icon}\n </div>\n )}\n\n {/* Content Wrapper */}\n <div className=\"flex flex-1 flex-col items-start justify-center gap-0.5\">\n <p className=\"font-['Inter:Regular',sans-serif] font-normal leading-5 not-italic text-sm text-left\">\n {label}\n </p>\n </div>\n\n {/* Badge */}\n {(badge || badgeCount) && (\n <div className=\"flex items-center justify-center shrink-0\">\n {badgeCount ? (\n <div className=\"flex items-center justify-center px-1.5 py-0.5 rounded-full bg-red-500 dark:bg-red-600 text-white text-xs font-bold min-w-6 h-6\">\n {badgeCount > 99 ? '99+' : badgeCount}\n </div>\n ) : (\n <div className=\"w-2 h-2 rounded-full bg-red-500 dark:bg-red-600 shrink-0\" />\n )}\n </div>\n )}\n\n {/* Chevron (solo visible si es colapsable) */}\n {isCollapsible && (\n <div\n className={[\n 'flex items-center justify-center w-4 h-4 shrink-0',\n 'text-content-secondary dark:text-content-secondary',\n 'transition-transform duration-200',\n isOpen ? 'rotate-180' : 'rotate-0',\n ].join(' ')}\n >\n <ChevronDownIcon className=\"w-4 h-4\" />\n </div>\n )}\n </button>\n\n {/* Divider */}\n {showDivider && <div className=\"w-full h-px bg-border-primary dark:bg-dark-border-primary\" />}\n\n {/* Children Container (expanded) */}\n {isOpen && isCollapsible && children.length > 0 && (\n <div className=\"flex flex-col gap-0.5 w-full py-2 px-0\">\n {children.map((child, index) => (\n <div\n key={index}\n onClick={handleChildClick(child)}\n className={[\n // Base\n 'flex gap-3 items-center pl-6 pr-4 py-2 w-full',\n 'rounded-lg cursor-pointer',\n 'transition-all duration-150',\n\n // Colores y estados (Light Mode)\n !child.disabled && 'text-content-primary',\n !child.disabled && 'hover:bg-primary-custom-100',\n !child.disabled && 'hover:text-primary-custom-600',\n\n // Dark Mode\n !child.disabled && 'dark:text-content-primary',\n !child.disabled && 'dark:hover:bg-dark-bg-custom',\n !child.disabled && 'dark:hover:text-dark-content-custom',\n\n // Focus ring\n !child.disabled && 'focus:outline-none',\n !child.disabled && 'focus:ring-2',\n !child.disabled && 'focus:ring-offset-2',\n !child.disabled && 'focus:ring-primary-custom-400',\n !child.disabled && 'focus:ring-offset-bg-primary',\n !child.disabled && 'dark:focus:ring-offset-dark-bg-primary',\n\n // Disabled\n child.disabled && 'opacity-50',\n child.disabled && 'cursor-not-allowed',\n\n // Custom classes\n child.className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Child Icon Wrapper */}\n {child.icon && (\n <div className=\"flex items-center justify-center w-4 h-4 shrink-0 text-content-secondary dark:text-content-secondary\">\n {child.icon}\n </div>\n )}\n\n {/* Child Content Wrapper */}\n <div className=\"flex flex-1 flex-col items-start justify-center gap-0.5\">\n <p className=\"font-['Inter:Regular',sans-serif] font-normal leading-5 not-italic text-sm text-left\">\n {child.label}\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default DropdownItemCollapsible;\n","/**\n * Iconos para el componente DropdownItemHeading\n * Usando heroicons-micro según especificaciones de Figma\n * \n * Los iconos se pueden pasar como strings al componente:\n * - 'cog-6-tooth': Icono de engranaje\n * - 'check': Icono de check\n * - 'x': Icono de cerrar\n * - 'chevron-down': Icono de chevron hacia abajo\n * \n * @see DropdownItemHeading.tsx para ver cómo se usan\n */\n\nimport React from 'react';\n\ninterface IconProps {\n className?: string;\n}\n\n/**\n * Icono Cog (heroicons-micro/cog-6-tooth)\n * Usado como icono por defecto en DropdownItemHeading\n * Tamaño: 16x16px\n */\nexport const CogIcon = ({ className = 'w-4 h-4' }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.455 1.45A.5.5 0 0 1 6.952 1h2.096a.5.5 0 0 1 .497.45l.186 1.858a4.996 4.996 0 0 1 1.466.848l1.703-.769a.5.5 0 0 1 .639.206l1.047 1.814a.5.5 0 0 1-.14.656l-1.517 1.09a5.026 5.026 0 0 1 0 1.694l1.516 1.09a.5.5 0 0 1 .141.656l-1.047 1.814a.5.5 0 0 1-.639.206l-1.703-.768c-.433.36-.928.649-1.466.847l-.186 1.858a.5.5 0 0 1-.497.45H6.952a.5.5 0 0 1-.497-.45l-.186-1.858a4.993 4.993 0 0 1-1.466-.848l-1.703.769a.5.5 0 0 1-.639-.206l-1.047-1.814a.5.5 0 0 1 .14-.656l1.517-1.09a5.033 5.033 0 0 1 0-1.694l-1.516-1.09a.5.5 0 0 1-.141-.656L2.461 3.39a.5.5 0 0 1 .639-.206l1.703.768c.433-.36.928-.649 1.466-.847l.186-1.858ZM8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono Check (heroicons-micro/check)\n */\nexport const CheckIcon = ({ className = 'w-4 h-4' }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 1 1-1.06-1.06L12.69 4.22a.75.75 0 0 1 1.06 0Z\"\n clipRule=\"evenodd\"\n />\n <path\n fillRule=\"evenodd\"\n d=\"M2.22 9.28a.75.75 0 0 0 0 1.06l2.5 2.5a.75.75 0 1 0 1.06-1.06l-2.5-2.5a.75.75 0 0 0-1.06 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono X (heroicons-micro/x-mark)\n */\nexport const XIcon = ({ className = 'w-4 h-4' }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\" />\n </svg>\n);\n\n/**\n * Icono ChevronDown (heroicons-micro/chevron-down)\n */\nexport const ChevronDownIcon = ({ className = 'w-4 h-4' }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Mapeo de nombres de iconos a componentes\n * Permite usar strings para referenciar iconos\n */\nexport const iconMap: Record<string, React.FC<IconProps>> = {\n 'cog-6-tooth': CogIcon,\n 'check': CheckIcon,\n 'x': XIcon,\n 'chevron-down': ChevronDownIcon,\n};\n\n/**\n * Obtener un icono por su nombre\n * @param iconName - Nombre del icono (ej: 'cog-6-tooth', 'check', 'x', 'chevron-down')\n * @param className - Clases CSS adicionales\n * @returns Componente del icono o null si no existe\n */\nexport const getIcon = (\n iconName: string | null | undefined,\n className?: string\n): React.ReactNode => {\n if (!iconName) return null;\n\n const IconComponent = iconMap[iconName];\n if (!IconComponent) {\n console.warn(`Icon \"${iconName}\" not found in iconMap`);\n return null;\n }\n\n return <IconComponent className={className} />;\n};\n","import React from 'react';\nimport type { DropdownItemHeadingProps } from './DropdownItemHeading.types';\nimport { getIcon } from './icons';\n\n/**\n * Componente DropdownItemHeading del sistema de diseño Siesa\n *\n * Implementación pixel-perfect basada en Figma (node 6135:32539)\n * para encabezados en menús dropdown con icono, label, descripción y acción.\n *\n * **Estructura:**\n * - Icon Wrapper: Opcional, icono de 16x16px\n * - Content Wrapper: Label + Description (flexible)\n * - Action Wrapper: Opcional, texto de acción en la derecha\n *\n * **Dimensiones:**\n * - Altura flexible (contenido vertical)\n * - Width mínimo: 224px\n * - Padding: 8px vertical, 16px horizontal\n * - Border radius: 8px (rounded-lg)\n *\n * **Tipografía:**\n * - Label: Label/Small (14px Bold) - content-primary\n * - Description: Paragraph/Tiny (12px Regular) - content-secondary\n * - Action: Paragraph/XXSmall (10px Regular) - content-secondary\n *\n * **Dark Mode:**\n * - Label: #18181b (light) → #bfe2fe (dark)\n * - Description: #a1a1aa (light) → #93d1fd (dark)\n * - Icon: #0e79fd (light) → #bfe2fe (dark)\n * - Action: #a1a1aa (light) → #93d1fd (dark)\n *\n * **Estados:**\n * - Default: Sin hover/focus\n * - Hover: Overlay sutil (managed by parent Dropdown)\n * - Disabled: Opacity 50% (managed by parent Dropdown)\n *\n * **Especificaciones de Figma:**\n * - Gap entre elementos: 12px\n * - Gap entre label y description: 2px\n * - Rounded: 8px (rounded-lg)\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label/Small, Paragraph/Tiny)\n * @see docs/spacing.md - Sistema de espaciado\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-32539 - Diseño Figma\n *\n * @example\n * ```tsx\n * // Con icono, label, descripción y acción\n * <DropdownItemHeading\n * label=\"Settings\"\n * description=\"Configure your preferences\"\n * showDescription={true}\n * icon={<SettingsIcon />}\n * showIcon={true}\n * actionLabel=\"Clear\"\n * showAction={true}\n * onActionClick={handleClear}\n * />\n *\n * // Solo label y descripción (sin icono ni acción)\n * <DropdownItemHeading\n * label=\"My Account\"\n * description=\"user@example.com\"\n * showDescription={true}\n * />\n *\n * // Solo label\n * <DropdownItemHeading\n * label=\"Quick Actions\"\n * showDescription={false}\n * />\n * ```\n */\nexport const DropdownItemHeading: React.FC<DropdownItemHeadingProps> = ({\n label = 'Label',\n description,\n showDescription = true,\n iconName = 'cog-6-tooth',\n showIcon = true,\n actionLabel,\n showAction = false,\n onActionClick,\n className = '',\n ...rest\n}) => {\n\n return (\n <div\n className={`\n flex\n gap-3\n items-center\n px-4\n py-2\n rounded-lg\n w-56\n ${className}\n `}\n data-testid=\"dropdown-item-heading\"\n {...rest}\n >\n {/* ===== ICON WRAPPER ===== */}\n {showIcon && iconName && (\n <div\n className=\"\n flex\n items-center\n justify-center\n shrink-0\n w-4\n h-4\n \"\n data-testid=\"icon-wrapper\"\n >\n <div className=\"text-primary-custom-600 dark:text-dark-content-inverse\">\n {getIcon(iconName, 'w-4 h-4')}\n </div>\n </div>\n )}\n\n {/* ===== CONTENT WRAPPER ===== */}\n <div\n className=\"\n flex\n flex-1\n flex-col\n gap-0.5\n items-start\n justify-center\n min-w-0\n \"\n data-testid=\"content-wrapper\"\n >\n {/* Label */}\n <p\n className=\"\n font-bold\n text-sm\n leading-5\n text-content-primary\n dark:text-dark-content-inverse\n whitespace-nowrap\n overflow-hidden\n text-ellipsis\n \"\n data-testid=\"label\"\n >\n {label}\n </p>\n\n {/* Description */}\n {showDescription && description && (\n <p\n className=\"\n font-normal\n text-xs\n leading-4\n text-content-secondary\n dark:text-dark-border-inverse\n w-full\n whitespace-pre-wrap\n overflow-hidden\n text-ellipsis\n \"\n data-testid=\"description\"\n >\n {description}\n </p>\n )}\n </div>\n\n {/* ===== ACTION WRAPPER ===== */}\n {showAction && actionLabel && (\n <div\n className=\"\n flex\n items-center\n justify-center\n shrink-0\n cursor-pointer\n hover:opacity-80\n transition-opacity\n duration-150\n \"\n data-testid=\"action-wrapper\"\n onClick={onActionClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n onActionClick?.(e as any);\n }\n }}\n >\n <p\n className=\"\n font-normal\n text-xs\n leading-3\n text-content-secondary\n dark:text-dark-border-inverse\n whitespace-nowrap\n \"\n data-testid=\"action-label\"\n >\n {actionLabel}\n </p>\n </div>\n )}\n </div>\n );\n};\n\nDropdownItemHeading.displayName = 'DropdownItemHeading';\n","import React from 'react';\nimport type { NotificationProps } from './Notification.types';\n\n/**\n * Componente Notification del sistema de diseño Siesa\n *\n * Badge de notificación para indicar alertas, mensajes o notificaciones pendientes.\n * Puede mostrar un punto simple o un contador numérico con límite automático a 99+.\n *\n * **Especificaciones de Figma:**\n * - Badge con número: 27px × 13px (aprox), Label/XXSmall (10px Bold, line-height 12px)\n * - Badge simple (dot): 13px × 13px\n * - Color: `content-extensions-red` (#b91c1c) por defecto\n * - Border radius: Pill (rounded-full)\n * - Padding: 4px horizontal\n *\n * **Variantes:**\n * - Sin count: Muestra punto circular (dot)\n * - Con count: Muestra badge con número (máximo 99+)\n *\n * **Uso típico:**\n * - Como overlay en iconos o botones\n * - En elementos de menú o navegación\n * - Standalone para indicar estado\n *\n * @see docs/colors.md - Sistema de colores (token content-extensions-red)\n * @see docs/typography.md - Sistema tipográfico (Label/XXSmall)\n * @see src/components/Button/Button.tsx - Referencia de badges en botones\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4310-22651\n *\n * @example\n * ```tsx\n * // Badge simple (punto)\n * <Notification />\n *\n * // Badge con número\n * <Notification count={5} />\n *\n * // Badge con muchos (muestra 99+)\n * <Notification count={150} />\n *\n * // Con color personalizado\n * <Notification count={3} color=\"green\" />\n *\n * // Como overlay en botón\n * <button className=\"relative\">\n * <BellIcon />\n * <Notification count={5} className=\"absolute -top-1 -right-1\" />\n * </button>\n * ```\n */\nexport const Notification: React.FC<NotificationProps> = ({\n count,\n color = 'red',\n className = '',\n ariaLabel,\n}) => {\n // ===== MAPA DE COLORES =====\n // Sistema de colores consistente con Button y Badge\n const colorClasses: Record<string, { bg: string; text: string }> = {\n zinc: { bg: 'bg-zinc-600', text: 'text-white' },\n red: { bg: 'bg-content-extensions-red', text: 'text-white' },\n orange: { bg: 'bg-orange-700', text: 'text-white' },\n amber: { bg: 'bg-amber-700', text: 'text-white' },\n yellow: { bg: 'bg-yellow-700', text: 'text-white' },\n lime: { bg: 'bg-lime-700', text: 'text-white' },\n green: { bg: 'bg-green-700', text: 'text-white' },\n emerald: { bg: 'bg-emerald-700', text: 'text-white' },\n teal: { bg: 'bg-teal-700', text: 'text-white' },\n cyan: { bg: 'bg-cyan-700', text: 'text-white' },\n sky: { bg: 'bg-sky-700', text: 'text-white' },\n blue: { bg: 'bg-blue-700', text: 'text-white' },\n indigo: { bg: 'bg-indigo-700', text: 'text-white' },\n violet: { bg: 'bg-violet-700', text: 'text-white' },\n purple: { bg: 'bg-purple-700', text: 'text-white' },\n fuchsia: { bg: 'bg-fuchsia-700', text: 'text-white' },\n pink: { bg: 'bg-pink-700', text: 'text-white' },\n rose: { bg: 'bg-rose-700', text: 'text-white' },\n primary: { bg: 'bg-primary-custom-600', text: 'text-white' },\n secondary: { bg: 'bg-zinc-600', text: 'text-white' },\n tertiary: { bg: 'bg-zinc-600', text: 'text-white' },\n };\n\n const colors = colorClasses[color] || colorClasses.red;\n\n // ===== ARIA LABEL DINÁMICO =====\n const dynamicAriaLabel = ariaLabel ||\n (count !== undefined && count > 0\n ? `${count} notificaci${count === 1 ? 'ón' : 'ones'}`\n : 'Notificación pendiente');\n\n // ===== BADGE CON NÚMERO =====\n if (count !== undefined && count > 0) {\n const displayCount = count > 99 ? '99+' : count.toString();\n\n return (\n <span\n className={`\n inline-flex\n items-center\n justify-center\n min-w-[16px]\n h-4\n px-1\n rounded-full\n text-[10px]\n font-bold\n leading-none\n ${colors.bg}\n ${colors.text}\n pointer-events-none\n dark:${colors.bg}\n dark:${colors.text}\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')}\n role=\"status\"\n aria-label={dynamicAriaLabel}\n >\n {displayCount}\n </span>\n );\n }\n\n // ===== BADGE SIMPLE (DOT) =====\n return (\n <span\n className={`\n inline-block\n w-2\n h-2\n rounded-full\n ${colors.bg}\n pointer-events-none\n dark:${colors.bg}\n ${className}\n `\n .trim()\n .replace(/\\s+/g, ' ')}\n role=\"status\"\n aria-label={dynamicAriaLabel}\n />\n );\n};\n","import React from 'react';\n\n/**\n * Icono de flecha izquierda (ChevronLeft)\n * Usado en el botón \"Back\"\n * Heroicons Micro (16x16px)\n */\nexport const ArrowLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M9.78 4.22a.75.75 0 0 1 0 1.06L7.06 8l2.72 2.72a.75.75 0 1 1-1.06 1.06L5.47 8.53a.75.75 0 0 1 0-1.06l3.25-3.25a.75.75 0 0 1 1.06 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n};\n\n/**\n * Icono de flecha derecha (ChevronRight)\n * Usado en el botón \"Next\"\n * Heroicons Micro (16x16px)\n */\nexport const ArrowRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => {\n return (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.22 4.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1 0 1.06l-3.25 3.25a.75.75 0 0 1-1.06-1.06L8.94 8 6.22 5.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n};\n","import React, { useMemo } from 'react';\nimport type { PaginationProps, PageButtonProps } from './Pagination.types';\nimport { ArrowLeftIcon, ArrowRightIcon } from './icons';\n\n/**\n * Componente Pagination del sistema de diseño Siesa\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n * - Algoritmo de paginación inteligente\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label Small)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Pagination\n * currentPage={1}\n * totalPages={66}\n * onPageChange={(page) => console.log(page)}\n * />\n * ```\n */\nexport const Pagination: React.FC<PaginationProps> = ({\n currentPage = 1,\n totalPages,\n onPageChange,\n backText = 'Atrás',\n nextText = 'Siguiente',\n siblingCount = 1,\n showBackButton = true,\n showNextButton = true,\n className = '',\n ariaLabel = 'Paginación',\n}) => {\n /**\n * Genera el array de páginas a mostrar\n * Algoritmo: [1] ... [currentPage-1] [currentPage] [currentPage+1] ... [totalPages]\n */\n const paginationRange = useMemo(() => {\n const totalNumbers = siblingCount * 2 + 3; // Página actual + siblings + primera + última\n const totalBlocks = totalNumbers + 2; // + 2 separadores \"...\"\n\n // Si el total de páginas es menor que el total de bloques, mostrar todas\n if (totalPages <= totalBlocks) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftDots = leftSiblingIndex > 2;\n const shouldShowRightDots = rightSiblingIndex < totalPages - 1;\n\n const firstPageIndex = 1;\n const lastPageIndex = totalPages;\n\n // No mostrar dots a la izquierda\n if (!shouldShowLeftDots && shouldShowRightDots) {\n const leftItemCount = 3 + 2 * siblingCount;\n const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\n return [...leftRange, '...', totalPages];\n }\n\n // No mostrar dots a la derecha\n if (shouldShowLeftDots && !shouldShowRightDots) {\n const rightItemCount = 3 + 2 * siblingCount;\n const rightRange = Array.from(\n { length: rightItemCount },\n (_, i) => totalPages - rightItemCount + i + 1\n );\n return [firstPageIndex, '...', ...rightRange];\n }\n\n // Mostrar ambos dots\n if (shouldShowLeftDots && shouldShowRightDots) {\n const middleRange = Array.from(\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\n (_, i) => leftSiblingIndex + i\n );\n return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex];\n }\n\n return [];\n }, [currentPage, totalPages, siblingCount]);\n\n /**\n * Handler para cambio de página\n */\n const handlePageChange = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange?.(page);\n }\n };\n\n /**\n * Componente interno: Botón de página\n */\n const PageButton: React.FC<PageButtonProps> = ({\n page,\n isActive = false,\n disabled = false,\n onClick,\n ariaLabel: buttonAriaLabel,\n }) => {\n const isDots = page === '...';\n\n // ===== CLASES BASE =====\n const baseClasses = `\n inline-flex\n items-center\n justify-center\n gap-3\n px-3\n py-2\n rounded-md\n font-bold\n text-sm\n whitespace-nowrap\n transition-all\n duration-150\n `;\n\n // ===== CLASES DE ESTADO =====\n const stateClasses = isDots\n ? `\n text-primary-custom-600\n dark:text-primary-custom-600\n cursor-default\n pointer-events-none\n `\n : isActive\n ? `\n bg-primary-custom-100\n text-primary-custom-600\n dark:bg-primary-custom-100\n dark:text-primary-custom-600\n `\n : `\n text-primary-custom-600\n hover:bg-primary-custom-100\n active:scale-95\n dark:text-primary-custom-600\n dark:hover:bg-primary-custom-100\n dark:active:scale-95\n `;\n\n // ===== CLASES DE DISABLED =====\n const disabledClasses = disabled\n ? `\n opacity-50\n cursor-not-allowed\n pointer-events-none\n `\n : '';\n\n // ===== COMBINAR CLASES =====\n const buttonClasses = [baseClasses, stateClasses, disabledClasses]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={onClick}\n disabled={disabled || isDots}\n aria-label={buttonAriaLabel}\n aria-current={isActive ? 'page' : undefined}\n >\n {page}\n </button>\n );\n };\n\n // ===== CLASES DEL CONTAINER =====\n const containerClasses = `\n inline-flex\n items-center\n justify-between\n gap-0\n ${className}\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <nav className={containerClasses} aria-label={ariaLabel} role=\"navigation\">\n {/* ===== BOTÓN BACK ===== */}\n {showBackButton && (\n <button\n type=\"button\"\n className={`\n inline-flex\n items-center\n justify-center\n gap-3\n px-3\n py-2\n rounded-md\n font-bold\n text-sm\n text-primary-custom-600\n hover:bg-primary-custom-100\n active:scale-95\n dark:text-primary-custom-600\n dark:hover:bg-primary-custom-100\n dark:active:scale-95\n transition-all\n duration-150\n ${currentPage === 1 ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n onClick={() => handlePageChange(currentPage - 1)}\n disabled={currentPage === 1}\n aria-label={`${backText} page`}\n >\n <ArrowLeftIcon className=\"w-4 h-4\" />\n {backText}\n </button>\n )}\n\n {/* ===== NÚMEROS DE PÁGINA ===== */}\n <div className=\"inline-flex items-center\">\n {paginationRange.map((page, index) => (\n <PageButton\n key={`${page}-${index}`}\n page={page}\n isActive={page === currentPage}\n onClick={() => typeof page === 'number' && handlePageChange(page)}\n ariaLabel={\n typeof page === 'number' ? `Go to page ${page}` : `Page ${page}`\n }\n />\n ))}\n </div>\n\n {/* ===== BOTÓN NEXT ===== */}\n {showNextButton && (\n <button\n type=\"button\"\n className={`\n inline-flex\n items-center\n justify-center\n gap-3\n px-3\n py-2\n rounded-md\n font-bold\n text-sm\n text-primary-custom-600\n hover:bg-primary-custom-100\n active:scale-95\n dark:text-primary-custom-600\n dark:hover:bg-primary-custom-100\n dark:active:scale-95\n transition-all\n duration-150\n ${\n currentPage === totalPages\n ? 'opacity-50 cursor-not-allowed pointer-events-none'\n : ''\n }\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n aria-label={`${nextText} page`}\n >\n {nextText}\n <ArrowRightIcon className=\"w-4 h-4\" />\n </button>\n )}\n </nav>\n );\n};\n","import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronUpDownIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronUpDownIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ClockIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ClockIcon);\nexport default ForwardRef;","import React from 'react';\nimport {\n ChevronUpDownIcon as HeroChevronUpDown,\n CheckIcon as HeroCheck\n} from '@heroicons/react/24/outline';\n\n/**\n * Icono ChevronUpDown para el trigger del Select\n * Basado en Heroicons 24/outline (24x24px)\n *\n * @see https://heroicons.com/\n */\nexport const ChevronUpDownIcon: React.FC<{ className?: string }> = ({ className = 'size-5' }) => (\n <HeroChevronUpDown className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Check para los items seleccionados del menu\n * Basado en Heroicons 24/outline (24x24px)\n *\n * @see https://heroicons.com/\n */\nexport const CheckIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroCheck className={className} aria-hidden=\"true\" />\n);\n","import React, { useState, useRef, useEffect } from 'react';\nimport type { SelectProps, SelectOption } from './Select.types';\nimport { ChevronUpDownIcon, CheckIcon } from './icons';\n\n/**\n * Select - Componente de selección (dropdown) del sistema de diseño Siesa\n *\n * Componente Select personalizado con menú desplegable para seleccionar opciones\n * de una lista. Incluye navegación por teclado, click outside y dark mode completo.\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y keyboard navigation\n * - Click outside para cerrar el menú\n * - Soporte de teclado (Enter, Escape, Arrow Up/Down)\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Select\n * options={[\n * { value: '1', label: 'Option 1' },\n * { value: '2', label: 'Option 2' },\n * ]}\n * value={selectedValue}\n * onChange={setSelectedValue}\n * placeholder=\"Select an option\"\n * label=\"Choose one\"\n * />\n * ```\n */\nexport const Select: React.FC<SelectProps> = ({\n options = [],\n value,\n defaultValue,\n placeholder = 'Seleccionar...',\n disabled = false,\n error = false,\n label,\n description,\n showLabel = true,\n showDescription = true,\n menuHeader,\n onChange,\n className = '',\n triggerClassName = '',\n menuClassName = '',\n ariaLabel,\n id,\n name,\n required = false,\n menuPosition = 'bottom',\n fullWidth = false,\n}) => {\n // ===== ESTADO Y REFS =====\n const [isOpen, setIsOpen] = useState(false);\n const [selectedValue, setSelectedValue] = useState<string | number | undefined>(\n value !== undefined ? value : defaultValue\n );\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // ===== SINCRONIZAR VALOR CONTROLADO =====\n useEffect(() => {\n if (value !== undefined) {\n setSelectedValue(value);\n }\n }, [value]);\n\n // ===== CERRAR AL HACER CLICK FUERA =====\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [isOpen]);\n\n // ===== KEYBOARD NAVIGATION =====\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n switch (event.key) {\n case 'Escape':\n setIsOpen(false);\n triggerRef.current?.focus();\n break;\n case 'ArrowDown':\n event.preventDefault();\n setFocusedIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n break;\n case 'ArrowUp':\n event.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n break;\n case 'Enter':\n event.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n handleSelect(options[focusedIndex]);\n }\n break;\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }\n }, [isOpen, focusedIndex, options]);\n\n // ===== HELPERS =====\n const selectedOption = options.find((opt) => opt.value === selectedValue);\n\n const toggleMenu = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n setFocusedIndex(-1);\n }\n };\n\n const handleSelect = (option: SelectOption) => {\n if (option.disabled) return;\n\n setSelectedValue(option.value);\n setIsOpen(false);\n onChange?.(option.value);\n\n setTimeout(() => {\n triggerRef.current?.focus();\n }, 0);\n };\n\n // ===== CLASES BASE DEL TRIGGER =====\n // Usando el sistema tipográfico Paragraph Regular (14px = text-sm)\n // Border radius rounded-lg (8px) consistente con especificaciones\n // Gap de 12px (gap-3) entre texto e icono según Figma\n const baseTriggerClasses = `\n inline-flex\n items-center\n justify-between\n gap-3\n w-full\n px-3\n py-2\n text-sm\n font-normal\n leading-5\n rounded-lg\n border\n transition-all\n duration-150\n `;\n\n // ===== CLASES DE WIDTH =====\n const widthClasses = fullWidth ? 'w-full' : 'min-w-[200px]';\n\n // ===== CLASES PARA ESTADOS DEL TRIGGER =====\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n const triggerStateClasses = error\n ? `\n border-error-border\n bg-error-bg\n text-content-primary\n dark:border-error-border\n dark:bg-error-bg\n dark:text-dark-content-primary\n `\n : `\n bg-bg-primary\n border-border-primary\n text-content-primary\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n dark:text-dark-content-primary\n `;\n\n // ===== CLASES PARA HOVER DEL TRIGGER =====\n // Hover: border más claro según Figma (#f9f9f9)\n const triggerHoverClasses =\n !disabled && !error\n ? `\n hover:border-[#f9f9f9]\n dark:hover:border-[#3a3a3f]\n `\n : '';\n\n // ===== CLASES PARA FOCUS DEL TRIGGER =====\n // Focus: border-2 con color específico #329cff según Figma\n const triggerFocusClasses = !disabled\n ? `\n focus:outline-none\n focus-within:border-2\n focus-within:border-[#329cff]\n dark:focus-within:border-[#329cff]\n `\n : '';\n\n // ===== CLASES PARA DISABLED DEL TRIGGER =====\n const triggerDisabledClasses = disabled\n ? `\n opacity-50\n cursor-not-allowed\n `\n : '';\n\n // ===== COMBINAR CLASES DEL TRIGGER =====\n const finalTriggerClasses = [\n baseTriggerClasses,\n widthClasses,\n triggerStateClasses,\n triggerHoverClasses,\n triggerFocusClasses,\n triggerDisabledClasses,\n triggerClassName,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES BASE DEL MENU =====\n // Según Figma: altura fija 160px (h-40), border secundario,\n // spacing de 4px desde trigger (mt-1), shadow-lg para elevación\n const baseMenuClasses = `\n absolute\n z-50\n w-full\n min-w-[200px]\n max-h-40\n overflow-y-auto\n p-1\n rounded-md\n border\n shadow-lg\n transition-all\n duration-150\n `;\n\n // ===== CLASES DE POSICIÓN DEL MENU =====\n // Figma muestra 4px de separación, usando mt-1 en lugar de mt-2\n const menuPositionClasses = menuPosition === 'top' ? 'bottom-full mb-1' : 'top-full mt-1';\n\n // ===== CLASES DE COLOR DEL MENU =====\n // Background secundario según Figma con border secundario\n const menuColorClasses = `\n bg-background-secondary\n border-border-secondary\n dark:bg-dark-bg-primary\n dark:border-dark-border-primary\n `;\n\n // ===== CLASES DE VISIBILIDAD DEL MENU =====\n const menuVisibilityClasses = isOpen ? 'opacity-100 visible' : 'opacity-0 invisible';\n\n // ===== COMBINAR CLASES DEL MENU =====\n const finalMenuClasses = [\n baseMenuClasses,\n menuPositionClasses,\n menuColorClasses,\n menuVisibilityClasses,\n menuClassName,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES BASE DEL MENU ITEM =====\n // CRÍTICO: Figma especifica text-[10px] leading-[12px] (Label XXSmall)\n // Gap de 2px (gap-0.5) entre elementos según Figma\n const baseMenuItemClasses = `\n flex\n items-center\n cursor-pointer\n rounded-md\n transition-all\n duration-150\n pl-2\n pr-2.5\n py-0.5\n gap-0.5\n text-[10px]\n leading-[12px]\n font-bold\n `;\n\n // ===== FUNCIÓN PARA OBTENER CLASES DE MENU ITEM =====\n const getMenuItemClasses = (option: SelectOption, index: number) => {\n const isSelected = option.value === selectedValue;\n const isFocused = index === focusedIndex;\n\n // Estados de color según Figma:\n // - Default: text-content-primary\n // - Hover: bg-primary-custom-600 + text-primary-inverse-content\n // - Selected: muestra check icon, mismo text color que default\n const colorClasses =\n isFocused || (isSelected && isFocused)\n ? 'bg-primary-custom-600 text-primary-inverse-content dark:bg-primary-custom-600 dark:text-primary-inverse-content'\n : 'text-content-primary dark:text-dark-content-primary';\n\n // Hover: fondo azul primario con texto blanco\n const hoverClasses = !option.disabled\n ? 'hover:bg-primary-custom-600 hover:text-primary-inverse-content dark:hover:bg-primary-custom-600 dark:hover:text-primary-inverse-content'\n : '';\n\n // Disabled\n const disabledClasses = option.disabled ? 'opacity-50 cursor-not-allowed' : '';\n\n return [baseMenuItemClasses, colorClasses, hoverClasses, disabledClasses]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n };\n\n // ===== CLASES DEL ICONO DEL TRIGGER =====\n // Chevron icon 20x20px (size-5) según sistema Heroicons\n const iconClasses = [\n 'size-5',\n 'flex-shrink-0',\n 'transition-transform',\n 'duration-150',\n isOpen && 'rotate-180',\n disabled ? 'text-content-tertiary dark:text-content-tertiary' : 'text-content-secondary dark:text-content-secondary',\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL CHECK ICON =====\n // Check icon 16x16px (size-4) según sistema Heroicons\n const checkIconClasses = 'size-4 flex-shrink-0';\n\n // ===== RENDERIZAR COMPONENTE =====\n return (\n <div className={`relative ${fullWidth ? 'w-full' : ''} ${className}`} ref={containerRef}>\n {/* Label and Description - Según Figma, van ANTES del trigger con gap-1 (4px) */}\n {(showLabel && label) || (showDescription && description) ? (\n <div className=\"flex flex-col gap-1 mb-1 w-full\">\n {/* Label - Label Small (14px bold) */}\n {showLabel && label && (\n <label\n htmlFor={id}\n className=\"text-sm font-bold leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n {label}\n {required && <span className=\"ml-1 text-error-content\">*</span>}\n </label>\n )}\n\n {/* Description - Paragraph Small (14px regular) */}\n {showDescription && description && (\n <p className=\"text-sm font-normal leading-5 text-content-tertiary dark:text-content-tertiary\">\n {description}\n </p>\n )}\n </div>\n ) : null}\n\n {/* Trigger Button */}\n <button\n ref={triggerRef}\n type=\"button\"\n className={finalTriggerClasses}\n onClick={toggleMenu}\n disabled={disabled}\n aria-label={ariaLabel || label}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n id={id}\n >\n {/* Selected value or placeholder */}\n <span\n className={\n selectedOption ? '' : 'text-content-secondary dark:text-content-secondary'\n }\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n\n {/* Chevron icon */}\n <ChevronUpDownIcon className={iconClasses} />\n </button>\n\n {/* Hidden input for forms */}\n {name && (\n <input\n type=\"hidden\"\n name={name}\n value={selectedValue !== undefined ? String(selectedValue) : ''}\n />\n )}\n\n {/* Menu */}\n {isOpen && (\n <div ref={menuRef} className={finalMenuClasses} role=\"listbox\">\n {/* Menu Header - Opcional según Figma */}\n {menuHeader && (\n <div className=\"flex items-center gap-0.5 px-6 py-0.5 rounded-[5px]\">\n <span className=\"text-[10px] font-bold leading-[12px] text-content-tertiary dark:text-content-tertiary\">\n {menuHeader}\n </span>\n </div>\n )}\n\n {/* Empty state */}\n {options.length === 0 && (\n <div className=\"px-2 py-1.5 text-[10px] leading-[12px] text-content-secondary dark:text-content-secondary\">\n No hay opciones disponibles\n </div>\n )}\n\n {/* Options */}\n {options.map((option, index) => (\n <div\n key={option.value}\n className={getMenuItemClasses(option, index)}\n onClick={() => handleSelect(option)}\n onMouseEnter={() => setFocusedIndex(index)}\n role=\"option\"\n aria-selected={option.value === selectedValue}\n aria-disabled={option.disabled}\n >\n {/* Check icon for selected item */}\n <div className=\"w-4 flex items-center justify-center\">\n {option.value === selectedValue && <CheckIcon className={checkIconClasses} />}\n </div>\n\n {/* Custom icon if provided */}\n {option.icon && <span className=\"flex-shrink-0 w-4 h-4\">{option.icon}</span>}\n\n {/* Label */}\n <span className=\"flex-1 text-left\">{option.label}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport type { NavigationRailProps, NavigationRailItemProps } from './NavigationRail.types';\n\n/**\n * NavigationRail del sistema de diseño Siesa\n *\n * Componente de navegación vertical (rail) para aplicaciones. Proporciona acceso\n * rápido a destinos principales mediante iconos y labels opcionales.\n *\n * **Características:**\n * - Ancho fijo de 80px para navegación compacta\n * - Soporte para FAB (Floating Action Button) en la parte superior\n * - Estados: normal, hover, selected, disabled\n * - Badges de notificación con contador opcional\n * - Alineación flexible: top, center, bottom\n * - Dark mode completo\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Tipografía Label XXSmall (10px Bold) según sistema de diseño\n * - Estados interactivos completos (hover, focus, active)\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label XXSmall)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Navigation Rail básico\n * <NavigationRail\n * items={[\n * { id: 'home', icon: <HomeIcon />, label: 'Inicio', selected: true },\n * { id: 'search', icon: <SearchIcon />, label: 'Buscar' },\n * { id: 'notifications', icon: <BellIcon />, label: 'Notificaciones', badgeCount: 5 },\n * ]}\n * alignment=\"top\"\n * />\n *\n * // Con FAB button\n * <NavigationRail\n * showFab\n * fabIcon={<PlusIcon />}\n * onFabClick={() => console.log('Create new')}\n * items={[...]}\n * />\n * ```\n */\n\n/**\n * NavigationRailItem - Componente interno para items individuales\n */\nconst NavigationRailItem: React.FC<NavigationRailItemProps> = ({\n icon,\n label,\n selected = false,\n disabled = false,\n badge = false,\n badgeCount,\n onClick,\n ariaLabel,\n id,\n}) => {\n // ===== CLASES DEL ICON CONTAINER =====\n // Estado selected usa background con overlay según Figma\n const iconContainerClasses = [\n // Base\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'px-4',\n 'py-1',\n 'rounded-full',\n 'overflow-hidden',\n 'shrink-0',\n\n // Estados\n selected\n ? // Selected: bg-primary-custom-100 con overlay de rgba(0,0,0,0.024)\n 'bg-primary-custom-100 dark:bg-primary-custom-600/30'\n : // Default/Hover: transparent → hover:bg-primary-custom-100\n 'bg-transparent hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20',\n\n // Transiciones\n 'transition-colors',\n 'duration-150',\n ].join(' ');\n\n // ===== CLASES DEL ICONO =====\n const iconClasses = [\n 'w-4',\n 'h-4',\n 'shrink-0',\n\n // Colores según estado\n selected || !disabled\n ? // Selected o habilitado con hover: content-primary → hover:primary-custom-600\n selected\n ? 'text-primary-custom-600 dark:text-white'\n : 'text-content-primary hover:text-primary-custom-600 dark:text-dark-content-primary dark:hover:text-white'\n : // Disabled\n 'text-content-tertiary dark:text-content-tertiary',\n\n 'transition-colors',\n 'duration-150',\n ].join(' ');\n\n // ===== CLASES DEL LABEL =====\n const labelClasses = [\n // Tipografía: Label XXSmall (10px Bold, leading 12px)\n 'text-[10px]',\n 'leading-3',\n 'font-bold',\n 'text-center',\n 'w-full',\n 'min-w-full',\n\n // Colores\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ');\n\n // ===== CLASES DEL CONTENEDOR PRINCIPAL =====\n const containerClasses = [\n 'relative',\n 'flex',\n 'flex-col',\n 'items-center',\n 'gap-1',\n 'px-0.5',\n 'py-0',\n 'w-14', // 56px según Figma\n 'shrink-0',\n\n // Interactividad\n disabled\n ? 'cursor-not-allowed opacity-50 pointer-events-none'\n : 'cursor-pointer',\n\n // Focus\n 'focus:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-primary-custom-400',\n 'focus-visible:ring-offset-2',\n 'dark:focus-visible:ring-dark-border-custom',\n 'dark:focus-visible:ring-offset-dark-bg-primary',\n 'rounded-lg',\n ].join(' ');\n\n // ===== RENDERIZAR BADGE =====\n const renderBadge = () => {\n if (!badge && badgeCount === undefined) return null;\n\n // Badge con número\n if (badgeCount !== undefined) {\n return (\n <span\n className=\"\n absolute\n -top-0.5\n left-[34px]\n flex\n items-center\n justify-center\n min-w-[13px]\n h-[13px]\n px-1\n rounded-full\n text-[10px]\n font-bold\n leading-none\n bg-red-700\n text-white\n dark:bg-red-700\n dark:text-white\n pointer-events-none\n \"\n aria-label={`${badgeCount} notificaciones`}\n >\n {badgeCount > 99 ? '99+' : badgeCount}\n </span>\n );\n }\n\n // Badge dot simple\n return (\n <span\n className=\"\n absolute\n -top-0.5\n left-[34px]\n w-[13px]\n h-[13px]\n rounded-full\n bg-red-700\n dark:bg-red-700\n pointer-events-none\n \"\n aria-label=\"Notificación\"\n />\n );\n };\n\n return (\n <button\n type=\"button\"\n className={containerClasses}\n disabled={disabled}\n onClick={onClick}\n aria-label={ariaLabel || label}\n aria-current={selected ? 'page' : undefined}\n data-item-id={id}\n >\n {/* Icon Container */}\n <div className={iconContainerClasses}>\n <span className={iconClasses}>\n {icon}\n </span>\n </div>\n\n {/* Label */}\n <p className={labelClasses}>\n {label}\n </p>\n\n {/* Badge */}\n {renderBadge()}\n </button>\n );\n};\n\n/**\n * NavigationRail - Componente principal\n */\nexport const NavigationRail: React.FC<NavigationRailProps> = ({\n items,\n alignment = 'top',\n showFab = false,\n fabIcon,\n onFabClick,\n fabAriaLabel = 'Crear nuevo',\n className = '',\n selectedId,\n onItemSelect,\n}) => {\n // ===== CLASES DEL CONTENEDOR PRINCIPAL =====\n const containerClasses = [\n // Layout\n 'flex',\n 'flex-col',\n 'items-center',\n 'relative',\n\n // Tamaño fijo según Figma\n 'w-20', // 80px\n 'h-full',\n\n // Fondo y bordes\n 'bg-white',\n 'dark:bg-dark-bg-primary',\n 'border-r',\n 'border-border-primary',\n 'dark:border-dark-border-primary',\n\n className,\n ].join(' ');\n\n // ===== CLASES DEL WRAPPER CON PADDING =====\n // Según Figma, cada alineación funciona diferente:\n // - top: flujo normal desde arriba\n // - center: wrapper con grow y items absolutamente centrados\n // - bottom: wrapper con grow y items con justify-end\n const wrapperClasses = [\n 'flex',\n 'flex-col',\n 'items-center',\n 'gap-10', // 40px entre FAB y items según Figma\n 'w-20', // 80px\n 'pb-10', // 40px padding bottom según Figma\n 'pt-2', // 8px padding top según Figma\n\n // Para center y bottom, el wrapper debe crecer para ocupar espacio\n alignment !== 'top' && 'grow',\n alignment !== 'top' && 'basis-0',\n alignment !== 'top' && 'min-h-0',\n ].filter(Boolean).join(' ');\n\n // ===== CLASES DEL CONTENEDOR DE ITEMS =====\n // Para cada alineación, los items se posicionan diferente\n const getItemsContainerClasses = () => {\n const baseClasses = [\n 'flex',\n 'flex-col',\n 'items-center',\n 'gap-3', // 12px según Figma\n 'w-20', // 80px\n ];\n\n if (alignment === 'top') {\n return [...baseClasses, 'shrink-0'].join(' ');\n }\n\n if (alignment === 'center') {\n // Items absolutamente centrados según Figma\n return [\n ...baseClasses,\n 'absolute',\n 'left-1/2',\n 'top-1/2',\n '-translate-x-1/2',\n '-translate-y-1/2',\n ].join(' ');\n }\n\n if (alignment === 'bottom') {\n // Items al final con grow y justify-end según Figma\n return [\n ...baseClasses,\n 'grow',\n 'basis-0',\n 'min-h-0',\n 'justify-end',\n 'shrink-0',\n ].join(' ');\n }\n\n return baseClasses.join(' ');\n };\n\n const itemsContainerClasses = getItemsContainerClasses();\n\n // ===== CLASES DEL FAB BUTTON =====\n const fabClasses = [\n // Layout\n 'flex',\n 'items-center',\n 'justify-center',\n 'p-3', // 12px padding según Figma\n 'shrink-0',\n\n // Estilo\n 'rounded-md',\n 'bg-primary-custom-600',\n 'text-primary-inverse-content',\n 'border',\n 'border-primary-custom-600',\n 'shadow-button-inset',\n\n // Estados\n 'hover:bg-primary-custom-500',\n 'active:scale-95',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'focus:ring-offset-2',\n\n // Dark mode\n 'dark:bg-dark-bg-inverse',\n 'dark:text-dark-content-inverse',\n 'dark:border-dark-bg-inverse',\n 'dark:hover:bg-dark-bg-inverse/90',\n 'dark:focus:ring-dark-border-custom',\n 'dark:focus:ring-offset-dark-bg-primary',\n\n // Transiciones\n 'transition-all',\n 'duration-150',\n ].join(' ');\n\n // ===== MANEJAR SELECCIÓN DE ITEM =====\n const handleItemClick = (item: NavigationRailItemProps) => {\n if (item.disabled) return;\n\n if (item.onClick) {\n item.onClick();\n }\n\n if (onItemSelect && item.id) {\n onItemSelect(item.id);\n }\n };\n\n return (\n <nav className={containerClasses} aria-label=\"Navegación principal\">\n <div className={wrapperClasses}>\n {/* FAB Button (opcional) */}\n {showFab && (\n <div className=\"flex items-start gap-2.5 shrink-0\">\n <button\n type=\"button\"\n className={fabClasses}\n onClick={onFabClick}\n aria-label={fabAriaLabel}\n >\n <span className=\"w-4 h-4 flex items-center justify-center\">\n {fabIcon}\n </span>\n </button>\n </div>\n )}\n\n {/* Navigation Items */}\n <div className={itemsContainerClasses}>\n {items.map((item, index) => (\n <NavigationRailItem\n key={item.id || index}\n {...item}\n selected={item.selected || (selectedId !== undefined && item.id === selectedId)}\n onClick={() => handleItemClick(item)}\n />\n ))}\n </div>\n </div>\n </nav>\n );\n};\n","import React, { useState } from 'react';\nimport type { NavigationRailPanelProps } from './NavigationRailPanel.types';\nimport { DropdownItemHeading } from '../DropdownItemHeading';\nimport { DropdownItemCollapsible } from '../DropdownItemCollapsible';\nimport { Input } from '../Input';\nimport { Divider } from '../Divider/Divider';\n\n/**\n * Componente NavigationRailPanel del sistema de diseño Siesa\n *\n * Panel de navegación vertical (rail) que puede contener múltiples secciones\n * de items, búsqueda y encabezados. Se usa típicamente en aplicaciones con\n * navegación compleja que requieren una estructura jerárquica.\n *\n * **Estructura principal:**\n * 1. Encabezado (DropdownItemHeading) - Opcional\n * 2. Input de búsqueda - Opcional\n * 3. Divisor - Siempre presente después de búsqueda/encabezado\n * 4. Body con secciones de items:\n * - Heading de sección (Paragraph/Tiny, content-tertiary)\n * - Items colapsables (DropdownItemCollapsible) o simples\n * - Divisor entre secciones\n *\n * **Dimensiones según Figma:**\n * - Altura: Variable (por defecto 900px)\n * - Ancho del panel: 248px (con padding 12px)\n * - Ancho de contenido: 224px\n * - Padding del panel: 12px\n * - Padding del body: 12px\n * - Border: 1px left (border-primary)\n * - Border radius: 0px (es un panel recto)\n *\n * **Tipografía:**\n * - Heading (DropdownItemHeading): Label/Small (14px Bold)\n * - Section heading: Paragraph/Tiny (12px Regular) - content-tertiary\n * - Items: Paragraph/Small (14px Regular)\n *\n * **Colores (Light Mode):**\n * - Background: #ffffff (white)\n * - Border: #e4e4e7 (border-primary)\n * - Heading text: #18181b (content-primary)\n * - Section heading: #71717a (content-tertiary)\n * - Item text: #18181b (content-primary)\n * - Icon color: #a1a1aa (content-secondary)\n *\n * **Colores (Dark Mode):**\n * - Background: #18181b (dark bg)\n * - Border: #3f3f46 (border-primary/dark)\n * - Heading text: #fafafa (content-primary/dark)\n * - Section heading: #a1a1aa (content-tertiary/dark)\n * - Item text: #fafafa (content-primary/dark)\n * - Icon color: #a1a1aa (content-secondary/dark)\n *\n * **Estados:**\n * - Default: Sin interacción\n * - Hover: Items con hover overlay sutil\n * - Focus: Focus ring adaptativo\n * - Disabled: Opacidad 50%\n * - Active (items colapsables): Expanded state\n *\n * **Espaciado interno:**\n * - Gap entre section heading e items: 0.5 (2px)\n * - Gap entre items: 0.5 (2px)\n * - Gap entre elemento y contenido: 3 (12px)\n * - Padding vertical section heading: pt-3 pb-1 (12px top, 4px bottom)\n * - Padding items: py-2 px-4 (8px vertical, 16px horizontal)\n *\n * **Scroll:**\n * - El body es scrolleable verticalmente (overflow-y-auto)\n * - El encabezado y búsqueda se mantienen fijos en el tope\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n * @see ../DropdownItemHeading - Componente reutilizado para encabezado\n * @see ../DropdownItemCollapsible - Componente reutilizado para items colapsables\n * @see ../Input - Componente reutilizado para búsqueda\n * @see ../Divider - Componente reutilizado para separadores\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6134-34415 - Diseño Figma\n *\n * @example\n * ```tsx\n * // Ejemplo simple con secciones\n * <NavigationRailPanel\n * height={900}\n * showHeading={true}\n * heading={{\n * label: 'Settings',\n * description: 'Configure your preferences',\n * iconName: 'cog-6-tooth',\n * actionLabel: 'Clear',\n * showAction: true,\n * }}\n * showSearch={true}\n * search={{\n * placeholder: 'Buscar módulo',\n * }}\n * sections={[\n * {\n * heading: 'Section 1',\n * items: [\n * { label: 'Item 1', isCollapsible: true, children: [...] },\n * { label: 'Item 2', isCollapsible: false },\n * ],\n * },\n * {\n * heading: 'Section 2',\n * items: [\n * { label: 'Item 3' },\n * ],\n * },\n * ]}\n * />\n *\n * // Ejemplo con items simples sin secciones\n * <NavigationRailPanel\n * showHeading={false}\n * showSearch={true}\n * items={[\n * { label: 'Dashboard', icon: <DashboardIcon /> },\n * { label: 'Users', icon: <UserIcon /> },\n * { label: 'Settings', icon: <SettingsIcon /> },\n * ]}\n * />\n * ```\n */\nexport const NavigationRailPanel: React.FC<NavigationRailPanelProps> = ({\n height = 900,\n width = 248,\n showHeading = true,\n heading,\n showSearch = true,\n search,\n sections,\n items,\n className = '',\n panelClassName = '',\n}) => {\n const [searchValue, setSearchValue] = useState(search?.value || '');\n\n const handleSearchChange = (value: string) => {\n setSearchValue(value);\n search?.onChange?.(value);\n };\n\n // Construir clase de altura dinámicamente\n const containerStyle = {\n height: typeof height === 'number' ? `${height}px` : height,\n };\n\n const panelStyle = {\n width: typeof width === 'number' ? `${width}px` : width,\n };\n\n return (\n <div\n className={`flex items-start relative ${className}`}\n style={containerStyle}\n data-testid=\"navigation-rail-panel-container\"\n >\n <div\n className={`bg-bg-primary dark:bg-dark-bg-primary border-border-primary dark:border-dark-border-primary border-b-0 border-l border-r border-solid border-t-0 flex flex-col h-full items-start overflow-clip relative shrink-0 ${panelClassName}`}\n style={panelStyle}\n data-testid=\"navigation-rail-panel\"\n >\n {/* Encabezado (DropdownItemHeading) */}\n {showHeading && heading && (\n <div className=\"flex flex-col items-start p-3 relative shrink-0 w-full\">\n <DropdownItemHeading\n label={heading.label}\n description={heading.description}\n showDescription={heading.showDescription !== false}\n iconName={heading.iconName}\n showIcon={true}\n actionLabel={heading.actionLabel}\n showAction={heading.showAction}\n onActionClick={heading.onActionClick}\n className=\"w-full\"\n />\n </div>\n )}\n\n {/* Input de búsqueda */}\n {showSearch && (\n <div\n className=\"flex flex-col items-start p-3 relative shrink-0 w-full\"\n data-testid=\"navigation-rail-search\"\n >\n <Input\n placeholder={search?.placeholder || 'Buscar módulo'}\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"w-full\"\n />\n </div>\n )}\n\n {/* Divisor */}\n <Divider className=\"w-full\" />\n\n {/* Body con items */}\n <div\n className=\"flex flex-1 flex-col gap-0.5 items-start min-h-px min-w-px p-3 relative shrink-0 overflow-y-auto w-full\"\n data-testid=\"navigation-rail-body\"\n >\n {/* Renderizar secciones */}\n {sections && sections.length > 0\n ? sections.map((section, sectionIndex) => (\n <div key={`section-${sectionIndex}`} className=\"w-full\">\n {/* Section Heading */}\n {section.heading && (\n <div\n className=\"flex flex-col gap-0 items-start pb-1 pt-3 px-0 relative shrink-0 w-full\"\n data-testid={`section-heading-${sectionIndex}`}\n >\n <p className=\"font-['Inter:Regular',sans-serif] font-normal text-xs leading-4 not-italic relative shrink-0 text-content-tertiary dark:text-content-tertiary w-full whitespace-pre-wrap\">\n {section.heading}\n </p>\n </div>\n )}\n\n {/* Section Items */}\n <div\n className=\"flex flex-col gap-0.5 items-start relative shrink-0 w-full\"\n data-testid={`section-items-${sectionIndex}`}\n >\n {section.items.map((item, itemIndex) => (\n <NavigationRailPanelItem\n key={`item-${sectionIndex}-${itemIndex}`}\n item={item}\n />\n ))}\n </div>\n\n {/* Section Divider */}\n {section.showDivider !== false && sectionIndex < sections.length - 1 && (\n <Divider className=\"mt-3 w-full\" />\n )}\n </div>\n ))\n : null}\n\n {/* Renderizar items simples (sin secciones) */}\n {items && items.length > 0 && !sections\n ? items.map((item, itemIndex) => (\n <NavigationRailPanelItem\n key={`item-${itemIndex}`}\n item={item}\n />\n ))\n : null}\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Componente interno para renderizar un item del NavigationRailPanel\n * Puede ser un item simple o colapsable\n */\ninterface NavigationRailPanelItemComponentProps {\n item: NonNullable<NavigationRailPanelProps['items']>[0];\n}\n\nconst NavigationRailPanelItem: React.FC<NavigationRailPanelItemComponentProps> = ({ item }) => {\n if (item.isCollapsible) {\n return (\n <DropdownItemCollapsible\n label={item.label}\n icon={item.icon}\n children={item.children}\n defaultOpen={item.defaultOpen}\n disabled={item.disabled}\n onClick={item.onClick}\n onOpenChange={item.onOpenChange}\n className={item.className}\n showDivider={false}\n showHeading={false}\n />\n );\n }\n\n return (\n <button\n onClick={item.onClick}\n disabled={item.disabled}\n className={[\n // Base\n 'flex items-center gap-3 px-4 py-2 w-full',\n 'rounded-lg cursor-pointer',\n 'transition-colors duration-150',\n\n // Colores y estados (Light Mode)\n !item.disabled && 'text-content-primary',\n !item.disabled && 'hover:bg-primary-custom-100',\n\n // Dark Mode\n !item.disabled && 'dark:text-content-primary',\n !item.disabled && 'dark:hover:bg-dark-bg-custom',\n\n // Focus ring\n !item.disabled && 'focus:outline-none',\n !item.disabled && 'focus:ring-2',\n !item.disabled && 'focus:ring-offset-2',\n !item.disabled && 'focus:ring-primary-custom-400',\n !item.disabled && 'focus:ring-offset-bg-primary',\n !item.disabled && 'dark:focus:ring-offset-dark-bg-primary',\n\n // Disabled\n item.disabled && 'opacity-50',\n item.disabled && 'cursor-not-allowed',\n\n item.className,\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={`navigation-rail-item-${item.label}`}\n aria-disabled={item.disabled}\n >\n {item.icon && (\n <div className=\"flex items-center justify-center w-4 h-4 shrink-0 text-content-secondary dark:text-content-secondary\">\n {item.icon}\n </div>\n )}\n <p className=\"font-['Inter:Regular',sans-serif] text-sm font-normal leading-5 not-italic relative shrink-0 text-left\">\n {item.label}\n </p>\n </button>\n );\n};\n","import * as React from \"react\";\nfunction ChevronLeftIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronLeftIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction ChevronRightIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ChevronRightIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction MagnifyingGlassIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n d: \"M9 3.5a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11ZM2 9a7 7 0 1 1 12.452 4.391l3.328 3.329a.75.75 0 1 1-1.06 1.06l-3.329-3.328A7 7 0 0 1 2 9Z\",\n clipRule: \"evenodd\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(MagnifyingGlassIcon);\nexport default ForwardRef;","import React from 'react';\n// Importamos de 24/outline solo para el ClockIcon\nimport { ClockIcon as HeroClockOutline } from '@heroicons/react/24/outline';\n\n// Importamos de 20/solid para los demás\nimport {\n ChevronRightIcon as HeroChevronRight,\n ChevronLeftIcon as HeroChevronLeft,\n MagnifyingGlassIcon as HeroSearch,\n HomeIcon as HeroHome,\n UsersIcon as HeroUsers,\n Cog6ToothIcon as HeroSettings,\n} from '@heroicons/react/20/solid';\n\n/**\n * Props comunes para los iconos\n */\ninterface IconProps {\n className?: string;\n}\n\n/**\n * Icono Chevron Right (apunta hacia la derecha)\n * Usado en el botón de collapse\n */\nexport const ChevronRightIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroChevronRight className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Chevron Left (apunta hacia la izquierda)\n * Usado en el botón de expand\n */\nexport const ChevronLeftIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroChevronLeft className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Clock (reloj) - Estilo OUTLINE 24\n * Usado en el botón \"Recientes\"\n */\nexport const ClockIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroClockOutline className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Magnifying Glass (búsqueda)\n * Usado en el botón de búsqueda\n */\nexport const MagnifyingGlassIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroSearch className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Home\n * Ejemplo para items de navegación\n */\nexport const HomeIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroHome className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Users\n * Ejemplo para items de navegación\n */\nexport const UsersIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroUsers className={className} aria-hidden=\"true\" />\n);\n\n/**\n * Icono Settings\n * Ejemplo para items de navegación\n */\nexport const SettingsIcon: React.FC<IconProps> = ({ className = 'size-5' }) => (\n <HeroSettings className={className} aria-hidden=\"true\" />\n);\n","import React, { useState } from 'react';\nimport type { NavigationRailTypesProps, NavigationRailItem } from './NavigationRailTypes.types';\nimport { ChevronRightIcon, ChevronLeftIcon, ClockIcon, MagnifyingGlassIcon } from './icons';\nimport { Button } from '../Button/Button';\nimport { Divider } from '../Divider/Divider';\nimport { DropdownItemCollapsible } from '../DropdownItemCollapsible/DropdownItemCollapsible';\nimport { NavigationRailItem as NavigationRailItemComponent } from '../NavigationRailItem/NavigationRailItem';\nimport { Input } from '../Input/Input';\n\n/**\n * Componente NavigationRailTypes del sistema de diseño Siesa\n *\n * Barra de navegación lateral que permite dos modos visuales:\n * - **Collapsed (Colapsado)**: 80px width, solo iconos con botón de búsqueda\n * - **Expanded (Expandido)**: 215px width, con labels y búsqueda integrada\n *\n * **Características:**\n * - Dos modos: collapsed e expanded (toggle con botón \"Colapsar\")\n * - Soporta items con badges de notificación\n * - Items colapsables para agrupar navegación relacionada\n * - Botón \"Recientes\" en footer\n * - Búsqueda integrada (solo en modo expanded)\n * - Dark mode completo\n * - Focus rings adaptativos\n *\n * **Especificaciones de Figma:**\n * - Collapsed: 80px width, items con height 44px + gap 12px\n * - Expanded: 215px width, items reutilizan DropdownItemCollapsible\n * - Icono search: 16x16px, azul (#0e79fd)\n * - Borde derecho: 1px solid #e4e4e7 (collapsed)\n * - Borde izquierdo: 1px solid #e4e4e7 (expanded)\n * - Height total: 900px (scroll si necesario)\n *\n * **Estructura:**\n * 1. Header (Search en expanded) - altura variable\n * 2. Menu & Destinations - flex 1 con items scrollables\n * 3. Footer - Actions con divider y botones\n *\n * **Estados de Items:**\n * - `default`: Text color content-primary\n * - `hover`: Fondo hover-overlay, icon color content-custom-primary\n * - `active`: Fondo custom-primary, text color custom-primary\n * - `disabled`: Opacity 50%, sin interacción\n *\n * **Colores (Light Mode):**\n * - Background: background-primary (#ffffff)\n * - Borders: border-primary (#e4e4e7)\n * - Text: content-primary (#18181b)\n * - Icons: content-secondary (#a1a1aa)\n * - Icon hover: content-custom-primary (#0e79fd)\n * - Divider: border-primary (#e4e4e7)\n * - Search input: bg-primary, border-primary, placeholder: content-tertiary\n *\n * **Colores (Dark Mode):**\n * - Background: background-primary/dark (#09090b)\n * - Borders: border-primary/dark (#3f3f46)\n * - Text: content-primary/dark (#fafafa)\n * - Icons: content-secondary/dark (#a1a1aa)\n * - Icon hover: content-custom-primary/dark (#bfe2fe)\n * - Divider: border-primary/dark (#3f3f46)\n *\n * **Tipografía:**\n * - Items labels: Paragraph/Small (14px, Regular, line-height 20px)\n * - Heading: Paragraph/Tiny (12px, Regular, line-height 16px) - si aplica\n * - Button labels: Label Small (14px, Bold)\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado (gap-3, px-4, py-2, etc)\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-36219\n *\n * @example\n * ```tsx\n * const navItems: NavigationRailItem[] = [\n * {\n * id: 'home',\n * label: 'Home',\n * icon: <HomeIcon />,\n * active: true,\n * onClick: () => navigate('/home'),\n * },\n * {\n * id: 'users',\n * label: 'Users',\n * icon: <UsersIcon />,\n * badge: true,\n * onClick: () => navigate('/users'),\n * },\n * ];\n *\n * const [isCollapsed, setIsCollapsed] = useState(true);\n *\n * <NavigationRailTypes\n * collapsed={isCollapsed}\n * items={navItems}\n * showRecentButton={true}\n * onCollapsedChange={setIsCollapsed}\n * onItemClick={(index, item) => console.log('Selected:', item.id)}\n * />\n * ```\n *\n * @see NavigationRailTypes.types.ts - Props e interfaces\n */\nexport const NavigationRailTypes = React.forwardRef<\n HTMLDivElement,\n NavigationRailTypesProps\n>(\n (\n {\n collapsed = true,\n items = [],\n showRecentButton = true,\n showSearchButton = true,\n onCollapsedChange,\n onItemClick,\n onItemHover,\n className,\n labels = {},\n },\n ref\n ) => {\n const [searchQuery, setSearchQuery] = useState('');\n\n // Labels con valores por defecto\n const finalLabels = {\n searchButton: labels.searchButton ?? 'Search',\n searchPlaceholder: labels.searchPlaceholder ?? 'Buscar módulo',\n recentButton: labels.recentButton ?? 'Recientes',\n collapseButton: labels.collapseButton ?? 'Colapsar',\n expandButton: labels.expandButton ?? 'Expandir',\n };\n\n const handleCollapsedToggle = () => {\n onCollapsedChange?.(!collapsed);\n };\n\n const handleItemClick = (index: number, item: NavigationRailItem) => {\n item.onClick?.(new Event('click') as any);\n onItemClick?.(index, item);\n };\n\n const handleItemHover = (index: number, item: NavigationRailItem) => {\n onItemHover?.(index, item);\n };\n\n return (\n <div\n ref={ref}\n className={`\n ${collapsed ? 'w-[80px]' : 'w-[215px]'}\n h-full\n bg-background-primary dark:bg-background-primary\n ${collapsed ? 'border-r border-border-primary dark:border-border-primary' : 'border-l border-r border-border-primary dark:border-border-primary'}\n border-solid\n flex flex-col\n items-center\n relative\n transition-all duration-300\n ${className || ''}\n `}\n >\n {/* Sección de búsqueda - solo en modo expandido */}\n {!collapsed && (\n <div className=\"w-full flex flex-col gap-3 px-3 py-3 relative shrink-0\">\n <Input\n placeholder={finalLabels.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n leftIcon={<MagnifyingGlassIcon className=\"size-4 text-content-secondary dark:text-content-secondary\" />}\n fullWidth\n />\n <Divider className=\"w-full\" />\n </div>\n )}\n\n {/* Main content - Menu & Destinations */}\n <div\n className={`\n flex-1 flex flex-col\n items-center min-h-px min-w-px\n relative shrink-0\n px-0\n ${collapsed\n ? 'gap-7 py-2 w-[80px]'\n : 'gap-0.5 p-3 w-full bg-background-primary dark:bg-background-primary border-l dark:border-border-primary border-border-primary border-solid'\n }\n `}\n >\n {/* Botón Search en collapsed */}\n {collapsed && showSearchButton && (\n <Button\n type=\"default\"\n size=\"xl\"\n iconOnly\n leftIcon={<MagnifyingGlassIcon className=\"overflow-clip relative shrink-0 size-4 text-primary-inverse-content dark:text-primary-inverse-content\" />}\n ariaLabel={finalLabels.searchButton}\n />\n )}\n\n {/* Items container */}\n <div\n className={`\n flex flex-col items-center min-h-px min-w-px\n relative shrink-0\n flex-1\n overflow-hidden\n ${collapsed\n ? 'gap-3 leading-none w-[80px]'\n : 'gap-0.5 p-3 w-full'\n }\n `}\n >\n {items.length === 0 ? (\n // Items de demo/ejemplo\n <>\n {collapsed &&\n Array.from({ length: 4 }).map((_, idx) => (\n <NavigationRailItemComponent\n key={`demo-collapsed-${idx}`}\n id={`demo-collapsed-${idx}`}\n label=\"Item\"\n icon={\n <svg\n className=\"size-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 12a9 9 0 1118 0 9 9 0 01-18 0z\"\n />\n </svg>\n }\n showLabelText={false}\n />\n ))}\n\n {!collapsed &&\n Array.from({ length: 6 }).map((_, idx) => (\n <DropdownItemCollapsible\n key={`demo-expanded-${idx}`}\n label=\"Item\"\n showDivider={false}\n showHeading={false}\n />\n ))}\n </>\n ) : collapsed ? (\n // Items reales - collapsed mode\n <>\n {items.map((item, idx) => (\n <NavigationRailItemComponent\n key={item.id}\n id={item.id}\n label={item.label}\n icon={item.icon}\n selected={item.active}\n disabled={item.disabled}\n badge={item.badge}\n badgeCount={item.badgeCount}\n ariaLabel={item.ariaLabel}\n showLabelText={false}\n onClick={() => handleItemClick(idx, item)}\n onMouseEnter={() => handleItemHover(idx, item)}\n />\n ))}\n </>\n ) : (\n // Items reales - expanded mode\n <>\n {items.map((item, idx) => {\n const isCollapsible = (item as any).children && (item as any).children.length > 0;\n return (\n <div key={item.id} className=\"w-full\">\n <DropdownItemCollapsible\n label={item.label}\n icon={item.icon}\n selected={item.active}\n disabled={item.disabled}\n badge={item.badge}\n badgeCount={item.badgeCount}\n badgeColor={item.badgeColor as any}\n showDivider={false}\n showHeading={false}\n isCollapsible={isCollapsible}\n defaultOpen={(item as any).defaultOpen}\n children={isCollapsible ? (item as any).children : undefined}\n onClick={() => handleItemClick(idx, item)}\n />\n </div>\n );\n })}\n </>\n )}\n </div>\n\n {/* Footer - Actions */}\n <div className={`w-full flex flex-col gap-3 items-center relative shrink-0 ${!collapsed ? 'px-3' : ''}`}>\n <Divider className=\"w-full\" />\n\n <div\n className={`\n flex flex-col gap-3 relative shrink-0 w-full\n ${collapsed ? 'items-stretch px-3' : 'items-stretch'}\n `}\n >\n {/* Botón Recientes */}\n {showRecentButton && collapsed && (\n <Button\n type=\"outline\"\n size=\"base\"\n fullWidth\n leftIcon={<ClockIcon className=\"size-4 text-primary-custom-600 dark:text-primary-custom-600\" />}\n ariaLabel={finalLabels.recentButton}\n />\n )}\n\n {showRecentButton && !collapsed && (\n <Button\n type=\"outline\"\n size=\"base\"\n leftIcon={<ClockIcon className=\"size-4 text-primary-custom-600 dark:text-primary-custom-600\" />}\n fullWidth\n >\n {finalLabels.recentButton}\n </Button>\n )}\n\n {/* Botón Colapsar/Expandir */}\n {collapsed ? (\n <Button\n type=\"plain\"\n size=\"base\"\n fullWidth\n leftIcon={<ChevronRightIcon className=\"overflow-clip relative shrink-0 size-4 text-background-inverse-custom-primary dark:text-background-inverse-custom-primary\" />}\n onClick={handleCollapsedToggle}\n ariaLabel={finalLabels.expandButton}\n />\n ) : (\n <Button\n type=\"outline\"\n size=\"base\"\n leftIcon={<ChevronLeftIcon className=\"overflow-clip relative shrink-0 size-4 text-content-custom-primary dark:text-content-custom-primary\" />}\n onClick={handleCollapsedToggle}\n fullWidth\n >\n {finalLabels.collapseButton}\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n }\n);\n\nNavigationRailTypes.displayName = 'NavigationRailTypes';\n\nexport default NavigationRailTypes;\n","import React from 'react';\n// Importamos de 24/outline solo para el ClockIcon\nimport { ClockIcon as HeroClockOutline } from '@heroicons/react/24/outline';\n\n// Importamos de 20/solid para los demás iconos\nimport {\n MagnifyingGlassIcon as HeroMagnifyingGlass,\n ChevronRightIcon as HeroChevronRight,\n ChevronLeftIcon as HeroChevronLeft,\n Cog6ToothIcon as HeroCog6Tooth,\n ShoppingCartIcon as HeroShoppingCart,\n CubeIcon as HeroCube,\n DocumentIcon as HeroDocument,\n} from '@heroicons/react/20/solid';\n\n/**\n * Iconos estándar para NavigationRailCommercial\n * Basados en Heroicons 20x20 solid (excepto ClockIcon que es 24x24 outline)\n * Consistente con NavigationRailTypes\n *\n * @see docs/icons.md - Sistema de iconos del proyecto\n */\n\nexport const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroMagnifyingGlass className={className} aria-hidden=\"true\" />\n);\n\nexport const ChevronRightIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroChevronRight className={className} aria-hidden=\"true\" />\n);\n\nexport const ChevronLeftIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroChevronLeft className={className} aria-hidden=\"true\" />\n);\n\nexport const Cog6ToothIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroCog6Tooth className={className} aria-hidden=\"true\" />\n);\n\nexport const ShoppingCartIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroShoppingCart className={className} aria-hidden=\"true\" />\n);\n\nexport const CubeIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroCube className={className} aria-hidden=\"true\" />\n);\n\nexport const DocumentIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroDocument className={className} aria-hidden=\"true\" />\n);\n\nexport const ClockIcon: React.FC<{ className?: string }> = ({ className = 'size-4' }) => (\n <HeroClockOutline className={className} aria-hidden=\"true\" />\n);\n","import React, { useState } from 'react';\nimport type {\n NavigationRailCommercialProps,\n NavigationRailCommercialMenuItem,\n} from './NavigationRailCommercial.types';\nimport { NavigationRailTypes } from '../NavigationRailTypes/NavigationRailTypes';\nimport { NavigationRailPanel } from '../NavigationRailPanel/NavigationRailPanel';\nimport { MagnifyingGlassIcon } from './icons';\n\n/**\n * NavigationRailCommercial del sistema de diseño Siesa\n *\n * Componente de navegación lateral especializado para aplicaciones comerciales\n * que combina NavigationRailTypes y NavigationRailPanel para crear una experiencia\n * de navegación completa con múltiples estados:\n *\n * - **Collapsed**: Barra compacta de 80px con solo iconos\n * - **Expanded**: Barra expandida de 215px con labels\n * - **Hover**: Panel lateral con submenú del item (se muestra al hacer hover)\n * - **Searcher**: Panel lateral con búsqueda y recientes\n *\n * **Características:**\n * - Reutiliza NavigationRailTypes para la barra lateral principal\n * - Reutiliza NavigationRailPanel para los paneles de hover y búsqueda\n * - Gestión de estado integrada (collapsed, expanded, hover, searcher)\n * - Dark mode completo en todos los elementos\n * - Focus rings adaptativos\n * - Transiciones suaves entre estados\n *\n * **Especificaciones de Figma:**\n * - NavigationRailTypes: 80px (collapsed) / 215px (expanded)\n * - NavigationRailPanel: 248px width, altura variable\n * - Posición panel: left 80px desde el rail\n * - Transiciones: 300ms ease-in-out\n *\n * **Estructura:**\n * ```\n * ┌────────────────────────────────────┐\n * │ NavigationRailCommercial │\n * │ ┌──────────┬─────────────────┐ │\n * │ │ Rail │ Panel │ │\n * │ │ Types │ (hover/search) │ │\n * │ │ (base) │ (opcional) │ │\n * │ └──────────┴─────────────────┘ │\n * └────────────────────────────────────┘\n * ```\n *\n * **Estados de Items:**\n * - `default`: Sin interacción\n * - `hover`: Muestra panel con submenú (si tiene children)\n * - `active`: Item seleccionado, fondo custom-primary\n * - `disabled`: Opacity 50%, sin interacción\n *\n * **Colores (Light Mode):**\n * - Background rail: #ffffff (bg-primary)\n * - Background panel: #ffffff (bg-primary)\n * - Borders: #e4e4e7 (border-primary)\n * - Text: #18181b (content-primary)\n * - Icons: #a1a1aa (content-secondary)\n * - Search button: #0e79fd (primary-custom-600)\n *\n * **Colores (Dark Mode):**\n * - Background rail: #18181b (dark-bg-primary)\n * - Background panel: #18181b (dark-bg-primary)\n * - Borders: #71717a (dark-border-primary)\n * - Text: #f4f4f5 (dark-content-primary)\n * - Icons: #a1a1aa (content-secondary)\n *\n * **Tipografía:**\n * - Items: Paragraph/Small (14px Regular, line-height 20px)\n * - Panel heading: Label/Small (14px Bold)\n * - Section headings: Paragraph/Tiny (12px Regular)\n *\n * **Implementación de Estados:**\n * - `collapsed` + hover en item → state='hover' + muestra panel\n * - `collapsed` + click en search → state='searcher' + muestra panel búsqueda\n * - `expanded` → NavigationRailTypes expandido con Input integrado\n * - Click en \"Colapsar\" → vuelve a collapsed\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see ../NavigationRailTypes - Componente reutilizado para barra lateral\n * @see ../NavigationRailPanel - Componente reutilizado para paneles\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6146-34487\n *\n * @example\n * ```tsx\n * // Uso básico en modo collapsed\n * const items = [\n * {\n * id: 'admin',\n * label: 'Administración',\n * icon: <Cog6ToothIcon />,\n * isCollapsible: true,\n * children: [\n * { id: 'users', label: 'Usuarios' },\n * { id: 'roles', label: 'Roles' },\n * ],\n * },\n * {\n * id: 'sales',\n * label: 'Ventas',\n * icon: <ShoppingCartIcon />,\n * },\n * ];\n *\n * <NavigationRailCommercial\n * state=\"collapsed\"\n * items={items}\n * onItemClick={(item) => console.log('Clicked:', item.label)}\n * onItemHover={(item) => console.log('Hover:', item.label)}\n * />\n *\n * // Uso con control de estado externo\n * const [state, setState] = useState('collapsed');\n *\n * <NavigationRailCommercial\n * state={state}\n * items={items}\n * onStateChange={setState}\n * />\n * ```\n *\n * @see NavigationRailCommercial.types.ts - Props e interfaces\n */\nexport const NavigationRailCommercial = React.forwardRef<\n HTMLDivElement,\n NavigationRailCommercialProps\n>(\n (\n {\n state = 'collapsed',\n items = [],\n onStateChange,\n onItemClick,\n onItemHover,\n labels = {},\n className,\n showSearchButton = true,\n },\n ref\n ) => {\n // Estado local para controlar el panel\n const [showPanel, setShowPanel] = useState(false);\n const [panelType, setPanelType] = useState<'hover' | 'searcher'>('hover');\n const [hoveredItem, setHoveredItem] = useState<NavigationRailCommercialMenuItem | null>(null);\n\n // Labels con valores por defecto\n const finalLabels = {\n searchPlaceholder: labels.searchPlaceholder ?? 'Buscar módulo',\n collapseButton: labels.collapseButton ?? 'Colapsar',\n recentSection: labels.recentSection ?? 'Recientes',\n frequentSection: labels.frequentSection ?? 'Opciones frecuentes',\n };\n\n // Controlar el estado collapsed/expanded\n const isCollapsed = state === 'collapsed' || state === 'hover' || state === 'searcher';\n\n // Manejar cambio de estado collapsed/expanded\n const handleCollapsedChange = (collapsed: boolean) => {\n const newState = collapsed ? 'collapsed' : 'expanded';\n onStateChange?.(newState);\n };\n\n // Manejar click en item\n const handleItemClick = (index: number) => {\n const commercialItem = items[index];\n if (commercialItem) {\n onItemClick?.(commercialItem);\n }\n };\n\n // Manejar hover en item desde NavigationRailTypes\n const handleItemHoverFromRail = (index: number) => {\n const commercialItem = items[index];\n if (commercialItem && isCollapsed) {\n handleItemHover(commercialItem);\n }\n };\n\n // Manejar hover en item (solo en modo collapsed)\n const handleItemHover = (item: NavigationRailCommercialMenuItem) => {\n if (isCollapsed && item.isCollapsible && item.children) {\n setHoveredItem(item);\n setPanelType('hover');\n setShowPanel(true);\n onItemHover?.(item);\n }\n };\n\n // Manejar click en botón de búsqueda\n\n\n // Convertir items a formato NavigationRailTypes\n const railItems = items.map((item) => ({\n id: item.id,\n label: item.label,\n icon: item.icon,\n active: item.active,\n disabled: item.disabled,\n badge: item.badge,\n badgeCount: item.badgeCount,\n children: item.children,\n defaultOpen: item.defaultOpen,\n onClick: () => {\n item.onClick?.();\n },\n }));\n\n return (\n <div\n ref={ref}\n className={`relative flex items-start h-full ${className || ''}`}\n data-testid=\"navigation-rail-commercial\"\n >\n {/* NavigationRailTypes - Barra lateral principal */}\n <NavigationRailTypes\n collapsed={isCollapsed}\n items={railItems}\n showRecentButton={false}\n showSearchButton={showSearchButton}\n onCollapsedChange={handleCollapsedChange}\n onItemClick={handleItemClick}\n onItemHover={handleItemHoverFromRail}\n labels={{\n searchButton: finalLabels.searchPlaceholder,\n searchPlaceholder: finalLabels.searchPlaceholder,\n collapseButton: finalLabels.collapseButton,\n }}\n />\n\n {/* NavigationRailPanel - Panel lateral (hover o searcher) */}\n {showPanel && isCollapsed && (\n <div\n className=\"absolute left-[80px] top-0 z-10 h-full\"\n onMouseLeave={() => setShowPanel(false)}\n >\n <NavigationRailPanel\n height=\"100%\"\n width={248}\n showHeading={panelType === 'hover' && hoveredItem !== null}\n heading={\n panelType === 'hover' && hoveredItem\n ? {\n label: hoveredItem.label,\n iconName: 'cog-6-tooth',\n showDescription: false,\n showAction: false,\n }\n : undefined\n }\n showSearch={panelType === 'searcher'}\n search={{\n placeholder: finalLabels.searchPlaceholder,\n }}\n sections={\n panelType === 'hover' && hoveredItem?.children\n ? [\n {\n items: hoveredItem.children.map((child) => ({\n label: child.label,\n icon: child.icon,\n onClick: child.onClick,\n disabled: child.disabled,\n })),\n },\n ]\n : panelType === 'searcher'\n ? [\n {\n heading: finalLabels.recentSection,\n items: [\n {\n label: 'Configuración',\n icon: <MagnifyingGlassIcon className=\"size-4\" />,\n },\n ],\n },\n {\n heading: finalLabels.frequentSection,\n items: [\n {\n label: 'Item',\n },\n ],\n },\n ]\n : []\n }\n />\n </div>\n )}\n </div>\n );\n }\n);\n\nNavigationRailCommercial.displayName = 'NavigationRailCommercial';\n\nexport default NavigationRailCommercial;\n","import React, { useState } from 'react';\nimport type {\n TableProps,\n TableHeaderProps,\n TableCellProps,\n SortDirection,\n PaginationProps,\n} from './Table.types';\n\n/**\n * Iconos para sort\n */\nconst ChevronUpIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"transition-transform\"\n >\n <path\n d=\"M12 10L8 6L4 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"transition-transform\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * Iconos para paginación\n */\nconst ArrowLeftIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14 8H2M2 8L6.5 3.5M2 8L6.5 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2 8H14M14 8L9.5 3.5M14 8L9.5 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * TableHeader - Componente para el header de una columna\n */\nconst TableHeader = <T,>({\n column,\n sortable,\n sorted,\n sortDirection,\n onSort,\n}: TableHeaderProps<T>) => {\n // Clases base del header\n const baseClasses = `\n flex\n items-center\n gap-3\n px-6\n py-2.5\n min-h-[40px]\n border-b\n border-border-primary\n dark:border-dark-border-primary\n transition-colors\n duration-150\n `;\n\n // Clases según sortable\n const sortableClasses = sortable\n ? `\n cursor-pointer\n hover:bg-background-secondary\n dark:hover:bg-dark-bg-primary/50\n select-none\n `\n : '';\n\n // Clases de alineación\n const alignClasses = {\n left: 'justify-start',\n center: 'justify-center',\n right: 'justify-end',\n };\n\n const combinedClasses = [baseClasses, sortableClasses, alignClasses[column.align || 'left']]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div\n className={combinedClasses}\n onClick={sortable ? onSort : undefined}\n role={sortable ? 'button' : undefined}\n tabIndex={sortable ? 0 : undefined}\n onKeyDown={\n sortable\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSort();\n }\n }\n : undefined\n }\n style={{ width: column.width }}\n >\n {/* Texto del header */}\n <span\n className=\"\n text-sm\n font-bold\n text-content-secondary\n dark:text-content-secondary\n overflow-ellipsis\n overflow-hidden\n whitespace-nowrap\n \"\n >\n {column.header}\n </span>\n\n {/* Iconos de sort */}\n {sortable && (\n <span className=\"flex-shrink-0 text-content-secondary dark:text-content-secondary\">\n {sorted && sortDirection === 'asc' && <ChevronUpIcon />}\n {sorted && sortDirection === 'desc' && <ChevronDownIcon />}\n {!sorted && (\n <div className=\"w-4 h-4\" />\n )}\n </span>\n )}\n </div>\n );\n};\n\n/**\n * TableCell - Componente para una celda de datos\n */\nconst TableCell: React.FC<TableCellProps & { isStriped?: boolean; rowIndex?: number }> = ({\n children,\n align = 'left',\n width,\n isStriped = false,\n rowIndex = 0,\n}) => {\n // Clases de alineación\n const alignClasses = {\n left: 'justify-start text-left',\n center: 'justify-center text-center',\n right: 'justify-end text-right',\n };\n\n // Fondo zebra striping (filas pares tienen fondo)\n const stripedBg = isStriped && rowIndex % 2 === 1\n ? 'bg-background-secondary dark:bg-dark-bg-primary/30'\n : '';\n\n return (\n <div\n className={`\n flex\n flex-col\n ${alignClasses[align]}\n px-6\n py-4\n min-h-[56px]\n border-b\n border-border-secondary\n dark:border-dark-border-primary\n ${stripedBg}\n `}\n style={{ width }}\n >\n <span\n className=\"\n text-sm\n text-content-primary\n dark:text-dark-content-primary\n overflow-ellipsis\n overflow-hidden\n w-full\n \"\n >\n {children}\n </span>\n </div>\n );\n};\n\n\n/**\n * Pagination - Componente de paginación\n */\nconst Pagination: React.FC<PaginationProps> = ({\n currentPage,\n totalPages,\n onPageChange,\n previousLabel = 'Anterior',\n nextLabel = 'Siguiente',\n}) => {\n // Generar array de números de página para mostrar\n const getPageNumbers = () => {\n const pages: (number | string)[] = [];\n const maxVisible = 7; // Máximo de botones visibles\n\n if (totalPages <= maxVisible) {\n // Si hay pocas páginas, mostrar todas\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Lógica para mostrar: 1 2 3 ... 65 66\n pages.push(1);\n\n if (currentPage <= 3) {\n pages.push(2, 3);\n } else if (currentPage >= totalPages - 2) {\n pages.push('...');\n pages.push(totalPages - 2, totalPages - 1);\n } else {\n pages.push('...');\n pages.push(currentPage);\n pages.push('...');\n }\n\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n return (\n <div className=\"flex items-center justify-between w-full h-9\">\n {/* Botón Anterior */}\n <button\n onClick={() => currentPage > 1 && onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n className=\"\n flex\n items-center\n gap-3\n px-3\n py-2\n rounded-md\n text-sm\n font-bold\n text-primary-custom-600\n dark:text-primary-custom-600\n hover:bg-blue-50\n dark:hover:bg-blue-900/20\n disabled:opacity-50\n disabled:cursor-not-allowed\n transition-colors\n duration-150\n \"\n >\n <ArrowLeftIcon />\n <span>{previousLabel}</span>\n </button>\n\n {/* Números de página */}\n <div className=\"flex items-center gap-0\">\n {pageNumbers.map((page, index) => {\n if (page === '...') {\n return (\n <div\n key={`ellipsis-${index}`}\n className=\"\n flex\n items-center\n justify-center\n px-3\n py-2\n text-sm\n font-bold\n text-primary-custom-600\n dark:text-primary-custom-600\n \"\n >\n {page}\n </div>\n );\n }\n\n const isActive = page === currentPage;\n\n return (\n <button\n key={page}\n onClick={() => onPageChange(page as number)}\n className={`\n flex\n items-center\n justify-center\n px-3\n py-2\n rounded-md\n text-sm\n font-bold\n text-primary-custom-600\n dark:text-primary-custom-600\n transition-colors\n duration-150\n ${\n isActive\n ? 'bg-blue-100 dark:bg-blue-900/30'\n : 'hover:bg-blue-50 dark:hover:bg-blue-900/20'\n }\n `}\n >\n {page}\n </button>\n );\n })}\n </div>\n\n {/* Botón Siguiente */}\n <button\n onClick={() => currentPage < totalPages && onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n className=\"\n flex\n items-center\n gap-3\n px-3\n py-2\n rounded-md\n text-sm\n font-bold\n text-primary-custom-600\n dark:text-primary-custom-600\n hover:bg-blue-50\n dark:hover:bg-blue-900/20\n disabled:opacity-50\n disabled:cursor-not-allowed\n transition-colors\n duration-150\n \"\n >\n <span>{nextLabel}</span>\n <ArrowRightIcon />\n </button>\n </div>\n );\n};\n\n/**\n * Table - Componente principal de tabla\n *\n * Características implementadas:\n * - Definición de columnas flexible con accessor y render custom\n * - Sorting en columnas (controlado o no controlado)\n * - Variantes: basic, fullWidth, striped, grid\n * - Dark mode completo en todos los estados\n * - Estados de loading y empty\n * - Filas clickeables\n * - Accesibilidad con roles y keyboard navigation\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto y generics\n * - Accesibilidad con ARIA labels y keyboard support\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label/Small para headers, Paragraph/Small para cells)\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * // Uso básico\n * <Table\n * title=\"Usuarios\"\n * columns={[\n * { header: 'Nombre', accessor: 'name' },\n * { header: 'Email', accessor: 'email' },\n * { header: 'Rol', accessor: 'role', sortable: true },\n * ]}\n * data={users}\n * />\n *\n * // Con render custom\n * <Table\n * columns={[\n * {\n * header: 'Estado',\n * accessor: 'status',\n * render: (value) => (\n * <Badge color={value === 'active' ? 'green' : 'red'}>\n * {value}\n * </Badge>\n * ),\n * },\n * ]}\n * data={data}\n * />\n *\n * // Variante striped\n * <Table\n * variant=\"striped\"\n * columns={columns}\n * data={data}\n * />\n * ```\n */\nexport const Table = <T extends Record<string, any>>({\n title,\n columns,\n data,\n variant = 'basic',\n showBorder = true,\n showShadow = true,\n // onRowClick, // TODO: Implement row click functionality\n onSort,\n sortColumn: externalSortColumn,\n sortDirection: externalSortDirection,\n fullWidth = false,\n emptyMessage = 'No hay datos disponibles',\n loading = false,\n loadingRows = 5,\n pagination,\n className = '',\n id,\n}: TableProps<T>) => {\n // ===== ESTADO INTERNO DE SORT =====\n const [internalSortColumn, setInternalSortColumn] = useState<keyof T | string | null>(null);\n const [internalSortDirection, setInternalSortDirection] = useState<SortDirection>(null);\n\n // Usar sort externo si está controlado, sino usar interno\n const sortColumn = externalSortColumn !== undefined ? externalSortColumn : internalSortColumn;\n const sortDirection = externalSortDirection !== undefined ? externalSortDirection : internalSortDirection;\n\n // ===== MANEJAR SORT =====\n const handleSort = (columnAccessor: keyof T | string) => {\n let newDirection: SortDirection = 'asc';\n\n // Si ya está ordenado por esta columna, cambiar dirección\n if (sortColumn === columnAccessor) {\n if (sortDirection === 'asc') {\n newDirection = 'desc';\n } else if (sortDirection === 'desc') {\n newDirection = null;\n }\n }\n\n // Si sort es controlado, llamar callback\n if (onSort) {\n onSort(columnAccessor, newDirection);\n } else {\n // Sino, actualizar estado interno\n setInternalSortColumn(newDirection ? columnAccessor : null);\n setInternalSortDirection(newDirection);\n }\n };\n\n // ===== OBTENER VALOR DE CELDA =====\n const getCellValue = (row: T, accessor: keyof T | ((row: T) => any)) => {\n if (typeof accessor === 'function') {\n return accessor(row);\n }\n return row[accessor];\n };\n\n // ===== CLASES DEL CONTAINER =====\n const containerBaseClasses = `\n flex\n flex-col\n gap-4\n bg-white\n dark:bg-dark-bg-primary\n rounded-xl\n transition-all\n duration-150\n `;\n\n const containerBorderClasses = showBorder\n ? 'border border-border-primary dark:border-dark-border-primary'\n : '';\n\n const containerShadowClasses = showShadow ? 'shadow-base' : '';\n\n const containerPaddingClasses = 'p-8';\n\n const containerWidthClasses = fullWidth || variant === 'fullWidth' ? 'w-full' : '';\n\n const containerClasses = [\n containerBaseClasses,\n containerBorderClasses,\n containerShadowClasses,\n containerPaddingClasses,\n containerWidthClasses,\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DE LA TABLA =====\n const tableGridClasses = variant === 'grid'\n ? `\n border\n border-border-primary\n dark:border-dark-border-primary\n rounded-lg\n overflow-hidden\n `\n : '';\n\n // ===== RENDER =====\n return (\n <div className={containerClasses} id={id}>\n {/* Título opcional */}\n {title && (\n <div className=\"flex items-center justify-center w-full\">\n <h3\n className=\"\n text-base\n font-bold\n text-content-primary\n dark:text-dark-content-primary\n overflow-ellipsis\n overflow-hidden\n whitespace-nowrap\n \"\n >\n {title}\n </h3>\n </div>\n )}\n\n {/* Tabla */}\n <div className={`flex w-full overflow-x-auto ${tableGridClasses}`}>\n {/* Columnas */}\n {columns.map((column, colIndex) => {\n const accessor = typeof column.accessor === 'function'\n ? `column_${colIndex}`\n : String(column.accessor);\n\n return (\n <div key={accessor} className=\"flex flex-col flex-1 min-w-0\">\n {/* Header de la columna */}\n <TableHeader\n column={column}\n sortable={column.sortable || false}\n sorted={sortColumn === accessor}\n sortDirection={sortColumn === accessor ? sortDirection : null}\n onSort={() => handleSort(accessor)}\n />\n\n {/* Loading skeleton */}\n {loading && (\n <>\n {Array.from({ length: loadingRows }).map((_, rowIndex) => (\n <TableCell\n key={`loading-${rowIndex}`}\n align={column.align}\n width={column.width}\n isStriped={variant === 'striped'}\n rowIndex={rowIndex}\n >\n <div\n className=\"\n h-4\n bg-background-secondary\n dark:bg-dark-border-primary\n rounded\n animate-pulse\n \"\n />\n </TableCell>\n ))}\n </>\n )}\n\n {/* Datos reales */}\n {!loading && data.length > 0 && (\n <>\n {data.map((row, rowIndex) => {\n const value = getCellValue(row, column.accessor);\n const content = column.render\n ? column.render(value, row, rowIndex)\n : value;\n\n return (\n <TableCell\n key={rowIndex}\n align={column.align}\n width={column.width}\n isStriped={variant === 'striped'}\n rowIndex={rowIndex}\n >\n {content}\n </TableCell>\n );\n })}\n </>\n )}\n\n {/* Estado empty */}\n {!loading && data.length === 0 && colIndex === 0 && (\n <div\n className=\"\n flex\n items-center\n justify-center\n px-6\n py-12\n text-sm\n text-content-secondary\n dark:text-content-secondary\n \"\n style={{ gridColumn: `1 / ${columns.length + 1}` }}\n >\n {emptyMessage}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Paginación */}\n {pagination && (\n <Pagination\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n onPageChange={pagination.onPageChange}\n previousLabel={pagination.previousLabel}\n nextLabel={pagination.nextLabel}\n />\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport type { TabProps, TabsProps } from './Tabs.types';\n\n/**\n * Componente Tab individual del sistema de diseño Siesa\n *\n * Representa un único tab dentro de un grupo de tabs. Incluye soporte para:\n * - Estado activo/inactivo con indicador visual (línea inferior)\n * - Icono opcional a la izquierda del texto\n * - Badge de notificación con contador\n * - Estados hover, focus y disabled\n * - Dark mode completo\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <Tab\n * label=\"Inicio\"\n * active={true}\n * icon={<HomeIcon />}\n * badge={3}\n * onClick={() => setActiveTab('home')}\n * />\n * ```\n */\nexport const Tab: React.FC<TabProps> = ({\n label,\n active = false,\n icon,\n badge,\n disabled = false,\n onClick,\n className = '',\n ariaLabel,\n}) => {\n // ===== CLASES BASE DEL BOTÓN =====\n // El contenedor es relativo para posicionar el indicador absoluto\n const baseClasses = `\n relative\n flex\n flex-col\n items-center\n cursor-pointer\n outline-none\n transition-all\n duration-150\n p-0\n border-0\n bg-transparent\n `;\n\n // ===== CLASES DE FOCUS =====\n // El focus outline se desactiva aquí, el shadow se aplica al Content div\n const focusClasses = '';\n\n // ===== CLASES DE DISABLED =====\n const disabledClasses = disabled\n ? 'opacity-50 cursor-not-allowed pointer-events-none'\n : '';\n\n // ===== CLASES DEL CONTENIDO INTERIOR =====\n // El hover y focus background se aplica aquí\n const contentBaseClasses = `\n flex\n items-center\n justify-center\n gap-1\n p-2\n rounded-lg\n overflow-hidden\n transition-all\n duration-150\n w-full\n `;\n\n // ===== CLASES DE ESTADO HOVER Y FOCUS PARA CONTENIDO =====\n // Light: bg-[rgba(0,0,0,0.03)], Dark: bg-white/5\n // Según Figma, tanto hover como focus tienen el background overlay\n // El shadow de focus también se aplica aquí (al Content div), no al botón\n const contentStateClasses = disabled\n ? ''\n : `\n group-hover:bg-[rgba(0,0,0,0.03)]\n group-focus-visible:bg-[rgba(0,0,0,0.03)]\n group-focus-visible:shadow-lg\n dark:group-hover:bg-white/5\n dark:group-focus-visible:bg-white/5\n dark:group-focus-visible:shadow-2xl\n `;\n\n // ===== CLASES DE TEXTO =====\n // Activo: primary-custom-600 (#0e79fd), Inactivo: content-primary (#18181b)\n const textClasses = active\n ? `\n text-primary-custom-600\n dark:text-primary-custom-600\n `\n : `\n text-content-primary\n dark:text-dark-content-primary\n `;\n\n // ===== CLASES DE ICONO =====\n // El icono hereda el color del texto\n const iconClasses = `\n w-3\n h-3\n flex-shrink-0\n `;\n\n // ===== CLASES DEL BADGE =====\n // Activo: bg-primary-custom-600 (#0e79fd), Inactivo: bg-content-primary (#18181b)\n const badgeClasses = active\n ? `\n bg-primary-custom-600\n dark:bg-primary-custom-600\n `\n : `\n bg-content-primary\n dark:bg-dark-content-primary\n `;\n\n // ===== CLASES DEL INDICADOR INFERIOR =====\n // Solo visible cuando está activo, 2px de alto, rounded-full\n // Posicionado al fondo del contenedor de Tabs (alineado con el border)\n const indicatorClasses = active\n ? `\n absolute\n -bottom-2.5\n left-0\n right-0\n h-0.5\n rounded-full\n bg-primary-custom-600\n dark:bg-primary-custom-600\n z-10\n `\n : 'hidden';\n\n // ===== COMBINAR CLASES DEL BOTÓN =====\n const finalClasses = [\n baseClasses,\n focusClasses,\n disabledClasses,\n 'group', // Para usar group-hover y group-focus-visible\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== COMBINAR CLASES DEL CONTENIDO =====\n const contentFinalClasses = [\n contentBaseClasses,\n contentStateClasses,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n aria-disabled={disabled}\n aria-label={ariaLabel || label}\n tabIndex={disabled ? -1 : 0}\n className={finalClasses}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n >\n {/* Contenido del Tab */}\n <div className={contentFinalClasses}>\n {/* Icono (opcional) */}\n {icon && (\n <span className={`${iconClasses} ${textClasses}`.trim()}>\n {icon}\n </span>\n )}\n\n {/* Texto */}\n <span\n className={`\n text-sm\n font-bold\n leading-5\n whitespace-nowrap\n ${textClasses}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {label}\n </span>\n\n {/* Badge de notificación (opcional) */}\n {badge !== undefined && badge > 0 && (\n <span\n className={`\n flex\n items-center\n justify-center\n h-3\n min-w-[12px]\n px-0.5\n rounded-sm\n text-xs\n font-normal\n leading-4\n text-primary-inverse-content\n dark:text-dark-bg-primary\n ${badgeClasses}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n aria-label={`${badge} notificaciones`}\n >\n {badge > 99 ? '99+' : badge}\n </span>\n )}\n </div>\n\n {/* Indicador inferior (línea activa) */}\n <div className={indicatorClasses} />\n </button>\n );\n};\n\n/**\n * Componente Tabs contenedor del sistema de diseño Siesa\n *\n * Agrupa múltiples tabs permitiendo navegación entre diferentes secciones.\n * Soporta modo controlado (con activeId y onChange) y no controlado (con defaultActiveId).\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA roles y keyboard navigation\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Modo controlado\n * const [activeTab, setActiveTab] = useState('home');\n *\n * <Tabs\n * items={[\n * { id: 'home', label: 'Inicio', icon: <HomeIcon /> },\n * { id: 'profile', label: 'Perfil', badge: 3 },\n * { id: 'settings', label: 'Configuración' },\n * ]}\n * activeId={activeTab}\n * onChange={setActiveTab}\n * />\n *\n * // Modo no controlado\n * <Tabs\n * items={[...]}\n * defaultActiveId=\"home\"\n * />\n * ```\n */\nexport const Tabs: React.FC<TabsProps> = ({\n items,\n activeId,\n defaultActiveId,\n onChange,\n className = '',\n fullWidth = false,\n size = 'base',\n showBorder = true,\n}) => {\n // Estado interno para modo no controlado\n const [internalActiveId, setInternalActiveId] = useState(\n defaultActiveId || (items.length > 0 ? items[0].id : '')\n );\n\n // Determinar si es controlado o no controlado\n const isControlled = activeId !== undefined;\n const currentActiveId = isControlled ? activeId : internalActiveId;\n\n // Handler para cambio de tab\n const handleTabClick = (id: string) => {\n if (!isControlled) {\n setInternalActiveId(id);\n }\n onChange?.(id);\n };\n\n // ===== CLASES DE TAMAÑO =====\n const sizeClasses = {\n sm: 'gap-0',\n base: 'gap-1',\n lg: 'gap-2',\n };\n\n // ===== CLASES DEL CONTENEDOR =====\n // El padding-bottom (pb-2.5 = 10px) deja espacio para el indicador del tab activo\n // El border-b se dibuja debajo del padding, alineándose con el indicador\n const containerClasses = `\n flex\n items-end\n pb-2.5\n ${sizeClasses[size]}\n ${fullWidth ? 'w-full' : ''}\n ${showBorder ? 'border-b border-border-primary dark:border-dark-border-primary' : ''}\n `;\n\n // ===== CLASES FULL WIDTH PARA ITEMS =====\n const itemWidthClass = fullWidth ? 'flex-1' : '';\n\n const finalClasses = [\n containerClasses,\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div\n role=\"tablist\"\n aria-label=\"Pestañas de navegación\"\n className={finalClasses}\n >\n {items.map((item) => (\n <Tab\n key={item.id}\n label={item.label}\n active={currentActiveId === item.id}\n icon={item.icon}\n badge={item.badge}\n disabled={item.disabled}\n onClick={() => handleTabClick(item.id)}\n className={itemWidthClass}\n />\n ))}\n </div>\n );\n};\n","/**\n * Iconos para el componente Navbar\n * Basados en Heroicons Micro (16x16px)\n */\n\nexport const ShoppingCartIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path d=\"M1.75 1.002a.75.75 0 1 0 0 1.5h1.035l1.38 5.514a2.75 2.75 0 0 0 2.658 2.048h5.355a2.75 2.75 0 0 0 2.658-2.048l.9-3.597a.75.75 0 0 0-.728-.919H4.655l-.22-.88A.75.75 0 0 0 3.71 2H1.75ZM5 13a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM11.5 13a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0Z\" />\n </svg>\n);\n\nexport const BellIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12 5a4 4 0 0 0-8 0v2.379a1.5 1.5 0 0 1-.44 1.06L2.294 9.707a1 1 0 0 0-.293.707V11a1 1 0 0 0 1 1h2a3 3 0 1 0 6 0h2a1 1 0 0 0 1-1v-.586a1 1 0 0 0-.293-.707L12.44 8.44A1.5 1.5 0 0 1 12 7.38V5Zm-5.5 7a1.5 1.5 0 0 0 3 0h-3Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const MagnifyingGlassIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const ChevronDownIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const ExclamationTriangleIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M6.701 2.25c.577-1 2.02-1 2.598 0l5.196 9a1.5 1.5 0 0 1-1.299 2.25H2.804a1.5 1.5 0 0 1-1.3-2.25l5.197-9ZM8 4a.75.75 0 0 1 .75.75v3a.75.75 0 1 1-1.5 0v-3A.75.75 0 0 1 8 4Zm0 7.25a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const NotificationDot = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const ArrowLeftStartOnRectangleIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M14 4.75A2.75 2.75 0 0 0 11.25 2h-3A2.75 2.75 0 0 0 5.5 4.75v.5a.75.75 0 0 0 1.5 0v-.5c0-.69.56-1.25 1.25-1.25h3c.69 0 1.25.56 1.25 1.25v6.5c0 .69-.56 1.25-1.25 1.25h-3c-.69 0-1.25-.56-1.25-1.25v-.5a.75.75 0 0 0-1.5 0v.5A2.75 2.75 0 0 0 8.25 14h3A2.75 2.75 0 0 0 14 11.25v-6.5Zm-9.47.47a.75.75 0 0 0-1.06 0L1.22 7.47a.75.75 0 0 0 0 1.06l2.25 2.25a.75.75 0 1 0 1.06-1.06l-.97-.97h5.69a.75.75 0 0 0 0-1.5H3.56l.97-.97a.75.75 0 0 0 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { NavbarProps } from './Navbar.types';\nimport { Badge } from '../Badge/Badge';\nimport {\n ShoppingCartIcon,\n BellIcon,\n MagnifyingGlassIcon,\n ChevronDownIcon,\n ExclamationTriangleIcon,\n ArrowLeftStartOnRectangleIcon,\n} from './icons';\n\n/**\n * Componente Navbar del sistema de diseño Siesa\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * Barra de navegación principal con soporte completo para responsive y dark mode.\n * Incluye logo, nombre de producto, badge de ambiente, botones de acción y dropdown de usuario.\n *\n * **Variantes de dispositivo:**\n * - `responsive`: Se adapta automáticamente al viewport (por defecto)\n * - `desktop`: Versión completa (1360x64px) con todos los elementos\n * - `tablet`: Versión tablet (1024x64px) con elementos reducidos\n * - `mobile`: Versión simplificada (428x40px) con logo icono y avatar circular\n *\n * **Elementos incluidos:**\n * - Botón de navegación (solo desktop/tablet) - Usa shadow-button-inset\n * - Logo del negocio (solo desktop/tablet)\n * - Dividers verticales (solo desktop/tablet)\n * - Logo Siesa (completo en desktop/tablet, icono en mobile)\n * - Nombre del producto (solo desktop/tablet) - Heading/Tiny (20px Bold)\n * - Badge de ambiente con icono de advertencia (yellow)\n * - Botones de acción (search solo mobile, cart, notifications)\n * - Dropdown de usuario con avatar, nombre y email\n * - Logo Siesa trailing (solo desktop)\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación (NO colores hardcodeados)\n * - Focus rings adaptativos para light y dark mode\n * - Type safety con TypeScript estricto\n * - Responsive design con breakpoints md: y lg:\n * - Tipografía del sistema: Heading/Tiny, Paragraph/Small, Paragraph/Tiny\n * - Spacing del sistema (4px, 8px, 12px, 16px, 32px)\n *\n * @see docs/colors.md - Sistema de colores y tokens dark mode\n * @see docs/typography.md - Sistema tipográfico (Heading, Paragraph)\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras (button-inset)\n *\n * @example\n * ```tsx\n * <Navbar\n * productName=\"Mi Producto\"\n * environmentBadge=\"Ambiente de Pruebas\"\n * userDropdown={{\n * avatar: \"/path/to/avatar.jpg\",\n * name: \"Juan Pérez\",\n * email: \"juan@ejemplo.com\",\n * }}\n * notifications={{\n * cart: 99,\n * bell: true,\n * }}\n * onNavigationClick={() => router.back()}\n * onCartClick={() => openCart()}\n * onNotificationsClick={() => openNotifications()}\n * />\n * ```\n */\nexport const Navbar: React.FC<NavbarProps> = ({\n logo,\n productName = 'Nombre Producto',\n environmentBadge,\n userDropdown,\n actions,\n notifications,\n className = '',\n variant = 'responsive',\n hideActionButtons = false,\n leadingAction,\n siesaLogo,\n showBusinessLogo = false,\n showSiesaLogoLeading = true,\n showSiesaLogoTrailing = false,\n onNavigationClick,\n onSearchClick,\n onCartClick,\n onNotificationsClick,\n}) => {\n // ===== CLASES COMUNES PARA BOTONES DE ACCIÓN =====\n const actionButtonClasses = `\n box-border\n flex\n flex-col\n items-center\n justify-center\n p-1\n relative\n rounded-md\n shrink-0\n text-primary-custom-600\n hover:bg-background-secondary\n active:scale-95\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:text-primary-custom-600\n dark:hover:bg-dark-bg-secondary\n dark:active:scale-95\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n transition-all\n duration-150\n `;\n\n // ===== CLASES PARA BOTÓN DE NAVEGACIÓN PRIMARIO =====\n const navigationButtonClasses = `\n bg-primary-custom-600\n text-primary-inverse-content\n border\n border-primary-custom-600\n shadow-button-inset\n hover:bg-primary-custom-500\n active:scale-95\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:bg-dark-bg-inverse\n dark:text-dark-content-inverse\n dark:border-dark-bg-inverse\n dark:hover:bg-dark-bg-inverse/90\n dark:active:scale-95\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n box-border\n flex\n flex-col\n items-center\n justify-center\n p-3\n relative\n rounded-md\n shrink-0\n transition-all\n duration-150\n `;\n\n // ===== HELPER: Es mobile (variante o responsive en mobile breakpoint) =====\n const isMobile = variant === 'mobile';\n const isDesktop = variant === 'desktop';\n const isTablet = variant === 'tablet';\n const isResponsive = variant === 'responsive';\n\n // ===== BOTÓN DE NAVEGACIÓN =====\n const NavigationButton = () => {\n if (isMobile) return null;\n\n const buttonContent = (\n <div className=\"overflow-hidden relative shrink-0 w-4 h-4\">\n <ArrowLeftStartOnRectangleIcon />\n </div>\n );\n\n if (isDesktop || isTablet) {\n return (\n <button\n className={navigationButtonClasses}\n aria-label=\"Volver\"\n onClick={onNavigationClick}\n >\n {buttonContent}\n </button>\n );\n }\n\n // Responsive: Solo visible en md: y superiores\n return (\n <button\n className={`hidden md:flex ${navigationButtonClasses}`}\n aria-label=\"Volver\"\n onClick={onNavigationClick}\n >\n {buttonContent}\n </button>\n );\n };\n\n // ===== BUSINESS LOGO (Logo del cliente/producto) =====\n // Solo se muestra si showBusinessLogo es true\n const BusinessLogo = () => {\n if (isMobile || !showBusinessLogo) return null;\n\n const logoContent = (\n <img\n src=\"/,Business Logo.png\"\n alt=\"Business Logo\"\n className=\"w-full h-full object-contain\"\n />\n );\n\n if (isDesktop) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[168px] h-[30px]\">\n {logoContent}\n </div>\n );\n }\n\n if (isTablet) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[140px] h-[25px]\">\n {logoContent}\n </div>\n );\n }\n\n // Responsive: Visible en md: con tamaño desktop, lg: con tamaño completo\n return (\n <div className=\"hidden md:block overflow-hidden relative shrink-0 w-[140px] lg:w-[168px] h-[25px] lg:h-[30px]\">\n {logoContent}\n </div>\n );\n };\n\n // ===== SIESA LOGO (Logo de Siesa - Leading) =====\n // Se controla con showSiesaLogoLeading\n // En mobile siempre se muestra el icono de Siesa en leading\n const SiesaLogoLeading = () => {\n const logoFull = (\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-full h-full object-contain\"\n />\n );\n\n const logoMobile = (\n <img\n src=\"/siesa_logo_mobile.png\"\n alt=\"Siesa\"\n className=\"w-full h-full object-contain\"\n />\n );\n\n // En mobile siempre se muestra el icono de Siesa\n if (isMobile) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[30px] h-[30px]\">\n {logoMobile}\n </div>\n );\n }\n\n // En desktop/tablet: Se controla con showSiesaLogoLeading\n if (!showSiesaLogoLeading) return null;\n\n if (isDesktop) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[120px] h-[30px]\">\n {logoFull}\n </div>\n );\n }\n\n if (isTablet) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[100px] h-[25px]\">\n {logoFull}\n </div>\n );\n }\n\n // Responsive\n return (\n <>\n {/* Mobile: Logo icono (30x30) - siempre visible */}\n <div className=\"md:hidden overflow-hidden relative shrink-0 w-[30px] h-[30px]\">\n {logoMobile}\n </div>\n {/* Tablet/Desktop: Se controla con showSiesaLogoLeading */}\n {showSiesaLogoLeading && (\n <>\n {/* Tablet: Logo completo (100x25) */}\n <div className=\"hidden md:block lg:hidden overflow-hidden relative shrink-0 w-[100px] h-[25px]\">\n {logoFull}\n </div>\n {/* Desktop: Logo completo (120x30) */}\n <div className=\"hidden lg:block overflow-hidden relative shrink-0 w-[120px] h-[30px]\">\n {logoFull}\n </div>\n </>\n )}\n </>\n );\n };\n\n // ===== SIESA LOGO (Trailing) =====\n // Se controla con showSiesaLogoTrailing\n const SiesaLogoTrailing = () => {\n // Se controla con showSiesaLogoTrailing\n if (!showSiesaLogoTrailing || isMobile) return null;\n\n const logoFull = (\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-full h-full object-contain\"\n />\n );\n\n if (isDesktop) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[120px] h-[30px]\">\n {logoFull}\n </div>\n );\n }\n\n if (isTablet) {\n return (\n <div className=\"overflow-hidden relative shrink-0 w-[100px] h-[25px]\">\n {logoFull}\n </div>\n );\n }\n\n // Responsive: Visible en md: (tablet y desktop)\n return (\n <>\n {/* Tablet: Logo completo (100x25) */}\n <div className=\"hidden md:block lg:hidden overflow-hidden relative shrink-0 w-[100px] h-[25px]\">\n {logoFull}\n </div>\n {/* Desktop: Logo completo (120x30) */}\n <div className=\"hidden lg:block overflow-hidden relative shrink-0 w-[120px] h-[30px]\">\n {logoFull}\n </div>\n </>\n );\n };\n\n // ===== DIVIDER COMPONENT =====\n const Divider = ({ responsive = true }: { responsive?: boolean }) => {\n const dividerContent = (\n <div className=\"grow shrink-0 w-px min-h-px bg-border-primary dark:bg-dark-border-primary\" />\n );\n\n if (isMobile) return null;\n\n if (isDesktop || isTablet) {\n return (\n <div className=\"flex flex-col gap-2 h-8 items-start px-0 py-1 relative shrink-0\">\n {dividerContent}\n </div>\n );\n }\n\n // Responsive\n if (responsive) {\n return (\n <div className=\"hidden md:flex flex-col gap-2 h-8 items-start px-0 py-1 relative shrink-0\">\n {dividerContent}\n </div>\n );\n }\n\n return null;\n };\n\n // ===== PRODUCT NAME =====\n const ProductName = () => {\n if (isMobile || !productName) return null;\n\n const nameContent = (\n <p className=\"font-bold leading-7 text-xl text-content-primary dark:text-dark-content-primary tracking-[-0.5px] whitespace-nowrap\">\n {productName}\n </p>\n );\n\n if (isDesktop || isTablet) {\n return nameContent;\n }\n\n // Responsive: Solo visible en md:\n return (\n <p className=\"hidden md:block font-bold leading-7 text-xl text-content-primary dark:text-dark-content-primary tracking-[-0.5px] whitespace-nowrap\">\n {productName}\n </p>\n );\n };\n\n // ===== ENVIRONMENT BADGE =====\n const EnvironmentBadge = () => {\n if (!environmentBadge) return null;\n\n if (isMobile) {\n return (\n <Badge\n color=\"yellow\"\n leftIcon={<ExclamationTriangleIcon />}\n label=\"Pruebas\"\n />\n );\n }\n\n if (isDesktop || isTablet) {\n return (\n <Badge\n color=\"yellow\"\n leftIcon={<ExclamationTriangleIcon />}\n label={environmentBadge}\n />\n );\n }\n\n // Responsive: Mostrar badge corto en mobile, completo en desktop\n return (\n <>\n <div className=\"md:hidden\">\n <Badge\n color=\"yellow\"\n leftIcon={<ExclamationTriangleIcon />}\n label=\"Pruebas\"\n />\n </div>\n <div className=\"hidden md:block\">\n <Badge\n color=\"yellow\"\n leftIcon={<ExclamationTriangleIcon />}\n label={environmentBadge}\n />\n </div>\n </>\n );\n };\n\n // ===== SEARCH BUTTON (Solo mobile) =====\n const SearchButton = () => {\n if (hideActionButtons) return null;\n\n if (isMobile) {\n return (\n <button\n className={actionButtonClasses}\n aria-label=\"Buscar\"\n onClick={onSearchClick}\n >\n <div className=\"overflow-hidden relative shrink-0 w-4 h-4\">\n <MagnifyingGlassIcon />\n </div>\n </button>\n );\n }\n\n if (isResponsive) {\n return (\n <button\n className={`md:hidden ${actionButtonClasses}`}\n aria-label=\"Buscar\"\n onClick={onSearchClick}\n >\n <div className=\"overflow-hidden relative shrink-0 w-4 h-4\">\n <MagnifyingGlassIcon />\n </div>\n </button>\n );\n }\n\n return null;\n };\n\n // ===== CART BUTTON =====\n const CartButton = () => {\n if (hideActionButtons) return null;\n\n return (\n <div className=\"relative\">\n <button\n className={actionButtonClasses}\n aria-label=\"Carrito de compras\"\n onClick={onCartClick}\n >\n <div className=\"overflow-hidden relative shrink-0 w-4 h-4\">\n <ShoppingCartIcon />\n </div>\n </button>\n {/* Badge de notificación con número */}\n {notifications?.cart !== undefined && notifications.cart > 0 && (\n <div className=\"absolute bg-error-content dark:bg-error-content flex flex-col gap-2.5 h-4 items-center justify-center left-[calc(50%+8px)] px-1 py-0 rounded-full top-[calc(50%-8px)] -translate-x-1/2 -translate-y-1/2 pointer-events-none min-w-[16px]\">\n <p className=\"font-bold leading-3 text-[10px] text-white text-center whitespace-nowrap\">\n {notifications.cart > 99 ? '+99' : notifications.cart}\n </p>\n </div>\n )}\n </div>\n );\n };\n\n // ===== NOTIFICATIONS BUTTON =====\n const NotificationsButton = () => {\n if (hideActionButtons) return null;\n\n return (\n <div className=\"relative\">\n <button\n className={actionButtonClasses}\n aria-label=\"Notificaciones\"\n onClick={onNotificationsClick}\n >\n <div className=\"overflow-hidden relative shrink-0 w-4 h-4\">\n <BellIcon />\n </div>\n </button>\n {/* Badge de notificación dot */}\n {notifications?.bell && (\n <div className=\"absolute w-2 h-2 bg-error-content dark:bg-error-content rounded-full left-[calc(50%+4px)] top-[calc(50%-8px)] -translate-x-1/2 pointer-events-none\" />\n )}\n </div>\n );\n };\n\n // ===== USER DROPDOWN =====\n const UserDropdown = () => {\n if (!userDropdown) return null;\n\n const dropdownButtonClasses = `\n box-border\n flex\n items-center\n justify-center\n overflow-hidden\n p-0\n relative\n shrink-0\n hover:bg-background-secondary\n active:scale-95\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:hover:bg-dark-bg-secondary\n dark:active:scale-95\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n rounded-lg\n transition-all\n duration-150\n `;\n\n // Mobile: Solo avatar circular\n if (isMobile) {\n return (\n <button\n className={dropdownButtonClasses}\n onClick={userDropdown.onMenuClick}\n aria-label=\"Menú de usuario\"\n >\n <div className=\"relative rounded-full shrink-0 w-8 h-8\">\n <img\n alt={userDropdown.name}\n className=\"absolute inset-0 max-w-none object-center object-cover pointer-events-none rounded-full w-full h-full\"\n src={userDropdown.avatar}\n />\n </div>\n </button>\n );\n }\n\n // Desktop/Tablet: Avatar + info + chevron\n const renderFullDropdown = () => (\n <button\n className={dropdownButtonClasses}\n onClick={userDropdown.onMenuClick}\n aria-label=\"Menú de usuario\"\n >\n <div className=\"box-border flex gap-3 items-center justify-center overflow-hidden px-3 py-2 relative rounded-lg shrink-0\">\n <div className=\"flex gap-3 items-center justify-center relative shrink-0\">\n {/* Avatar */}\n <div className=\"flex items-center justify-center relative shrink-0\">\n <div className=\"relative rounded-md shrink-0 w-10 h-10\">\n <img\n alt={userDropdown.name}\n className=\"absolute inset-0 max-w-none object-center object-cover pointer-events-none rounded-md w-full h-full\"\n src={userDropdown.avatar}\n />\n </div>\n </div>\n {/* Nombre y email/rol */}\n <div className=\"flex flex-col gap-0.5 items-start justify-center relative shrink-0 w-[123px]\">\n <p className=\"leading-5 relative shrink-0 text-sm text-content-primary dark:text-dark-content-primary whitespace-nowrap font-normal\">\n {userDropdown.name}\n </p>\n {(userDropdown.email || userDropdown.role) && (\n <p className=\"leading-4 min-w-full relative shrink-0 text-xs text-content-secondary dark:text-content-secondary w-min whitespace-nowrap overflow-hidden text-ellipsis\">\n {userDropdown.email || userDropdown.role}\n </p>\n )}\n </div>\n </div>\n {/* Chevron down icon */}\n <div className=\"overflow-hidden relative shrink-0 w-5 h-5 text-content-secondary dark:text-content-secondary\">\n <ChevronDownIcon />\n </div>\n </div>\n </button>\n );\n\n if (isDesktop || isTablet) {\n return renderFullDropdown();\n }\n\n // Responsive\n return (\n <>\n {/* Mobile: Solo avatar circular */}\n <button\n className={`md:hidden ${dropdownButtonClasses}`}\n onClick={userDropdown.onMenuClick}\n aria-label=\"Menú de usuario\"\n >\n <div className=\"relative rounded-full shrink-0 w-8 h-8\">\n <img\n alt={userDropdown.name}\n className=\"absolute inset-0 max-w-none object-center object-cover pointer-events-none rounded-full w-full h-full\"\n src={userDropdown.avatar}\n />\n </div>\n </button>\n {/* Desktop/Tablet: Avatar + info + chevron */}\n <button\n className={`hidden md:flex ${dropdownButtonClasses}`}\n onClick={userDropdown.onMenuClick}\n aria-label=\"Menú de usuario\"\n >\n <div className=\"box-border flex gap-3 items-center justify-center overflow-hidden px-3 py-2 relative rounded-lg shrink-0\">\n <div className=\"flex gap-3 items-center justify-center relative shrink-0\">\n {/* Avatar */}\n <div className=\"flex items-center justify-center relative shrink-0\">\n <div className=\"relative rounded-md shrink-0 w-10 h-10\">\n <img\n alt={userDropdown.name}\n className=\"absolute inset-0 max-w-none object-center object-cover pointer-events-none rounded-md w-full h-full\"\n src={userDropdown.avatar}\n />\n </div>\n </div>\n {/* Nombre y email/rol */}\n <div className=\"flex flex-col gap-0.5 items-start justify-center relative shrink-0 w-[123px]\">\n <p className=\"leading-5 relative shrink-0 text-sm text-content-primary dark:text-dark-content-primary whitespace-nowrap font-normal\">\n {userDropdown.name}\n </p>\n {(userDropdown.email || userDropdown.role) && (\n <p className=\"leading-4 min-w-full relative shrink-0 text-xs text-content-secondary dark:text-content-secondary w-min whitespace-nowrap overflow-hidden text-ellipsis\">\n {userDropdown.email || userDropdown.role}\n </p>\n )}\n </div>\n </div>\n {/* Chevron down icon */}\n <div className=\"overflow-hidden relative shrink-0 w-5 h-5 text-content-secondary dark:text-content-secondary\">\n <ChevronDownIcon />\n </div>\n </div>\n </button>\n </>\n );\n };\n\n // ===== CLASES BASE DEL NAVBAR =====\n const baseClasses = `\n box-border\n flex\n gap-8\n items-center\n px-4\n py-1\n relative\n w-full\n bg-background-primary\n dark:bg-dark-bg-primary\n `;\n\n // ===== CLASES PARA VARIANTES DE ALTURA =====\n const variantClasses = {\n responsive: 'h-[40px] md:h-16',\n desktop: 'h-16',\n tablet: 'h-16',\n mobile: 'h-[40px]',\n };\n\n // ===== COMBINAR CLASES =====\n const finalClasses = [baseClasses, variantClasses[variant], className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <nav className={finalClasses}>\n {/* ===== SECCIÓN LEADING (IZQUIERDA) ===== */}\n <div className=\"flex gap-4 items-center relative shrink-0\">\n {/* Botón de navegación o acción leading personalizada (solo desktop/tablet) */}\n {!isMobile && (leadingAction || <NavigationButton />)}\n\n {/* Business Logo (logo del cliente) - solo cuando showBusinessLogo=true */}\n {logo || <BusinessLogo />}\n\n {/* Divider después de Business Logo - Solo cuando hay Business Logo Y hay Siesa Logo en leading */}\n {showBusinessLogo && showSiesaLogoLeading && !isMobile && <Divider />}\n\n {/* Siesa Logo en leading - Se controla con showSiesaLogoLeading */}\n {siesaLogo || <SiesaLogoLeading />}\n\n {/* Divider antes del nombre - Solo cuando hay Siesa Logo en leading y nombre de producto */}\n {productName && showSiesaLogoLeading && !isMobile && <Divider />}\n\n {/* Nombre del Producto - Solo desktop/tablet */}\n <ProductName />\n </div>\n\n {/* ===== SECCIÓN TRAILING (DERECHA) ===== */}\n <div className=\"flex gap-4 items-center justify-end grow min-h-px min-w-px relative shrink-0\">\n {/* Badge de Ambiente */}\n <EnvironmentBadge />\n\n {/* Botón de búsqueda - Solo mobile */}\n <SearchButton />\n\n {/* Botón de carrito de compras */}\n <CartButton />\n\n {/* Botón de notificaciones */}\n <NotificationsButton />\n\n {/* Divider antes del dropdown - Solo desktop/tablet */}\n {userDropdown && !hideActionButtons && <Divider />}\n\n {/* Dropdown de usuario */}\n <UserDropdown />\n\n {/* Divider antes del logo Siesa trailing - Solo cuando showSiesaLogoTrailing=true */}\n {showSiesaLogoTrailing && userDropdown && !isMobile && <Divider />}\n\n {/* Logo Siesa trailing - Solo desktop */}\n <SiesaLogoTrailing />\n\n {/* Actions adicionales */}\n {actions && <div className=\"flex gap-2 items-center\">{actions}</div>}\n </div>\n </nav>\n );\n};\n","import React from 'react';\nimport type { NavigationBarProps, NavigationBarItem } from './NavigationBar.types';\n\n/**\n * NavigationBar del sistema de diseño Siesa\n *\n * **Componente de navegación inferior (Bottom Navigation Bar) para móvil.**\n * Permite al usuario navegar entre vistas principales de la aplicación.\n * Diseñado para contener 3-5 ítems de navegación.\n *\n * **🔄 Navegación Responsive:**\n * El NavigationRail (navegación lateral vertical) se convierte en NavigationBar\n * (navegación inferior horizontal) cuando la pantalla es móvil. Esta es una\n * práctica recomendada de UX para aprovechar mejor el espacio en diferentes\n * dispositivos:\n * - **Desktop/Tablet**: Usar NavigationRail (lateral)\n * - **Mobile**: Usar NavigationBar (inferior)\n *\n * **Características:**\n * - Soporta hasta 5 ítems de navegación (recomendado: 3-5)\n * - Cada ítem tiene icono + label\n * - Indicador visual de ítem activo (fondo azul claro)\n * - Estados: active, hover, disabled\n * - Dark mode completo\n * - Accesibilidad con ARIA labels\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Tipografía Label XXSmall (10px Bold) según sistema de diseño\n * - Iconos de 16x16px según especificaciones de Figma\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label XXSmall)\n * @see docs/spacing.md - Sistema de espaciado\n * @see NavigationRail - Componente de navegación lateral para desktop\n *\n * @example\n * ```tsx\n * const items = [\n * { id: 'home', icon: <HomeIcon />, label: 'Inicio', active: true },\n * { id: 'search', icon: <SearchIcon />, label: 'Buscar' },\n * { id: 'profile', icon: <ProfileIcon />, label: 'Perfil' },\n * ];\n *\n * <NavigationBar\n * items={items}\n * activeItemId=\"home\"\n * onItemClick={(id) => console.log('Clicked:', id)}\n * />\n * ```\n *\n * @example\n * // Patrón responsive: NavigationRail en desktop, NavigationBar en mobile\n * ```tsx\n * function ResponsiveNav() {\n * return (\n * <>\n * // NavigationRail para desktop/tablet\n * <div className=\"hidden md:block\">\n * <NavigationRail items={items} />\n * </div>\n *\n * // NavigationBar para móvil\n * <div className=\"md:hidden fixed bottom-0 left-0 right-0 z-50\">\n * <NavigationBar items={items} />\n * </div>\n * </>\n * );\n * }\n * ```\n */\nexport const NavigationBar: React.FC<NavigationBarProps> = ({\n items,\n activeItemId,\n onItemClick,\n className = '',\n ariaLabel = 'Navegación Principal',\n}) => {\n // ===== VALIDACIÓN: Máximo 5 ítems =====\n if (items.length > 5) {\n console.warn('NavigationBar: Se recomienda un máximo de 5 ítems para mejor UX');\n }\n\n // ===== HANDLER DE CLICK =====\n const handleItemClick = (item: NavigationBarItem) => {\n if (item.disabled) return;\n\n // Llamar onClick del ítem individual si existe\n if (item.onClick) {\n item.onClick(item.id);\n }\n\n // Llamar onItemClick global si existe\n if (onItemClick) {\n onItemClick(item.id);\n }\n };\n\n // ===== RENDERIZAR ÍTEM =====\n const renderItem = (item: NavigationBarItem) => {\n const isActive = item.active || item.id === activeItemId;\n\n // ===== CLASES DEL CONTENEDOR DEL ÍTEM =====\n const itemContainerClasses = `\n flex-1\n flex\n flex-col\n items-center\n gap-1\n px-0.5\n py-0\n min-w-0\n cursor-pointer\n transition-all\n duration-150\n ${item.disabled ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''}\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL ICON CONTAINER =====\n // Fondo azul claro cuando está activo (rgb(219, 238, 254) = #dbeefe = primary-custom-100)\n // En dark mode usa el mismo color opaco según Figma\n const iconContainerClasses = `\n flex\n items-center\n justify-center\n px-4\n py-1\n rounded-full\n overflow-hidden\n transition-all\n duration-150\n ${\n isActive\n ? 'bg-primary-custom-100 dark:bg-primary-custom-100'\n : 'bg-transparent hover:bg-hover-overlay dark:hover:bg-hover-overlay-dark'\n }\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL LABEL =====\n // Label XXSmall: 10px Bold, line-height 12px (según typography.md y Figma)\n const labelClasses = `\n font-['SiesaBT:Bold',sans-serif]\n text-[10px]\n leading-[12px]\n font-bold\n text-center\n w-full\n min-w-0\n text-content-primary\n dark:text-dark-content-primary\n transition-colors\n duration-150\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL ICONO =====\n // Iconos de 16x16px según Figma\n const iconClasses = `\n w-4\n h-4\n shrink-0\n text-content-primary\n dark:text-dark-content-primary\n transition-colors\n duration-150\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n key={item.id}\n type=\"button\"\n className={itemContainerClasses}\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n aria-label={item.ariaLabel || item.label}\n aria-current={isActive ? 'page' : undefined}\n >\n {/* Icon Container */}\n <div className={iconContainerClasses}>\n <span className={iconClasses}>{item.icon}</span>\n </div>\n\n {/* Label */}\n <span className={labelClasses}>{item.label}</span>\n </button>\n );\n };\n\n // ===== CLASES DEL CONTENEDOR PRINCIPAL =====\n const containerClasses = `\n bg-bg-primary\n dark:bg-dark-bg-primary\n p-4\n w-full\n transition-colors\n duration-150\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL MENU (Contenedor de ítems) =====\n const menuClasses = `\n flex\n items-start\n justify-center\n w-full\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== CLASES DEL DESTINATIONS (Contenedor con gap) =====\n const destinationsClasses = `\n flex-1\n flex\n items-start\n gap-2\n min-h-0\n min-w-0\n `\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <nav\n className={`${containerClasses} ${className}`.trim()}\n role=\"navigation\"\n aria-label={ariaLabel}\n >\n <div className={menuClasses}>\n <div className={destinationsClasses}>\n {items.map((item) => renderItem(item))}\n </div>\n </div>\n </nav>\n );\n};\n","import React from 'react';\n\n/**\n * Icono de convención para POSConvention\n *\n * Círculo SVG de 16x16px con colores diferentes para Light y Dark mode.\n * Basado en especificaciones de Figma:\n * - Light mode: node-id 4418-40139\n * - Dark mode: node-id 4418-40349\n *\n * Usa dos círculos superpuestos con clases CSS para alternar entre modos.\n *\n * @param lightColor - Color hexadecimal para Light mode\n * @param darkColor - Color hexadecimal para Dark mode\n * @param className - Clases CSS adicionales (opcional)\n */\nexport const ConventionIcon: React.FC<{\n lightColor: string;\n darkColor: string;\n className?: string;\n}> = ({ lightColor, darkColor, className = '' }) => (\n <svg\n className={`w-4 h-4 shrink-0 ${className}`.trim()}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n >\n {/* Círculo para Light mode - visible por defecto, oculto en dark */}\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"8\"\n fill={lightColor}\n className=\"dark:hidden\"\n />\n {/* Círculo para Dark mode - oculto por defecto, visible en dark */}\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"8\"\n fill={darkColor}\n className=\"hidden dark:block\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { POSConventionProps } from './POSConvention.types';\nimport { ConventionIcon } from './icons';\n\n/**\n * POSConvention - Componente de leyenda/convención para estados de mesas POS\n *\n * Muestra un indicador circular de color con su respectiva etiqueta según el diseño de Figma.\n * Se usa típicamente para crear leyendas que explican el significado de colores en el sistema POS.\n *\n * **Colores según Figma (node-id: 4418-40139):**\n *\n * | Estado | Light Mode | Dark Mode |\n * |--------|------------|-----------|\n * | Available | #0e79fd (azul) | #93d1fd (azul claro) |\n * | Occupied | #af460e (naranja) | #f5a927 (amarillo) |\n * | Reserved | #7e22ce (morado) | #c084fc (morado claro) |\n * | Out of Service | #3f3f46 (gris) | #a1a1aa (gris claro) |\n *\n * **Dimensiones según Figma:**\n * - Icono: 16x16px (círculo con fill)\n * - Texto: 12px (Paragraph/Tiny - text-xs)\n * - Gap: 4px (gap-1)\n * - Line-height: 16px (leading-4)\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Colores exactos de Figma para Light y Dark mode\n * - Type safety con TypeScript estricto\n * - Accesibilidad con aria-label\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Paragraph Tiny)\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Indicador de disponible\n * <POSConvention status=\"available\" />\n *\n * // Indicador de ocupada\n * <POSConvention status=\"occupied\" />\n *\n * // Leyenda completa en contenedor\n * <div className=\"p-5 rounded-lg border border-dashed border-primary-custom-300\">\n * <div className=\"flex flex-col gap-9\">\n * <POSConvention status=\"available\" />\n * <POSConvention status=\"occupied\" />\n * <POSConvention status=\"reserved\" />\n * <POSConvention status=\"outOfService\" />\n * </div>\n * </div>\n * ```\n */\nexport const POSConvention: React.FC<POSConventionProps> = ({\n status = 'available',\n className = '',\n}) => {\n // ===== CONFIGURACIÓN DE COLORES Y LABELS SEGÚN FIGMA =====\n // Colores extraídos del nodo 4418-40139 (Light) y 4418-40349 (Dark) de Figma\n // Variables de Figma: contentCustomPrimary, contentYellow, contentPurple, contentZinc\n const conventionConfig = {\n available: {\n lightColor: '#0e79fd', // Azul - contentCustomPrimary Light\n darkColor: '#93d1fd', // Azul claro - contentCustomPrimary Dark\n label: 'Disponible',\n },\n occupied: {\n lightColor: '#af460e', // Naranja - contentOrange Light\n darkColor: '#f5a927', // Amarillo - contentYellow Dark\n label: 'Ocupada',\n },\n reserved: {\n lightColor: '#7e22ce', // Morado - contentPurple Light\n darkColor: '#c084fc', // Morado claro - contentPurple Dark\n label: 'Reservada',\n },\n outOfService: {\n lightColor: '#3f3f46', // Gris - contentZinc Light (zinc-700)\n darkColor: '#a1a1aa', // Gris claro - contentZinc Dark (zinc-400)\n label: 'Fuera de Servicio',\n },\n };\n\n const config = conventionConfig[status];\n\n // ===== CLASES BASE =====\n const baseClasses = `\n inline-flex\n items-center\n gap-1\n shrink-0\n `;\n\n // ===== COMBINAR CLASES =====\n const finalClasses = [baseClasses, className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <div\n className={finalClasses}\n role=\"presentation\"\n aria-label={`Estado: ${config.label}`}\n >\n {/* Icono circular 16x16 con colores para Light y Dark mode */}\n <ConventionIcon lightColor={config.lightColor} darkColor={config.darkColor} />\n\n {/* Label de texto según Figma: Paragraph/Tiny 12px */}\n {/* Light: contentPrimary #18181b, Dark: contentPrimary #f4f4f5 */}\n <span\n className={`\n text-xs\n leading-4\n font-normal\n text-content-primary\n dark:text-dark-content-primary\n whitespace-nowrap\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {config.label}\n </span>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Icono Check (✓) para estado Available\n * Tamaño: 12x12px\n */\nexport const CheckIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * Icono X Mark para estado Occupied\n * Tamaño: 12x12px\n */\nexport const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * Icono Calendar para estado Reserved\n * Tamaño: 12x12px\n */\nexport const CalendarIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M10.5 5H1.5M8.5 1V3M3.5 1V3M3.25 11H8.75C9.57843 11 10.25 10.3284 10.25 9.5V3.5C10.25 2.67157 9.57843 2 8.75 2H3.25C2.42157 2 1.75 2.67157 1.75 3.5V9.5C1.75 10.3284 2.42157 11 3.25 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/**\n * Icono No Symbol (Prohibido) para estado Out of Service\n * Tamaño: 12x12px\n */\nexport const NoSymbolIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M10.5 6C10.5 8.48528 8.48528 10.5 6 10.5C3.51472 10.5 1.5 8.48528 1.5 6C1.5 3.51472 3.51472 1.5 6 1.5C8.48528 1.5 10.5 3.51472 10.5 6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M9.18198 2.81802L2.81802 9.18198\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n/**\n * Icono de Usuario/Personas para mostrar capacidad\n * Tamaño: 13x10px (según especificaciones de Figma)\n */\nexport const UsersIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"13\"\n height=\"10\"\n viewBox=\"0 0 13 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M9.25 9V8C9.25 6.89543 8.35457 6 7.25 6H2.75C1.64543 6 0.75 6.89543 0.75 8V9M12.25 9V8C12.25 6.89543 11.3546 6 10.25 6H9.75M7 2.5C7 3.60457 6.10457 4.5 5 4.5C3.89543 4.5 3 3.60457 3 2.5C3 1.39543 3.89543 0.5 5 0.5C6.10457 0.5 7 1.39543 7 2.5ZM10 2C10 2.82843 9.32843 3.5 8.5 3.5C7.67157 3.5 7 2.82843 7 2C7 1.17157 7.67157 0.5 8.5 0.5C9.32843 0.5 10 1.17157 10 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { POSLocationButtonProps } from './POSLocationButton.types';\nimport { CheckIcon, XMarkIcon, CalendarIcon, NoSymbolIcon, UsersIcon } from './icons';\n\n/**\n * POSLocationButton del sistema de diseño Siesa\n *\n * Botón especializado para punto de venta (POS) que muestra el estado de disponibilidad\n * de una ubicación física (mesa, salón, terraza, etc.) con indicadores visuales claros.\n *\n * **Estados de disponibilidad (status):**\n * - `available`: Disponible (verde/lime) con icono ✓\n * - `occupied`: Ocupada (naranja/yellow) con icono ✗\n * - `reserved`: Reservada (morado/purple) con icono 📅\n * - `outOfService`: Fuera de servicio (gris/zinc) con icono 🚫\n *\n * **Estados visuales (state):**\n * - `enabled`: Estado normal con fondo blanco/dark\n * - `actived`: Estado seleccionado con fondo coloreado\n *\n * **Características:**\n * - Ancho flexible: por defecto ocupa el 100% del contenedor (fullWidth=true)\n * - Altura fija: 68px (optimizado para interfaces POS)\n * - Muestra nombre de ubicación y capacidad (ej: \"1/8 mesas\")\n * - Badge visual con icono y texto del estado\n * - Dark mode completo en todos los estados\n * - Focus ring adaptativo\n * - Transiciones suaves\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * // Ubicación disponible\n * <POSLocationButton\n * locationName=\"Antejardín\"\n * status=\"available\"\n * capacity={{ current: 1, total: 8 }}\n * onClick={() => console.log('Seleccionado')}\n * />\n *\n * // Ubicación ocupada y seleccionada\n * <POSLocationButton\n * locationName=\"Terraza\"\n * status=\"occupied\"\n * state=\"actived\"\n * capacity={{ current: 5, total: 8 }}\n * />\n *\n * // Ubicación reservada\n * <POSLocationButton\n * locationName=\"Salón Principal\"\n * status=\"reserved\"\n * capacity={{ current: 3, total: 12 }}\n * />\n *\n * // Fuera de servicio\n * <POSLocationButton\n * locationName=\"Bar\"\n * status=\"outOfService\"\n * disabled\n * />\n * ```\n */\nexport const POSLocationButton: React.FC<POSLocationButtonProps> = ({\n locationName,\n status = 'available',\n state = 'enabled',\n capacity,\n onClick,\n disabled = false,\n className = '',\n ariaLabel,\n fullWidth = true,\n}) => {\n // ===== CONFIGURACIÓN DE COLORES POR STATUS =====\n // Mapeo de colores según especificaciones de Figma (pixel-perfect)\n const statusConfig = {\n available: {\n // Azul Primary Custom (según Figma: #0e79fd)\n textColor: 'text-primary-custom-600 dark:text-primary-custom-600',\n badgeBg: 'bg-primary-custom-100 dark:bg-blue-900/30',\n badgeText: 'text-primary-custom-600 dark:text-blue-400',\n activedBg: 'bg-primary-custom-100 dark:bg-blue-900/30',\n icon: CheckIcon,\n badgeLabel: 'Disponible',\n },\n occupied: {\n // Naranja/Yellow (según Figma: #af460e para texto, #fcedc9 para fondo)\n textColor: 'text-[#af460e] dark:text-orange-400',\n badgeBg: 'bg-[#fcedc9] dark:bg-yellow-900/30',\n badgeText: 'text-[#af460e] dark:text-orange-400',\n activedBg: 'bg-[#fcedc9] dark:bg-yellow-900/30',\n icon: XMarkIcon,\n badgeLabel: 'Ocupada',\n },\n reserved: {\n // Morado/Purple (según Figma: #7e22ce para texto, #f3e8ff para fondo)\n textColor: 'text-[#7e22ce] dark:text-fuchsia-400',\n badgeBg: 'bg-[#f3e8ff] dark:bg-purple-900/30',\n badgeText: 'text-[#7e22ce] dark:text-purple-400',\n activedBg: 'bg-[#f3e8ff] dark:bg-purple-900/30',\n icon: CalendarIcon,\n badgeLabel: 'Reservada',\n },\n outOfService: {\n // Gris/Zinc (según Figma: #3f3f46 para texto, #f4f4f5 para fondo)\n textColor: 'text-[#3f3f46] dark:text-zinc-400',\n badgeBg: 'bg-[#f4f4f5] dark:bg-zinc-800/30',\n badgeText: 'text-content-tertiary dark:text-zinc-400',\n activedBg: 'bg-[#f4f4f5] dark:bg-zinc-800/30',\n icon: NoSymbolIcon,\n badgeLabel: 'F. de Servicio',\n },\n };\n\n const config = statusConfig[status];\n const StatusIcon = config.icon;\n\n // ===== CLASES DE FONDO SEGÚN STATE =====\n const backgroundClasses =\n state === 'actived'\n ? config.activedBg // Fondo coloreado cuando está activo\n : 'bg-white dark:bg-dark-bg-primary'; // Fondo blanco/dark cuando está enabled\n\n // ===== CLASES DE ANCHO =====\n const widthClasses = fullWidth ? 'w-full' : 'w-[189px]';\n\n // ===== CLASES BASE =====\n const baseClasses = `\n flex\n flex-col\n items-stretch\n justify-between\n ${widthClasses}\n h-[68px]\n p-2\n rounded-lg\n cursor-pointer\n transition-all\n duration-150\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n hover:shadow-md\n active:scale-[0.98]\n disabled:opacity-50\n disabled:cursor-not-allowed\n disabled:pointer-events-none\n `;\n\n // ===== COMBINAR CLASES =====\n const buttonClasses = [baseClasses, backgroundClasses, className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== FORMATEAR TEXTO DE CAPACIDAD =====\n const capacityText = capacity\n ? `${capacity.current}/${capacity.total} mesas`\n : null;\n\n return (\n <button\n className={buttonClasses}\n onClick={onClick}\n disabled={disabled}\n aria-label={ariaLabel || `${locationName} - ${config.badgeLabel}`}\n type=\"button\"\n >\n {/* ===== TÍTULO (Nombre de ubicación) ===== */}\n <div\n className={`\n text-base\n font-bold\n leading-6\n ${config.textColor}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {locationName}\n </div>\n\n {/* ===== CONTENIDO (Capacidad + Badge) ===== */}\n <div className=\"flex items-center justify-between\">\n {/* Capacidad (izquierda) */}\n {capacityText && (\n <div className=\"flex items-center gap-1\">\n <UsersIcon className={config.textColor} />\n <span\n className={`\n text-[10px]\n leading-[12px]\n ${config.textColor}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {capacityText}\n </span>\n </div>\n )}\n\n {/* Badge (derecha) */}\n <div\n className={`\n inline-flex\n items-center\n gap-1\n px-1.5\n py-1\n rounded-md\n ${config.badgeBg}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n <StatusIcon className={config.badgeText} />\n <span\n className={`\n text-xs\n leading-4\n ${config.badgeText}\n `\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {config.badgeLabel}\n </span>\n </div>\n </div>\n </button>\n );\n};\n","import React from 'react';\nimport type { POSNumberButtonProps } from './POSNumberButton.types';\n\n/**\n * Componente POSNumberButton del sistema de diseño Siesa\n * Botón numérico especializado para sistemas POS (Point of Sale)\n *\n * Basado en especificaciones de Figma con Tailwind CSS\n *\n * **Características principales:**\n * - Diseñado para pantallas táctiles y POS\n * - Tipografía Display Tiny (48px Bold) para números grandes\n * - Tres tamaños: Small (40x40), Medium (65x65), Large (80x80)\n * - Opción de borde visible o sin borde\n * - Estados: Default, Hover, Active, Disabled\n * - Touch-friendly: active:scale-95 para feedback táctil\n *\n * **Variantes:**\n * - `border=false`: Botón sin borde, hover cambia a primary\n * - `border=true`: Botón con borde, hover resalta el borde\n *\n * **Tamaños:**\n * - `s` (40x40px): Compacto, para teclados numéricos pequeños\n * - `m` (65x65px): Mediano, tamaño intermedio\n * - `l` (80x80px): Grande, tamaño por defecto para POS\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n * - Feedback visual inmediato con active:scale-95\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Display Tiny)\n * @see docs/spacing.md - Sistema de espaciado\n * @see src/components/Button/Button.tsx - Componente Button de referencia\n *\n * @example\n * ```tsx\n * // Botón numérico grande (POS)\n * <POSNumberButton size=\"l\">1</POSNumberButton>\n *\n * // Botón con borde\n * <POSNumberButton size=\"l\" border>2</POSNumberButton>\n *\n * // Botón compacto\n * <POSNumberButton size=\"s\">3</POSNumberButton>\n *\n * // Teclado numérico completo\n * <div className=\"grid grid-cols-3 gap-2\">\n * {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((num) => (\n * <POSNumberButton key={num} size=\"m\" onClick={() => handleInput(num)}>\n * {num}\n * </POSNumberButton>\n * ))}\n * </div>\n * ```\n */\nexport const POSNumberButton: React.FC<POSNumberButtonProps> = ({\n size = 'l',\n border = false,\n children,\n disabled = false,\n className = '',\n onClick,\n ariaLabel,\n htmlType = 'button',\n ...rest\n}) => {\n // ===== CLASES DE TAMAÑO =====\n // Basado en especificaciones de Figma: L=80x80, M=65x65, S=40x40\n const sizeClasses = {\n s: 'w-10 h-10', // 40x40px\n m: 'w-[65px] h-[65px]', // 65x65px\n l: 'w-20 h-20', // 80x80px\n };\n\n // ===== CLASES DE TEXTO =====\n // Display Tiny (48px Bold) según typography.md → text-5xl\n // Para tamaño small, reducimos a text-2xl (24px)\n const textSizeClasses = {\n s: 'text-2xl', // 24px para botones pequeños\n m: 'text-5xl', // 48px Display Tiny\n l: 'text-5xl', // 48px Display Tiny\n };\n\n // ===== CLASES DE ESTADO (Sin Borde) =====\n const noBorderStateClasses = `\n bg-white\n text-content-primary\n hover:bg-primary-custom-600\n hover:text-primary-inverse-content\n active:bg-primary-custom-600\n active:text-primary-inverse-content\n active:scale-95\n dark:bg-dark-bg-primary\n dark:text-dark-content-primary\n dark:hover:bg-dark-bg-inverse\n dark:hover:text-dark-content-inverse\n dark:active:bg-dark-bg-inverse\n dark:active:text-dark-content-inverse\n dark:active:scale-95\n `;\n\n // ===== CLASES DE ESTADO (Con Borde) =====\n const withBorderStateClasses = `\n bg-white\n text-content-primary\n border\n border-border-primary\n hover:bg-primary-custom-600\n hover:text-primary-inverse-content\n hover:border-primary-inverse-border\n active:bg-primary-custom-600\n active:text-primary-inverse-content\n active:border-primary-inverse-border\n active:scale-95\n dark:bg-dark-bg-primary\n dark:text-dark-content-primary\n dark:border-dark-border-primary\n dark:hover:bg-dark-bg-inverse\n dark:hover:text-dark-content-inverse\n dark:hover:border-primary-inverse-border\n dark:active:bg-dark-bg-inverse\n dark:active:text-dark-content-inverse\n dark:active:border-primary-inverse-border\n dark:active:scale-95\n `;\n\n // ===== CLASES BASE =====\n const baseClasses = `\n inline-flex\n items-center\n justify-center\n rounded-lg\n font-bold\n tracking-tighter\n whitespace-nowrap\n cursor-pointer\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n disabled:opacity-50\n disabled:cursor-not-allowed\n disabled:pointer-events-none\n transition-all\n duration-150\n `;\n\n // ===== COMBINAR TODAS LAS CLASES =====\n const buttonClasses = [\n baseClasses,\n sizeClasses[size],\n textSizeClasses[size],\n border ? withBorderStateClasses : noBorderStateClasses,\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n type={htmlType}\n className={buttonClasses}\n disabled={disabled}\n onClick={onClick}\n aria-label={ariaLabel || `Número ${children}`}\n {...rest}\n >\n {children}\n </button>\n );\n};\n","import React from 'react';\nimport type { POSProductButtonProps } from './POSProductButton.types';\n\n/**\n * Componente POSProductButton del sistema de diseño Siesa\n *\n * Botón especializado para sistemas POS que combina una imagen de producto\n * con un label descriptivo. Diseñado para selección rápida de productos.\n *\n * **Estados disponibles:**\n * - `default`: Estado normal con fondo blanco\n * - `active`: Estado seleccionado con fondo azul claro y texto azul\n * - `disabled`: Estado deshabilitado con opacidad reducida\n *\n * **Características:**\n * - Imagen con aspect ratio 158:80 (proporción de Figma)\n * - Label con tipografía Label Small (14px Bold)\n * - Soporte completo de dark mode\n * - Estados hover, active y focus\n * - Transiciones suaves\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Focus rings adaptativos para light y dark mode\n * - Tokens de color consistentes con la documentación\n * - Estados hover y active completos\n * - Tipografía Label Small (14px Bold) según sistema de diseño\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico (Label)\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/border-radius.md - Border radius\n *\n * @example\n * ```tsx\n * // Botón de producto normal\n * <POSProductButton\n * image=\"/images/parrilla.jpg\"\n * label=\"A la parrilla\"\n * onClick={() => console.log('Producto seleccionado')}\n * />\n *\n * // Botón de producto activo/seleccionado\n * <POSProductButton\n * image=\"/images/parrilla.jpg\"\n * label=\"A la parrilla\"\n * active={true}\n * />\n *\n * // Botón de producto deshabilitado\n * <POSProductButton\n * image=\"/images/parrilla.jpg\"\n * label=\"A la parrilla\"\n * disabled={true}\n * />\n * ```\n */\nexport const POSProductButton: React.FC<POSProductButtonProps> = ({\n image,\n label,\n active = false,\n disabled = false,\n onClick,\n className = '',\n ariaLabel,\n}) => {\n // ===== CLASES BASE =====\n const baseClasses = `\n flex\n flex-col\n gap-2\n p-3\n rounded-lg\n font-bold\n text-sm\n transition-all\n duration-150\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n `;\n\n // ===== CLASES DE ESTADO =====\n const stateClasses = disabled\n ? `\n bg-white\n text-content-primary\n opacity-55\n cursor-not-allowed\n pointer-events-none\n dark:bg-dark-bg-primary\n dark:text-dark-content-primary\n `\n : active\n ? `\n bg-primary-custom-100\n text-primary-custom-600\n cursor-pointer\n hover:bg-primary-custom-100\n active:scale-95\n dark:bg-primary-custom-100/20\n dark:text-primary-custom-600\n dark:hover:bg-primary-custom-100/30\n dark:active:scale-95\n `\n : `\n bg-white\n text-content-primary\n cursor-pointer\n hover:bg-background-secondary\n active:scale-95\n dark:bg-dark-bg-primary\n dark:text-dark-content-primary\n dark:hover:bg-dark-bg-primary/80\n dark:active:scale-95\n `;\n\n // ===== COMBINAR TODAS LAS CLASES =====\n const buttonClasses = [baseClasses, stateClasses, className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return (\n <button\n type=\"button\"\n className={buttonClasses}\n disabled={disabled}\n onClick={onClick}\n aria-label={ariaLabel || label}\n aria-pressed={active}\n >\n {/* Imagen del producto */}\n <div className=\"aspect-[158/80] w-full rounded-lg overflow-hidden\">\n <img\n src={image}\n alt={label}\n className=\"w-full h-full object-cover\"\n />\n </div>\n\n {/* Label del producto */}\n <div className=\"w-full text-left leading-5\">\n {label}\n </div>\n </button>\n );\n};\n","import React from 'react';\n\n/**\n * Icono Plus (heroicons-micro/plus)\n * Usado en el botón \"Agregar\" del POSProductCard\n * Tamaño: 16x16px según especificación de Figma\n */\nexport const PlusIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n aria-hidden=\"true\"\n >\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { POSProductCardProps } from './POSProductCard.types';\nimport { Button } from '../Button';\nimport { PlusIcon } from './icons';\n\n/**\n * Componente POSProductCard del sistema de diseño Siesa\n *\n * Card especializado para sistemas POS que muestra información de producto\n * con imagen, nombre, precio y botón de agregar. Diseñado para catálogos\n * de productos y selección rápida en punto de venta.\n *\n * **Estados disponibles:**\n * - `enabled`: Estado normal\n * - Light: fondo blanco (#ffffff), texto negro (#18181b)\n * - Dark: fondo oscuro (#18181b), texto claro (#f4f4f5)\n * - `active`: Estado seleccionado\n * - Light: fondo azul claro (#dbeefe), texto azul (#0e79fd)\n * - Dark: fondo azul oscuro (#112d57), texto celeste (#93d1fd)\n * - `disabled`: Estado deshabilitado con opacidad reducida\n *\n * **Características:**\n * - Imagen de producto con aspect ratio fijo y rounded-lg\n * - Nombre del producto con tipografía Label Small (14px Bold)\n * - Precio con tipografía Heading Small (24px Bold) y letter-spacing -2.5%\n * - Botón \"Agregar\" reutiliza el componente Button del sistema\n * - Soporte completo de dark mode pixel-perfect\n * - Transiciones suaves\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Focus rings adaptativos para light y dark mode\n * - Tokens de color consistentes con Figma\n * - Estados hover y active completos\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4368-31336 - Diseño Figma\n *\n * @example\n * ```tsx\n * // Card de producto normal\n * <POSProductCard\n * image=\"/images/caprese.jpg\"\n * productName=\"Ensalada Caprese\"\n * price=\"$ 40.000\"\n * onAddClick={() => console.log('Producto agregado')}\n * />\n *\n * // Card de producto activo/seleccionado\n * <POSProductCard\n * image=\"/images/caprese.jpg\"\n * productName=\"Ensalada Caprese\"\n * price=\"$ 40.000\"\n * active={true}\n * />\n *\n * // Card de producto deshabilitado\n * <POSProductCard\n * image=\"/images/caprese.jpg\"\n * productName=\"Ensalada Caprese\"\n * price=\"$ 40.000\"\n * disabled={true}\n * />\n * ```\n */\nexport const POSProductCard: React.FC<POSProductCardProps> = ({\n image,\n productName,\n price,\n buttonText = 'Agregar',\n active = false,\n disabled = false,\n onAddClick,\n onCardClick,\n className = '',\n ariaLabel,\n}) => {\n // ===== CLASES BASE DEL CARD =====\n const baseClasses = `\n flex\n flex-col\n gap-2\n p-3\n rounded-lg\n w-[170px]\n transition-all\n duration-150\n focus:outline-none\n focus:ring-2\n focus:ring-primary-custom-400\n focus:ring-offset-2\n dark:focus:ring-dark-border-custom\n dark:focus:ring-offset-dark-bg-primary\n `;\n\n // ===== CLASES DE ESTADO DEL CARD =====\n // Light: enabled=#ffffff, active=#dbeefe\n // Dark: enabled=#18181b, active=#112d57\n const stateClasses = disabled\n ? `\n bg-white\n opacity-55\n cursor-not-allowed\n dark:bg-dark-bg-primary\n `\n : active\n ? `\n bg-primary-custom-100\n cursor-pointer\n dark:bg-dark-bg-custom\n `\n : `\n bg-white\n cursor-pointer\n dark:bg-dark-bg-primary\n `;\n\n // ===== CLASES DE TEXTO SEGÚN ESTADO =====\n // Light: enabled=#18181b, active=#0e79fd\n // Dark: enabled=#f4f4f5, active=#93d1fd\n const textClasses = disabled\n ? `\n text-content-primary\n dark:text-dark-content-primary\n `\n : active\n ? `\n text-primary-custom-600\n dark:text-dark-content-custom\n `\n : `\n text-content-primary\n dark:text-dark-content-primary\n `;\n\n // ===== COMBINAR CLASES DEL CARD =====\n const cardClasses = [baseClasses, stateClasses, className]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== HANDLER DEL CLICK EN EL CARD =====\n const handleCardClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // Solo propagar si no se hizo clic en el botón\n if ((event.target as HTMLElement).closest('button')) return;\n onCardClick?.(event);\n };\n\n // ===== HANDLER DEL CLICK EN EL BOTÓN =====\n const handleButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (disabled) return;\n onAddClick?.(event);\n };\n\n return (\n <div\n className={cardClasses}\n onClick={handleCardClick}\n role=\"article\"\n aria-label={ariaLabel || `${productName} - ${price}`}\n tabIndex={disabled ? -1 : 0}\n >\n {/* Sección de información del producto */}\n <div className=\"flex flex-col gap-3 w-full\">\n {/* Imagen del producto */}\n <div className=\"h-[88px] w-full rounded-lg overflow-hidden\">\n <img\n src={image}\n alt={productName}\n className=\"w-full h-full object-cover\"\n />\n </div>\n\n {/* Datos del producto (nombre y precio) */}\n <div className={`flex flex-col w-full font-bold ${textClasses}`.trim().replace(/\\s+/g, ' ')}>\n {/* Nombre del producto - Label Small (14px) */}\n <div className=\"text-sm leading-5\">\n {productName}\n </div>\n\n {/* Precio - Heading Small (24px) con letter-spacing -2.5% (tracking-tighter) */}\n <div className=\"text-2xl leading-8 tracking-tighter\">\n {price}\n </div>\n </div>\n </div>\n\n {/* Botón Agregar - Reutiliza el componente Button del sistema */}\n <Button\n type=\"default\"\n size=\"sm\"\n leftIcon={<PlusIcon className=\"w-4 h-4\" />}\n onClick={handleButtonClick}\n disabled={disabled}\n fullWidth\n ariaLabel={`${buttonText} ${productName}`}\n >\n {buttonText}\n </Button>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * TrashIcon - Icono de papelera para eliminar items\n * Basado en Heroicons Micro (16x16px)\n */\nexport const TrashIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { POSProductSidebarItemsProps } from './POSProductSidebarItems.types';\nimport { Quantity } from '../Quantity/Quantity';\nimport { TrashIcon } from './icons';\n\n/**\n * POSProductSidebarItems - Componente de item de producto para sidebar POS\n *\n * Componente pixel-perfect basado en Figma (node 4507-28013) para mostrar\n * productos en el sidebar de un sistema POS con soporte completo para dark mode.\n *\n * **Características:**\n * - Badge de categoría con 19 colores configurables\n * - Referencia del producto (text-[10px]/leading-3)\n * - Precio total (text-xs/font-bold)\n * - Nombre del producto (text-xs/font-bold)\n * - Descripción con items opcionales (fondo terciario)\n * - Control de cantidad integrado (Quantity component)\n * - Botón de eliminar con color de error\n *\n * **Especificaciones de Figma:**\n * - Ancho base: 272px\n * - Spacing: gap-1 (4px) entre elementos del producto, gap-2 (8px) entre secciones\n * - Badge: rounded-md (6px), px-1.5, py-1, text-xs/leading-4\n * - Description section: bg-background-tertiary, p-2, rounded-lg\n * - Delete icon: 24x24px, color red-700\n *\n * **Dark Mode:**\n * Los colores se adaptan automáticamente en dark mode:\n * - Textos principales: text-content-primary → dark:text-dark-content-primary\n * - Description background: bg-background-tertiary → dark:bg-zinc-700\n * - Badge colores: Mantienen contraste en ambos modos\n * - Delete button: text-red-700 → dark:text-red-500\n *\n * **Orden de modificadores:** {responsive}:{dark}:{state}:{utility}\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4507-28013 - Diseño Figma\n *\n * @example\n * ```tsx\n * <POSProductSidebarItems\n * categoryLabel=\"Entradas\"\n * productRef=\"00147258369\"\n * price=\"$ 40,000.00\"\n * productName=\"Nombre producto\"\n * descriptionItems={[\n * { description: \"Papas limón mediana\", price: \"$ 40,000.00\" },\n * { description: \"Papas limón mediana\", price: \"$ 40,000.00\" },\n * ]}\n * quantity={0}\n * onQuantityChange={(qty) => console.log(qty)}\n * onDelete={() => console.log('Eliminar')}\n * />\n * ```\n */\nexport const POSProductSidebarItems: React.FC<POSProductSidebarItemsProps> = ({\n categoryLabel,\n categoryColor = 'lime',\n productRef,\n price,\n productName,\n descriptionItems = [],\n showDescription = true,\n quantity = 0,\n minQuantity = 0,\n maxQuantity,\n onQuantityChange,\n onDelete,\n disabled = false,\n className = '',\n deleteIcon,\n}) => {\n // ===== MAPA DE COLORES PARA BADGES =====\n // Basado en Figma node 4507-28432: bg lime-100 (#ecfccb) y text lime-700 (#4d7c0f)\n // Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n const categoryColorClasses: Record<string, { bg: string; text: string }> = {\n lime: {\n bg: 'bg-lime-100 dark:bg-lime-900/40',\n text: 'text-lime-700 dark:text-lime-300'\n },\n red: {\n bg: 'bg-red-100 dark:bg-red-900/40',\n text: 'text-red-700 dark:text-red-300'\n },\n orange: {\n bg: 'bg-orange-100 dark:bg-orange-900/40',\n text: 'text-orange-700 dark:text-orange-300'\n },\n amber: {\n bg: 'bg-amber-100 dark:bg-amber-900/40',\n text: 'text-amber-700 dark:text-amber-300'\n },\n yellow: {\n bg: 'bg-yellow-100 dark:bg-yellow-900/40',\n text: 'text-yellow-700 dark:text-yellow-300'\n },\n green: {\n bg: 'bg-green-100 dark:bg-green-900/40',\n text: 'text-green-700 dark:text-green-300'\n },\n emerald: {\n bg: 'bg-emerald-100 dark:bg-emerald-900/40',\n text: 'text-emerald-700 dark:text-emerald-300'\n },\n teal: {\n bg: 'bg-teal-100 dark:bg-teal-900/40',\n text: 'text-teal-700 dark:text-teal-300'\n },\n cyan: {\n bg: 'bg-cyan-100 dark:bg-cyan-900/40',\n text: 'text-cyan-700 dark:text-cyan-300'\n },\n sky: {\n bg: 'bg-sky-100 dark:bg-sky-900/40',\n text: 'text-sky-700 dark:text-sky-300'\n },\n blue: {\n bg: 'bg-blue-100 dark:bg-blue-900/40',\n text: 'text-blue-700 dark:text-blue-300'\n },\n indigo: {\n bg: 'bg-indigo-100 dark:bg-indigo-900/40',\n text: 'text-indigo-700 dark:text-indigo-300'\n },\n violet: {\n bg: 'bg-violet-100 dark:bg-violet-900/40',\n text: 'text-violet-700 dark:text-violet-300'\n },\n purple: {\n bg: 'bg-purple-100 dark:bg-purple-900/40',\n text: 'text-purple-700 dark:text-purple-300'\n },\n fuchsia: {\n bg: 'bg-fuchsia-100 dark:bg-fuchsia-900/40',\n text: 'text-fuchsia-700 dark:text-fuchsia-300'\n },\n pink: {\n bg: 'bg-pink-100 dark:bg-pink-900/40',\n text: 'text-pink-700 dark:text-pink-300'\n },\n rose: {\n bg: 'bg-rose-100 dark:bg-rose-900/40',\n text: 'text-rose-700 dark:text-rose-300'\n },\n zinc: {\n bg: 'bg-zinc-100 dark:bg-zinc-800/50',\n text: 'text-zinc-600 dark:text-zinc-300'\n },\n primary: {\n bg: 'bg-primary-custom-100 dark:bg-primary-custom-600/30',\n text: 'text-primary-custom-600 dark:text-primary-custom-300'\n },\n };\n\n const colors = categoryColorClasses[categoryColor] || categoryColorClasses.lime;\n\n // Handler para cambio de cantidad\n const handleQuantityChange = (newQuantity: number) => {\n if (!disabled && onQuantityChange) {\n onQuantityChange(newQuantity);\n }\n };\n\n // Handler para eliminar\n const handleDelete = () => {\n if (!disabled && onDelete) {\n onDelete();\n }\n };\n\n return (\n <div\n className={`\n flex\n flex-col\n gap-2\n w-full\n ${disabled ? 'opacity-50 pointer-events-none' : ''}\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n data-component=\"POSProductSidebarItems\"\n >\n {/* ===== BODY SECTION ===== */}\n <div className=\"flex flex-col gap-2 w-full\">\n {/* ===== PRODUCT INFO ===== */}\n <div className=\"flex flex-col gap-1 w-full\">\n {/* Row: Badge + Ref + Price - Figma node 4507:28398 */}\n <div className=\"flex items-center gap-1 w-full\">\n {/* Col: Badge + Ref - Figma node 4507:28399 */}\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {/* Category Badge - Figma node 4507:28432 */}\n <div\n className={`\n inline-flex\n items-center\n px-1.5\n py-1\n rounded-md\n transition-colors\n duration-150\n ${colors.bg}\n `.trim().replace(/\\s+/g, ' ')}\n >\n <span\n className={`\n text-xs\n leading-4\n font-normal\n text-center\n whitespace-nowrap\n ${colors.text}\n `.trim().replace(/\\s+/g, ' ')}\n >\n {categoryLabel}\n </span>\n </div>\n\n {/* Product Reference - Figma node 4507:28401 - Paragraph/XXSmall 10px */}\n <span className=\"text-[10px] leading-3 font-normal text-content-primary dark:text-dark-content-primary whitespace-nowrap\">\n {productRef}\n </span>\n </div>\n\n {/* Col: Price - Figma node 4507:28450 - Label/Tiny 12px Bold */}\n <div className=\"flex items-center shrink-0\">\n <span className=\"text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right\">\n {price}\n </span>\n </div>\n </div>\n\n {/* Row: Product Name - Figma node 4507:28404 - Label/Tiny 12px Bold */}\n <div className=\"flex items-start w-full\">\n <span className=\"text-xs leading-4 font-bold text-content-primary dark:text-dark-content-primary flex-1 min-w-0\">\n {productName}\n </span>\n </div>\n </div>\n\n {/* ===== DESCRIPTION SECTION ===== */}\n {/* Figma node 4507:28405 - Background tertiary con items de descripción */}\n {showDescription && descriptionItems.length > 0 && (\n <div\n className={`\n flex\n flex-col\n gap-2\n p-2\n rounded-lg\n bg-background-secondary\n dark:bg-zinc-700\n w-full\n transition-colors\n duration-150\n `.trim().replace(/\\s+/g, ' ')}\n >\n {descriptionItems.map((item, index) => (\n <div\n key={index}\n className=\"flex items-center gap-1 w-full\"\n >\n {/* Description text - Figma Body/Small 12px Regular */}\n <span className=\"flex-1 min-w-0 text-xs leading-3 font-normal text-content-primary dark:text-dark-content-primary\">\n {item.description}\n </span>\n {/* Price - Figma Body/Small Bold 12px */}\n <span className=\"text-xs leading-3 font-bold text-content-primary dark:text-dark-content-primary whitespace-nowrap text-right shrink-0\">\n {item.price}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* ===== ACTIONS SECTION ===== */}\n {/* Figma node 4507:28412 - Quantity control + Delete button */}\n <div className=\"flex items-center justify-between w-full\">\n {/* Quantity Control - Figma width: 118px */}\n <div className=\"w-[118px]\">\n <Quantity\n value={quantity}\n min={minQuantity}\n max={maxQuantity}\n onChange={handleQuantityChange}\n disabled={disabled}\n />\n </div>\n\n {/* Delete Button - Figma node 4514:28258 - 24x24px, color red-700 (#b91c1c) */}\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={disabled}\n className={`\n flex\n items-center\n justify-center\n w-6\n h-6\n rounded-md\n text-red-700\n dark:text-red-500\n hover:text-red-800\n dark:hover:text-red-400\n hover:bg-red-50\n dark:hover:bg-red-900/20\n focus:outline-none\n focus:ring-2\n focus:ring-red-500/50\n dark:focus:ring-red-400/50\n focus:ring-offset-1\n focus:ring-offset-white\n dark:focus:ring-offset-dark-bg-primary\n active:scale-95\n transition-all\n duration-150\n ${disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'}\n `.trim().replace(/\\s+/g, ' ')}\n aria-label=\"Eliminar producto\"\n >\n {deleteIcon || <TrashIcon className=\"w-[18px] h-[21px]\" />}\n </button>\n </div>\n </div>\n );\n};\n\nPOSProductSidebarItems.displayName = 'POSProductSidebarItems';\n","import React from 'react';\nimport type { POSTableProps } from './POSTable.types';\n\n/**\n * POSTable - Sistema de visualización de mesas de restaurante\n *\n * Componente para mostrar mesas de restaurante con diferentes estados\n * (disponible, ocupada, reservada) y configuraciones de sillas según diseño de Figma.\n *\n * ⚠️ IMPORTANTE - COLORES PERSONALIZADOS DEL CLIENTE:\n * Este componente usa colores específicos hardcodeados según el diseño del cliente.\n * Estos NO son tokens del sistema de diseño general, sino colores únicos para POSTable.\n * Esta es una EXCEPCIÓN JUSTIFICADA similar a los iconos personalizados de POSTable.\n *\n * ESPECIFICACIONES PIXEL-PERFECT DE FIGMA:\n *\n * Colores exactos (ESPECÍFICOS DEL CLIENTE):\n *\n * LIGHT MODE:\n * - Available (Azul): #0e79fd (border, mesa, silla, texto) - Azul primario del sistema\n * - Available Active: Bg #dbeefe + Border #bce4ff (cuando isActive=true)\n * - Busy (Naranja): #af460e (border, mesa, silla, texto)\n * - Busy Active: Bg #fed7aa + Border #fed7aa (cuando isActive=true)\n * - Reserved (Púrpura): #7e22ce (border, mesa, silla, texto)\n * - Reserved Active: Bg #e9d5ff + Border #e9d5ff (cuando isActive=true)\n *\n * DARK MODE (colores más brillantes para mejor visibilidad):\n * - Available (Azul claro): #93d1fd (border, mesa, silla, texto)\n * - Available Active: Bg #1e3a5f + Border #1e3a5f (cuando isActive=true)\n * - Busy (Naranja/Amarillo): #f5a927 (border, mesa, silla, texto)\n * - Busy Active: Bg #5c3a1e + Border #5c3a1e (cuando isActive=true)\n * - Reserved (Púrpura claro): #c084fc (border, mesa, silla, texto)\n * - Reserved Active: Bg #3b1f5c + Border #3b1f5c (cuando isActive=true)\n *\n * - Texto del label: Mismo color del estado (está FUERA de la mesa según Figma)\n *\n * Dimensiones exactas:\n * - Container: 160x160px, border-radius: 8px, border: 2px\n * - Inner container: 134x134px, gap: 4px\n * - Mesa Square: 64x64px, border-radius: 4px\n * - Mesa Circle: 64x64px, border-radius: 9999px\n * - Mesa Rectangle: 80x64px, border-radius: 4px\n * - Mesa Oval: 80x64px, border-radius: 24px\n * - Silla: 28x22px, border-radius: 4px\n * - Silla Respaldo (top): 28x16px (72.73% height)\n * - Silla Asiento (bottom): 24x14px (85.71% width, 63.64% height)\n * - Gap: 4px entre todos los elementos\n *\n * Tipografía:\n * - Label: 10px / 12px line-height, weight: 400, font: SiesaBT\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Focus rings adaptativos para light y dark mode\n * - Valores exactos de Figma con notación [px]\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n *\n * @example\n * ```tsx\n * <POSTable\n * tableNumber=\"12\"\n * status=\"available\"\n * shape=\"square\"\n * chairs={4}\n * onClick={() => console.log('Mesa seleccionada')}\n * />\n * ```\n */\nexport const POSTable: React.FC<POSTableProps> = ({\n tableNumber,\n status = 'available',\n shape = 'square',\n chairs = 4,\n showChairs = true,\n isActive = false,\n onClick,\n className = '',\n disabled = false,\n children,\n}) => {\n // ===== COLORES POR ESTADO (VALORES EXACTOS DE FIGMA) =====\n // ⚠️ NOTA: Estos colores son ESPECÍFICOS del cliente (excepción justificada)\n // NO son tokens del sistema general de diseño\n // Light Mode: #0e79fd (azul primario), #af460e (naranja), #7e22ce (púrpura)\n // Dark Mode: #93d1fd (azul claro), #f5a927 (naranja/amarillo), #c084fc (púrpura claro)\n const statusColors = {\n available: {\n // Enabled state - Light: #0e79fd (azul primario del sistema), Dark: #93d1fd\n border: 'border-[#0e79fd]',\n borderDark: 'dark:border-[#93d1fd]',\n bgEnabled: 'bg-transparent',\n bgEnabledDark: 'dark:bg-transparent',\n // Actived state - Light: Bg #dbeefe + Border #bce4ff según Figma\n bgActive: 'bg-[#dbeefe]',\n bgActiveDark: 'dark:bg-[#1e3a5f]',\n borderActive: 'border-[#bce4ff]',\n borderActiveDark: 'dark:border-[#1e3a5f]',\n // Table and chairs - Light: #0e79fd, Dark: #93d1fd\n table: 'bg-[#0e79fd]',\n tableDark: 'dark:bg-[#93d1fd]',\n chair: 'bg-[#0e79fd]',\n chairDark: 'dark:bg-[#93d1fd]',\n // Text (mismo color del estado - label está FUERA de la mesa según Figma)\n text: 'text-[#0e79fd]',\n textDark: 'dark:text-[#93d1fd]',\n // Focus ring\n focusRing: 'focus:ring-[#93d1fd]',\n focusRingDark: 'dark:focus:ring-[#0e79fd]',\n },\n busy: {\n // Enabled state - Light: #af460e, Dark: #f5a927\n border: 'border-[#af460e]',\n borderDark: 'dark:border-[#f5a927]',\n bgEnabled: 'bg-transparent',\n bgEnabledDark: 'dark:bg-transparent',\n // Actived state\n bgActive: 'bg-[#fed7aa]',\n bgActiveDark: 'dark:bg-[#5c3a1e]',\n borderActive: 'border-[#fed7aa]',\n borderActiveDark: 'dark:border-[#5c3a1e]',\n // Table and chairs - Light: #af460e, Dark: #f5a927\n table: 'bg-[#af460e]',\n tableDark: 'dark:bg-[#f5a927]',\n chair: 'bg-[#af460e]',\n chairDark: 'dark:bg-[#f5a927]',\n // Text (mismo color del estado - label está FUERA de la mesa según Figma)\n text: 'text-[#af460e]',\n textDark: 'dark:text-[#f5a927]',\n // Focus ring\n focusRing: 'focus:ring-[#f5a927]',\n focusRingDark: 'dark:focus:ring-[#af460e]',\n },\n reserved: {\n // Enabled state - Light: #7e22ce, Dark: #c084fc\n border: 'border-[#7e22ce]',\n borderDark: 'dark:border-[#c084fc]',\n bgEnabled: 'bg-transparent',\n bgEnabledDark: 'dark:bg-transparent',\n // Actived state\n bgActive: 'bg-[#e9d5ff]',\n bgActiveDark: 'dark:bg-[#3b1f5c]',\n borderActive: 'border-[#e9d5ff]',\n borderActiveDark: 'dark:border-[#3b1f5c]',\n // Table and chairs - Light: #7e22ce, Dark: #c084fc\n table: 'bg-[#7e22ce]',\n tableDark: 'dark:bg-[#c084fc]',\n chair: 'bg-[#7e22ce]',\n chairDark: 'dark:bg-[#c084fc]',\n // Text (mismo color del estado - label está FUERA de la mesa según Figma)\n text: 'text-[#7e22ce]',\n textDark: 'dark:text-[#c084fc]',\n // Focus ring\n focusRing: 'focus:ring-[#c084fc]',\n focusRingDark: 'dark:focus:ring-[#7e22ce]',\n },\n };\n\n // ===== CLASES DE FORMA (ESPECIFICACIONES EXACTAS DE FIGMA) =====\n const shapeClasses = {\n square: {\n container: 'rounded-[4px]',\n table: 'w-[64px] h-[64px] rounded-[4px]',\n },\n circle: {\n container: 'rounded-[9999px]',\n table: 'w-[64px] h-[64px] rounded-[9999px]',\n },\n rectangle: {\n container: 'rounded-[4px]',\n table: 'w-[80px] h-[64px] rounded-[4px]',\n },\n oval: {\n container: 'rounded-[24px]',\n table: 'w-[80px] h-[64px] rounded-[24px]',\n },\n };\n\n // ===== COMPONENTE SILLA (ESPECIFICACIONES EXACTAS DE FIGMA) =====\n const Chair: React.FC<{ rotation: number }> = ({ rotation }) => (\n <div\n className=\"w-[28px] h-[22px]\"\n style={{ transform: `rotate(${rotation}deg)` }}\n aria-hidden=\"true\"\n >\n {/* Respaldo (parte superior) - 72.73% height */}\n <div\n className={`\n absolute\n top-0\n left-0\n right-0\n h-[16px]\n rounded-t-[4px]\n ${statusColors[status].chair}\n ${statusColors[status].chairDark}\n `}\n />\n {/* Asiento (parte inferior) - 85.71% width, 63.64% height */}\n <div\n className={`\n absolute\n bottom-0\n left-[7.14%]\n right-[7.14%]\n h-[14px]\n rounded-b-[4px]\n ${statusColors[status].chair}\n ${statusColors[status].chairDark}\n `}\n />\n </div>\n );\n\n // ===== HANDLER DE CLICK =====\n const handleClick = () => {\n if (!disabled && onClick) {\n onClick();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if ((e.key === 'Enter' || e.key === ' ') && !disabled && onClick) {\n e.preventDefault();\n onClick();\n }\n };\n\n // ===== CLASES DEL CONTAINER (160x160px según Figma) =====\n const containerClasses = [\n // Dimensiones exactas del container\n 'w-[160px]',\n 'h-[160px]',\n 'shrink-0',\n\n // Estructura\n 'relative',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'p-0',\n\n // Borde (2px según Figma)\n 'border-2',\n 'box-border',\n\n // Border radius (8px según Figma)\n 'rounded-[8px]',\n\n // Colores del borde y fondo según estado\n isActive ? statusColors[status].borderActive : statusColors[status].border,\n isActive ? statusColors[status].borderActiveDark : statusColors[status].borderDark,\n isActive ? statusColors[status].bgActive : statusColors[status].bgEnabled,\n isActive ? statusColors[status].bgActiveDark : statusColors[status].bgEnabledDark,\n\n // Focus rings adaptativos (siguiendo patrón de Button)\n 'focus:outline-none',\n 'focus:ring-2',\n statusColors[status].focusRing,\n statusColors[status].focusRingDark,\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-dark-bg-primary',\n\n // Transiciones\n 'transition-all',\n 'duration-150',\n\n // Interactividad\n onClick && !disabled ? 'cursor-pointer' : '',\n onClick && !disabled ? 'hover:scale-105' : '',\n onClick && !disabled ? 'active:scale-95' : '',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n\n // Clases adicionales\n className,\n ]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n // ===== RENDER =====\n return (\n <button\n className={containerClasses}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n type=\"button\"\n aria-label={`Mesa ${tableNumber} - ${\n status === 'available' ? 'Disponible' : status === 'busy' ? 'Ocupada' : 'Reservada'\n }`}\n >\n {/* INNER CONTAINER (134x134px según Figma) */}\n <div className=\"flex flex-col gap-[4px] items-center justify-center w-[134px] h-[134px] shrink-0\">\n {/* FILA DE SILLAS SUPERIORES */}\n {showChairs && (chairs === 2 || chairs === 4 || chairs === 6 || chairs === 8) && (\n <div className=\"flex gap-[4px] items-center justify-center shrink-0\">\n {chairs >= 6 && (\n <>\n <Chair rotation={0} />\n <Chair rotation={0} />\n </>\n )}\n {chairs === 2 && <Chair rotation={0} />}\n {chairs === 4 && <Chair rotation={0} />}\n </div>\n )}\n\n {/* FILA CENTRAL CON MESA Y SILLAS LATERALES */}\n <div className=\"flex gap-[4px] items-center justify-center shrink-0\">\n {/* COLUMNA IZQUIERDA - SILLAS */}\n {showChairs && (chairs === 4 || chairs === 6 || chairs === 8) && (\n <div className=\"flex flex-col gap-[4px] items-start justify-center shrink-0\">\n {chairs >= 8 && (\n <>\n <Chair rotation={270} />\n <Chair rotation={270} />\n </>\n )}\n {(chairs === 4 || chairs === 6) && <Chair rotation={270} />}\n </div>\n )}\n\n {/* MESA (sin label - el label va fuera según Figma) */}\n <div className=\"flex flex-col gap-[4px] items-start justify-center shrink-0\">\n <div className=\"flex items-center shrink-0\">\n <div\n className={`\n ${shapeClasses[shape].table}\n ${statusColors[status].table}\n ${statusColors[status].tableDark}\n shrink-0\n `}\n />\n </div>\n </div>\n\n {/* COLUMNA DERECHA - SILLAS */}\n {showChairs && (chairs === 4 || chairs === 6 || chairs === 8) && (\n <div className=\"flex flex-col gap-[4px] items-start justify-center shrink-0\">\n {chairs >= 8 && (\n <>\n <Chair rotation={90} />\n <Chair rotation={90} />\n </>\n )}\n {(chairs === 4 || chairs === 6) && <Chair rotation={90} />}\n </div>\n )}\n </div>\n\n {/* FILA DE SILLAS INFERIORES */}\n {showChairs && (chairs === 2 || chairs === 4 || chairs === 6 || chairs === 8) && (\n <div className=\"flex gap-[4px] items-center justify-center shrink-0\">\n {chairs >= 6 && (\n <>\n <Chair rotation={180} />\n <Chair rotation={180} />\n </>\n )}\n {chairs === 2 && <Chair rotation={180} />}\n {chairs === 4 && <Chair rotation={180} />}\n </div>\n )}\n </div>\n\n {/* LABEL DE NÚMERO DE MESA - Debajo del conjunto mesa+sillas según Figma */}\n <div\n className={`\n flex\n flex-col\n justify-center\n leading-[0]\n not-italic\n overflow-ellipsis\n overflow-hidden\n min-w-full\n text-center\n whitespace-nowrap\n shrink-0\n text-[10px]\n font-normal\n ${statusColors[status].text}\n ${statusColors[status].textDark}\n `}\n >\n <p className=\"leading-[12px] overflow-ellipsis overflow-hidden\">\n Mesa {tableNumber}\n </p>\n {children}\n </div>\n </button>\n );\n};\n","import React from 'react';\n\n/**\n * Icono de sobre (envelope) para el input de email\n */\nexport const EnvelopeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n\n/**\n * Icono de candado cerrado (lock) para el input de contraseña\n */\nexport const LockClosedIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de ojo (eye) para mostrar/ocultar contraseña\n */\nexport const EyeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .56A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Logo de Siesa\n */\nexport const SiesaLogo: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"200\"\n height=\"50\"\n viewBox=\"0 0 200 50\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n {/* Símbolo de Siesa (cuadrados azules) */}\n <rect x=\"0\" y=\"0\" width=\"15\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"0\" y=\"30\" width=\"10\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"20\" y=\"0\" width=\"15\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"30\" y=\"30\" width=\"10\" height=\"20\" fill=\"#0e79fd\" />\n\n {/* Texto \"Siesa\" */}\n <text\n x=\"68\"\n y=\"35\"\n fontFamily=\"SiesaBT, sans-serif\"\n fontSize=\"32\"\n fontWeight=\"400\"\n fill=\"#0e79fd\"\n >\n Siesa\n </text>\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { LoginViewProps } from './LoginView.types';\nimport { EnvelopeIcon, LockClosedIcon, EyeIcon } from './icons';\n\n/**\n * LoginView - Vista de inicio de sesión del sistema Siesa\n *\n * Vista completa de login con formulario de autenticación que incluye:\n * - Logo de Siesa\n * - Campos de email y contraseña\n * - Opción de \"olvidé mi contraseña\"\n * - Link para crear cuenta nueva\n * - Fondo decorativo opcional\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y manejo de formulario semántico\n * - Validación de email básica\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <LoginView\n * onSubmit={(email, password) => console.log('Login', email, password)}\n * onForgotPassword={() => console.log('Forgot password')}\n * onSignUp={() => console.log('Sign up')}\n * />\n * ```\n */\nexport const LoginView: React.FC<LoginViewProps> = ({\n onSubmit,\n onForgotPassword,\n onSignUp,\n isLoading = false,\n errorMessage,\n className = '',\n showBackground = true,\n variant = 'responsive',\n}) => {\n // ===== ESTADO LOCAL =====\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [emailError, setEmailError] = useState('');\n\n // ===== HANDLERS =====\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Validación básica de email\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setEmailError('Por favor ingresa un email válido');\n return;\n }\n\n setEmailError('');\n onSubmit?.(email, password);\n };\n\n const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value);\n if (emailError) setEmailError('');\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div\n className={[\n 'relative',\n 'min-h-screen',\n 'w-full',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'box-border',\n // Mobile: sin padding en el wrapper (el padding está en el contenedor)\n 'p-0',\n // Desktop: padding para centrar el card\n 'md:p-4',\n className,\n ].join(' ')}\n >\n {/* ===== FONDO DECORATIVO ===== */}\n {showBackground && (\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\">\n <div className=\"absolute inset-0 bg-primary-custom-100 dark:bg-[#112d57]\" />\n <img\n src=\"/bg_siesa.png\"\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-10\"\n />\n </div>\n )}\n\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div\n className={[\n // Clases base comunes\n 'relative',\n 'box-border',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-4',\n 'p-16',\n 'shrink-0',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n\n // Clases específicas según variant\n ...(variant === 'mobile' ? [\n // Forzar mobile: sin efectos de card\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n ] : variant === 'desktop' ? [\n // Forzar desktop: con efectos de card\n 'w-[400px]',\n 'h-auto',\n 'rounded-2xl',\n 'shadow-lg',\n 'dark:shadow-2xl',\n 'overflow-clip',\n 'border',\n 'border-transparent',\n 'dark:border-dark-border-primary',\n ] : [\n // Responsive: cambia según viewport\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n 'md:w-[400px]',\n 'md:h-auto',\n 'md:rounded-2xl',\n 'md:shadow-lg',\n 'md:dark:shadow-2xl',\n 'md:overflow-clip',\n 'md:border',\n 'md:border-transparent',\n 'md:dark:border-dark-border-primary',\n ]),\n ].join(' ')}\n >\n {/* ===== LOGO ===== */}\n <div className=\"w-full flex flex-col items-center pb-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[200px] h-[50px] object-contain\"\n />\n </div>\n\n {/* ===== HEADING ===== */}\n <div className=\"w-full text-center\">\n <h1\n className={[\n 'text-[20px]',\n 'leading-[28px]',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Iniciar Sesión\n </h1>\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Inicia sesión ingresando con tu correo electrónico y contraseña.\n </p>\n </div>\n\n {/* ===== MENSAJE DE ERROR GENERAL ===== */}\n {errorMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-error-bg',\n 'dark:bg-error-bg',\n 'border',\n 'border-error-border',\n 'dark:border-error-border',\n 'rounded-md',\n 'text-error-content',\n 'dark:text-error-content',\n 'text-sm',\n ].join(' ')}\n role=\"alert\"\n >\n {errorMessage}\n </div>\n )}\n\n {/* ===== FORMULARIO ===== */}\n <form onSubmit={handleSubmit} className=\"w-full flex flex-col gap-2\">\n {/* Email Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"email-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Correo Electrónico <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <EnvelopeIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"email-input\"\n type=\"email\"\n placeholder=\"ejemplo@miempresa.com\"\n value={email}\n onChange={handleEmailChange}\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n emailError ? '!border-error-border' : '',\n ].filter(Boolean).join(' ')}\n />\n </div>\n {emailError && (\n <p className=\"text-xs text-error-content dark:text-error-content\">\n {emailError}\n </p>\n )}\n </div>\n\n {/* Password Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <div className=\"flex items-center justify-between\">\n <label\n htmlFor=\"password-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Contraseña <span className=\"text-red-600\">*</span>\n </label>\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-[12px] leading-4 font-bold text-primary-custom-600 dark:text-[#93d1fd] hover:underline transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded px-1\"\n >\n Olvidé mi Contraseña\n </button>\n </div>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <LockClosedIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"password-input\"\n type={showPassword ? 'text' : 'password'}\n placeholder=\"••••••••\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"current-password\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-10',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-50 hover:opacity-100 text-content-tertiary dark:text-dark-content-tertiary transition-opacity duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-dark-border-custom rounded p-1\"\n aria-label={showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña'}\n >\n <EyeIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={isLoading || !email || !password}\n className={[\n 'relative',\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#eff8ff]',\n 'dark:text-[#0e79fd]',\n 'bg-[#0e79fd]',\n 'dark:bg-[#bfe2fe]',\n 'border',\n 'border-[#3c9bf6]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'button-inset-shadow',\n 'hover:bg-primary-custom-500',\n 'dark:hover:bg-[#93d1fd]',\n 'active:scale-95',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n >\n {isLoading ? 'Iniciando sesión...' : 'Iniciar Sesión'}\n </button>\n </form>\n\n {/* ===== SIGN UP LINK ===== */}\n <button\n type=\"button\"\n onClick={onSignUp}\n className={[\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#0e79fd]',\n 'dark:text-[#93d1fd]',\n 'hover:bg-primary-custom-100',\n 'dark:hover:bg-[#93d1fd]/10',\n 'rounded-md',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n ].join(' ')}\n >\n ¿No tienes una cuenta?\n </button>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Icono de círculo de usuario para el input de nombre\n */\nexport const UserCircleIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0Zm-5-2a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM8 9c-1.825 0-3.422.977-4.295 2.437A5.49 5.49 0 0 0 8 13.5a5.49 5.49 0 0 0 4.294-2.063A4.997 4.997 0 0 0 8 9Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de sobre (envelope) para el input de email\n */\nexport const EnvelopeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n\n/**\n * Icono de candado cerrado (lock) para el input de contraseña\n */\nexport const LockClosedIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de ojo (eye) para mostrar/ocultar contraseña\n */\nexport const EyeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .56A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { SignUpViewProps } from './SignUpView.types';\nimport { UserCircleIcon, EnvelopeIcon, LockClosedIcon, EyeIcon } from './icons';\n\n/**\n * SignUpView - Vista de registro del sistema Siesa\n *\n * Vista completa de registro con formulario que incluye:\n * - Logo de Siesa\n * - Campos de nombre, email y contraseña\n * - Botón de registro\n * - Link para iniciar sesión\n * - Texto de términos y condiciones\n * - Fondo decorativo opcional\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y manejo de formulario semántico\n * - Validación de email básica\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <SignUpView\n * onSubmit={(name, email, password) => console.log('Sign up', name, email, password)}\n * onSignIn={() => console.log('Go to sign in')}\n * onTermsClick={() => console.log('View terms')}\n * onPrivacyClick={() => console.log('View privacy')}\n * />\n * ```\n */\nexport const SignUpView: React.FC<SignUpViewProps> = ({\n onSubmit,\n onSignIn,\n onTermsClick,\n onPrivacyClick,\n isLoading = false,\n errorMessage,\n className = '',\n showBackground = true,\n variant = 'responsive',\n}) => {\n // ===== ESTADO LOCAL =====\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [emailError, setEmailError] = useState('');\n\n // ===== HANDLERS =====\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Validación básica de email\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setEmailError('Por favor ingresa un email válido');\n return;\n }\n\n setEmailError('');\n onSubmit?.(name, email, password);\n };\n\n const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value);\n if (emailError) setEmailError('');\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div\n className={[\n 'relative',\n 'min-h-screen',\n 'w-full',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'box-border',\n // Mobile: sin padding en el wrapper\n 'p-0',\n // Desktop: padding para centrar el card\n 'md:p-4',\n className,\n ].join(' ')}\n >\n {/* ===== FONDO DECORATIVO ===== */}\n {showBackground && (\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\">\n <div className=\"absolute inset-0 bg-primary-custom-100 dark:bg-[#112d57]\" />\n <img\n src=\"/bg_siesa.png\"\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-10\"\n />\n </div>\n )}\n\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div\n className={[\n // Clases base comunes\n 'relative',\n 'box-border',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-4',\n 'p-16',\n 'shrink-0',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n\n // Clases específicas según variant\n ...(variant === 'mobile' ? [\n // Forzar mobile: sin efectos de card\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n ] : variant === 'desktop' ? [\n // Forzar desktop: con efectos de card\n 'w-[400px]',\n 'h-auto',\n 'rounded-2xl',\n 'shadow-lg',\n 'dark:shadow-2xl',\n 'overflow-clip',\n 'border',\n 'border-transparent',\n 'dark:border-dark-border-primary',\n ] : [\n // Responsive: cambia según viewport\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n 'md:w-[400px]',\n 'md:h-auto',\n 'md:rounded-2xl',\n 'md:shadow-lg',\n 'md:dark:shadow-2xl',\n 'md:overflow-clip',\n 'md:border',\n 'md:border-transparent',\n 'md:dark:border-dark-border-primary',\n ]),\n ].join(' ')}\n >\n {/* ===== LOGO ===== */}\n <div className=\"w-full flex flex-col items-center pb-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[200px] h-[50px] object-contain\"\n />\n </div>\n\n {/* ===== HEADING ===== */}\n <div className=\"w-full text-center\">\n <h1\n className={[\n 'text-[20px]',\n 'leading-[28px]',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Crear Cuenta\n </h1>\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Ingresa todos los datos para crear tu cuenta.\n </p>\n </div>\n\n {/* ===== MENSAJE DE ERROR GENERAL ===== */}\n {errorMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-error-bg',\n 'dark:bg-error-bg',\n 'border',\n 'border-error-border',\n 'dark:border-error-border',\n 'rounded-md',\n 'text-error-content',\n 'dark:text-error-content',\n 'text-sm',\n ].join(' ')}\n role=\"alert\"\n >\n {errorMessage}\n </div>\n )}\n\n {/* ===== FORMULARIO ===== */}\n <form onSubmit={handleSubmit} className=\"w-full flex flex-col gap-2\">\n {/* Name Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"name-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Nombre <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <UserCircleIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"name-input\"\n type=\"text\"\n placeholder=\"Juan Pérez\"\n value={name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setName(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"name\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n </div>\n </div>\n\n {/* Email Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"email-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Correo Electrónico <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <EnvelopeIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"email-input\"\n type=\"email\"\n placeholder=\"ejemplo@miempresa.com\"\n value={email}\n onChange={handleEmailChange}\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n emailError ? '!border-error-border' : '',\n ].filter(Boolean).join(' ')}\n />\n </div>\n {emailError && (\n <p className=\"text-xs text-error-content dark:text-error-content\">\n {emailError}\n </p>\n )}\n </div>\n\n {/* Password Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"password-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Contraseña <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <LockClosedIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"password-input\"\n type={showPassword ? 'text' : 'password'}\n placeholder=\"••••••••\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-10',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-50 hover:opacity-100 text-content-tertiary dark:text-dark-content-tertiary transition-opacity duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-dark-border-custom rounded p-1\"\n aria-label={showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña'}\n >\n <EyeIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={isLoading || !name || !email || !password}\n className={[\n 'relative',\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#eff8ff]',\n 'dark:text-[#0e79fd]',\n 'bg-[#0e79fd]',\n 'dark:bg-[#bfe2fe]',\n 'border',\n 'border-[#3c9bf6]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'shadow-inner',\n 'hover:bg-primary-custom-500',\n 'dark:hover:bg-[#93d1fd]',\n 'active:scale-95',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n >\n {isLoading ? 'Registrando...' : 'Registrarse'}\n </button>\n </form>\n\n {/* ===== SIGN IN LINK ===== */}\n <button\n type=\"button\"\n onClick={onSignIn}\n className={[\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#0e79fd]',\n 'dark:text-[#93d1fd]',\n 'hover:bg-primary-custom-100',\n 'dark:hover:bg-[#93d1fd]/10',\n 'rounded-md',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n ].join(' ')}\n >\n Ya tengo una cuenta\n </button>\n\n {/* ===== TÉRMINOS Y CONDICIONES ===== */}\n <div className=\"w-full text-center\">\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Al registrarse, estás aceptando nuestras{' '}\n <button\n type=\"button\"\n onClick={onTermsClick}\n className=\"text-[#0e79fd] dark:text-[#93d1fd] underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded\"\n >\n Condiciones de Uso\n </button>\n {' '}y nuestras{' '}\n <button\n type=\"button\"\n onClick={onPrivacyClick}\n className=\"text-[#0e79fd] dark:text-[#93d1fd] underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded\"\n >\n Políticas de Privacidad\n </button>\n .\n </p>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { Navbar } from '../../components/Navbar';\nimport { NavigationRailCommercial } from '../../components/NavigationRailCommercial';\nimport type { LayoutCommercialProps } from './LayoutCommercial.types';\n\n/**\n * LayoutCommercial - Layout general comercial del sistema Siesa\n *\n * Layout reutilizable que implementa la estructura base del sistema comercial\n * con NavigationRail lateral, Navbar superior y área de contenido dinámico.\n * Diseñado para ser usado como wrapper en diferentes vistas comerciales.\n *\n * **Composición:**\n * - Navbar: Barra superior con logo Siesa, título del producto y dropdown de usuario\n * - NavigationRailCommercial: Rail de navegación lateral con iconos y búsqueda\n * - Área de contenido: Contenido dinámico pasado como children\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Responsive design mobile-first con breakpoints md:, lg:, xl:\n * - Composición con componentes del sistema (NO reimplementación)\n * - Type safety con TypeScript estricto\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see src/components/Navbar - Componente Navbar reutilizado\n * @see src/components/NavigationRailCommercial - Componente NavigationRail reutilizado\n *\n * @example\n * ```tsx\n * <LayoutCommercial\n * productName=\"SB Comercial\"\n * userDropdown={{\n * avatar: '/avatar.jpg',\n * name: 'Carlos',\n * email: 'carlos@siesa.com',\n * }}\n * navigationItems={navigationItems}\n * >\n * <div>\n * <h1>Mi contenido personalizado</h1>\n * <p>Cualquier contenido puede ir aquí</p>\n * </div>\n * </LayoutCommercial>\n * ```\n */\nexport const LayoutCommercial: React.FC<LayoutCommercialProps> = ({\n productName = 'SB Comercial',\n userDropdown,\n navigationItems,\n children,\n className = '',\n contentClassName = '',\n}) => {\n // Estado local para el NavigationRail\n const [navState, setNavState] = useState<'collapsed' | 'expanded' | 'hover' | 'searcher'>('collapsed');\n\n // Handler para cambio de estado del NavigationRail\n const handleNavStateChange = (state: 'collapsed' | 'expanded' | 'hover' | 'searcher' | undefined) => {\n if (state) {\n setNavState(state);\n }\n };\n\n return (\n <div\n className={[\n // ===== BASE CONTAINER =====\n 'h-screen', // Altura fija de pantalla completa\n 'w-full',\n 'bg-white', // Fondo blanco para Navbar y NavigationRail\n 'dark:bg-dark-bg-primary',\n 'flex',\n 'flex-col',\n 'overflow-hidden', // Prevenir scroll en contenedor principal\n className,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {/* ===== NAVBAR ===== */}\n <Navbar\n productName={productName}\n userDropdown={userDropdown}\n hideActionButtons\n showSiesaLogoLeading\n showBusinessLogo={false}\n className=\"bg-white dark:bg-dark-bg-primary\"\n />\n\n {/* ===== LAYOUT: NAVIGATION RAIL + CONTENT ===== */}\n <div className=\"flex flex-1 overflow-hidden\">\n {/* ===== NAVIGATION RAIL ===== */}\n <NavigationRailCommercial\n state={navState}\n items={navigationItems}\n showSearchButton={false}\n onStateChange={handleNavStateChange}\n onItemClick={(item) => console.log('Item clicked:', item)}\n onItemHover={(item) => console.log('Item hover:', item)}\n />\n\n {/* ===== CONTENT AREA ===== */}\n <div\n className={[\n 'flex-1',\n 'overflow-y-auto',\n 'bg-gray-50',\n 'dark:bg-dark-bg-primary',\n contentClassName,\n ]\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim()}\n >\n {children}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Iconos para ListView del sistema de diseño Siesa\n * Basados en Heroicons Micro (16x16)\n */\n\nexport const HomeIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8.543 2.232a.75.75 0 0 0-1.085 0l-5.25 5.5A.75.75 0 0 0 2.75 9H4v4a1 1 0 0 0 1 1h1.5a.5.5 0 0 0 .5-.5v-2a1 1 0 0 1 1-1h.5a1 1 0 0 1 1 1v2a.5.5 0 0 0 .5.5H12a1 1 0 0 0 1-1V9h1.25a.75.75 0 0 0 .543-1.268l-5.25-5.5Z\" />\n </svg>\n);\n\nexport const GlobeAltIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0ZM5.37 2.822a6.493 6.493 0 0 0-2.818 3.428h2.103c.088-.907.254-1.778.494-2.595a8.932 8.932 0 0 1 .221-.833ZM1.5 8c0 .522.062 1.03.179 1.516l.135.484h2.49a16.15 16.15 0 0 1 0-4H1.815L1.68 6.484A6.533 6.533 0 0 0 1.5 8Zm.552 2.75A6.493 6.493 0 0 0 5.37 14.18a8.932 8.932 0 0 1-.221-.833 13.2 13.2 0 0 1-.494-2.595H2.552Zm4.058 0c.083.78.23 1.497.429 2.128.197.622.423 1.07.649 1.357.225.286.401.265.312.265.089 0 .265.021.49-.265.226-.287.452-.735.649-1.357.199-.631.346-1.348.429-2.128H6.11Zm4.234 0a13.198 13.198 0 0 1-.494 2.595 8.938 8.938 0 0 1-.22.833 6.493 6.493 0 0 0 2.817-3.428h-2.103Zm2.104-2h-2.48a16.15 16.15 0 0 0 0-4h2.48l.135.484A6.538 6.538 0 0 1 14.5 8a6.538 6.538 0 0 1-.179 1.516l-.135.484h.162Zm-2.818-4.928c.167.251.394.699.221.833.24.817.406 1.688.494 2.595h2.103a6.493 6.493 0 0 0-2.818-3.428ZM9.89 6h-3.78c.083-.78.23-1.497.429-2.128.197-.622.423-1.07.649-1.357.225-.286.401-.265.312-.265.089 0 .265-.021.49.265.226.287.452.735.649 1.357.199.631.346 1.348.429 2.128Zm-4.234 0H3.553a6.493 6.493 0 0 1 2.818-3.428 8.932 8.932 0 0 0-.221.833c-.24.817-.406 1.688-.494 2.595Zm.144 2a14.65 14.65 0 0 0 0 4h4.4a14.65 14.65 0 0 0 0-4H5.8Z\" />\n </svg>\n);\n\nexport const DocumentTextIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.414A2 2 0 0 0 13.414 5L10 1.586A2 2 0 0 0 8.586 1H4Zm1 5a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1H5Zm-.5 2.5a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5Zm.5 1.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1H5Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const CloudIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M1 9.5A3.5 3.5 0 0 0 4.5 13H12a3 3 0 0 0 .917-5.857 2.503 2.503 0 0 0-3.198-3.019 3.5 3.5 0 0 0-6.628 2.171A3.5 3.5 0 0 0 1 9.5Z\" />\n </svg>\n);\n\nexport const SquaresPlusIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2 4a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4ZM10 4a2 2 0 0 1 2-2h.5a.5.5 0 0 1 0 1H12a1 1 0 0 0-1 1v.5a.5.5 0 0 1-1 0V4ZM2 12a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v2ZM10.5 8a.5.5 0 0 0-.5.5V10H8.5a.5.5 0 0 0 0 1H10v1.5a.5.5 0 0 0 1 0V11h1.5a.5.5 0 0 0 0-1H11V8.5a.5.5 0 0 0-.5-.5Z\" />\n </svg>\n);\n\nexport const MagnifyingGlassIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const PlusIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z\" />\n </svg>\n);\n\nexport const ListBulletIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2.5 4a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1ZM4.75 3.25a.75.75 0 0 0 0 1.5h8.5a.75.75 0 0 0 0-1.5h-8.5ZM4 8a.75.75 0 0 1 .75-.75h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 4 8Zm.75 3.25a.75.75 0 0 0 0 1.5h8.5a.75.75 0 0 0 0-1.5h-8.5ZM3 8a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0Zm-.5 4.5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const FunnelIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M14 2H2c-.55 0-.95.538-.75 1.032l3 7.5c.127.318.44.528.783.528h5.934c.343 0 .656-.21.783-.528l3-7.5C14.95 2.538 14.55 2 14 2Z\" />\n <path d=\"M6 12.25v1.25a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-1.25H6Z\" />\n </svg>\n);\n\nexport const DocumentCheckIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.414A2 2 0 0 0 13.414 5L10 1.586A2 2 0 0 0 8.586 1H4Zm6.78 5.28a.75.75 0 1 0-1.06-1.06L7 8.94 5.78 7.72a.75.75 0 0 0-1.06 1.06l1.75 1.75a.75.75 0 0 0 1.06 0l3.25-3.25Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const DocumentMinusIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.414A2 2 0 0 0 13.414 5L10 1.586A2 2 0 0 0 8.586 1H4Zm1 6.25a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5H5Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const DocumentArrowUpIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6.414A2 2 0 0 0 13.414 5L10 1.586A2 2 0 0 0 8.586 1H4Zm4.53 4.22a.75.75 0 0 0-1.06 0L5.22 8.47a.75.75 0 1 0 1.06 1.06l.97-.97v2.69a.75.75 0 0 0 1.5 0V8.56l.97.97a.75.75 0 1 0 1.06-1.06L8.53 6.22Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const BellIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12 5a4 4 0 0 0-8 0v2.379c0 .398-.158.779-.44 1.06L2.294 9.707a1 1 0 0 0 .707 1.707h9.998a1 1 0 0 0 .707-1.707l-1.266-1.268A1.5 1.5 0 0 1 12 7.379V5ZM6.268 13.682a.75.75 0 0 0 1.04.199 1.496 1.496 0 0 0 1.385 0 .75.75 0 1 0-.839-1.244.003.003 0 0 1-.004.003.003.003 0 0 1-.004-.003.75.75 0 0 0-1.244.199.75.75 0 0 0 .666.846Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const ArrowLongLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M14 8a.75.75 0 0 1-.75.75H3.81l2.72 2.72a.75.75 0 1 1-1.06 1.06l-4-4a.75.75 0 0 1 0-1.06l4-4a.75.75 0 0 1 1.06 1.06L3.81 7.25h9.44A.75.75 0 0 1 14 8Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const ArrowLongRightIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 8a.75.75 0 0 1 .75-.75h9.44l-2.72-2.72a.75.75 0 0 1 1.06-1.06l4 4a.75.75 0 0 1 0 1.06l-4 4a.75.75 0 1 1-1.06-1.06l2.72-2.72H2.75A.75.75 0 0 1 2 8Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const EllipsisHorizontalIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z\" />\n </svg>\n);\n\nexport const EnvelopeIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { ListViewProps, ListViewSortDirection } from './ListView.types';\nimport { Badge } from '../../components/Badge/Badge';\nimport { Avatar } from '../../components/Avatar/Avatar';\nimport { Input } from '../../components/Input/Input';\nimport { NavigationRail } from '../../components/NavigationRail/NavigationRail';\nimport {\n HomeIcon,\n GlobeAltIcon,\n DocumentTextIcon,\n CloudIcon,\n SquaresPlusIcon,\n MagnifyingGlassIcon,\n PlusIcon,\n ListBulletIcon,\n FunnelIcon,\n BellIcon,\n ChevronDownIcon,\n ArrowLongLeftIcon,\n ArrowLongRightIcon,\n EnvelopeIcon,\n} from './icons';\n\n/**\n * ListView - Vista de lista del sistema de diseño Siesa\n *\n * Vista completa que incluye:\n * - Navigation Rail lateral con FAB\n * - Navbar superior con logo, título, notificaciones y dropdown de usuario\n * - Barra de filtros rápidos con badges\n * - Tabla de datos con cabecera, cuerpo y paginación\n * - Botones de acción (Crear, Auditoría, Filtrar)\n * - Buscador integrado\n * - Dropdown de opciones de vista\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y keyboard navigation\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <ListView\n * title=\"List View\"\n * tableTitle=\"Usuarios\"\n * columns={columns}\n * data={users}\n * userDropdown={{\n * avatar: '/avatar.jpg',\n * name: 'John Doe',\n * role: 'Administrador',\n * }}\n * pagination={{\n * currentPage: 1,\n * totalPages: 10,\n * onPageChange: (page) => console.log(page),\n * }}\n * />\n * ```\n */\nexport const ListView = <T extends Record<string, any>>({\n title = 'List View',\n navbarTitle = 'List View',\n tableTitle = 'Usuarios',\n columns,\n data,\n navigationItems,\n quickFilters,\n actionButtons,\n userDropdown,\n notifications,\n // environmentBadge - Reserved for future use\n showFab = true,\n fabIcon,\n onFabClick,\n onSearch,\n searchPlaceholder = 'Jane Doe',\n onSort,\n sortColumn: externalSortColumn,\n sortDirection: externalSortDirection,\n pagination,\n loading = false,\n loadingRows = 5,\n emptyMessage = 'No hay datos disponibles',\n className = '',\n selectedNavId,\n onNavSelect,\n // onCartClick - Reserved for future use\n onNotificationsClick,\n viewOptions,\n selectedViewOption,\n onViewOptionChange,\n}: ListViewProps<T>) => {\n // ===== ESTADO INTERNO =====\n const [internalSortColumn, setInternalSortColumn] = useState<keyof T | string | null>(null);\n const [internalSortDirection, setInternalSortDirection] = useState<ListViewSortDirection>(null);\n const [searchValue, setSearchValue] = useState('');\n const [showViewDropdown, setShowViewDropdown] = useState(false);\n\n // Usar sort externo si está controlado\n const sortColumn = externalSortColumn !== undefined ? externalSortColumn : internalSortColumn;\n const sortDirection = externalSortDirection !== undefined ? externalSortDirection : internalSortDirection;\n\n // ===== NAVIGATION ITEMS DEFAULT =====\n const defaultNavigationItems = navigationItems || [\n { id: 'home', icon: <HomeIcon className=\"w-4 h-4\" />, label: 'Inicio', selected: true },\n { id: 'option1', icon: <GlobeAltIcon className=\"w-4 h-4\" />, label: 'Opción 1' },\n { id: 'option2', icon: <DocumentTextIcon className=\"w-4 h-4\" />, label: 'Opción 2' },\n { id: 'option3', icon: <CloudIcon className=\"w-4 h-4\" />, label: 'Opción 3' },\n { id: 'more', icon: <SquaresPlusIcon className=\"w-4 h-4\" />, label: 'Ver más...' },\n ];\n\n // ===== QUICK FILTERS DEFAULT =====\n const defaultQuickFilters = quickFilters || [\n { id: 'paid', label: 'Facturas Pagadas', color: 'lime' as const, icon: undefined },\n { id: 'pending', label: 'facturas Pendientes por Pago', color: 'rose' as const, icon: undefined },\n { id: 'orders', label: 'Ordenes de Compra', color: 'sky' as const, icon: undefined },\n ];\n\n // ===== ACTION BUTTONS DEFAULT =====\n const defaultActionButtons = actionButtons || [\n { id: 'create', label: 'Crear', icon: <PlusIcon className=\"w-4 h-4\" />, variant: 'primary' as const, onClick: undefined },\n { id: 'audit', label: 'Auditoria', icon: <ListBulletIcon className=\"w-4 h-4\" />, variant: 'primary' as const, onClick: undefined },\n { id: 'filter', label: 'Filtrar', icon: <FunnelIcon className=\"w-4 h-4\" />, variant: 'primary' as const, onClick: undefined },\n ];\n\n // ===== HANDLERS =====\n const handleSort = (columnAccessor: keyof T | string) => {\n let newDirection: ListViewSortDirection = 'asc';\n\n if (sortColumn === columnAccessor) {\n if (sortDirection === 'asc') {\n newDirection = 'desc';\n } else if (sortDirection === 'desc') {\n newDirection = null;\n }\n }\n\n if (onSort) {\n onSort(columnAccessor, newDirection);\n } else {\n setInternalSortColumn(newDirection ? columnAccessor : null);\n setInternalSortDirection(newDirection);\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchValue(e.target.value);\n onSearch?.(e.target.value);\n };\n\n // ===== OBTENER VALOR DE CELDA =====\n const getCellValue = (row: T, accessor: keyof T | ((row: T) => any)) => {\n if (typeof accessor === 'function') {\n return accessor(row);\n }\n return row[accessor];\n };\n\n // ===== GENERAR PÁGINAS DE PAGINACIÓN =====\n const getPageNumbers = () => {\n if (!pagination) return [];\n const { currentPage, totalPages } = pagination;\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n if (currentPage <= 3) {\n pages.push(2, 3);\n } else if (currentPage >= totalPages - 2) {\n pages.push('...');\n pages.push(totalPages - 2, totalPages - 1);\n } else {\n pages.push('...');\n pages.push(currentPage);\n pages.push('...');\n }\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n return pages;\n };\n\n return (\n <div\n className={[\n 'bg-bg-tertiary',\n 'dark:bg-dark-bg-tertiary',\n 'flex',\n 'flex-col',\n 'w-full',\n 'h-full',\n 'min-h-screen',\n className,\n ].join(' ')}\n >\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div className=\"flex flex-col grow overflow-hidden w-full\">\n <div className=\"flex grow overflow-hidden w-full\">\n {/* ===== NAVIGATION RAIL ===== */}\n <NavigationRail\n items={defaultNavigationItems.map((item) => ({\n ...item,\n selected: selectedNavId ? item.id === selectedNavId : item.selected,\n }))}\n alignment=\"center\"\n showFab={showFab}\n fabIcon={fabIcon || <MagnifyingGlassIcon className=\"w-4 h-4\" />}\n onFabClick={onFabClick}\n fabAriaLabel=\"Buscar\"\n selectedId={selectedNavId}\n onItemSelect={onNavSelect}\n />\n\n {/* ===== CONTENIDO PRINCIPAL ===== */}\n <div className=\"flex flex-col grow overflow-hidden\">\n {/* ===== NAVBAR ===== */}\n <nav className=\"flex items-center gap-8 px-4 py-1 w-full bg-bg-primary dark:bg-dark-bg-primary\">\n {/* Leading Section */}\n <div className=\"flex items-center gap-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[120px] h-[30px] object-contain\"\n />\n <div className=\"w-px h-6 bg-border-primary dark:bg-dark-border-primary\" />\n <h1 className=\"font-bold text-xl leading-7 tracking-[-0.5px] text-content-primary dark:text-dark-content-primary whitespace-nowrap\">\n {navbarTitle}\n </h1>\n </div>\n\n {/* Trailing Section */}\n <div className=\"flex items-center gap-4 grow justify-end\">\n {/* Notification Bell */}\n <div className=\"relative\">\n <button\n className=\"flex flex-col items-center justify-center p-1 rounded-md text-content-primary dark:text-dark-content-primary hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary transition-colors\"\n onClick={onNotificationsClick}\n aria-label=\"Notificaciones\"\n >\n <BellIcon className=\"w-4 h-4\" />\n </button>\n {notifications?.bell && (\n <span className=\"absolute -top-0.5 left-[calc(50%+4px)] w-[13px] h-[13px] rounded-full bg-red-700 flex items-center justify-center text-[10px] font-bold text-white\">\n {notifications.cart && notifications.cart > 99 ? '+99' : notifications.cart}\n </span>\n )}\n </div>\n\n <div className=\"w-px h-6 bg-border-primary dark:bg-dark-border-primary\" />\n\n {/* User Dropdown */}\n {userDropdown && (\n <button\n className=\"flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary transition-colors\"\n onClick={userDropdown.onMenuClick}\n aria-label=\"Menú de usuario\"\n >\n <Avatar\n src={userDropdown.avatar}\n alt={userDropdown.name}\n size=\"10\"\n type=\"rounded\"\n />\n <div className=\"flex flex-col items-start gap-0.5 w-[123px]\">\n <span className=\"text-sm leading-5 text-content-primary dark:text-dark-content-primary whitespace-nowrap\">\n {userDropdown.name}\n </span>\n {(userDropdown.email || userDropdown.role) && (\n <span className=\"text-xs leading-4 text-content-secondary dark:text-content-secondary whitespace-nowrap overflow-hidden text-ellipsis w-full\">\n {userDropdown.role || userDropdown.email}\n </span>\n )}\n </div>\n <ChevronDownIcon className=\"w-5 h-5 text-content-secondary dark:text-content-secondary\" />\n </button>\n )}\n </div>\n </nav>\n\n {/* ===== QUICK FILTERS BAR ===== */}\n <div className=\"flex items-center gap-2 px-0 py-2 w-full\">\n {defaultQuickFilters.map((filter) => (\n <Badge\n key={filter.id}\n color={filter.color}\n label={filter.label}\n leftIcon={filter.icon}\n />\n ))}\n </div>\n\n {/* ===== BODY ===== */}\n <div className=\"flex grow overflow-hidden\">\n <div className=\"flex flex-col gap-4 grow bg-bg-primary dark:bg-dark-bg-primary p-4 rounded-tl-3xl overflow-hidden\">\n {/* Header Row */}\n <div className=\"flex items-center justify-between w-full\">\n <h2 className=\"font-bold text-xl leading-7 tracking-[-0.5px] text-content-primary dark:text-dark-content-primary\">\n {title}\n </h2>\n\n {/* Action Buttons */}\n <div className=\"flex items-center gap-2\">\n {defaultActionButtons.map((btn) => (\n <button\n key={btn.id}\n onClick={btn.onClick}\n className={[\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'px-2.5',\n 'py-1.5',\n 'rounded-md',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'transition-all',\n 'duration-150',\n btn.variant === 'primary'\n ? [\n 'bg-primary-custom-600',\n 'text-primary-inverse-content',\n 'border',\n 'border-primary-custom-600',\n 'shadow-button-inset',\n 'hover:bg-primary-custom-500',\n 'dark:bg-dark-bg-inverse',\n 'dark:text-dark-content-inverse',\n 'dark:border-dark-bg-inverse',\n ].join(' ')\n : [\n 'bg-bg-primary',\n 'text-content-primary',\n 'border',\n 'border-border-primary',\n 'hover:bg-bg-secondary',\n 'dark:bg-dark-bg-primary',\n 'dark:text-dark-content-primary',\n 'dark:border-dark-border-primary',\n ].join(' '),\n ].join(' ')}\n >\n {btn.icon}\n <span>{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* ===== TABLE ===== */}\n <div className=\"flex flex-col gap-4 grow bg-bg-primary dark:bg-dark-bg-primary border border-border-primary dark:border-dark-border-primary rounded-xl p-8 overflow-hidden\">\n {/* Table Header */}\n <div className=\"flex items-center gap-4 w-full\">\n <h3 className=\"grow font-bold text-base leading-6 text-content-primary dark:text-dark-content-primary overflow-hidden text-ellipsis whitespace-nowrap\">\n {tableTitle}\n </h3>\n <Input\n placeholder={searchPlaceholder}\n leftIcon={<EnvelopeIcon className=\"w-4 h-4\" />}\n value={searchValue}\n onChange={handleSearch}\n className=\"w-[200px]\"\n />\n {/* View Dropdown */}\n <div className=\"relative\">\n <button\n onClick={() => setShowViewDropdown(!showViewDropdown)}\n className=\"flex items-center gap-3 px-3 py-2 bg-bg-primary dark:bg-dark-bg-primary border border-border-primary dark:border-dark-border-primary rounded-lg shadow-sm hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary transition-colors\"\n >\n <span className=\"font-bold text-sm text-content-secondary dark:text-content-secondary\">\n Ver\n </span>\n <ChevronDownIcon className=\"w-5 h-5 text-content-secondary dark:text-content-secondary\" />\n </button>\n {showViewDropdown && viewOptions && (\n <div className=\"absolute top-full right-0 mt-1 bg-bg-primary dark:bg-dark-bg-primary border border-border-primary dark:border-dark-border-primary rounded-lg shadow-lg z-10\">\n {viewOptions.map((option) => (\n <button\n key={option.id}\n onClick={() => {\n onViewOptionChange?.(option.id);\n setShowViewDropdown(false);\n }}\n className={[\n 'block',\n 'w-full',\n 'px-4',\n 'py-2',\n 'text-left',\n 'text-sm',\n 'hover:bg-bg-secondary',\n 'dark:hover:bg-dark-bg-secondary',\n selectedViewOption === option.id\n ? 'bg-primary-custom-100 dark:bg-primary-custom-600/20'\n : '',\n ].join(' ')}\n >\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Table Content */}\n <div className=\"flex grow overflow-auto w-full\">\n {columns.map((column, colIndex) => {\n const accessor =\n typeof column.accessor === 'function' ? `column_${colIndex}` : String(column.accessor);\n\n return (\n <div key={accessor} className=\"flex flex-col flex-1 min-w-0\">\n {/* Column Header */}\n <div\n className={[\n 'flex',\n 'items-center',\n 'gap-3',\n 'px-6',\n 'py-2.5',\n 'border-b',\n 'border-border-primary',\n 'dark:border-dark-border-primary',\n column.sortable ? 'cursor-pointer hover:bg-bg-secondary dark:hover:bg-dark-bg-secondary' : '',\n ].join(' ')}\n onClick={column.sortable ? () => handleSort(accessor) : undefined}\n style={{ width: column.width }}\n >\n <span className=\"font-bold text-sm text-content-secondary dark:text-content-secondary overflow-hidden text-ellipsis whitespace-nowrap flex-1\">\n {column.header}\n </span>\n </div>\n\n {/* Loading Skeleton */}\n {loading &&\n Array.from({ length: loadingRows }).map((_, rowIndex) => (\n <div\n key={`loading-${rowIndex}`}\n className=\"flex flex-col px-6 py-4 min-h-[56px] border-b border-border-secondary dark:border-dark-border-primary\"\n style={{ width: column.width }}\n >\n <div className=\"h-4 bg-bg-secondary dark:bg-dark-border-primary rounded animate-pulse\" />\n </div>\n ))}\n\n {/* Data Rows */}\n {!loading &&\n data.map((row, rowIndex) => {\n const value = getCellValue(row, column.accessor);\n const content = column.render ? column.render(value, row, rowIndex) : value;\n\n return (\n <div\n key={rowIndex}\n className=\"flex flex-col justify-center px-6 py-4 min-h-[56px] border-b border-border-secondary dark:border-dark-border-primary\"\n style={{ width: column.width }}\n >\n <span className=\"text-sm text-content-primary dark:text-dark-content-primary overflow-hidden text-ellipsis\">\n {content}\n </span>\n </div>\n );\n })}\n\n {/* Empty State */}\n {!loading && data.length === 0 && colIndex === 0 && (\n <div className=\"flex items-center justify-center px-6 py-12 text-sm text-content-secondary dark:text-content-secondary\">\n {emptyMessage}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* ===== PAGINATION ===== */}\n {pagination && (\n <div className=\"flex items-center justify-between w-full h-9\">\n {/* Previous Button */}\n <button\n onClick={() => pagination.currentPage > 1 && pagination.onPageChange(pagination.currentPage - 1)}\n disabled={pagination.currentPage === 1}\n className=\"flex items-center gap-3 px-3 py-2 rounded-md text-sm font-bold text-primary-custom-600 dark:text-primary-custom-600 hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <ArrowLongLeftIcon className=\"w-4 h-4\" />\n <span>{pagination.previousLabel || 'Atrás'}</span>\n </button>\n\n {/* Page Numbers */}\n <div className=\"flex items-center gap-0\">\n {getPageNumbers().map((page, index) => {\n if (page === '...') {\n return (\n <div\n key={`ellipsis-${index}`}\n className=\"flex items-center justify-center px-3 py-2 text-sm font-bold text-primary-custom-600 dark:text-primary-custom-600\"\n >\n {page}\n </div>\n );\n }\n\n const isActive = page === pagination.currentPage;\n\n return (\n <button\n key={page}\n onClick={() => pagination.onPageChange(page as number)}\n className={[\n 'flex',\n 'items-center',\n 'justify-center',\n 'px-3',\n 'py-2',\n 'rounded-md',\n 'text-sm',\n 'font-bold',\n 'text-primary-custom-600',\n 'dark:text-primary-custom-600',\n 'transition-colors',\n isActive\n ? 'bg-primary-custom-100 dark:bg-primary-custom-600/20'\n : 'hover:bg-primary-custom-50 dark:hover:bg-primary-custom-600/10',\n ].join(' ')}\n >\n {page}\n </button>\n );\n })}\n </div>\n\n {/* Next Button */}\n <button\n onClick={() =>\n pagination.currentPage < pagination.totalPages &&\n pagination.onPageChange(pagination.currentPage + 1)\n }\n disabled={pagination.currentPage === pagination.totalPages}\n className=\"flex items-center gap-3 px-3 py-2 rounded-md text-sm font-bold text-primary-custom-600 dark:text-primary-custom-600 hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n <span>{pagination.nextLabel || 'Siguiente'}</span>\n <ArrowLongRightIcon className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Icono de sobre (envelope) para el input de email\n */\nexport const EnvelopeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n\n/**\n * Icono de candado cerrado (lock) para el input de contraseña\n */\nexport const LockClosedIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de ojo (eye) para mostrar/ocultar contraseña\n */\nexport const EyeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .56A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Logo de Siesa\n */\nexport const SiesaLogo: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n width=\"200\"\n height=\"50\"\n viewBox=\"0 0 200 50\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n {/* Símbolo de Siesa (cuadrados azules) */}\n <rect x=\"0\" y=\"0\" width=\"15\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"0\" y=\"30\" width=\"10\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"20\" y=\"0\" width=\"15\" height=\"20\" fill=\"#0e79fd\" />\n <rect x=\"30\" y=\"30\" width=\"10\" height=\"20\" fill=\"#0e79fd\" />\n\n {/* Texto \"Siesa\" */}\n <text\n x=\"68\"\n y=\"35\"\n fontFamily=\"SiesaBT, sans-serif\"\n fontSize=\"32\"\n fontWeight=\"400\"\n fill=\"#0e79fd\"\n >\n Siesa\n </text>\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { LoginViewProps } from './LoginView.types';\nimport { EnvelopeIcon, LockClosedIcon, EyeIcon } from './icons';\n\n/**\n * LoginView - Vista de inicio de sesión del sistema Siesa\n *\n * Vista completa de login con formulario de autenticación que incluye:\n * - Logo de Siesa\n * - Campos de email y contraseña\n * - Opción de \"olvidé mi contraseña\"\n * - Link para crear cuenta nueva\n * - Fondo decorativo opcional\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y manejo de formulario semántico\n * - Validación de email básica\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <LoginView\n * onSubmit={(email, password) => console.log('Login', email, password)}\n * onForgotPassword={() => console.log('Forgot password')}\n * onSignUp={() => console.log('Sign up')}\n * />\n * ```\n */\nexport const LoginView: React.FC<LoginViewProps> = ({\n onSubmit,\n onForgotPassword,\n onSignUp,\n isLoading = false,\n errorMessage,\n className = '',\n showBackground = true,\n variant = 'responsive',\n}) => {\n // ===== ESTADO LOCAL =====\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [emailError, setEmailError] = useState('');\n\n // ===== HANDLERS =====\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Validación básica de email\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setEmailError('Por favor ingresa un email válido');\n return;\n }\n\n setEmailError('');\n onSubmit?.(email, password);\n };\n\n const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value);\n if (emailError) setEmailError('');\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div\n className={[\n 'relative',\n 'min-h-screen',\n 'w-full',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'box-border',\n // Mobile: sin padding en el wrapper (el padding está en el contenedor)\n 'p-0',\n // Desktop: padding para centrar el card\n 'md:p-4',\n className,\n ].join(' ')}\n >\n {/* ===== FONDO DECORATIVO ===== */}\n {showBackground && (\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\">\n <div className=\"absolute inset-0 bg-primary-custom-100 dark:bg-[#112d57]\" />\n <img\n src=\"/bg_siesa.png\"\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-10\"\n />\n </div>\n )}\n\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div\n className={[\n // Clases base comunes\n 'relative',\n 'box-border',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-4',\n 'p-16',\n 'shrink-0',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n\n // Clases específicas según variant\n ...(variant === 'mobile' ? [\n // Forzar mobile: sin efectos de card\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n ] : variant === 'desktop' ? [\n // Forzar desktop: con efectos de card\n 'w-[400px]',\n 'h-auto',\n 'rounded-2xl',\n 'shadow-lg',\n 'dark:shadow-2xl',\n 'overflow-clip',\n 'border',\n 'border-transparent',\n 'dark:border-dark-border-primary',\n ] : [\n // Responsive: cambia según viewport\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n 'md:w-[400px]',\n 'md:h-auto',\n 'md:rounded-2xl',\n 'md:shadow-lg',\n 'md:dark:shadow-2xl',\n 'md:overflow-clip',\n 'md:border',\n 'md:border-transparent',\n 'md:dark:border-dark-border-primary',\n ]),\n ].join(' ')}\n >\n {/* ===== LOGO ===== */}\n <div className=\"w-full flex flex-col items-center pb-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[200px] h-[50px] object-contain\"\n />\n </div>\n\n {/* ===== HEADING ===== */}\n <div className=\"w-full text-center\">\n <h1\n className={[\n 'text-[20px]',\n 'leading-[28px]',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Iniciar Sesión\n </h1>\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Inicia sesión ingresando con tu correo electrónico y contraseña.\n </p>\n </div>\n\n {/* ===== MENSAJE DE ERROR GENERAL ===== */}\n {errorMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-error-bg',\n 'dark:bg-error-bg',\n 'border',\n 'border-error-border',\n 'dark:border-error-border',\n 'rounded-md',\n 'text-error-content',\n 'dark:text-error-content',\n 'text-sm',\n ].join(' ')}\n role=\"alert\"\n >\n {errorMessage}\n </div>\n )}\n\n {/* ===== FORMULARIO ===== */}\n <form onSubmit={handleSubmit} className=\"w-full flex flex-col gap-2\">\n {/* Email Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"email-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Correo Electrónico <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <EnvelopeIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"email-input\"\n type=\"email\"\n placeholder=\"ejemplo@miempresa.com\"\n value={email}\n onChange={handleEmailChange}\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n emailError ? '!border-error-border' : '',\n ].filter(Boolean).join(' ')}\n />\n </div>\n {emailError && (\n <p className=\"text-xs text-error-content dark:text-error-content\">\n {emailError}\n </p>\n )}\n </div>\n\n {/* Password Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <div className=\"flex items-center justify-between\">\n <label\n htmlFor=\"password-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Contraseña <span className=\"text-red-600\">*</span>\n </label>\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-[12px] leading-4 font-bold text-primary-custom-600 dark:text-[#93d1fd] hover:underline transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded px-1\"\n >\n Olvidé mi Contraseña\n </button>\n </div>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <LockClosedIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"password-input\"\n type={showPassword ? 'text' : 'password'}\n placeholder=\"••••••••\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"current-password\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-10',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-50 hover:opacity-100 text-content-tertiary dark:text-dark-content-tertiary transition-opacity duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-dark-border-custom rounded p-1\"\n aria-label={showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña'}\n >\n <EyeIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={isLoading || !email || !password}\n className={[\n 'relative',\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#eff8ff]',\n 'dark:text-[#0e79fd]',\n 'bg-[#0e79fd]',\n 'dark:bg-[#bfe2fe]',\n 'border',\n 'border-[#3c9bf6]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'shadow-inner',\n 'hover:bg-primary-custom-500',\n 'dark:hover:bg-[#93d1fd]',\n 'active:scale-95',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n >\n {isLoading ? 'Iniciando sesión...' : 'Iniciar Sesión'}\n </button>\n </form>\n\n {/* ===== SIGN UP LINK ===== */}\n <button\n type=\"button\"\n onClick={onSignUp}\n className={[\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#0e79fd]',\n 'dark:text-[#93d1fd]',\n 'hover:bg-primary-custom-100',\n 'dark:hover:bg-[#93d1fd]/10',\n 'rounded-md',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n ].join(' ')}\n >\n ¿No tienes una cuenta?\n </button>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Iconos para ProductsView\n * Basados en Heroicons Micro (16x16px)\n */\n\nexport const ArrowLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M14 8a.75.75 0 0 1-.75.75H4.56l3.22 3.22a.75.75 0 1 1-1.06 1.06l-4.5-4.5a.75.75 0 0 1 0-1.06l4.5-4.5a.75.75 0 0 1 1.06 1.06L4.56 7.25h8.69A.75.75 0 0 1 14 8Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\nexport const CheckIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n","import React from 'react';\nimport type { ProductsViewProps } from './ProductsView.types';\nimport { Button } from '../../components/Button';\nimport { POSProductButton } from '../../components/POSProductButton';\nimport { POSProductCard } from '../../components/POSProductCard';\nimport { POSProductSidebarItems } from '../../components/POSProductSidebarItems';\nimport { Divider } from '../../components/Divider/Divider';\nimport { Navbar } from '../../components/Navbar';\nimport {\n ArrowLeftIcon,\n CheckIcon,\n} from './icons';\n\n/**\n * ProductsView - Vista de selección de productos para sistema POS\n *\n * Vista completa para sistemas POS que permite:\n * - Seleccionar categorías de productos\n * - Ver y agregar productos al pedido\n * - Gestionar items del pedido (cantidad, eliminar)\n * - Ver resumen con subtotal, impuestos y total\n * - Confirmar pedido\n *\n * **Composición:**\n * - Navbar superior con navegación y usuario\n * - Área de contenido con 3 columnas:\n * - Columna 1: Sidebar de categorías (POSProductButton)\n * - Columna 2: Grid de productos (POSProductCard)\n * - Columna 3: Sidebar de pedido (POSProductSidebarItems)\n *\n * **Responsive:**\n * - Mobile (< 768px): Layout vertical adaptativo\n * - Desktop (≥ 768px): Layout de 3 columnas según Figma\n *\n * **Dark Mode:**\n * - Soporte completo con tokens del sistema\n * - Fondos, textos y bordes adaptativos\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Responsive design con breakpoints\n * - Composición con componentes del sistema\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see src/components/POSProductButton - Botón de categoría\n * @see src/components/POSProductCard - Card de producto\n * @see src/components/POSProductSidebarItems - Item de pedido\n *\n * @example\n * ```tsx\n * <ProductsView\n * tableTitle=\"Mesa 1\"\n * categories={categories}\n * products={products}\n * orderItems={orderItems}\n * onAddProduct={(id) => console.log('Agregar', id)}\n * onConfirmOrder={() => console.log('Confirmar')}\n * />\n * ```\n */\nexport const ProductsView: React.FC<ProductsViewProps> = ({\n tableTitle = 'Mesa 1',\n changeTableLabel = 'Cambiar Mesa',\n menusTitle = 'Menús',\n menus = [\n { id: '1', label: 'Corral' },\n { id: '2', label: 'Burguer One' },\n { id: '3', label: 'Andrés Carne de Res' },\n { id: '4', label: 'Aceites' },\n { id: '5', label: 'Kiosco Mac' },\n { id: '6', label: 'Kiosco Qbano' },\n { id: '7', label: 'Premier Dinning' },\n ],\n selectedMenuId = '1',\n onMenuSelect,\n onChangeTable,\n categoryTitle = 'Categoría',\n categories = [],\n selectedCategoryId,\n onCategorySelect,\n productsTitle = 'Productos',\n products = [],\n onAddProduct,\n activeTab = 'products',\n onTabChange,\n orderItems = [],\n onOrderItemQuantityChange,\n onOrderItemDelete,\n subtotal = '40,000.00',\n taxes = '40,000.00',\n total = '40,000.00',\n confirmLabel = 'Confirmar Pedido',\n onConfirmOrder,\n isLoading = false,\n errorMessage,\n userAvatar,\n userName = 'Jhonnatan Diaz',\n userRole = 'Administrador',\n businessLogo,\n siesaLogo,\n className = '',\n}) => {\n return (\n <div\n className={`\n min-h-screen\n w-full\n bg-background-secondary\n dark:bg-dark-bg-primary\n flex\n flex-col\n ${className}\n `.trim().replace(/\\s+/g, ' ')}\n >\n {/* ===== NAVBAR ===== */}\n <Navbar\n logo={\n businessLogo && (\n <div className=\"h-[30px] w-[168px] overflow-hidden\">\n {typeof businessLogo === 'string' ? (\n <img src={businessLogo} alt=\"Business Logo\" className=\"h-full w-full object-contain\" />\n ) : (\n businessLogo\n )}\n </div>\n )\n }\n productName=\"\"\n userDropdown={\n userAvatar\n ? {\n avatar: userAvatar,\n name: userName,\n role: userRole,\n }\n : undefined\n }\n hideActionButtons\n siesaLogo={\n siesaLogo && (\n <div className=\"h-[30px] w-[120px] overflow-hidden\">\n {typeof siesaLogo === 'string' ? (\n <img src={siesaLogo} alt=\"Siesa Logo\" className=\"h-full w-full object-contain\" />\n ) : (\n siesaLogo\n )}\n </div>\n )\n }\n variant=\"desktop\"\n className=\"bg-background-secondary dark:bg-dark-bg-primary\"\n />\n\n {/* ===== CONTAINER ===== */}\n <div className=\"flex flex-1 w-full overflow-hidden\">\n {/* ===== ROW PRINCIPAL ===== */}\n <div className=\"flex flex-1 w-full overflow-hidden\">\n {/* ===== COLUMNA 1: ÁREA DE CONTENIDO (Menu + Body) ===== */}\n <div\n className=\"\n flex-1\n flex\n flex-col\n gap-4\n p-4\n bg-white\n dark:bg-dark-bg-primary\n rounded-tl-3xl\n rounded-tr-3xl\n overflow-hidden\n \"\n >\n {/* Menu de navegación */}\n <div className=\"flex items-center gap-4 w-full\">\n {/* Cambiar Mesa Button */}\n <div className=\"shrink-0\">\n <Button\n type=\"default\"\n leftIcon={<ArrowLeftIcon className=\"w-4 h-4\" />}\n onClick={onChangeTable}\n ariaLabel={changeTableLabel}\n >\n {changeTableLabel}\n </Button>\n </div>\n\n {/* Divider */}\n <div className=\"h-8 w-px bg-border-primary dark:bg-dark-border-primary shrink-0\" />\n\n {/* Título Menús */}\n <div className=\"shrink-0\">\n <h2 className=\"text-xl font-bold leading-7 tracking-tight text-content-primary dark:text-dark-content-primary\">\n {menusTitle}\n </h2>\n </div>\n\n {/* Botones de menús con scroll horizontal */}\n <div className=\"flex-1 flex gap-2 overflow-x-auto overflow-y-hidden\">\n {menus.map((menu) => (\n <Button\n key={menu.id}\n type={selectedMenuId === menu.id ? 'default' : 'outline'}\n onClick={() => onMenuSelect?.(menu.id)}\n >\n {menu.label}\n </Button>\n ))}\n </div>\n </div>\n\n {/* Body: Categorías + Productos */}\n <div\n className=\"\n flex-1\n flex\n gap-0\n bg-background-secondary\n dark:bg-dark-bg-primary/50\n rounded-xl\n overflow-hidden\n \"\n >\n {/* ===== SIDEBAR IZQUIERDO: CATEGORÍAS ===== */}\n <div className=\"w-[213px] p-4 border-b border-border-primary dark:border-dark-border-primary\">\n <div className=\"flex flex-col gap-4 h-full\">\n {/* Título */}\n <div className=\"flex items-center justify-center w-full\">\n <h3 className=\"text-xl font-bold leading-6 text-content-primary dark:text-dark-content-primary\">\n {categoryTitle}\n </h3>\n </div>\n\n {/* Lista de categorías con scroll */}\n <div className=\"flex-1 flex flex-col gap-2 overflow-x-hidden overflow-y-auto\">\n {categories.map((category) => (\n <POSProductButton\n key={category.id}\n image={category.image}\n label={category.label}\n active={selectedCategoryId === category.id}\n onClick={() => onCategorySelect?.(category.id)}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* ===== CONTENIDO PRINCIPAL: PRODUCTOS ===== */}\n <div className=\"flex-1 p-4 border-l border-b border-border-primary dark:border-dark-border-primary\">\n <div className=\"flex flex-col gap-4 h-full\">\n {/* Título */}\n <div className=\"flex items-center justify-center w-full\">\n <h3 className=\"text-xl font-bold leading-6 text-content-primary dark:text-dark-content-primary\">\n {productsTitle}\n </h3>\n </div>\n\n {/* Grid de productos con scroll - Flexbox centrado con max-width para 4 columnas (170px * 4 + 8px * 3 = 704px) */}\n <div className=\"flex-1 overflow-x-hidden overflow-y-auto\">\n <div className=\"flex flex-col items-center justify-start min-h-full w-full\">\n <div className=\"flex flex-wrap gap-2 justify-center max-w-[704px]\">\n {products.map((product) => (\n <POSProductCard\n key={product.id}\n image={product.image}\n productName={product.name}\n price={product.price}\n onAddClick={() => onAddProduct?.(product.id)}\n />\n ))}\n </div>\n </div>\n\n {/* Estado vacío */}\n {products.length === 0 && (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-content-secondary dark:text-content-secondary\">\n No hay productos disponibles\n </p>\n </div>\n )}\n\n {/* Estado de carga */}\n {isLoading && (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-content-secondary dark:text-content-secondary\">\n Cargando productos...\n </p>\n </div>\n )}\n\n {/* Estado de error */}\n {errorMessage && (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-red-600 dark:text-red-400\">\n {errorMessage}\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* ===== COLUMNA 2: SIDEBAR DERECHO (Pedido) ===== */}\n <div className=\"w-[304px] p-4 flex flex-col gap-0 h-full overflow-hidden\">\n <div className=\"flex flex-col h-full relative\">\n {/* Heading */}\n <div className=\"border-b border-border-primary dark:border-dark-border-primary pb-4 z-10\">\n <h2 className=\"text-xl font-bold leading-7 tracking-tight text-content-primary dark:text-dark-content-primary\">\n {tableTitle}\n </h2>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-start py-2.5 z-10\">\n <button\n className={`\n flex-1\n flex\n flex-col\n items-center\n p-2\n rounded-lg\n transition-colors\n duration-150\n ${activeTab === 'products' ? 'relative' : ''}\n `}\n onClick={() => onTabChange?.('products')}\n >\n <span\n className={`\n text-sm\n font-bold\n leading-5\n ${activeTab === 'products'\n ? 'text-primary-custom-600 dark:text-primary-custom-600'\n : 'text-content-primary dark:text-dark-content-primary'\n }\n `}\n >\n Productos\n </span>\n {activeTab === 'products' && (\n <div className=\"absolute bottom-[-10px] left-0 right-0 h-0.5 bg-primary-custom-600 dark:bg-primary-custom-600 rounded-full\" />\n )}\n </button>\n\n <button\n className={`\n flex-1\n flex\n flex-col\n items-center\n p-2\n rounded-lg\n transition-colors\n duration-150\n ${activeTab === 'client' ? 'relative' : ''}\n `}\n onClick={() => onTabChange?.('client')}\n >\n <span\n className={`\n text-sm\n font-bold\n leading-5\n ${activeTab === 'client'\n ? 'text-primary-custom-600 dark:text-primary-custom-600'\n : 'text-content-primary dark:text-dark-content-primary'\n }\n `}\n >\n Cliente\n </span>\n {activeTab === 'client' && (\n <div className=\"absolute bottom-[-10px] left-0 right-0 h-0.5 bg-primary-custom-600 dark:bg-primary-custom-600 rounded-full\" />\n )}\n </button>\n </div>\n\n {/* Body: Lista de items del pedido */}\n <div\n className=\"\n flex-1\n flex\n flex-col\n gap-2\n p-4\n bg-white\n dark:bg-dark-bg-primary\n rounded-bl-lg\n rounded-br-lg\n overflow-x-hidden\n overflow-y-auto\n z-10\n \"\n >\n {orderItems.map((item, index) => (\n <React.Fragment key={item.productId}>\n <POSProductSidebarItems\n categoryLabel={item.categoryLabel}\n categoryColor={item.categoryColor}\n productRef={item.productRef}\n price={item.price}\n productName={item.productName}\n descriptionItems={item.descriptionItems}\n showDescription={!!item.descriptionItems && item.descriptionItems.length > 0}\n quantity={item.quantity}\n onQuantityChange={(qty) => onOrderItemQuantityChange?.(item.productId, qty)}\n onDelete={() => onOrderItemDelete?.(item.productId)}\n />\n {index < orderItems.length - 1 && <Divider />}\n </React.Fragment>\n ))}\n\n {/* Estado vacío */}\n {orderItems.length === 0 && (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-content-secondary dark:text-content-secondary text-center\">\n No hay productos en el pedido\n </p>\n </div>\n )}\n </div>\n\n {/* Footer: Resumen y botón confirmar */}\n <div className=\"flex flex-col gap-4 pt-4 z-10\">\n {/* Resumen de precios */}\n <div className=\"flex flex-col gap-2\">\n {/* Subtotal */}\n <div className=\"flex items-start text-base font-bold leading-6 text-content-primary dark:text-dark-content-primary\">\n <div className=\"flex-1\">Subtotal</div>\n <div className=\"flex-1 text-right\">{subtotal}</div>\n </div>\n\n {/* Impuestos */}\n <div className=\"flex items-start text-base font-bold leading-6 text-content-primary dark:text-dark-content-primary\">\n <div className=\"flex-1\">Impuestos</div>\n <div className=\"flex-1 text-right\">{taxes}</div>\n </div>\n\n {/* Divider */}\n <Divider />\n\n {/* Total */}\n <div className=\"flex items-start text-lg font-bold leading-7 text-content-primary dark:text-dark-content-primary\">\n <div className=\"flex-1\">Total</div>\n <div className=\"flex-1 text-right\">{total}</div>\n </div>\n </div>\n\n {/* Botón confirmar */}\n <div className=\"flex gap-2 w-full\">\n <Button\n type=\"default\"\n leftIcon={<CheckIcon className=\"w-4 h-4\" />}\n onClick={onConfirmOrder}\n fullWidth\n disabled={orderItems.length === 0 || isLoading}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nProductsView.displayName = 'ProductsView';\n","import React from 'react';\n\n/**\n * Icono de sobre (envelope) para el campo de email\n * @see https://heroicons.com/\n */\nexport const EnvelopeIcon: React.FC<{ className?: string }> = ({ className = 'w-4 h-4' }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n className={className}\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { RecoverPasswordViewProps } from './RecoverPasswordView.types';\nimport { EnvelopeIcon } from './icons';\n\n/**\n * RecoverPasswordView - Vista de recuperación de contraseña del sistema Siesa\n *\n * Vista completa para restablecer contraseña que incluye:\n * - Logo de Siesa\n * - Campo de email para enviar instrucciones\n * - Botón para regresar al login\n * - Fondo decorativo opcional\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y manejo de formulario semántico\n * - Validación de email básica\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <RecoverPasswordView\n * onSubmit={(email) => console.log('Recover password for', email)}\n * onBackToLogin={() => console.log('Back to login')}\n * />\n * ```\n */\nexport const RecoverPasswordView: React.FC<RecoverPasswordViewProps> = ({\n onSubmit,\n onBackToLogin,\n isLoading = false,\n errorMessage,\n successMessage,\n className = '',\n showBackground = true,\n variant = 'responsive',\n}) => {\n // ===== ESTADO LOCAL =====\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState('');\n\n // ===== HANDLERS =====\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Validación básica de email\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setEmailError('Por favor ingresa un email válido');\n return;\n }\n\n setEmailError('');\n onSubmit?.(email);\n };\n\n const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value);\n if (emailError) setEmailError('');\n };\n\n return (\n <div\n className={[\n 'relative',\n 'min-h-screen',\n 'w-full',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'box-border',\n // Mobile: sin padding en el wrapper (el padding está en el contenedor)\n 'p-0',\n // Desktop: padding para centrar el card\n 'md:p-4',\n className,\n ].join(' ')}\n >\n {/* ===== FONDO DECORATIVO (solo desktop) ===== */}\n {showBackground && (\n <div className=\"hidden md:block absolute inset-0 pointer-events-none\" aria-hidden=\"true\">\n <div className=\"absolute inset-0 bg-[#dbeefe] dark:bg-[#112d57]\" />\n <img\n src=\"/bg_siesa.jpg\"\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-10\"\n />\n </div>\n )}\n\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div\n className={[\n // Clases base comunes\n 'relative',\n 'box-border',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-4',\n 'p-16',\n 'shrink-0',\n 'bg-bg-primary',\n 'dark:bg-zinc-700',\n\n // Clases específicas según variant\n ...(variant === 'mobile' ? [\n // Forzar mobile: sin efectos de card\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n ] : variant === 'desktop' ? [\n // Forzar desktop: con efectos de card\n 'w-[400px]',\n 'h-auto',\n 'rounded-2xl',\n 'shadow-lg',\n 'dark:shadow-2xl',\n 'overflow-clip',\n 'border',\n 'border-transparent',\n 'dark:border-dark-border-primary',\n ] : [\n // Responsive: cambia según viewport\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n 'md:w-[400px]',\n 'md:h-auto',\n 'md:rounded-2xl',\n 'md:shadow-lg',\n 'md:dark:shadow-2xl',\n 'md:overflow-clip',\n 'md:border',\n 'md:border-transparent',\n 'md:dark:border-dark-border-primary',\n ]),\n ].join(' ')}\n >\n {/* ===== LOGO ===== */}\n <div className=\"w-full flex flex-col items-center pb-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[200px] h-[50px] object-contain\"\n />\n </div>\n\n {/* ===== HEADING ===== */}\n <div className=\"w-full text-center\">\n <h1\n className={[\n 'text-[20px]',\n 'leading-[28px]',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Restablecer Contraseña\n </h1>\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Reestablece tu contraseña ingresando con tu correo electrónico.\n </p>\n </div>\n\n {/* ===== MENSAJE DE ERROR GENERAL ===== */}\n {errorMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-error-bg',\n 'dark:bg-error-bg',\n 'border',\n 'border-error-border',\n 'dark:border-error-border',\n 'rounded-md',\n 'text-error-content',\n 'dark:text-error-content',\n 'text-sm',\n ].join(' ')}\n role=\"alert\"\n >\n {errorMessage}\n </div>\n )}\n\n {/* ===== MENSAJE DE ÉXITO ===== */}\n {successMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-[#d1fae5]',\n 'dark:bg-[#064e3b]',\n 'border',\n 'border-[#a7f3d0]',\n 'dark:border-[#065f46]',\n 'rounded-md',\n 'text-[#065f46]',\n 'dark:text-[#a7f3d0]',\n 'text-sm',\n ].join(' ')}\n role=\"status\"\n >\n {successMessage}\n </div>\n )}\n\n {/* ===== FORMULARIO ===== */}\n <form onSubmit={handleSubmit} className=\"w-full flex flex-col gap-2\">\n {/* Email Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"email-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Correo Electrónico <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <EnvelopeIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"email-input\"\n type=\"email\"\n placeholder=\"ejemplo@miempresa.com\"\n value={email}\n onChange={handleEmailChange}\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-zinc-700',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n emailError ? '!border-error-border' : '',\n ].filter(Boolean).join(' ')}\n />\n </div>\n {emailError && (\n <p className=\"text-xs text-error-content dark:text-error-content\">\n {emailError}\n </p>\n )}\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={isLoading || !email}\n className={[\n 'relative',\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#eff8ff]',\n 'dark:text-[#0e79fd]',\n 'bg-[#0e79fd]',\n 'dark:bg-[#bfe2fe]',\n 'border',\n 'border-[#3c9bf6]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'shadow-inner',\n 'hover:bg-primary-custom-500',\n 'dark:hover:bg-[#93d1fd]',\n 'active:scale-95',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n >\n {isLoading ? 'Enviando...' : 'Reestablecer Contraseña'}\n </button>\n </form>\n\n {/* ===== BACK TO LOGIN BUTTON ===== */}\n <button\n type=\"button\"\n onClick={onBackToLogin}\n className={[\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#0e79fd]',\n 'dark:text-[#93d1fd]',\n 'bg-transparent',\n 'border',\n 'border-[#93d1fd]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'hover:bg-primary-custom-100',\n 'dark:hover:bg-[#93d1fd]/10',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n ].join(' ')}\n >\n Iniciar Sesión\n </button>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Icono de círculo de usuario para el input de nombre\n */\nexport const UserCircleIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0Zm-5-2a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM8 9c-1.825 0-3.422.977-4.295 2.437A5.49 5.49 0 0 0 8 13.5a5.49 5.49 0 0 0 4.294-2.063A4.997 4.997 0 0 0 8 9Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de sobre (envelope) para el input de email\n */\nexport const EnvelopeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z\" />\n <path d=\"M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z\" />\n </svg>\n);\n\n/**\n * Icono de candado cerrado (lock) para el input de contraseña\n */\nexport const LockClosedIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n/**\n * Icono de ojo (eye) para mostrar/ocultar contraseña\n */\nexport const EyeIcon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .56A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n","import React, { useState } from 'react';\nimport type { FormEvent } from 'react';\nimport type { SignUpViewProps } from './SignUpView.types';\nimport { UserCircleIcon, EnvelopeIcon, LockClosedIcon, EyeIcon } from './icons';\n\n/**\n * SignUpView - Vista de registro del sistema Siesa\n *\n * Vista completa de registro con formulario que incluye:\n * - Logo de Siesa\n * - Campos de nombre, email y contraseña\n * - Botón de registro\n * - Link para iniciar sesión\n * - Texto de términos y condiciones\n * - Fondo decorativo opcional\n *\n * Mejores prácticas implementadas:\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels y manejo de formulario semántico\n * - Validación de email básica\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <SignUpView\n * onSubmit={(name, email, password) => console.log('Sign up', name, email, password)}\n * onSignIn={() => console.log('Go to sign in')}\n * onTermsClick={() => console.log('View terms')}\n * onPrivacyClick={() => console.log('View privacy')}\n * />\n * ```\n */\nexport const SignUpView: React.FC<SignUpViewProps> = ({\n onSubmit,\n onSignIn,\n onTermsClick,\n onPrivacyClick,\n isLoading = false,\n errorMessage,\n className = '',\n showBackground = true,\n variant = 'responsive',\n}) => {\n // ===== ESTADO LOCAL =====\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [emailError, setEmailError] = useState('');\n\n // ===== HANDLERS =====\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Validación básica de email\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n setEmailError('Por favor ingresa un email válido');\n return;\n }\n\n setEmailError('');\n onSubmit?.(name, email, password);\n };\n\n const handleEmailChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setEmail(e.target.value);\n if (emailError) setEmailError('');\n };\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n return (\n <div\n className={[\n 'relative',\n 'min-h-screen',\n 'w-full',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'box-border',\n // Mobile: sin padding en el wrapper\n 'p-0',\n // Desktop: padding para centrar el card\n 'md:p-4',\n className,\n ].join(' ')}\n >\n {/* ===== FONDO DECORATIVO ===== */}\n {showBackground && (\n <div className=\"absolute inset-0 pointer-events-none\" aria-hidden=\"true\">\n <div className=\"absolute inset-0 bg-primary-custom-100 dark:bg-[#112d57]\" />\n <img\n src=\"/bg_siesa.png\"\n alt=\"\"\n className=\"absolute inset-0 w-full h-full object-cover opacity-10\"\n />\n </div>\n )}\n\n {/* ===== CONTENEDOR PRINCIPAL ===== */}\n <div\n className={[\n // Clases base comunes\n 'relative',\n 'box-border',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-4',\n 'p-16',\n 'shrink-0',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n\n // Clases específicas según variant\n ...(variant === 'mobile' ? [\n // Forzar mobile: sin efectos de card\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n ] : variant === 'desktop' ? [\n // Forzar desktop: con efectos de card\n 'w-[400px]',\n 'h-auto',\n 'rounded-2xl',\n 'shadow-lg',\n 'dark:shadow-2xl',\n 'overflow-clip',\n 'border',\n 'border-transparent',\n 'dark:border-dark-border-primary',\n ] : [\n // Responsive: cambia según viewport\n 'w-full',\n 'h-full',\n 'shadow-none',\n 'rounded-none',\n 'border-0',\n 'md:w-[400px]',\n 'md:h-auto',\n 'md:rounded-2xl',\n 'md:shadow-lg',\n 'md:dark:shadow-2xl',\n 'md:overflow-clip',\n 'md:border',\n 'md:border-transparent',\n 'md:dark:border-dark-border-primary',\n ]),\n ].join(' ')}\n >\n {/* ===== LOGO ===== */}\n <div className=\"w-full flex flex-col items-center pb-4\">\n <img\n src=\"/.Siesa Logo.png\"\n alt=\"Siesa\"\n className=\"w-[200px] h-[50px] object-contain\"\n />\n </div>\n\n {/* ===== HEADING ===== */}\n <div className=\"w-full text-center\">\n <h1\n className={[\n 'text-[20px]',\n 'leading-[28px]',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Crear Cuenta\n </h1>\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Ingresa todos los datos para crear tu cuenta.\n </p>\n </div>\n\n {/* ===== MENSAJE DE ERROR GENERAL ===== */}\n {errorMessage && (\n <div\n className={[\n 'w-full',\n 'p-3',\n 'bg-error-bg',\n 'dark:bg-error-bg',\n 'border',\n 'border-error-border',\n 'dark:border-error-border',\n 'rounded-md',\n 'text-error-content',\n 'dark:text-error-content',\n 'text-sm',\n ].join(' ')}\n role=\"alert\"\n >\n {errorMessage}\n </div>\n )}\n\n {/* ===== FORMULARIO ===== */}\n <form onSubmit={handleSubmit} className=\"w-full flex flex-col gap-2\">\n {/* Name Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"name-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Nombre <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <UserCircleIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"name-input\"\n type=\"text\"\n placeholder=\"Juan Pérez\"\n value={name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setName(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"name\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n </div>\n </div>\n\n {/* Email Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"email-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Correo Electrónico <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <EnvelopeIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"email-input\"\n type=\"email\"\n placeholder=\"ejemplo@miempresa.com\"\n value={email}\n onChange={handleEmailChange}\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-3',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n emailError ? '!border-error-border' : '',\n ].filter(Boolean).join(' ')}\n />\n </div>\n {emailError && (\n <p className=\"text-xs text-error-content dark:text-error-content\">\n {emailError}\n </p>\n )}\n </div>\n\n {/* Password Input */}\n <div className=\"flex flex-col gap-2 w-full\">\n <label\n htmlFor=\"password-input\"\n className=\"font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary\"\n >\n Contraseña <span className=\"text-red-600\">*</span>\n </label>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none opacity-50\">\n <LockClosedIcon className=\"w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary\" />\n </div>\n <input\n id=\"password-input\"\n type={showPassword ? 'text' : 'password'}\n placeholder=\"••••••••\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setPassword(e.target.value)}\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={[\n 'w-full',\n 'pl-9',\n 'pr-10',\n 'py-1.5',\n 'text-base',\n 'leading-6',\n 'bg-bg-primary',\n 'dark:bg-dark-bg-primary',\n 'border',\n 'border-[#e4e4e7]',\n 'dark:border-dark-border-primary',\n 'rounded-lg',\n 'placeholder:text-content-tertiary',\n 'dark:placeholder:text-dark-content-tertiary',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'focus:outline-none',\n 'focus:border-primary-custom-600',\n 'dark:focus:border-dark-border-custom',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-dark-border-custom',\n 'transition-all',\n 'duration-150',\n ].join(' ')}\n />\n <button\n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-50 hover:opacity-100 text-content-tertiary dark:text-dark-content-tertiary transition-opacity duration-150 focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-dark-border-custom rounded p-1\"\n aria-label={showPassword ? 'Ocultar contraseña' : 'Mostrar contraseña'}\n >\n <EyeIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n disabled={isLoading || !name || !email || !password}\n className={[\n 'relative',\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#eff8ff]',\n 'dark:text-[#0e79fd]',\n 'bg-[#0e79fd]',\n 'dark:bg-[#bfe2fe]',\n 'border',\n 'border-[#3c9bf6]',\n 'dark:border-[#93d1fd]',\n 'rounded-md',\n 'shadow-inner',\n 'hover:bg-primary-custom-500',\n 'dark:hover:bg-[#93d1fd]',\n 'active:scale-95',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n 'disabled:opacity-50',\n 'disabled:cursor-not-allowed',\n ].join(' ')}\n >\n {isLoading ? 'Registrando...' : 'Registrarse'}\n </button>\n </form>\n\n {/* ===== SIGN IN LINK ===== */}\n <button\n type=\"button\"\n onClick={onSignIn}\n className={[\n 'w-full',\n 'px-[10px]',\n 'py-[6px]',\n 'flex',\n 'items-center',\n 'justify-center',\n 'gap-2',\n 'font-bold',\n 'text-sm',\n 'leading-5',\n 'text-[#0e79fd]',\n 'dark:text-[#93d1fd]',\n 'hover:bg-primary-custom-100',\n 'dark:hover:bg-[#93d1fd]/10',\n 'rounded-md',\n 'transition-all',\n 'duration-150',\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-primary-custom-400',\n 'dark:focus:ring-[#93d1fd]',\n 'focus:ring-offset-2',\n 'dark:focus:ring-offset-[#3f3f46]',\n ].join(' ')}\n >\n Ya tengo una cuenta\n </button>\n\n {/* ===== TÉRMINOS Y CONDICIONES ===== */}\n <div className=\"w-full text-center\">\n <p\n className={[\n 'text-[12px]',\n 'leading-[16px]',\n 'font-normal',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Al registrarse, estás aceptando nuestras{' '}\n <button\n type=\"button\"\n onClick={onTermsClick}\n className=\"text-[#0e79fd] dark:text-[#93d1fd] underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded\"\n >\n Condiciones de Uso\n </button>\n {' '}y nuestras{' '}\n <button\n type=\"button\"\n onClick={onPrivacyClick}\n className=\"text-[#0e79fd] dark:text-[#93d1fd] underline hover:no-underline focus:outline-none focus:ring-2 focus:ring-primary-custom-400 dark:focus:ring-[#93d1fd] rounded\"\n >\n Políticas de Privacidad\n </button>\n .\n </p>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\n/**\n * Iconos para TableLayoutView\n * Basados en Heroicons Micro (16x16px)\n */\n\n// Icono Plus (heroicons-micro/plus)\nexport const PlusIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z\" />\n </svg>\n);\n\n// Icono Arrows Pointing In (heroicons-micro/arrows-pointing-in)\nexport const ArrowsPointingInIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2.22 2.22a.75.75 0 0 1 1.06 0l2 2a.75.75 0 1 1-1.06 1.06l-.72-.72v2.69a.75.75 0 0 1-1.5 0V2.5c0-.69.56-1.25 1.25-1.25h4.75a.75.75 0 0 1 0 1.5H4.81l.72.72a.75.75 0 0 1-1.06 1.06l-2-2a.75.75 0 0 1 0-1.06ZM9 2.75a.75.75 0 0 1 .75-.75h4.75C15.19 2 15.75 2.56 15.75 3.25v4.75a.75.75 0 0 1-1.5 0V5.31l-.72.72a.75.75 0 1 1-1.06-1.06l2-2a.75.75 0 0 1 1.06 0l2 2a.75.75 0 1 1-1.06 1.06l-.72-.72V8a.75.75 0 0 1-1.5 0V3.5H9.75A.75.75 0 0 1 9 2.75ZM2.75 9a.75.75 0 0 1 .75.75v2.69l.72-.72a.75.75 0 1 1 1.06 1.06l-2 2a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 1 1 1.06-1.06l.72.72V9.75c0-.41.34-.75.75-.75Zm10.5 0a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-4.75c-.69 0-1.25-.56-1.25-1.25V9.75a.75.75 0 0 1 .75-.75Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n// Icono Arrows Pointing Out (heroicons-micro/arrows-pointing-out)\nexport const ArrowsPointingOutIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2.75 2a.75.75 0 0 0-.75.75v3.5a.75.75 0 0 0 1.5 0V3.81l2.47 2.47a.75.75 0 1 0 1.06-1.06L4.56 2.75h2.69a.75.75 0 0 0 0-1.5h-4.5ZM9 2.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-2.69l2.47 2.47a.75.75 0 1 1-1.06 1.06L10.5 4.56v2.69a.75.75 0 0 1-1.5 0v-4.5ZM2.75 9a.75.75 0 0 1 .75.75v2.69l2.47-2.47a.75.75 0 1 1 1.06 1.06L4.56 13.5h2.69a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75v-4.5a.75.75 0 0 1 .75-.75Zm10.5 0a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1 0-1.5h2.69l-2.47-2.47a.75.75 0 1 1 1.06-1.06l2.47 2.47V9.75a.75.75 0 0 1 .75-.75Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n// Icono Arrow Right End On Rectangle (heroicons-micro/arrow-right-end-on-rectangle)\nexport const ArrowRightEndOnRectangleIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 4.75A2.75 2.75 0 0 1 4.75 2h3a2.75 2.75 0 0 1 2.75 2.75v.5a.75.75 0 0 1-1.5 0v-.5c0-.69-.56-1.25-1.25-1.25h-3c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h3c.69 0 1.25-.56 1.25-1.25v-.5a.75.75 0 0 1 1.5 0v.5A2.75 2.75 0 0 1 7.75 14h-3A2.75 2.75 0 0 1 2 11.25v-6.5Zm10.58 2.96-1.72-1.72a.75.75 0 1 1 1.06-1.06l2.78 2.78c.3.29.3.76 0 1.06l-2.78 2.78a.75.75 0 1 1-1.06-1.06l1.72-1.72H7.25a.75.75 0 0 1 0-1.5h5.33Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n// Icono Arrows Right Left (heroicons-micro/arrows-right-left)\nexport const ArrowsRightLeftIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M13.78 10.47a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 1 1-1.06-1.06l.97-.97H5.75a.75.75 0 0 1 0-1.5h5.69l-.97-.97a.75.75 0 0 1 1.06-1.06l2.25 2.25ZM2.22 5.53a.75.75 0 0 1 0-1.06l2.25-2.25a.75.75 0 0 1 1.06 1.06l-.97.97h5.69a.75.75 0 0 1 0 1.5H4.56l.97.97a.75.75 0 1 1-1.06 1.06L2.22 5.53Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\n\n// Icono Rectangle Group (heroicons-micro/rectangle-group)\nexport const RectangleGroupIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M2.5 3.5h3v3h-3v-3ZM6.5 2a.5.5 0 0 0-.5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 0-.5-.5h-4ZM2.5 10.5h3v3h-3v-3ZM6.5 9a.5.5 0 0 0-.5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 0-.5-.5h-4ZM10.5 3.5h3v3h-3v-3ZM13.5 2h-3a.5.5 0 0 0-.5.5v4a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 0-.5-.5h-.5ZM10.5 10.5h3v3h-3v-3Z\" />\n </svg>\n);\n\n// Icono X Mark (heroicons-micro/x-mark)\nexport const XMarkIcon: React.FC<{ className?: string }> = ({ className = '' }) => (\n <svg\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z\" />\n </svg>\n);\n","import React from 'react';\nimport type { TableLayoutViewProps } from './TableLayoutView.types';\nimport { Navbar } from '../../components/Navbar/Navbar';\nimport { POSLocationButton } from '../../components/POSLocationButton/POSLocationButton';\nimport { POSTable } from '../../components/POSTable/POSTable';\nimport { POSConvention } from '../../components/POSConvention/POSConvention';\nimport { POSNumberButton } from '../../components/POSNumberButton/POSNumberButton';\nimport { Switch } from '../../components/Switch/Switch';\nimport { Button } from '../../components/Button/Button';\nimport {\n PlusIcon,\n ArrowsPointingInIcon,\n ArrowsPointingOutIcon,\n ArrowRightEndOnRectangleIcon,\n ArrowsRightLeftIcon,\n RectangleGroupIcon,\n XMarkIcon,\n} from './icons';\n\n/**\n * TableLayoutView - Vista de layout de mesas para restaurante (POS)\n *\n * Vista completa pixel-perfect según especificaciones de Figma que incluye:\n * - Navbar superior con usuario y acciones\n * - Sidebar izquierdo con lista de salones/ubicaciones\n * - Área central con grid de mesas y controles\n * - Sidebar derecho con selector de cantidad de personas\n * - Leyenda de convenciones al pie del área central\n *\n * **Layout responsive:**\n * - Mobile: Columnas apiladas verticalmente\n * - Desktop: 3 columnas (sidebar izq 245px + centro flex + sidebar der 304px)\n *\n * **Mejores prácticas implementadas:**\n * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}\n * - Dark mode con estrategia 'class' (darkMode: 'class')\n * - Tokens de color consistentes con la documentación\n * - Type safety con TypeScript estricto\n * - Accesibilidad con ARIA labels\n * - Mobile-first responsive design\n *\n * @see docs/colors.md - Sistema de colores\n * @see docs/typography.md - Sistema tipográfico\n * @see docs/spacing.md - Sistema de espaciado\n * @see docs/shadows.md - Sistema de sombras\n *\n * @example\n * ```tsx\n * <TableLayoutView\n * locations={[\n * { id: '1', name: 'Antejardín', status: 'available', capacity: { current: 1, total: 8 } },\n * { id: '2', name: 'Terraza', status: 'occupied', capacity: { current: 8, total: 8 } },\n * ]}\n * tables={[\n * { tableNumber: '01', status: 'available', shape: 'square', chairs: 8, isActive: true },\n * { tableNumber: '02', status: 'available', shape: 'circle', chairs: 2 },\n * ]}\n * onTableSelect={(tableNum) => console.log('Mesa seleccionada:', tableNum)}\n * />\n * ```\n */\nexport const TableLayoutView: React.FC<TableLayoutViewProps> = ({\n locations = [],\n activeLocationId,\n tables = [],\n tablesTitle = 'Mesas de Antejardín',\n showPeopleCountPanel = false,\n selectedTable,\n onLocationSelect,\n onTableSelect,\n onCreateTables,\n onMergeTables,\n onSplitTables,\n onPeopleCountSelect,\n onAssignTable,\n onTransferTable,\n onSetCutlery,\n onClosePeoplePanel,\n onTableSwitchChange,\n isLoading = false,\n errorMessage,\n tableLayout = 'grid',\n className = '',\n userInfo,\n}) => {\n // ===== RENDER NAVBAR =====\n const renderNavbar = () => (\n <div className=\"w-full shrink-0\">\n <Navbar\n variant=\"desktop\"\n productName=\"\"\n userDropdown={\n userInfo\n ? {\n avatar: userInfo.avatar,\n name: userInfo.name,\n email: userInfo.role,\n onMenuClick: () => { },\n }\n : undefined\n }\n />\n </div>\n );\n\n // ===== RENDER SIDEBAR IZQUIERDO (SALONES) =====\n const renderLocationsSidebar = () => (\n <div\n className={[\n 'w-full',\n 'md:w-[245px]',\n 'h-auto',\n 'md:h-full',\n 'shrink-0',\n 'flex',\n 'flex-col',\n 'gap-2.5',\n 'p-4',\n 'overflow-auto',\n ].join(' ')}\n >\n {/* Título */}\n <div className=\"w-full\">\n <h2\n className={[\n 'text-xl',\n 'leading-7',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Salones\n </h2>\n </div>\n\n {/* Lista de ubicaciones */}\n <div className=\"flex flex-col gap-2 w-full\">\n {isLoading ? (\n <div className=\"text-content-secondary dark:text-content-secondary text-sm\">\n Cargando salones...\n </div>\n ) : locations.length === 0 ? (\n <div className=\"text-content-secondary dark:text-content-secondary text-sm\">\n No hay salones disponibles\n </div>\n ) : (\n locations.map((location) => (\n <POSLocationButton\n key={location.id}\n locationName={location.name}\n status={location.status}\n state={location.id === activeLocationId ? 'actived' : 'enabled'}\n capacity={location.capacity}\n onClick={() => onLocationSelect?.(location.id)}\n />\n ))\n )}\n </div>\n </div>\n );\n\n // ===== RENDER ÁREA CENTRAL (MESAS) =====\n const renderTablesArea = () => (\n <div\n className={[\n 'flex-1',\n 'min-w-0',\n 'flex',\n 'flex-col',\n 'gap-4',\n 'p-4',\n 'bg-white',\n 'dark:bg-dark-bg-primary',\n 'rounded-tl-3xl',\n 'rounded-tr-3xl',\n 'overflow-auto',\n ].join(' ')}\n >\n {/* Header con título y botones */}\n <div className=\"flex flex-col md:flex-row gap-4 items-start md:items-center justify-between w-full\">\n {/* Título */}\n <h2\n className={[\n 'text-xl',\n 'leading-7',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n 'flex-1',\n ].join(' ')}\n >\n {tablesTitle}\n </h2>\n\n {/* Botones de acción */}\n <div className=\"flex gap-2 flex-wrap\">\n <Button\n type=\"default\"\n size=\"sm\"\n leftIcon={<PlusIcon />}\n onClick={onCreateTables}\n >\n Crear Mesas\n </Button>\n <Button\n type=\"default\"\n size=\"sm\"\n leftIcon={<ArrowsPointingInIcon />}\n onClick={onMergeTables}\n >\n Unir Mesas\n </Button>\n <Button\n type=\"default\"\n size=\"sm\"\n leftIcon={<ArrowsPointingOutIcon />}\n onClick={onSplitTables}\n >\n Separar Mesas\n </Button>\n </div>\n </div>\n\n {/* Área de mesas */}\n <div\n className={[\n 'flex-1',\n 'bg-background-secondary',\n 'dark:bg-dark-bg-secondary',\n 'rounded-xl',\n 'p-4',\n 'overflow-auto',\n 'min-h-[400px]',\n ].join(' ')}\n >\n {isLoading ? (\n <div className=\"flex items-center justify-center h-full text-content-secondary dark:text-content-secondary\">\n Cargando mesas...\n </div>\n ) : errorMessage ? (\n <div className=\"flex items-center justify-center h-full text-error-content dark:text-error-content\">\n {errorMessage}\n </div>\n ) : tables.length === 0 ? (\n <div className=\"flex items-center justify-center h-full text-content-secondary dark:text-content-secondary\">\n No hay mesas en esta ubicación\n </div>\n ) : tableLayout === 'grid' ? (\n /* Layout Flexbox centrado con ancho máximo restringido para 4 columnas (160px * 4 + 8px * 3 = 664px) */\n <div className=\"flex flex-col items-center justify-center min-h-full w-full p-4\">\n <div className=\"flex flex-wrap gap-2 justify-center max-w-[664px]\">\n {tables.map((table) => (\n <POSTable\n key={table.tableNumber}\n tableNumber={table.tableNumber}\n status={table.status}\n shape={table.shape}\n chairs={table.chairs}\n isActive={table.isActive}\n onClick={() => onTableSelect?.(table.tableNumber)}\n />\n ))}\n </div>\n </div>\n ) : (\n /* Layout libre con posicionamiento absoluto */\n <div className=\"relative w-full h-full min-h-[400px]\">\n {tables.map((table) => (\n <div\n key={table.tableNumber}\n className=\"absolute\"\n style={\n table.position\n ? {\n left: `${table.position.x}%`,\n top: `${table.position.y}%`,\n transform: 'translate(-50%, -50%)',\n }\n : undefined\n }\n >\n <POSTable\n tableNumber={table.tableNumber}\n status={table.status}\n shape={table.shape}\n chairs={table.chairs}\n isActive={table.isActive}\n onClick={() => onTableSelect?.(table.tableNumber)}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Leyenda de convenciones */}\n <div className=\"flex flex-wrap gap-4 items-center w-full\">\n <POSConvention status=\"available\" />\n <POSConvention status=\"occupied\" />\n <POSConvention status=\"reserved\" />\n <POSConvention status=\"outOfService\" />\n </div>\n </div>\n );\n\n // ===== RENDER SIDEBAR DERECHO (SELECTOR DE PERSONAS) =====\n const renderPeopleCountSidebar = () => {\n if (!showPeopleCountPanel) return null;\n\n return (\n <div\n className={[\n 'w-full',\n 'md:w-[304px]',\n 'shrink-0',\n 'flex',\n 'flex-col',\n 'p-4',\n 'overflow-hidden',\n ].join(' ')}\n >\n {/* Header con switch y botón cerrar */}\n <div className=\"flex items-center justify-between w-full pb-4 border-b border-border-primary dark:border-dark-border-primary shrink-0\">\n <Switch\n label={selectedTable?.locationName || 'Ubicación'}\n description={selectedTable?.tableName || 'Mesa'}\n labelPosition=\"trailing\"\n checked={false}\n onChange={(e) => onTableSwitchChange?.(e.target.checked)}\n />\n <button\n className={[\n 'p-2',\n 'rounded-md',\n 'border',\n 'border-primary-custom-300',\n 'text-primary-custom-600',\n 'hover:bg-background-secondary',\n 'dark:border-dark-border-custom',\n 'dark:hover:bg-dark-bg-primary',\n 'transition-colors',\n ].join(' ')}\n onClick={onClosePeoplePanel}\n aria-label=\"Cerrar panel\"\n >\n <XMarkIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Body - Título, descripción y teclado numérico */}\n <div className=\"flex flex-col gap-2 w-full flex-1 overflow-auto pt-4\">\n {/* Título y descripción */}\n <div className=\"flex flex-col gap-1 w-full\">\n <h3\n className={[\n 'text-xl',\n 'leading-7',\n 'font-bold',\n 'tracking-[-0.5px]',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Tomar pedido\n </h3>\n <p\n className={[\n 'text-sm',\n 'leading-5',\n 'text-content-primary',\n 'dark:text-dark-content-primary',\n ].join(' ')}\n >\n Selecciona la cantidad de personas\n </p>\n </div>\n\n {/* Teclado numérico 3x3 */}\n <div className=\"grid grid-cols-3 gap-2 w-full mt-2\">\n {[1, 2, 3, 4, 5, 6, 7, 8].map((num) => (\n <POSNumberButton\n key={num}\n size=\"l\"\n border\n onClick={() => onPeopleCountSelect?.(num)}\n >\n {num}\n </POSNumberButton>\n ))}\n </div>\n </div>\n\n {/* Footer - Botones de acción FIJADOS AL BOTTOM con border-top */}\n <div className=\"flex flex-col gap-4 w-full pt-4 mt-auto shrink-0 grow-0 basis-auto border-t border-border-primary dark:border-dark-border-primary\">\n <Button\n type=\"default\"\n size=\"sm\"\n fullWidth\n leftIcon={<ArrowRightEndOnRectangleIcon />}\n onClick={onAssignTable}\n >\n Asignar\n </Button>\n <div className=\"flex gap-2 w-full\">\n <Button\n type=\"outline\"\n size=\"sm\"\n fullWidth\n leftIcon={<ArrowsRightLeftIcon />}\n onClick={onTransferTable}\n >\n Transferir\n </Button>\n <Button\n type=\"outline\"\n size=\"sm\"\n fullWidth\n leftIcon={<RectangleGroupIcon />}\n onClick={onSetCutlery}\n >\n Cubiertos\n </Button>\n </div>\n </div>\n </div>\n );\n };\n\n // ===== RENDER PRINCIPAL =====\n return (\n <div\n className={[\n 'flex',\n 'flex-col',\n 'w-full',\n 'min-h-screen',\n 'bg-background-secondary',\n 'dark:bg-dark-bg-primary',\n className,\n ].join(' ')}\n >\n {/* Navbar */}\n {renderNavbar()}\n\n {/* Contenedor principal con sidebars y área central */}\n <div className=\"flex flex-1 w-full overflow-hidden\">\n {/* Sidebar izquierdo - Salones */}\n {renderLocationsSidebar()}\n\n {/* Área central - Mesas */}\n {renderTablesArea()}\n\n {/* Sidebar derecho - Selector de personas (condicional) */}\n {renderPeopleCountSidebar()}\n </div>\n </div>\n );\n};\n","import React, { createContext, useContext, useEffect, useState } from 'react';\n\nexport type Theme = 'light' | 'dark';\n\ninterface ThemeContextType {\n theme: Theme;\n toggleTheme: () => void;\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined);\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: Theme;\n}\n\n/**\n * ThemeProvider - Proveedor de contexto para el tema de la aplicación\n *\n * Maneja el estado del tema (light/dark) y lo persiste en localStorage.\n * Aplica la clase 'dark' al elemento HTML root cuando el tema es dark.\n *\n * @example\n * ```tsx\n * <ThemeProvider defaultTheme=\"light\">\n * <App />\n * </ThemeProvider>\n * ```\n */\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n defaultTheme = 'light'\n}) => {\n const [theme, setThemeState] = useState<Theme>(() => {\n // Intenta obtener el tema del localStorage\n if (typeof window !== 'undefined') {\n const savedTheme = localStorage.getItem('siesa-ui-theme') as Theme;\n return savedTheme || defaultTheme;\n }\n return defaultTheme;\n });\n\n useEffect(() => {\n // Aplica o remueve la clase 'dark' del elemento root\n const root = window.document.documentElement;\n\n if (theme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n\n // Guarda el tema en localStorage\n localStorage.setItem('siesa-ui-theme', theme);\n }, [theme]);\n\n const toggleTheme = () => {\n setThemeState((prev) => (prev === 'light' ? 'dark' : 'light'));\n };\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme);\n };\n\n return (\n <ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\n/**\n * useTheme - Hook para acceder al contexto del tema\n *\n * @returns {ThemeContextType} Objeto con el tema actual y funciones para modificarlo\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { theme, toggleTheme } = useTheme();\n *\n * return (\n * <button onClick={toggleTheme}>\n * Tema actual: {theme}\n * </button>\n * );\n * }\n * ```\n */\nexport const useTheme = (): ThemeContextType => {\n const context = useContext(ThemeContext);\n\n if (context === undefined) {\n throw new Error('useTheme debe ser usado dentro de un ThemeProvider');\n }\n\n return context;\n};\n"],"names":["Button","type","size","iconOnly","leftIcon","rightIcon","children","disabled","className","onClick","htmlType","fullWidth","ariaLabel","badge","badgeCount","badgeColor","rest","sizeClasses","iconSizeClasses","textSizeClasses","typeClasses","baseClasses","widthClass","buttonClasses","renderIcon","icon","jsx","renderContent","jsxs","Fragment","badgeColorClasses","badgeColors","renderBadge","Input","forwardRef","label","labelSecondary","helperText","error","errorMessage","id","props","ref","inputId","baseInputClasses","interactiveClasses","errorClasses","containerClasses","existingClassName","cloneElement","Textarea","description","resize","rows","textareaId","baseTextareaClasses","resizeClasses","Checkbox","checked","indeterminate","onChange","inputRef","useRef","combinedRef","checkboxId","useEffect","checkboxClasses","Radio","value","name","radioId","baseRadioClasses","checkedClasses","Switch","labelPosition","switchId","baseTrackClasses","getTrackStateClasses","getButtonClasses","baseButtonClasses","positionClass","trackClasses","LabelContent","SwitchInput","Avatar","src","alt","initials","containerSizeClasses","Divider","finalClasses","DescriptionList","term","details","columnClasses","Alert","title","actions","onCancel","onConfirm","cancelText","confirmText","actionButtons","Badge","color","count","colors","Quantity","controlledValue","defaultValue","min","max","linkText","onLinkClick","internalValue","setInternalValue","useState","isControlled","currentValue","handleValueChange","newValue","clampedValue","handleDecrement","handleIncrement","isDecrementDisabled","isIncrementDisabled","MinusIcon","PlusIcon","borderClass","hoverClass","focusClass","NavigationRailItem","selected","onMouseEnter","showLabelText","showIcon","iconContainerClasses","iconClasses","labelClasses","ChevronDownIcon","Dropdown","variant","items","controlledOpen","onOpenChange","menuClassName","placeholder","internalOpen","setInternalOpen","dropdownRef","isOpen","handleToggle","newOpen","handleClickOutside","event","handleEscape","handleItemClick","item","triggerClasses","menuClasses","index","DropdownDivider","DropdownHeading","DropdownItem","shortcut","itemClasses","headingClasses","dividerClasses","DropdownItemCollapsible","defaultOpen","isCollapsible","showHeading","headingLabel","showDivider","setIsOpen","handleHeaderClick","e","handleChildClick","child","CogIcon","CheckIcon","XIcon","iconMap","getIcon","iconName","IconComponent","DropdownItemHeading","showDescription","actionLabel","showAction","onActionClick","Notification","colorClasses","dynamicAriaLabel","displayCount","ArrowLeftIcon","ArrowRightIcon","Pagination","currentPage","totalPages","onPageChange","backText","nextText","siblingCount","showBackButton","showNextButton","paginationRange","useMemo","totalBlocks","_","i","leftSiblingIndex","rightSiblingIndex","shouldShowLeftDots","shouldShowRightDots","firstPageIndex","lastPageIndex","leftItemCount","rightItemCount","rightRange","middleRange","handlePageChange","page","PageButton","isActive","buttonAriaLabel","isDots","titleId","svgRef","React","ForwardRef","ChevronUpDownIcon","ClockIcon","HeroChevronUpDown","HeroCheck","Select","options","showLabel","menuHeader","triggerClassName","required","menuPosition","selectedValue","setSelectedValue","focusedIndex","setFocusedIndex","containerRef","triggerRef","menuRef","handleKeyDown","prev","handleSelect","selectedOption","opt","toggleMenu","option","finalTriggerClasses","finalMenuClasses","baseMenuItemClasses","getMenuItemClasses","isSelected","isFocused","hoverClasses","disabledClasses","checkIconClasses","NavigationRail","alignment","showFab","fabIcon","onFabClick","fabAriaLabel","selectedId","onItemSelect","wrapperClasses","itemsContainerClasses","fabClasses","NavigationRailPanel","height","width","heading","showSearch","search","sections","panelClassName","searchValue","setSearchValue","handleSearchChange","containerStyle","panelStyle","section","sectionIndex","itemIndex","NavigationRailPanelItem","ChevronLeftIcon","ChevronRightIcon","MagnifyingGlassIcon","HeroChevronRight","HeroChevronLeft","HeroClockOutline","HeroSearch","NavigationRailTypes","collapsed","showRecentButton","showSearchButton","onCollapsedChange","onItemClick","onItemHover","labels","searchQuery","setSearchQuery","finalLabels","handleCollapsedToggle","handleItemHover","idx","NavigationRailItemComponent","HeroMagnifyingGlass","NavigationRailCommercial","state","onStateChange","showPanel","setShowPanel","panelType","setPanelType","hoveredItem","setHoveredItem","isCollapsed","handleCollapsedChange","commercialItem","handleItemHoverFromRail","railItems","ChevronUpIcon","TableHeader","column","sortable","sorted","sortDirection","onSort","combinedClasses","TableCell","align","isStriped","rowIndex","alignClasses","stripedBg","previousLabel","nextLabel","pageNumbers","pages","Table","columns","data","showBorder","showShadow","externalSortColumn","externalSortDirection","emptyMessage","loading","loadingRows","pagination","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","handleSort","columnAccessor","newDirection","getCellValue","row","accessor","colIndex","content","Tab","active","contentBaseClasses","contentStateClasses","textClasses","badgeClasses","indicatorClasses","contentFinalClasses","Tabs","activeId","defaultActiveId","internalActiveId","setInternalActiveId","currentActiveId","handleTabClick","itemWidthClass","ShoppingCartIcon","BellIcon","ExclamationTriangleIcon","ArrowLeftStartOnRectangleIcon","Navbar","logo","productName","environmentBadge","userDropdown","notifications","hideActionButtons","leadingAction","siesaLogo","showBusinessLogo","showSiesaLogoLeading","showSiesaLogoTrailing","onNavigationClick","onSearchClick","onCartClick","onNotificationsClick","actionButtonClasses","navigationButtonClasses","isMobile","isDesktop","isTablet","isResponsive","NavigationButton","buttonContent","BusinessLogo","logoContent","SiesaLogoLeading","logoFull","logoMobile","SiesaLogoTrailing","responsive","dividerContent","ProductName","nameContent","EnvironmentBadge","SearchButton","CartButton","NotificationsButton","UserDropdown","dropdownButtonClasses","renderFullDropdown","NavigationBar","activeItemId","renderItem","itemContainerClasses","destinationsClasses","ConventionIcon","lightColor","darkColor","POSConvention","status","config","XMarkIcon","CalendarIcon","NoSymbolIcon","UsersIcon","POSLocationButton","locationName","capacity","StatusIcon","backgroundClasses","capacityText","POSNumberButton","border","POSProductButton","image","POSProductCard","price","buttonText","onAddClick","onCardClick","stateClasses","cardClasses","handleCardClick","handleButtonClick","TrashIcon","POSProductSidebarItems","categoryLabel","categoryColor","productRef","descriptionItems","quantity","minQuantity","maxQuantity","onQuantityChange","onDelete","deleteIcon","categoryColorClasses","handleQuantityChange","newQuantity","handleDelete","POSTable","tableNumber","shape","chairs","showChairs","statusColors","shapeClasses","Chair","rotation","handleClick","EnvelopeIcon","LockClosedIcon","EyeIcon","LoginView","onSubmit","onForgotPassword","onSignUp","isLoading","showBackground","email","setEmail","password","setPassword","showPassword","setShowPassword","emailError","setEmailError","handleSubmit","handleEmailChange","togglePasswordVisibility","UserCircleIcon","SignUpView","onSignIn","onTermsClick","onPrivacyClick","setName","LayoutCommercial","navigationItems","contentClassName","navState","setNavState","handleNavStateChange","HomeIcon","GlobeAltIcon","DocumentTextIcon","CloudIcon","SquaresPlusIcon","ListBulletIcon","FunnelIcon","ArrowLongLeftIcon","ArrowLongRightIcon","ListView","navbarTitle","tableTitle","quickFilters","onSearch","searchPlaceholder","selectedNavId","onNavSelect","viewOptions","selectedViewOption","onViewOptionChange","showViewDropdown","setShowViewDropdown","defaultNavigationItems","defaultQuickFilters","defaultActionButtons","handleSearch","getPageNumbers","filter","btn","ProductsView","changeTableLabel","menusTitle","menus","selectedMenuId","onMenuSelect","onChangeTable","categoryTitle","categories","selectedCategoryId","onCategorySelect","productsTitle","products","onAddProduct","activeTab","onTabChange","orderItems","onOrderItemQuantityChange","onOrderItemDelete","subtotal","taxes","total","confirmLabel","onConfirmOrder","userAvatar","userName","userRole","businessLogo","menu","category","product","qty","RecoverPasswordView","onBackToLogin","successMessage","ArrowsPointingInIcon","ArrowsPointingOutIcon","ArrowRightEndOnRectangleIcon","ArrowsRightLeftIcon","RectangleGroupIcon","TableLayoutView","locations","activeLocationId","tables","tablesTitle","showPeopleCountPanel","selectedTable","onLocationSelect","onTableSelect","onCreateTables","onMergeTables","onSplitTables","onPeopleCountSelect","onAssignTable","onTransferTable","onSetCutlery","onClosePeoplePanel","onTableSwitchChange","tableLayout","userInfo","renderNavbar","renderLocationsSidebar","location","renderTablesArea","table","renderPeopleCountSidebar","num","ThemeContext","createContext","ThemeProvider","defaultTheme","theme","setThemeState","root","toggleTheme","setTheme","newTheme","useTheme","context","useContext"],"mappings":"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","x_google_ignoreList":[22,23,24,29,30,31]}
|