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.
@@ -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
  }