siesa-ui-kit 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1479 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1479 -0
- package/dist/index.js.map +1 -0
- package/package.json +23 -14
- package/claude/agents/siesa-ui-kit-specialist.md +0 -2401
- package/claude/prompts/component-template.md +0 -121
- package/claude/settings.local.json +0 -61
- package/docs/border-radius.md +0 -1261
- package/docs/colors.md +0 -832
- package/docs/dark-mode-guide.md +0 -1426
- package/docs/filters.md +0 -1243
- package/docs/icons.md +0 -1283
- package/docs/shadows.md +0 -1377
- package/docs/spacing.md +0 -1684
- package/docs/typography.md +0 -1268
- package/postcss.config.cjs +0 -6
- package/src/App.css +0 -42
- package/src/App.tsx +0 -8
- package/src/ButtonTest.tsx +0 -147
- package/src/assets/fonts/README.md +0 -261
- package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
- package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
- package/src/assets/react.svg +0 -1
- package/src/components/Alert/Alert.stories.tsx +0 -332
- package/src/components/Alert/Alert.tsx +0 -106
- package/src/components/Alert/Alert.types.ts +0 -54
- package/src/components/Avatar/Avatar.stories.tsx +0 -494
- package/src/components/Avatar/Avatar.tsx +0 -143
- package/src/components/Avatar/Avatar.types.ts +0 -53
- package/src/components/Badge/Badge.stories.tsx +0 -339
- package/src/components/Badge/Badge.tsx +0 -278
- package/src/components/Badge/Badge.types.ts +0 -58
- package/src/components/Button/Button.stories.tsx +0 -950
- package/src/components/Button/Button.tsx +0 -337
- package/src/components/Button/Button.types.ts +0 -180
- package/src/components/Button/icons.tsx +0 -87
- package/src/components/Button/index.ts +0 -3
- package/src/components/Checkbox/Checkbox.stories.tsx +0 -453
- package/src/components/Checkbox/Checkbox.tsx +0 -208
- package/src/components/Checkbox/Checkbox.types.ts +0 -61
- package/src/components/DescriptionList/DescriptionList.stories.tsx +0 -250
- package/src/components/DescriptionList/DescriptionList.tsx +0 -96
- package/src/components/DescriptionList/DescriptionList.types.ts +0 -29
- package/src/components/Divider/Divider.stories.tsx +0 -263
- package/src/components/Divider/Divider.tsx +0 -80
- package/src/components/Divider/Divider.types.ts +0 -24
- package/src/components/Dropdown/Dropdown.stories.tsx +0 -552
- package/src/components/Dropdown/Dropdown.tsx +0 -422
- package/src/components/Dropdown/Dropdown.types.ts +0 -146
- package/src/components/Dropdown/README.md +0 -266
- package/src/components/Dropdown/icons.tsx +0 -72
- package/src/components/Dropdown/index.ts +0 -8
- package/src/components/Input/Input.stories.tsx +0 -583
- package/src/components/Input/Input.tsx +0 -204
- package/src/components/Input/Input.types.ts +0 -80
- package/src/components/Input/icons.tsx +0 -145
- package/src/components/Input/index.ts +0 -2
- package/src/components/LoginView/LoginView.stories.tsx +0 -148
- package/src/components/LoginView/LoginView.tsx +0 -426
- package/src/components/LoginView/LoginView.types.ts +0 -52
- package/src/components/LoginView/README.md +0 -396
- package/src/components/LoginView/icons.tsx +0 -85
- package/src/components/LoginView/index.ts +0 -3
- package/src/components/Navbar/Navbar.stories.tsx +0 -810
- package/src/components/Navbar/Navbar.tsx +0 -755
- package/src/components/Navbar/Navbar.types.ts +0 -219
- package/src/components/Navbar/README.md +0 -279
- package/src/components/Navbar/icons.tsx +0 -102
- package/src/components/Navbar/index.ts +0 -8
- package/src/components/NavigationBar/NavigationBar.stories.tsx +0 -406
- package/src/components/NavigationBar/NavigationBar.tsx +0 -246
- package/src/components/NavigationBar/NavigationBar.types.ts +0 -74
- package/src/components/NavigationBar/README.md +0 -469
- package/src/components/NavigationBar/index.ts +0 -2
- package/src/components/NavigationRail/NavigationRail.stories.tsx +0 -417
- package/src/components/NavigationRail/NavigationRail.tsx +0 -418
- package/src/components/NavigationRail/NavigationRail.types.ts +0 -109
- package/src/components/NavigationRail/README.md +0 -224
- package/src/components/NavigationRail/index.ts +0 -2
- package/src/components/Notification/Notification.stories.tsx +0 -513
- package/src/components/Notification/Notification.tsx +0 -145
- package/src/components/Notification/Notification.types.ts +0 -142
- package/src/components/Notification/README.md +0 -409
- package/src/components/Notification/index.ts +0 -3
- package/src/components/POSConvention/POSConvention.stories.tsx +0 -235
- package/src/components/POSConvention/POSConvention.tsx +0 -129
- package/src/components/POSConvention/POSConvention.types.ts +0 -38
- package/src/components/POSConvention/README.md +0 -123
- package/src/components/POSConvention/icons.tsx +0 -45
- package/src/components/POSConvention/index.ts +0 -3
- package/src/components/POSLocationButton/POSLocationButton.stories.tsx +0 -531
- package/src/components/POSLocationButton/POSLocationButton.tsx +0 -247
- package/src/components/POSLocationButton/POSLocationButton.types.ts +0 -87
- package/src/components/POSLocationButton/README.md +0 -253
- package/src/components/POSLocationButton/icons.tsx +0 -120
- package/src/components/POSLocationButton/index.ts +0 -14
- package/src/components/POSNumberButton/POSNumberButton.stories.tsx +0 -415
- package/src/components/POSNumberButton/POSNumberButton.tsx +0 -179
- package/src/components/POSNumberButton/POSNumberButton.types.ts +0 -51
- package/src/components/POSNumberButton/README.md +0 -321
- package/src/components/POSNumberButton/index.ts +0 -3
- package/src/components/POSProductButton/POSProductButton.stories.tsx +0 -318
- package/src/components/POSProductButton/POSProductButton.tsx +0 -152
- package/src/components/POSProductButton/POSProductButton.types.ts +0 -46
- package/src/components/POSProductButton/README.md +0 -269
- package/src/components/POSProductButton/index.ts +0 -2
- package/src/components/POSProductCard/POSProductCard.stories.tsx +0 -642
- package/src/components/POSProductCard/POSProductCard.tsx +0 -208
- package/src/components/POSProductCard/POSProductCard.types.ts +0 -76
- package/src/components/POSProductCard/README.md +0 -179
- package/src/components/POSProductCard/icons.tsx +0 -26
- package/src/components/POSProductCard/index.ts +0 -2
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +0 -753
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +0 -332
- package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +0 -119
- package/src/components/POSProductSidebarItems/README.md +0 -198
- package/src/components/POSProductSidebarItems/icons.tsx +0 -21
- package/src/components/POSProductSidebarItems/index.ts +0 -3
- package/src/components/POSTable/POSTable.stories.tsx +0 -737
- package/src/components/POSTable/POSTable.tsx +0 -401
- package/src/components/POSTable/POSTable.types.ts +0 -83
- package/src/components/POSTable/README.md +0 -286
- package/src/components/POSTable/index.ts +0 -7
- package/src/components/Pagination/Pagination.stories.tsx +0 -555
- package/src/components/Pagination/Pagination.tsx +0 -286
- package/src/components/Pagination/Pagination.types.ts +0 -93
- package/src/components/Pagination/README.md +0 -298
- package/src/components/Pagination/icons.tsx +0 -47
- package/src/components/Pagination/index.ts +0 -3
- package/src/components/Quantity/Quantity.stories.tsx +0 -457
- package/src/components/Quantity/Quantity.tsx +0 -289
- package/src/components/Quantity/Quantity.types.ts +0 -70
- package/src/components/Radio/Radio.stories.tsx +0 -523
- package/src/components/Radio/Radio.tsx +0 -170
- package/src/components/Radio/Radio.types.ts +0 -122
- package/src/components/Select/README.md +0 -299
- package/src/components/Select/Select.stories.tsx +0 -673
- package/src/components/Select/Select.tsx +0 -454
- package/src/components/Select/Select.types.ts +0 -148
- package/src/components/Select/icons.tsx +0 -50
- package/src/components/Select/index.ts +0 -3
- package/src/components/SignUpView/SignUpView.stories.tsx +0 -129
- package/src/components/SignUpView/SignUpView.tsx +0 -503
- package/src/components/SignUpView/SignUpView.types.ts +0 -58
- package/src/components/SignUpView/icons.tsx +0 -71
- package/src/components/SignUpView/index.ts +0 -3
- package/src/components/Switch/README.md +0 -112
- package/src/components/Switch/Switch.stories.tsx +0 -550
- package/src/components/Switch/Switch.tsx +0 -246
- package/src/components/Switch/Switch.types.ts +0 -67
- package/src/components/Table/README.md +0 -369
- package/src/components/Table/Table.stories.tsx +0 -805
- package/src/components/Table/Table.tsx +0 -688
- package/src/components/Table/Table.types.ts +0 -204
- package/src/components/Table/index.ts +0 -9
- package/src/components/Tabs/README.md +0 -201
- package/src/components/Tabs/Tabs.stories.tsx +0 -580
- package/src/components/Tabs/Tabs.tsx +0 -356
- package/src/components/Tabs/Tabs.types.ts +0 -127
- package/src/components/Tabs/icons.tsx +0 -129
- package/src/components/Tabs/index.ts +0 -11
- package/src/components/Textarea/Textarea.stories.tsx +0 -535
- package/src/components/Textarea/Textarea.tsx +0 -188
- package/src/components/Textarea/Textarea.types.ts +0 -54
- package/src/context/ThemeContext.tsx +0 -99
- package/src/context/index.ts +0 -1
- package/src/index.css +0 -29
- package/src/index.ts +0 -39
- package/src/main.tsx +0 -10
- package/src/views/ProductsView/ProductsView.stories.tsx +0 -344
- package/src/views/ProductsView/ProductsView.tsx +0 -480
- package/src/views/ProductsView/ProductsView.types.ts +0 -238
- package/src/views/ProductsView/README.md +0 -312
- package/src/views/ProductsView/icons.tsx +0 -38
- package/src/views/ProductsView/index.ts +0 -8
- package/src/views/RecoverPasswordView/README.md +0 -269
- package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +0 -131
- package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +0 -376
- package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +0 -56
- package/src/views/RecoverPasswordView/icons.tsx +0 -17
- package/src/views/RecoverPasswordView/index.ts +0 -2
- package/src/views/TableLayoutView/README.md +0 -268
- package/src/views/TableLayoutView/TableLayoutView.stories.tsx +0 -235
- package/src/views/TableLayoutView/TableLayoutView.tsx +0 -461
- package/src/views/TableLayoutView/TableLayoutView.types.ts +0 -209
- package/src/views/TableLayoutView/icons.tsx +0 -113
- package/src/views/TableLayoutView/index.ts +0 -6
- package/storybook/main.ts +0 -20
- package/storybook/preview.tsx +0 -84
- package/storybook/vitest.setup.ts +0 -7
- package/tailwind.config.js +0 -128
- /package/{public → dist}/,Business Logo.png +0 -0
- /package/{public → dist}/.Siesa Logo.png +0 -0
- /package/{public → dist}/bg_siesa.png +0 -0
- /package/{public → dist}/siesa_logo_mobile.png +0 -0
- /package/{public → dist}/vite.svg +0 -0
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import type { InputHTMLAttributes } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Estados visuales del Radio Button
|
|
5
|
-
*
|
|
6
|
-
* @see Radio.tsx - Implementación del componente
|
|
7
|
-
*/
|
|
8
|
-
export type RadioState = 'default' | 'hover' | 'focus' | 'disabled';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Props del componente Radio
|
|
12
|
-
*
|
|
13
|
-
* Extiende las props nativas de HTMLInputElement excepto 'type' y 'size'
|
|
14
|
-
* que están manejados internamente por el componente.
|
|
15
|
-
*
|
|
16
|
-
* @see docs/colors.md - Sistema de colores para estados
|
|
17
|
-
* @see docs/typography.md - Tipografía para labels y descriptions
|
|
18
|
-
* @see docs/spacing.md - Espaciado entre elementos
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```tsx
|
|
22
|
-
* // Radio simple
|
|
23
|
-
* <Radio
|
|
24
|
-
* label="Accept terms"
|
|
25
|
-
* value="accept"
|
|
26
|
-
* name="terms"
|
|
27
|
-
* checked={accepted}
|
|
28
|
-
* onChange={(e) => setAccepted(e.target.checked)}
|
|
29
|
-
* />
|
|
30
|
-
*
|
|
31
|
-
* // Radio con description
|
|
32
|
-
* <Radio
|
|
33
|
-
* label="Allow tickets to be resold"
|
|
34
|
-
* description="Customers can resell or transfer their tickets"
|
|
35
|
-
* value="resell"
|
|
36
|
-
* name="ticketOptions"
|
|
37
|
-
* checked={resellAllowed}
|
|
38
|
-
* onChange={(e) => setResellAllowed(e.target.checked)}
|
|
39
|
-
* />
|
|
40
|
-
*
|
|
41
|
-
* // Radio disabled
|
|
42
|
-
* <Radio
|
|
43
|
-
* label="Premium feature"
|
|
44
|
-
* description="Upgrade to access this feature"
|
|
45
|
-
* disabled
|
|
46
|
-
* value="premium"
|
|
47
|
-
* name="features"
|
|
48
|
-
* />
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
export interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
|
|
52
|
-
/**
|
|
53
|
-
* Etiqueta del radio button
|
|
54
|
-
*
|
|
55
|
-
* Se muestra con tipografía Label Small (14px Bold) según sistema de diseño.
|
|
56
|
-
*
|
|
57
|
-
* @see docs/typography.md - Label Small (text-sm font-bold)
|
|
58
|
-
*/
|
|
59
|
-
label?: string;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Descripción debajo del label
|
|
63
|
-
*
|
|
64
|
-
* Se muestra con tipografía Paragraph Small (14px Regular) según sistema de diseño.
|
|
65
|
-
*
|
|
66
|
-
* @see docs/typography.md - Paragraph Small (text-sm font-normal)
|
|
67
|
-
*/
|
|
68
|
-
description?: string;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Si el radio está seleccionado
|
|
72
|
-
*
|
|
73
|
-
* Controla el estado checked del radio button. En grupos de radio buttons,
|
|
74
|
-
* solo uno puede estar checked a la vez.
|
|
75
|
-
*
|
|
76
|
-
* @default false
|
|
77
|
-
*/
|
|
78
|
-
checked?: boolean;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Valor del radio button (requerido para grupos)
|
|
82
|
-
*
|
|
83
|
-
* Identifica el valor único de este radio button dentro de un grupo.
|
|
84
|
-
* Es esencial para manejar la selección en grupos de radio buttons.
|
|
85
|
-
*/
|
|
86
|
-
value?: string | number;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Nombre del grupo de radio buttons
|
|
90
|
-
*
|
|
91
|
-
* Agrupa múltiples radio buttons para permitir selección única.
|
|
92
|
-
* Todos los radios con el mismo `name` pertenecen al mismo grupo.
|
|
93
|
-
*/
|
|
94
|
-
name?: string;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Clases CSS adicionales
|
|
98
|
-
*
|
|
99
|
-
* Permite extender los estilos del componente con clases de Tailwind CSS
|
|
100
|
-
* o clases personalizadas.
|
|
101
|
-
*/
|
|
102
|
-
className?: string;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Callback cuando el estado del radio cambia
|
|
106
|
-
*
|
|
107
|
-
* Se ejecuta cuando el usuario selecciona o deselecciona el radio button.
|
|
108
|
-
*
|
|
109
|
-
* @param event - Evento de cambio del input nativo
|
|
110
|
-
*
|
|
111
|
-
* @example
|
|
112
|
-
* ```tsx
|
|
113
|
-
* <Radio
|
|
114
|
-
* onChange={(e) => {
|
|
115
|
-
* console.log('Checked:', e.target.checked);
|
|
116
|
-
* console.log('Value:', e.target.value);
|
|
117
|
-
* }}
|
|
118
|
-
* />
|
|
119
|
-
* ```
|
|
120
|
-
*/
|
|
121
|
-
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
|
122
|
-
}
|
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
# Select Component
|
|
2
|
-
|
|
3
|
-
Componente Select (dropdown) del sistema de diseño Siesa con soporte completo de dark mode, estados interactivos y accesibilidad.
|
|
4
|
-
|
|
5
|
-
## Características
|
|
6
|
-
|
|
7
|
-
- ✓ Soporte completo de dark mode
|
|
8
|
-
- ✓ Keyboard navigation (Arrow keys, Enter, Escape)
|
|
9
|
-
- ✓ Click outside para cerrar el menú
|
|
10
|
-
- ✓ TypeScript con types estrictos
|
|
11
|
-
- ✓ Accesibilidad con ARIA labels
|
|
12
|
-
- ✓ Estados: Default, Hover, Focus, Disabled, Error
|
|
13
|
-
- ✓ Transiciones suaves
|
|
14
|
-
- ✓ Opciones deshabilitadas individuales
|
|
15
|
-
- ✓ Label y descripción configurables
|
|
16
|
-
- ✓ Menu header opcional
|
|
17
|
-
- ✓ Full width opcional
|
|
18
|
-
- ✓ Posición del menú configurable (top/bottom)
|
|
19
|
-
|
|
20
|
-
## Instalación
|
|
21
|
-
|
|
22
|
-
```tsx
|
|
23
|
-
import { Select } from '@/components/Select';
|
|
24
|
-
import type { SelectOption } from '@/components/Select';
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Uso Básico
|
|
28
|
-
|
|
29
|
-
```tsx
|
|
30
|
-
import { Select } from '@/components/Select';
|
|
31
|
-
import { useState } from 'react';
|
|
32
|
-
|
|
33
|
-
function MyComponent() {
|
|
34
|
-
const [value, setValue] = useState<string | number>('');
|
|
35
|
-
|
|
36
|
-
const options = [
|
|
37
|
-
{ value: '1', label: 'Opción 1' },
|
|
38
|
-
{ value: '2', label: 'Opción 2' },
|
|
39
|
-
{ value: '3', label: 'Opción 3' },
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<Select
|
|
44
|
-
options={options}
|
|
45
|
-
value={value}
|
|
46
|
-
onChange={setValue}
|
|
47
|
-
placeholder="Selecciona una opción"
|
|
48
|
-
label="Label"
|
|
49
|
-
description="Texto descriptivo opcional"
|
|
50
|
-
/>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## Props
|
|
56
|
-
|
|
57
|
-
| Prop | Type | Default | Descripción |
|
|
58
|
-
|------|------|---------|-------------|
|
|
59
|
-
| `options` | `SelectOption[]` | **required** | Array de opciones disponibles |
|
|
60
|
-
| `value` | `string \| number` | `undefined` | Valor seleccionado (controlado) |
|
|
61
|
-
| `defaultValue` | `string \| number` | `undefined` | Valor inicial (no controlado) |
|
|
62
|
-
| `placeholder` | `string` | `'Seleccionar...'` | Texto cuando no hay selección |
|
|
63
|
-
| `disabled` | `boolean` | `false` | Si el select está deshabilitado |
|
|
64
|
-
| `error` | `boolean` | `false` | Si muestra estado de error |
|
|
65
|
-
| `label` | `string` | `undefined` | Label del select |
|
|
66
|
-
| `description` | `string` | `undefined` | Texto descriptivo debajo del label (antes del trigger) |
|
|
67
|
-
| `showLabel` | `boolean` | `true` | Muestra el label |
|
|
68
|
-
| `showDescription` | `boolean` | `true` | Muestra la descripción |
|
|
69
|
-
| `menuHeader` | `string` | `undefined` | Header opcional al inicio del menú |
|
|
70
|
-
| `onChange` | `(value: string \| number) => void` | `undefined` | Handler de cambio |
|
|
71
|
-
| `className` | `string` | `''` | Clases CSS adicionales |
|
|
72
|
-
| `triggerClassName` | `string` | `''` | Clases para el trigger |
|
|
73
|
-
| `menuClassName` | `string` | `''` | Clases para el menú |
|
|
74
|
-
| `ariaLabel` | `string` | `undefined` | Label ARIA |
|
|
75
|
-
| `id` | `string` | `undefined` | ID para asociar con label |
|
|
76
|
-
| `name` | `string` | `undefined` | Nombre para formularios |
|
|
77
|
-
| `required` | `boolean` | `false` | Si es campo requerido |
|
|
78
|
-
| `menuPosition` | `'top' \| 'bottom'` | `'bottom'` | Posición del menú |
|
|
79
|
-
| `fullWidth` | `boolean` | `false` | Ancho completo |
|
|
80
|
-
|
|
81
|
-
### SelectOption
|
|
82
|
-
|
|
83
|
-
```tsx
|
|
84
|
-
interface SelectOption {
|
|
85
|
-
value: string | number;
|
|
86
|
-
label: string;
|
|
87
|
-
disabled?: boolean;
|
|
88
|
-
icon?: ReactNode;
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Ejemplos
|
|
93
|
-
|
|
94
|
-
### Con Label y Descripción
|
|
95
|
-
|
|
96
|
-
```tsx
|
|
97
|
-
<Select
|
|
98
|
-
options={options}
|
|
99
|
-
value={value}
|
|
100
|
-
onChange={setValue}
|
|
101
|
-
label="País"
|
|
102
|
-
description="Selecciona tu país de residencia"
|
|
103
|
-
placeholder="Selecciona un país"
|
|
104
|
-
/>
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Con Estado de Error
|
|
108
|
-
|
|
109
|
-
```tsx
|
|
110
|
-
<Select
|
|
111
|
-
options={options}
|
|
112
|
-
value={value}
|
|
113
|
-
onChange={setValue}
|
|
114
|
-
label="País"
|
|
115
|
-
error={!value && submitted}
|
|
116
|
-
description="El país es requerido"
|
|
117
|
-
required
|
|
118
|
-
/>
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Con Opciones Deshabilitadas
|
|
122
|
-
|
|
123
|
-
```tsx
|
|
124
|
-
const options = [
|
|
125
|
-
{ value: 'active', label: 'Activo' },
|
|
126
|
-
{ value: 'pending', label: 'Pendiente' },
|
|
127
|
-
{ value: 'inactive', label: 'Inactivo', disabled: true },
|
|
128
|
-
];
|
|
129
|
-
|
|
130
|
-
<Select
|
|
131
|
-
options={options}
|
|
132
|
-
value={value}
|
|
133
|
-
onChange={setValue}
|
|
134
|
-
placeholder="Selecciona un estado"
|
|
135
|
-
/>
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Full Width
|
|
139
|
-
|
|
140
|
-
```tsx
|
|
141
|
-
<Select
|
|
142
|
-
options={options}
|
|
143
|
-
value={value}
|
|
144
|
-
onChange={setValue}
|
|
145
|
-
fullWidth
|
|
146
|
-
/>
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Menú hacia Arriba
|
|
150
|
-
|
|
151
|
-
```tsx
|
|
152
|
-
<Select
|
|
153
|
-
options={options}
|
|
154
|
-
value={value}
|
|
155
|
-
onChange={setValue}
|
|
156
|
-
menuPosition="top"
|
|
157
|
-
/>
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### En Formularios
|
|
161
|
-
|
|
162
|
-
```tsx
|
|
163
|
-
<form onSubmit={handleSubmit}>
|
|
164
|
-
<Select
|
|
165
|
-
options={countryOptions}
|
|
166
|
-
value={country}
|
|
167
|
-
onChange={setCountry}
|
|
168
|
-
label="País"
|
|
169
|
-
description="Selecciona tu país de residencia"
|
|
170
|
-
name="country"
|
|
171
|
-
required
|
|
172
|
-
fullWidth
|
|
173
|
-
/>
|
|
174
|
-
|
|
175
|
-
<button type="submit">Enviar</button>
|
|
176
|
-
</form>
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Estados
|
|
180
|
-
|
|
181
|
-
### Default
|
|
182
|
-
Estado normal del select, listo para interacción.
|
|
183
|
-
|
|
184
|
-
### Hover
|
|
185
|
-
Al pasar el mouse sobre el trigger, se muestra un overlay sutil.
|
|
186
|
-
|
|
187
|
-
### Focus
|
|
188
|
-
Al hacer foco en el select, muestra un focus ring con el color primario.
|
|
189
|
-
|
|
190
|
-
### Open
|
|
191
|
-
Cuando el menú está abierto, muestra las opciones disponibles.
|
|
192
|
-
|
|
193
|
-
### Disabled
|
|
194
|
-
El select no puede ser interactuado, con opacity reducida.
|
|
195
|
-
|
|
196
|
-
### Error
|
|
197
|
-
Muestra bordes y colores de error, con mensaje de error opcional.
|
|
198
|
-
|
|
199
|
-
## Navegación por Teclado
|
|
200
|
-
|
|
201
|
-
- **Click / Enter / Space**: Abrir/cerrar el menú
|
|
202
|
-
- **Arrow Down**: Navegar a la siguiente opción
|
|
203
|
-
- **Arrow Up**: Navegar a la opción anterior
|
|
204
|
-
- **Enter**: Seleccionar la opción enfocada
|
|
205
|
-
- **Escape**: Cerrar el menú
|
|
206
|
-
- **Tab**: Navegar fuera del select
|
|
207
|
-
|
|
208
|
-
## Accesibilidad
|
|
209
|
-
|
|
210
|
-
- ✓ Labels semánticos con `<label>` asociado
|
|
211
|
-
- ✓ ARIA roles (`listbox`, `option`)
|
|
212
|
-
- ✓ ARIA states (`aria-expanded`, `aria-selected`, `aria-disabled`)
|
|
213
|
-
- ✓ ARIA labels para screen readers
|
|
214
|
-
- ✓ Keyboard navigation completa
|
|
215
|
-
- ✓ Focus visible y claro
|
|
216
|
-
- ✓ Campos requeridos indicados con asterisco
|
|
217
|
-
|
|
218
|
-
## Dark Mode
|
|
219
|
-
|
|
220
|
-
El componente se adapta automáticamente al modo oscuro cuando la clase `dark` está presente en el elemento `<html>`.
|
|
221
|
-
|
|
222
|
-
```tsx
|
|
223
|
-
// Funciona automáticamente
|
|
224
|
-
<Select
|
|
225
|
-
options={options}
|
|
226
|
-
value={value}
|
|
227
|
-
onChange={setValue}
|
|
228
|
-
/>
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
Todos los colores, bordes y sombras se ajustan según el modo activo.
|
|
232
|
-
|
|
233
|
-
## Especificaciones de Figma
|
|
234
|
-
|
|
235
|
-
Este componente implementa las especificaciones del diseño de Figma (node-id: 4165-14710):
|
|
236
|
-
|
|
237
|
-
- **Trigger Button**: `px-3 py-2`, `rounded-lg`, `text-sm`, `gap-3`, `leading-5`
|
|
238
|
-
- **Menu**: `p-1`, `max-h-40` (160px), `border-0`, `mt-1` (4px spacing), `rounded-md`, `bg-background-secondary`
|
|
239
|
-
- **Menu Item**: `px-2 pr-2.5 py-0.5`, `text-[10px] leading-[12px]` (Label XXSmall), `font-bold`, `rounded-md`
|
|
240
|
-
- **Label/Description**: Van ANTES del trigger con `gap-1` (4px) entre ellos
|
|
241
|
-
- **Menu Header**: Opcional, `text-[10px] leading-[12px]`, color terciario
|
|
242
|
-
- **Hover overlay**: `rgba(0,0,0,0.024)` en light mode
|
|
243
|
-
|
|
244
|
-
## Mejores Prácticas
|
|
245
|
-
|
|
246
|
-
1. **Usa labels descriptivos**: Siempre incluye un label claro para el select
|
|
247
|
-
2. **Marca campos requeridos**: Usa `required` y muestra el asterisco
|
|
248
|
-
3. **Proporciona descripción**: Ayuda al usuario con la prop `description`
|
|
249
|
-
4. **Maneja errores**: Usa la prop `error` combinada con `description` para mostrar mensajes de error
|
|
250
|
-
5. **Opciones claras**: Usa labels descriptivos para las opciones
|
|
251
|
-
6. **Deshabilita opciones cuando sea necesario**: Usa `disabled: true` en opciones no disponibles
|
|
252
|
-
7. **Menu header**: Usa `menuHeader` para agrupar opciones cuando sea relevante
|
|
253
|
-
|
|
254
|
-
## Tokens del Sistema Utilizados
|
|
255
|
-
|
|
256
|
-
### Colores
|
|
257
|
-
- `bg-bg-primary` - Fondo del trigger (white)
|
|
258
|
-
- `border-border-primary` - Borde del trigger
|
|
259
|
-
- `text-content-primary` - Texto principal
|
|
260
|
-
- `text-content-secondary` - Texto del placeholder
|
|
261
|
-
- `bg-background-secondary` - Fondo del menú
|
|
262
|
-
- `bg-primary-custom-600` - Fondo del item seleccionado (hover)
|
|
263
|
-
- `text-primary-inverse-content` - Texto del item seleccionado
|
|
264
|
-
|
|
265
|
-
### Dark Mode
|
|
266
|
-
- `dark:bg-dark-bg-primary` - Fondo en dark mode
|
|
267
|
-
- `dark:border-dark-border-primary` - Borde en dark mode
|
|
268
|
-
- `dark:text-dark-content-primary` - Texto en dark mode
|
|
269
|
-
- `dark:focus:ring-dark-border-custom` - Focus ring en dark mode
|
|
270
|
-
|
|
271
|
-
### Tipografía
|
|
272
|
-
- `text-sm` - Paragraph Regular (14px) para el trigger, `leading-5` (20px line-height)
|
|
273
|
-
- `text-[10px] leading-[12px]` - Label XXSmall (10px) para los items del menu
|
|
274
|
-
- `font-bold` - Peso bold para labels e items
|
|
275
|
-
|
|
276
|
-
### Espaciado
|
|
277
|
-
- `px-3 py-2` - Padding del trigger (12px/8px)
|
|
278
|
-
- `gap-3` - Gap interno del trigger (12px)
|
|
279
|
-
- `p-1` - Padding del menú (4px)
|
|
280
|
-
- `gap-0.5` - Gap entre items (2px)
|
|
281
|
-
- `px-2 pr-2.5 py-0.5` - Padding de items (8px/10px/2px)
|
|
282
|
-
|
|
283
|
-
## Archivos del Componente
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
Select/
|
|
287
|
-
├── Select.tsx # Componente principal
|
|
288
|
-
├── Select.types.ts # TypeScript types
|
|
289
|
-
├── Select.stories.tsx # Storybook stories
|
|
290
|
-
├── icons.tsx # Iconos (ChevronUpDown, Check)
|
|
291
|
-
├── index.ts # Exports
|
|
292
|
-
└── README.md # Documentación
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## Referencias
|
|
296
|
-
|
|
297
|
-
- **Figma**: [Select Component](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4165-14710)
|
|
298
|
-
- **Código**: `src/components/Select/Select.tsx`
|
|
299
|
-
- **Docs**: `docs/colors.md`, `docs/typography.md`, `docs/spacing.md`
|