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,204 +0,0 @@
|
|
|
1
|
-
import React, { forwardRef, cloneElement } from 'react';
|
|
2
|
-
import type { InputProps } from './Input.types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Input - Componente de campo de entrada del sistema de diseño Siesa
|
|
6
|
-
* Basado en especificaciones de Figma con Tailwind CSS
|
|
7
|
-
*
|
|
8
|
-
* Mejores prácticas implementadas:
|
|
9
|
-
* - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
10
|
-
* - Dark mode con estrategia 'class' (darkMode: 'class')
|
|
11
|
-
* - Focus rings adaptativos para light y dark mode
|
|
12
|
-
* - Tokens de color consistentes con la documentación
|
|
13
|
-
* - Sombra base para inputs con focus
|
|
14
|
-
* - Estados hover, focus, disabled y error completos
|
|
15
|
-
* - Typography: Paragraph Regular para texto, Label Bold para labels
|
|
16
|
-
*
|
|
17
|
-
* Campo de entrada de texto con soporte para:
|
|
18
|
-
* - Estados: default, hover, focus, filled, disabled
|
|
19
|
-
* - Validación con mensajes de error
|
|
20
|
-
* - Iconos izquierdo y derecho
|
|
21
|
-
* - Label y helper text
|
|
22
|
-
* - Dark mode completo
|
|
23
|
-
* - Accesibilidad completa
|
|
24
|
-
*
|
|
25
|
-
* @see docs/colors.md - Sistema de colores
|
|
26
|
-
* @see docs/shadows.md - Sistema de sombras
|
|
27
|
-
* @see docs/typography.md - Sistema tipográfico (Paragraph, Label)
|
|
28
|
-
* @see docs/spacing.md - Sistema de espaciado
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* ```tsx
|
|
32
|
-
* <Input
|
|
33
|
-
* label="Email"
|
|
34
|
-
* placeholder="tu@email.com"
|
|
35
|
-
* leftIcon={<EnvelopeIcon />}
|
|
36
|
-
* helperText="Ingresa tu correo electrónico"
|
|
37
|
-
* />
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export const Input = forwardRef<HTMLInputElement, InputProps>(
|
|
41
|
-
(
|
|
42
|
-
{
|
|
43
|
-
label,
|
|
44
|
-
labelSecondary,
|
|
45
|
-
helperText,
|
|
46
|
-
error = false,
|
|
47
|
-
errorMessage,
|
|
48
|
-
leftIcon,
|
|
49
|
-
rightIcon,
|
|
50
|
-
fullWidth = false,
|
|
51
|
-
className = '',
|
|
52
|
-
disabled = false,
|
|
53
|
-
id,
|
|
54
|
-
...props
|
|
55
|
-
},
|
|
56
|
-
ref
|
|
57
|
-
) => {
|
|
58
|
-
// Generar ID único si no se proporciona
|
|
59
|
-
const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;
|
|
60
|
-
|
|
61
|
-
// ===== CLASES BASE DEL INPUT =====
|
|
62
|
-
// Usando el sistema tipográfico Paragraph Regular (14px = text-sm)
|
|
63
|
-
// Border radius rounded-md (6px) consistente con Button
|
|
64
|
-
const baseInputClasses = `
|
|
65
|
-
w-full
|
|
66
|
-
px-3
|
|
67
|
-
py-1.5
|
|
68
|
-
text-sm
|
|
69
|
-
leading-6
|
|
70
|
-
font-normal
|
|
71
|
-
text-content-primary
|
|
72
|
-
bg-bg-primary
|
|
73
|
-
border
|
|
74
|
-
border-border-primary
|
|
75
|
-
rounded-md
|
|
76
|
-
outline-none
|
|
77
|
-
transition-all
|
|
78
|
-
duration-150
|
|
79
|
-
placeholder:text-content-tertiary
|
|
80
|
-
dark:bg-dark-bg-primary
|
|
81
|
-
dark:border-dark-border-primary
|
|
82
|
-
dark:text-dark-content-primary
|
|
83
|
-
dark:placeholder:text-dark-content-tertiary
|
|
84
|
-
`;
|
|
85
|
-
|
|
86
|
-
// ===== CLASES PARA ESTADOS INTERACTIVOS =====
|
|
87
|
-
// Orden de modificadores: {responsive}:{dark}:{state}:{utility}
|
|
88
|
-
// Focus rings adaptativos siguiendo el patrón de Button
|
|
89
|
-
const interactiveClasses = !disabled
|
|
90
|
-
? `
|
|
91
|
-
hover:border-primary-custom-600
|
|
92
|
-
focus:border-primary-custom-600
|
|
93
|
-
focus:ring-2
|
|
94
|
-
focus:ring-primary-custom-400
|
|
95
|
-
focus:ring-offset-2
|
|
96
|
-
dark:hover:border-dark-border-custom
|
|
97
|
-
dark:focus:border-dark-border-custom
|
|
98
|
-
dark:focus:ring-dark-border-custom
|
|
99
|
-
dark:focus:ring-offset-dark-bg-primary
|
|
100
|
-
`
|
|
101
|
-
: `
|
|
102
|
-
opacity-50
|
|
103
|
-
cursor-not-allowed
|
|
104
|
-
bg-bg-secondary
|
|
105
|
-
dark:bg-dark-bg-secondary
|
|
106
|
-
`;
|
|
107
|
-
|
|
108
|
-
// ===== CLASES PARA ESTADO DE ERROR =====
|
|
109
|
-
// Los colores de error son los mismos en light y dark mode
|
|
110
|
-
const errorClasses = error
|
|
111
|
-
? `
|
|
112
|
-
!border-error-border
|
|
113
|
-
focus:!ring-error-border/30
|
|
114
|
-
focus:!ring-offset-2
|
|
115
|
-
dark:!border-error-border
|
|
116
|
-
dark:focus:!ring-error-border/30
|
|
117
|
-
dark:focus:!ring-offset-dark-bg-primary
|
|
118
|
-
`
|
|
119
|
-
: '';
|
|
120
|
-
|
|
121
|
-
// ===== CLASES DEL CONTENEDOR =====
|
|
122
|
-
const containerClasses = fullWidth ? 'w-full' : 'w-[265px]';
|
|
123
|
-
|
|
124
|
-
// ===== RENDERIZAR ICONOS =====
|
|
125
|
-
// Clonar iconos con estilos apropiados y dark mode completo
|
|
126
|
-
const renderIcon = (icon: React.ReactElement | undefined) => {
|
|
127
|
-
if (!icon) return null;
|
|
128
|
-
const existingClassName = (icon.props as any).className || '';
|
|
129
|
-
return cloneElement(icon as React.ReactElement<any>, {
|
|
130
|
-
className: `w-4 h-4 text-content-tertiary dark:text-dark-content-tertiary ${existingClassName}`,
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
return (
|
|
135
|
-
<div className={`flex flex-col gap-2 ${containerClasses} ${className}`}>
|
|
136
|
-
{/* Label */}
|
|
137
|
-
{label && (
|
|
138
|
-
<label
|
|
139
|
-
htmlFor={inputId}
|
|
140
|
-
className="flex items-center w-full font-bold text-sm leading-5 text-content-primary dark:text-dark-content-primary"
|
|
141
|
-
>
|
|
142
|
-
<span className="flex-1">{label}</span>
|
|
143
|
-
{labelSecondary && (
|
|
144
|
-
<span className="text-xs leading-4 text-primary-custom-600 dark:text-primary-custom-600">
|
|
145
|
-
{labelSecondary}
|
|
146
|
-
</span>
|
|
147
|
-
)}
|
|
148
|
-
</label>
|
|
149
|
-
)}
|
|
150
|
-
|
|
151
|
-
{/* Input Container */}
|
|
152
|
-
<div className="relative flex items-center">
|
|
153
|
-
{/* Left Icon */}
|
|
154
|
-
{leftIcon && (
|
|
155
|
-
<div className="absolute left-3 pointer-events-none">
|
|
156
|
-
{renderIcon(leftIcon)}
|
|
157
|
-
</div>
|
|
158
|
-
)}
|
|
159
|
-
|
|
160
|
-
{/* Input Field */}
|
|
161
|
-
<input
|
|
162
|
-
ref={ref}
|
|
163
|
-
id={inputId}
|
|
164
|
-
disabled={disabled}
|
|
165
|
-
className={`
|
|
166
|
-
${baseInputClasses}
|
|
167
|
-
${interactiveClasses}
|
|
168
|
-
${errorClasses}
|
|
169
|
-
${leftIcon ? 'pl-9' : ''}
|
|
170
|
-
${rightIcon ? 'pr-9' : ''}
|
|
171
|
-
`.trim().replace(/\s+/g, ' ')}
|
|
172
|
-
{...props}
|
|
173
|
-
/>
|
|
174
|
-
|
|
175
|
-
{/* Right Icon */}
|
|
176
|
-
{rightIcon && (
|
|
177
|
-
<div className="absolute right-3 pointer-events-none">
|
|
178
|
-
{renderIcon(rightIcon)}
|
|
179
|
-
</div>
|
|
180
|
-
)}
|
|
181
|
-
</div>
|
|
182
|
-
|
|
183
|
-
{/* Helper Text or Error Message */}
|
|
184
|
-
{(helperText || errorMessage) && (
|
|
185
|
-
<p
|
|
186
|
-
className={`
|
|
187
|
-
text-xs
|
|
188
|
-
leading-5
|
|
189
|
-
${
|
|
190
|
-
error
|
|
191
|
-
? 'text-error-content dark:text-error-content'
|
|
192
|
-
: 'text-content-tertiary dark:text-dark-content-tertiary'
|
|
193
|
-
}
|
|
194
|
-
`.trim().replace(/\s+/g, ' ')}
|
|
195
|
-
>
|
|
196
|
-
{error && errorMessage ? errorMessage : helperText}
|
|
197
|
-
</p>
|
|
198
|
-
)}
|
|
199
|
-
</div>
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
Input.displayName = 'Input';
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import type { ReactElement, InputHTMLAttributes } from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Estados visuales del Input
|
|
5
|
-
* @description Tipo de referencia para documentar los estados posibles del Input.
|
|
6
|
-
* Los estados se manejan automáticamente mediante props (disabled) y pseudo-clases CSS (:hover, :focus)
|
|
7
|
-
*/
|
|
8
|
-
export type InputState = 'default' | 'hover' | 'focus' | 'filled' | 'disabled';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Props del componente Input
|
|
12
|
-
*
|
|
13
|
-
* @see docs/colors.md - Sistema de colores
|
|
14
|
-
* @see docs/typography.md - Sistema tipográfico
|
|
15
|
-
* @see docs/spacing.md - Sistema de espaciado
|
|
16
|
-
* @see docs/shadows.md - Sistema de sombras
|
|
17
|
-
*/
|
|
18
|
-
export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
|
|
19
|
-
/**
|
|
20
|
-
* Etiqueta del campo de entrada
|
|
21
|
-
* @description Texto descriptivo que se muestra encima del input
|
|
22
|
-
* @example "Email", "Nombre completo", "Contraseña"
|
|
23
|
-
*/
|
|
24
|
-
label?: string;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Texto secundario junto al label (opcional)
|
|
28
|
-
* @description Se muestra alineado a la derecha del label, útil para indicar campos opcionales
|
|
29
|
-
* @example "Optional", "Opcional"
|
|
30
|
-
*/
|
|
31
|
-
labelSecondary?: string;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Texto de ayuda debajo del input
|
|
35
|
-
* @description Proporciona información adicional o instrucciones para el usuario
|
|
36
|
-
* @example "Ingresa tu correo electrónico", "Mínimo 8 caracteres"
|
|
37
|
-
*/
|
|
38
|
-
helperText?: string;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Indica si hay un error de validación
|
|
42
|
-
* @description Cambia el estilo del input para indicar error (borde rojo)
|
|
43
|
-
* @default false
|
|
44
|
-
*/
|
|
45
|
-
error?: boolean;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Mensaje de error a mostrar (reemplaza helperText cuando error=true)
|
|
49
|
-
* @description Se muestra en rojo debajo del input cuando hay un error
|
|
50
|
-
* @example "Este campo es requerido", "Formato de email inválido"
|
|
51
|
-
*/
|
|
52
|
-
errorMessage?: string;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Icono a mostrar a la izquierda del input
|
|
56
|
-
* @description Ayuda a identificar el tipo de campo visualmente
|
|
57
|
-
* @example <EnvelopeIcon />, <UserIcon />, <LockClosedIcon />
|
|
58
|
-
*/
|
|
59
|
-
leftIcon?: ReactElement;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Icono a mostrar a la derecha del input
|
|
63
|
-
* @description Útil para acciones como mostrar/ocultar contraseña o limpiar campo
|
|
64
|
-
* @example <EyeIcon />, <XMarkIcon />, <CheckIcon />
|
|
65
|
-
*/
|
|
66
|
-
rightIcon?: ReactElement;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Si el input ocupa todo el ancho del contenedor
|
|
70
|
-
* @description Por defecto usa w-[265px], con fullWidth usa w-full
|
|
71
|
-
* @default false
|
|
72
|
-
*/
|
|
73
|
-
fullWidth?: boolean;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Clases CSS adicionales para personalizar el componente
|
|
77
|
-
* @description Se aplican al contenedor principal del input
|
|
78
|
-
*/
|
|
79
|
-
className?: string;
|
|
80
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Icons para Input Component
|
|
3
|
-
* Basado en Heroicons Micro
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export const EnvelopeIcon = () => (
|
|
7
|
-
<svg
|
|
8
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
9
|
-
viewBox="0 0 16 16"
|
|
10
|
-
fill="currentColor"
|
|
11
|
-
className="w-4 h-4"
|
|
12
|
-
>
|
|
13
|
-
<path d="M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z" />
|
|
14
|
-
<path d="M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z" />
|
|
15
|
-
</svg>
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
export const QuestionMarkCircleIcon = () => (
|
|
19
|
-
<svg
|
|
20
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
21
|
-
viewBox="0 0 16 16"
|
|
22
|
-
fill="currentColor"
|
|
23
|
-
className="w-4 h-4"
|
|
24
|
-
>
|
|
25
|
-
<path
|
|
26
|
-
fillRule="evenodd"
|
|
27
|
-
d="M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0ZM6.75 6.5a1.25 1.25 0 1 1 2.5 0 .75.75 0 0 0 1.5 0 2.75 2.75 0 0 0-4.25-2.308.75.75 0 0 0 .75 1.298A1.25 1.25 0 0 1 6.75 6.5ZM8 10a.75.75 0 0 0-.75.75v.5a.75.75 0 0 0 1.5 0v-.5A.75.75 0 0 0 8 10Z"
|
|
28
|
-
clipRule="evenodd"
|
|
29
|
-
/>
|
|
30
|
-
</svg>
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
export const UserIcon = () => (
|
|
34
|
-
<svg
|
|
35
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
36
|
-
viewBox="0 0 16 16"
|
|
37
|
-
fill="currentColor"
|
|
38
|
-
className="w-4 h-4"
|
|
39
|
-
>
|
|
40
|
-
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM12.735 14c.618 0 1.093-.561.872-1.139a6.002 6.002 0 0 0-11.215 0c-.22.578.254 1.139.872 1.139h9.47Z" />
|
|
41
|
-
</svg>
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
export const LockClosedIcon = () => (
|
|
45
|
-
<svg
|
|
46
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
47
|
-
viewBox="0 0 16 16"
|
|
48
|
-
fill="currentColor"
|
|
49
|
-
className="w-4 h-4"
|
|
50
|
-
>
|
|
51
|
-
<path
|
|
52
|
-
fillRule="evenodd"
|
|
53
|
-
d="M8 1a3.5 3.5 0 0 0-3.5 3.5V7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7V4.5A3.5 3.5 0 0 0 8 1Zm2 6V4.5a2 2 0 1 0-4 0V7h4Z"
|
|
54
|
-
clipRule="evenodd"
|
|
55
|
-
/>
|
|
56
|
-
</svg>
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
export const MagnifyingGlassIcon = () => (
|
|
60
|
-
<svg
|
|
61
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
62
|
-
viewBox="0 0 16 16"
|
|
63
|
-
fill="currentColor"
|
|
64
|
-
className="w-4 h-4"
|
|
65
|
-
>
|
|
66
|
-
<path
|
|
67
|
-
fillRule="evenodd"
|
|
68
|
-
d="M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z"
|
|
69
|
-
clipRule="evenodd"
|
|
70
|
-
/>
|
|
71
|
-
</svg>
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
export const EyeIcon = () => (
|
|
75
|
-
<svg
|
|
76
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
77
|
-
viewBox="0 0 16 16"
|
|
78
|
-
fill="currentColor"
|
|
79
|
-
className="w-4 h-4"
|
|
80
|
-
>
|
|
81
|
-
<path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z" />
|
|
82
|
-
<path
|
|
83
|
-
fillRule="evenodd"
|
|
84
|
-
d="M1.38 8.28a.87.87 0 0 1 0-.566 7.003 7.003 0 0 1 13.238.006.87.87 0 0 1 0 .566A7.003 7.003 0 0 1 1.379 8.28ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
|
|
85
|
-
clipRule="evenodd"
|
|
86
|
-
/>
|
|
87
|
-
</svg>
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
export const EyeSlashIcon = () => (
|
|
91
|
-
<svg
|
|
92
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
93
|
-
viewBox="0 0 16 16"
|
|
94
|
-
fill="currentColor"
|
|
95
|
-
className="w-4 h-4"
|
|
96
|
-
>
|
|
97
|
-
<path
|
|
98
|
-
fillRule="evenodd"
|
|
99
|
-
d="M3.28 2.22a.75.75 0 0 0-1.06 1.06l10.5 10.5a.75.75 0 1 0 1.06-1.06l-1.322-1.323a7.012 7.012 0 0 0 2.16-3.11.87.87 0 0 0 0-.567A7.003 7.003 0 0 0 4.82 3.76l-1.54-1.54Zm3.196 3.195 1.135 1.136A1.502 1.502 0 0 1 9.45 8.389l1.136 1.135a3 3 0 0 0-4.109-4.109Z"
|
|
100
|
-
clipRule="evenodd"
|
|
101
|
-
/>
|
|
102
|
-
<path d="m7.812 10.994 1.816 1.816A7.003 7.003 0 0 1 1.38 8.28a.87.87 0 0 1 0-.566 6.985 6.985 0 0 1 1.113-2.039l2.513 2.513a3 3 0 0 0 2.806 2.806Z" />
|
|
103
|
-
</svg>
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
export const XMarkIcon = () => (
|
|
107
|
-
<svg
|
|
108
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
109
|
-
viewBox="0 0 16 16"
|
|
110
|
-
fill="currentColor"
|
|
111
|
-
className="w-4 h-4"
|
|
112
|
-
>
|
|
113
|
-
<path d="M5.28 4.22a.75.75 0 0 0-1.06 1.06L6.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L8 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L9.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L8 6.94 5.28 4.22Z" />
|
|
114
|
-
</svg>
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
export const CheckIcon = () => (
|
|
118
|
-
<svg
|
|
119
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
120
|
-
viewBox="0 0 16 16"
|
|
121
|
-
fill="currentColor"
|
|
122
|
-
className="w-4 h-4"
|
|
123
|
-
>
|
|
124
|
-
<path
|
|
125
|
-
fillRule="evenodd"
|
|
126
|
-
d="M12.416 3.376a.75.75 0 0 1 .208 1.04l-5 7.5a.75.75 0 0 1-1.154.114l-3-3a.75.75 0 0 1 1.06-1.06l2.353 2.353 4.493-6.74a.75.75 0 0 1 1.04-.207Z"
|
|
127
|
-
clipRule="evenodd"
|
|
128
|
-
/>
|
|
129
|
-
</svg>
|
|
130
|
-
);
|
|
131
|
-
|
|
132
|
-
export const ExclamationCircleIcon = () => (
|
|
133
|
-
<svg
|
|
134
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
135
|
-
viewBox="0 0 16 16"
|
|
136
|
-
fill="currentColor"
|
|
137
|
-
className="w-4 h-4"
|
|
138
|
-
>
|
|
139
|
-
<path
|
|
140
|
-
fillRule="evenodd"
|
|
141
|
-
d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14ZM8 4a.75.75 0 0 1 .75.75v3a.75.75 0 0 1-1.5 0v-3A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"
|
|
142
|
-
clipRule="evenodd"
|
|
143
|
-
/>
|
|
144
|
-
</svg>
|
|
145
|
-
);
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { LoginView } from './LoginView';
|
|
3
|
-
|
|
4
|
-
const meta = {
|
|
5
|
-
title: 'Siesa UI Kit/LoginView',
|
|
6
|
-
component: LoginView,
|
|
7
|
-
parameters: {
|
|
8
|
-
layout: 'fullscreen',
|
|
9
|
-
docs: {
|
|
10
|
-
description: {
|
|
11
|
-
component: 'Vista completa de inicio de sesión del sistema Siesa.',
|
|
12
|
-
},
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
tags: ['autodocs'],
|
|
16
|
-
argTypes: {
|
|
17
|
-
onSubmit: {
|
|
18
|
-
action: 'submit',
|
|
19
|
-
description: 'Handler cuando se envía el formulario con (email, password)',
|
|
20
|
-
},
|
|
21
|
-
onForgotPassword: {
|
|
22
|
-
action: 'forgot-password',
|
|
23
|
-
description: 'Handler cuando se hace click en "Olvidé mi Contraseña"',
|
|
24
|
-
},
|
|
25
|
-
onSignUp: {
|
|
26
|
-
action: 'sign-up',
|
|
27
|
-
description: 'Handler cuando se hace click en "¿No tienes una cuenta?"',
|
|
28
|
-
},
|
|
29
|
-
isLoading: {
|
|
30
|
-
control: 'boolean',
|
|
31
|
-
description: 'Si el formulario está en estado de carga',
|
|
32
|
-
},
|
|
33
|
-
errorMessage: {
|
|
34
|
-
control: 'text',
|
|
35
|
-
description: 'Mensaje de error general a mostrar',
|
|
36
|
-
},
|
|
37
|
-
showBackground: {
|
|
38
|
-
control: 'boolean',
|
|
39
|
-
description: 'Si se muestra el fondo decorativo con imagen',
|
|
40
|
-
},
|
|
41
|
-
variant: {
|
|
42
|
-
control: 'select',
|
|
43
|
-
options: ['responsive', 'mobile', 'desktop'],
|
|
44
|
-
description: 'Variante de visualización: responsive (adapta al viewport), mobile (siempre mobile), desktop (siempre desktop)',
|
|
45
|
-
defaultValue: 'responsive',
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
} satisfies Meta<typeof LoginView>;
|
|
49
|
-
|
|
50
|
-
export default meta;
|
|
51
|
-
type Story = StoryObj<typeof meta>;
|
|
52
|
-
|
|
53
|
-
// ============================================
|
|
54
|
-
// 1. DESKTOP
|
|
55
|
-
// ============================================
|
|
56
|
-
export const Desktop: Story = {
|
|
57
|
-
render: () => (
|
|
58
|
-
<div className="min-h-screen w-full">
|
|
59
|
-
<LoginView
|
|
60
|
-
onSubmit={(email, password) => {
|
|
61
|
-
console.log('Login:', { email, password });
|
|
62
|
-
alert(`Login con:\nEmail: ${email}\nPassword: ${password}`);
|
|
63
|
-
}}
|
|
64
|
-
onForgotPassword={() => {
|
|
65
|
-
console.log('Forgot password clicked');
|
|
66
|
-
alert('Redirigiendo a recuperación de contraseña...');
|
|
67
|
-
}}
|
|
68
|
-
onSignUp={() => {
|
|
69
|
-
console.log('Sign up clicked');
|
|
70
|
-
alert('Redirigiendo a registro...');
|
|
71
|
-
}}
|
|
72
|
-
/>
|
|
73
|
-
</div>
|
|
74
|
-
),
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
// ============================================
|
|
78
|
-
// 2. CON ESTADO DE CARGA
|
|
79
|
-
// ============================================
|
|
80
|
-
export const Loading: Story = {
|
|
81
|
-
render: () => (
|
|
82
|
-
<div className="min-h-screen w-full">
|
|
83
|
-
<LoginView
|
|
84
|
-
isLoading={true}
|
|
85
|
-
onSubmit={(email, password) => {
|
|
86
|
-
console.log('Login:', { email, password });
|
|
87
|
-
}}
|
|
88
|
-
onForgotPassword={() => {
|
|
89
|
-
console.log('Forgot password clicked');
|
|
90
|
-
}}
|
|
91
|
-
onSignUp={() => {
|
|
92
|
-
console.log('Sign up clicked');
|
|
93
|
-
}}
|
|
94
|
-
/>
|
|
95
|
-
</div>
|
|
96
|
-
),
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
// ============================================
|
|
100
|
-
// 3. CON MENSAJE DE ERROR
|
|
101
|
-
// ============================================
|
|
102
|
-
export const WithError: Story = {
|
|
103
|
-
render: () => (
|
|
104
|
-
<div className="min-h-screen w-full">
|
|
105
|
-
<LoginView
|
|
106
|
-
errorMessage="Credenciales incorrectas. Por favor verifica tu email y contraseña."
|
|
107
|
-
onSubmit={(email, password) => {
|
|
108
|
-
console.log('Login:', { email, password });
|
|
109
|
-
alert(`Login con:\nEmail: ${email}\nPassword: ${password}`);
|
|
110
|
-
}}
|
|
111
|
-
onForgotPassword={() => {
|
|
112
|
-
console.log('Forgot password clicked');
|
|
113
|
-
alert('Redirigiendo a recuperación de contraseña...');
|
|
114
|
-
}}
|
|
115
|
-
onSignUp={() => {
|
|
116
|
-
console.log('Sign up clicked');
|
|
117
|
-
alert('Redirigiendo a registro...');
|
|
118
|
-
}}
|
|
119
|
-
/>
|
|
120
|
-
</div>
|
|
121
|
-
),
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// ============================================
|
|
125
|
-
// 4. SIN FONDO DECORATIVO
|
|
126
|
-
// ============================================
|
|
127
|
-
export const WithoutBackground: Story = {
|
|
128
|
-
render: () => (
|
|
129
|
-
<div className="min-h-screen w-full bg-gray-100 dark:bg-gray-900">
|
|
130
|
-
<LoginView
|
|
131
|
-
showBackground={false}
|
|
132
|
-
onSubmit={(email, password) => {
|
|
133
|
-
console.log('Login:', { email, password });
|
|
134
|
-
alert(`Login con:\nEmail: ${email}\nPassword: ${password}`);
|
|
135
|
-
}}
|
|
136
|
-
onForgotPassword={() => {
|
|
137
|
-
console.log('Forgot password clicked');
|
|
138
|
-
alert('Redirigiendo a recuperación de contraseña...');
|
|
139
|
-
}}
|
|
140
|
-
onSignUp={() => {
|
|
141
|
-
console.log('Sign up clicked');
|
|
142
|
-
alert('Redirigiendo a registro...');
|
|
143
|
-
}}
|
|
144
|
-
/>
|
|
145
|
-
</div>
|
|
146
|
-
),
|
|
147
|
-
};
|
|
148
|
-
|