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
+10 -10
View File
@@ -146,18 +146,18 @@
},
"protocol_handlers": {
"title": "برنامه‌های پیش‌فرض",
"description": "انتخاب کنید لینک‌های ایمیل و تقویم در Bulwark باز شوند.",
"description": "انتخاب کنید لینک‌های ایمیل و تقویم در VNCmail+ باز شوند.",
"unsupported": "این مرورگر از ثبت دستی پروتکل پشتیبانی نمی‌کند.",
"mailto_label": "لینک‌های ایمیل",
"mailto_description": "باز کردن لینک‌های mailto: در Bulwark",
"mailto_description": "باز کردن لینک‌های mailto: در VNCmail+",
"protocol_open_mode_label": "هنگام باز کردن لینک‌های پروتکل",
"protocol_open_mode_description": "انتخاب کنید لینک‌ها در تب جدید باز شوند یا نشست فعال.",
"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": "ثبت مدیریت ایمیل درخواست شد",
@@ -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": "ایمیل با موفقیت ارسال شد",
@@ -1054,7 +1054,7 @@
"title": "اعلان‌های پس‌زمینه",
"description": "دریافت اعلان‌های سیستم برای ایمیل جدید",
"relay_label": "رله push",
"relay_desc": "پیش‌فرض رله میزبانی شده Bulwark",
"relay_desc": "پیش‌فرض رله میزبانی شده VNCmail+",
"relay_locked": "تنظیم شده توسط مدیر",
"relay_locked_desc": "قابل تغییر نیست",
"relay_placeholder": "https://notifications.relay.example.com",
@@ -1713,7 +1713,7 @@
"button": "وارد کردن"
},
"about": {
"title": "Bulwark Webmail"
"title": "VNCmail+"
}
},
"sidebar_apps": {
@@ -3055,7 +3055,7 @@
"start_tour": "شروع تور"
},
"demo_welcome": {
"title": "به Bulwark Mail خوش آمدید",
"title": "به VNCmail+ خوش آمدید",
"description": "یک سرویس ایمیل کامل را در مرورگر خود کاوش کنید.",
"feature_email": "خواندن و نوشتن ایمیل",
"feature_organize": "برچسب‌ها، ستاره‌ها و پوشه‌ها",