"use client"; import { Check, ChevronDown, Monitor, Palette } from "lucide-react"; import type { LucideIcon } from "lucide-react"; import { useProjects } from "@/components/projects/projects-context"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { LIGHT_OPTIONS, DARK_OPTIONS, type ThemeOption, } from "@/components/theme/theme-toggle"; import { useTheme, type ThemeName } from "@/components/theme/theme-provider"; const DEFAULT_LABEL = "Default theme"; /** One named-theme row. Uses DropdownMenuItem (a real menu item) so the * menu closes on selection, matching the app's other menus. */ function ThemeOptionRow({ option, active, onSelect, }: { option: ThemeOption; active: boolean; onSelect: () => void; }) { const Icon: LucideIcon = option.icon; return ( {option.label} {active && } ); } /** * The per-project theme picker, rendered to the right of a project's name * (see components/board/kanban-board.tsx). * * "Default theme" (project.theme = null) means "whatever the user assigned * in the global theme menu" -- the same value this picker's checkmark and * label track, live. Picking a named theme stores it on the project; the * project page then scopes the app to that theme while it's open * (components/theme/project-theme-scope.tsx). */ export function ProjectThemePicker({ projectId }: { projectId: string }) { const { projects, setProjectTheme } = useProjects(); const { resolvedTheme } = useTheme(); const project = projects.find((p) => p.id === projectId); if (!project) return null; const theme: ThemeName | null = project.theme; const activeOption = theme ? [...LIGHT_OPTIONS, ...DARK_OPTIONS].find((o) => o.value === theme) : undefined; return ( {theme ? activeOption?.label ?? DEFAULT_LABEL : DEFAULT_LABEL} } /> setProjectTheme(projectId, null)} className="gap-2.5 px-2 py-1.5 text-sm cursor-pointer" > Default theme Follows the global theme menu {theme === null && } Light {LIGHT_OPTIONS.map((option) => ( setProjectTheme(projectId, option.value)} /> ))} Dark {DARK_OPTIONS.map((option) => ( setProjectTheme(projectId, option.value)} /> ))}

{theme === null ? `Currently following your global theme (now: ${ resolvedTheme.charAt(0).toUpperCase() + resolvedTheme.slice(1) }).` : `This theme applies only while "${project.title}" is open.`}

); }