diff --git a/apps/matrix/apps/web/package.json b/apps/matrix/apps/web/package.json
index b3851d5ae..ade0c85a6 100644
--- a/apps/matrix/apps/web/package.json
+++ b/apps/matrix/apps/web/package.json
@@ -35,10 +35,12 @@
"buffer": "^6.0.3",
"events": "^3.3.0",
"@manacore/shared-auth": "workspace:*",
- "@manacore/shared-theme": "workspace:*",
- "@manacore/shared-tailwind": "workspace:*",
+ "@manacore/shared-branding": "workspace:*",
"@manacore/shared-i18n": "workspace:*",
"@manacore/shared-icons": "workspace:*",
+ "@manacore/shared-tailwind": "workspace:*",
+ "@manacore/shared-theme": "workspace:*",
+ "@manacore/shared-ui": "workspace:*",
"date-fns": "^4.1.0",
"svelte-i18n": "^4.0.1"
}
diff --git a/apps/matrix/apps/web/src/app.css b/apps/matrix/apps/web/src/app.css
index fa4d24d8d..2466c3026 100644
--- a/apps/matrix/apps/web/src/app.css
+++ b/apps/matrix/apps/web/src/app.css
@@ -7,6 +7,7 @@
@source '../../../../../packages/shared-icons/src';
@source '../../../../../packages/shared-auth-ui/src';
@source '../../../../../packages/shared-theme-ui/src';
+@source '../../../../../packages/shared-branding/src';
@layer base {
:root {
diff --git a/apps/matrix/apps/web/src/lib/i18n/index.ts b/apps/matrix/apps/web/src/lib/i18n/index.ts
new file mode 100644
index 000000000..9dba087ec
--- /dev/null
+++ b/apps/matrix/apps/web/src/lib/i18n/index.ts
@@ -0,0 +1,49 @@
+import { browser } from '$app/environment';
+import { init, register, locale, waitLocale } from 'svelte-i18n';
+
+// List of supported locales
+export const supportedLocales = ['de', 'en'] as const;
+export type SupportedLocale = (typeof supportedLocales)[number];
+
+// Default locale
+const defaultLocale = 'de';
+
+// Register all available locales
+register('de', () => import('./locales/de.json'));
+register('en', () => import('./locales/en.json'));
+
+// Get initial locale from browser or localStorage
+function getInitialLocale(): SupportedLocale {
+ if (browser) {
+ // Check localStorage first
+ const stored = localStorage.getItem('matrix_locale');
+ if (stored && supportedLocales.includes(stored as SupportedLocale)) {
+ return stored as SupportedLocale;
+ }
+
+ // Fall back to browser language
+ const browserLang = navigator.language.split('-')[0];
+ if (supportedLocales.includes(browserLang as SupportedLocale)) {
+ return browserLang as SupportedLocale;
+ }
+ }
+
+ return defaultLocale;
+}
+
+// Initialize i18n at module scope (required for SSR)
+init({
+ fallbackLocale: defaultLocale,
+ initialLocale: getInitialLocale(),
+});
+
+// Set locale and persist to localStorage
+export function setLocale(newLocale: SupportedLocale) {
+ locale.set(newLocale);
+ if (browser) {
+ localStorage.setItem('matrix_locale', newLocale);
+ }
+}
+
+// Wait for locale to be loaded (useful for SSR)
+export { waitLocale };
diff --git a/apps/matrix/apps/web/src/lib/i18n/locales/de.json b/apps/matrix/apps/web/src/lib/i18n/locales/de.json
new file mode 100644
index 000000000..3d1cd8197
--- /dev/null
+++ b/apps/matrix/apps/web/src/lib/i18n/locales/de.json
@@ -0,0 +1,25 @@
+{
+ "app": {
+ "name": "Mana Matrix",
+ "description": "Sicherer Matrix-Chat"
+ },
+ "nav": {
+ "chat": "Chat",
+ "settings": "Einstellungen"
+ },
+ "auth": {
+ "login": "Anmelden",
+ "logout": "Abmelden",
+ "connecting": "Verbinde mit Matrix...",
+ "connectionFailed": "Verbindung fehlgeschlagen",
+ "retry": "Erneut versuchen"
+ },
+ "chat": {
+ "newChat": "Neuer Chat",
+ "createRoom": "Raum erstellen",
+ "sendMessage": "Nachricht senden",
+ "typeMessage": "Nachricht schreiben...",
+ "noRooms": "Noch keine Räume",
+ "noMessages": "Noch keine Nachrichten"
+ }
+}
diff --git a/apps/matrix/apps/web/src/lib/i18n/locales/en.json b/apps/matrix/apps/web/src/lib/i18n/locales/en.json
new file mode 100644
index 000000000..24c380b25
--- /dev/null
+++ b/apps/matrix/apps/web/src/lib/i18n/locales/en.json
@@ -0,0 +1,25 @@
+{
+ "app": {
+ "name": "Mana Matrix",
+ "description": "Secure Matrix chat"
+ },
+ "nav": {
+ "chat": "Chat",
+ "settings": "Settings"
+ },
+ "auth": {
+ "login": "Sign in",
+ "logout": "Sign out",
+ "connecting": "Connecting to Matrix...",
+ "connectionFailed": "Connection failed",
+ "retry": "Retry"
+ },
+ "chat": {
+ "newChat": "New Chat",
+ "createRoom": "Create Room",
+ "sendMessage": "Send message",
+ "typeMessage": "Type a message...",
+ "noRooms": "No rooms yet",
+ "noMessages": "No messages yet"
+ }
+}
diff --git a/apps/matrix/apps/web/src/lib/stores/navigation.ts b/apps/matrix/apps/web/src/lib/stores/navigation.ts
new file mode 100644
index 000000000..f4072e926
--- /dev/null
+++ b/apps/matrix/apps/web/src/lib/stores/navigation.ts
@@ -0,0 +1,4 @@
+import { writable } from 'svelte/store';
+
+export const isSidebarMode = writable(false);
+export const isNavCollapsed = writable(false);
diff --git a/apps/matrix/apps/web/src/lib/stores/theme.ts b/apps/matrix/apps/web/src/lib/stores/theme.ts
new file mode 100644
index 000000000..aa8c603b7
--- /dev/null
+++ b/apps/matrix/apps/web/src/lib/stores/theme.ts
@@ -0,0 +1,10 @@
+import { createThemeStore } from '@manacore/shared-theme';
+
+export const theme = createThemeStore({
+ appId: 'matrix',
+ defaultVariant: 'purple',
+ primaryColor: {
+ light: '270 70% 60%', // Purple/violet
+ dark: '270 70% 60%',
+ },
+});
diff --git a/apps/matrix/apps/web/src/routes/(app)/+layout.svelte b/apps/matrix/apps/web/src/routes/(app)/+layout.svelte
index d0be8c7ff..41517c8c5 100644
--- a/apps/matrix/apps/web/src/routes/(app)/+layout.svelte
+++ b/apps/matrix/apps/web/src/routes/(app)/+layout.svelte
@@ -1,9 +1,30 @@
+
Connecting to Matrix...
-+
Connecting to Matrix...
+{#if matrixStore.syncState === 'PREPARED'} Preparing sync... {:else if matrixStore.syncState === 'SYNCING'} @@ -78,28 +197,97 @@
{initError}
+{initError}
Redirecting...
+Redirecting...