diff --git a/apps/mana/apps/web/src/lib/i18n/locales/forms/de.json b/apps/mana/apps/web/src/lib/i18n/locales/forms/de.json
index 8b637f122..5c85c8d4d 100644
--- a/apps/mana/apps/web/src/lib/i18n/locales/forms/de.json
+++ b/apps/mana/apps/web/src/lib/i18n/locales/forms/de.json
@@ -80,7 +80,18 @@
"none": "Einmalig",
"weekly": "Wöchentlich",
"monthly": "Monatlich",
- "hint": "Eingehende Antworten bekommen automatisch einen Wellen-Tag (z.B. \"KW 19 / 2026\") für Trend-Vergleich. Versand des Links via Broadcast kommt im nächsten Schritt."
+ "hint": "Eingehende Antworten bekommen automatisch einen Wellen-Tag (z.B. \"KW 19 / 2026\") für Trend-Vergleich.",
+ "recipientsLabel": "Empfänger-Emails (max. 50, eine pro Zeile)",
+ "recipientsCount": "{n} valide Empfänger erkannt",
+ "lastSent": "Letzter Versand: {date}",
+ "waveDue": "Nächste Welle ist fällig — schicke den Link an deine Empfänger.",
+ "nextWaveAt": "Nächste Welle: {date}",
+ "sendNow": "Welle jetzt senden",
+ "needsUnlisted": "Setze die Sichtbarkeit auf \"unlisted\", um den Link zu erzeugen.",
+ "needsRecipients": "Trage Empfänger-Emails in den Settings ein.",
+ "mailSubject": "Bitte ausfüllen: {title}",
+ "mailBody": "{description}Hier kannst du antworten:\n{url}\n\nDanke!",
+ "confirmSend": "Welle an {n} Empfänger senden? Dein Mail-Programm öffnet sich mit BCC-Liste und Link. Nach dem Versand stempeln wir den Zeitpunkt."
},
"autoSync": {
"title": "Auto-Sync — bei Antwort erzeugen",
diff --git a/apps/mana/apps/web/src/lib/i18n/locales/forms/en.json b/apps/mana/apps/web/src/lib/i18n/locales/forms/en.json
index c2b80933c..13c9017c6 100644
--- a/apps/mana/apps/web/src/lib/i18n/locales/forms/en.json
+++ b/apps/mana/apps/web/src/lib/i18n/locales/forms/en.json
@@ -80,7 +80,18 @@
"none": "One-off",
"weekly": "Weekly",
"monthly": "Monthly",
- "hint": "Incoming responses are auto-tagged with a wave label (e.g. \"W19 / 2026\") for trend comparison. Broadcast-based sending will come in a follow-up step."
+ "hint": "Incoming responses are auto-tagged with a wave label (e.g. \"W19 / 2026\") for trend comparison.",
+ "recipientsLabel": "Recipient emails (max. 50, one per line)",
+ "recipientsCount": "{n} valid recipients detected",
+ "lastSent": "Last sent: {date}",
+ "waveDue": "Next wave is due — send the link to your recipients.",
+ "nextWaveAt": "Next wave: {date}",
+ "sendNow": "Send wave now",
+ "needsUnlisted": "Set visibility to \"unlisted\" to create the link.",
+ "needsRecipients": "Add recipient emails in the settings.",
+ "mailSubject": "Please fill in: {title}",
+ "mailBody": "{description}Reply here:\n{url}\n\nThanks!",
+ "confirmSend": "Send wave to {n} recipients? Your mail client opens with the BCC list and link prefilled. We'll stamp the timestamp after."
},
"autoSync": {
"title": "Auto-sync — create on submit",
diff --git a/apps/mana/apps/web/src/lib/i18n/locales/forms/es.json b/apps/mana/apps/web/src/lib/i18n/locales/forms/es.json
index 63174e2ba..bec3d3ec6 100644
--- a/apps/mana/apps/web/src/lib/i18n/locales/forms/es.json
+++ b/apps/mana/apps/web/src/lib/i18n/locales/forms/es.json
@@ -80,7 +80,18 @@
"none": "Una vez",
"weekly": "Semanal",
"monthly": "Mensual",
- "hint": "Las respuestas recibidas se etiquetan automáticamente con la ola (p. ej. \"S19 / 2026\") para comparar tendencias. El envío automático por broadcast llegará en un paso posterior."
+ "hint": "Las respuestas recibidas se etiquetan automáticamente con la ola (p. ej. \"S19 / 2026\") para comparar tendencias.",
+ "recipientsLabel": "Emails de destinatarios (máx. 50, uno por línea)",
+ "recipientsCount": "{n} destinatarios válidos detectados",
+ "lastSent": "Último envío: {date}",
+ "waveDue": "La próxima ola está pendiente — envía el enlace a tus destinatarios.",
+ "nextWaveAt": "Próxima ola: {date}",
+ "sendNow": "Enviar ola ahora",
+ "needsUnlisted": "Pon la visibilidad en \"unlisted\" para crear el enlace.",
+ "needsRecipients": "Añade emails de destinatarios en los ajustes.",
+ "mailSubject": "Por favor rellena: {title}",
+ "mailBody": "{description}Responde aquí:\n{url}\n\n¡Gracias!",
+ "confirmSend": "¿Enviar ola a {n} destinatarios? Tu cliente de correo se abrirá con la lista BCC y el enlace prellenado. Marcamos la marca de tiempo después."
},
"autoSync": {
"title": "Auto-sync — crear al recibir respuesta",
diff --git a/apps/mana/apps/web/src/lib/i18n/locales/forms/fr.json b/apps/mana/apps/web/src/lib/i18n/locales/forms/fr.json
index ee662728f..fbdffdab2 100644
--- a/apps/mana/apps/web/src/lib/i18n/locales/forms/fr.json
+++ b/apps/mana/apps/web/src/lib/i18n/locales/forms/fr.json
@@ -80,7 +80,18 @@
"none": "Ponctuel",
"weekly": "Hebdomadaire",
"monthly": "Mensuel",
- "hint": "Les réponses entrantes reçoivent automatiquement un tag de vague (p. ex. « S19 / 2026 ») pour comparer les tendances. L'envoi par broadcast arrive à l'étape suivante."
+ "hint": "Les réponses entrantes reçoivent automatiquement un tag de vague (p. ex. « S19 / 2026 ») pour comparer les tendances.",
+ "recipientsLabel": "Emails des destinataires (max. 50, un par ligne)",
+ "recipientsCount": "{n} destinataires valides détectés",
+ "lastSent": "Dernier envoi : {date}",
+ "waveDue": "La prochaine vague est due — envoie le lien à tes destinataires.",
+ "nextWaveAt": "Prochaine vague : {date}",
+ "sendNow": "Envoyer la vague",
+ "needsUnlisted": "Mets la visibilité sur « unlisted » pour créer le lien.",
+ "needsRecipients": "Ajoute des emails de destinataires dans les paramètres.",
+ "mailSubject": "Merci de remplir : {title}",
+ "mailBody": "{description}Réponds ici :\n{url}\n\nMerci !",
+ "confirmSend": "Envoyer la vague à {n} destinataires ? Ton client mail s'ouvre avec la liste BCC et le lien préremplis. On marque l'horodatage ensuite."
},
"autoSync": {
"title": "Auto-sync — créer à la soumission",
diff --git a/apps/mana/apps/web/src/lib/i18n/locales/forms/it.json b/apps/mana/apps/web/src/lib/i18n/locales/forms/it.json
index e8c918791..e8e07d9ef 100644
--- a/apps/mana/apps/web/src/lib/i18n/locales/forms/it.json
+++ b/apps/mana/apps/web/src/lib/i18n/locales/forms/it.json
@@ -80,7 +80,18 @@
"none": "Una tantum",
"weekly": "Settimanale",
"monthly": "Mensile",
- "hint": "Le risposte in arrivo vengono etichettate automaticamente con l'ondata (es. \"Sett. 19 / 2026\") per confronti di trend. L'invio via broadcast arriva nel passo successivo."
+ "hint": "Le risposte in arrivo vengono etichettate automaticamente con l'ondata (es. \"Sett. 19 / 2026\") per confronti di trend.",
+ "recipientsLabel": "Email dei destinatari (max. 50, uno per riga)",
+ "recipientsCount": "{n} destinatari validi rilevati",
+ "lastSent": "Ultimo invio: {date}",
+ "waveDue": "La prossima ondata è in scadenza — invia il link ai destinatari.",
+ "nextWaveAt": "Prossima ondata: {date}",
+ "sendNow": "Invia l'ondata ora",
+ "needsUnlisted": "Imposta la visibilità su \"unlisted\" per creare il link.",
+ "needsRecipients": "Aggiungi email dei destinatari nelle impostazioni.",
+ "mailSubject": "Per favore compila: {title}",
+ "mailBody": "{description}Rispondi qui:\n{url}\n\nGrazie!",
+ "confirmSend": "Invia l'ondata a {n} destinatari? Il tuo client di posta si apre con la lista BCC e il link precompilati. Marchiamo l'orario dopo."
},
"autoSync": {
"title": "Auto-sync — crea al ricevere risposta",
diff --git a/apps/mana/apps/web/src/lib/modules/forms/components/SettingsPanel.svelte b/apps/mana/apps/web/src/lib/modules/forms/components/SettingsPanel.svelte
index 8b47f3038..4e2f69df1 100644
--- a/apps/mana/apps/web/src/lib/modules/forms/components/SettingsPanel.svelte
+++ b/apps/mana/apps/web/src/lib/modules/forms/components/SettingsPanel.svelte
@@ -157,6 +157,12 @@
settings.recurrence?.frequency ?? 'none'
);
+ let recipientEmailsRaw = $state('');
+ $effect(() => {
+ // Re-sync when settings change upstream (clone, undo, etc.).
+ recipientEmailsRaw = (settings.recurrence?.recipientEmails ?? []).join('\n');
+ });
+
function setRecurrence(next: 'none' | 'weekly' | 'monthly') {
if (next === 'none') {
onchange({ recurrence: undefined });
@@ -165,10 +171,25 @@
recurrence: {
frequency: next,
startedAt: settings.recurrence?.startedAt ?? new Date().toISOString(),
+ recipientEmails: settings.recurrence?.recipientEmails,
+ lastSentAt: settings.recurrence?.lastSentAt,
},
});
}
}
+
+ async function commitRecipientEmails() {
+ const { parseRecipientEmails } = await import('../lib/wave');
+ const parsed = parseRecipientEmails(recipientEmailsRaw).slice(0, 50);
+ const current = settings.recurrence;
+ if (!current) return;
+ onchange({
+ recurrence: {
+ ...current,
+ recipientEmails: parsed.length > 0 ? parsed : undefined,
+ },
+ });
+ }
@@ -274,9 +295,43 @@
{$_('forms.builder.recurrence.hint', {
default:
- 'Eingehende Antworten bekommen automatisch einen Wellen-Tag (z.B. "KW 19 / 2026") für Trend-Vergleich. Versand des Links via Broadcast kommt im nächsten Schritt.',
+ 'Eingehende Antworten bekommen automatisch einen Wellen-Tag (z.B. "KW 19 / 2026") für Trend-Vergleich.',
})}
+ {!entry.unlistedToken
+ ? $_('forms.builder.recurrence.needsUnlisted', {
+ default: 'Setze die Sichtbarkeit auf "unlisted", um den Link zu erzeugen.',
+ })
+ : $_('forms.builder.recurrence.needsRecipients', {
+ default: 'Trage Empfänger-Emails in den Settings ein.',
+ })}
+