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,332 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import type { NavigationRailPanelProps } from './NavigationRailPanel.types';
|
|
3
|
+
import { DropdownItemHeading } from '../DropdownItemHeading';
|
|
4
|
+
import { DropdownItemCollapsible } from '../DropdownItemCollapsible';
|
|
5
|
+
import { Input } from '../Input';
|
|
6
|
+
import { Divider } from '../Divider/Divider';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Componente NavigationRailPanel del sistema de diseño Siesa
|
|
10
|
+
*
|
|
11
|
+
* Panel de navegación vertical (rail) que puede contener múltiples secciones
|
|
12
|
+
* de items, búsqueda y encabezados. Se usa típicamente en aplicaciones con
|
|
13
|
+
* navegación compleja que requieren una estructura jerárquica.
|
|
14
|
+
*
|
|
15
|
+
* **Estructura principal:**
|
|
16
|
+
* 1. Encabezado (DropdownItemHeading) - Opcional
|
|
17
|
+
* 2. Input de búsqueda - Opcional
|
|
18
|
+
* 3. Divisor - Siempre presente después de búsqueda/encabezado
|
|
19
|
+
* 4. Body con secciones de items:
|
|
20
|
+
* - Heading de sección (Paragraph/Tiny, content-tertiary)
|
|
21
|
+
* - Items colapsables (DropdownItemCollapsible) o simples
|
|
22
|
+
* - Divisor entre secciones
|
|
23
|
+
*
|
|
24
|
+
* **Dimensiones según Figma:**
|
|
25
|
+
* - Altura: Variable (por defecto 900px)
|
|
26
|
+
* - Ancho del panel: 248px (con padding 12px)
|
|
27
|
+
* - Ancho de contenido: 224px
|
|
28
|
+
* - Padding del panel: 12px
|
|
29
|
+
* - Padding del body: 12px
|
|
30
|
+
* - Border: 1px left (border-primary)
|
|
31
|
+
* - Border radius: 0px (es un panel recto)
|
|
32
|
+
*
|
|
33
|
+
* **Tipografía:**
|
|
34
|
+
* - Heading (DropdownItemHeading): Label/Small (14px Bold)
|
|
35
|
+
* - Section heading: Paragraph/Tiny (12px Regular) - content-tertiary
|
|
36
|
+
* - Items: Paragraph/Small (14px Regular)
|
|
37
|
+
*
|
|
38
|
+
* **Colores (Light Mode):**
|
|
39
|
+
* - Background: #ffffff (white)
|
|
40
|
+
* - Border: #e4e4e7 (border-primary)
|
|
41
|
+
* - Heading text: #18181b (content-primary)
|
|
42
|
+
* - Section heading: #71717a (content-tertiary)
|
|
43
|
+
* - Item text: #18181b (content-primary)
|
|
44
|
+
* - Icon color: #a1a1aa (content-secondary)
|
|
45
|
+
*
|
|
46
|
+
* **Colores (Dark Mode):**
|
|
47
|
+
* - Background: #18181b (dark bg)
|
|
48
|
+
* - Border: #3f3f46 (border-primary/dark)
|
|
49
|
+
* - Heading text: #fafafa (content-primary/dark)
|
|
50
|
+
* - Section heading: #a1a1aa (content-tertiary/dark)
|
|
51
|
+
* - Item text: #fafafa (content-primary/dark)
|
|
52
|
+
* - Icon color: #a1a1aa (content-secondary/dark)
|
|
53
|
+
*
|
|
54
|
+
* **Estados:**
|
|
55
|
+
* - Default: Sin interacción
|
|
56
|
+
* - Hover: Items con hover overlay sutil
|
|
57
|
+
* - Focus: Focus ring adaptativo
|
|
58
|
+
* - Disabled: Opacidad 50%
|
|
59
|
+
* - Active (items colapsables): Expanded state
|
|
60
|
+
*
|
|
61
|
+
* **Espaciado interno:**
|
|
62
|
+
* - Gap entre section heading e items: 0.5 (2px)
|
|
63
|
+
* - Gap entre items: 0.5 (2px)
|
|
64
|
+
* - Gap entre elemento y contenido: 3 (12px)
|
|
65
|
+
* - Padding vertical section heading: pt-3 pb-1 (12px top, 4px bottom)
|
|
66
|
+
* - Padding items: py-2 px-4 (8px vertical, 16px horizontal)
|
|
67
|
+
*
|
|
68
|
+
* **Scroll:**
|
|
69
|
+
* - El body es scrolleable verticalmente (overflow-y-auto)
|
|
70
|
+
* - El encabezado y búsqueda se mantienen fijos en el tope
|
|
71
|
+
*
|
|
72
|
+
* @see docs/colors.md - Sistema de colores
|
|
73
|
+
* @see docs/typography.md - Sistema tipográfico
|
|
74
|
+
* @see docs/spacing.md - Sistema de espaciado
|
|
75
|
+
* @see docs/shadows.md - Sistema de sombras
|
|
76
|
+
* @see ../DropdownItemHeading - Componente reutilizado para encabezado
|
|
77
|
+
* @see ../DropdownItemCollapsible - Componente reutilizado para items colapsables
|
|
78
|
+
* @see ../Input - Componente reutilizado para búsqueda
|
|
79
|
+
* @see ../Divider - Componente reutilizado para separadores
|
|
80
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6134-34415 - Diseño Figma
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```tsx
|
|
84
|
+
* // Ejemplo simple con secciones
|
|
85
|
+
* <NavigationRailPanel
|
|
86
|
+
* height={900}
|
|
87
|
+
* showHeading={true}
|
|
88
|
+
* heading={{
|
|
89
|
+
* label: 'Settings',
|
|
90
|
+
* description: 'Configure your preferences',
|
|
91
|
+
* iconName: 'cog-6-tooth',
|
|
92
|
+
* actionLabel: 'Clear',
|
|
93
|
+
* showAction: true,
|
|
94
|
+
* }}
|
|
95
|
+
* showSearch={true}
|
|
96
|
+
* search={{
|
|
97
|
+
* placeholder: 'Buscar módulo',
|
|
98
|
+
* }}
|
|
99
|
+
* sections={[
|
|
100
|
+
* {
|
|
101
|
+
* heading: 'Section 1',
|
|
102
|
+
* items: [
|
|
103
|
+
* { label: 'Item 1', isCollapsible: true, children: [...] },
|
|
104
|
+
* { label: 'Item 2', isCollapsible: false },
|
|
105
|
+
* ],
|
|
106
|
+
* },
|
|
107
|
+
* {
|
|
108
|
+
* heading: 'Section 2',
|
|
109
|
+
* items: [
|
|
110
|
+
* { label: 'Item 3' },
|
|
111
|
+
* ],
|
|
112
|
+
* },
|
|
113
|
+
* ]}
|
|
114
|
+
* />
|
|
115
|
+
*
|
|
116
|
+
* // Ejemplo con items simples sin secciones
|
|
117
|
+
* <NavigationRailPanel
|
|
118
|
+
* showHeading={false}
|
|
119
|
+
* showSearch={true}
|
|
120
|
+
* items={[
|
|
121
|
+
* { label: 'Dashboard', icon: <DashboardIcon /> },
|
|
122
|
+
* { label: 'Users', icon: <UserIcon /> },
|
|
123
|
+
* { label: 'Settings', icon: <SettingsIcon /> },
|
|
124
|
+
* ]}
|
|
125
|
+
* />
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export const NavigationRailPanel: React.FC<NavigationRailPanelProps> = ({
|
|
129
|
+
height = 900,
|
|
130
|
+
width = 248,
|
|
131
|
+
showHeading = true,
|
|
132
|
+
heading,
|
|
133
|
+
showSearch = true,
|
|
134
|
+
search,
|
|
135
|
+
sections,
|
|
136
|
+
items,
|
|
137
|
+
className = '',
|
|
138
|
+
panelClassName = '',
|
|
139
|
+
}) => {
|
|
140
|
+
const [searchValue, setSearchValue] = useState(search?.value || '');
|
|
141
|
+
|
|
142
|
+
const handleSearchChange = (value: string) => {
|
|
143
|
+
setSearchValue(value);
|
|
144
|
+
search?.onChange?.(value);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// Construir clase de altura dinámicamente
|
|
148
|
+
const containerStyle = {
|
|
149
|
+
height: typeof height === 'number' ? `${height}px` : height,
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const panelStyle = {
|
|
153
|
+
width: typeof width === 'number' ? `${width}px` : width,
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
return (
|
|
157
|
+
<div
|
|
158
|
+
className={`flex items-start relative ${className}`}
|
|
159
|
+
style={containerStyle}
|
|
160
|
+
data-testid="navigation-rail-panel-container"
|
|
161
|
+
>
|
|
162
|
+
<div
|
|
163
|
+
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}`}
|
|
164
|
+
style={panelStyle}
|
|
165
|
+
data-testid="navigation-rail-panel"
|
|
166
|
+
>
|
|
167
|
+
{/* Encabezado (DropdownItemHeading) */}
|
|
168
|
+
{showHeading && heading && (
|
|
169
|
+
<div className="flex flex-col items-start p-3 relative shrink-0 w-full">
|
|
170
|
+
<DropdownItemHeading
|
|
171
|
+
label={heading.label}
|
|
172
|
+
description={heading.description}
|
|
173
|
+
showDescription={heading.showDescription !== false}
|
|
174
|
+
iconName={heading.iconName}
|
|
175
|
+
showIcon={true}
|
|
176
|
+
actionLabel={heading.actionLabel}
|
|
177
|
+
showAction={heading.showAction}
|
|
178
|
+
onActionClick={heading.onActionClick}
|
|
179
|
+
className="w-full"
|
|
180
|
+
/>
|
|
181
|
+
</div>
|
|
182
|
+
)}
|
|
183
|
+
|
|
184
|
+
{/* Input de búsqueda */}
|
|
185
|
+
{showSearch && (
|
|
186
|
+
<div
|
|
187
|
+
className="flex flex-col items-start p-3 relative shrink-0 w-full"
|
|
188
|
+
data-testid="navigation-rail-search"
|
|
189
|
+
>
|
|
190
|
+
<Input
|
|
191
|
+
placeholder={search?.placeholder || 'Buscar módulo'}
|
|
192
|
+
value={searchValue}
|
|
193
|
+
onChange={(e) => handleSearchChange(e.target.value)}
|
|
194
|
+
className="w-full"
|
|
195
|
+
/>
|
|
196
|
+
</div>
|
|
197
|
+
)}
|
|
198
|
+
|
|
199
|
+
{/* Divisor */}
|
|
200
|
+
<Divider className="w-full" />
|
|
201
|
+
|
|
202
|
+
{/* Body con items */}
|
|
203
|
+
<div
|
|
204
|
+
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"
|
|
205
|
+
data-testid="navigation-rail-body"
|
|
206
|
+
>
|
|
207
|
+
{/* Renderizar secciones */}
|
|
208
|
+
{sections && sections.length > 0
|
|
209
|
+
? sections.map((section, sectionIndex) => (
|
|
210
|
+
<div key={`section-${sectionIndex}`} className="w-full">
|
|
211
|
+
{/* Section Heading */}
|
|
212
|
+
{section.heading && (
|
|
213
|
+
<div
|
|
214
|
+
className="flex flex-col gap-0 items-start pb-1 pt-3 px-0 relative shrink-0 w-full"
|
|
215
|
+
data-testid={`section-heading-${sectionIndex}`}
|
|
216
|
+
>
|
|
217
|
+
<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">
|
|
218
|
+
{section.heading}
|
|
219
|
+
</p>
|
|
220
|
+
</div>
|
|
221
|
+
)}
|
|
222
|
+
|
|
223
|
+
{/* Section Items */}
|
|
224
|
+
<div
|
|
225
|
+
className="flex flex-col gap-0.5 items-start relative shrink-0 w-full"
|
|
226
|
+
data-testid={`section-items-${sectionIndex}`}
|
|
227
|
+
>
|
|
228
|
+
{section.items.map((item, itemIndex) => (
|
|
229
|
+
<NavigationRailPanelItem
|
|
230
|
+
key={`item-${sectionIndex}-${itemIndex}`}
|
|
231
|
+
item={item}
|
|
232
|
+
/>
|
|
233
|
+
))}
|
|
234
|
+
</div>
|
|
235
|
+
|
|
236
|
+
{/* Section Divider */}
|
|
237
|
+
{section.showDivider !== false && sectionIndex < sections.length - 1 && (
|
|
238
|
+
<Divider className="mt-3 w-full" />
|
|
239
|
+
)}
|
|
240
|
+
</div>
|
|
241
|
+
))
|
|
242
|
+
: null}
|
|
243
|
+
|
|
244
|
+
{/* Renderizar items simples (sin secciones) */}
|
|
245
|
+
{items && items.length > 0 && !sections
|
|
246
|
+
? items.map((item, itemIndex) => (
|
|
247
|
+
<NavigationRailPanelItem
|
|
248
|
+
key={`item-${itemIndex}`}
|
|
249
|
+
item={item}
|
|
250
|
+
/>
|
|
251
|
+
))
|
|
252
|
+
: null}
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Componente interno para renderizar un item del NavigationRailPanel
|
|
261
|
+
* Puede ser un item simple o colapsable
|
|
262
|
+
*/
|
|
263
|
+
interface NavigationRailPanelItemComponentProps {
|
|
264
|
+
item: NonNullable<NavigationRailPanelProps['items']>[0];
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const NavigationRailPanelItem: React.FC<NavigationRailPanelItemComponentProps> = ({ item }) => {
|
|
268
|
+
if (item.isCollapsible) {
|
|
269
|
+
return (
|
|
270
|
+
<DropdownItemCollapsible
|
|
271
|
+
label={item.label}
|
|
272
|
+
icon={item.icon}
|
|
273
|
+
children={item.children}
|
|
274
|
+
defaultOpen={item.defaultOpen}
|
|
275
|
+
disabled={item.disabled}
|
|
276
|
+
onClick={item.onClick}
|
|
277
|
+
onOpenChange={item.onOpenChange}
|
|
278
|
+
className={item.className}
|
|
279
|
+
showDivider={false}
|
|
280
|
+
showHeading={false}
|
|
281
|
+
/>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return (
|
|
286
|
+
<button
|
|
287
|
+
onClick={item.onClick}
|
|
288
|
+
disabled={item.disabled}
|
|
289
|
+
className={[
|
|
290
|
+
// Base
|
|
291
|
+
'flex items-center gap-3 px-4 py-2 w-full',
|
|
292
|
+
'rounded-lg cursor-pointer',
|
|
293
|
+
'transition-colors duration-150',
|
|
294
|
+
|
|
295
|
+
// Colores y estados (Light Mode)
|
|
296
|
+
!item.disabled && 'text-content-primary',
|
|
297
|
+
!item.disabled && 'hover:bg-primary-custom-100',
|
|
298
|
+
|
|
299
|
+
// Dark Mode
|
|
300
|
+
!item.disabled && 'dark:text-content-primary',
|
|
301
|
+
!item.disabled && 'dark:hover:bg-dark-bg-custom',
|
|
302
|
+
|
|
303
|
+
// Focus ring
|
|
304
|
+
!item.disabled && 'focus:outline-none',
|
|
305
|
+
!item.disabled && 'focus:ring-2',
|
|
306
|
+
!item.disabled && 'focus:ring-offset-2',
|
|
307
|
+
!item.disabled && 'focus:ring-primary-custom-400',
|
|
308
|
+
!item.disabled && 'focus:ring-offset-bg-primary',
|
|
309
|
+
!item.disabled && 'dark:focus:ring-offset-dark-bg-primary',
|
|
310
|
+
|
|
311
|
+
// Disabled
|
|
312
|
+
item.disabled && 'opacity-50',
|
|
313
|
+
item.disabled && 'cursor-not-allowed',
|
|
314
|
+
|
|
315
|
+
item.className,
|
|
316
|
+
]
|
|
317
|
+
.filter(Boolean)
|
|
318
|
+
.join(' ')}
|
|
319
|
+
data-testid={`navigation-rail-item-${item.label}`}
|
|
320
|
+
aria-disabled={item.disabled}
|
|
321
|
+
>
|
|
322
|
+
{item.icon && (
|
|
323
|
+
<div className="flex items-center justify-center w-4 h-4 shrink-0 text-content-secondary dark:text-content-secondary">
|
|
324
|
+
{item.icon}
|
|
325
|
+
</div>
|
|
326
|
+
)}
|
|
327
|
+
<p className="font-['Inter:Regular',sans-serif] text-sm font-normal leading-5 not-italic relative shrink-0 text-left">
|
|
328
|
+
{item.label}
|
|
329
|
+
</p>
|
|
330
|
+
</button>
|
|
331
|
+
);
|
|
332
|
+
};
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { DropdownItemCollapsibleChildProps } from '../DropdownItemCollapsible/DropdownItemCollapsible.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Props de la sección de items dentro del NavigationRailPanel
|
|
6
|
+
*/
|
|
7
|
+
export interface NavigationRailPanelSectionProps {
|
|
8
|
+
/**
|
|
9
|
+
* Encabezado de la sección (label del heading)
|
|
10
|
+
* Ejemplo: "Categorías", "Departamentos", "Opciones"
|
|
11
|
+
*/
|
|
12
|
+
heading?: string;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Items que se muestran en la sección
|
|
16
|
+
* Pueden ser items simples o items colapsables
|
|
17
|
+
*/
|
|
18
|
+
items: NavigationRailPanelItemProps[];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Si mostrar divisor después de esta sección
|
|
22
|
+
* @default true
|
|
23
|
+
*/
|
|
24
|
+
showDivider?: boolean;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Clases CSS adicionales
|
|
28
|
+
*/
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Props de un item individual dentro del NavigationRailPanel
|
|
34
|
+
*/
|
|
35
|
+
export interface NavigationRailPanelItemProps {
|
|
36
|
+
/**
|
|
37
|
+
* Texto o contenido principal del item
|
|
38
|
+
* Ejemplo: "Users", "Settings", "Help"
|
|
39
|
+
*/
|
|
40
|
+
label: string;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Icono a mostrar antes del texto (izquierda)
|
|
44
|
+
* Recomendado: 16x16px
|
|
45
|
+
*/
|
|
46
|
+
icon?: ReactNode;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Si el item es colapsable (muestra items anidados)
|
|
50
|
+
* @default false
|
|
51
|
+
*/
|
|
52
|
+
isCollapsible?: boolean;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Items anidados que se muestran cuando el item está expandido
|
|
56
|
+
* Se usa solo cuando isCollapsible es true
|
|
57
|
+
*/
|
|
58
|
+
children?: DropdownItemCollapsibleChildProps[];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Si el item está expandido inicialmente (para items colapsables)
|
|
62
|
+
* @default false
|
|
63
|
+
*/
|
|
64
|
+
defaultOpen?: boolean;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Si el item está deshabilitado
|
|
68
|
+
* @default false
|
|
69
|
+
*/
|
|
70
|
+
disabled?: boolean;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Callback cuando se hace click en el item
|
|
74
|
+
*/
|
|
75
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => void;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Callback cuando el item colapsable se expande/contrae
|
|
79
|
+
* @param open - nuevo estado de expansión
|
|
80
|
+
*/
|
|
81
|
+
onOpenChange?: (open: boolean) => void;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Clases CSS adicionales
|
|
85
|
+
*/
|
|
86
|
+
className?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Props del componente NavigationRailPanel
|
|
91
|
+
*
|
|
92
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6134-34415
|
|
93
|
+
*/
|
|
94
|
+
export interface NavigationRailPanelProps {
|
|
95
|
+
/**
|
|
96
|
+
* Altura del panel en píxeles
|
|
97
|
+
* Se usa para el contenedor principal
|
|
98
|
+
* Ejemplo: 600, 800, 900
|
|
99
|
+
* @default 900
|
|
100
|
+
*/
|
|
101
|
+
height?: number | string;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Ancho del panel en píxeles
|
|
105
|
+
* Ancho estándar: 248px (con padding incluido)
|
|
106
|
+
* @default 248
|
|
107
|
+
*/
|
|
108
|
+
width?: number | string;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Encabezado del panel con icono, label, descripción y acción
|
|
112
|
+
* Ejemplo: { label: "Settings", description: "Configure your preferences" }
|
|
113
|
+
*/
|
|
114
|
+
heading?: {
|
|
115
|
+
label: string;
|
|
116
|
+
description?: string;
|
|
117
|
+
showDescription?: boolean;
|
|
118
|
+
iconName?: string;
|
|
119
|
+
actionLabel?: string;
|
|
120
|
+
showAction?: boolean;
|
|
121
|
+
onActionClick?: () => void;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Si mostrar el encabezado (DropdownItemHeading)
|
|
126
|
+
* @default true
|
|
127
|
+
*/
|
|
128
|
+
showHeading?: boolean;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Configuración del input de búsqueda
|
|
132
|
+
*/
|
|
133
|
+
search?: {
|
|
134
|
+
/**
|
|
135
|
+
* Placeholder del input
|
|
136
|
+
* @default "Buscar módulo"
|
|
137
|
+
*/
|
|
138
|
+
placeholder?: string;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Valor actual del input
|
|
142
|
+
*/
|
|
143
|
+
value?: string;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Callback cuando cambia el valor del input
|
|
147
|
+
*/
|
|
148
|
+
onChange?: (value: string) => void;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Si mostrar el input de búsqueda
|
|
153
|
+
* @default true
|
|
154
|
+
*/
|
|
155
|
+
showSearch?: boolean;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Secciones de items dentro del panel
|
|
159
|
+
* Cada sección puede tener un encabezado y múltiples items
|
|
160
|
+
*/
|
|
161
|
+
sections?: NavigationRailPanelSectionProps[];
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Alternativa a sections: items simples sin agrupar
|
|
165
|
+
* Se usan cuando no necesitas secciones
|
|
166
|
+
*/
|
|
167
|
+
items?: NavigationRailPanelItemProps[];
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Clases CSS adicionales para el contenedor principal
|
|
171
|
+
*/
|
|
172
|
+
className?: string;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Clases CSS adicionales para el panel interno
|
|
176
|
+
*/
|
|
177
|
+
panelClassName?: string;
|
|
178
|
+
}
|