- 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.