siesa-ui-kit 1.0.2 → 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 +67 -2
- 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/icons.md +12 -31
- package/package.json +111 -110
- package/src/components/Avatar/Avatar.stories.tsx +494 -494
- package/src/components/Button/Button.stories.tsx +950 -950
- package/src/components/Button/Button.tsx +337 -337
- package/src/components/Button/Button.types.ts +180 -180
- package/src/components/Button/icons.tsx +23 -62
- package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
- package/src/components/Divider/Divider.stories.tsx +263 -263
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
- package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
- package/src/components/DropdownItemCollapsible/README.md +264 -264
- package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
- package/src/components/DropdownItemCollapsible/index.ts +12 -12
- package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
- package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
- package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
- package/src/components/DropdownItemHeading/README.md +573 -573
- package/src/components/DropdownItemHeading/icons.tsx +125 -125
- package/src/components/DropdownItemHeading/index.ts +3 -3
- package/src/components/Input/Input.stories.tsx +583 -583
- package/src/components/LoginView/LoginView.stories.tsx +148 -148
- package/src/components/LoginView/LoginView.tsx +426 -426
- package/src/components/LoginView/LoginView.types.ts +52 -52
- package/src/components/LoginView/README.md +396 -396
- package/src/components/LoginView/icons.tsx +85 -85
- package/src/components/LoginView/index.ts +3 -3
- package/src/components/Navbar/Navbar.stories.tsx +810 -810
- package/src/components/Navbar/Navbar.tsx +755 -755
- package/src/components/Navbar/Navbar.types.ts +219 -219
- package/src/components/Navbar/README.md +279 -279
- package/src/components/Navbar/index.ts +8 -8
- 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 -667
- package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
- package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
- package/src/components/NavigationRailItem/README.md +476 -476
- package/src/components/NavigationRailItem/index.ts +2 -2
- package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
- package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
- package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
- package/src/components/NavigationRailPanel/README.md +461 -461
- package/src/components/NavigationRailPanel/index.ts +6 -6
- package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
- package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
- package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
- package/src/components/NavigationRailTypes/README.md +573 -573
- package/src/components/NavigationRailTypes/icons.tsx +76 -141
- package/src/components/NavigationRailTypes/index.ts +7 -7
- package/src/components/Notification/Notification.stories.tsx +513 -513
- package/src/components/Notification/Notification.tsx +145 -145
- package/src/components/Notification/Notification.types.ts +142 -142
- package/src/components/Notification/README.md +409 -409
- package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
- package/src/components/POSConvention/POSConvention.tsx +129 -129
- package/src/components/POSConvention/POSConvention.types.ts +38 -38
- package/src/components/POSConvention/README.md +123 -123
- package/src/components/POSConvention/icons.tsx +45 -45
- package/src/components/POSConvention/index.ts +3 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
- package/src/components/POSLocationButton/README.md +253 -253
- package/src/components/POSLocationButton/icons.tsx +120 -120
- package/src/components/POSLocationButton/index.ts +14 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
- package/src/components/POSNumberButton/README.md +321 -321
- package/src/components/POSNumberButton/index.ts +3 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
- package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
- package/src/components/POSProductCard/POSProductCard.tsx +208 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
- package/src/components/POSProductCard/README.md +179 -179
- package/src/components/POSProductCard/icons.tsx +26 -26
- package/src/components/POSProductCard/index.ts +2 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
- package/src/components/POSProductSidebarItems/README.md +198 -198
- package/src/components/POSProductSidebarItems/icons.tsx +21 -21
- package/src/components/POSProductSidebarItems/index.ts +3 -3
- package/src/components/POSTable/POSTable.stories.tsx +737 -737
- package/src/components/POSTable/POSTable.tsx +401 -401
- package/src/components/POSTable/README.md +286 -286
- package/src/components/Quantity/Quantity.stories.tsx +457 -457
- package/src/components/Radio/Radio.stories.tsx +523 -523
- package/src/components/Radio/Radio.tsx +1 -1
- package/src/components/Select/Select.stories.tsx +32 -0
- package/src/components/Select/Select.tsx +457 -454
- package/src/components/Select/icons.tsx +16 -41
- package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
- package/src/components/SignUpView/SignUpView.tsx +503 -503
- package/src/components/SignUpView/SignUpView.types.ts +58 -58
- package/src/components/SignUpView/icons.tsx +71 -71
- package/src/components/SignUpView/index.ts +3 -3
- package/src/components/Switch/README.md +112 -112
- package/src/components/Switch/Switch.stories.tsx +550 -550
- package/src/components/Switch/Switch.tsx +246 -246
- package/src/components/Switch/Switch.types.ts +67 -67
- package/src/components/Table/Table.stories.tsx +805 -805
- package/src/components/Tabs/README.md +201 -201
- package/src/components/Tabs/Tabs.stories.tsx +580 -580
- package/src/components/Tabs/Tabs.tsx +356 -356
- package/src/components/Tabs/Tabs.types.ts +127 -127
- package/src/components/Tabs/icons.tsx +129 -129
- package/src/components/Tabs/index.ts +11 -11
- package/src/components/Textarea/Textarea.stories.tsx +535 -535
- package/src/index.ts +133 -102
- 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 -329
- package/src/views/ListView/ListView.tsx +570 -570
- package/src/views/ListView/ListView.types.ts +211 -211
- package/src/views/ListView/icons.tsx +282 -282
- package/src/views/ListView/index.ts +11 -11
- package/src/views/LoginView/LoginView.tsx +426 -426
- package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
- package/src/views/ProductsView/ProductsView.tsx +480 -480
- package/src/views/ProductsView/ProductsView.types.ts +238 -238
- package/src/views/ProductsView/README.md +312 -312
- package/src/views/ProductsView/icons.tsx +38 -38
- package/src/views/ProductsView/index.ts +8 -8
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
- package/src/views/SignUpView/SignUpView.tsx +503 -503
- package/src/views/TableLayoutView/README.md +268 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
- package/src/views/TableLayoutView/icons.tsx +113 -113
- package/src/views/TableLayoutView/index.ts +6 -6
- package/storybook/main.ts +19 -19
- package/storybook/preview.tsx +84 -84
- package/storybook/vitest.setup.ts +6 -6
- package/tailwind.config.js +128 -128
|
@@ -1,264 +1,264 @@
|
|
|
1
|
-
# DropdownItemCollapsible
|
|
2
|
-
|
|
3
|
-
Item colapsable para uso dentro de Dropdowns que permite agrupar items relacionados en secciones expandibles.
|
|
4
|
-
|
|
5
|
-
## 🎯 Propósito
|
|
6
|
-
|
|
7
|
-
El componente `DropdownItemCollapsible` es un item especializado de dropdown que:
|
|
8
|
-
|
|
9
|
-
- Agrupa items relacionados en secciones expandibles
|
|
10
|
-
- Muestra/oculta items anidados con animación suave
|
|
11
|
-
- Mantiene jerarquía visual clara con indentación
|
|
12
|
-
- Soporta iconos personalizables
|
|
13
|
-
- Proporciona feedback visual completo (hover, focus, active, disabled)
|
|
14
|
-
- Implementa dark mode completo
|
|
15
|
-
|
|
16
|
-
## 📋 Uso
|
|
17
|
-
|
|
18
|
-
### Básico
|
|
19
|
-
|
|
20
|
-
```tsx
|
|
21
|
-
import { DropdownItemCollapsible } from '@/components/DropdownItemCollapsible';
|
|
22
|
-
import { UserIcon } from '@/components/DropdownItemCollapsible/icons';
|
|
23
|
-
|
|
24
|
-
<DropdownItemCollapsible
|
|
25
|
-
label="Users"
|
|
26
|
-
icon={<UserIcon />}
|
|
27
|
-
children={[
|
|
28
|
-
{ label: 'Active Users' },
|
|
29
|
-
{ label: 'Inactive Users' },
|
|
30
|
-
]}
|
|
31
|
-
/>
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### Con Encabezado de Sección
|
|
35
|
-
|
|
36
|
-
```tsx
|
|
37
|
-
<DropdownItemCollapsible
|
|
38
|
-
label="Customers"
|
|
39
|
-
icon={<CustomerIcon />}
|
|
40
|
-
showHeading={true}
|
|
41
|
-
headingLabel="SECTION 1"
|
|
42
|
-
children={[
|
|
43
|
-
{ label: 'Enterprise' },
|
|
44
|
-
{ label: 'SMB' },
|
|
45
|
-
{ label: 'Startup' },
|
|
46
|
-
]}
|
|
47
|
-
showDivider={true}
|
|
48
|
-
/>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Expandido por Defecto
|
|
52
|
-
|
|
53
|
-
```tsx
|
|
54
|
-
<DropdownItemCollapsible
|
|
55
|
-
label="Departments"
|
|
56
|
-
icon={<DepartmentIcon />}
|
|
57
|
-
defaultOpen={true}
|
|
58
|
-
children={[
|
|
59
|
-
{ label: 'Sales' },
|
|
60
|
-
{ label: 'Marketing' },
|
|
61
|
-
{ label: 'Engineering' },
|
|
62
|
-
]}
|
|
63
|
-
/>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Item Simple (No Colapsable)
|
|
67
|
-
|
|
68
|
-
```tsx
|
|
69
|
-
<DropdownItemCollapsible
|
|
70
|
-
label="Settings"
|
|
71
|
-
icon={<SettingsIcon />}
|
|
72
|
-
isCollapsible={false}
|
|
73
|
-
onClick={() => console.log('Settings clicked')}
|
|
74
|
-
/>
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Con Callbacks
|
|
78
|
-
|
|
79
|
-
```tsx
|
|
80
|
-
<DropdownItemCollapsible
|
|
81
|
-
label="Actions"
|
|
82
|
-
children={[
|
|
83
|
-
{
|
|
84
|
-
label: 'Edit',
|
|
85
|
-
onClick: (e) => console.log('Edit clicked'),
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
label: 'Delete',
|
|
89
|
-
onClick: (e) => console.log('Delete clicked'),
|
|
90
|
-
},
|
|
91
|
-
]}
|
|
92
|
-
onOpenChange={(open) => console.log('Toggle:', open)}
|
|
93
|
-
/>
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## 🎨 Props
|
|
97
|
-
|
|
98
|
-
### Interfaz `DropdownItemCollapsibleProps`
|
|
99
|
-
|
|
100
|
-
| Prop | Tipo | Defecto | Descripción |
|
|
101
|
-
|------|------|---------|-------------|
|
|
102
|
-
| `label` | `string` | **Requerido** | Texto principal del item |
|
|
103
|
-
| `icon` | `ReactNode` | `undefined` | Icono a mostrar antes del texto (16x16px recomendado) |
|
|
104
|
-
| `children` | `DropdownItemCollapsibleChildProps[]` | `[]` | Items anidados cuando está expandido |
|
|
105
|
-
| `defaultOpen` | `boolean` | `false` | Si el item está expandido inicialmente |
|
|
106
|
-
| `disabled` | `boolean` | `false` | Si el item está deshabilitado |
|
|
107
|
-
| `onOpenChange` | `(open: boolean) => void` | `undefined` | Callback cuando se expande/contrae |
|
|
108
|
-
| `onClick` | `(e: React.MouseEvent) => void` | `undefined` | Callback cuando se hace click (para items no colapsables) |
|
|
109
|
-
| `isCollapsible` | `boolean` | `true si children.length > 0` | Si el item puede expanderse/contraerse |
|
|
110
|
-
| `showHeading` | `boolean` | `false` | Si mostrar encabezado de sección |
|
|
111
|
-
| `headingLabel` | `string` | `undefined` | Texto del encabezado (se usa si showHeading es true) |
|
|
112
|
-
| `showDivider` | `boolean` | `true` | Si mostrar divisor después del item |
|
|
113
|
-
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
114
|
-
|
|
115
|
-
### Interfaz `DropdownItemCollapsibleChildProps`
|
|
116
|
-
|
|
117
|
-
| Prop | Tipo | Defecto | Descripción |
|
|
118
|
-
|------|------|---------|-------------|
|
|
119
|
-
| `label` | `string` | **Requerido** | Texto del item anidado |
|
|
120
|
-
| `icon` | `ReactNode` | `undefined` | Icono opcional (16x16px recomendado) |
|
|
121
|
-
| `disabled` | `boolean` | `false` | Si el item está deshabilitado |
|
|
122
|
-
| `onClick` | `(e: React.MouseEvent) => void` | `undefined` | Callback cuando se hace click |
|
|
123
|
-
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
124
|
-
|
|
125
|
-
## 🎯 Estados
|
|
126
|
-
|
|
127
|
-
### Visual States
|
|
128
|
-
|
|
129
|
-
- **Default**: Colores base del sistema
|
|
130
|
-
- **Hover**: Fondo `background-custom-primary`, texto `content-custom-primary`
|
|
131
|
-
- **Focus**: Ring de 2px con offset (adaptive dark mode)
|
|
132
|
-
- **Active**: Animación scale-95 para feedback táctil
|
|
133
|
-
- **Disabled**: Opacidad 50%, sin interacción
|
|
134
|
-
|
|
135
|
-
### Colapsable States
|
|
136
|
-
|
|
137
|
-
- **Collapsed**: Solo muestra header, chevron apunta down
|
|
138
|
-
- **Expanded**: Muestra header + lista de items anidados
|
|
139
|
-
- **Chevron Animation**: Rotación suave de 180° al expandir/contraer
|
|
140
|
-
|
|
141
|
-
## 🌓 Dark Mode
|
|
142
|
-
|
|
143
|
-
El componente soporta dark mode completo:
|
|
144
|
-
|
|
145
|
-
| Elemento | Light | Dark |
|
|
146
|
-
|----------|-------|------|
|
|
147
|
-
| Header text | `content-primary` | `content-primary/dark` |
|
|
148
|
-
| Header icon | `content-secondary` | `content-secondary/dark` |
|
|
149
|
-
| Header hover | `bg-background-custom-primary` | `bg-background-custom-primary/dark` |
|
|
150
|
-
| Item text | `content-primary` | `content-primary/dark` |
|
|
151
|
-
| Divider | `border-border-primary` | `border-border-primary/dark` |
|
|
152
|
-
| Heading | `content-tertiary` | `content-tertiary/dark` |
|
|
153
|
-
| Focus ring offset | `background-primary` | `background-primary/dark` |
|
|
154
|
-
|
|
155
|
-
## 📐 Espaciado
|
|
156
|
-
|
|
157
|
-
Basado en especificaciones de Figma:
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
┌─────────────────────────────────────┐
|
|
161
|
-
│ Section Heading (pt-3 pb-1) │
|
|
162
|
-
├─────────────────────────────────────┤
|
|
163
|
-
│ ┌───────────────────────────────┐ │
|
|
164
|
-
│ │ 🎯 Header (px-4 py-2) │ │ gap-3
|
|
165
|
-
│ └───────────────────────────────┘ │
|
|
166
|
-
├─────────────────────────────────────┤
|
|
167
|
-
│ ┌───────────────────────────────┐ │
|
|
168
|
-
│ │ ├─ Item 1 (pl-6 pr-4 py-2) │ │ gap-0.5
|
|
169
|
-
│ │ ├─ Item 2 │ │
|
|
170
|
-
│ │ └─ Item 3 │ │
|
|
171
|
-
│ └───────────────────────────────┘ │
|
|
172
|
-
├─────────────────────────────────────┤
|
|
173
|
-
│ Divider (h-px, color: border-primary)│
|
|
174
|
-
└─────────────────────────────────────┘
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
## 🔧 Personalización
|
|
178
|
-
|
|
179
|
-
### Con Tailwind CSS
|
|
180
|
-
|
|
181
|
-
```tsx
|
|
182
|
-
<DropdownItemCollapsible
|
|
183
|
-
label="Custom Styled"
|
|
184
|
-
className="my-custom-class"
|
|
185
|
-
children={[
|
|
186
|
-
{
|
|
187
|
-
label: "Item",
|
|
188
|
-
className: "custom-child-class"
|
|
189
|
-
}
|
|
190
|
-
]}
|
|
191
|
-
/>
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Iconos Personalizados
|
|
195
|
-
|
|
196
|
-
```tsx
|
|
197
|
-
import { MyCustomIcon } from '@/icons';
|
|
198
|
-
|
|
199
|
-
<DropdownItemCollapsible
|
|
200
|
-
label="Custom Icon"
|
|
201
|
-
icon={<MyCustomIcon className="w-4 h-4" />}
|
|
202
|
-
children={[
|
|
203
|
-
{
|
|
204
|
-
label: "Child",
|
|
205
|
-
icon={<AnotherIcon className="w-4 h-4" />}
|
|
206
|
-
}
|
|
207
|
-
]}
|
|
208
|
-
/>
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
## 🎬 Transiciones
|
|
212
|
-
|
|
213
|
-
- **Chevron rotation**: 200ms ease-in-out
|
|
214
|
-
- **Color hover**: 150ms ease-in-out
|
|
215
|
-
- **Scale active**: Inmediato
|
|
216
|
-
|
|
217
|
-
## ♿ Accesibilidad
|
|
218
|
-
|
|
219
|
-
- `aria-expanded`: Indica si el item está expandido
|
|
220
|
-
- `aria-disabled`: Indica si el item está deshabilitado
|
|
221
|
-
- Soporte completo para navegación por teclado
|
|
222
|
-
- Focus rings visibles y adaptativos
|
|
223
|
-
- Colores con suficiente contraste (WCAG AA)
|
|
224
|
-
|
|
225
|
-
## 📚 Integración con Dropdown
|
|
226
|
-
|
|
227
|
-
Se diseñó para integrar perfectamente dentro del componente Dropdown:
|
|
228
|
-
|
|
229
|
-
```tsx
|
|
230
|
-
<Dropdown
|
|
231
|
-
items={[
|
|
232
|
-
{
|
|
233
|
-
children: (
|
|
234
|
-
<DropdownItemCollapsible
|
|
235
|
-
label="Users"
|
|
236
|
-
children={[...]}
|
|
237
|
-
/>
|
|
238
|
-
)
|
|
239
|
-
}
|
|
240
|
-
]}
|
|
241
|
-
/>
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
## 🔗 Referencias
|
|
245
|
-
|
|
246
|
-
- **Figma**: [node-id=6135-34374](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374)
|
|
247
|
-
- **Colors**: [docs/colors.md](../../docs/colors.md)
|
|
248
|
-
- **Typography**: [docs/typography.md](../../docs/typography.md)
|
|
249
|
-
- **Spacing**: [docs/spacing.md](../../docs/spacing.md)
|
|
250
|
-
- **Shadows**: [docs/shadows.md](../../docs/shadows.md)
|
|
251
|
-
|
|
252
|
-
## 📝 Historial de Cambios
|
|
253
|
-
|
|
254
|
-
### v1.0.0 (2025-12-23)
|
|
255
|
-
|
|
256
|
-
- ✅ Componente inicial creado
|
|
257
|
-
- ✅ Soporte completo para expandir/contraer
|
|
258
|
-
- ✅ Dark mode completo
|
|
259
|
-
- ✅ States: hover, focus, active, disabled
|
|
260
|
-
- ✅ Iconos personalizables
|
|
261
|
-
- ✅ Items anidados con indentación
|
|
262
|
-
- ✅ Animaciones suaves
|
|
263
|
-
- ✅ Stories Storybook completas
|
|
264
|
-
- ✅ Accesibilidad (ARIA labels)
|
|
1
|
+
# DropdownItemCollapsible
|
|
2
|
+
|
|
3
|
+
Item colapsable para uso dentro de Dropdowns que permite agrupar items relacionados en secciones expandibles.
|
|
4
|
+
|
|
5
|
+
## 🎯 Propósito
|
|
6
|
+
|
|
7
|
+
El componente `DropdownItemCollapsible` es un item especializado de dropdown que:
|
|
8
|
+
|
|
9
|
+
- Agrupa items relacionados en secciones expandibles
|
|
10
|
+
- Muestra/oculta items anidados con animación suave
|
|
11
|
+
- Mantiene jerarquía visual clara con indentación
|
|
12
|
+
- Soporta iconos personalizables
|
|
13
|
+
- Proporciona feedback visual completo (hover, focus, active, disabled)
|
|
14
|
+
- Implementa dark mode completo
|
|
15
|
+
|
|
16
|
+
## 📋 Uso
|
|
17
|
+
|
|
18
|
+
### Básico
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { DropdownItemCollapsible } from '@/components/DropdownItemCollapsible';
|
|
22
|
+
import { UserIcon } from '@/components/DropdownItemCollapsible/icons';
|
|
23
|
+
|
|
24
|
+
<DropdownItemCollapsible
|
|
25
|
+
label="Users"
|
|
26
|
+
icon={<UserIcon />}
|
|
27
|
+
children={[
|
|
28
|
+
{ label: 'Active Users' },
|
|
29
|
+
{ label: 'Inactive Users' },
|
|
30
|
+
]}
|
|
31
|
+
/>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Con Encabezado de Sección
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
<DropdownItemCollapsible
|
|
38
|
+
label="Customers"
|
|
39
|
+
icon={<CustomerIcon />}
|
|
40
|
+
showHeading={true}
|
|
41
|
+
headingLabel="SECTION 1"
|
|
42
|
+
children={[
|
|
43
|
+
{ label: 'Enterprise' },
|
|
44
|
+
{ label: 'SMB' },
|
|
45
|
+
{ label: 'Startup' },
|
|
46
|
+
]}
|
|
47
|
+
showDivider={true}
|
|
48
|
+
/>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Expandido por Defecto
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<DropdownItemCollapsible
|
|
55
|
+
label="Departments"
|
|
56
|
+
icon={<DepartmentIcon />}
|
|
57
|
+
defaultOpen={true}
|
|
58
|
+
children={[
|
|
59
|
+
{ label: 'Sales' },
|
|
60
|
+
{ label: 'Marketing' },
|
|
61
|
+
{ label: 'Engineering' },
|
|
62
|
+
]}
|
|
63
|
+
/>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Item Simple (No Colapsable)
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
<DropdownItemCollapsible
|
|
70
|
+
label="Settings"
|
|
71
|
+
icon={<SettingsIcon />}
|
|
72
|
+
isCollapsible={false}
|
|
73
|
+
onClick={() => console.log('Settings clicked')}
|
|
74
|
+
/>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Con Callbacks
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
<DropdownItemCollapsible
|
|
81
|
+
label="Actions"
|
|
82
|
+
children={[
|
|
83
|
+
{
|
|
84
|
+
label: 'Edit',
|
|
85
|
+
onClick: (e) => console.log('Edit clicked'),
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
label: 'Delete',
|
|
89
|
+
onClick: (e) => console.log('Delete clicked'),
|
|
90
|
+
},
|
|
91
|
+
]}
|
|
92
|
+
onOpenChange={(open) => console.log('Toggle:', open)}
|
|
93
|
+
/>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 🎨 Props
|
|
97
|
+
|
|
98
|
+
### Interfaz `DropdownItemCollapsibleProps`
|
|
99
|
+
|
|
100
|
+
| Prop | Tipo | Defecto | Descripción |
|
|
101
|
+
|------|------|---------|-------------|
|
|
102
|
+
| `label` | `string` | **Requerido** | Texto principal del item |
|
|
103
|
+
| `icon` | `ReactNode` | `undefined` | Icono a mostrar antes del texto (16x16px recomendado) |
|
|
104
|
+
| `children` | `DropdownItemCollapsibleChildProps[]` | `[]` | Items anidados cuando está expandido |
|
|
105
|
+
| `defaultOpen` | `boolean` | `false` | Si el item está expandido inicialmente |
|
|
106
|
+
| `disabled` | `boolean` | `false` | Si el item está deshabilitado |
|
|
107
|
+
| `onOpenChange` | `(open: boolean) => void` | `undefined` | Callback cuando se expande/contrae |
|
|
108
|
+
| `onClick` | `(e: React.MouseEvent) => void` | `undefined` | Callback cuando se hace click (para items no colapsables) |
|
|
109
|
+
| `isCollapsible` | `boolean` | `true si children.length > 0` | Si el item puede expanderse/contraerse |
|
|
110
|
+
| `showHeading` | `boolean` | `false` | Si mostrar encabezado de sección |
|
|
111
|
+
| `headingLabel` | `string` | `undefined` | Texto del encabezado (se usa si showHeading es true) |
|
|
112
|
+
| `showDivider` | `boolean` | `true` | Si mostrar divisor después del item |
|
|
113
|
+
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
114
|
+
|
|
115
|
+
### Interfaz `DropdownItemCollapsibleChildProps`
|
|
116
|
+
|
|
117
|
+
| Prop | Tipo | Defecto | Descripción |
|
|
118
|
+
|------|------|---------|-------------|
|
|
119
|
+
| `label` | `string` | **Requerido** | Texto del item anidado |
|
|
120
|
+
| `icon` | `ReactNode` | `undefined` | Icono opcional (16x16px recomendado) |
|
|
121
|
+
| `disabled` | `boolean` | `false` | Si el item está deshabilitado |
|
|
122
|
+
| `onClick` | `(e: React.MouseEvent) => void` | `undefined` | Callback cuando se hace click |
|
|
123
|
+
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
124
|
+
|
|
125
|
+
## 🎯 Estados
|
|
126
|
+
|
|
127
|
+
### Visual States
|
|
128
|
+
|
|
129
|
+
- **Default**: Colores base del sistema
|
|
130
|
+
- **Hover**: Fondo `background-custom-primary`, texto `content-custom-primary`
|
|
131
|
+
- **Focus**: Ring de 2px con offset (adaptive dark mode)
|
|
132
|
+
- **Active**: Animación scale-95 para feedback táctil
|
|
133
|
+
- **Disabled**: Opacidad 50%, sin interacción
|
|
134
|
+
|
|
135
|
+
### Colapsable States
|
|
136
|
+
|
|
137
|
+
- **Collapsed**: Solo muestra header, chevron apunta down
|
|
138
|
+
- **Expanded**: Muestra header + lista de items anidados
|
|
139
|
+
- **Chevron Animation**: Rotación suave de 180° al expandir/contraer
|
|
140
|
+
|
|
141
|
+
## 🌓 Dark Mode
|
|
142
|
+
|
|
143
|
+
El componente soporta dark mode completo:
|
|
144
|
+
|
|
145
|
+
| Elemento | Light | Dark |
|
|
146
|
+
|----------|-------|------|
|
|
147
|
+
| Header text | `content-primary` | `content-primary/dark` |
|
|
148
|
+
| Header icon | `content-secondary` | `content-secondary/dark` |
|
|
149
|
+
| Header hover | `bg-background-custom-primary` | `bg-background-custom-primary/dark` |
|
|
150
|
+
| Item text | `content-primary` | `content-primary/dark` |
|
|
151
|
+
| Divider | `border-border-primary` | `border-border-primary/dark` |
|
|
152
|
+
| Heading | `content-tertiary` | `content-tertiary/dark` |
|
|
153
|
+
| Focus ring offset | `background-primary` | `background-primary/dark` |
|
|
154
|
+
|
|
155
|
+
## 📐 Espaciado
|
|
156
|
+
|
|
157
|
+
Basado en especificaciones de Figma:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
┌─────────────────────────────────────┐
|
|
161
|
+
│ Section Heading (pt-3 pb-1) │
|
|
162
|
+
├─────────────────────────────────────┤
|
|
163
|
+
│ ┌───────────────────────────────┐ │
|
|
164
|
+
│ │ 🎯 Header (px-4 py-2) │ │ gap-3
|
|
165
|
+
│ └───────────────────────────────┘ │
|
|
166
|
+
├─────────────────────────────────────┤
|
|
167
|
+
│ ┌───────────────────────────────┐ │
|
|
168
|
+
│ │ ├─ Item 1 (pl-6 pr-4 py-2) │ │ gap-0.5
|
|
169
|
+
│ │ ├─ Item 2 │ │
|
|
170
|
+
│ │ └─ Item 3 │ │
|
|
171
|
+
│ └───────────────────────────────┘ │
|
|
172
|
+
├─────────────────────────────────────┤
|
|
173
|
+
│ Divider (h-px, color: border-primary)│
|
|
174
|
+
└─────────────────────────────────────┘
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## 🔧 Personalización
|
|
178
|
+
|
|
179
|
+
### Con Tailwind CSS
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
<DropdownItemCollapsible
|
|
183
|
+
label="Custom Styled"
|
|
184
|
+
className="my-custom-class"
|
|
185
|
+
children={[
|
|
186
|
+
{
|
|
187
|
+
label: "Item",
|
|
188
|
+
className: "custom-child-class"
|
|
189
|
+
}
|
|
190
|
+
]}
|
|
191
|
+
/>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Iconos Personalizados
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { MyCustomIcon } from '@/icons';
|
|
198
|
+
|
|
199
|
+
<DropdownItemCollapsible
|
|
200
|
+
label="Custom Icon"
|
|
201
|
+
icon={<MyCustomIcon className="w-4 h-4" />}
|
|
202
|
+
children={[
|
|
203
|
+
{
|
|
204
|
+
label: "Child",
|
|
205
|
+
icon={<AnotherIcon className="w-4 h-4" />}
|
|
206
|
+
}
|
|
207
|
+
]}
|
|
208
|
+
/>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## 🎬 Transiciones
|
|
212
|
+
|
|
213
|
+
- **Chevron rotation**: 200ms ease-in-out
|
|
214
|
+
- **Color hover**: 150ms ease-in-out
|
|
215
|
+
- **Scale active**: Inmediato
|
|
216
|
+
|
|
217
|
+
## ♿ Accesibilidad
|
|
218
|
+
|
|
219
|
+
- `aria-expanded`: Indica si el item está expandido
|
|
220
|
+
- `aria-disabled`: Indica si el item está deshabilitado
|
|
221
|
+
- Soporte completo para navegación por teclado
|
|
222
|
+
- Focus rings visibles y adaptativos
|
|
223
|
+
- Colores con suficiente contraste (WCAG AA)
|
|
224
|
+
|
|
225
|
+
## 📚 Integración con Dropdown
|
|
226
|
+
|
|
227
|
+
Se diseñó para integrar perfectamente dentro del componente Dropdown:
|
|
228
|
+
|
|
229
|
+
```tsx
|
|
230
|
+
<Dropdown
|
|
231
|
+
items={[
|
|
232
|
+
{
|
|
233
|
+
children: (
|
|
234
|
+
<DropdownItemCollapsible
|
|
235
|
+
label="Users"
|
|
236
|
+
children={[...]}
|
|
237
|
+
/>
|
|
238
|
+
)
|
|
239
|
+
}
|
|
240
|
+
]}
|
|
241
|
+
/>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 🔗 Referencias
|
|
245
|
+
|
|
246
|
+
- **Figma**: [node-id=6135-34374](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374)
|
|
247
|
+
- **Colors**: [docs/colors.md](../../docs/colors.md)
|
|
248
|
+
- **Typography**: [docs/typography.md](../../docs/typography.md)
|
|
249
|
+
- **Spacing**: [docs/spacing.md](../../docs/spacing.md)
|
|
250
|
+
- **Shadows**: [docs/shadows.md](../../docs/shadows.md)
|
|
251
|
+
|
|
252
|
+
## 📝 Historial de Cambios
|
|
253
|
+
|
|
254
|
+
### v1.0.0 (2025-12-23)
|
|
255
|
+
|
|
256
|
+
- ✅ Componente inicial creado
|
|
257
|
+
- ✅ Soporte completo para expandir/contraer
|
|
258
|
+
- ✅ Dark mode completo
|
|
259
|
+
- ✅ States: hover, focus, active, disabled
|
|
260
|
+
- ✅ Iconos personalizables
|
|
261
|
+
- ✅ Items anidados con indentación
|
|
262
|
+
- ✅ Animaciones suaves
|
|
263
|
+
- ✅ Stories Storybook completas
|
|
264
|
+
- ✅ Accesibilidad (ARIA labels)
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Icono ChevronDown para el toggle del colapsable
|
|
5
|
-
* Diseño basado en heroicons-micro/chevron-down
|
|
6
|
-
* Tamaño: 16x16px
|
|
7
|
-
*
|
|
8
|
-
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374
|
|
9
|
-
*/
|
|
10
|
-
export const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
11
|
-
<svg
|
|
12
|
-
width="16"
|
|
13
|
-
height="16"
|
|
14
|
-
viewBox="0 0 16 16"
|
|
15
|
-
fill="none"
|
|
16
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
17
|
-
className={className}
|
|
18
|
-
>
|
|
19
|
-
<path
|
|
20
|
-
d="M4 6L8 10L12 6"
|
|
21
|
-
stroke="currentColor"
|
|
22
|
-
strokeWidth="1.5"
|
|
23
|
-
strokeLinecap="round"
|
|
24
|
-
strokeLinejoin="round"
|
|
25
|
-
/>
|
|
26
|
-
</svg>
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Icono de usuario placeholder para ejemplos en stories
|
|
31
|
-
* Tamaño: 16x16px
|
|
32
|
-
*/
|
|
33
|
-
export const UserIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
34
|
-
<svg
|
|
35
|
-
width="16"
|
|
36
|
-
height="16"
|
|
37
|
-
viewBox="0 0 16 16"
|
|
38
|
-
fill="none"
|
|
39
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
-
className={className}
|
|
41
|
-
>
|
|
42
|
-
<path
|
|
43
|
-
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"
|
|
44
|
-
stroke="currentColor"
|
|
45
|
-
strokeWidth="1.5"
|
|
46
|
-
strokeLinecap="round"
|
|
47
|
-
strokeLinejoin="round"
|
|
48
|
-
/>
|
|
49
|
-
<path
|
|
50
|
-
d="M4.5 13C4.5 11.3431 6.13401 10 8 10C9.86599 10 11.5 11.3431 11.5 13"
|
|
51
|
-
stroke="currentColor"
|
|
52
|
-
strokeWidth="1.5"
|
|
53
|
-
strokeLinecap="round"
|
|
54
|
-
strokeLinejoin="round"
|
|
55
|
-
/>
|
|
56
|
-
</svg>
|
|
57
|
-
);
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Icono ChevronDown para el toggle del colapsable
|
|
5
|
+
* Diseño basado en heroicons-micro/chevron-down
|
|
6
|
+
* Tamaño: 16x16px
|
|
7
|
+
*
|
|
8
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374
|
|
9
|
+
*/
|
|
10
|
+
export const ChevronDownIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
11
|
+
<svg
|
|
12
|
+
width="16"
|
|
13
|
+
height="16"
|
|
14
|
+
viewBox="0 0 16 16"
|
|
15
|
+
fill="none"
|
|
16
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
17
|
+
className={className}
|
|
18
|
+
>
|
|
19
|
+
<path
|
|
20
|
+
d="M4 6L8 10L12 6"
|
|
21
|
+
stroke="currentColor"
|
|
22
|
+
strokeWidth="1.5"
|
|
23
|
+
strokeLinecap="round"
|
|
24
|
+
strokeLinejoin="round"
|
|
25
|
+
/>
|
|
26
|
+
</svg>
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Icono de usuario placeholder para ejemplos en stories
|
|
31
|
+
* Tamaño: 16x16px
|
|
32
|
+
*/
|
|
33
|
+
export const UserIcon: React.FC<{ className?: string }> = ({ className = '' }) => (
|
|
34
|
+
<svg
|
|
35
|
+
width="16"
|
|
36
|
+
height="16"
|
|
37
|
+
viewBox="0 0 16 16"
|
|
38
|
+
fill="none"
|
|
39
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
+
className={className}
|
|
41
|
+
>
|
|
42
|
+
<path
|
|
43
|
+
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"
|
|
44
|
+
stroke="currentColor"
|
|
45
|
+
strokeWidth="1.5"
|
|
46
|
+
strokeLinecap="round"
|
|
47
|
+
strokeLinejoin="round"
|
|
48
|
+
/>
|
|
49
|
+
<path
|
|
50
|
+
d="M4.5 13C4.5 11.3431 6.13401 10 8 10C9.86599 10 11.5 11.3431 11.5 13"
|
|
51
|
+
stroke="currentColor"
|
|
52
|
+
strokeWidth="1.5"
|
|
53
|
+
strokeLinecap="round"
|
|
54
|
+
strokeLinejoin="round"
|
|
55
|
+
/>
|
|
56
|
+
</svg>
|
|
57
|
+
);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Exportaciones del componente DropdownItemCollapsible
|
|
3
|
-
*
|
|
4
|
-
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export { DropdownItemCollapsible } from './DropdownItemCollapsible';
|
|
8
|
-
export type {
|
|
9
|
-
DropdownItemCollapsibleProps,
|
|
10
|
-
DropdownItemCollapsibleChildProps,
|
|
11
|
-
} from './DropdownItemCollapsible.types';
|
|
12
|
-
export { ChevronDownIcon, UserIcon } from './icons';
|
|
1
|
+
/**
|
|
2
|
+
* Exportaciones del componente DropdownItemCollapsible
|
|
3
|
+
*
|
|
4
|
+
* @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-34374
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { DropdownItemCollapsible } from './DropdownItemCollapsible';
|
|
8
|
+
export type {
|
|
9
|
+
DropdownItemCollapsibleProps,
|
|
10
|
+
DropdownItemCollapsibleChildProps,
|
|
11
|
+
} from './DropdownItemCollapsible.types';
|
|
12
|
+
export { ChevronDownIcon, UserIcon } from './icons';
|