Private
Public Access
1
0

Add tenant branding & theming system with admin UI

Tenant admins can now customize their workspace appearance: page/nav
backgrounds (solid, gradient, or image), column/card colors, borders,
text, opacity with glass blur, card corner radius, and accent colors.
Light and dark mode are configured separately. Theme CSS is injected
server-side via transformPageChunk to prevent FOUC.

Includes avatar components, account page updates, and pre-existing
type error fixes (Buffer, async onMount, InputJsonValue).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-26 21:56:39 -05:00
parent 029b467eae
commit 3a11ed01e9
30 changed files with 1709 additions and 60 deletions
+57
View File
@@ -22,6 +22,7 @@ model Tenant {
tags Tag[]
categories Category[]
boardTemplates BoardTemplate[]
theme TenantTheme?
@@map("tenants")
}
@@ -329,3 +330,59 @@ model BoardTemplate {
@@map("board_templates")
}
// ─── Tenant Branding & Theming ───────────────────────────────
model TenantTheme {
id String @id @default(uuid()) @db.Uuid
tenantId String @unique @map("tenant_id") @db.Uuid
// Light mode
lightPageBg String? @map("light_page_bg")
lightPageBgImage String? @map("light_page_bg_image")
lightNavBg String? @map("light_nav_bg")
lightNavBgImage String? @map("light_nav_bg_image")
lightColumnBg String? @map("light_column_bg")
lightColumnBorder String? @map("light_column_border")
lightColumnText String? @map("light_column_text")
lightColumnOpacity Float? @map("light_column_opacity")
lightCardBg String? @map("light_card_bg")
lightCardBorder String? @map("light_card_border")
lightCardText String? @map("light_card_text")
lightCardOpacity Float? @map("light_card_opacity")
lightCardRadius String? @map("light_card_radius")
lightPrimary String? @map("light_primary")
lightPrimaryHover String? @map("light_primary_hover")
lightDanger String? @map("light_danger")
lightDangerHover String? @map("light_danger_hover")
lightSuccess String? @map("light_success")
lightWarning String? @map("light_warning")
// Dark mode
darkPageBg String? @map("dark_page_bg")
darkPageBgImage String? @map("dark_page_bg_image")
darkNavBg String? @map("dark_nav_bg")
darkNavBgImage String? @map("dark_nav_bg_image")
darkColumnBg String? @map("dark_column_bg")
darkColumnBorder String? @map("dark_column_border")
darkColumnText String? @map("dark_column_text")
darkColumnOpacity Float? @map("dark_column_opacity")
darkCardBg String? @map("dark_card_bg")
darkCardBorder String? @map("dark_card_border")
darkCardText String? @map("dark_card_text")
darkCardOpacity Float? @map("dark_card_opacity")
darkCardRadius String? @map("dark_card_radius")
darkPrimary String? @map("dark_primary")
darkPrimaryHover String? @map("dark_primary_hover")
darkDanger String? @map("dark_danger")
darkDangerHover String? @map("dark_danger_hover")
darkSuccess String? @map("dark_success")
darkWarning String? @map("dark_warning")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
@@map("tenant_themes")
}