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) => (
))}
可选择从左到右或从右到左
)
}