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
+15 -15
View File
@@ -146,18 +146,18 @@
},
"protocol_handlers": {
"title": "Aplicaciones predeterminadas",
"description": "Elige si los enlaces de correo y calendario se abren en Bulwark. Técnicamente, Bulwark se registra como controlador de protocolo para enlaces mailto: y webcal:.",
"description": "Elige si los enlaces de correo y calendario se abren en VNCmail+. Técnicamente, VNCmail+ se registra como controlador de protocolo para enlaces mailto: y webcal:.",
"unsupported": "Este navegador o esta conexión no admite el registro manual de controladores de protocolo. Es posible que aún puedas usar la PWA instalada desde la configuración del navegador o del sistema.",
"mailto_label": "Enlaces de correo",
"mailto_description": "Abre enlaces mailto: en Bulwark con el redactor rellenado previamente.",
"mailto_description": "Abre enlaces mailto: en VNCmail+ con el redactor rellenado previamente.",
"protocol_open_mode_label": "Al abrir enlaces de protocolo",
"protocol_open_mode_description": "Elige si Bulwark abre los enlaces mailto: y webcal: en una nueva pestaña o reutiliza una sesión abierta. La opción de sesión activa necesita permiso de notificaciones para que puedas hacer clic en una notificación de respaldo y traer Bulwark al frente si el navegador bloquea el foco.",
"protocol_open_mode_description": "Elige si VNCmail+ abre los enlaces mailto: y webcal: en una nueva pestaña o reutiliza una sesión abierta. La opción de sesión activa necesita permiso de notificaciones para que puedas hacer clic en una notificación de respaldo y traer VNCmail+ al frente si el navegador bloquea el foco.",
"protocol_open_mode_active_session": "Abrir en la sesión activa si es posible",
"protocol_open_mode_new_tab": "Abrir siempre una nueva pestaña",
"focus_notification_title": "Abrir Bulwark",
"focus_notification_body": "El enlace se abrió en Bulwark. Haz clic para traer la ventana al frente.",
"focus_notification_title": "Abrir VNCmail+",
"focus_notification_body": "El enlace se abrió en VNCmail+. Haz clic para traer la ventana al frente.",
"webcal_label": "Enlaces de calendario",
"webcal_description": "Abre enlaces webcal: en Bulwark con un diálogo de suscripción al calendario rellenado previamente.",
"webcal_description": "Abre enlaces webcal: en VNCmail+ con un diálogo de suscripción al calendario rellenado previamente.",
"register_mailto": "Registrar aplicación de correo",
"register_webcal": "Registrar aplicación de calendario",
"mailto_registered": "Registro del controlador de correo solicitado",
@@ -165,7 +165,7 @@
"registration_failed": "No se pudo registrar el controlador de protocolo",
"opening_mailto": "Abriendo redactor...",
"opening_webcal": "Abriendo calendario...",
"browser_note": "Tu navegador o sistema operativo puede pedirte confirmación y puede requerir que Bulwark esté instalado antes de poder seleccionarlo como aplicación predeterminada.",
"browser_note": "Tu navegador o sistema operativo puede pedirte confirmación y puede requerir que VNCmail+ esté instalado antes de poder seleccionarlo como aplicación predeterminada.",
"select_account_title": "Elegir cuenta",
"select_mailto_account": "Elige qué cuenta debe abrir este enlace de correo.",
"select_webcal_account": "Elige qué cuenta debe abrir este enlace de calendario.",
@@ -738,9 +738,9 @@
"app_title": "Correo Web",
"reconnecting": "Conexión perdida. Intentando reconectar…",
"rate_limited_title": "La autenticación del servidor está limitada temporalmente.",
"rate_limited_detail": "Bulwark ha pausado las solicitudes en segundo plano para evitar un bloqueo. Reintentando en {seconds}s.",
"rate_limited_detail": "VNCmail+ ha pausado las solicitudes en segundo plano para evitar un bloqueo. Reintentando en {seconds}s.",
"rate_limited_action_title": "Solicitud pausada para evitar el bloqueo.",
"rate_limited_action_detail": "Bulwark está esperando a que termine el enfriamiento del servidor antes de enviar más solicitudes autenticadas. Inténtalo de nuevo en {seconds}s."
"rate_limited_action_detail": "VNCmail+ está esperando a que termine el enfriamiento del servidor antes de enviar más solicitudes autenticadas. Inténtalo de nuevo en {seconds}s."
},
"notifications": {
"email_sent": "Correo enviado exitosamente",
@@ -1074,12 +1074,12 @@
"push": {
"confirm_disable_message": "Este dispositivo dejará de recibir alertas cuando el sitio esté cerrado.",
"confirm_disable_title": "¿Desactivar las notificaciones en segundo plano?",
"description": "Recibe notificaciones del sistema para correo nuevo cuando este sitio está cerrado. Se entrega a través del relay push de Bulwark; el relay nunca ve el contenido del correo.",
"description": "Recibe notificaciones del sistema para correo nuevo cuando este sitio está cerrado. Se entrega a través del relay push de VNCmail+; el relay nunca ve el contenido del correo.",
"disable": "Desactivar",
"enable": "Activar",
"ios_hint": "En iOS, instala primero el sitio en la pantalla de inicio: Safari solo entrega Web Push a PWAs instaladas.",
"reenable": "Volver a registrar",
"relay_desc": "Usa el relay alojado de Bulwark de forma predeterminada. Cámbialo solo si te alojas tú mismo.",
"relay_desc": "Usa el relay alojado de VNCmail+ de forma predeterminada. Cámbialo solo si te alojas tú mismo.",
"relay_label": "Relay push",
"relay_locked": "Establecido por el administrador",
"relay_locked_desc": "La URL del relay push ha sido establecida por tu administrador y no se puede cambiar.",
@@ -1528,10 +1528,10 @@
},
"link_device": {
"title": "Vincular aplicación móvil",
"description": "Inicie sesión en la aplicación móvil de Bulwark Mail sin escribir nada. Genere un código QR aquí y escanéelo desde la pantalla de inicio de sesión de la aplicación.",
"description": "Inicie sesión en la aplicación móvil de VNCmail+ sin escribir nada. Genere un código QR aquí y escanéelo desde la pantalla de inicio de sesión de la aplicación.",
"generate": "Mostrar código QR",
"regenerate": "Mostrar un código nuevo",
"instructions": "Abra la aplicación Bulwark Mail, toque \"Escanear código QR\" en la pantalla de inicio de sesión y apunte su cámara aquí.",
"instructions": "Abra la aplicación VNCmail+, toque \"Escanear código QR\" en la pantalla de inicio de sesión y apunte su cámara aquí.",
"expires_in": "Este código caduca en {seconds} segundos. Solo se puede usar una vez.",
"expired": "Este código ha caducado.",
"generating": "Generando…",
@@ -1706,7 +1706,7 @@
"button": "Importar"
},
"about": {
"title": "Bulwark Webmail"
"title": "VNCmail+"
}
},
"sidebar_apps": {
@@ -3032,7 +3032,7 @@
"start_tour": "Iniciar tour"
},
"demo_welcome": {
"title": "Bienvenido a Bulwark Mail",
"title": "Bienvenido a VNCmail+",
"description": "Explora un cliente de correo web completo - directamente en tu navegador. Todos los datos quedan en tu dispositivo, así que prueba todo.",
"feature_email": "Leer y redactar correos",
"feature_organize": "Etiquetas, estrellas y carpetas",