import { type SVGProps } from 'react' import { Root as Radio, Item } from '@radix-ui/react-radio-group' import { CircleCheck, RotateCcw, Settings } from 'lucide-react' import { IconDir } from '@/assets/custom/icon-dir' import { IconLayoutCompact } from '@/assets/custom/icon-layout-compact' import { IconLayoutDefault } from '@/assets/custom/icon-layout-default' import { IconLayoutFull } from '@/assets/custom/icon-layout-full' import { IconSidebarFloating } from '@/assets/custom/icon-sidebar-floating' import { IconSidebarInset } from '@/assets/custom/icon-sidebar-inset' import { IconSidebarSidebar } from '@/assets/custom/icon-sidebar-sidebar' import { IconThemeDark } from '@/assets/custom/icon-theme-dark' import { IconThemeLight } from '@/assets/custom/icon-theme-light' import { IconThemeSystem } from '@/assets/custom/icon-theme-system' import { cn } from '@/lib/utils' import { useDirection } from '@/context/direction-provider' import { type Collapsible, useLayout } from '@/context/layout-provider' import { useTheme } from '@/context/theme-provider' import { Button } from '@/components/ui/button' import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from '@/components/ui/sheet' import { useSidebar } from './ui/sidebar' export function ConfigDrawer() { const { setOpen } = useSidebar() const { resetDir } = useDirection() const { resetTheme } = useTheme() const { resetLayout } = useLayout() const handleReset = () => { setOpen(true) resetDir() resetTheme() resetLayout() } return ( Theme Settings Adjust the appearance and layout to suit your preferences.
) } function SectionTitle({ title, showReset = false, onReset, resetAriaLabel, className, }: { title: string showReset?: boolean onReset?: () => void /** Shown on the small per-section reset (RotateCcw) for accessibility and tests. */ resetAriaLabel?: string className?: string }) { return (
{title} {showReset && onReset && ( )}
) } function RadioGroupItem({ item, isTheme = false, }: { item: { value: string label: string icon: (props: SVGProps) => React.ReactElement } isTheme?: boolean }) { return (
{item.label}
) } function ThemeConfig() { const { defaultTheme, theme, setTheme } = useTheme() return (
setTheme(defaultTheme)} resetAriaLabel='Reset theme preference to default' /> {[ { value: 'system', label: 'System', icon: IconThemeSystem, }, { value: 'light', label: 'Light', icon: IconThemeLight, }, { value: 'dark', label: 'Dark', icon: IconThemeDark, }, ].map((item) => ( ))}
Choose between system preference, light mode, or dark mode
) } function SidebarConfig() { const { defaultVariant, variant, setVariant } = useLayout() return (
setVariant(defaultVariant)} resetAriaLabel='Reset sidebar style to default' /> {[ { value: 'inset', label: 'Inset', icon: IconSidebarInset, }, { value: 'floating', label: 'Floating', icon: IconSidebarFloating, }, { value: 'sidebar', label: 'Sidebar', icon: IconSidebarSidebar, }, ].map((item) => ( ))}
) } function LayoutConfig() { const { open, setOpen } = useSidebar() const { defaultCollapsible, collapsible, setCollapsible } = useLayout() const radioState = open ? 'default' : collapsible return (
{ setOpen(true) setCollapsible(defaultCollapsible) }} resetAriaLabel='Reset layout options to default' /> { if (v === 'default') { setOpen(true) return } setOpen(false) setCollapsible(v as Collapsible) }} className='grid w-full max-w-md grid-cols-3 gap-4' aria-label='Select layout style' aria-describedby='layout-description' > {[ { value: 'default', label: 'Default', icon: IconLayoutDefault, }, { value: 'icon', label: 'Compact', icon: IconLayoutCompact, }, { value: 'offcanvas', label: 'Full layout', icon: IconLayoutFull, }, ].map((item) => ( ))}
Choose between default expanded, compact icon-only, or full layout mode
) } function DirConfig() { const { defaultDir, dir, setDir } = useDirection() return (
setDir(defaultDir)} resetAriaLabel='Reset text direction to default' /> {[ { value: 'ltr', label: 'Left to Right', icon: (props: SVGProps) => ( ), }, { value: 'rtl', label: 'Right to Left', icon: (props: SVGProps) => ( ), }, ].map((item) => ( ))}
Choose between left-to-right or right-to-left site direction
) }