3 Commits

Author SHA1 Message Date
Nico
599c5132a5 feat(theme): per-tenant dark/bright themes, brand decoupled from mode
- TenantConfig gains themes: { dark, bright } — CSS data-theme names per mode
- tenants/loop42/theme.css: dark + bright CSS blocks (moved out of base.css)
- tenants/dev/theme.css: titan-bright CSS block (titan dark stays as :root)
- useTheme: stores 'dark'|'bright' in nyx_mode, toggles via tenant themes config
- AppToolbar: single sun/moon toggle replaces multi-button brand switcher
- AppSidebar, HomeView, router: brand name/icon from tenant.name directly, not theme
- themeSwitcher feature flag removed (replaced by universal toggle)
- Fix: local K3s auth mismatch — VITE_AUTH_DISABLED removed from .env.local;
  infra/k8s/local/runtime.yaml sets AUTH_ENABLED=false to match test namespace

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 00:37:13 +02:00
Nico
d6337c1ece Tenant-specific OIDC: separate Zitadel projects per tenant
Each tenant config now includes oidcClientId. Auth composable reads
client ID from tenant config instead of hardcoded fallback. Dev tenant
uses restricted Zitadel project (role-check enabled, developer grant).
Added NODE_ENV=production to env files to fix --mode dev builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 17:37:16 +02:00
Nico
42c6079755 Multi-tenant build system with K8s namespace separation
Build-time tenant config via VITE_TENANT env var (--mode loop42/dev).
Content pages moved to tenants/{name}/pages/ with dynamic imports and
loop42 fallback. Feature-gated routing (viewer/devTools per tenant).
Dockerfile parameterized with TENANT build arg. Deployed to separate
K8s namespaces: loop42.de → ns/loop42, loop42.dev → ns/dev.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 17:09:22 +02:00