diff --git a/site/download/voxvera-source.zip b/site/download/voxvera-source.zip index 8afcb92..624d529 100644 Binary files a/site/download/voxvera-source.zip and b/site/download/voxvera-source.zip differ diff --git a/site/index.html b/site/index.html index 4a3d4d8..99fd4a3 100644 --- a/site/index.html +++ b/site/index.html @@ -169,20 +169,21 @@ .content { width: calc(8.5in - 3.75in); - padding: 20px; + padding: 15px 20px; text-align: center; box-sizing: border-box; display: flex; flex-direction: column; - justify-content: space-between; + justify-content: flex-start; page-break-inside: avoid; overflow-wrap: break-word; } h1 { margin: 0; - margin-bottom: 10px; + padding: 0; font-size: 24px; + line-height: 1.2; letter-spacing: 2px; white-space: nowrap; overflow: hidden; @@ -192,7 +193,10 @@ .distribute { font-size: 18px; + line-height: 1.2; letter-spacing: 6px; + margin: 2px 0; + padding: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -204,8 +208,8 @@ } .message { - height: 6in; /* Fixed height to prevent footer push-out */ - margin-top: 10px; + flex: 1; + margin-top: 4px; font-size: 14px; line-height: 1.4; text-align: left; @@ -265,7 +269,7 @@ border: none; border-top: 1px solid #000; width: 100%; - margin: 10px 0; + margin: 4px 0; } .footer { diff --git a/voxvera/cli.py b/voxvera/cli.py index 40dedc9..49d837d 100644 --- a/voxvera/cli.py +++ b/voxvera/cli.py @@ -398,15 +398,15 @@ def interactive_update(config_path: str): data.update(prompt(meta_qs)) console.rule(t("cli.init_body")) + # Start with existing/default content; preserve user edits across retries + body = _br_to_newlines(get_default("content")) while True: - # Use existing content if present, else fallback to localized landing default - initial_content = _br_to_newlines(get_default("content")) - - body = open_editor(initial_content) + body = open_editor(body) length = len(body) if length > 1000: console.print(f"{t('cli.body_length')}: {length}/1000 {t('cli.body_limit_exceeded')}", style="red") if not inquirer.confirm(message=t("cli.edit_again"), default=True).execute(): + console.print(t("cli.body_over_limit_warning"), style="yellow") break else: console.print(f"{t('cli.body_length')}: {length}/1000", style="green") diff --git a/voxvera/locales/ar.json b/voxvera/locales/ar.json index 131ffb8..647f276 100644 --- a/voxvera/locales/ar.json +++ b/voxvera/locales/ar.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- إنشاء من قالب ---", - "template_select": "اختر قالباً:" + "template_select": "اختر قالباً:", + "body_over_limit_warning": "تحذير: نص المحتوى يتجاوز 1000 حرف. قد يتم قطعه في المنشور." }, "web": { "tear_off_tor_browser": "استخدم متصفح Tor", diff --git a/voxvera/locales/de.json b/voxvera/locales/de.json index d2c9a6a..0b735e5 100644 --- a/voxvera/locales/de.json +++ b/voxvera/locales/de.json @@ -75,7 +75,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Aus Vorlage erstellen ---", - "template_select": "Wählen Sie eine Vorlage:" + "template_select": "Wählen Sie eine Vorlage:", + "body_over_limit_warning": "Warnung: Der Textkörper überschreitet 1000 Zeichen. Er könnte auf dem Flyer abgeschnitten werden." }, "web": { "tear_off_tor_browser": "Tor-Browser verwenden", diff --git a/voxvera/locales/en.json b/voxvera/locales/en.json index 1578fb8..abfcacd 100644 --- a/voxvera/locales/en.json +++ b/voxvera/locales/en.json @@ -75,7 +75,8 @@ "no_urls_qr_skip": "No URLs configured yet. QR codes will be generated after 'voxvera serve'", "input_file_not_found": "Input file {path} does not exist.", "manage_templates": "--- Create From Template ---", - "template_select": "Select a template:" + "template_select": "Select a template:", + "body_over_limit_warning": "Warning: Body text exceeds 1000 characters. It may be cut off on the flyer." }, "web": { "tear_off_tor_browser": "Use Tor Browser", diff --git a/voxvera/locales/es.json b/voxvera/locales/es.json index 14981cb..477a045 100644 --- a/voxvera/locales/es.json +++ b/voxvera/locales/es.json @@ -75,7 +75,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Crear Desde Plantilla ---", - "template_select": "Seleccione una plantilla:" + "template_select": "Seleccione una plantilla:", + "body_over_limit_warning": "Advertencia: El texto del cuerpo supera los 1000 caracteres. Puede cortarse en el volante." }, "web": { "tear_off_tor_browser": "Use el Navegador Tor", diff --git a/voxvera/locales/fa.json b/voxvera/locales/fa.json index 8c9a2d0..a862c97 100644 --- a/voxvera/locales/fa.json +++ b/voxvera/locales/fa.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- ایجاد از قالب ---", - "template_select": "یک قالب انتخاب کنید:" + "template_select": "یک قالب انتخاب کنید:", + "body_over_limit_warning": "هشدار: متن بدنه از 1000 کاراکتر بیشتر است. ممکن است در بروشور بریده شود." }, "web": { "tear_off_tor_browser": "از مرورگر Tor استفاده کنید", diff --git a/voxvera/locales/fr.json b/voxvera/locales/fr.json index 9d8cb51..9809651 100644 --- a/voxvera/locales/fr.json +++ b/voxvera/locales/fr.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Créer à partir d'un modèle ---", - "template_select": "Sélectionnez un modèle :" + "template_select": "Sélectionnez un modèle :", + "body_over_limit_warning": "Avertissement : Le texte dépasse 1000 caractères. Il pourrait être coupé sur le tract." }, "web": { "tear_off_tor_browser": "Utilisez le navigateur Tor", diff --git a/voxvera/locales/he.json b/voxvera/locales/he.json index 9fc16d0..e69165a 100644 --- a/voxvera/locales/he.json +++ b/voxvera/locales/he.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- יצירה מתבנית ---", - "template_select": "בחר תבנית:" + "template_select": "בחר תבנית:", + "body_over_limit_warning": "אזהרה: טקסט הגוף חורג מ-1000 תווים. הוא עלול להיחתך בעלון." }, "web": { "tear_off_tor_browser": "השתמש בדפדפן Tor", diff --git a/voxvera/locales/hi.json b/voxvera/locales/hi.json index 34e197f..11873ec 100644 --- a/voxvera/locales/hi.json +++ b/voxvera/locales/hi.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- टेम्पलेट से बनाएं ---", - "template_select": "एक टेम्पलेट चुनें:" + "template_select": "एक टेम्पलेट चुनें:", + "body_over_limit_warning": "चेतावनी: मुख्य पाठ 1000 अक्षरों से अधिक है। यह पर्चे पर कटा हुआ दिख सकता है।" }, "web": { "tear_off_tor_browser": "Tor Browser का उपयोग करें", diff --git a/voxvera/locales/ja.json b/voxvera/locales/ja.json index efe9fda..3e841fb 100644 --- a/voxvera/locales/ja.json +++ b/voxvera/locales/ja.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- テンプレートから作成 ---", - "template_select": "テンプレートを選択してください:" + "template_select": "テンプレートを選択してください:", + "body_over_limit_warning": "警告:本文が1000文字を超えています。チラシ上で途切れる可能性があります。" }, "web": { "tear_off_tor_browser": "Tor Browserを使用してください", diff --git a/voxvera/locales/pt.json b/voxvera/locales/pt.json index 38f779b..a586d13 100644 --- a/voxvera/locales/pt.json +++ b/voxvera/locales/pt.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Criar a partir de Modelo ---", - "template_select": "Selecione um modelo:" + "template_select": "Selecione um modelo:", + "body_over_limit_warning": "Aviso: O texto do corpo excede 1000 caracteres. Pode ser cortado no panfleto." }, "web": { "tear_off_tor_browser": "Use o Tor Browser", diff --git a/voxvera/locales/ru.json b/voxvera/locales/ru.json index 0b49b7d..cea05ef 100644 --- a/voxvera/locales/ru.json +++ b/voxvera/locales/ru.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Создать из шаблона ---", - "template_select": "Выберите шаблон:" + "template_select": "Выберите шаблон:", + "body_over_limit_warning": "Предупреждение: Текст превышает 1000 символов. Он может быть обрезан на листовке." }, "web": { "tear_off_tor_browser": "Используйте Tor Browser", diff --git a/voxvera/locales/sw.json b/voxvera/locales/sw.json index fcdc242..fcdcb14 100644 --- a/voxvera/locales/sw.json +++ b/voxvera/locales/sw.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Tengeneza Kutoka Kiolezo ---", - "template_select": "Chagua kiolezo:" + "template_select": "Chagua kiolezo:", + "body_over_limit_warning": "Onyo: Maandishi ya mwili yanazidi herufi 1000. Yanaweza kukatwa kwenye kipeperushi." }, "web": { "tear_off_tor_browser": "Tumia Kivinjari cha Tor", diff --git a/voxvera/locales/tr.json b/voxvera/locales/tr.json index 0b2b73c..128c979 100644 --- a/voxvera/locales/tr.json +++ b/voxvera/locales/tr.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- Şablondan Oluştur ---", - "template_select": "Bir şablon seçin:" + "template_select": "Bir şablon seçin:", + "body_over_limit_warning": "Uyarı: Gövde metni 1000 karakteri aşıyor. El ilanında kesilebilir." }, "web": { "tear_off_tor_browser": "Tor Tarayıcı Kullanın", diff --git a/voxvera/locales/zh.json b/voxvera/locales/zh.json index d466981..598fbe5 100644 --- a/voxvera/locales/zh.json +++ b/voxvera/locales/zh.json @@ -76,7 +76,8 @@ "attachment_path_label": "Attachment file path (optional - will be served from Tor site)", "manage_action_edit": "Edit", "manage_templates": "--- 从模板创建 ---", - "template_select": "选择一个模板:" + "template_select": "选择一个模板:", + "body_over_limit_warning": "警告:正文超过1000个字符。传单上可能会被截断。" }, "web": { "tear_off_tor_browser": "使用 Tor 浏览器", diff --git a/voxvera/src/index-master.html b/voxvera/src/index-master.html index a86ac6b..a7597e3 100644 --- a/voxvera/src/index-master.html +++ b/voxvera/src/index-master.html @@ -169,20 +169,21 @@ .content { width: calc(8.5in - 3.75in); - padding: 20px; + padding: 15px 20px; text-align: center; box-sizing: border-box; display: flex; flex-direction: column; - justify-content: space-between; + justify-content: flex-start; page-break-inside: avoid; overflow-wrap: break-word; } h1 { margin: 0; - margin-bottom: 10px; + padding: 0; font-size: 24px; + line-height: 1.2; letter-spacing: 2px; white-space: nowrap; overflow: hidden; @@ -192,7 +193,10 @@ .distribute { font-size: 18px; + line-height: 1.2; letter-spacing: 6px; + margin: 2px 0; + padding: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -204,8 +208,8 @@ } .message { - height: 6in; /* Fixed height to prevent footer push-out */ - margin-top: 10px; + flex: 1; + margin-top: 4px; font-size: 14px; line-height: 1.4; text-align: left; @@ -265,7 +269,7 @@ border: none; border-top: 1px solid #000; width: 100%; - margin: 10px 0; + margin: 4px 0; } .footer {