diff --git a/services/webmail/messages/en.json b/services/webmail/messages/en.json
index ebf1590..aabb645 100644
--- a/services/webmail/messages/en.json
+++ b/services/webmail/messages/en.json
@@ -564,5 +564,27 @@
"draftDiscarded": "Reply discarded",
"sentReply": "Reply sent",
"moreMessages": "Show {count} earlier messages"
+ },
+ "appearance": {
+ "title": "Appearance",
+ "dark": "Dark",
+ "light": "Light",
+ "system": "System"
+ },
+ "palette": {
+ "placeholder": "Type a command, a folder or something to search for",
+ "empty": "Nothing matches. Press Enter to search your mail for this.",
+ "searchFor": "Search mail for \"{query}\"",
+ "goTo": "Go to {name}",
+ "actions": "Actions",
+ "navigate": "Go to",
+ "theme": "Appearance",
+ "accounts": "Accounts",
+ "switchTo": "Switch to {email}",
+ "hintMove": "move",
+ "hintOpen": "open",
+ "hintClose": "close",
+ "open": "Command menu",
+ "signOut": "Sign out"
}
}
diff --git a/services/webmail/messages/es.json b/services/webmail/messages/es.json
index 3adcd61..db81fb9 100644
--- a/services/webmail/messages/es.json
+++ b/services/webmail/messages/es.json
@@ -564,5 +564,27 @@
"draftDiscarded": "Respuesta descartada",
"sentReply": "Respuesta enviada",
"moreMessages": "Mostrar {count} mensajes anteriores"
+ },
+ "appearance": {
+ "title": "Apariencia",
+ "dark": "Oscuro",
+ "light": "Claro",
+ "system": "Sistema"
+ },
+ "palette": {
+ "placeholder": "Escribe un comando, una carpeta o algo que buscar",
+ "empty": "Sin resultados. Pulsa Enter para buscar esto en tu correo.",
+ "searchFor": "Buscar \"{query}\" en el correo",
+ "goTo": "Ir a {name}",
+ "actions": "Acciones",
+ "navigate": "Ir a",
+ "theme": "Apariencia",
+ "accounts": "Cuentas",
+ "switchTo": "Cambiar a {email}",
+ "hintMove": "mover",
+ "hintOpen": "abrir",
+ "hintClose": "cerrar",
+ "open": "Menú de comandos",
+ "signOut": "Cerrar sesión"
}
}
diff --git a/services/webmail/messages/pt-BR.json b/services/webmail/messages/pt-BR.json
index 9b35718..6c9ecd6 100644
--- a/services/webmail/messages/pt-BR.json
+++ b/services/webmail/messages/pt-BR.json
@@ -564,5 +564,27 @@
"draftDiscarded": "Resposta descartada",
"sentReply": "Resposta enviada",
"moreMessages": "Mostrar {count} mensagens anteriores"
+ },
+ "appearance": {
+ "title": "Aparência",
+ "dark": "Escuro",
+ "light": "Claro",
+ "system": "Sistema"
+ },
+ "palette": {
+ "placeholder": "Digite um comando, uma pasta ou algo para buscar",
+ "empty": "Nada encontrado. Pressione Enter para buscar este texto nos seus e-mails.",
+ "searchFor": "Buscar \"{query}\" nos e-mails",
+ "goTo": "Ir para {name}",
+ "actions": "Ações",
+ "navigate": "Ir para",
+ "theme": "Aparência",
+ "accounts": "Contas",
+ "switchTo": "Trocar para {email}",
+ "hintMove": "mover",
+ "hintOpen": "abrir",
+ "hintClose": "fechar",
+ "open": "Menu de comandos",
+ "signOut": "Sair"
}
}
diff --git a/services/webmail/package-lock.json b/services/webmail/package-lock.json
index 188b692..53f0856 100644
--- a/services/webmail/package-lock.json
+++ b/services/webmail/package-lock.json
@@ -8,6 +8,7 @@
"name": "@lambdamail/webmail",
"version": "0.1.0",
"dependencies": {
+ "@fontsource-variable/geist": "^5.3.0",
"clsx": "^2.1.1",
"dompurify": "^3.4.14",
"framer-motion": "^11.18.2",
@@ -718,6 +719,15 @@
}
}
},
+ "node_modules/@fontsource-variable/geist": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/@fontsource-variable/geist/-/geist-5.3.0.tgz",
+ "integrity": "sha512-j0m+vLQuG5XAYoHtGCVu0spvlGreR3EzpECUVzkFmI1mTVnAO38l/NEPDCFgZ177JxzYJCLSmTQibIiYPilGrA==",
+ "license": "OFL-1.1",
+ "funding": {
+ "url": "https://github.com/sponsors/ayuhito"
+ }
+ },
"node_modules/@img/colour": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
diff --git a/services/webmail/package.json b/services/webmail/package.json
index 6768627..ab4be0a 100644
--- a/services/webmail/package.json
+++ b/services/webmail/package.json
@@ -10,6 +10,7 @@
"lint": "tsc --noEmit"
},
"dependencies": {
+ "@fontsource-variable/geist": "^5.3.0",
"clsx": "^2.1.1",
"dompurify": "^3.4.14",
"framer-motion": "^11.18.2",
diff --git a/services/webmail/public/icons/icon-192.png b/services/webmail/public/icons/icon-192.png
new file mode 100644
index 0000000..cfb73b0
Binary files /dev/null and b/services/webmail/public/icons/icon-192.png differ
diff --git a/services/webmail/public/icons/icon-512.png b/services/webmail/public/icons/icon-512.png
new file mode 100644
index 0000000..dbfbea3
Binary files /dev/null and b/services/webmail/public/icons/icon-512.png differ
diff --git a/services/webmail/public/icons/maskable-512.png b/services/webmail/public/icons/maskable-512.png
new file mode 100644
index 0000000..afe8553
Binary files /dev/null and b/services/webmail/public/icons/maskable-512.png differ
diff --git a/services/webmail/src/app/(admin)/admin/layout.tsx b/services/webmail/src/app/(admin)/admin/layout.tsx
index fdb40bf..55fd12e 100644
--- a/services/webmail/src/app/(admin)/admin/layout.tsx
+++ b/services/webmail/src/app/(admin)/admin/layout.tsx
@@ -22,6 +22,8 @@ import { useTranslations } from "../../../i18n/provider";
import { LanguageSwitcher } from "../../../i18n/LanguageSwitcher";
import { useAccount } from "../../../lib/useAccount";
import { initialsFor } from "../../../lib/initials";
+import { Logo } from "../../../components/Logo";
+import { ThemeToggle } from "../../../components/ThemeToggle";
export default function AdminLayout({ children }: { children: React.ReactNode }) {
const t = useTranslations();
@@ -52,12 +54,10 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
const SidebarContent = (
-
- {"\u03bb"}
-
+
LambdaMail
-
+
{t("common.adminPortal")}
@@ -91,7 +91,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
{t("admin.backToWebmail")}
@@ -103,7 +103,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
-
+
{initialsFor(account?.email)}
@@ -122,12 +122,13 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
+
@@ -139,11 +140,9 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
return (
{/* Mobile Top Header */}
-
+
-
- {"\u03bb"}
-
+
{t("common.appName")} {t("common.adminPortal")}
@@ -152,14 +151,14 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
onClick={() => setMobileOpen(!mobileOpen)}
aria-label={t("ui.toggleMenu")}
aria-expanded={mobileOpen}
- className="flex h-9 w-9 flex-none items-center justify-center rounded-[10px] text-slate-300 transition-colors hover:bg-white/[0.07] hover:text-slate-100"
+ className="flex h-9 w-9 flex-none items-center justify-center rounded-[10px] text-slate-300 transition-colors hover:bg-ink/[0.07] hover:text-slate-100"
>
{mobileOpen ?
:
}
{/* Desktop rail */}
-