- Extract theme constants (THEMES, THEME_CLASSES, DARK_SURFACES) into a new framework-free lib/themes.ts so server and client code share one source of truth; re-export from theme-provider for backward compatibility. - Add nullable `theme` column to Project (Prisma migration + schema), plus ProjectThemeSchema validation and a setProjectTheme server action. - Introduce a ThemeScope context in the provider: a subtree can temporarily override the global preference via useThemeScope().setScope(name); the scoped theme wins for resolvedTheme/DOM while active, then lifts on cleanup. - Render an inline no-FOUC script (themeSwitchScript) on project pages that applies the theme class before first paint and leaves a data-project-theme marker the provider reads at hydration. - Add ProjectThemeScope component that sets/clears the scope from live ProjectsContext state, so picking a new theme updates instantly without waiting for the server re-render. - Add ProjectThemePicker dropdown (Default + light/dark options) rendered beside the project title in the kanban board header. - Wire optimistic setProjectTheme into ProjectsContext with rollback and error toast on failure. - Update use-dark-theme hooks to read resolvedTheme from context instead of resolving locally, so they reflect scoped themes correctly. |
||
|---|---|---|
| .. | ||
| admin | ||
| ai | ||
| auth | ||
| board | ||
| chat | ||
| markdown | ||
| nav | ||
| projects | ||
| pwa | ||
| scheduled | ||
| theme | ||
| ui | ||
| confirm-delete-dialog.tsx | ||
| hold-on-complete.tsx | ||