@nextsparkjs/core 0.1.0-beta.149 → 0.1.0-beta.150
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/components/dashboard/block-editor/block-picker.d.ts +6 -1
- package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/block-picker.js +34 -12
- package/dist/components/dashboard/block-editor/block-preview-canvas.d.ts +2 -1
- package/dist/components/dashboard/block-editor/block-preview-canvas.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/block-preview-canvas.js +5 -0
- package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/builder-editor-view.js +41 -13
- package/dist/components/dashboard/block-editor/floating-block-toolbar.d.ts +2 -1
- package/dist/components/dashboard/block-editor/floating-block-toolbar.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/floating-block-toolbar.js +17 -1
- package/dist/components/dashboard/block-editor/tree-view-node.d.ts +4 -1
- package/dist/components/dashboard/block-editor/tree-view-node.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/tree-view-node.js +52 -1
- package/dist/components/dashboard/block-editor/tree-view.d.ts +4 -1
- package/dist/components/dashboard/block-editor/tree-view.d.ts.map +1 -1
- package/dist/components/dashboard/block-editor/tree-view.js +6 -0
- package/dist/components/entities/EntityTable.d.ts +1 -1
- package/dist/components/entities/EntityTable.d.ts.map +1 -1
- package/dist/components/entities/EntityTable.js +14 -1
- package/dist/components/entities/entity-table.types.d.ts +2 -0
- package/dist/components/entities/entity-table.types.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityListWrapper.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityListWrapper.js +19 -1
- package/dist/emails/otp-verification.d.ts +9 -0
- package/dist/emails/otp-verification.d.ts.map +1 -0
- package/dist/emails/otp-verification.js +72 -0
- package/dist/emails/reset-password.d.ts +9 -0
- package/dist/emails/reset-password.d.ts.map +1 -0
- package/dist/emails/reset-password.js +95 -0
- package/dist/emails/team-invitation.d.ts +9 -0
- package/dist/emails/team-invitation.d.ts.map +1 -0
- package/dist/emails/team-invitation.js +93 -0
- package/dist/emails/verify-email.d.ts +13 -0
- package/dist/emails/verify-email.d.ts.map +1 -0
- package/dist/emails/verify-email.js +84 -0
- package/dist/lib/api/entities.d.ts +6 -1
- package/dist/lib/api/entities.d.ts.map +1 -1
- package/dist/lib/api/entities.js +23 -2
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +12 -7
- package/dist/lib/blocks/clipboard.d.ts +11 -0
- package/dist/lib/blocks/clipboard.d.ts.map +1 -0
- package/dist/lib/blocks/clipboard.js +30 -0
- package/dist/lib/email/index.d.ts +1 -0
- package/dist/lib/email/index.d.ts.map +1 -1
- package/dist/lib/email/index.js +12 -0
- package/dist/lib/email/send.d.ts +15 -0
- package/dist/lib/email/send.d.ts.map +1 -0
- package/dist/lib/email/send.js +11 -0
- package/dist/lib/email/templates.d.ts +42 -29
- package/dist/lib/email/templates.d.ts.map +1 -1
- package/dist/lib/email/templates.js +8 -303
- package/dist/lib/email/types.d.ts +32 -0
- package/dist/lib/email/types.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.d.ts +2 -2
- package/dist/lib/services/subscription.service.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.js +6 -6
- package/dist/messages/de/email.json +58 -0
- package/dist/messages/en/admin.json +6 -2
- package/dist/messages/en/email.json +58 -0
- package/dist/messages/en/index.d.ts +4 -0
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/es/admin.json +6 -2
- package/dist/messages/es/email.json +58 -0
- package/dist/messages/es/index.d.ts +4 -0
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/fr/email.json +58 -0
- package/dist/messages/it/email.json +58 -0
- package/dist/messages/pt/email.json +58 -0
- package/dist/styles/classes.json +3 -2
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +9 -7
- package/dist/templates/contents/themes/starter/emails/_README.md +69 -0
- package/dist/templates/contents/themes/starter/emails/verify-email.ts +34 -0
- package/package.json +6 -2
- package/scripts/build/registry/discovery/emails.mjs +146 -0
- package/scripts/build/registry/generators/email-registry.mjs +94 -0
- package/scripts/build/registry.mjs +8 -4
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +9 -7
- package/templates/contents/themes/starter/emails/_README.md +69 -0
- package/templates/contents/themes/starter/emails/verify-email.ts +34 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/email-registry.ts +41 -0
- package/tests/jest/__mocks__/next-intl-server.js +55 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Willkommen bei {appName} - Bestätige deine E-Mail",
|
|
4
|
+
"headerSubtitle": "Willkommen in deinem Konto",
|
|
5
|
+
"title": "E-Mail-Adresse bestätigen",
|
|
6
|
+
"greetingPrefix": "Hallo",
|
|
7
|
+
"intro": "Danke für deine Anmeldung! Wir freuen uns, dich an Bord zu haben. Bitte bestätige deine E-Mail-Adresse, um dein Konto zu aktivieren und loszulegen.",
|
|
8
|
+
"buttonLabel": "E-Mail bestätigen",
|
|
9
|
+
"helpHeading": "Kannst du den Button nicht klicken?",
|
|
10
|
+
"helpInstructions": "Kopiere diesen Link und füge ihn in deinen Browser ein:",
|
|
11
|
+
"copyright": "© {year} {appName}. Alle Rechte vorbehalten.",
|
|
12
|
+
"footerLine1": "Diese E-Mail wurde an dich gesendet, weil du dich bei {appName} angemeldet hast.",
|
|
13
|
+
"footerLine2": "Wenn du das nicht angefordert hast, ignoriere diese E-Mail bitte."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Passwort zurücksetzen - {appName}",
|
|
17
|
+
"headerSubtitle": "Anfrage zum Zurücksetzen des Passworts",
|
|
18
|
+
"title": "Passwort zurücksetzen",
|
|
19
|
+
"greetingPrefix": "Hallo",
|
|
20
|
+
"intro": "Wir haben eine Anfrage zum Zurücksetzen des Passworts deines Kontos erhalten. Klicke auf den Button, um ein neues Passwort zu erstellen:",
|
|
21
|
+
"buttonLabel": "Passwort zurücksetzen",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Wichtiger Sicherheitshinweis",
|
|
23
|
+
"securityNoticeExpiry": "Aus Sicherheitsgründen läuft dieser Link in {expiresIn} ab.",
|
|
24
|
+
"securityNoticeIgnore": "Wenn du dieses Zurücksetzen nicht angefordert hast, ignoriere diese E-Mail bitte – dein Passwort bleibt unverändert.",
|
|
25
|
+
"defaultExpiresIn": "1 Stunde",
|
|
26
|
+
"helpHeading": "Kannst du den Button nicht klicken?",
|
|
27
|
+
"helpInstructions": "Kopiere diesen Link und füge ihn in deinen Browser ein:",
|
|
28
|
+
"copyright": "© {year} {appName}. Alle Rechte vorbehalten.",
|
|
29
|
+
"footerLine1": "Dies ist eine automatische Sicherheits-E-Mail von {appName}.",
|
|
30
|
+
"footerLine2": "Aus Sicherheitsgründen fragen wir niemals per E-Mail nach deinem Passwort."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} ist dein Bestätigungscode - {appName}",
|
|
34
|
+
"headerSubtitle": "Bestätigungscode",
|
|
35
|
+
"title": "Dein Bestätigungscode",
|
|
36
|
+
"intro": "Gib diesen Code ein, um deine Identität zu bestätigen:",
|
|
37
|
+
"expiresNotice": "Dieser Code läuft in {minutes} Minuten ab.",
|
|
38
|
+
"ignoreNotice": "Wenn du diesen Code nicht angefordert hast, kannst du diese E-Mail ignorieren.",
|
|
39
|
+
"copyright": "© {year} {appName}. Alle Rechte vorbehalten.",
|
|
40
|
+
"footerLine1": "Dies ist eine automatische E-Mail von {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "Du wurdest eingeladen, {teamName} bei {appName} beizutreten",
|
|
44
|
+
"headerSubtitle": "Team-Einladung",
|
|
45
|
+
"title": "Du bist eingeladen!",
|
|
46
|
+
"bodyIntro": "{inviterName} hat dich eingeladen, dem Team {teamName} als {role} beizutreten.",
|
|
47
|
+
"bodyAction": "Klicke auf den Button, um die Einladung anzunehmen und dem Team beizutreten:",
|
|
48
|
+
"buttonLabel": "Einladung annehmen",
|
|
49
|
+
"detailsTitle": "⏰ Einladungsdetails",
|
|
50
|
+
"detailsExpiry": "Diese Einladung läuft in {expiresIn} ab.",
|
|
51
|
+
"detailsCreateAccount": "Wenn du noch kein Konto hast, kannst du beim Annehmen eines erstellen.",
|
|
52
|
+
"helpHeading": "Kannst du den Button nicht klicken?",
|
|
53
|
+
"helpInstructions": "Kopiere diesen Link und füge ihn in deinen Browser ein:",
|
|
54
|
+
"copyright": "© {year} {appName}. Alle Rechte vorbehalten.",
|
|
55
|
+
"footerSentTo": "Diese Einladung wurde an {inviteeEmail} gesendet.",
|
|
56
|
+
"footerUnexpected": "Wenn du diese Einladung nicht erwartet hast, kannst du diese E-Mail ignorieren."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -256,6 +256,7 @@
|
|
|
256
256
|
},
|
|
257
257
|
"floatingToolbar": {
|
|
258
258
|
"drag": "Drag to reorder",
|
|
259
|
+
"copy": "Copy block",
|
|
259
260
|
"duplicate": "Duplicate block",
|
|
260
261
|
"delete": "Delete block"
|
|
261
262
|
},
|
|
@@ -304,11 +305,14 @@
|
|
|
304
305
|
"loading": "Loading preview..."
|
|
305
306
|
},
|
|
306
307
|
"layout": {
|
|
307
|
-
"empty": "No blocks added yet"
|
|
308
|
+
"empty": "No blocks added yet",
|
|
309
|
+
"pasteBlock": "Paste block"
|
|
308
310
|
},
|
|
309
311
|
"messages": {
|
|
310
312
|
"saved": "Saved successfully",
|
|
311
|
-
"created": "Created successfully"
|
|
313
|
+
"created": "Created successfully",
|
|
314
|
+
"blockCopied": "Block copied to clipboard",
|
|
315
|
+
"blockPasted": "Block pasted"
|
|
312
316
|
}
|
|
313
317
|
},
|
|
314
318
|
"patterns": {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Welcome to {appName} - Verify Your Email",
|
|
4
|
+
"headerSubtitle": "Welcome to Your Account",
|
|
5
|
+
"title": "Verify Your Email Address",
|
|
6
|
+
"greetingPrefix": "Hi",
|
|
7
|
+
"intro": "Thank you for signing up! We're excited to have you on board. Please verify your email address to activate your account and get started.",
|
|
8
|
+
"buttonLabel": "Verify Email Address",
|
|
9
|
+
"helpHeading": "Can't click the button?",
|
|
10
|
+
"helpInstructions": "Copy and paste this link into your browser:",
|
|
11
|
+
"copyright": "© {year} {appName}. All rights reserved.",
|
|
12
|
+
"footerLine1": "This email was sent to you because you signed up for {appName}.",
|
|
13
|
+
"footerLine2": "If you didn't request this, please ignore this email."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Reset Your Password - {appName}",
|
|
17
|
+
"headerSubtitle": "Password Reset Request",
|
|
18
|
+
"title": "Reset Your Password",
|
|
19
|
+
"greetingPrefix": "Hi",
|
|
20
|
+
"intro": "We received a request to reset your password for your account. Click the button below to create a new password:",
|
|
21
|
+
"buttonLabel": "Reset Password",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Important Security Information",
|
|
23
|
+
"securityNoticeExpiry": "This link will expire in {expiresIn} for your security.",
|
|
24
|
+
"securityNoticeIgnore": "If you didn't request this password reset, please ignore this email and your password will remain unchanged.",
|
|
25
|
+
"defaultExpiresIn": "1 hour",
|
|
26
|
+
"helpHeading": "Can't click the button?",
|
|
27
|
+
"helpInstructions": "Copy and paste this link into your browser:",
|
|
28
|
+
"copyright": "© {year} {appName}. All rights reserved.",
|
|
29
|
+
"footerLine1": "This is an automated security email from {appName}.",
|
|
30
|
+
"footerLine2": "For security reasons, we never ask for your password via email."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} is your verification code - {appName}",
|
|
34
|
+
"headerSubtitle": "Verification Code",
|
|
35
|
+
"title": "Your verification code",
|
|
36
|
+
"intro": "Enter this code to verify your identity:",
|
|
37
|
+
"expiresNotice": "This code expires in {minutes} minutes.",
|
|
38
|
+
"ignoreNotice": "If you didn't request this code, you can safely ignore this email.",
|
|
39
|
+
"copyright": "© {year} {appName}. All rights reserved.",
|
|
40
|
+
"footerLine1": "This is an automated email from {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "You've been invited to join {teamName} on {appName}",
|
|
44
|
+
"headerSubtitle": "Team Invitation",
|
|
45
|
+
"title": "You're Invited!",
|
|
46
|
+
"bodyIntro": "{inviterName} has invited you to join the team {teamName} as a {role}.",
|
|
47
|
+
"bodyAction": "Click the button below to accept the invitation and join the team:",
|
|
48
|
+
"buttonLabel": "Accept Invitation",
|
|
49
|
+
"detailsTitle": "⏰ Invitation Details",
|
|
50
|
+
"detailsExpiry": "This invitation will expire in {expiresIn}.",
|
|
51
|
+
"detailsCreateAccount": "If you don't have an account yet, you'll be able to create one when you accept.",
|
|
52
|
+
"helpHeading": "Can't click the button?",
|
|
53
|
+
"helpInstructions": "Copy and paste this link into your browser:",
|
|
54
|
+
"copyright": "© {year} {appName}. All rights reserved.",
|
|
55
|
+
"footerSentTo": "This invitation was sent to {inviteeEmail}.",
|
|
56
|
+
"footerUnexpected": "If you didn't expect this invitation, you can safely ignore this email."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -257,6 +257,7 @@ declare const _default: {
|
|
|
257
257
|
};
|
|
258
258
|
floatingToolbar: {
|
|
259
259
|
drag: string;
|
|
260
|
+
copy: string;
|
|
260
261
|
duplicate: string;
|
|
261
262
|
delete: string;
|
|
262
263
|
};
|
|
@@ -306,10 +307,13 @@ declare const _default: {
|
|
|
306
307
|
};
|
|
307
308
|
layout: {
|
|
308
309
|
empty: string;
|
|
310
|
+
pasteBlock: string;
|
|
309
311
|
};
|
|
310
312
|
messages: {
|
|
311
313
|
saved: string;
|
|
312
314
|
created: string;
|
|
315
|
+
blockCopied: string;
|
|
316
|
+
blockPasted: string;
|
|
313
317
|
};
|
|
314
318
|
};
|
|
315
319
|
patterns: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAqBU"}
|
|
@@ -256,6 +256,7 @@
|
|
|
256
256
|
},
|
|
257
257
|
"floatingToolbar": {
|
|
258
258
|
"drag": "Arrastra para reordenar",
|
|
259
|
+
"copy": "Copiar bloque",
|
|
259
260
|
"duplicate": "Duplicar bloque",
|
|
260
261
|
"delete": "Eliminar bloque"
|
|
261
262
|
},
|
|
@@ -304,11 +305,14 @@
|
|
|
304
305
|
"loading": "Cargando vista previa..."
|
|
305
306
|
},
|
|
306
307
|
"layout": {
|
|
307
|
-
"empty": "Aún no hay bloques agregados"
|
|
308
|
+
"empty": "Aún no hay bloques agregados",
|
|
309
|
+
"pasteBlock": "Pegar bloque"
|
|
308
310
|
},
|
|
309
311
|
"messages": {
|
|
310
312
|
"saved": "Guardado exitosamente",
|
|
311
|
-
"created": "Creado exitosamente"
|
|
313
|
+
"created": "Creado exitosamente",
|
|
314
|
+
"blockCopied": "Bloque copiado al portapapeles",
|
|
315
|
+
"blockPasted": "Bloque pegado"
|
|
312
316
|
}
|
|
313
317
|
},
|
|
314
318
|
"patterns": {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Bienvenido a {appName} - Verifica tu correo",
|
|
4
|
+
"headerSubtitle": "Bienvenido a tu cuenta",
|
|
5
|
+
"title": "Verifica tu dirección de correo",
|
|
6
|
+
"greetingPrefix": "Hola",
|
|
7
|
+
"intro": "¡Gracias por registrarte! Nos alegra tenerte con nosotros. Verifica tu dirección de correo para activar tu cuenta y empezar.",
|
|
8
|
+
"buttonLabel": "Verificar correo",
|
|
9
|
+
"helpHeading": "¿No puedes pulsar el botón?",
|
|
10
|
+
"helpInstructions": "Copia y pega este enlace en tu navegador:",
|
|
11
|
+
"copyright": "© {year} {appName}. Todos los derechos reservados.",
|
|
12
|
+
"footerLine1": "Este correo se ha enviado porque te registraste en {appName}.",
|
|
13
|
+
"footerLine2": "Si no fuiste tú, puedes ignorar este mensaje."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Restablece tu contraseña - {appName}",
|
|
17
|
+
"headerSubtitle": "Solicitud de restablecimiento",
|
|
18
|
+
"title": "Restablece tu contraseña",
|
|
19
|
+
"greetingPrefix": "Hola",
|
|
20
|
+
"intro": "Hemos recibido una solicitud para restablecer la contraseña de tu cuenta. Pulsa el botón para crear una nueva contraseña:",
|
|
21
|
+
"buttonLabel": "Restablecer contraseña",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Información de seguridad importante",
|
|
23
|
+
"securityNoticeExpiry": "Por seguridad, este enlace caduca en {expiresIn}.",
|
|
24
|
+
"securityNoticeIgnore": "Si no solicitaste este cambio, ignora este correo y tu contraseña no se modificará.",
|
|
25
|
+
"defaultExpiresIn": "1 hora",
|
|
26
|
+
"helpHeading": "¿No puedes pulsar el botón?",
|
|
27
|
+
"helpInstructions": "Copia y pega este enlace en tu navegador:",
|
|
28
|
+
"copyright": "© {year} {appName}. Todos los derechos reservados.",
|
|
29
|
+
"footerLine1": "Este es un correo automático de seguridad de {appName}.",
|
|
30
|
+
"footerLine2": "Por seguridad, nunca pedimos tu contraseña por correo."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} es tu código de verificación - {appName}",
|
|
34
|
+
"headerSubtitle": "Código de verificación",
|
|
35
|
+
"title": "Tu código de verificación",
|
|
36
|
+
"intro": "Introduce este código para verificar tu identidad:",
|
|
37
|
+
"expiresNotice": "Este código caduca en {minutes} minutos.",
|
|
38
|
+
"ignoreNotice": "Si no solicitaste este código, puedes ignorar este correo.",
|
|
39
|
+
"copyright": "© {year} {appName}. Todos los derechos reservados.",
|
|
40
|
+
"footerLine1": "Este es un correo automático de {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "Te han invitado a unirte a {teamName} en {appName}",
|
|
44
|
+
"headerSubtitle": "Invitación a equipo",
|
|
45
|
+
"title": "¡Te han invitado!",
|
|
46
|
+
"bodyIntro": "{inviterName} te ha invitado a unirte al equipo {teamName} con el rol de {role}.",
|
|
47
|
+
"bodyAction": "Pulsa el botón para aceptar la invitación y unirte al equipo:",
|
|
48
|
+
"buttonLabel": "Aceptar invitación",
|
|
49
|
+
"detailsTitle": "⏰ Detalles de la invitación",
|
|
50
|
+
"detailsExpiry": "Esta invitación caduca en {expiresIn}.",
|
|
51
|
+
"detailsCreateAccount": "Si todavía no tienes cuenta, podrás crear una al aceptar.",
|
|
52
|
+
"helpHeading": "¿No puedes pulsar el botón?",
|
|
53
|
+
"helpInstructions": "Copia y pega este enlace en tu navegador:",
|
|
54
|
+
"copyright": "© {year} {appName}. Todos los derechos reservados.",
|
|
55
|
+
"footerSentTo": "Esta invitación se envió a {inviteeEmail}.",
|
|
56
|
+
"footerUnexpected": "Si no esperabas esta invitación, puedes ignorar este correo."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -257,6 +257,7 @@ declare const _default: {
|
|
|
257
257
|
};
|
|
258
258
|
floatingToolbar: {
|
|
259
259
|
drag: string;
|
|
260
|
+
copy: string;
|
|
260
261
|
duplicate: string;
|
|
261
262
|
delete: string;
|
|
262
263
|
};
|
|
@@ -306,10 +307,13 @@ declare const _default: {
|
|
|
306
307
|
};
|
|
307
308
|
layout: {
|
|
308
309
|
empty: string;
|
|
310
|
+
pasteBlock: string;
|
|
309
311
|
};
|
|
310
312
|
messages: {
|
|
311
313
|
saved: string;
|
|
312
314
|
created: string;
|
|
315
|
+
blockCopied: string;
|
|
316
|
+
blockPasted: string;
|
|
313
317
|
};
|
|
314
318
|
};
|
|
315
319
|
patterns: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/es/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/es/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAqBU"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Bienvenue sur {appName} - Vérifiez votre e-mail",
|
|
4
|
+
"headerSubtitle": "Bienvenue dans votre compte",
|
|
5
|
+
"title": "Vérifiez votre adresse e-mail",
|
|
6
|
+
"greetingPrefix": "Bonjour",
|
|
7
|
+
"intro": "Merci de votre inscription ! Nous sommes ravis de vous compter parmi nous. Veuillez vérifier votre adresse e-mail pour activer votre compte et commencer.",
|
|
8
|
+
"buttonLabel": "Vérifier l'e-mail",
|
|
9
|
+
"helpHeading": "Le bouton ne fonctionne pas ?",
|
|
10
|
+
"helpInstructions": "Copiez et collez ce lien dans votre navigateur :",
|
|
11
|
+
"copyright": "© {year} {appName}. Tous droits réservés.",
|
|
12
|
+
"footerLine1": "Cet e-mail vous a été envoyé parce que vous vous êtes inscrit·e sur {appName}.",
|
|
13
|
+
"footerLine2": "Si vous n'êtes pas à l'origine de cette demande, ignorez cet e-mail."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Réinitialisez votre mot de passe - {appName}",
|
|
17
|
+
"headerSubtitle": "Demande de réinitialisation",
|
|
18
|
+
"title": "Réinitialisez votre mot de passe",
|
|
19
|
+
"greetingPrefix": "Bonjour",
|
|
20
|
+
"intro": "Nous avons reçu une demande de réinitialisation du mot de passe de votre compte. Cliquez sur le bouton ci-dessous pour créer un nouveau mot de passe :",
|
|
21
|
+
"buttonLabel": "Réinitialiser le mot de passe",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Information de sécurité importante",
|
|
23
|
+
"securityNoticeExpiry": "Pour votre sécurité, ce lien expire dans {expiresIn}.",
|
|
24
|
+
"securityNoticeIgnore": "Si vous n'avez pas demandé cette réinitialisation, ignorez cet e-mail ; votre mot de passe restera inchangé.",
|
|
25
|
+
"defaultExpiresIn": "1 heure",
|
|
26
|
+
"helpHeading": "Le bouton ne fonctionne pas ?",
|
|
27
|
+
"helpInstructions": "Copiez et collez ce lien dans votre navigateur :",
|
|
28
|
+
"copyright": "© {year} {appName}. Tous droits réservés.",
|
|
29
|
+
"footerLine1": "Ceci est un e-mail de sécurité automatique de {appName}.",
|
|
30
|
+
"footerLine2": "Pour des raisons de sécurité, nous ne vous demandons jamais votre mot de passe par e-mail."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} est votre code de vérification - {appName}",
|
|
34
|
+
"headerSubtitle": "Code de vérification",
|
|
35
|
+
"title": "Votre code de vérification",
|
|
36
|
+
"intro": "Saisissez ce code pour vérifier votre identité :",
|
|
37
|
+
"expiresNotice": "Ce code expire dans {minutes} minutes.",
|
|
38
|
+
"ignoreNotice": "Si vous n'avez pas demandé ce code, vous pouvez ignorer cet e-mail.",
|
|
39
|
+
"copyright": "© {year} {appName}. Tous droits réservés.",
|
|
40
|
+
"footerLine1": "Ceci est un e-mail automatique de {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "Vous avez été invité·e à rejoindre {teamName} sur {appName}",
|
|
44
|
+
"headerSubtitle": "Invitation à rejoindre une équipe",
|
|
45
|
+
"title": "Vous êtes invité·e !",
|
|
46
|
+
"bodyIntro": "{inviterName} vous a invité·e à rejoindre l'équipe {teamName} en tant que {role}.",
|
|
47
|
+
"bodyAction": "Cliquez sur le bouton ci-dessous pour accepter l'invitation et rejoindre l'équipe :",
|
|
48
|
+
"buttonLabel": "Accepter l'invitation",
|
|
49
|
+
"detailsTitle": "⏰ Détails de l'invitation",
|
|
50
|
+
"detailsExpiry": "Cette invitation expire dans {expiresIn}.",
|
|
51
|
+
"detailsCreateAccount": "Si vous n'avez pas encore de compte, vous pourrez en créer un en acceptant.",
|
|
52
|
+
"helpHeading": "Le bouton ne fonctionne pas ?",
|
|
53
|
+
"helpInstructions": "Copiez et collez ce lien dans votre navigateur :",
|
|
54
|
+
"copyright": "© {year} {appName}. Tous droits réservés.",
|
|
55
|
+
"footerSentTo": "Cette invitation a été envoyée à {inviteeEmail}.",
|
|
56
|
+
"footerUnexpected": "Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet e-mail."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Benvenuto in {appName} - Verifica la tua email",
|
|
4
|
+
"headerSubtitle": "Benvenuto nel tuo account",
|
|
5
|
+
"title": "Verifica il tuo indirizzo email",
|
|
6
|
+
"greetingPrefix": "Ciao",
|
|
7
|
+
"intro": "Grazie per esserti registrato! Siamo felici di averti con noi. Verifica il tuo indirizzo email per attivare il tuo account e iniziare.",
|
|
8
|
+
"buttonLabel": "Verifica email",
|
|
9
|
+
"helpHeading": "Non riesci a cliccare il pulsante?",
|
|
10
|
+
"helpInstructions": "Copia e incolla questo link nel tuo browser:",
|
|
11
|
+
"copyright": "© {year} {appName}. Tutti i diritti riservati.",
|
|
12
|
+
"footerLine1": "Questa email è stata inviata perché ti sei registrato su {appName}.",
|
|
13
|
+
"footerLine2": "Se non sei stato tu, ignora questa email."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Reimposta la tua password - {appName}",
|
|
17
|
+
"headerSubtitle": "Richiesta di reimpostazione password",
|
|
18
|
+
"title": "Reimposta la tua password",
|
|
19
|
+
"greetingPrefix": "Ciao",
|
|
20
|
+
"intro": "Abbiamo ricevuto una richiesta di reimpostazione della password del tuo account. Clicca il pulsante qui sotto per creare una nuova password:",
|
|
21
|
+
"buttonLabel": "Reimposta password",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Informazioni di sicurezza importanti",
|
|
23
|
+
"securityNoticeExpiry": "Per sicurezza, questo link scade tra {expiresIn}.",
|
|
24
|
+
"securityNoticeIgnore": "Se non hai richiesto questa reimpostazione, ignora questa email e la tua password rimarrà invariata.",
|
|
25
|
+
"defaultExpiresIn": "1 ora",
|
|
26
|
+
"helpHeading": "Non riesci a cliccare il pulsante?",
|
|
27
|
+
"helpInstructions": "Copia e incolla questo link nel tuo browser:",
|
|
28
|
+
"copyright": "© {year} {appName}. Tutti i diritti riservati.",
|
|
29
|
+
"footerLine1": "Questa è un'email di sicurezza automatica di {appName}.",
|
|
30
|
+
"footerLine2": "Per motivi di sicurezza, non chiediamo mai la tua password via email."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} è il tuo codice di verifica - {appName}",
|
|
34
|
+
"headerSubtitle": "Codice di verifica",
|
|
35
|
+
"title": "Il tuo codice di verifica",
|
|
36
|
+
"intro": "Inserisci questo codice per verificare la tua identità:",
|
|
37
|
+
"expiresNotice": "Questo codice scade tra {minutes} minuti.",
|
|
38
|
+
"ignoreNotice": "Se non hai richiesto questo codice, puoi ignorare questa email.",
|
|
39
|
+
"copyright": "© {year} {appName}. Tutti i diritti riservati.",
|
|
40
|
+
"footerLine1": "Questa è un'email automatica di {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "Sei stato invitato a unirti a {teamName} su {appName}",
|
|
44
|
+
"headerSubtitle": "Invito al team",
|
|
45
|
+
"title": "Sei stato invitato!",
|
|
46
|
+
"bodyIntro": "{inviterName} ti ha invitato a unirti al team {teamName} come {role}.",
|
|
47
|
+
"bodyAction": "Clicca il pulsante qui sotto per accettare l'invito e unirti al team:",
|
|
48
|
+
"buttonLabel": "Accetta invito",
|
|
49
|
+
"detailsTitle": "⏰ Dettagli dell'invito",
|
|
50
|
+
"detailsExpiry": "Questo invito scade tra {expiresIn}.",
|
|
51
|
+
"detailsCreateAccount": "Se non hai ancora un account, potrai crearne uno accettando.",
|
|
52
|
+
"helpHeading": "Non riesci a cliccare il pulsante?",
|
|
53
|
+
"helpInstructions": "Copia e incolla questo link nel tuo browser:",
|
|
54
|
+
"copyright": "© {year} {appName}. Tutti i diritti riservati.",
|
|
55
|
+
"footerSentTo": "Questo invito è stato inviato a {inviteeEmail}.",
|
|
56
|
+
"footerUnexpected": "Se non ti aspettavi questo invito, puoi ignorare questa email."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verifyEmail": {
|
|
3
|
+
"subject": "Bem-vindo a {appName} - Verifique seu e-mail",
|
|
4
|
+
"headerSubtitle": "Bem-vindo à sua conta",
|
|
5
|
+
"title": "Verifique seu endereço de e-mail",
|
|
6
|
+
"greetingPrefix": "Olá",
|
|
7
|
+
"intro": "Obrigado por se cadastrar! Estamos felizes em tê-lo conosco. Verifique seu endereço de e-mail para ativar sua conta e começar.",
|
|
8
|
+
"buttonLabel": "Verificar e-mail",
|
|
9
|
+
"helpHeading": "Não consegue clicar no botão?",
|
|
10
|
+
"helpInstructions": "Copie e cole este link no seu navegador:",
|
|
11
|
+
"copyright": "© {year} {appName}. Todos os direitos reservados.",
|
|
12
|
+
"footerLine1": "Este e-mail foi enviado porque você se cadastrou em {appName}.",
|
|
13
|
+
"footerLine2": "Se não foi você, pode ignorar esta mensagem."
|
|
14
|
+
},
|
|
15
|
+
"resetPassword": {
|
|
16
|
+
"subject": "Redefina sua senha - {appName}",
|
|
17
|
+
"headerSubtitle": "Solicitação de redefinição de senha",
|
|
18
|
+
"title": "Redefina sua senha",
|
|
19
|
+
"greetingPrefix": "Olá",
|
|
20
|
+
"intro": "Recebemos uma solicitação para redefinir a senha da sua conta. Clique no botão abaixo para criar uma nova senha:",
|
|
21
|
+
"buttonLabel": "Redefinir senha",
|
|
22
|
+
"securityNoticeTitle": "⚠️ Informação de segurança importante",
|
|
23
|
+
"securityNoticeExpiry": "Por segurança, este link expira em {expiresIn}.",
|
|
24
|
+
"securityNoticeIgnore": "Se não foi você quem solicitou, ignore este e-mail; sua senha continuará a mesma.",
|
|
25
|
+
"defaultExpiresIn": "1 hora",
|
|
26
|
+
"helpHeading": "Não consegue clicar no botão?",
|
|
27
|
+
"helpInstructions": "Copie e cole este link no seu navegador:",
|
|
28
|
+
"copyright": "© {year} {appName}. Todos os direitos reservados.",
|
|
29
|
+
"footerLine1": "Este é um e-mail de segurança automático de {appName}.",
|
|
30
|
+
"footerLine2": "Por segurança, nunca pedimos sua senha por e-mail."
|
|
31
|
+
},
|
|
32
|
+
"otpVerification": {
|
|
33
|
+
"subject": "{otp} é seu código de verificação - {appName}",
|
|
34
|
+
"headerSubtitle": "Código de verificação",
|
|
35
|
+
"title": "Seu código de verificação",
|
|
36
|
+
"intro": "Insira este código para verificar sua identidade:",
|
|
37
|
+
"expiresNotice": "Este código expira em {minutes} minutos.",
|
|
38
|
+
"ignoreNotice": "Se não foi você quem solicitou, pode ignorar este e-mail.",
|
|
39
|
+
"copyright": "© {year} {appName}. Todos os direitos reservados.",
|
|
40
|
+
"footerLine1": "Este é um e-mail automático de {appName}."
|
|
41
|
+
},
|
|
42
|
+
"teamInvitation": {
|
|
43
|
+
"subject": "Você foi convidado para entrar em {teamName} no {appName}",
|
|
44
|
+
"headerSubtitle": "Convite para a equipe",
|
|
45
|
+
"title": "Você foi convidado!",
|
|
46
|
+
"bodyIntro": "{inviterName} convidou você para entrar na equipe {teamName} como {role}.",
|
|
47
|
+
"bodyAction": "Clique no botão abaixo para aceitar o convite e entrar na equipe:",
|
|
48
|
+
"buttonLabel": "Aceitar convite",
|
|
49
|
+
"detailsTitle": "⏰ Detalhes do convite",
|
|
50
|
+
"detailsExpiry": "Este convite expira em {expiresIn}.",
|
|
51
|
+
"detailsCreateAccount": "Se ainda não tem uma conta, poderá criar uma ao aceitar.",
|
|
52
|
+
"helpHeading": "Não consegue clicar no botão?",
|
|
53
|
+
"helpInstructions": "Copie e cole este link no seu navegador:",
|
|
54
|
+
"copyright": "© {year} {appName}. Todos os direitos reservados.",
|
|
55
|
+
"footerSentTo": "Este convite foi enviado para {inviteeEmail}.",
|
|
56
|
+
"footerUnexpected": "Se você não esperava este convite, pode ignorar este e-mail."
|
|
57
|
+
}
|
|
58
|
+
}
|
package/dist/styles/classes.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated": "2026-05-
|
|
3
|
-
"totalClasses":
|
|
2
|
+
"generated": "2026-05-19T18:45:20.942Z",
|
|
3
|
+
"totalClasses": 1080,
|
|
4
4
|
"classes": [
|
|
5
5
|
"!text-2xl",
|
|
6
6
|
"''",
|
|
@@ -472,6 +472,7 @@
|
|
|
472
472
|
"hover:bg-green-50",
|
|
473
473
|
"hover:bg-green-600'",
|
|
474
474
|
"hover:bg-muted",
|
|
475
|
+
"hover:bg-muted-foreground/20",
|
|
475
476
|
"hover:bg-muted/30",
|
|
476
477
|
"hover:bg-muted/50",
|
|
477
478
|
"hover:bg-muted/70",
|
|
@@ -16,7 +16,8 @@ import { inviteMemberSchema, memberListQuerySchema } from '@nextsparkjs/core/lib
|
|
|
16
16
|
import { TeamMemberService, MembershipService } from '@nextsparkjs/core/lib/services'
|
|
17
17
|
import type { TeamMember, TeamInvitation, TeamRole, Team } from '@nextsparkjs/core/lib/teams/types'
|
|
18
18
|
import { EmailFactory } from '@nextsparkjs/core/lib/email/factory'
|
|
19
|
-
import {
|
|
19
|
+
import { sendTeamInvitationEmail } from '@nextsparkjs/core/lib/email/send'
|
|
20
|
+
import { I18N_CONFIG } from '@nextsparkjs/core/lib/config'
|
|
20
21
|
|
|
21
22
|
// Role hierarchy for invite validation (higher number = more power)
|
|
22
23
|
const ROLE_HIERARCHY: Record<TeamRole, number> = {
|
|
@@ -310,14 +311,15 @@ export const POST = withRateLimitTier(withApiLogging(
|
|
|
310
311
|
try {
|
|
311
312
|
const emailProvider = EmailFactory.getInstance()
|
|
312
313
|
const inviterName = authResult.user!.email // Use email as inviter name
|
|
313
|
-
const emailContent =
|
|
314
|
-
validatedData.email,
|
|
314
|
+
const emailContent = await sendTeamInvitationEmail({
|
|
315
|
+
inviteeEmail: validatedData.email,
|
|
315
316
|
inviterName,
|
|
316
|
-
team.name,
|
|
317
|
-
validatedData.role,
|
|
317
|
+
teamName: team.name,
|
|
318
|
+
role: validatedData.role,
|
|
318
319
|
acceptUrl,
|
|
319
|
-
'7 days'
|
|
320
|
-
|
|
320
|
+
expiresIn: '7 days',
|
|
321
|
+
appName: process.env.NEXT_PUBLIC_APP_NAME || 'Your App',
|
|
322
|
+
}, I18N_CONFIG.defaultLocale)
|
|
321
323
|
|
|
322
324
|
await emailProvider.send({
|
|
323
325
|
to: validatedData.email,
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Email templates
|
|
2
|
+
|
|
3
|
+
Drop a `.ts` file in this directory to override or add transactional email
|
|
4
|
+
templates for this theme. The build-time email registry picks files here
|
|
5
|
+
over the core defaults at the same slug, and any new slugs are additive.
|
|
6
|
+
|
|
7
|
+
## How discovery works
|
|
8
|
+
|
|
9
|
+
At build time, `pnpm dev` and `pnpm build` regenerate
|
|
10
|
+
`.nextspark/registries/email-registry.ts`. The registry first scans core's
|
|
11
|
+
defaults, then walks `themes/<NEXT_PUBLIC_ACTIVE_THEME>/emails/`. Theme files
|
|
12
|
+
with the same filename as a core default override the core file. Theme files
|
|
13
|
+
with new filenames are added to the registry as new slugs.
|
|
14
|
+
|
|
15
|
+
## File contract
|
|
16
|
+
|
|
17
|
+
Each file must have a default export with this shape:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
export default async function <name>(
|
|
21
|
+
data: <YourDataShape>,
|
|
22
|
+
locale?: string,
|
|
23
|
+
): Promise<{ subject: string; html: string }>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`locale` is the BCP47 code (e.g. `'en'`, `'es'`); use it with
|
|
27
|
+
`getTranslations({ locale, namespace: 'email.<slug>' })` from `next-intl/server`
|
|
28
|
+
when you want translated copy. Core's defaults already do this for the four
|
|
29
|
+
slugs below.
|
|
30
|
+
|
|
31
|
+
## Core slugs you can override
|
|
32
|
+
|
|
33
|
+
| Slug | Data type | Sent on |
|
|
34
|
+
|---------------------|----------------------------|-------------------------------------------|
|
|
35
|
+
| `verify-email` | `VerificationEmailData` | Email/password signup (when enabled) |
|
|
36
|
+
| `reset-password` | `PasswordResetEmailData` | Password reset request |
|
|
37
|
+
| `otp-verification` | `OtpVerificationEmailData` | OTP-based sign-in / verification |
|
|
38
|
+
| `team-invitation` | `TeamInvitationEmailData` | Adding a member to a team |
|
|
39
|
+
|
|
40
|
+
Import the data types from `@nextsparkjs/core/lib/email/types`.
|
|
41
|
+
|
|
42
|
+
## Adding new slugs
|
|
43
|
+
|
|
44
|
+
A theme can ship slugs core doesn't know about (e.g. `welcome.ts`,
|
|
45
|
+
`weekly-digest.ts`, `purchase-confirmation.ts`). After rebuild, they become
|
|
46
|
+
available as `EMAIL_REGISTRY['<slug>']` from
|
|
47
|
+
`@nextsparkjs/registries/email-registry` with full per-slug TypeScript
|
|
48
|
+
inference of the data argument — no `declare module` boilerplate.
|
|
49
|
+
|
|
50
|
+
## Falling back to core defaults
|
|
51
|
+
|
|
52
|
+
Delete a file from this directory to revert that slug to core's default on
|
|
53
|
+
the next build.
|
|
54
|
+
|
|
55
|
+
## Convenience helpers for the four core slugs
|
|
56
|
+
|
|
57
|
+
If you don't override, call sites in your project can keep using the typed
|
|
58
|
+
helpers exposed by core:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import {
|
|
62
|
+
sendVerifyEmail,
|
|
63
|
+
sendResetPasswordEmail,
|
|
64
|
+
sendOtpVerificationEmail,
|
|
65
|
+
sendTeamInvitationEmail,
|
|
66
|
+
} from '@nextsparkjs/core/lib/email/send'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
These wrap `EMAIL_REGISTRY['<slug>']` and pick up your overrides automatically.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme override: Verify Email.
|
|
3
|
+
*
|
|
4
|
+
* Drop your branded HTML and copy here to customize the verification email.
|
|
5
|
+
* The build-time email registry in `@nextsparkjs/registries/email-registry`
|
|
6
|
+
* will pick this file over the core default at the same slug.
|
|
7
|
+
*
|
|
8
|
+
* The other three core slugs you can override or add to:
|
|
9
|
+
* - reset-password.ts
|
|
10
|
+
* - otp-verification.ts
|
|
11
|
+
* - team-invitation.ts
|
|
12
|
+
*
|
|
13
|
+
* You can also add brand-new slugs here (e.g. `welcome.ts`,
|
|
14
|
+
* `purchase-confirmation.ts`). They're picked up automatically by the
|
|
15
|
+
* registry generator and become available as `EMAIL_REGISTRY['<slug>']` —
|
|
16
|
+
* with full per-slug TypeScript inference of the data argument.
|
|
17
|
+
*
|
|
18
|
+
* Out of the box this file simply delegates to core so the project keeps
|
|
19
|
+
* working before you brand it. Replace the body with your own HTML when
|
|
20
|
+
* you're ready, or delete this file entirely to fall back to the core default.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import coreVerifyEmail from '@nextsparkjs/core/emails/verify-email'
|
|
24
|
+
import type {
|
|
25
|
+
EmailContent,
|
|
26
|
+
VerificationEmailData,
|
|
27
|
+
} from '@nextsparkjs/core/lib/email/types'
|
|
28
|
+
|
|
29
|
+
export default async function verifyEmail(
|
|
30
|
+
data: VerificationEmailData,
|
|
31
|
+
locale?: string,
|
|
32
|
+
): Promise<EmailContent> {
|
|
33
|
+
return coreVerifyEmail(data, locale)
|
|
34
|
+
}
|