feat(theme): ship exactly 2 themes (SRC default + VNClagoon); rebrand user-facing VNCmail+

Product decision 2026-08-05: exactly SRC (default) and VNClagoon ship as
selectable themes. Everything else (Qui, Nord, Catppuccin, Solarized,
Roundcube Elastic, Aurora Glass) is hidden via ThemePolicy.disabledBuiltinThemes
rather than deleted - cheap to re-enable later, zero code lost. Also removed
the hardcoded "Default/Bulwark" theme card from the Settings > Themes grid
(product wants exactly 2 theme choices, not 3).

Separately, found and fixed real "still says Bulwark" branding gaps:
- All 24 locale files: "Bulwark"/"Bulwark Mail"/"Bulwark Webmail" ->
  "VNCmail+" in every user-facing string (verified via the translations
  test, which only checks structural key parity across locales, not
  content - a straight string swap is safe against it. 48/48 still pass).
- PWA manifest fallback app name, package.json description/author.
- Demo mode fixtures: the "Welcome to Bulwark Mail!" email and identity
  signature a first-time demo user actually sees.
- The demo empty-state's logo was hardcoded to a literal Bulwark SVG file
  regardless of active theme - a real bug, not just stale text, since
  lib/theme-logo.ts's resolveThemeLogo() already exists and is already used
  correctly by the login page and nav rail for exactly this (theme-aware
  SRC mark / VNClagoon wordmark). Wired the same helper in here instead of
  a hardcoded path.

NOT touched: internal code comments referencing "Bulwark" as historical/
attribution context (e.g. design-rationale comments explaining why a value
differs from Bulwark's original) - those are harmless and a full-repo sweep
of every comment wasn't the ask.

Verified: typecheck clean, lint clean, translations test 48/48 passing.
This commit is contained in:
Bernd Rodler
2026-08-05 23:43:19 +02:00
parent 3f99a2fc9e
commit bde9f14832
31 changed files with 416 additions and 404 deletions
+14 -14
View File
@@ -146,18 +146,18 @@
},
"protocol_handlers": {
"title": "Програми за замовчуванням",
"description": "Виберіть, чи відкривати посилання електронної пошти та календаря в Bulwark. Технічно Bulwark реєструється як обробник протоколу для посилань mailto: і webcal:.",
"description": "Виберіть, чи відкривати посилання електронної пошти та календаря в VNCmail+. Технічно VNCmail+ реєструється як обробник протоколу для посилань mailto: і webcal:.",
"unsupported": "Цей браузер або це з'єднання не підтримує ручну реєстрацію обробників протоколів. Можливо, встановлену PWA все одно можна використати через налаштування браузера або системи.",
"mailto_label": "Посилання електронної пошти",
"mailto_description": "Відкриває посилання mailto: у Bulwark із попередньо заповненим редактором листа.",
"mailto_description": "Відкриває посилання mailto: у VNCmail+ із попередньо заповненим редактором листа.",
"protocol_open_mode_label": "Під час відкриття посилань протоколів",
"protocol_open_mode_description": "Виберіть, чи Bulwark має відкривати посилання mailto: і webcal: у новій вкладці, чи повторно використовувати відкритий сеанс. Для варіанта активного сеансу потрібен дозвіл на сповіщення, щоб ви могли натиснути резервне сповіщення й вивести Bulwark на передній план, якщо браузер блокує фокус.",
"protocol_open_mode_description": "Виберіть, чи VNCmail+ має відкривати посилання mailto: і webcal: у новій вкладці, чи повторно використовувати відкритий сеанс. Для варіанта активного сеансу потрібен дозвіл на сповіщення, щоб ви могли натиснути резервне сповіщення й вивести VNCmail+ на передній план, якщо браузер блокує фокус.",
"protocol_open_mode_active_session": "Якщо можливо, відкривати в активному сеансі",
"protocol_open_mode_new_tab": "Завжди відкривати нову вкладку",
"focus_notification_title": "Відкрити Bulwark",
"focus_notification_body": "Посилання було відкрито в Bulwark. Натисніть, щоб вивести вікно на передній план.",
"focus_notification_title": "Відкрити VNCmail+",
"focus_notification_body": "Посилання було відкрито в VNCmail+. Натисніть, щоб вивести вікно на передній план.",
"webcal_label": "Посилання календаря",
"webcal_description": "Відкриває посилання webcal: у Bulwark із попередньо заповненим діалогом підписки на календар.",
"webcal_description": "Відкриває посилання webcal: у VNCmail+ із попередньо заповненим діалогом підписки на календар.",
"register_mailto": "Зареєструвати поштову програму",
"register_webcal": "Зареєструвати програму календаря",
"mailto_registered": "Реєстрацію обробника електронної пошти запитано",
@@ -165,7 +165,7 @@
"registration_failed": "Не вдалося зареєструвати обробник протоколу",
"opening_mailto": "Відкриття редактора...",
"opening_webcal": "Відкриття календаря...",
"browser_note": "Браузер або операційна система може попросити підтвердження та може вимагати, щоб Bulwark був встановлений, перш ніж його можна буде вибрати програмою за замовчуванням.",
"browser_note": "Браузер або операційна система може попросити підтвердження та може вимагати, щоб VNCmail+ був встановлений, перш ніж його можна буде вибрати програмою за замовчуванням.",
"select_account_title": "Виберіть акаунт",
"select_mailto_account": "Виберіть акаунт, у якому слід відкрити це посилання електронної пошти.",
"select_webcal_account": "Виберіть акаунт, у якому слід відкрити це посилання календаря.",
@@ -738,9 +738,9 @@
"app_title": "Веб-пошта",
"reconnecting": "З'єднання втрачено. Спроба повторного підключення…",
"rate_limited_title": "Швидкість автентифікації сервера тимчасово обмежена.",
"rate_limited_detail": "Bulwark призупинив фонові запити, щоб уникнути блокування. Повторна спроба через {seconds} с.",
"rate_limited_detail": "VNCmail+ призупинив фонові запити, щоб уникнути блокування. Повторна спроба через {seconds} с.",
"rate_limited_action_title": "Запит призупинено, щоб уникнути блокування.",
"rate_limited_action_detail": "Bulwark чекає закінчення часу відновлення сервера, перш ніж надсилати додаткові автентифіковані запити. Повторіть спробу через {seconds} с."
"rate_limited_action_detail": "VNCmail+ чекає закінчення часу відновлення сервера, перш ніж надсилати додаткові автентифіковані запити. Повторіть спробу через {seconds} с."
},
"notifications": {
"email_sent": "Електронна пошта успішно надіслана",
@@ -1074,12 +1074,12 @@
"push": {
"confirm_disable_message": "Цей пристрій перестане отримувати сповіщення, коли сайт закритий.",
"confirm_disable_title": "Вимкнути фонові сповіщення?",
"description": "Отримуйте системні сповіщення про нові листи, коли цей сайт закритий. Доставляється через push-реле Bulwark; реле ніколи не бачить вміст листів.",
"description": "Отримуйте системні сповіщення про нові листи, коли цей сайт закритий. Доставляється через push-реле VNCmail+; реле ніколи не бачить вміст листів.",
"disable": "Вимкнути",
"enable": "Увімкнути",
"ios_hint": "На iOS спочатку встановіть сайт на головний екран – Safari доставляє Web Push лише встановленим PWA.",
"reenable": "Перереєструвати",
"relay_desc": "Типово використовується розміщене реле Bulwark. Змінюйте лише, якщо хостите самостійно.",
"relay_desc": "Типово використовується розміщене реле VNCmail+. Змінюйте лише, якщо хостите самостійно.",
"relay_label": "Push-реле",
"relay_locked": "Встановлено адміністратором",
"relay_locked_desc": "URL push-реле встановлено вашим адміністратором і його не можна змінити.",
@@ -1528,10 +1528,10 @@
},
"link_device": {
"title": "Прив'язати мобільний застосунок",
"description": "Увійдіть у мобільний застосунок Bulwark Mail без введення даних. Створіть тут QR-код і відскануйте його на екрані входу в застосунку.",
"description": "Увійдіть у мобільний застосунок VNCmail+ без введення даних. Створіть тут QR-код і відскануйте його на екрані входу в застосунку.",
"generate": "Показати QR-код",
"regenerate": "Показати новий код",
"instructions": "Відкрийте застосунок Bulwark Mail, натисніть \"Сканувати QR-код\" на екрані входу та наведіть камеру сюди.",
"instructions": "Відкрийте застосунок VNCmail+, натисніть \"Сканувати QR-код\" на екрані входу та наведіть камеру сюди.",
"expires_in": "Термін дії коду закінчиться через {seconds} секунд. Його можна використати лише один раз.",
"expired": "Термін дії цього коду закінчився.",
"generating": "Створення…",
@@ -3032,7 +3032,7 @@
"start_tour": "Розпочати тур"
},
"demo_welcome": {
"title": "Ласкаво просимо до Bulwark Mail",
"title": "Ласкаво просимо до VNCmail+",
"description": "Відкрийте для себе повнофункціональний клієнт веб-пошти - прямо у вашому браузері. Усі дані залишаються на вашому пристрої, тому сміливо тестуйте все.",
"feature_email": "Читайте та створюйте електронний лист",
"feature_organize": "Теги, зірочки та папки",