anima-ds-nucleus 1.0.21 → 1.0.22
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/anima-ds-nucleus.css +1 -1
- package/dist/anima-ds.cjs.js +92 -83
- package/dist/anima-ds.esm.js +5717 -5429
- package/package.json +1 -1
- package/src/components/Inputs/PasswordInput/PasswordInput.jsx +3 -9
- package/src/components/Views/ForgotPassword/ForgotPassword.jsx +5 -3
- package/src/components/Views/LoginForm/LoginForm.jsx +36 -53
- package/src/components/Views/LoginForm/LoginForm.stories.jsx +36 -0
- package/src/components/Views/NewPassword/NewPassword.jsx +389 -0
- package/src/components/Views/NewPassword/NewPassword.stories.jsx +291 -0
- package/src/index.js +1 -0
- package/src/style.css +106 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { NewPassword } from './NewPassword';
|
|
3
|
+
import { I18nProvider } from '../../../providers/I18nProvider';
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Views/NewPassword',
|
|
7
|
+
component: NewPassword,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
decorators: [
|
|
10
|
+
(Story) => (
|
|
11
|
+
<I18nProvider language="es-AR">
|
|
12
|
+
<Story />
|
|
13
|
+
</I18nProvider>
|
|
14
|
+
),
|
|
15
|
+
],
|
|
16
|
+
argTypes: {
|
|
17
|
+
variant: {
|
|
18
|
+
control: 'select',
|
|
19
|
+
options: ['default', 'hexa-login'],
|
|
20
|
+
description: 'Variante del componente',
|
|
21
|
+
},
|
|
22
|
+
layout: {
|
|
23
|
+
control: 'select',
|
|
24
|
+
options: ['embedded', 'page'],
|
|
25
|
+
description: 'Layout del componente',
|
|
26
|
+
},
|
|
27
|
+
disabled: {
|
|
28
|
+
control: 'boolean',
|
|
29
|
+
description: 'Deshabilitar el formulario',
|
|
30
|
+
},
|
|
31
|
+
submitting: {
|
|
32
|
+
control: 'boolean',
|
|
33
|
+
description: 'Estado de envío',
|
|
34
|
+
},
|
|
35
|
+
success: {
|
|
36
|
+
control: 'boolean',
|
|
37
|
+
description: 'Mostrar estado de éxito',
|
|
38
|
+
},
|
|
39
|
+
showRequirements: {
|
|
40
|
+
control: 'boolean',
|
|
41
|
+
description: 'Mostrar caja de requisitos',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Default (form)
|
|
47
|
+
export const Default = {
|
|
48
|
+
render: () => {
|
|
49
|
+
const [password, setPassword] = useState('');
|
|
50
|
+
const [confirmPassword, setConfirmPassword] = useState('');
|
|
51
|
+
const [passwordError, setPasswordError] = useState('');
|
|
52
|
+
const [confirmPasswordError, setConfirmPasswordError] = useState('');
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<NewPassword
|
|
56
|
+
title="Nueva contraseña"
|
|
57
|
+
subtitle="Ingresa tu nueva contraseña y confírmala"
|
|
58
|
+
passwordLabel="Contraseña"
|
|
59
|
+
passwordPlaceholder="Ingresa tu contraseña"
|
|
60
|
+
passwordValue={password}
|
|
61
|
+
onPasswordChange={(e) => {
|
|
62
|
+
setPassword(e.target.value);
|
|
63
|
+
setPasswordError('');
|
|
64
|
+
}}
|
|
65
|
+
passwordError={passwordError}
|
|
66
|
+
confirmPasswordLabel="Confirmar contraseña"
|
|
67
|
+
confirmPasswordPlaceholder="Confirma tu contraseña"
|
|
68
|
+
confirmPasswordValue={confirmPassword}
|
|
69
|
+
onConfirmPasswordChange={(e) => {
|
|
70
|
+
setConfirmPassword(e.target.value);
|
|
71
|
+
setConfirmPasswordError('');
|
|
72
|
+
}}
|
|
73
|
+
confirmPasswordError={confirmPasswordError}
|
|
74
|
+
requirementsItems={[
|
|
75
|
+
'Un mínimo de 6 caracteres',
|
|
76
|
+
'Una mayúscula, un número, un carácter especial',
|
|
77
|
+
]}
|
|
78
|
+
cancelLabel="Cancelar"
|
|
79
|
+
submitLabel="Guardar"
|
|
80
|
+
onCancel={() => {
|
|
81
|
+
console.log('Cancel clicked');
|
|
82
|
+
alert('Cancelar');
|
|
83
|
+
}}
|
|
84
|
+
onSubmit={(data) => {
|
|
85
|
+
console.log('Submit data:', data);
|
|
86
|
+
if (data.password !== data.confirmPassword) {
|
|
87
|
+
setConfirmPasswordError('Las contraseñas no coinciden');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (data.password.length < 8) {
|
|
91
|
+
setPasswordError('La contraseña debe tener al menos 8 caracteres');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
alert('Contraseña guardada exitosamente');
|
|
95
|
+
}}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// WithErrors
|
|
102
|
+
export const WithErrors = {
|
|
103
|
+
render: () => {
|
|
104
|
+
const [password, setPassword] = useState('test');
|
|
105
|
+
const [confirmPassword, setConfirmPassword] = useState('test2');
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<NewPassword
|
|
109
|
+
title="Nueva contraseña"
|
|
110
|
+
subtitle="Ingresa tu nueva contraseña y confírmala"
|
|
111
|
+
passwordLabel="Contraseña"
|
|
112
|
+
passwordPlaceholder="Ingresa tu contraseña"
|
|
113
|
+
passwordValue={password}
|
|
114
|
+
onPasswordChange={(e) => setPassword(e.target.value)}
|
|
115
|
+
passwordError="La contraseña debe tener al menos 8 caracteres"
|
|
116
|
+
confirmPasswordLabel="Confirmar contraseña"
|
|
117
|
+
confirmPasswordPlaceholder="Confirma tu contraseña"
|
|
118
|
+
confirmPasswordValue={confirmPassword}
|
|
119
|
+
onConfirmPasswordChange={(e) => setConfirmPassword(e.target.value)}
|
|
120
|
+
confirmPasswordError="Las contraseñas no coinciden"
|
|
121
|
+
requirementsItems={[
|
|
122
|
+
'Un mínimo de 6 caracteres',
|
|
123
|
+
'Una mayúscula, un número, un carácter especial',
|
|
124
|
+
]}
|
|
125
|
+
generalError="Error al guardar la contraseña. Por favor, intenta nuevamente."
|
|
126
|
+
cancelLabel="Cancelar"
|
|
127
|
+
submitLabel="Guardar"
|
|
128
|
+
onCancel={() => alert('Cancelar')}
|
|
129
|
+
onSubmit={(data) => {
|
|
130
|
+
console.log('Submit data:', data);
|
|
131
|
+
}}
|
|
132
|
+
/>
|
|
133
|
+
);
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Submitting
|
|
138
|
+
export const Submitting = {
|
|
139
|
+
args: {
|
|
140
|
+
title: 'Nueva contraseña',
|
|
141
|
+
subtitle: 'Ingresa tu nueva contraseña y confírmala',
|
|
142
|
+
passwordLabel: 'Contraseña',
|
|
143
|
+
passwordPlaceholder: 'Ingresa tu contraseña',
|
|
144
|
+
passwordValue: 'password123',
|
|
145
|
+
onPasswordChange: () => {},
|
|
146
|
+
confirmPasswordLabel: 'Confirmar contraseña',
|
|
147
|
+
confirmPasswordPlaceholder: 'Confirma tu contraseña',
|
|
148
|
+
confirmPasswordValue: 'password123',
|
|
149
|
+
onConfirmPasswordChange: () => {},
|
|
150
|
+
requirementsItems: [
|
|
151
|
+
'Un mínimo de 6 caracteres',
|
|
152
|
+
'Una mayúscula, un número, un carácter especial',
|
|
153
|
+
],
|
|
154
|
+
cancelLabel: 'Cancelar',
|
|
155
|
+
submitLabel: 'Guardar',
|
|
156
|
+
onCancel: () => alert('Cancelar'),
|
|
157
|
+
onSubmit: () => {},
|
|
158
|
+
submitting: true,
|
|
159
|
+
disabled: true,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// Success
|
|
164
|
+
export const Success = {
|
|
165
|
+
args: {
|
|
166
|
+
title: 'Nueva contraseña',
|
|
167
|
+
subtitle: 'Ingresa tu nueva contraseña y confírmala',
|
|
168
|
+
passwordLabel: 'Contraseña',
|
|
169
|
+
passwordPlaceholder: 'Ingresa tu contraseña',
|
|
170
|
+
confirmPasswordLabel: 'Confirmar contraseña',
|
|
171
|
+
confirmPasswordPlaceholder: 'Confirma tu contraseña',
|
|
172
|
+
cancelLabel: 'Cancelar',
|
|
173
|
+
submitLabel: 'Guardar',
|
|
174
|
+
onCancel: () => alert('Cancelar'),
|
|
175
|
+
onSubmit: () => {},
|
|
176
|
+
success: true,
|
|
177
|
+
successTitle: 'Contraseña actualizada',
|
|
178
|
+
successMessage: 'Tu contraseña ha sido actualizada exitosamente. Ya puedes iniciar sesión con tu nueva contraseña.',
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// Variant hexa-login
|
|
183
|
+
export const HexaLogin = {
|
|
184
|
+
render: () => {
|
|
185
|
+
const [password, setPassword] = useState('');
|
|
186
|
+
const [confirmPassword, setConfirmPassword] = useState('');
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<NewPassword
|
|
190
|
+
variant="hexa-login"
|
|
191
|
+
title="Nueva contraseña"
|
|
192
|
+
subtitle="Ingresa tu nueva contraseña y confírmala"
|
|
193
|
+
passwordLabel="Contraseña"
|
|
194
|
+
passwordPlaceholder="Ingresa tu contraseña"
|
|
195
|
+
passwordValue={password}
|
|
196
|
+
onPasswordChange={(e) => setPassword(e.target.value)}
|
|
197
|
+
confirmPasswordLabel="Confirmar contraseña"
|
|
198
|
+
confirmPasswordPlaceholder="Confirma tu contraseña"
|
|
199
|
+
confirmPasswordValue={confirmPassword}
|
|
200
|
+
onConfirmPasswordChange={(e) => setConfirmPassword(e.target.value)}
|
|
201
|
+
requirementsItems={[
|
|
202
|
+
'Un mínimo de 6 caracteres',
|
|
203
|
+
'Una mayúscula, un número, un carácter especial',
|
|
204
|
+
]}
|
|
205
|
+
cancelLabel="Cancelar"
|
|
206
|
+
submitLabel="Guardar"
|
|
207
|
+
onCancel={() => alert('Cancelar')}
|
|
208
|
+
onSubmit={(data) => {
|
|
209
|
+
console.log('Submit data:', data);
|
|
210
|
+
alert('Contraseña guardada');
|
|
211
|
+
}}
|
|
212
|
+
/>
|
|
213
|
+
);
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// Layout embedded vs page
|
|
218
|
+
export const LayoutEmbedded = {
|
|
219
|
+
args: {
|
|
220
|
+
variant: 'hexa-login',
|
|
221
|
+
layout: 'embedded',
|
|
222
|
+
title: 'Nueva contraseña',
|
|
223
|
+
subtitle: 'Ingresa tu nueva contraseña y confírmala',
|
|
224
|
+
passwordLabel: 'Contraseña',
|
|
225
|
+
passwordPlaceholder: 'Ingresa tu contraseña',
|
|
226
|
+
passwordValue: '',
|
|
227
|
+
onPasswordChange: () => {},
|
|
228
|
+
confirmPasswordLabel: 'Confirmar contraseña',
|
|
229
|
+
confirmPasswordPlaceholder: 'Confirma tu contraseña',
|
|
230
|
+
confirmPasswordValue: '',
|
|
231
|
+
onConfirmPasswordChange: () => {},
|
|
232
|
+
requirementsItems: [
|
|
233
|
+
'Un mínimo de 6 caracteres',
|
|
234
|
+
'Una mayúscula, un número, un carácter especial',
|
|
235
|
+
],
|
|
236
|
+
cancelLabel: 'Cancelar',
|
|
237
|
+
submitLabel: 'Guardar',
|
|
238
|
+
onCancel: () => alert('Cancelar'),
|
|
239
|
+
onSubmit: () => {},
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
export const LayoutPage = {
|
|
244
|
+
args: {
|
|
245
|
+
variant: 'hexa-login',
|
|
246
|
+
layout: 'page',
|
|
247
|
+
title: 'Nueva contraseña',
|
|
248
|
+
subtitle: 'Ingresa tu nueva contraseña y confírmala',
|
|
249
|
+
passwordLabel: 'Contraseña',
|
|
250
|
+
passwordPlaceholder: 'Ingresa tu contraseña',
|
|
251
|
+
passwordValue: '',
|
|
252
|
+
onPasswordChange: () => {},
|
|
253
|
+
confirmPasswordLabel: 'Confirmar contraseña',
|
|
254
|
+
confirmPasswordPlaceholder: 'Confirma tu contraseña',
|
|
255
|
+
confirmPasswordValue: '',
|
|
256
|
+
onConfirmPasswordChange: () => {},
|
|
257
|
+
requirementsItems: [
|
|
258
|
+
'Un mínimo de 6 caracteres',
|
|
259
|
+
'Una mayúscula, un número, un carácter especial',
|
|
260
|
+
],
|
|
261
|
+
cancelLabel: 'Cancelar',
|
|
262
|
+
submitLabel: 'Guardar',
|
|
263
|
+
onCancel: () => alert('Cancelar'),
|
|
264
|
+
onSubmit: () => {},
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
// Success con extra content
|
|
269
|
+
export const SuccessWithExtra = {
|
|
270
|
+
args: {
|
|
271
|
+
title: 'Nueva contraseña',
|
|
272
|
+
subtitle: 'Ingresa tu nueva contraseña y confírmala',
|
|
273
|
+
passwordLabel: 'Contraseña',
|
|
274
|
+
passwordPlaceholder: 'Ingresa tu contraseña',
|
|
275
|
+
confirmPasswordLabel: 'Confirmar contraseña',
|
|
276
|
+
confirmPasswordPlaceholder: 'Confirma tu contraseña',
|
|
277
|
+
cancelLabel: 'Cancelar',
|
|
278
|
+
submitLabel: 'Guardar',
|
|
279
|
+
onCancel: () => alert('Cancelar'),
|
|
280
|
+
onSubmit: () => {},
|
|
281
|
+
success: true,
|
|
282
|
+
successTitle: 'Contraseña actualizada',
|
|
283
|
+
successMessage: 'Tu contraseña ha sido actualizada exitosamente.',
|
|
284
|
+
successExtra: (
|
|
285
|
+
<div className="text-sm text-gray-600 mt-2">
|
|
286
|
+
Serás redirigido al login en <strong>5 segundos</strong>...
|
|
287
|
+
</div>
|
|
288
|
+
),
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
|
package/src/index.js
CHANGED
|
@@ -73,6 +73,7 @@ export { TagList } from './components/DataDisplay/TagList/TagList';
|
|
|
73
73
|
export { LoginForm } from './components/Views/LoginForm/LoginForm';
|
|
74
74
|
export { ChangePasswordForm } from './components/Views/ChangePasswordForm/ChangePasswordForm';
|
|
75
75
|
export { ForgotPassword } from './components/Views/ForgotPassword/ForgotPassword';
|
|
76
|
+
export { NewPassword } from './components/Views/NewPassword/NewPassword';
|
|
76
77
|
export { Chat } from './components/Views/Chat/Chat';
|
|
77
78
|
|
|
78
79
|
// Providers
|
package/src/style.css
CHANGED
|
@@ -755,4 +755,110 @@
|
|
|
755
755
|
background-position: center;
|
|
756
756
|
mix-blend-mode: soft-light;
|
|
757
757
|
opacity: 0.85;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/* ============================================
|
|
761
|
+
LOGIN FORM - Clases estables del Design System
|
|
762
|
+
============================================ */
|
|
763
|
+
|
|
764
|
+
/* Contenedor principal del LoginForm */
|
|
765
|
+
.anima-loginform__container {
|
|
766
|
+
width: 100%;
|
|
767
|
+
max-width: 28rem; /* 448px - equivalente aproximado a 427px pero responsive */
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/* Card del formulario */
|
|
771
|
+
.anima-loginform__card {
|
|
772
|
+
min-height: 25.5625rem; /* 409px */
|
|
773
|
+
border-radius: 0.875rem; /* 14px */
|
|
774
|
+
border: 1px solid #0000001A;
|
|
775
|
+
padding: 1.5rem; /* 24px */
|
|
776
|
+
background: #FFFFFF;
|
|
777
|
+
box-shadow: 0px 4px 6px -4px #0000001A, 0px 10px 15px -3px #0000001A;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/* Fila de botones sociales */
|
|
781
|
+
.anima-loginform__socialRow {
|
|
782
|
+
display: flex;
|
|
783
|
+
gap: 1.25rem; /* 20px */
|
|
784
|
+
width: 100%;
|
|
785
|
+
height: 2.25rem; /* 36px */
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/* Botones sociales individuales */
|
|
789
|
+
.anima-loginform__socialButton {
|
|
790
|
+
flex: 1;
|
|
791
|
+
display: flex;
|
|
792
|
+
align-items: center;
|
|
793
|
+
justify-content: center;
|
|
794
|
+
height: 2.25rem; /* 36px */
|
|
795
|
+
padding: 0.5rem 2.6875rem; /* 8px 43px */
|
|
796
|
+
gap: 1rem; /* 16px */
|
|
797
|
+
border-radius: 0.5rem; /* 8px */
|
|
798
|
+
border: 1px solid #38656D;
|
|
799
|
+
background-color: white;
|
|
800
|
+
transition: background-color 0.2s;
|
|
801
|
+
cursor: pointer;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
.anima-loginform__socialButton:hover {
|
|
805
|
+
background-color: #f9fafb; /* hover:bg-gray-50 */
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/* Caja de error general */
|
|
809
|
+
.anima-loginform__errorBox {
|
|
810
|
+
width: 100%;
|
|
811
|
+
min-height: 4.25rem; /* 68px */
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/* Responsive: mantener botones sociales horizontales en mobile */
|
|
815
|
+
@media (max-width: 768px) {
|
|
816
|
+
.anima-loginform__socialRow {
|
|
817
|
+
flex-wrap: wrap;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.anima-loginform__socialButton {
|
|
821
|
+
min-width: calc(50% - 0.625rem); /* 50% menos la mitad del gap */
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/* ============================================
|
|
826
|
+
PASSWORD INPUT - Clases estables del Design System
|
|
827
|
+
============================================ */
|
|
828
|
+
|
|
829
|
+
/* Contenedor del campo de contraseña */
|
|
830
|
+
.anima-passwordfield {
|
|
831
|
+
width: 100%;
|
|
832
|
+
position: relative;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
/* Input de contraseña con padding para el toggle */
|
|
836
|
+
.anima-passwordfield__input {
|
|
837
|
+
padding-right: 2.75rem !important; /* Espacio para el botón de toggle */
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/* Botón de toggle de visibilidad */
|
|
841
|
+
.anima-passwordfield__toggle {
|
|
842
|
+
position: absolute;
|
|
843
|
+
top: 50%;
|
|
844
|
+
transform: translateY(-50%);
|
|
845
|
+
right: 0.75rem;
|
|
846
|
+
color: #6b7280;
|
|
847
|
+
background: none;
|
|
848
|
+
border: none;
|
|
849
|
+
cursor: pointer;
|
|
850
|
+
padding: 0;
|
|
851
|
+
display: flex;
|
|
852
|
+
align-items: center;
|
|
853
|
+
justify-content: center;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.anima-passwordfield__toggle:hover {
|
|
857
|
+
color: #374151;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
.anima-passwordfield__toggle:focus {
|
|
861
|
+
outline: 2px solid #3b82f6;
|
|
862
|
+
outline-offset: 2px;
|
|
863
|
+
border-radius: 0.25rem;
|
|
758
864
|
}
|