import type { CSSProperties, ReactNode, Ref } from 'react' import { IconCircleCheckFilled } from '@tabler/icons-react' import { useWorkspaceLayoutCtx } from '@/client/features/workspace/WorkspaceLayoutContext' import { BottomPanel } from '@/client/components/shared/BottomPanel' import { cn } from '@/client/lib/cn' import { getWorkspaceThemeStyle, usePreloadWorkspaceFonts } from '@/client/runtime/workspace-theme' import { COLOR_THEMES, type ColorThemeConfig, FONT_THEMES, RADIUS_THEMES, type RadiusThemeConfig, resolveWorkspaceTheme } from '@/lib/themes' import type { ColorTheme, FontTheme, RadiusTheme, WorkspaceTheme } from '@/lib/types' const FONT_OPTIONS = Object.entries(FONT_THEMES) as [FontTheme, (typeof FONT_THEMES)[FontTheme]][] const COLOR_OPTIONS = Object.entries(COLOR_THEMES) as [ColorTheme, ColorThemeConfig][] const RADIUS_OPTIONS = Object.entries(RADIUS_THEMES) as [RadiusTheme, RadiusThemeConfig][] type CustomizeOptionGroupProps = { children: ReactNode className?: string gridClassName?: string label: string } function CustomizeOptionGroup({ children, className, gridClassName, label }: CustomizeOptionGroupProps) { return (

{label}

{children}
) } type CustomizeOptionProps = { active: boolean children: ReactNode className?: string onSelect: () => void style?: CSSProperties } function CustomizeOption({ active, children, className, onSelect, style }: CustomizeOptionProps) { return ( ) } type CustomizePanelProps = { onClose: () => void ref?: Ref } export function CustomizePanel({ onClose, ref }: CustomizePanelProps) { usePreloadWorkspaceFonts() const { layout, setLayout } = useWorkspaceLayoutCtx() const theme = resolveWorkspaceTheme(layout.theme) function setTheme(update: Partial) { setLayout({ theme: { ...theme, ...update } }) } return (
{FONT_OPTIONS.map(([key, config]) => ( setTheme({ font: key })} style={{ fontFamily: config.sans }} > {config.label} ))} {COLOR_OPTIONS.map(([key, preset]) => ( setTheme({ color: key })} style={getWorkspaceThemeStyle({ ...theme, color: key })} >
Aa {preset.label}
))}
{RADIUS_OPTIONS.map(([key, preset]) => ( setTheme({ radius: key })} style={getWorkspaceThemeStyle({ ...theme, radius: key })} >
))}
) }