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 ( 界面设置 调整主题、侧边栏和页面布局。
) } function SectionTitle({ title, showReset = false, onReset, className, }: { title: string showReset?: boolean onReset?: () => void 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)} /> {[ { value: 'system', label: '跟随系统', icon: IconThemeSystem, }, { value: 'light', label: '浅色', icon: IconThemeLight, }, { value: 'dark', label: '深色', icon: IconThemeDark, }, ].map((item) => ( ))}
可选择跟随系统、浅色或深色主题
) } function SidebarConfig() { const { defaultVariant, variant, setVariant } = useLayout() return (
setVariant(defaultVariant)} /> {[ { value: 'inset', label: '内嵌', icon: IconSidebarInset, }, { value: 'floating', label: '悬浮', icon: IconSidebarFloating, }, { value: 'sidebar', label: '标准', 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) }} /> { 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='选择展开方式' aria-describedby='layout-description' > {[ { value: 'default', label: '默认', icon: IconLayoutDefault, }, { value: 'icon', label: '紧凑', icon: IconLayoutCompact, }, { value: 'offcanvas', label: '完全收起', icon: IconLayoutFull, }, ].map((item) => ( ))}
可选择默认展开、仅显示图标或完全收起
) } function DirConfig() { const { defaultDir, dir, setDir } = useDirection() return (
setDir(defaultDir)} /> {[ { value: 'ltr', label: '从左到右', icon: (props: SVGProps) => ( ), }, { value: 'rtl', label: '从右到左', icon: (props: SVGProps) => ( ), }, ].map((item) => ( ))}
可选择从左到右或从右到左
) }