siesa-ui-kit 1.0.3 → 1.0.4
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 +115 -115
- package/bin/install.cjs +502 -502
- package/bin/prepare-publish.cjs +28 -28
- package/bin/restore-folders.cjs +28 -28
- package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
- package/claude/prompts/component-template.md +121 -0
- package/claude/prompts/siesa-ui-kit.md +28 -0
- package/claude/settings.local.json +72 -0
- package/dist/components/Button/icons.d.ts +6 -5
- package/dist/components/Button/icons.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
- package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
- package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
- package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
- package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
- package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
- package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
- package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
- package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
- package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/icons.d.ts +6 -2
- package/dist/components/Select/icons.d.ts.map +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/siesa-ui-kit.cjs +404 -190
- package/dist/siesa-ui-kit.cjs.map +1 -1
- package/dist/siesa-ui-kit.mjs +6590 -1506
- package/dist/siesa-ui-kit.mjs.map +1 -1
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
- package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
- package/dist/views/LayoutCommercial/index.d.ts +3 -0
- package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
- package/docs/border-radius.md +1261 -0
- package/docs/colors.md +832 -0
- package/docs/dark-mode-guide.md +1426 -0
- package/docs/filters.md +1243 -0
- package/docs/icons.md +1264 -0
- package/docs/shadows.md +1377 -0
- package/docs/spacing.md +1684 -0
- package/docs/typography.md +1268 -0
- package/package.json +111 -103
- package/postcss.config.cjs +6 -0
- package/public/,Business Logo.png +0 -0
- package/public/.Siesa Logo.png +0 -0
- package/public/bg_siesa.png +0 -0
- package/public/siesa_logo_mobile.png +0 -0
- package/public/vite.svg +1 -0
- package/src/App.css +42 -0
- package/src/App.tsx +8 -0
- package/src/ButtonTest.tsx +147 -0
- package/src/assets/fonts/README.md +261 -0
- 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 +1 -0
- package/src/components/Alert/Alert.stories.tsx +332 -0
- package/src/components/Alert/Alert.tsx +106 -0
- package/src/components/Alert/Alert.types.ts +54 -0
- package/src/components/Avatar/Avatar.stories.tsx +494 -0
- package/src/components/Avatar/Avatar.tsx +143 -0
- package/src/components/Avatar/Avatar.types.ts +53 -0
- package/src/components/Badge/Badge.stories.tsx +339 -0
- package/src/components/Badge/Badge.tsx +278 -0
- package/src/components/Badge/Badge.types.ts +58 -0
- package/src/components/Button/Button.stories.tsx +950 -0
- package/src/components/Button/Button.tsx +337 -0
- package/src/components/Button/Button.types.ts +180 -0
- package/src/components/Button/icons.tsx +48 -0
- package/src/components/Button/index.ts +3 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +453 -0
- package/src/components/Checkbox/Checkbox.tsx +208 -0
- package/src/components/Checkbox/Checkbox.types.ts +61 -0
- package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -0
- package/src/components/DescriptionList/DescriptionList.tsx +96 -0
- package/src/components/DescriptionList/DescriptionList.types.ts +29 -0
- package/src/components/Divider/Divider.stories.tsx +263 -0
- package/src/components/Divider/Divider.tsx +80 -0
- package/src/components/Divider/Divider.types.ts +24 -0
- package/src/components/Dropdown/Dropdown.stories.tsx +552 -0
- package/src/components/Dropdown/Dropdown.tsx +422 -0
- package/src/components/Dropdown/Dropdown.types.ts +146 -0
- package/src/components/Dropdown/README.md +266 -0
- package/src/components/Dropdown/icons.tsx +72 -0
- package/src/components/Dropdown/index.ts +8 -0
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -0
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -0
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -0
- package/src/components/DropdownItemCollapsible/README.md +264 -0
- package/src/components/DropdownItemCollapsible/icons.tsx +57 -0
- package/src/components/DropdownItemCollapsible/index.ts +12 -0
- package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -0
- package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -0
- package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -0
- package/src/components/DropdownItemHeading/README.md +573 -0
- package/src/components/DropdownItemHeading/icons.tsx +125 -0
- package/src/components/DropdownItemHeading/index.ts +3 -0
- package/src/components/Input/Input.stories.tsx +583 -0
- package/src/components/Input/Input.tsx +204 -0
- package/src/components/Input/Input.types.ts +80 -0
- package/src/components/Input/icons.tsx +145 -0
- package/src/components/Input/index.ts +2 -0
- package/src/components/LoginView/LoginView.stories.tsx +148 -0
- package/src/components/LoginView/LoginView.tsx +426 -0
- package/src/components/LoginView/LoginView.types.ts +52 -0
- package/src/components/LoginView/README.md +396 -0
- package/src/components/LoginView/icons.tsx +85 -0
- package/src/components/LoginView/index.ts +3 -0
- package/src/components/Navbar/Navbar.stories.tsx +810 -0
- package/src/components/Navbar/Navbar.tsx +755 -0
- package/src/components/Navbar/Navbar.types.ts +219 -0
- package/src/components/Navbar/README.md +279 -0
- package/src/components/Navbar/icons.tsx +102 -0
- package/src/components/Navbar/index.ts +8 -0
- package/src/components/NavigationBar/NavigationBar.stories.tsx +406 -0
- package/src/components/NavigationBar/NavigationBar.tsx +246 -0
- package/src/components/NavigationBar/NavigationBar.types.ts +74 -0
- package/src/components/NavigationBar/README.md +469 -0
- package/src/components/NavigationBar/index.ts +2 -0
- package/src/components/NavigationRail/NavigationRail.stories.tsx +417 -0
- package/src/components/NavigationRail/NavigationRail.tsx +418 -0
- package/src/components/NavigationRail/NavigationRail.types.ts +109 -0
- package/src/components/NavigationRail/README.md +224 -0
- package/src/components/NavigationRail/index.ts +2 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
- package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
- package/src/components/NavigationRailCommercial/README.md +251 -0
- package/src/components/NavigationRailCommercial/icons.tsx +54 -0
- package/src/components/NavigationRailCommercial/index.ts +6 -0
- package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -0
- package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -0
- package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -0
- package/src/components/NavigationRailItem/README.md +476 -0
- package/src/components/NavigationRailItem/index.ts +2 -0
- package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -0
- package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -0
- package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -0
- package/src/components/NavigationRailPanel/README.md +461 -0
- package/src/components/NavigationRailPanel/index.ts +6 -0
- package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -0
- package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -0
- package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -0
- package/src/components/NavigationRailTypes/README.md +573 -0
- package/src/components/NavigationRailTypes/icons.tsx +76 -0
- package/src/components/NavigationRailTypes/index.ts +7 -0
- package/src/components/Notification/Notification.stories.tsx +513 -0
- package/src/components/Notification/Notification.tsx +145 -0
- package/src/components/Notification/Notification.types.ts +142 -0
- package/src/components/Notification/README.md +409 -0
- package/src/components/Notification/index.ts +3 -0
- package/src/components/POSConvention/POSConvention.stories.tsx +235 -0
- package/src/components/POSConvention/POSConvention.tsx +129 -0
- package/src/components/POSConvention/POSConvention.types.ts +38 -0
- package/src/components/POSConvention/README.md +123 -0
- package/src/components/POSConvention/icons.tsx +45 -0
- package/src/components/POSConvention/index.ts +3 -0
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -0
- package/src/components/POSLocationButton/POSLocationButton.tsx +247 -0
- package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -0
- package/src/components/POSLocationButton/README.md +253 -0
- package/src/components/POSLocationButton/icons.tsx +120 -0
- package/src/components/POSLocationButton/index.ts +14 -0
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -0
- package/src/components/POSNumberButton/POSNumberButton.tsx +179 -0
- package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -0
- package/src/components/POSNumberButton/README.md +321 -0
- package/src/components/POSNumberButton/index.ts +3 -0
- package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -0
- package/src/components/POSProductButton/POSProductButton.tsx +152 -0
- package/src/components/POSProductButton/POSProductButton.types.ts +46 -0
- package/src/components/POSProductButton/README.md +269 -0
- package/src/components/POSProductButton/index.ts +2 -0
- package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -0
- package/src/components/POSProductCard/POSProductCard.tsx +208 -0
- package/src/components/POSProductCard/POSProductCard.types.ts +76 -0
- package/src/components/POSProductCard/README.md +179 -0
- package/src/components/POSProductCard/icons.tsx +26 -0
- package/src/components/POSProductCard/index.ts +2 -0
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -0
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -0
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -0
- package/src/components/POSProductSidebarItems/README.md +198 -0
- package/src/components/POSProductSidebarItems/icons.tsx +21 -0
- package/src/components/POSProductSidebarItems/index.ts +3 -0
- package/src/components/POSTable/POSTable.stories.tsx +737 -0
- package/src/components/POSTable/POSTable.tsx +401 -0
- package/src/components/POSTable/POSTable.types.ts +83 -0
- package/src/components/POSTable/README.md +286 -0
- package/src/components/POSTable/index.ts +7 -0
- package/src/components/Pagination/Pagination.stories.tsx +555 -0
- package/src/components/Pagination/Pagination.tsx +286 -0
- package/src/components/Pagination/Pagination.types.ts +93 -0
- package/src/components/Pagination/README.md +298 -0
- package/src/components/Pagination/icons.tsx +47 -0
- package/src/components/Pagination/index.ts +3 -0
- package/src/components/Quantity/Quantity.stories.tsx +457 -0
- package/src/components/Quantity/Quantity.tsx +289 -0
- package/src/components/Quantity/Quantity.types.ts +70 -0
- package/src/components/Radio/Radio.stories.tsx +523 -0
- package/src/components/Radio/Radio.tsx +170 -0
- package/src/components/Radio/Radio.types.ts +122 -0
- package/src/components/Select/README.md +299 -0
- package/src/components/Select/Select.stories.tsx +705 -0
- package/src/components/Select/Select.tsx +457 -0
- package/src/components/Select/Select.types.ts +148 -0
- package/src/components/Select/icons.tsx +25 -0
- package/src/components/Select/index.ts +3 -0
- package/src/components/SignUpView/SignUpView.stories.tsx +129 -0
- package/src/components/SignUpView/SignUpView.tsx +503 -0
- package/src/components/SignUpView/SignUpView.types.ts +58 -0
- package/src/components/SignUpView/icons.tsx +71 -0
- package/src/components/SignUpView/index.ts +3 -0
- package/src/components/Switch/README.md +112 -0
- package/src/components/Switch/Switch.stories.tsx +550 -0
- package/src/components/Switch/Switch.tsx +246 -0
- package/src/components/Switch/Switch.types.ts +67 -0
- package/src/components/Table/README.md +369 -0
- package/src/components/Table/Table.stories.tsx +805 -0
- package/src/components/Table/Table.tsx +688 -0
- package/src/components/Table/Table.types.ts +204 -0
- package/src/components/Table/index.ts +9 -0
- package/src/components/Tabs/README.md +201 -0
- package/src/components/Tabs/Tabs.stories.tsx +580 -0
- package/src/components/Tabs/Tabs.tsx +356 -0
- package/src/components/Tabs/Tabs.types.ts +127 -0
- package/src/components/Tabs/icons.tsx +129 -0
- package/src/components/Tabs/index.ts +11 -0
- package/src/components/Textarea/Textarea.stories.tsx +535 -0
- package/src/components/Textarea/Textarea.tsx +188 -0
- package/src/components/Textarea/Textarea.types.ts +54 -0
- package/src/context/ThemeContext.tsx +99 -0
- package/src/context/index.ts +1 -0
- package/src/index.css +29 -0
- package/src/index.ts +133 -0
- package/src/main.tsx +10 -0
- package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
- package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
- package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
- package/src/views/LayoutCommercial/README.md +286 -0
- package/src/views/LayoutCommercial/index.ts +2 -0
- package/src/views/ListView/ListView.stories.tsx +329 -0
- package/src/views/ListView/ListView.tsx +570 -0
- package/src/views/ListView/ListView.types.ts +211 -0
- package/src/views/ListView/icons.tsx +282 -0
- package/src/views/ListView/index.ts +11 -0
- package/src/views/LoginView/LoginView.stories.tsx +148 -0
- package/src/views/LoginView/LoginView.tsx +426 -0
- package/src/views/LoginView/LoginView.types.ts +52 -0
- package/src/views/LoginView/README.md +396 -0
- package/src/views/LoginView/icons.tsx +85 -0
- package/src/views/LoginView/index.ts +3 -0
- package/src/views/ProductsView/ProductsView.stories.tsx +344 -0
- package/src/views/ProductsView/ProductsView.tsx +480 -0
- package/src/views/ProductsView/ProductsView.types.ts +238 -0
- package/src/views/ProductsView/README.md +312 -0
- package/src/views/ProductsView/icons.tsx +38 -0
- package/src/views/ProductsView/index.ts +8 -0
- package/src/views/RecoverPasswordView/README.md +269 -0
- package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +131 -0
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -0
- package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +56 -0
- package/src/views/RecoverPasswordView/icons.tsx +17 -0
- package/src/views/RecoverPasswordView/index.ts +2 -0
- package/src/views/SignUpView/SignUpView.stories.tsx +129 -0
- package/src/views/SignUpView/SignUpView.tsx +503 -0
- package/src/views/SignUpView/SignUpView.types.ts +58 -0
- package/src/views/SignUpView/icons.tsx +71 -0
- package/src/views/SignUpView/index.ts +3 -0
- package/src/views/TableLayoutView/README.md +268 -0
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -0
- package/src/views/TableLayoutView/TableLayoutView.tsx +461 -0
- package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -0
- package/src/views/TableLayoutView/icons.tsx +113 -0
- package/src/views/TableLayoutView/index.ts +6 -0
- package/storybook/main.ts +20 -0
- package/storybook/preview.tsx +84 -0
- package/storybook/vitest.setup.ts +7 -0
- package/tailwind.config.js +128 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { NavigationRailItemProps } from './NavigationRailItem.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* NavigationRailItem - Componente independiente para items de NavigationRail
|
|
6
|
+
*
|
|
7
|
+
* Item individual de navegación vertical (rail) para aplicaciones. Proporciona
|
|
8
|
+
* un punto de acceso a destinos mediante un icono, label opcional y badges.
|
|
9
|
+
*
|
|
10
|
+
* **Características principales:**
|
|
11
|
+
* - Ancho fijo de 56px según Figma
|
|
12
|
+
* - Estados completos: normal, hover, selected, focus, disabled
|
|
13
|
+
* - Badges de notificación con contador opcional
|
|
14
|
+
* - Tipografía Label XXSmall (10px Bold) según sistema de diseño
|
|
15
|
+
* - Dark mode completo con estrategia 'class'
|
|
16
|
+
* - Focus rings adaptativos para accesibilidad
|
|
17
|
+
* - Soporte para iconos 16x16px
|
|
18
|
+
*
|
|
19
|
+
* **Especificaciones de Figma (node 4294-22931):**
|
|
20
|
+
* - Ancho: 56px (w-14)
|
|
21
|
+
* - Icon container: 32px altura, px-4 py-1, rounded-full
|
|
22
|
+
* - Label: 10px Bold, leading 12px (Label XXSmall)
|
|
23
|
+
* - Gap: 4px (gap-1)
|
|
24
|
+
* - Badge: 13x13px, posición absolute
|
|
25
|
+
*
|
|
26
|
+
* **Estados visuales (según Figma):**
|
|
27
|
+
* - **Enabled**: Icon transparent, label text-content-primary
|
|
28
|
+
* - **Hover**: Icon container bg-primary-custom-100 (#dbeefe), icon text-primary-custom-600
|
|
29
|
+
* - **Selected**: Icon container bg-primary-custom-100 con overlay, icon text-primary-custom-600
|
|
30
|
+
* - **Focus**: Focus ring 2px (#60b6fa) con offset 2px (#dbeefe), sombras combinadas
|
|
31
|
+
* - **Disabled**: Opacity 55%, no interactivo
|
|
32
|
+
*
|
|
33
|
+
* **Dark Mode:**
|
|
34
|
+
* - Background: dark-bg-primary
|
|
35
|
+
* - Hover icon container: dark-bg-primary/20
|
|
36
|
+
* - Selected icon container: dark-primary-custom-600/30
|
|
37
|
+
* - Icon colors: dark-content-primary, dark-white on selected
|
|
38
|
+
* - Focus ring: dark-border-custom
|
|
39
|
+
*
|
|
40
|
+
* **Mejores prácticas implementadas:**
|
|
41
|
+
* - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
42
|
+
* - Tokens de color consistentes con documentación
|
|
43
|
+
* - Accesibilidad ARIA completa
|
|
44
|
+
* - Focus visible para keyboard navigation
|
|
45
|
+
* - Badge positioning absoluto para no afectar layout
|
|
46
|
+
*
|
|
47
|
+
* @see docs/colors.md - Sistema de colores (primary-custom, dark-*, content-*)
|
|
48
|
+
* @see docs/typography.md - Tipografía (Label XXSmall)
|
|
49
|
+
* @see docs/spacing.md - Sistema de espaciado
|
|
50
|
+
* @see docs/shadows.md - Sistema de sombras y focus rings
|
|
51
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4294-22931
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* // Item básico
|
|
56
|
+
* <NavigationRailItem
|
|
57
|
+
* id="home"
|
|
58
|
+
* icon={<HomeIcon />}
|
|
59
|
+
* label="Inicio"
|
|
60
|
+
* selected={true}
|
|
61
|
+
* onClick={() => navigate('/')}
|
|
62
|
+
* />
|
|
63
|
+
*
|
|
64
|
+
* // Con badge de notificación
|
|
65
|
+
* <NavigationRailItem
|
|
66
|
+
* id="notifications"
|
|
67
|
+
* icon={<BellIcon />}
|
|
68
|
+
* label="Notificaciones"
|
|
69
|
+
* badgeCount={5}
|
|
70
|
+
* onClick={() => navigate('/notifications')}
|
|
71
|
+
* />
|
|
72
|
+
*
|
|
73
|
+
* // Item deshabilitado
|
|
74
|
+
* <NavigationRailItem
|
|
75
|
+
* id="premium"
|
|
76
|
+
* icon={<StarIcon />}
|
|
77
|
+
* label="Premium"
|
|
78
|
+
* disabled={true}
|
|
79
|
+
* />
|
|
80
|
+
*
|
|
81
|
+
* // Solo icono (sin label)
|
|
82
|
+
* <NavigationRailItem
|
|
83
|
+
* id="home"
|
|
84
|
+
* icon={<HomeIcon />}
|
|
85
|
+
* label="Inicio"
|
|
86
|
+
* showLabelText={false}
|
|
87
|
+
* />
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export const NavigationRailItem: React.FC<NavigationRailItemProps> = ({
|
|
91
|
+
icon,
|
|
92
|
+
label,
|
|
93
|
+
selected = false,
|
|
94
|
+
disabled = false,
|
|
95
|
+
badge = false,
|
|
96
|
+
badgeCount,
|
|
97
|
+
onClick,
|
|
98
|
+
onMouseEnter,
|
|
99
|
+
ariaLabel,
|
|
100
|
+
id,
|
|
101
|
+
showLabelText = true,
|
|
102
|
+
showIcon = true,
|
|
103
|
+
className = '',
|
|
104
|
+
}) => {
|
|
105
|
+
// ===== CLASES DEL ICON CONTAINER =====
|
|
106
|
+
// Según Figma node 4294-22931, el icon container tiene comportamiento diferente
|
|
107
|
+
// según el estado:
|
|
108
|
+
// - Enabled: bg-transparent, hover:bg-primary-custom-100
|
|
109
|
+
// - Hover: bg-primary-custom-100
|
|
110
|
+
// - Selected: bg-primary-custom-100 con overlay (rgba(0,0,0,0.024))
|
|
111
|
+
// - Focus: bg-primary-custom-100 con focus ring y sombras
|
|
112
|
+
// - Disabled: opacidad 55%
|
|
113
|
+
const iconContainerClasses = [
|
|
114
|
+
// Base layout
|
|
115
|
+
'flex',
|
|
116
|
+
'flex-col',
|
|
117
|
+
'items-center',
|
|
118
|
+
'justify-center',
|
|
119
|
+
'px-4', // 16px horizontal según Figma
|
|
120
|
+
'py-1', // 4px vertical según Figma
|
|
121
|
+
'rounded-full',
|
|
122
|
+
'overflow-hidden',
|
|
123
|
+
'shrink-0',
|
|
124
|
+
|
|
125
|
+
// Estados - Background
|
|
126
|
+
selected
|
|
127
|
+
? // Selected: bg-primary-custom-100 con overlay
|
|
128
|
+
'bg-primary-custom-100 dark:bg-primary-custom-600/30'
|
|
129
|
+
: // Default/Hover: transparent → hover:bg-primary-custom-100
|
|
130
|
+
'bg-transparent hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20',
|
|
131
|
+
|
|
132
|
+
// Transiciones
|
|
133
|
+
'transition-colors',
|
|
134
|
+
'duration-150',
|
|
135
|
+
].join(' ');
|
|
136
|
+
|
|
137
|
+
// ===== CLASES DEL ICONO =====
|
|
138
|
+
// Tamaño fijo 16x16px según Figma
|
|
139
|
+
// Colores según estado:
|
|
140
|
+
// - Default: text-content-primary
|
|
141
|
+
// - Hover: text-primary-custom-600
|
|
142
|
+
// - Selected: text-primary-custom-600
|
|
143
|
+
// - Disabled: text-content-tertiary
|
|
144
|
+
// Dark mode: invierte colores
|
|
145
|
+
const iconClasses = [
|
|
146
|
+
'w-4', // 16px
|
|
147
|
+
'h-4', // 16px
|
|
148
|
+
'shrink-0',
|
|
149
|
+
|
|
150
|
+
// Colores según estado
|
|
151
|
+
selected
|
|
152
|
+
? // Selected: primary-custom-600 (azul oscuro)
|
|
153
|
+
'text-primary-custom-600 dark:text-white'
|
|
154
|
+
: disabled
|
|
155
|
+
? // Disabled: content-tertiary
|
|
156
|
+
'text-content-tertiary dark:text-content-tertiary'
|
|
157
|
+
: // Default/Hover: content-primary → hover:primary-custom-600
|
|
158
|
+
'text-content-primary hover:text-primary-custom-600 dark:text-dark-content-primary dark:hover:text-white',
|
|
159
|
+
|
|
160
|
+
'transition-colors',
|
|
161
|
+
'duration-150',
|
|
162
|
+
].join(' ');
|
|
163
|
+
|
|
164
|
+
// ===== CLASES DEL LABEL =====
|
|
165
|
+
// Tipografía: Label XXSmall (10px Bold, leading 12px) según Figma
|
|
166
|
+
// Color: text-content-primary, dark:text-dark-content-primary
|
|
167
|
+
const labelClasses = [
|
|
168
|
+
// Tipografía: Label XXSmall (10px Bold)
|
|
169
|
+
'text-xs', // 12px en lugar de text-[10px]
|
|
170
|
+
'leading-3', // 12px
|
|
171
|
+
'font-bold',
|
|
172
|
+
'text-center',
|
|
173
|
+
'w-full',
|
|
174
|
+
'min-w-full',
|
|
175
|
+
|
|
176
|
+
// Colores
|
|
177
|
+
'text-content-primary',
|
|
178
|
+
'dark:text-dark-content-primary',
|
|
179
|
+
|
|
180
|
+
// Para multiline labels, agregar truncate o text-nowrap si es necesario
|
|
181
|
+
'break-words',
|
|
182
|
+
].join(' ');
|
|
183
|
+
|
|
184
|
+
// ===== CLASES DEL CONTENEDOR PRINCIPAL =====
|
|
185
|
+
// Según Figma: ancho 56px, flex-col, gap-1, items-center
|
|
186
|
+
const containerClasses = [
|
|
187
|
+
'relative',
|
|
188
|
+
'flex',
|
|
189
|
+
'flex-col',
|
|
190
|
+
'items-center',
|
|
191
|
+
'gap-1', // 4px según Figma
|
|
192
|
+
'px-0.5', // 2px horizontal según Figma
|
|
193
|
+
'py-0',
|
|
194
|
+
'w-14', // 56px según Figma
|
|
195
|
+
'shrink-0',
|
|
196
|
+
|
|
197
|
+
// Interactividad
|
|
198
|
+
disabled
|
|
199
|
+
? 'cursor-not-allowed opacity-55 pointer-events-none'
|
|
200
|
+
: 'cursor-pointer',
|
|
201
|
+
|
|
202
|
+
// Focus visible (accesibilidad)
|
|
203
|
+
'focus:outline-none',
|
|
204
|
+
'focus-visible:ring-2',
|
|
205
|
+
'focus-visible:ring-primary-custom-400', // 4px ring
|
|
206
|
+
'focus-visible:ring-offset-2',
|
|
207
|
+
'focus-visible:ring-offset-primary-custom-100', // offset #dbeefe según Figma
|
|
208
|
+
'dark:focus-visible:ring-dark-border-custom',
|
|
209
|
+
'dark:focus-visible:ring-offset-dark-bg-primary',
|
|
210
|
+
|
|
211
|
+
// Focus sombras adicionales según Figma:
|
|
212
|
+
'focus-visible:shadow-lg',
|
|
213
|
+
'dark:focus-visible:shadow-2xl',
|
|
214
|
+
|
|
215
|
+
'rounded-lg',
|
|
216
|
+
|
|
217
|
+
// Clases personalizadas
|
|
218
|
+
className,
|
|
219
|
+
].join(' ');
|
|
220
|
+
|
|
221
|
+
// ===== RENDERIZAR BADGE =====
|
|
222
|
+
const renderBadge = () => {
|
|
223
|
+
if (!badge && badgeCount === undefined) return null;
|
|
224
|
+
|
|
225
|
+
// Badge con número
|
|
226
|
+
if (badgeCount !== undefined) {
|
|
227
|
+
return (
|
|
228
|
+
<span
|
|
229
|
+
className="
|
|
230
|
+
absolute
|
|
231
|
+
-top-0.5
|
|
232
|
+
left-8
|
|
233
|
+
flex
|
|
234
|
+
items-center
|
|
235
|
+
justify-center
|
|
236
|
+
min-w-3
|
|
237
|
+
h-3
|
|
238
|
+
px-1
|
|
239
|
+
rounded-full
|
|
240
|
+
text-xs
|
|
241
|
+
font-bold
|
|
242
|
+
leading-none
|
|
243
|
+
bg-red-700
|
|
244
|
+
text-white
|
|
245
|
+
dark:bg-red-700
|
|
246
|
+
dark:text-white
|
|
247
|
+
pointer-events-none
|
|
248
|
+
select-none
|
|
249
|
+
"
|
|
250
|
+
aria-label={`${badgeCount} notificaciones`}
|
|
251
|
+
data-badge
|
|
252
|
+
>
|
|
253
|
+
{badgeCount > 99 ? '99+' : badgeCount}
|
|
254
|
+
</span>
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Badge dot simple
|
|
259
|
+
return (
|
|
260
|
+
<span
|
|
261
|
+
className="
|
|
262
|
+
absolute
|
|
263
|
+
-top-0.5
|
|
264
|
+
left-8
|
|
265
|
+
w-3
|
|
266
|
+
h-3
|
|
267
|
+
rounded-full
|
|
268
|
+
bg-red-700
|
|
269
|
+
dark:bg-red-700
|
|
270
|
+
pointer-events-none
|
|
271
|
+
select-none
|
|
272
|
+
"
|
|
273
|
+
aria-label="Notificación"
|
|
274
|
+
data-badge
|
|
275
|
+
/>
|
|
276
|
+
);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
return (
|
|
280
|
+
<button
|
|
281
|
+
type="button"
|
|
282
|
+
className={containerClasses}
|
|
283
|
+
disabled={disabled}
|
|
284
|
+
onClick={onClick}
|
|
285
|
+
onMouseEnter={onMouseEnter}
|
|
286
|
+
aria-label={ariaLabel || label}
|
|
287
|
+
aria-current={selected ? 'page' : undefined}
|
|
288
|
+
aria-disabled={disabled}
|
|
289
|
+
data-item-id={id}
|
|
290
|
+
data-testid={`navigation-rail-item-${id}`}
|
|
291
|
+
>
|
|
292
|
+
{/* Icon Container */}
|
|
293
|
+
{showIcon && (
|
|
294
|
+
<div className={iconContainerClasses}>
|
|
295
|
+
<span className={iconClasses}>
|
|
296
|
+
{icon}
|
|
297
|
+
</span>
|
|
298
|
+
</div>
|
|
299
|
+
)}
|
|
300
|
+
|
|
301
|
+
{/* Label */}
|
|
302
|
+
{showLabelText && (
|
|
303
|
+
<p className={labelClasses}>
|
|
304
|
+
{label}
|
|
305
|
+
</p>
|
|
306
|
+
)}
|
|
307
|
+
|
|
308
|
+
{/* Badge */}
|
|
309
|
+
{renderBadge()}
|
|
310
|
+
</button>
|
|
311
|
+
);
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
NavigationRailItem.displayName = 'NavigationRailItem';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Props para NavigationRailItem
|
|
5
|
+
*
|
|
6
|
+
* Componente independiente para items individuales de NavigationRail.
|
|
7
|
+
* Implementación pixel-perfect según Figma (node 4294-22931).
|
|
8
|
+
*
|
|
9
|
+
* **Estados:**
|
|
10
|
+
* - `Enabled`: Estado normal del item
|
|
11
|
+
* - `Hover`: Overlay de color en el icon container
|
|
12
|
+
* - `Selected`: Background con overlay según Figma
|
|
13
|
+
* - `Focus`: Focus ring de 4px (#60b6fa) con offset de 2px (#dbeefe)
|
|
14
|
+
* - `Disabled`: Opacity 55% con pointer-events-none
|
|
15
|
+
*
|
|
16
|
+
* **Especificaciones de Figma:**
|
|
17
|
+
* - Ancho: 56px (w-14)
|
|
18
|
+
* - Altura: auto (flex-col)
|
|
19
|
+
* - Gap: 4px entre icon y label
|
|
20
|
+
* - Padding: 2px horizontal, 0px vertical (px-0.5)
|
|
21
|
+
* - Border radius: 9999px (rounded-full) en icon container
|
|
22
|
+
* - Tipografía label: Label XXSmall (10px Bold, leading 12px)
|
|
23
|
+
* - Icono: 16x16px
|
|
24
|
+
*
|
|
25
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4294-22931
|
|
26
|
+
* @see docs/colors.md - Sistema de colores
|
|
27
|
+
* @see docs/typography.md - Sistema tipográfico (Label XXSmall)
|
|
28
|
+
* @see docs/spacing.md - Sistema de espaciado
|
|
29
|
+
* @see docs/shadows.md - Sistema de sombras (focus ring)
|
|
30
|
+
*/
|
|
31
|
+
export interface NavigationRailItemProps {
|
|
32
|
+
/**
|
|
33
|
+
* Icono a mostrar en el item
|
|
34
|
+
* Tamaño recomendado: 16x16px
|
|
35
|
+
* Tipos compatibles: ReactNode, SVG, Heroicons, etc.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* import { HomeIcon } from '@heroicons/react/24/outline';
|
|
40
|
+
* <NavigationRailItem icon={<HomeIcon />} />
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
icon: ReactNode;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Label/texto del item de navegación
|
|
47
|
+
* Se muestra debajo del icono en tipografía Label XXSmall
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* <NavigationRailItem label="Inicio" />
|
|
51
|
+
*/
|
|
52
|
+
label: string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Si el item está seleccionado actualmente
|
|
56
|
+
*
|
|
57
|
+
* Estado visual:
|
|
58
|
+
* - Background: bg-primary-custom-100 (#dbeefe) con overlay rgba(0,0,0,0.024)
|
|
59
|
+
* - Icono: text-primary-custom-600 (#0e79fd)
|
|
60
|
+
* - Label: text-content-primary
|
|
61
|
+
*
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
selected?: boolean;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Si el item está deshabilitado
|
|
68
|
+
*
|
|
69
|
+
* Estado visual:
|
|
70
|
+
* - Opacity: 55%
|
|
71
|
+
* - Cursor: not-allowed
|
|
72
|
+
* - Pointer-events: none
|
|
73
|
+
*
|
|
74
|
+
* @default false
|
|
75
|
+
*/
|
|
76
|
+
disabled?: boolean;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Mostrar badge de notificación (dot rojo)
|
|
80
|
+
*
|
|
81
|
+
* El badge se posiciona en la esquina superior derecha del icon container.
|
|
82
|
+
* Tamaño: 13x13px
|
|
83
|
+
* Color: #b91c1c (red-700)
|
|
84
|
+
* Posición: left-[34px], top-[-3px]
|
|
85
|
+
*
|
|
86
|
+
* @default false
|
|
87
|
+
*/
|
|
88
|
+
badge?: boolean;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Número a mostrar en el badge (reemplaza el dot simple)
|
|
92
|
+
*
|
|
93
|
+
* Si el número es mayor a 99, muestra "99+"
|
|
94
|
+
* Tipografía: 10px Bold
|
|
95
|
+
* Color: white (#ffffff)
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* <NavigationRailItem badgeCount={5} /> // Muestra: 5
|
|
99
|
+
* <NavigationRailItem badgeCount={150} /> // Muestra: 99+
|
|
100
|
+
*/
|
|
101
|
+
badgeCount?: number;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Handler para evento click del item
|
|
105
|
+
*
|
|
106
|
+
* Se ejecuta cuando el usuario hace click en el item,
|
|
107
|
+
* incluso si está en estado selected.
|
|
108
|
+
*/
|
|
109
|
+
onClick?: () => void;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Handler para evento mouse enter del item
|
|
113
|
+
*
|
|
114
|
+
* Se ejecuta cuando el cursor entra en el área del item.
|
|
115
|
+
* Útil para mostrar paneles o menús contextuales.
|
|
116
|
+
*/
|
|
117
|
+
onMouseEnter?: () => void;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Label para accesibilidad (ARIA-label)
|
|
121
|
+
*
|
|
122
|
+
* Si no se proporciona, usa el valor de `label`
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* <NavigationRailItem label="Inicio" ariaLabel="Ir a la página de inicio" />
|
|
126
|
+
*/
|
|
127
|
+
ariaLabel?: string;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* ID único del item
|
|
131
|
+
*
|
|
132
|
+
* Usado para identificar el item en callbacks y para navegación.
|
|
133
|
+
* Se añade como atributo data-item-id en el elemento DOM.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* <NavigationRailItem id="home" label="Inicio" />
|
|
137
|
+
*/
|
|
138
|
+
id?: string;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Mostrar el label del texto
|
|
142
|
+
*
|
|
143
|
+
* Si es false, solo se muestra el icono
|
|
144
|
+
*
|
|
145
|
+
* @default true
|
|
146
|
+
*/
|
|
147
|
+
showLabelText?: boolean;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Mostrar icono
|
|
151
|
+
*
|
|
152
|
+
* Si es false, solo se muestra el label
|
|
153
|
+
*
|
|
154
|
+
* @default true
|
|
155
|
+
*/
|
|
156
|
+
showIcon?: boolean;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Clases CSS adicionales personalizadas
|
|
160
|
+
*
|
|
161
|
+
* Se aplican al contenedor principal (button)
|
|
162
|
+
*/
|
|
163
|
+
className?: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Estados posibles del componente según Figma
|
|
168
|
+
*
|
|
169
|
+
* - `Enabled`: Estado normal, sin interacción
|
|
170
|
+
* - `Hover`: Mouse over el item
|
|
171
|
+
* - `Selected`: Item actualmente seleccionado
|
|
172
|
+
* - `Focus`: Keyboard focus (accesibilidad)
|
|
173
|
+
* - `Disabled`: Item deshabilitado, no interactivo
|
|
174
|
+
*/
|
|
175
|
+
export type NavigationRailItemState = 'Enabled' | 'Hover' | 'Selected' | 'Focus' | 'Disabled';
|