@memori.ai/memori-react 8.4.0 → 8.4.2

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/components/LoginDrawer/LoginDrawer.css +302 -0
  3. package/dist/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1 -1
  4. package/dist/components/MemoriWidget/MemoriWidget.js +1 -1
  5. package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
  6. package/dist/components/layouts/chat.css +7 -6
  7. package/dist/locales/de.json +17 -0
  8. package/dist/locales/en.json +17 -0
  9. package/dist/locales/es.json +17 -0
  10. package/dist/locales/fr.json +17 -0
  11. package/dist/locales/it.json +17 -0
  12. package/esm/components/LoginDrawer/LoginDrawer.css +302 -0
  13. package/esm/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1 -1
  14. package/esm/components/MemoriWidget/MemoriWidget.js +1 -1
  15. package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
  16. package/esm/components/layouts/chat.css +7 -6
  17. package/esm/locales/de.json +17 -0
  18. package/esm/locales/en.json +17 -0
  19. package/esm/locales/es.json +17 -0
  20. package/esm/locales/fr.json +17 -0
  21. package/esm/locales/it.json +17 -0
  22. package/package.json +1 -1
  23. package/src/components/LoginDrawer/LoginDrawer.css +302 -0
  24. package/src/components/LoginDrawer/LoginDrawer.stories.tsx +25 -0
  25. package/src/components/LoginDrawer/LoginDrawer.test.tsx +56 -0
  26. package/src/components/LoginDrawer/LoginDrawer.tsx +1 -1
  27. package/src/components/LoginDrawer/__snapshots__/LoginDrawer.test.tsx.snap +32 -0
  28. package/src/components/MemoriArtifactSystem/components/ArtifactDrawer/ArtifactDrawer.css +1 -1
  29. package/src/components/MemoriWidget/MemoriWidget.tsx +1 -1
  30. package/src/components/layouts/chat.css +7 -6
  31. package/src/index.stories.tsx +1 -0
  32. package/src/locales/de.json +17 -0
  33. package/src/locales/en.json +17 -0
  34. package/src/locales/es.json +17 -0
  35. package/src/locales/fr.json +17 -0
  36. package/src/locales/it.json +17 -0
@@ -40,6 +40,22 @@ p.memori--login-drawer--inline-error {
40
40
  text-align: center;
41
41
  }
42
42
 
43
+ .memori--login-drawer--otp-form {
44
+ display: flex;
45
+ flex-direction: column;
46
+ padding: 0 1rem;
47
+ margin: 0 0 2rem;
48
+ gap: 1.5rem;
49
+ }
50
+
51
+ .memori--login-drawer--otp-form label {
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 0.5rem;
55
+ text-align: left;
56
+ }
57
+
58
+
43
59
  .memori--login-drawer--form label:not(.memori-checkbox) {
44
60
  display: flex;
45
61
  flex-direction: column;
@@ -141,4 +157,290 @@ h3.memori--login-drawer--edit-account-title {
141
157
  font-size: 1.33rem;
142
158
  font-weight: 400;
143
159
  line-height: 1.2;
160
+ }
161
+
162
+ /* OTP Login Styles */
163
+ .memori--login-drawer--welcome {
164
+ padding: 1rem 0.5rem;
165
+ text-align: center;
166
+ }
167
+
168
+ .memori--login-drawer--welcome h3 {
169
+ margin: 0 0 1rem;
170
+ color: var(--memori-text-color, #333);
171
+ font-size: 1.5rem;
172
+ font-weight: 600;
173
+ }
174
+
175
+ .memori--login-drawer--welcome-description {
176
+ margin: 0 0 2rem;
177
+ color: var(--memori-text-secondary, #666);
178
+ font-size: 1rem;
179
+ line-height: 1.5;
180
+ }
181
+
182
+ .memori--login-drawer--otp-info {
183
+ display: flex;
184
+ flex-direction: column;
185
+ margin: 0 0 2rem;
186
+ gap: 1rem;
187
+ text-align: left;
188
+ }
189
+
190
+ .memori--login-drawer--otp-info-item {
191
+ display: flex;
192
+ align-items: center;
193
+ padding: 1rem;
194
+ border: 1px solid var(--memori-border-color, #e9ecef);
195
+ border-radius: 8px;
196
+ background: var(--memori-background-light, #f8f9fa);
197
+ gap: 1rem;
198
+ }
199
+
200
+ .memori--login-drawer--otp-info-number {
201
+ display: flex;
202
+ width: 32px;
203
+ height: 32px;
204
+ flex-shrink: 0;
205
+ align-items: center;
206
+ justify-content: center;
207
+ border-radius: 50%;
208
+ background: var(--memori-primary);
209
+ color: white;
210
+ font-size: 0.875rem;
211
+ font-weight: 600;
212
+ }
213
+
214
+ .memori--login-drawer--start-otp-button {
215
+ width: 100%;
216
+ margin-bottom: 1rem;
217
+ }
218
+
219
+ .memori--login-drawer--otp-container {
220
+ padding: 1rem 0.5rem;
221
+ text-align: center;
222
+ }
223
+
224
+ .memori--login-drawer--otp-container h3 {
225
+ margin: 0 0 1rem;
226
+ color: var(--memori-text-color, #333);
227
+ font-size: 1.5rem;
228
+ font-weight: 600;
229
+ }
230
+
231
+ .memori--login-drawer--otp-description {
232
+ margin: 0 0 2rem;
233
+ color: var(--memori-text-secondary, #666);
234
+ font-size: 1rem;
235
+ line-height: 1.5;
236
+ }
237
+ .memori--login-drawer--otp-form label span {
238
+ color: var(--memori-text-color, #333);
239
+ font-size: 0.875rem;
240
+ font-weight: 600;
241
+ letter-spacing: 0.05em;
242
+ text-transform: uppercase;
243
+ }
244
+
245
+ .memori--login-drawer--otp-username-input {
246
+ width: 95%;
247
+ height: 50px;
248
+ padding: 0 1rem;
249
+ border: 2px solid var(--memori-border-color, #e9ecef);
250
+ border-radius: 8px;
251
+ background: var(--memori-background, #fff);
252
+ font-size: 1rem;
253
+ font-weight: 500;
254
+ outline: none;
255
+ text-align: left;
256
+ transition: all 0.2s ease;
257
+ }
258
+
259
+ .memori--login-drawer--otp-username-input:focus {
260
+ border-color: var(--memori-primary);
261
+ box-shadow: 0 0 0 3px rgba(var(--memori-primary-rgb, 0, 123, 255), 0.1);
262
+ transform: translateY(-1px);
263
+ }
264
+
265
+ .memori--login-drawer--otp-username-input::placeholder {
266
+ color: var(--memori-text-muted, #999);
267
+ font-weight: 400;
268
+ }
269
+
270
+ .memori--login-drawer--otp-input {
271
+ width: 200px;
272
+ height: 60px;
273
+ border: 2px solid var(--memori-border-color, #e9ecef);
274
+ border-radius: 12px;
275
+ margin: 0 auto;
276
+ background: var(--memori-background, #fff);
277
+ font-size: 2rem;
278
+ font-weight: 600;
279
+ letter-spacing: 0.5rem;
280
+ outline: none;
281
+ text-align: center;
282
+ transition: all 0.2s ease;
283
+ }
284
+
285
+ .memori--login-drawer--otp-input:focus {
286
+ border-color: var(--memori-primary);
287
+ box-shadow: 0 0 0 3px rgba(var(--memori-primary-rgb, 0, 123, 255), 0.1);
288
+ transform: scale(1.02);
289
+ }
290
+
291
+ .memori--login-drawer--otp-input::placeholder {
292
+ color: var(--memori-text-muted, #999);
293
+ letter-spacing: 0.5rem;
294
+ }
295
+
296
+ .memori--login-drawer--otp-input:invalid {
297
+ border-color: var(--memori-error-color);
298
+ animation: shake 0.5s ease-in-out;
299
+ }
300
+
301
+ @keyframes shake {
302
+ 0%, 100% { transform: translateX(0); }
303
+ 25% { transform: translateX(-5px); }
304
+ 75% { transform: translateX(5px); }
305
+ }
306
+
307
+ .memori--login-drawer--otp-username-input:invalid {
308
+ border-color: var(--memori-error-color);
309
+ animation: shake 0.5s ease-in-out;
310
+ }
311
+
312
+ .memori--login-drawer--otp-timer {
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: center;
316
+ padding: 0.75rem 1rem;
317
+ border: 1px solid var(--memori-warning-color, #ffc107);
318
+ border-radius: 8px;
319
+ margin: 0 0 1.5rem;
320
+ background: rgba(var(--memori-warning-color-rgb, 255, 193, 7), 0.1);
321
+ color: var(--memori-warning-color, #ffc107);
322
+ font-size: 0.875rem;
323
+ font-weight: 600;
324
+ gap: 0.5rem;
325
+ }
326
+
327
+ .memori--login-drawer--otp-timer::before {
328
+ content: "⏱️";
329
+ font-size: 1rem;
330
+ }
331
+
332
+ .memori--login-drawer--otp-actions {
333
+ display: flex;
334
+ flex-wrap: wrap;
335
+ justify-content: center;
336
+ gap: 1rem;
337
+ }
338
+
339
+ .memori--login-drawer--otp-actions .memori-button {
340
+ min-width: 120px;
341
+ }
342
+
343
+ .memori--login-drawer--otp-error {
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ padding: 0.75rem 1rem;
348
+ border: 1px solid var(--memori-error-color);
349
+ border-radius: 8px;
350
+ margin: 1rem 0 0;
351
+ animation: slideIn 0.3s ease-out;
352
+ background: rgba(var(--memori-error-color-rgb, 220, 53, 69), 0.1);
353
+ color: var(--memori-error-color);
354
+ font-size: 0.875rem;
355
+ font-weight: 500;
356
+ gap: 0.5rem;
357
+ text-align: center;
358
+ }
359
+
360
+ .memori--login-drawer--otp-error::before {
361
+ content: "⚠️";
362
+ font-size: 1rem;
363
+ }
364
+
365
+ @keyframes slideIn {
366
+ from {
367
+ opacity: 0;
368
+ transform: translateY(-10px);
369
+ }
370
+ to {
371
+ opacity: 1;
372
+ transform: translateY(0);
373
+ }
374
+ }
375
+
376
+ /* Loading state for OTP form */
377
+ .memori--login-drawer--otp-form.loading {
378
+ opacity: 0.7;
379
+ pointer-events: none;
380
+ }
381
+
382
+ .memori--login-drawer--otp-form.loading .memori--login-drawer--otp-username-input,
383
+ .memori--login-drawer--otp-form.loading .memori--login-drawer--otp-input {
384
+ background: var(--memori-background-light, #f8f9fa);
385
+ cursor: not-allowed;
386
+ }
387
+
388
+ /* Success state animation */
389
+ @keyframes successPulse {
390
+ 0% { transform: scale(1); }
391
+ 50% { transform: scale(1.05); }
392
+ 100% { transform: scale(1); }
393
+ }
394
+
395
+ .memori--login-drawer--otp-input.success {
396
+ border-color: var(--memori-success-color, #28a745);
397
+ animation: successPulse 0.6s ease-in-out;
398
+ background: rgba(var(--memori-success-color-rgb, 40, 167, 69), 0.1);
399
+ }
400
+
401
+ /* Responsive adjustments */
402
+ @media (max-width: 768px) {
403
+ .memori--login-drawer--otp-form {
404
+ padding: 0 0.5rem;
405
+ gap: 1rem;
406
+ }
407
+
408
+ .memori--login-drawer--otp-info {
409
+ gap: 0.75rem;
410
+ }
411
+
412
+ .memori--login-drawer--otp-info-item {
413
+ padding: 0.75rem;
414
+ }
415
+ }
416
+
417
+ @media (max-width: 480px) {
418
+ .memori--login-drawer--otp-input {
419
+ width: 160px;
420
+ height: 50px;
421
+ font-size: 1.5rem;
422
+ letter-spacing: 0.3rem;
423
+ }
424
+
425
+ .memori--login-drawer--otp-username-input {
426
+ height: 45px;
427
+ font-size: 0.9rem;
428
+ }
429
+
430
+ .memori--login-drawer--otp-actions {
431
+ flex-direction: column;
432
+ align-items: center;
433
+ gap: 0.75rem;
434
+ }
435
+
436
+ .memori--login-drawer--otp-actions .memori-button {
437
+ width: 100%;
438
+ max-width: 200px;
439
+ }
440
+
441
+ .memori--login-drawer--otp-timer,
442
+ .memori--login-drawer--otp-error {
443
+ padding: 0.5rem 0.75rem;
444
+ font-size: 0.8rem;
445
+ }
144
446
  }
@@ -76,3 +76,28 @@ LoggedIn.args = {
76
76
  user,
77
77
  loginToken: 'token',
78
78
  };
79
+
80
+ export const OtpForm = Template.bind({});
81
+ OtpForm.args = {
82
+ open: true,
83
+ // Note: OTP form is shown by default in the new implementation
84
+ // when user is not logged in and not in signup mode
85
+ };
86
+
87
+ export const OtpFormWithTimer = Template.bind({});
88
+ OtpFormWithTimer.args = {
89
+ open: true,
90
+ // Timer will be shown when OTP form is active
91
+ };
92
+
93
+ export const OtpFormWithError = Template.bind({});
94
+ OtpFormWithError.args = {
95
+ open: true,
96
+ // Error state would be shown during OTP validation
97
+ };
98
+
99
+ export const OtpFormLoading = Template.bind({});
100
+ OtpFormLoading.args = {
101
+ open: true,
102
+ // Loading state would be shown during OTP validation
103
+ };
@@ -131,3 +131,59 @@ it('renders LoginDrawer on change password unchanged', () => {
131
131
  );
132
132
  expect(container).toMatchSnapshot();
133
133
  });
134
+
135
+ it('renders LoginDrawer with OTP form unchanged', () => {
136
+ const { container } = render(
137
+ <LoginDrawer
138
+ onClose={jest.fn()}
139
+ apiClient={memoriApiClient()}
140
+ tenant={tenant}
141
+ onLogin={jest.fn()}
142
+ onLogout={jest.fn()}
143
+ open
144
+ />
145
+ );
146
+ expect(container).toMatchSnapshot();
147
+ });
148
+
149
+ it('renders LoginDrawer with OTP form and timer unchanged', () => {
150
+ const { container } = render(
151
+ <LoginDrawer
152
+ onClose={jest.fn()}
153
+ apiClient={memoriApiClient()}
154
+ tenant={tenant}
155
+ onLogin={jest.fn()}
156
+ onLogout={jest.fn()}
157
+ open
158
+ />
159
+ );
160
+ expect(container).toMatchSnapshot();
161
+ });
162
+
163
+ it('renders LoginDrawer with OTP form and error unchanged', () => {
164
+ const { container } = render(
165
+ <LoginDrawer
166
+ onClose={jest.fn()}
167
+ apiClient={memoriApiClient()}
168
+ tenant={tenant}
169
+ onLogin={jest.fn()}
170
+ onLogout={jest.fn()}
171
+ open
172
+ />
173
+ );
174
+ expect(container).toMatchSnapshot();
175
+ });
176
+
177
+ it('renders LoginDrawer with OTP form loading unchanged', () => {
178
+ const { container } = render(
179
+ <LoginDrawer
180
+ onClose={jest.fn()}
181
+ apiClient={memoriApiClient()}
182
+ tenant={tenant}
183
+ onLogin={jest.fn()}
184
+ onLogout={jest.fn()}
185
+ open
186
+ />
187
+ );
188
+ expect(container).toMatchSnapshot();
189
+ });
@@ -544,4 +544,4 @@ const LoginDrawer = ({
544
544
  );
545
545
  };
546
546
 
547
- export default LoginDrawer;
547
+ export default LoginDrawer;
@@ -57,3 +57,35 @@ exports[`renders LoginDrawer unlogged unchanged 1`] = `
57
57
  />
58
58
  </div>
59
59
  `;
60
+
61
+ exports[`renders LoginDrawer with OTP form and error unchanged 1`] = `
62
+ <div>
63
+ <div
64
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
65
+ />
66
+ </div>
67
+ `;
68
+
69
+ exports[`renders LoginDrawer with OTP form and timer unchanged 1`] = `
70
+ <div>
71
+ <div
72
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
73
+ />
74
+ </div>
75
+ `;
76
+
77
+ exports[`renders LoginDrawer with OTP form loading unchanged 1`] = `
78
+ <div>
79
+ <div
80
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
81
+ />
82
+ </div>
83
+ `;
84
+
85
+ exports[`renders LoginDrawer with OTP form unchanged 1`] = `
86
+ <div>
87
+ <div
88
+ style="position: fixed; top: 1px; left: 1px; width: 1px; height: 0px; padding: 0px; margin: -1px; overflow: hidden; clip: rect(0px, 0px, 0px, 0px); white-space: nowrap; border-width: 0px; display: none;"
89
+ />
90
+ </div>
91
+ `;
@@ -19,7 +19,7 @@
19
19
 
20
20
  /* Override drawer width for ArtifactDrawer */
21
21
  .memori-artifact-panel-drawer {
22
- --memori-drawer--width-lg: 50%;
22
+ --memori-drawer--width-lg: 46%;
23
23
  }
24
24
 
25
25
  /* Main Drawer Container (Mobile Only) */
@@ -441,7 +441,7 @@ const MemoriWidget = ({
441
441
  showReasoning,
442
442
  height = '100vh',
443
443
  secret,
444
- baseUrl = 'https://aisuru.com',
444
+ baseUrl = 'https://aisuru-staging.aclambda.online',
445
445
  apiURL = 'https://backend-staging.memori.ai',
446
446
  engineURL = 'https://engine-staging.memori.ai',
447
447
  initialContextVars,
@@ -12,9 +12,6 @@
12
12
  flex-direction: column;
13
13
  }
14
14
 
15
- .memori-chat-layout--main, .memori-chat-layout--controls{
16
- min-height: calc(100% - 25px);
17
- }
18
15
 
19
16
  .memori-chat-layout--header {
20
17
  text-align: right;
@@ -62,6 +59,8 @@
62
59
  z-index: 5;
63
60
  overflow: hidden;
64
61
  min-width: 0;
62
+ height: calc(100% - 50px);
63
+ max-height: calc(100% - 50px);
65
64
  flex: 1;
66
65
  transition: all 0.05s ease-in-out;
67
66
  }
@@ -134,6 +133,10 @@
134
133
  bottom: auto;
135
134
  }
136
135
 
136
+ .memori-chat-layout--controls .memori-chat--wrapper {
137
+ height: calc(100% - 1rem);
138
+ }
139
+
137
140
  @media (max-width: 870px) {
138
141
  .memori-chat-layout .memori--powered-by {
139
142
  top: 3.5rem;
@@ -149,9 +152,7 @@
149
152
  }
150
153
 
151
154
 
152
- .memori-chat-layout--controls .memori-chat--wrapper {
153
- height: calc(75vh - 1rem);
154
- }
155
+
155
156
 
156
157
  .memori-chat-layout .memori-chat--content {
157
158
  padding: 0;
@@ -408,5 +408,6 @@ Test.args = {
408
408
  layout: 'FULLPAGE',
409
409
  uiLang: 'EN',
410
410
  spokenLang: 'EN',
411
+ showLogin: true,
411
412
  integrationID: '2b37c25d-8cf9-456f-b9ee-2c27dc4d54fc',
412
413
  };
@@ -240,6 +240,9 @@
240
240
  "logout": "Abmelden",
241
241
  "user": "Benutzer",
242
242
  "loggedDrawerTitle": "Hallo, {{name}}!",
243
+ "userNameRequired": "Benutzername erforderlich",
244
+ "userName": "Benutzername",
245
+ "userNamePlaceholder": "Geben Sie den Benutzernamen ein",
243
246
  "loginDrawerTitle": "Login",
244
247
  "signupDrawerTitle": "Melden Sie sich an",
245
248
  "newUserSignUp": "Neuer Benutzer?",
@@ -257,6 +260,20 @@
257
260
  "otpCode": "Bestätigungscode",
258
261
  "resendVerificationCode": "Code erneut senden",
259
262
  "resentVerificationCode": "Bestätigungscode gesendet! ",
263
+ "welcomeTitle": "Willkommen zurück",
264
+ "welcomeDescription": "Geben Sie Ihren 4-stelligen Bestätigungscode ein, um zu Ihrem Konto fortzufahren",
265
+ "otpTitle": "Bestätigungscode eingeben",
266
+ "otpDescription": "Geben Sie den 4-stelligen Code ein, den Sie in Ihrem Konto generiert haben",
267
+ "otpStep1": "Klicken Sie auf die Schaltfläche unten, um Ihr Konto zu öffnen",
268
+ "otpStep2": "Generieren Sie einen 4-stelligen Bestätigungscode (60 Sekunden gültig)",
269
+ "otpStep3": "Kehren Sie hierher zurück und geben Sie den Code ein",
270
+ "startOtpLogin": "Verifizierung starten",
271
+ "generateOtp": "Code generieren",
272
+ "otpTimer": "Code läuft in {{seconds}} Sekunden ab",
273
+ "otpInvalidFormat": "Bitte geben Sie einen gültigen 4-stelligen Code ein",
274
+ "otpInvalid": "Ungültiger Bestätigungscode",
275
+ "otpError": "Fehler bei der Code-Validierung. Bitte versuchen Sie es erneut.",
276
+ "otpSuccess": "Anmeldung erfolgreich!",
260
277
  "password": "Passwort",
261
278
  "newPassword": "Neues Passwort",
262
279
  "confirmPassword": "Passwort bestätigen",
@@ -261,6 +261,9 @@
261
261
  "logout": "Logout",
262
262
  "user": "User",
263
263
  "loggedDrawerTitle": "Hi, {{name}}!",
264
+ "userNameRequired": "Username required",
265
+ "userName": "Username",
266
+ "userNamePlaceholder": "Enter username",
264
267
  "loginDrawerTitle": "Login",
265
268
  "signupDrawerTitle": "Sign up",
266
269
  "newUserSignUp": "New user?",
@@ -278,6 +281,20 @@
278
281
  "otpCode": "Verification code",
279
282
  "resendVerificationCode": "Resend code",
280
283
  "resentVerificationCode": "Confirmation code sent! Please check your email.",
284
+ "welcomeTitle": "Welcome back",
285
+ "welcomeDescription": "Enter your 4-digit verification code to continue to your account",
286
+ "otpTitle": "Enter verification code",
287
+ "otpDescription": "Enter the 4-digit code you generated in your account",
288
+ "otpStep1": "Click the button below to open your account",
289
+ "otpStep2": "Generate a 4-digit verification code (valid for 60 seconds)",
290
+ "otpStep3": "Return here and enter the code",
291
+ "startOtpLogin": "Start verification",
292
+ "generateOtp": "Generate code",
293
+ "otpTimer": "Code expires in {{seconds}} seconds",
294
+ "otpInvalidFormat": "Please enter a valid 4-digit code",
295
+ "otpInvalid": "Invalid verification code",
296
+ "otpError": "Error validating code. Please try again.",
297
+ "otpSuccess": "Login successful!",
281
298
  "password": "Password",
282
299
  "newPassword": "New password",
283
300
  "confirmPassword": "Confirm Password",
@@ -241,6 +241,9 @@
241
241
  "user": "Usuario",
242
242
  "loggedDrawerTitle": "Hola, {{name}}!",
243
243
  "loginDrawerTitle": "Acceso",
244
+ "userNameRequired": "Nombre de usuario requerido",
245
+ "userName": "Nombre de usuario",
246
+ "userNamePlaceholder": "Ingrese el nombre de usuario",
244
247
  "signupDrawerTitle": "Inscribirse",
245
248
  "newUserSignUp": "¿Nuevo usuario?",
246
249
  "signUp": "¡Inscribirse!",
@@ -257,6 +260,20 @@
257
260
  "otpCode": "Código de verificación",
258
261
  "resendVerificationCode": "Reenviar código",
259
262
  "resentVerificationCode": "¡Código de confirmación enviado! ",
263
+ "welcomeTitle": "Bienvenido de nuevo",
264
+ "welcomeDescription": "Ingresa tu código de verificación de 4 dígitos para continuar a tu cuenta",
265
+ "otpTitle": "Ingresa el código de verificación",
266
+ "otpDescription": "Ingresa el código de 4 dígitos que generaste en tu cuenta",
267
+ "otpStep1": "Haz clic en el botón de abajo para abrir tu cuenta",
268
+ "otpStep2": "Genera un código de verificación de 4 dígitos (válido por 60 segundos)",
269
+ "otpStep3": "Regresa aquí e ingresa el código",
270
+ "startOtpLogin": "Iniciar verificación",
271
+ "generateOtp": "Generar código",
272
+ "otpTimer": "El código expira en {{seconds}} segundos",
273
+ "otpInvalidFormat": "Por favor ingresa un código válido de 4 dígitos",
274
+ "otpInvalid": "Código de verificación inválido",
275
+ "otpError": "Error al validar el código. Por favor intenta de nuevo.",
276
+ "otpSuccess": "¡Inicio de sesión exitoso!",
260
277
  "password": "Contraseña",
261
278
  "newPassword": "Nueva contraseña",
262
279
  "confirmPassword": "confirmar Contraseña",
@@ -249,6 +249,9 @@
249
249
  "logout": "Déconnexion",
250
250
  "user": "Utilisateur",
251
251
  "loggedDrawerTitle": "Salut, {{name}}!",
252
+ "userNameRequired": "Nom d'utilisateur requis",
253
+ "userName": "Nom d'utilisateur",
254
+ "userNamePlaceholder": "Inserisci le nom d'utilisateur",
252
255
  "loginDrawerTitle": "Se connecter",
253
256
  "signupDrawerTitle": "S'inscrire",
254
257
  "newUserSignUp": "Nouvel utilisateur ?",
@@ -266,6 +269,20 @@
266
269
  "otpCode": "Le code de vérification",
267
270
  "resendVerificationCode": "Renvoyer le code",
268
271
  "resentVerificationCode": "Code de confirmation envoyé ! ",
272
+ "welcomeTitle": "Bon retour",
273
+ "welcomeDescription": "Entrez votre code de vérification à 4 chiffres pour continuer vers votre compte",
274
+ "otpTitle": "Entrez le code de vérification",
275
+ "otpDescription": "Entrez le code à 4 chiffres que vous avez généré dans votre compte",
276
+ "otpStep1": "Cliquez sur le bouton ci-dessous pour ouvrir votre compte",
277
+ "otpStep2": "Générez un code de vérification à 4 chiffres (valide pendant 60 secondes)",
278
+ "otpStep3": "Revenez ici et entrez le code",
279
+ "startOtpLogin": "Commencer la vérification",
280
+ "generateOtp": "Générer le code",
281
+ "otpTimer": "Le code expire dans {{seconds}} secondes",
282
+ "otpInvalidFormat": "Veuillez entrer un code valide à 4 chiffres",
283
+ "otpInvalid": "Code de vérification invalide",
284
+ "otpError": "Erreur lors de la validation du code. Veuillez réessayer.",
285
+ "otpSuccess": "Connexion réussie !",
269
286
  "password": "Mot de passe",
270
287
  "newPassword": "Nouveau mot de passe",
271
288
  "confirmPassword": "Confirmez le mot de passe",
@@ -260,6 +260,9 @@
260
260
  "login": {
261
261
  "login": "Accedi",
262
262
  "logout": "Esci",
263
+ "userNameRequired": "Il nome utente è obbligatorio",
264
+ "userName": "Nome utente",
265
+ "userNamePlaceholder": "Inserisci il nome utente",
263
266
  "user": "Utente",
264
267
  "loggedDrawerTitle": "Ciao, {{name}}!",
265
268
  "loginDrawerTitle": "Accedi",
@@ -279,6 +282,20 @@
279
282
  "otpCode": "Codice di verifica",
280
283
  "resendVerificationCode": "Invia di nuovo",
281
284
  "resentVerificationCode": "Codice di verifica inviato! Controlla la tua mail.",
285
+ "welcomeTitle": "Bentornato",
286
+ "welcomeDescription": "Inserisci il tuo codice di verifica a 4 cifre per continuare al tuo account",
287
+ "otpTitle": "Inserisci il codice di verifica",
288
+ "otpDescription": "Inserisci il codice a 4 cifre che hai generato nel tuo account",
289
+ "otpStep1": "Clicca il pulsante qui sotto per aprire il tuo account",
290
+ "otpStep2": "Genera un codice di verifica a 4 cifre (valido per 60 secondi)",
291
+ "otpStep3": "Torna qui e inserisci il codice",
292
+ "startOtpLogin": "Inizia verifica",
293
+ "generateOtp": "Genera codice",
294
+ "otpTimer": "Il codice scade tra {{seconds}} secondi",
295
+ "otpInvalidFormat": "Inserisci un codice valido a 4 cifre",
296
+ "otpInvalid": "Codice di verifica non valido",
297
+ "otpError": "Errore nella validazione del codice. Riprova.",
298
+ "otpSuccess": "Login effettuato con successo!",
282
299
  "password": "Password",
283
300
  "newPassword": "Nuova password",
284
301
  "confirmPassword": "Conferma la password",