@ug666/ui-react 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/blocks/index.cjs +238 -0
  2. package/dist/blocks/index.cjs.map +1 -0
  3. package/dist/blocks/index.d.cts +86 -0
  4. package/dist/blocks/index.d.ts +86 -0
  5. package/dist/blocks/index.js +153 -0
  6. package/dist/blocks/index.js.map +1 -0
  7. package/dist/button-CaLZig8j.d.cts +22 -0
  8. package/dist/button-CaLZig8j.d.ts +22 -0
  9. package/dist/chunk-2IVRUJKO.js +377 -0
  10. package/dist/chunk-2IVRUJKO.js.map +1 -0
  11. package/dist/chunk-73WQAE3E.js +3003 -0
  12. package/dist/chunk-73WQAE3E.js.map +1 -0
  13. package/dist/chunk-RUDEZA5Q.js +62 -0
  14. package/dist/chunk-RUDEZA5Q.js.map +1 -0
  15. package/dist/chunk-S45GP6IB.js +254 -0
  16. package/dist/chunk-S45GP6IB.js.map +1 -0
  17. package/dist/components/index.cjs +3993 -0
  18. package/dist/components/index.cjs.map +1 -0
  19. package/dist/components/index.d.cts +1097 -0
  20. package/dist/components/index.d.ts +1097 -0
  21. package/dist/components/index.js +330 -0
  22. package/dist/components/index.js.map +1 -0
  23. package/dist/hooks/index.cjs +1 -0
  24. package/dist/hooks/index.cjs.map +1 -1
  25. package/dist/hooks/index.js +1 -0
  26. package/dist/index.cjs +1410 -710
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +274 -1340
  29. package/dist/index.d.ts +274 -1340
  30. package/dist/index.js +385 -3229
  31. package/dist/index.js.map +1 -1
  32. package/dist/labs/index.cjs +34 -0
  33. package/dist/labs/index.cjs.map +1 -0
  34. package/dist/labs/index.d.cts +12 -0
  35. package/dist/labs/index.d.ts +12 -0
  36. package/dist/labs/index.js +9 -0
  37. package/dist/labs/index.js.map +1 -0
  38. package/dist/patterns/index.cjs +758 -0
  39. package/dist/patterns/index.cjs.map +1 -0
  40. package/dist/patterns/index.d.cts +158 -0
  41. package/dist/patterns/index.d.ts +158 -0
  42. package/dist/patterns/index.js +320 -0
  43. package/dist/patterns/index.js.map +1 -0
  44. package/dist/primitives/index.cjs +384 -0
  45. package/dist/primitives/index.cjs.map +1 -0
  46. package/dist/primitives/index.d.cts +137 -0
  47. package/dist/primitives/index.d.ts +137 -0
  48. package/dist/primitives/index.js +56 -0
  49. package/dist/primitives/index.js.map +1 -0
  50. package/dist/sidebar-vl00Z2o-.d.cts +93 -0
  51. package/dist/sidebar-vl00Z2o-.d.ts +93 -0
  52. package/dist/styles.css +2499 -0
  53. package/dist/tokens.css +86 -9
  54. package/package.json +36 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/index.ts","../../src/components/button.tsx","../../src/internal/cn.ts","../../src/components/input.tsx","../../src/components/label.tsx","../../src/components/card.tsx","../../src/components/badge.tsx","../../src/components/tag.tsx","../../src/components/modal.tsx","../../src/hooks/use-escape-key.ts","../../src/internal/use-portal-container.ts","../../src/components/dialog.tsx","../../src/components/drawer.tsx","../../src/components/table.tsx","../../src/components/toast.tsx","../../src/components/sidebar.tsx","../../src/components/pagination.tsx","../../src/components/select.tsx","../../src/components/spinner.tsx","../../src/components/checkbox.tsx","../../src/components/radio.tsx","../../src/components/slider.tsx","../../src/components/number-input.tsx","../../src/components/otp-input.tsx","../../src/components/form.tsx","../../src/components/tabs.tsx","../../src/components/accordion.tsx","../../src/components/steps.tsx","../../src/components/dropdown.tsx","../../src/components/popover.tsx","../../src/components/context-menu.tsx","../../src/components/navigation-menu.tsx","../../src/components/avatar.tsx","../../src/components/avatar-group.tsx","../../src/components/tooltip.tsx","../../src/components/alert.tsx","../../src/components/breadcrumb.tsx","../../src/components/switch.tsx","../../src/components/textarea.tsx","../../src/components/skeleton.tsx","../../src/components/progress.tsx","../../src/components/sheet.tsx","../../src/components/empty-state.tsx","../../src/components/separator.tsx","../../src/components/descriptions.tsx","../../src/components/statistic.tsx"],"sourcesContent":["\"use client\"\n\n/**\n * @description: React components 子入口 — 导出通用 UI 组件,不包含 hooks、patterns、blocks、labs\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n\nexport * from '../aliases'\nexport * from './accordion'\nexport * from './alert'\nexport * from './avatar'\nexport * from './avatar-group'\nexport * from './badge'\nexport * from './breadcrumb'\nexport * from './button'\nexport * from './card'\nexport * from './checkbox'\nexport * from './context-menu'\nexport * from './descriptions'\nexport * from './dialog'\nexport * from './drawer'\nexport * from './dropdown'\nexport * from './empty-state'\nexport * from './form'\nexport * from './input'\nexport * from './label'\nexport * from './modal'\nexport * from './navigation-menu'\nexport * from './number-input'\nexport * from './otp-input'\nexport * from './pagination'\nexport * from './popover'\nexport * from './progress'\nexport * from './radio'\nexport * from './select'\nexport * from './separator'\nexport * from './sheet'\nexport * from './sidebar'\nexport * from './skeleton'\nexport * from './slider'\nexport * from './spinner'\nexport * from './statistic'\nexport * from './steps'\nexport * from './switch'\nexport * from './table'\nexport * from './tabs'\nexport * from './tag'\nexport * from './textarea'\nexport * from './toast'\nexport * from './tooltip'\n","/**\n * @description: Button 按钮组件 — 基于 CVA 管理变体,支持 loading/disabled 状态\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-[background,border-color,color,box-shadow,transform] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-fg shadow-sm hover:bg-primary-hover hover:shadow-md focus-visible:ring-ring',\n destructive:\n 'bg-danger text-danger-fg shadow-sm hover:bg-danger-hover hover:shadow-md focus-visible:ring-danger',\n outline:\n 'border border-border-strong bg-surface-1 text-text-primary shadow-sm hover:border-primary/55 hover:bg-surface-2 focus-visible:ring-ring/30',\n secondary:\n 'border border-border-base bg-surface-2 text-text-primary shadow-sm hover:bg-surface-3 focus-visible:ring-ring/30',\n ghost:\n 'text-text-primary hover:bg-surface-2 focus-visible:ring-ring/30',\n link: 'text-text-primary underline-offset-4 hover:underline focus-visible:ring-ring/30',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 px-3 text-xs',\n lg: 'h-11 px-5 text-base',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** 是否处于加载状态,加载时显示旋转图标并禁用点击 */\n loading?: boolean\n}\n\n/**\n * 通用按钮组件\n * @example\n * <Button variant=\"default\" size=\"lg\" onClick={handleClick}>确认</Button>\n * <Button variant=\"destructive\" loading>删除中...</Button>\n * <Button variant=\"outline\" size=\"sm\">取消</Button>\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, loading = false, disabled, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" size={16} />}\n {children}\n </button>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","/**\n * @description: React 包内部类名合并工具\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-27\n */\nimport { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","/**\n * @description: Input 输入框组件 — 支持 label、error、helperText,error 状态边框变红\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef, useId } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /** 输入框标签文本 */\n label?: string\n /** 错误提示文本,有值时边框变红 */\n error?: string\n /** 帮助说明文本 */\n helperText?: string\n}\n\n/**\n * 通用输入框组件\n * @example\n * <Input label=\"用户名\" placeholder=\"请输入用户名\" />\n * <Input label=\"邮箱\" error=\"邮箱格式不正确\" value={email} onChange={handleChange} />\n * <Input label=\"备注\" helperText=\"最多 200 字\" />\n */\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, label, error, helperText, id, ...props }, ref) => {\n const generatedId = useId()\n const inputId = id ?? generatedId\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-text-primary\"\n >\n {label}\n </label>\n )}\n <input\n ref={ref}\n id={inputId}\n className={cn(\n 'flex h-9 w-full rounded-md border bg-surface-1 px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error\n ? 'border-danger focus-visible:ring-danger'\n : 'border-border-strong focus-visible:ring-ring/30',\n className\n )}\n {...props}\n />\n {error && (\n <p className=\"text-xs text-danger\">{error}</p>\n )}\n {!error && helperText && (\n <p className=\"text-xs text-text-secondary\">{helperText}</p>\n )}\n </div>\n )\n }\n)\n\nInput.displayName = 'Input'\n\nexport { Input }\n","/**\n * @description: Label 标签组件 — 支持 required 红色星号标记\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n /** 是否为必填项,显示红色星号 */\n required?: boolean\n}\n\n/**\n * 通用标签组件\n * @example\n * <Label htmlFor=\"email\">邮箱</Label>\n * <Label htmlFor=\"name\" required>姓名</Label>\n */\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(({ className, required, children, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={cn(\n 'leading-none text-sm font-medium text-text-primary peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n >\n {children}\n {required && (\n <span className=\"ml-0.5 text-danger\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )\n})\n\nLabel.displayName = 'Label'\n\nexport { Label }\n","/**\n * @description: Card 卡片组件 — 包含 Card/CardHeader/CardTitle/CardDescription/CardContent/CardFooter\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cn } from '../internal/cn'\n\nexport type CardProps = React.HTMLAttributes<HTMLDivElement>\nexport type CardHeaderProps = React.HTMLAttributes<HTMLDivElement>\nexport type CardTitleProps = React.HTMLAttributes<HTMLHeadingElement>\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>\nexport type CardContentProps = React.HTMLAttributes<HTMLDivElement>\nexport type CardFooterProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * 卡片容器\n * @example\n * <Card>\n * <CardHeader>\n * <CardTitle>标题</CardTitle>\n * <CardDescription>描述文字</CardDescription>\n * </CardHeader>\n * <CardContent>内容区域</CardContent>\n * <CardFooter>底部操作</CardFooter>\n * </Card>\n */\nconst Card = forwardRef<HTMLDivElement, CardProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('rounded-lg border border-border-base bg-surface-1 shadow-sm', className)} {...props} />\n})\n\nconst CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex flex-col gap-1 px-5 py-4 border-b border-border-base', className)} {...props} />\n})\n\nconst CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps>(({ className, ...props }, ref) => {\n return <h3 ref={ref} className={cn('leading-none font-semibold text-text-primary', className)} {...props} />\n})\n\nconst CardDescription = forwardRef<HTMLParagraphElement, CardDescriptionProps>(({ className, ...props }, ref) => {\n return <p ref={ref} className={cn('text-sm text-text-secondary', className)} {...props} />\n})\n\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('px-5 py-4', className)} {...props} />\n})\n\nconst CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex items-center px-5 py-4 border-t border-border-base', className)} {...props} />\n})\n\nCard.displayName = 'Card'\nCardHeader.displayName = 'CardHeader'\nCardTitle.displayName = 'CardTitle'\nCardDescription.displayName = 'CardDescription'\nCardContent.displayName = 'CardContent'\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter }\n","/**\n * @description: Badge 徽标组件 — 基于 CVA 管理 default/secondary/destructive/outline/success/warning 变体\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst badgeVariants = cva(\n 'inline-flex min-h-6 items-center rounded-md px-2.5 py-0.5 text-xs font-semibold leading-none transition-colors',\n {\n variants: {\n variant: {\n default:\n 'border border-primary/20 bg-primary-soft text-primary-soft-fg',\n secondary:\n 'border border-border-base bg-surface-2 text-text-primary',\n destructive:\n 'border border-danger/20 bg-danger-soft text-danger-soft-fg',\n outline:\n 'border border-border-strong bg-transparent text-text-primary',\n success:\n 'border border-success/20 bg-success-soft text-success-soft-fg',\n warning:\n 'border border-warning/20 bg-warning-soft text-warning-soft-fg',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {}\n\n/**\n * 徽标组件\n * @example\n * <Badge variant=\"default\">新品</Badge>\n * <Badge variant=\"success\">已完成</Badge>\n * <Badge variant=\"destructive\">已删除</Badge>\n * <Badge variant=\"warning\">待审核</Badge>\n */\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(({ className, variant, ...props }, ref) => {\n return <span ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\n})\n\nBadge.displayName = 'Badge'\n\nexport { Badge, badgeVariants }\n","/**\n * @description: Tag 标签组件 — 支持多种语义变体、可关闭交互,区别于纯展示的 Badge\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef } from 'react'\nimport { X } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst tagVariants = cva(\n 'inline-flex items-center gap-1.5 rounded-md border font-medium leading-none transition-colors',\n {\n variants: {\n variant: {\n default: 'border-border-base bg-surface-2 text-text-primary',\n primary: 'border-primary/20 bg-primary-soft text-primary-soft-fg',\n success: 'border-success/20 bg-success-soft text-success-soft-fg',\n warning: 'border-warning/20 bg-warning-soft text-warning-soft-fg',\n destructive: 'border-danger/20 bg-danger-soft text-danger-soft-fg',\n outline: 'border-border-strong bg-transparent text-text-primary',\n },\n size: {\n sm: 'min-h-6 px-2 text-[11px]',\n default: 'min-h-7 px-2.5 text-xs',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface TagProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'color'>,\n VariantProps<typeof tagVariants> {\n /** 是否显示关闭按钮 */\n closable?: boolean\n /** 是否禁用 */\n disabled?: boolean\n /** 自定义背景色(覆盖 variant 颜色,建议传 token CSS 变量) */\n color?: string\n /** 关闭按钮点击回调 */\n onClose?: (event: React.MouseEvent<HTMLButtonElement>) => void\n}\n\n/**\n * 标签组件(可交互,支持关闭)\n * @example\n * <Tag>默认标签</Tag>\n * <Tag variant=\"success\">已完成</Tag>\n * <Tag variant=\"primary\" closable onClose={removeTag}>可关闭</Tag>\n * <Tag variant=\"warning\" disabled>禁用状态</Tag>\n * <Tag color=\"hsl(var(--primary))\">自定义颜色</Tag>\n */\nconst Tag = forwardRef<HTMLSpanElement, TagProps>(\n ({ variant, size, closable = false, disabled = false, color, onClose, className, children, style, ...props }, ref) => {\n const customStyle: React.CSSProperties = color\n ? { backgroundColor: color, color: 'hsl(var(--primary-fg))', borderColor: color, ...style }\n : (style ?? {})\n\n function handleClose(event: React.MouseEvent<HTMLButtonElement>) {\n event.stopPropagation()\n if (!disabled) {\n onClose?.(event)\n }\n }\n\n return (\n <span\n ref={ref}\n className={cn(tagVariants({ variant, size }), disabled && 'cursor-not-allowed opacity-50', className)}\n style={customStyle}\n {...props}\n >\n {children}\n {closable && (\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={disabled}\n className=\"-mr-1 inline-flex h-4 w-4 items-center justify-center rounded-sm opacity-70 transition hover:bg-surface-3 hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current disabled:pointer-events-none\"\n aria-label=\"关闭标签\"\n >\n <X size={10} strokeWidth={2.5} />\n </button>\n )}\n </span>\n )\n }\n)\n\nTag.displayName = 'Tag'\n\nexport { Tag, tagVariants }\n","/**\n * @description: Modal 对话框组件 — 纯原生实现,支持遮罩点击关闭和 ESC 关闭,无 Radix 依赖\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../internal/cn'\nimport { useEscapeKey } from '../hooks/use-escape-key'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\nexport interface ModalProps {\n /** 是否显示 */\n open: boolean\n /** 关闭回调 */\n onClose: () => void\n /** 子内容 */\n children: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nexport interface ModalContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 最大宽度,默认 max-w-lg */\n maxWidth?: string\n}\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>\nexport interface ModalCloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * 对话框组件\n * @example\n * <Modal open={isOpen} onClose={() => setIsOpen(false)}>\n * <ModalContent>\n * <ModalHeader>\n * <ModalTitle>确认删除</ModalTitle>\n * </ModalHeader>\n * <p className=\"px-6 pb-4 text-sm text-text-secondary\">此操作不可撤销。</p>\n * <ModalFooter>\n * <Button variant=\"outline\" onClick={() => setIsOpen(false)}>取消</Button>\n * <Button variant=\"destructive\">删除</Button>\n * </ModalFooter>\n * </ModalContent>\n * </Modal>\n */\nconst Modal = forwardRef<HTMLDivElement, ModalProps>(({ open, onClose, children, className }, ref) => {\n useEscapeKey(open, onClose)\n const portalContainer = usePortalContainer()\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={ref}\n className={cn(\n 'fixed inset-0 z-[80] flex items-center justify-center p-4',\n className\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* 遮罩层,点击关闭 */}\n <div\n className=\"absolute inset-0 bg-overlay\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n {/* 内容区域,阻止事件冒泡 */}\n <div className=\"relative z-10\">{children}</div>\n </div>,\n portalContainer\n )\n})\n\nconst ModalContent = forwardRef<HTMLDivElement, ModalContentProps>(({ className, maxWidth = 'max-w-lg', children, ...props }, ref) => {\n return (\n <div ref={ref} className={cn('flex max-h-[85vh] w-full flex-col rounded-lg border border-border-base bg-surface-1 shadow-xl', maxWidth, className)} {...props}>\n {children}\n </div>\n )\n})\n\nconst ModalHeader = forwardRef<HTMLDivElement, ModalHeaderProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex shrink-0 items-center justify-between border-b border-border-base px-6 py-4', className)} {...props} />\n})\n\nconst ModalTitle = forwardRef<HTMLHeadingElement, ModalTitleProps>(({ className, ...props }, ref) => {\n return <h2 ref={ref} className={cn('text-lg font-semibold text-text-primary', className)} {...props} />\n})\n\nconst ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('flex shrink-0 items-center justify-end gap-2 border-t border-border-base px-6 py-4', className)} {...props} />\n})\n\n/** 独立关闭按钮,可放在 ModalHeader 右侧 */\nconst ModalCloseButton = forwardRef<HTMLButtonElement, ModalCloseButtonProps>(({ onClick, className, type = 'button', ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n onClick={onClick}\n className={cn(\n 'rounded-md p-1 text-text-tertiary transition-colors hover:bg-surface-3 hover:text-text-secondary',\n className\n )}\n aria-label=\"关闭\"\n {...props}\n >\n <X size={18} />\n </button>\n )\n})\n\nModal.displayName = 'Modal'\nModalContent.displayName = 'ModalContent'\nModalHeader.displayName = 'ModalHeader'\nModalTitle.displayName = 'ModalTitle'\nModalFooter.displayName = 'ModalFooter'\nModalCloseButton.displayName = 'ModalCloseButton'\n\nexport { Modal, ModalContent, ModalHeader, ModalTitle, ModalFooter, ModalCloseButton }\n","/**\n * @description: 内部 hook — 当组件处于 open 状态时,监听 Escape 键并锁定 body 滚动\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { useCallback, useEffect } from 'react'\n\n/**\n * 叠加层组件(Modal / Sheet / Drawer / Dialog)公共行为:\n * - open 为 true 时:注册 keydown 监听,锁定 body 滚动\n * - open 为 false 或卸载时:移除监听,解锁 body 滚动\n *\n * @param open - 组件是否处于展开状态\n * @param onEscape - 按下 Escape 时的回调\n */\nexport function useEscapeKey(open: boolean, onEscape: () => void): void {\n const handleEscape = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onEscape()\n },\n [onEscape],\n )\n\n useEffect(() => {\n if (!open || typeof document === 'undefined') return\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n return () => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n }\n }, [open, handleEscape])\n}\n","/**\n * @description: 内部 hook — 在客户端挂载后提供 portal 容器,避免 SSR render 阶段访问 document\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-31\n */\nimport { useEffect, useState } from 'react'\n\nexport function usePortalContainer(): HTMLElement | null {\n const [container, setContainer] = useState<HTMLElement | null>(null)\n\n useEffect(() => {\n if (typeof document === 'undefined') return\n setContainer(document.body)\n }, [])\n\n return container\n}\n","/**\n * @description: Dialog 确认对话框组件 — AlertDialog 模式,支持 default/destructive 变体、ESC 和遮罩关闭\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\nimport { useEscapeKey } from '../hooks/use-escape-key'\n\n/** Dialog 变体类型 */\nexport type DialogVariant = 'default' | 'destructive'\n\nexport interface DialogProps {\n /** 是否显示 */\n open: boolean\n /** 打开/关闭状态变化回调 */\n onOpenChange: (open: boolean) => void\n /** 对话框标题 */\n title: string\n /** 对话框描述文字 */\n description?: string\n /** 变体:default(默认蓝色确认)或 destructive(红色危险确认) */\n variant?: DialogVariant\n /** 取消按钮文案,默认\"取消\" */\n cancelText?: string\n /** 确认按钮文案,默认\"确认\" */\n confirmText?: string\n /** 点击确认回调 */\n onConfirm?: () => void\n /** 点击取消回调 */\n onCancel?: () => void\n /** 额外类名 */\n className?: string\n}\n\n/** 确认按钮样式映射 */\nconst CONFIRM_VARIANT_CLASSES: Record<DialogVariant, string> = {\n default:\n 'bg-primary text-primary-fg hover:bg-primary-hover focus-visible:ring-ring',\n destructive:\n 'bg-danger text-danger-fg hover:bg-danger-hover focus-visible:ring-danger',\n}\n\n/**\n * 确认对话框组件(AlertDialog 模式)\n *\n * 与 Modal 不同:Dialog 固定为\"取消 + 确认\"双按钮结构,专用于需要用户确认的操作。\n *\n * @example\n * ```tsx\n * // 普通确认\n * <Dialog\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * title=\"提交订单\"\n * description=\"确认提交后无法修改,是否继续?\"\n * onConfirm={handleSubmit}\n * />\n *\n * // 危险操作(红色确认按钮)\n * <Dialog\n * open={isOpen}\n * onOpenChange={setIsOpen}\n * title=\"删除账号\"\n * description=\"此操作不可撤销,所有数据将被永久删除。\"\n * variant=\"destructive\"\n * confirmText=\"永久删除\"\n * onConfirm={handleDelete}\n * />\n * ```\n */\nconst Dialog = forwardRef<HTMLDivElement, DialogProps>(\n (\n {\n open,\n onOpenChange,\n title,\n description,\n variant = 'default',\n cancelText = '取消',\n confirmText = '确认',\n onConfirm,\n onCancel,\n className,\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer()\n const handleClose = useCallback(() => {\n onOpenChange(false)\n }, [onOpenChange])\n\n const handleCancel = useCallback(() => {\n onCancel?.()\n handleClose()\n }, [onCancel, handleClose])\n\n const handleConfirm = useCallback(() => {\n onConfirm?.()\n handleClose()\n }, [onConfirm, handleClose])\n\n useEscapeKey(open, handleCancel)\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={ref}\n className={cn(\n 'fixed inset-0 z-[90] flex items-center justify-center p-4',\n className,\n )}\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dialog-title\"\n aria-describedby={description ? 'dialog-description' : undefined}\n >\n {/* 遮罩层,点击触发取消 */}\n <div\n className=\"absolute inset-0 bg-overlay\"\n onClick={handleCancel}\n aria-hidden=\"true\"\n />\n\n {/* 对话框主体 */}\n <div className=\"relative z-10 w-full max-w-sm rounded-lg border border-border-base bg-surface-1 shadow-xl\">\n {/* 内容区 */}\n <div className=\"px-6 pt-6 pb-4\">\n <h2\n id=\"dialog-title\"\n className=\"text-base font-bold text-text-primary\"\n >\n {title}\n </h2>\n {description && (\n <p\n id=\"dialog-description\"\n className=\"mt-2 text-sm text-text-secondary\"\n >\n {description}\n </p>\n )}\n </div>\n\n {/* 底部按钮区 */}\n <div className=\"flex items-center justify-end gap-2 border-t border-border-subtle px-6 py-4\">\n {/* 取消按钮 — outline 样式 */}\n <button\n type=\"button\"\n onClick={handleCancel}\n className={cn(\n 'inline-flex h-9 items-center justify-center rounded-md border border-border-strong bg-surface-1 px-4 text-sm font-medium text-text-secondary transition-colors',\n 'hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-ring/30',\n )}\n >\n {cancelText}\n </button>\n\n {/* 确认按钮 — 根据 variant 变色 */}\n <button\n type=\"button\"\n onClick={handleConfirm}\n className={cn(\n 'inline-flex h-9 items-center justify-center rounded-md px-4 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n CONFIRM_VARIANT_CLASSES[variant],\n )}\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>,\n portalContainer,\n )\n },\n)\n\nDialog.displayName = 'Dialog'\n\nexport { Dialog }\n","/**\n * @description: Drawer 抽屉组件 — 从四个方向滑出,背景遮罩,ESC 关闭,点击遮罩关闭\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { createContext, forwardRef, useContext } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../internal/cn'\nimport { useEscapeKey } from '../hooks/use-escape-key'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\n/** 抽屉滑出方向 */\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom'\n\ninterface DrawerContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n side: DrawerSide\n}\n\nconst DrawerContext = createContext<DrawerContextValue | null>(null)\n\nfunction useDrawerContext() {\n const ctx = useContext(DrawerContext)\n if (!ctx) throw new Error('Drawer 子组件必须在 <Drawer> 内使用')\n return ctx\n}\n\nexport interface DrawerProps {\n /** 是否显示 */\n open: boolean\n /** 状态变更回调 */\n onOpenChange: (open: boolean) => void\n /** 滑出方向,默认 right */\n side?: DrawerSide\n /** 子内容 */\n children?: React.ReactNode\n}\n\nexport interface DrawerContentProps extends React.HTMLAttributes<HTMLDivElement> {}\nexport type DrawerHeaderProps = React.HTMLAttributes<HTMLDivElement>\nexport type DrawerTitleProps = React.HTMLAttributes<HTMLHeadingElement>\nexport type DrawerDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>\nexport type DrawerFooterProps = React.HTMLAttributes<HTMLDivElement>\nexport interface DrawerCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/** 各方向的平移动画类 */\nconst SIDE_CLASSES: Record<DrawerSide, string> = {\n right: 'inset-y-0 right-0 h-full w-80 max-w-full translate-x-0',\n left: 'inset-y-0 left-0 h-full w-80 max-w-full translate-x-0',\n top: 'inset-x-0 top-0 w-full h-auto max-h-[80vh] translate-y-0',\n bottom: 'inset-x-0 bottom-0 w-full h-auto max-h-[80vh] translate-y-0',\n}\n\n/**\n * 抽屉容器\n * @example\n * <Drawer open={isOpen} onOpenChange={setIsOpen} side=\"right\">\n * <DrawerContent>\n * <DrawerHeader>\n * <DrawerTitle>标题</DrawerTitle>\n * <DrawerDescription>描述文字</DrawerDescription>\n * </DrawerHeader>\n * <p className=\"px-6 py-4 text-sm text-text-secondary\">抽屉内容</p>\n * <DrawerFooter>\n * <DrawerClose onClick={() => setIsOpen(false)}>关闭</DrawerClose>\n * </DrawerFooter>\n * </DrawerContent>\n * </Drawer>\n */\nconst Drawer = ({ open, onOpenChange, side = 'right', children }: DrawerProps) => {\n useEscapeKey(open, () => onOpenChange(false))\n\n return (\n <DrawerContext.Provider value={{ open, onOpenChange, side }}>\n {children}\n </DrawerContext.Provider>\n )\n}\n\nDrawer.displayName = 'Drawer'\n\n/** 抽屉内容面板,通过 createPortal 渲染到 body */\nconst DrawerContent = forwardRef<HTMLDivElement, DrawerContentProps>(({ className, children, ...props }, ref) => {\n const { open, onOpenChange, side } = useDrawerContext()\n const portalContainer = usePortalContainer()\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-50\" role=\"dialog\" aria-modal=\"true\">\n {/* 遮罩层 */}\n <div\n className=\"absolute inset-0 bg-overlay transition-opacity\"\n onClick={() => onOpenChange(false)}\n aria-hidden=\"true\"\n />\n {/* 抽屉面板 */}\n <div\n ref={ref}\n className={cn(\n 'absolute flex flex-col bg-surface-1 shadow-xl transition-transform duration-300 ease-in-out',\n SIDE_CLASSES[side],\n className\n )}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {children}\n </div>\n </div>,\n portalContainer\n )\n})\n\nDrawerContent.displayName = 'DrawerContent'\n\n/** 抽屉头部区域 */\nconst DrawerHeader = forwardRef<HTMLDivElement, DrawerHeaderProps>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col gap-1.5 border-b border-border-base px-6 py-4', className)}\n {...props}\n />\n )\n})\n\nDrawerHeader.displayName = 'DrawerHeader'\n\n/** 抽屉标题 */\nconst DrawerTitle = forwardRef<HTMLHeadingElement, DrawerTitleProps>(({ className, ...props }, ref) => {\n return <h2 ref={ref} className={cn('text-lg font-semibold text-text-primary', className)} {...props} />\n})\n\nDrawerTitle.displayName = 'DrawerTitle'\n\n/** 抽屉描述 */\nconst DrawerDescription = forwardRef<HTMLParagraphElement, DrawerDescriptionProps>(({ className, ...props }, ref) => {\n return <p ref={ref} className={cn('text-sm text-text-secondary', className)} {...props} />\n})\n\nDrawerDescription.displayName = 'DrawerDescription'\n\n/** 抽屉底部区域 */\nconst DrawerFooter = forwardRef<HTMLDivElement, DrawerFooterProps>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('mt-auto flex items-center justify-end gap-2 border-t border-border-base px-6 py-4', className)}\n {...props}\n />\n )\n})\n\nDrawerFooter.displayName = 'DrawerFooter'\n\n/** 关闭按钮 */\nconst DrawerClose = forwardRef<HTMLButtonElement, DrawerCloseProps>(({ className, children, type = 'button', ...props }, ref) => {\n const { onOpenChange } = useDrawerContext()\n\n return (\n <button\n ref={ref}\n type={type}\n onClick={() => onOpenChange(false)}\n className={cn(\n 'inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium text-text-secondary transition-colors hover:bg-surface-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30',\n className\n )}\n {...props}\n >\n {children ?? <X size={18} />}\n </button>\n )\n})\n\nDrawerClose.displayName = 'DrawerClose'\n\nexport { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerFooter, DrawerClose }\n","/**\n * @description: Table 表格组件 — 包含 Table/TableHeader/TableBody/TableRow/TableHead/TableCell\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cn } from '../internal/cn'\n\nexport type TableProps = React.HTMLAttributes<HTMLTableElement>\nexport type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>\nexport type TableBodyProps = React.HTMLAttributes<HTMLTableSectionElement>\nexport type TableRowProps = React.HTMLAttributes<HTMLTableRowElement>\nexport type TableHeadProps = React.ThHTMLAttributes<HTMLTableCellElement>\nexport type TableCellProps = React.TdHTMLAttributes<HTMLTableCellElement>\n\n/**\n * 表格组件\n * @example\n * <Table>\n * <TableHeader>\n * <TableRow>\n * <TableHead>姓名</TableHead>\n * <TableHead>邮箱</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>张三</TableCell>\n * <TableCell>zhangsan@example.com</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n */\nconst Table = forwardRef<HTMLTableElement, TableProps>(({ className, ...props }, ref) => {\n return (\n <div className=\"w-full overflow-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n )\n})\n\nconst TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(({ className, ...props }, ref) => {\n return <thead ref={ref} className={cn('[&_tr]:border-b border-border-base', className)} {...props} />\n})\n\nconst TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(({ className, ...props }, ref) => {\n return <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n})\n\nconst TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(({ className, ...props }, ref) => {\n return <tr ref={ref} className={cn('border-b border-border-base transition-colors hover:bg-surface-2', className)} {...props} />\n})\n\nconst TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(({ className, ...props }, ref) => {\n return <th ref={ref} className={cn('h-10 px-4 text-left align-middle font-medium text-text-secondary [&:has([role=checkbox])]:pr-0', className)} {...props} />\n})\n\nconst TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(({ className, ...props }, ref) => {\n return <td ref={ref} className={cn('px-4 py-3 align-middle text-text-primary [&:has([role=checkbox])]:pr-0', className)} {...props} />\n})\n\nTable.displayName = 'Table'\nTableHeader.displayName = 'TableHeader'\nTableBody.displayName = 'TableBody'\nTableRow.displayName = 'TableRow'\nTableHead.displayName = 'TableHead'\nTableCell.displayName = 'TableCell'\n\nexport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell }\n","/**\n * @description: Toast 通知系统 — 右上角展示,3 秒自动消失,支持 success/error/info 类型\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\nexport type ToastType = 'success' | 'error' | 'info'\n\nexport interface ToastItem {\n id: string\n message: string\n type: ToastType\n}\n\n// 全局订阅列表,避免引入额外状态库\ntype Listener = (items: ToastItem[]) => void\nconst listeners: Set<Listener> = new Set()\nlet toastItems: ToastItem[] = []\nconst toastTimers = new Map<string, ReturnType<typeof setTimeout>>()\n\nfunction notify() {\n listeners.forEach((fn) => fn([...toastItems]))\n}\n\nfunction addToast(message: string, type: ToastType) {\n const id = Math.random().toString(36).slice(2)\n toastItems = [...toastItems, { id, message, type }]\n notify()\n // 3 秒后自动移除\n const timer = setTimeout(() => removeToast(id), 3000)\n toastTimers.set(id, timer)\n}\n\nfunction removeToast(id: string) {\n const timer = toastTimers.get(id)\n if (timer) {\n clearTimeout(timer)\n toastTimers.delete(id)\n }\n toastItems = toastItems.filter((t) => t.id !== id)\n notify()\n}\n\n/** toast 调用接口 */\nexport const toast = {\n success: (message: string) => addToast(message, 'success'),\n error: (message: string) => addToast(message, 'error'),\n info: (message: string) => addToast(message, 'info'),\n}\n\nconst typeStyles: Record<ToastType, string> = {\n success: 'bg-success-soft border-success/30 text-success-soft-fg',\n error: 'bg-danger-soft border-danger/30 text-danger-soft-fg',\n info: 'bg-info-soft border-info/30 text-info-soft-fg',\n}\n\nconst typeLabel: Record<ToastType, string> = {\n success: '成功',\n error: '错误',\n info: '提示',\n}\n\n/**\n * Toaster 组件,放在应用根布局中一次即可\n * @example\n * // 在 layout 或 App 中:\n * <Toaster />\n *\n * // 在任意组件中调用:\n * toast.success('保存成功')\n * toast.error('网络异常,请重试')\n * toast.info('请先登录')\n */\nconst Toaster = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => {\n const [items, setItems] = useState<ToastItem[]>([])\n const mountedRef = useRef(true)\n const portalContainer = usePortalContainer()\n\n const handleUpdate = useCallback((next: ToastItem[]) => {\n if (mountedRef.current) {\n setItems(next)\n }\n }, [])\n\n useEffect(() => {\n listeners.add(handleUpdate)\n return () => {\n mountedRef.current = false\n listeners.delete(handleUpdate)\n }\n }, [handleUpdate])\n\n if (items.length === 0 || !portalContainer) return null\n\n return createPortal(\n <div\n ref={ref}\n className={cn('fixed top-4 right-4 z-[9999] flex w-80 flex-col gap-2', className)}\n role=\"region\"\n aria-label=\"通知\"\n {...props}\n >\n {items.map((item) => (\n <div\n key={item.id}\n className={cn(\n 'flex items-start justify-between gap-2 rounded-md border px-4 py-3 text-sm shadow-md',\n typeStyles[item.type]\n )}\n role=\"alert\"\n >\n <div>\n <span className=\"font-semibold\">{typeLabel[item.type]}:</span>\n {item.message}\n </div>\n <button\n type=\"button\"\n onClick={() => removeToast(item.id)}\n className=\"mt-0.5 shrink-0 opacity-60 hover:opacity-100 transition-opacity\"\n aria-label=\"关闭通知\"\n >\n <X size={14} />\n </button>\n </div>\n ))}\n </div>,\n portalContainer\n )\n})\n\nToaster.displayName = 'Toaster'\n\nexport { Toaster }\n","/**\n * @description: Sidebar 侧边栏布局组件 — 支持 primary/dark 两种风格,collapsed 折叠态,底部 slot\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-18\n */\nimport { forwardRef, useMemo, useState } from 'react'\nimport {\n ChevronDown,\n PanelLeftClose,\n PanelLeftOpen,\n Search,\n X,\n type LucideIcon,\n} from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface SidebarItem {\n id?: string\n label: string\n href?: string\n icon: LucideIcon\n active?: boolean\n children?: SidebarItem[]\n}\n\nexport type SidebarVariant = 'primary' | 'dark'\n\nexport interface SidebarProps {\n /** 导航菜单项 */\n items: SidebarItem[]\n /** 视觉变体:primary 品牌色(默认),dark 深灰色(推荐后台管理) */\n variant?: SidebarVariant\n /** 是否折叠,折叠时只显示图标 */\n collapsed?: boolean\n /** 非受控折叠默认值 */\n defaultCollapsed?: boolean\n /** 折叠状态变化回调 */\n onCollapsedChange?: (collapsed: boolean) => void\n /** 是否显示内置折叠按钮 */\n collapsible?: boolean\n /** 是否显示内置搜索 */\n searchable?: boolean\n /** 搜索输入占位文案 */\n searchPlaceholder?: string\n /** 是否启用移动端抽屉模式 */\n responsive?: boolean\n /** 移动端抽屉是否打开 */\n mobileOpen?: boolean\n /** 移动端抽屉开关回调 */\n onMobileOpenChange?: (open: boolean) => void\n /** 顶部插槽,用于品牌或用户信息 */\n header?: React.ReactNode\n /** 底部插槽,用于退出登录等操作 */\n footer?: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nconst variantStyles: Record<SidebarVariant, {\n container: string\n active: string\n inactive: string\n divider: string\n icon: string\n activeIcon: string\n}> = {\n primary: {\n container: 'border-r border-border-base bg-surface-1 text-text-primary shadow-sm',\n active: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20 before:absolute before:left-0 before:top-1/2 before:h-6 before:w-[3px] before:-translate-y-1/2 before:rounded-r-full before:bg-primary',\n inactive: 'text-text-secondary hover:bg-surface-2 hover:text-text-primary',\n divider: 'border-border-base',\n icon: 'bg-transparent text-text-tertiary group-hover:bg-surface-3 group-hover:text-primary',\n activeIcon: 'bg-primary/15 text-primary',\n },\n dark: {\n container: 'border-r border-border-base bg-surface-1 text-text-primary shadow-sm',\n active: 'bg-primary/10 text-primary shadow-sm ring-1 ring-primary/20 before:absolute before:left-0 before:top-1/2 before:h-6 before:w-[3px] before:-translate-y-1/2 before:rounded-r-full before:bg-primary',\n inactive: 'text-text-secondary hover:bg-surface-2 hover:text-text-primary',\n divider: 'border-border-base',\n icon: 'bg-transparent text-text-tertiary group-hover:bg-surface-3 group-hover:text-primary',\n activeIcon: 'bg-primary/15 text-primary',\n },\n}\n\nfunction getItemKey(item: SidebarItem, index: number, parentKey: string): string {\n return item.id ?? item.href ?? `${parentKey}-${index}-${item.label}`\n}\n\nfunction itemHasActiveChild(item: SidebarItem): boolean {\n return Boolean(item.children?.some((child) => child.active || itemHasActiveChild(child)))\n}\n\nfunction normalizeSearch(value: string): string {\n return value.toLowerCase().replace(/\\s+/g, '')\n}\n\nfunction filterSidebarItems(items: SidebarItem[], query: string): SidebarItem[] {\n if (!query) return items\n\n return items.reduce<SidebarItem[]>((result, item) => {\n const children = item.children ? filterSidebarItems(item.children, query) : []\n const matched = normalizeSearch(item.label).includes(query)\n\n if (matched || children.length > 0) {\n result.push({ ...item, children })\n }\n\n return result\n }, [])\n}\n\n/**\n * 侧边栏布局组件\n * @example\n * <Sidebar variant=\"dark\" items={navItems} footer={<LogoutButton />} />\n */\nconst Sidebar = forwardRef<HTMLElement, SidebarProps>(\n (\n {\n items,\n variant = 'primary',\n collapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsible = false,\n searchable = false,\n searchPlaceholder = '搜索菜单...',\n responsive = false,\n mobileOpen = false,\n onMobileOpenChange,\n header,\n footer,\n className,\n },\n ref,\n ) => {\n const styles = variantStyles[variant]\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(() => new Set())\n const [query, setQuery] = useState('')\n const effectiveCollapsed = collapsed ?? internalCollapsed\n const normalizedQuery = normalizeSearch(query)\n const visibleItems = useMemo(() => filterSidebarItems(items, normalizedQuery), [items, normalizedQuery])\n\n function setCollapsedState(nextCollapsed: boolean) {\n setInternalCollapsed(nextCollapsed)\n onCollapsedChange?.(nextCollapsed)\n }\n\n function toggleExpanded(key: string) {\n setExpandedKeys((current) => {\n const next = new Set(current)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n return next\n })\n }\n\n function closeMobile() {\n onMobileOpenChange?.(false)\n }\n\n function renderItems(list: SidebarItem[], depth = 0, parentKey = 'root') {\n return (\n <ul className={cn('flex flex-col gap-1', depth === 0 ? 'px-2.5' : 'ml-6 mt-1 border-l border-border-base pl-2')}>\n {list.map((item, index) => {\n const key = getItemKey(item, index, parentKey)\n const hasChildren = Boolean(item.children?.length)\n const active = Boolean(item.active || itemHasActiveChild(item))\n const expanded = !effectiveCollapsed && hasChildren && (normalizedQuery.length > 0 || active || expandedKeys.has(key))\n const itemContent = (\n <>\n <span\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg transition-colors',\n active ? styles.activeIcon : styles.icon,\n )}\n >\n <item.icon size={16} />\n </span>\n {!effectiveCollapsed && <span className=\"min-w-0 flex-1 truncate text-left\">{item.label}</span>}\n {!effectiveCollapsed && hasChildren && (\n <ChevronDown\n size={15}\n className={cn('shrink-0 text-text-tertiary transition-transform', expanded && 'rotate-180')}\n aria-hidden=\"true\"\n />\n )}\n </>\n )\n const itemClassName = cn(\n 'group relative flex min-w-0 items-center gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium outline-none transition-all duration-150 focus-visible:ring-2 focus-visible:ring-primary/35',\n effectiveCollapsed && 'justify-center px-2',\n active ? styles.active : styles.inactive,\n )\n\n return (\n <li key={key}>\n {hasChildren ? (\n <button\n type=\"button\"\n className={cn('w-full', itemClassName)}\n aria-expanded={expanded}\n title={effectiveCollapsed ? item.label : undefined}\n onClick={() => toggleExpanded(key)}\n >\n {itemContent}\n </button>\n ) : (\n <a\n href={item.href ?? '#'}\n aria-current={item.active ? 'page' : undefined}\n className={itemClassName}\n title={effectiveCollapsed ? item.label : undefined}\n onClick={closeMobile}\n >\n {itemContent}\n </a>\n )}\n {expanded && item.children ? renderItems(item.children, depth + 1, key) : null}\n </li>\n )\n })}\n </ul>\n )\n }\n\n const sidebar = (\n <aside\n ref={ref}\n className={cn(\n 'flex flex-col overflow-hidden transition-all duration-300',\n styles.container,\n effectiveCollapsed ? 'w-[72px]' : 'w-64',\n responsive && [\n 'fixed inset-y-0 left-0 z-50 md:relative md:inset-auto md:z-auto',\n mobileOpen ? 'translate-x-0' : '-translate-x-full md:translate-x-0',\n ],\n className,\n )}\n >\n {(header || collapsible || (responsive && mobileOpen)) && (\n <div\n className={cn(\n 'flex border-b px-3 py-3',\n styles.divider,\n effectiveCollapsed ? 'justify-center' : 'items-center gap-2',\n )}\n >\n {!effectiveCollapsed && header ? <div className=\"min-w-0 flex-1\">{header}</div> : null}\n {collapsible && (\n <button\n type=\"button\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-base bg-surface-2 text-text-secondary transition-colors hover:border-primary/40 hover:text-text-primary\"\n aria-label={effectiveCollapsed ? '展开侧边栏' : '折叠侧边栏'}\n onClick={() => setCollapsedState(!effectiveCollapsed)}\n >\n {effectiveCollapsed ? <PanelLeftOpen size={17} /> : <PanelLeftClose size={17} />}\n </button>\n )}\n {responsive && (\n <button\n type=\"button\"\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border-base bg-surface-2 text-text-secondary transition-colors hover:border-primary/40 hover:text-text-primary md:hidden\"\n aria-label=\"关闭侧边栏\"\n onClick={closeMobile}\n >\n <X size={17} />\n </button>\n )}\n </div>\n )}\n\n {searchable && !effectiveCollapsed && (\n <div className={cn('border-b px-3 py-3', styles.divider)}>\n <label className=\"sr-only\" htmlFor=\"ug-sidebar-search\">搜索菜单</label>\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-tertiary\" aria-hidden=\"true\" />\n <input\n id=\"ug-sidebar-search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n autoComplete=\"off\"\n className=\"h-10 w-full rounded-lg border border-border-base bg-surface-0 px-3 pl-9 pr-9 text-sm text-text-primary outline-none transition-colors placeholder:text-text-tertiary focus:border-primary focus:ring-2 focus:ring-primary/20\"\n type=\"text\"\n role=\"searchbox\"\n />\n {query ? (\n <button\n type=\"button\"\n className=\"absolute right-1 top-1/2 flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-surface-2 hover:text-text-primary\"\n aria-label=\"清空搜索\"\n onClick={() => setQuery('')}\n >\n <X size={14} />\n </button>\n ) : null}\n </div>\n </div>\n )}\n\n <nav className=\"flex-1 overflow-y-auto py-3.5\">\n {visibleItems.length > 0 ? (\n renderItems(visibleItems)\n ) : (\n <p className=\"mx-3 rounded-lg border border-dashed border-border-base bg-surface-0 px-3 py-3 text-sm text-text-tertiary\">\n 没有匹配的菜单\n </p>\n )}\n </nav>\n\n {footer && (\n <div\n className={cn(\n 'border-t px-2.5 py-3',\n styles.divider,\n effectiveCollapsed && 'flex justify-center',\n )}\n >\n {footer}\n </div>\n )}\n </aside>\n )\n\n return (\n <>\n {responsive && mobileOpen ? (\n <button\n type=\"button\"\n className=\"fixed inset-0 z-40 bg-overlay md:hidden\"\n aria-label=\"关闭侧边栏遮罩\"\n onClick={closeMobile}\n />\n ) : null}\n {sidebar}\n </>\n )\n },\n)\n\nSidebar.displayName = 'Sidebar'\n\nexport { Sidebar }\n","/**\n * @description: Pagination 分页组件 — 上一页/下一页 + 页码数字,absolute 定位到底部\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface PaginationProps {\n /** 当前页码,从 1 开始 */\n page: number\n /** 总页数 */\n totalPages: number\n /** 页码变化回调 */\n onPageChange: (page: number) => void\n /** 额外类名 */\n className?: string\n}\n\nfunction getPageNumbers(page: number, totalPages: number): (number | '...')[] {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1)\n }\n\n if (page <= 3) {\n return [1, 2, 3, '...', totalPages]\n }\n\n if (page >= totalPages - 2) {\n return [1, '...', totalPages - 2, totalPages - 1, totalPages]\n }\n\n return [1, '...', page, '...', totalPages]\n}\n\n/**\n * 分页组件\n * @example\n * <Pagination page={currentPage} totalPages={20} onPageChange={setCurrentPage} />\n */\nconst Pagination = forwardRef<HTMLDivElement, PaginationProps>(({ page, totalPages, onPageChange, className }, ref) => {\n const pageNumbers = getPageNumbers(page, totalPages)\n\n const btnBase =\n 'inline-flex h-8 min-w-8 shrink-0 items-center justify-center rounded-lg px-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 disabled:pointer-events-none disabled:opacity-40'\n const btnGhost =\n 'border border-border-strong bg-surface-1 text-text-primary hover:border-primary/60 hover:bg-surface-2'\n\n return (\n <div ref={ref} className={cn('flex max-w-full flex-wrap items-center gap-1', className)}>\n {/* 上一页 */}\n <button\n type=\"button\"\n className={cn(btnBase, btnGhost)}\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"上一页\"\n >\n <ChevronLeft size={16} />\n </button>\n\n {/* 页码 */}\n {pageNumbers.map((p, idx) =>\n p === '...' ? (\n <span key={`ellipsis-${idx}`} className=\"inline-flex h-8 min-w-6 shrink-0 items-center justify-center text-text-tertiary select-none\">\n …\n </span>\n ) : (\n <button\n key={p}\n type=\"button\"\n className={cn(\n btnBase,\n p === page\n ? 'bg-primary text-primary-fg shadow-sm'\n : btnGhost\n )}\n onClick={() => onPageChange(p)}\n aria-current={p === page ? 'page' : undefined}\n >\n {p}\n </button>\n )\n )}\n\n {/* 下一页 */}\n <button\n type=\"button\"\n className={cn(btnBase, btnGhost)}\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"下一页\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n )\n})\n\nPagination.displayName = 'Pagination'\n\nexport { Pagination }\n","/**\r\n * @description: Select 下拉选择组件 — 原生 select 封装,支持 label/error/options\r\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\r\n * @date: 2026-04-15\r\n */\r\nimport { forwardRef, useEffect, useId, useMemo, useRef, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\r\nexport interface SelectOption {\r\n label: string\r\n value: string | number\r\n}\r\n\r\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\r\n /** 标签文本 */\r\n label?: string\r\n /** 错误提示,有值时边框变红 */\r\n error?: string\r\n /** 帮助说明文本 */\r\n helperText?: string\r\n /** 选项列表 */\r\n options: SelectOption[]\r\n /** 占位提示,渲染为禁用的首选项 */\r\n placeholder?: string\r\n}\r\n\r\n/**\r\n * 下拉选择组件\r\n * @example\r\n * <Select\r\n * label=\"状态\"\r\n * placeholder=\"请选择状态\"\r\n * options={[\r\n * { label: '启用', value: 'active' },\r\n * { label: '禁用', value: 'inactive' },\r\n * ]}\r\n * value={status}\r\n * onChange={(e) => setStatus(e.target.value)}\r\n * />\r\n */\r\nconst Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n className,\n label,\n error,\n helperText,\n options,\n placeholder,\n id,\n value,\n defaultValue,\n onChange,\n disabled,\n name,\n required,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId()\n const selectId = id ?? generatedId\n const listboxId = `${selectId}-listbox`\n const rootRef = useRef<HTMLDivElement | null>(null)\n const hiddenSelectRef = useRef<HTMLSelectElement | null>(null)\n const isControlled = value !== undefined\n const [open, setOpen] = useState(false)\n const [internalValue, setInternalValue] = useState(() => String(defaultValue ?? ''))\n const selectedValue = String(isControlled ? value : internalValue)\n const selectedOption = useMemo(\n () => options.find((option) => String(option.value) === selectedValue),\n [options, selectedValue],\n )\n\n function setSelectRef(node: HTMLSelectElement | null) {\n hiddenSelectRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }\n\n function handleSelect(nextValue: string) {\n if (disabled) return\n if (!isControlled) {\n setInternalValue(nextValue)\n }\n if (hiddenSelectRef.current) {\n hiddenSelectRef.current.value = nextValue\n onChange?.({ target: hiddenSelectRef.current, currentTarget: hiddenSelectRef.current } as React.ChangeEvent<HTMLSelectElement>)\n }\n setOpen(false)\n }\n\n function toggleOpen() {\n if (disabled) return\n setOpen((current) => !current)\n }\n\n function handleTriggerKeyDown(event: React.KeyboardEvent<HTMLButtonElement>) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n setOpen(true)\n return\n }\n\n if (event.key === 'Escape') {\n event.preventDefault()\n setOpen(false)\n }\n }\n\n useEffect(() => {\n if (!open) return\n\n function handlePointerDown(event: PointerEvent) {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false)\n }\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [open])\n\n return (\n <div ref={rootRef} className=\"relative flex flex-col gap-1.5\">\n {label && (\n <label htmlFor={selectId} className=\"text-sm font-medium text-text-primary\">\n {label}\n </label>\n )}\n <select\n ref={setSelectRef}\n id={`${selectId}-native`}\n name={name}\n value={selectedValue}\n required={required}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"sr-only\"\n onChange={onChange}\n {...props}\n >\n {placeholder && <option value=\"\">{placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n <div className=\"relative\">\n <button\n type=\"button\"\n id={selectId}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listboxId}\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded-lg border bg-surface-1 px-3 py-2 text-left text-sm leading-5 text-text-primary shadow-sm',\n 'transition-colors hover:border-primary/60',\n 'focus-visible:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/25 focus-visible:ring-offset-1 focus-visible:ring-offset-surface-0',\n 'disabled:cursor-not-allowed disabled:bg-surface-2 disabled:text-text-tertiary disabled:opacity-70',\n error\n ? 'border-danger focus-visible:ring-danger/25'\n : 'border-border-strong',\n className\n )}\n onClick={toggleOpen}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={cn('truncate', !selectedOption && 'text-text-tertiary')}>\n {selectedOption?.label ?? placeholder ?? '请选择'}\n </span>\n <ChevronDown\n aria-hidden=\"true\"\n className={cn('h-4 w-4 shrink-0 text-text-tertiary transition-transform', open && 'rotate-180')}\n />\n </button>\n {open && (\n <div\n id={listboxId}\n role=\"listbox\"\n className=\"absolute left-0 right-0 top-full z-[70] mt-1 max-h-60 overflow-auto rounded-lg border border-border-strong bg-surface-1 p-1 shadow-xl\"\n >\n {placeholder && (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selectedValue === ''}\n className={cn(\n 'flex w-full items-center rounded-md px-2.5 py-2 text-left text-sm text-text-tertiary transition-colors hover:bg-surface-2',\n selectedValue === '' && 'bg-surface-2 text-text-primary',\n )}\n onClick={() => handleSelect('')}\n >\n {placeholder}\n </button>\n )}\n {options.map((option) => {\n const optionValue = String(option.value)\n const selected = optionValue === selectedValue\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n className={cn(\n 'flex w-full items-center rounded-md px-2.5 py-2 text-left text-sm text-text-primary transition-colors hover:bg-surface-2',\n selected && 'bg-primary-soft text-primary-soft-fg',\n )}\n onClick={() => handleSelect(optionValue)}\n >\n {option.label}\n </button>\n )\n })}\n </div>\n )}\n </div>\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n {!error && helperText && <p className=\"text-xs text-text-secondary\">{helperText}</p>}\n </div>\n )\r\n }\r\n)\r\n\r\nSelect.displayName = 'Select'\r\n\r\nexport { Select }\r\n","/**\n * @description: Spinner 加载旋转组件 — 基于 Loader2 图标,支持 sm/md/lg 三种尺寸\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst spinnerVariants = cva('animate-spin text-text-tertiary', {\n variants: {\n size: {\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-10 w-10',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport interface SpinnerProps\n extends React.HTMLAttributes<SVGSVGElement>,\n VariantProps<typeof spinnerVariants> {\n /** 无障碍标签 */\n label?: string\n}\n\n/**\n * 加载旋转动画\n * @example\n * <Spinner />\n * <Spinner size=\"sm\" />\n * <Spinner size=\"lg\" className=\"text-primary\" />\n */\nconst Spinner = forwardRef<SVGSVGElement, SpinnerProps>(({ className, size, label = '加载中', ...props }, ref) => {\n return (\n <Loader2\n ref={ref}\n className={cn(spinnerVariants({ size }), className)}\n aria-label={label}\n role=\"status\"\n {...props}\n />\n )\n})\n\nSpinner.displayName = 'Spinner'\n\nexport { Spinner }\n","/**\r\n * @description: Checkbox 复选框组件 — 支持受控/非受控、indeterminate 半选状态\r\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\r\n * @date: 2026-04-17\r\n */\r\nimport { forwardRef, useEffect, useId, useRef } from 'react'\nimport { Check, Minus } from 'lucide-react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../internal/cn'\r\n\r\nconst checkboxVariants = cva(\n 'peer inline-flex shrink-0 items-center justify-center rounded-md border shadow-sm transition-colors peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-ring/35 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-surface-0 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n {\n variants: {\n size: {\n sm: 'h-4 w-4',\n default: 'h-[18px] w-[18px]',\n lg: 'h-5 w-5',\n },\n state: {\n unchecked: 'border-border-strong bg-surface-1 text-transparent hover:border-primary/70 hover:bg-surface-2',\n checked: 'border-primary bg-primary text-primary-fg',\n indeterminate: 'border-primary bg-primary text-primary-fg',\n },\n },\n defaultVariants: {\r\n size: 'default',\r\n state: 'unchecked',\r\n },\r\n }\r\n)\r\n\r\nexport interface CheckboxProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'onChange' | 'type'>,\r\n Pick<VariantProps<typeof checkboxVariants>, 'size'> {\r\n /** 是否选中(受控) */\r\n checked?: boolean\r\n /** 半选中状态(优先级高于 checked) */\r\n indeterminate?: boolean\r\n /** 选中状态变化回调 */\r\n onCheckedChange?: (checked: boolean) => void\r\n /** 同行标签文案,有值时整块可点击 */\r\n label?: React.ReactNode\r\n /** 标签额外 class */\r\n labelClassName?: string\r\n}\r\n\r\n/**\r\n * 通用复选框组件\r\n * @example\r\n * <Checkbox checked={isOpen} onCheckedChange={setIsOpen} label=\"启用通知\" />\r\n * <Checkbox indeterminate />\r\n * <Checkbox size=\"lg\" disabled />\r\n */\r\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\r\n (\r\n {\r\n className,\r\n size,\r\n checked,\r\n indeterminate = false,\r\n disabled,\r\n label,\r\n labelClassName,\r\n onCheckedChange,\r\n id,\r\n ...props\r\n },\r\n ref,\n ) => {\n const innerRef = useRef<HTMLInputElement>(null)\n const generatedId = useId()\n const inputId = id ?? generatedId\n\n useEffect(() => {\n if (innerRef.current) {\n innerRef.current.indeterminate = indeterminate\r\n }\r\n }, [indeterminate])\n\n const state = indeterminate ? 'indeterminate' : checked ? 'checked' : 'unchecked'\n const iconSize = size === 'sm' ? 11 : size === 'lg' ? 14 : 12\n\n const control = (\n <span className=\"relative inline-flex\">\n <input\n ref={(node) => {\r\n innerRef.current = node\r\n if (typeof ref === 'function') ref(node)\r\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node\r\n }}\n id={inputId}\n type=\"checkbox\"\n className=\"peer sr-only\"\n checked={checked ?? false}\n disabled={disabled}\r\n onChange={(e) => onCheckedChange?.(e.target.checked)}\r\n {...props}\r\n />\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(checkboxVariants({ size, state }), className)}\r\n >\r\n {indeterminate ? (\r\n <Minus size={iconSize} />\r\n ) : checked ? (\r\n <Check size={iconSize} />\r\n ) : null}\r\n </span>\r\n </span>\r\n )\r\n\r\n if (label === undefined || label === null) return control\r\n\r\n return (\r\n <label\n htmlFor={inputId}\n className={cn(\n 'inline-flex min-h-5 cursor-pointer items-center gap-2.5 text-sm leading-5 text-text-primary select-none',\n disabled && 'cursor-not-allowed opacity-60',\n labelClassName,\n )}\n >\n {control}\n <span className=\"pt-px\">{label}</span>\n </label>\n )\r\n },\r\n)\r\n\r\nCheckbox.displayName = 'Checkbox'\r\n\r\nexport { Checkbox, checkboxVariants }\r\n","/**\r\n * @description: Radio 单选框组件 — 支持 RadioGroup 上下文共享状态、受控/非受控、尺寸变体\r\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\r\n * @date: 2026-04-17\r\n */\r\nimport { createContext, forwardRef, useContext, useId, useState } from 'react'\r\nimport { cva, type VariantProps } from 'class-variance-authority'\r\nimport { cn } from '../internal/cn'\r\n\r\n// ─── RadioGroup Context ───────────────────────────────────────────────────────\r\n\r\ninterface RadioGroupContextValue {\r\n value: string | undefined\r\n onValueChange: (value: string) => void\r\n name: string | undefined\r\n disabled: boolean\r\n}\r\n\r\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\r\n\r\nfunction useRadioGroupContext() {\r\n return useContext(RadioGroupContext)\r\n}\r\n\r\n// ─── 变体定义 ─────────────────────────────────────────────────────────────────\r\n\r\nconst radioVariants = cva(\n 'relative inline-flex shrink-0 items-center justify-center rounded-full border shadow-sm transition-colors peer-focus-visible:outline-none peer-focus-visible:ring-2 peer-focus-visible:ring-ring/35 peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-surface-0 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n {\n variants: {\n size: {\n sm: 'h-4 w-4',\n default: 'h-[18px] w-[18px]',\n lg: 'h-5 w-5',\n },\n checked: {\n true: 'border-primary bg-surface-1',\n false: 'border-border-strong bg-surface-1 hover:border-primary/70 hover:bg-surface-2',\n },\n },\r\n defaultVariants: {\r\n size: 'default',\r\n checked: false,\r\n },\r\n }\r\n)\r\n\r\n// ─── RadioProps ───────────────────────────────────────────────────────────────\r\n\r\nexport interface RadioProps\r\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'onChange' | 'type' | 'checked'>,\r\n Pick<VariantProps<typeof radioVariants>, 'size'> {\r\n /** 单选框的值(必需) */\r\n value: string\r\n /** 是否选中(受控,被 RadioGroup 包裹时由 Group 控制) */\r\n checked?: boolean\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 单选框旁边的标签文案 */\r\n label?: React.ReactNode\r\n /** 所属 group 的 name(被 RadioGroup 包裹时由 Group 覆盖) */\r\n name?: string\r\n /** 选中回调(被 RadioGroup 包裹时由 Group 覆盖) */\r\n onChange?: (value: string) => void\r\n}\r\n\r\n/**\r\n * 单选框组件,可单独使用或配合 RadioGroup 使用\r\n * @example\r\n * // 独立使用\r\n * <Radio value=\"option1\" checked={selected === 'option1'} onChange={setSelected} label=\"选项一\" />\r\n *\r\n * // 配合 RadioGroup 使用\r\n * <RadioGroup value={val} onValueChange={setVal}>\r\n * <Radio value=\"a\" label=\"选项 A\" />\r\n * <Radio value=\"b\" label=\"选项 B\" />\r\n * </RadioGroup>\r\n */\r\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\r\n (\r\n {\r\n className,\r\n size,\r\n value,\r\n checked: checkedProp,\r\n disabled: disabledProp,\r\n label,\r\n name: nameProp,\r\n onChange,\r\n id,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const group = useRadioGroupContext()\r\n const generatedId = useId()\r\n const inputId = id ?? generatedId\r\n\r\n // 被 RadioGroup 包裹时,优先使用 Group 的状态\r\n const isChecked = group ? group.value === value : (checkedProp ?? false)\r\n const isDisabled = group ? (group.disabled || (disabledProp ?? false)) : (disabledProp ?? false)\r\n const inputName = group ? group.name : nameProp\r\n\r\n function handleChange() {\r\n if (group) {\r\n group.onValueChange(value)\r\n } else {\r\n onChange?.(value)\r\n }\r\n }\r\n\r\n const dotSize = size === 'sm' ? 'h-1.5 w-1.5' : size === 'lg' ? 'h-2.5 w-2.5' : 'h-2 w-2'\n\r\n const control = (\r\n <span className=\"relative inline-flex\">\r\n <input\r\n ref={ref}\r\n id={inputId}\r\n type=\"radio\"\r\n className=\"peer sr-only\"\r\n value={value}\r\n checked={isChecked}\r\n disabled={isDisabled}\r\n name={inputName}\r\n onChange={handleChange}\r\n {...props}\r\n />\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(radioVariants({ size, checked: isChecked }), className)}\r\n >\n {isChecked && (\n <span className={cn('rounded-full bg-primary', dotSize)} />\n )}\n </span>\n </span>\r\n )\r\n\r\n if (label === undefined || label === null) return control\r\n\r\n return (\r\n <label\r\n htmlFor={inputId}\n className={cn(\n 'inline-flex min-h-5 cursor-pointer items-center gap-2.5 text-sm leading-5 text-text-primary select-none',\n isDisabled && 'cursor-not-allowed opacity-60',\n )}\n >\n {control}\n <span className=\"pt-px\">{label}</span>\n </label>\n )\r\n },\r\n)\r\n\r\nRadio.displayName = 'Radio'\r\n\r\n// ─── RadioGroupProps ──────────────────────────────────────────────────────────\r\n\r\nexport interface RadioGroupProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** 当前选中值(受控) */\r\n value?: string\r\n /** 初始选中值(非受控) */\r\n defaultValue?: string\r\n /** 选中值变化回调 */\r\n onValueChange?: (value: string) => void\r\n /** 是否整组禁用 */\r\n disabled?: boolean\r\n /** 表单 name 属性,共享给子 Radio */\r\n name?: string\r\n /** 排列方向,默认垂直 */\r\n orientation?: 'horizontal' | 'vertical'\r\n}\r\n\r\n/**\r\n * 单选框组,管理一组 Radio 的选中状态\r\n * @example\r\n * <RadioGroup value={plan} onValueChange={setPlan} orientation=\"horizontal\">\r\n * <Radio value=\"free\" label=\"免费版\" />\r\n * <Radio value=\"pro\" label=\"专业版\" />\r\n * <Radio value=\"enterprise\" label=\"企业版\" />\r\n * </RadioGroup>\r\n */\r\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\r\n (\r\n {\r\n className,\r\n value: valueProp,\r\n defaultValue,\r\n onValueChange,\r\n disabled = false,\r\n name,\r\n orientation = 'vertical',\r\n children,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [uncontrolledValue, setUncontrolledValue] = useState<string | undefined>(defaultValue)\r\n const isControlled = valueProp !== undefined\r\n const currentValue = isControlled ? valueProp : uncontrolledValue\r\n\r\n function handleValueChange(newValue: string) {\r\n if (!isControlled) {\r\n setUncontrolledValue(newValue)\r\n }\r\n onValueChange?.(newValue)\r\n }\r\n\r\n return (\r\n <RadioGroupContext.Provider\r\n value={{\r\n value: currentValue,\r\n onValueChange: handleValueChange,\r\n name,\r\n disabled,\r\n }}\r\n >\r\n <div\r\n ref={ref}\r\n role=\"radiogroup\"\r\n className={cn(\r\n 'flex',\n orientation === 'vertical' ? 'flex-col gap-2.5' : 'flex-row flex-wrap gap-x-5 gap-y-2.5',\n className,\n )}\n {...props}\r\n >\r\n {children}\r\n </div>\r\n </RadioGroupContext.Provider>\r\n )\r\n },\r\n)\r\n\r\nRadioGroup.displayName = 'RadioGroup'\r\n\r\nexport { Radio, RadioGroup }\r\n","/**\n * @description: Slider 数值滑块组件 — 支持受控/非受控、min/max/step/disabled,可显示当前值\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, useState } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface SliderProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'defaultValue' | 'onChange' | 'min' | 'max' | 'step'> {\n /** 当前值(受控) */\n value?: number\n /** 初始值(非受控) */\n defaultValue?: number\n /** 最小值,默认 0 */\n min?: number\n /** 最大值,默认 100 */\n max?: number\n /** 步进值,默认 1 */\n step?: number\n /** 是否禁用 */\n disabled?: boolean\n /** 是否在滑块上方显示当前值,默认 false */\n showValue?: boolean\n /** 值变化回调 */\n onValueChange?: (value: number) => void\n}\n\n/**\n * 数值滑块组件\n * @example\n * // 非受控用法\n * <Slider defaultValue={30} min={0} max={100} step={5} showValue />\n *\n * // 受控用法\n * const [vol, setVol] = useState(50)\n * <Slider value={vol} onValueChange={setVol} min={0} max={100} />\n *\n * // 禁用状态\n * <Slider value={60} disabled />\n */\nconst Slider = forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n className,\n value: valueProp,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n showValue = false,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const isControlled = valueProp !== undefined\n const [uncontrolledValue, setUncontrolledValue] = useState<number>(defaultValue)\n const currentValue = isControlled ? valueProp : uncontrolledValue\n\n // 填充百分比,用于渲染已填充轨道\n const fillPercent = max === min ? 0 : ((currentValue - min) / (max - min)) * 100\n\n function updateValue(nextValue: number) {\n if (!isControlled) {\n setUncontrolledValue(nextValue)\n }\n onValueChange?.(nextValue)\n }\n\n function handleInput(e: React.FormEvent<HTMLInputElement>) {\n updateValue(Number(e.currentTarget.value))\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n const newValue = Number(e.target.value)\n if (newValue === currentValue) {\n return\n }\n updateValue(newValue)\n }\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n {showValue && (\n <span className=\"self-start text-xs font-semibold leading-none text-text-primary\">\n {currentValue}\n </span>\n )}\n <div className=\"relative flex h-6 w-full items-center\">\n {/* 轨道背景 */}\n <div className=\"pointer-events-none absolute h-2 w-full overflow-hidden rounded-full bg-surface-3\">\n {/* 已填充部分 */}\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${fillPercent}%` }}\n />\n </div>\n {/* 原生 range input(覆盖全区域,透明样式) */}\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n disabled={disabled}\n onInput={handleInput}\n onChange={handleChange}\n className={cn(\n 'relative h-6 w-full cursor-pointer appearance-none bg-transparent',\n // thumb 样式\n '[&::-webkit-slider-thumb]:h-[18px] [&::-webkit-slider-thumb]:w-[18px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-primary [&::-webkit-slider-thumb]:bg-surface-1 [&::-webkit-slider-thumb]:shadow-md [&::-webkit-slider-thumb]:transition-transform [&::-webkit-slider-thumb]:hover:scale-110',\n '[&::-moz-range-thumb]:h-[18px] [&::-moz-range-thumb]:w-[18px] [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-primary [&::-moz-range-thumb]:bg-surface-1 [&::-moz-range-thumb]:shadow-md',\n // track 透明(用自定义 div 代替)\n '[&::-webkit-slider-runnable-track]:bg-transparent',\n '[&::-moz-range-track]:bg-transparent',\n // focus\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0',\n // disabled\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n {...props}\n />\n </div>\n </div>\n )\n },\n)\n\nSlider.displayName = 'Slider'\n\nexport { Slider }\n","/**\n * @description: NumberInput 数字输入框组件 — 带 +/- 步进按钮,支持 min/max/step/precision/disabled\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, useState } from 'react'\nimport { Minus, Plus } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst numberInputVariants = cva(\n 'inline-flex items-center overflow-hidden rounded-lg border border-border-strong bg-surface-1 shadow-sm transition-colors focus-within:border-primary focus-within:ring-2 focus-within:ring-ring/25 has-[:disabled]:pointer-events-none has-[:disabled]:opacity-60',\n {\n variants: {\n size: {\n sm: 'h-8 text-xs',\n default: 'h-9 text-sm',\n lg: 'h-11 text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n)\n\nexport interface NumberInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'value' | 'defaultValue' | 'onChange' | 'type'>,\n VariantProps<typeof numberInputVariants> {\n /** 当前值(受控) */\n value?: number\n /** 初始值(非受控) */\n defaultValue?: number\n /** 最小值 */\n min?: number\n /** 最大值 */\n max?: number\n /** 步进值,默认 1 */\n step?: number\n /** 小数位数,默认 0 */\n precision?: number\n /** 是否禁用 */\n disabled?: boolean\n /** 占位文本 */\n placeholder?: string\n /** 值变化回调 */\n onValueChange?: (value: number) => void\n}\n\n/**\n * 数字步进输入框组件\n * @example\n * // 基础用法\n * <NumberInput defaultValue={1} min={1} max={99} step={1} />\n *\n * // 受控用法\n * const [qty, setQty] = useState(10)\n * <NumberInput value={qty} onValueChange={setQty} min={0} max={100} size=\"lg\" />\n *\n * // 带小数精度\n * <NumberInput defaultValue={1.5} step={0.1} precision={2} min={0} max={10} />\n */\nconst NumberInput = forwardRef<HTMLInputElement, NumberInputProps>(\n (\n {\n className,\n size,\n value: valueProp,\n defaultValue = 0,\n min,\n max,\n step = 1,\n precision = 0,\n disabled = false,\n placeholder,\n onValueChange,\n ...props\n },\n ref,\n ) => {\n const isControlled = valueProp !== undefined\n const [uncontrolledValue, setUncontrolledValue] = useState<number>(defaultValue)\n const currentValue = isControlled ? valueProp : uncontrolledValue\n\n function clamp(val: number): number {\n let result = val\n if (min !== undefined) result = Math.max(min, result)\n if (max !== undefined) result = Math.min(max, result)\n return result\n }\n\n function format(val: number): string {\n return val.toFixed(precision)\n }\n\n function commit(newVal: number) {\n const clamped = clamp(Number(newVal.toFixed(precision)))\n if (!isControlled) {\n setUncontrolledValue(clamped)\n }\n onValueChange?.(clamped)\n }\n\n function handleDecrement() {\n commit(currentValue - step)\n }\n\n function handleIncrement() {\n commit(currentValue + step)\n }\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const parsed = parseFloat(e.target.value)\n if (!Number.isNaN(parsed)) {\n commit(parsed)\n }\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n // 失焦时强制修正并格式化\n const parsed = parseFloat(e.target.value)\n if (!Number.isNaN(parsed)) {\n commit(parsed)\n } else {\n // 无效输入时还原\n if (!isControlled) {\n setUncontrolledValue(uncontrolledValue)\n }\n }\n }\n\n const atMin = min !== undefined && currentValue <= min\n const atMax = max !== undefined && currentValue >= max\n\n const btnBase =\n 'inline-flex shrink-0 items-center justify-center bg-surface-2 text-text-secondary transition-colors hover:bg-surface-3 hover:text-text-primary disabled:pointer-events-none disabled:opacity-40'\n const btnSizeCls =\n size === 'sm' ? 'h-8 w-7' : size === 'lg' ? 'h-11 w-10' : 'h-9 w-9'\n const iconSize = size === 'sm' ? 12 : size === 'lg' ? 16 : 14\n\n return (\n <div className={cn(numberInputVariants({ size }), className)}>\n {/* 减号按钮 */}\n <button\n type=\"button\"\n aria-label=\"减少数值\"\n disabled={disabled || atMin}\n onClick={handleDecrement}\n className={cn(btnBase, btnSizeCls, 'border-r border-border-base')}\n tabIndex={-1}\n >\n <Minus size={iconSize} />\n </button>\n\n {/* 数值输入框 */}\n <input\n ref={ref}\n type=\"number\"\n className={cn(\n 'min-w-0 flex-1 bg-transparent px-2 text-center font-medium text-text-primary outline-none',\n 'placeholder:text-text-tertiary',\n // 隐藏原生 spinner\n '[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\n )}\n value={format(currentValue)}\n disabled={disabled}\n placeholder={placeholder}\n min={min}\n max={max}\n step={step}\n onChange={handleInputChange}\n onBlur={handleBlur}\n {...props}\n />\n\n {/* 加号按钮 */}\n <button\n type=\"button\"\n aria-label=\"增加数值\"\n disabled={disabled || atMax}\n onClick={handleIncrement}\n className={cn(btnBase, btnSizeCls, 'border-l border-border-base')}\n tabIndex={-1}\n >\n <Plus size={iconSize} />\n </button>\n </div>\n )\n },\n)\n\nNumberInput.displayName = 'NumberInput'\n\nexport { NumberInput, numberInputVariants }\n","/**\n * @description: OTPInput 一次性验证码输入组件 — 支持逐位输入、方向键切换、Backspace 返回上一格、粘贴自动分配\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, useRef, useCallback } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface OTPInputProps {\n /** 当前验证码值(受控) */\n value: string\n /** 值变化回调 */\n onValueChange: (value: string) => void\n /** 验证码位数,默认 6 */\n length?: number\n /** 是否禁用 */\n disabled?: boolean\n /** 输入完整时的回调 */\n onComplete?: (value: string) => void\n /** 额外类名(作用于容器) */\n className?: string\n}\n\n/**\n * 一次性验证码(OTP)输入组件\n *\n * 渲染 N 个独立小方框,支持逐位输入数字、左右方向键切换焦点、\n * Backspace 清除并返回上一格,以及粘贴完整验证码自动填充。\n *\n * @example\n * ```tsx\n * const [code, setCode] = useState('')\n *\n * <OTPInput\n * value={code}\n * onValueChange={setCode}\n * length={6}\n * onComplete={verifyCode}\n * />\n * ```\n */\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n value,\n onValueChange,\n length = 6,\n disabled = false,\n onComplete,\n className,\n },\n ref,\n ) => {\n const inputRefs = useRef<Array<HTMLInputElement | null>>([])\n\n /** 聚焦指定位置的 input */\n const focusAt = useCallback((index: number) => {\n const el = inputRefs.current[index]\n if (el) {\n el.focus()\n // 光标移到末尾,方便替换\n el.setSelectionRange(el.value.length, el.value.length)\n }\n }, [])\n\n /** 更新指定位置字符,并触发回调 */\n const updateValueAt = useCallback(\n (index: number, char: string) => {\n const chars = value.padEnd(length, '').split('').slice(0, length)\n chars[index] = char\n const next = chars.join('')\n onValueChange(next)\n if (char && next.replace(/\\s/g, '').length === length && !next.includes(' ')) {\n onComplete?.(next)\n }\n },\n [value, length, onValueChange, onComplete],\n )\n\n const handleChange = useCallback(\n (index: number, e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n // 只取最后一个数字字符(防止输入法输入两个字符)\n const digit = raw.replace(/\\D/g, '').slice(-1)\n updateValueAt(index, digit)\n if (digit && index < length - 1) {\n focusAt(index + 1)\n }\n },\n [length, updateValueAt, focusAt],\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowLeft') {\n e.preventDefault()\n if (index > 0) focusAt(index - 1)\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (index < length - 1) focusAt(index + 1)\n } else if (e.key === 'Backspace') {\n e.preventDefault()\n const current = value[index] ?? ''\n if (current) {\n // 当前格有值 → 清除当前格\n updateValueAt(index, '')\n } else if (index > 0) {\n // 当前格为空 → 移到上一格并清除\n updateValueAt(index - 1, '')\n focusAt(index - 1)\n }\n }\n },\n [value, length, focusAt, updateValueAt],\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length)\n if (!pasted) return\n // 补齐或截断到 length\n const chars = pasted.padEnd(length, '').split('').slice(0, length)\n const next = chars.join('')\n onValueChange(next)\n // 聚焦到粘贴内容末尾的下一位(或最后一格)\n const nextFocus = Math.min(pasted.length, length - 1)\n focusAt(nextFocus)\n if (pasted.length === length) {\n onComplete?.(next)\n }\n },\n [length, onValueChange, onComplete, focusAt],\n )\n\n return (\n <div\n ref={ref}\n className={cn('flex items-center gap-2', className)}\n role=\"group\"\n aria-label=\"验证码输入\"\n >\n {Array.from({ length }, (_, i) => {\n const char = value[i] ?? ''\n const isFocused = false // 由 CSS 原生 :focus 控制\n\n return (\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el\n }}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]\"\n maxLength={1}\n value={char}\n disabled={disabled}\n aria-label={`验证码第 ${i + 1} 位`}\n className={cn(\n 'h-10 w-10 rounded-md border text-center text-sm font-medium text-text-primary transition-colors',\n 'outline-none focus:border-primary focus:ring-2 focus:ring-ring/20',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n char ? 'border-border-strong' : 'border-border-base',\n )}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n // 点击时全选,方便替换\n onClick={(e) => (e.target as HTMLInputElement).select()}\n />\n )\n })}\n </div>\n )\n },\n)\n\nOTPInput.displayName = 'OTPInput'\n\nexport { OTPInput }\n","/**\n * @description: Form 表单系列组件 — 包含 Form、FormField、FormItem、FormLabel、FormControl、FormDescription、FormMessage,通过 Context 向下传递字段名、id 与错误信息\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport {\n createContext,\n forwardRef,\n useContext,\n useId,\n type FormEvent,\n type HTMLAttributes,\n type LabelHTMLAttributes,\n type ReactElement,\n cloneElement,\n} from 'react'\nimport { cn } from '../internal/cn'\nimport { Label } from './label'\n\n// ─── FormField Context ────────────────────────────────────────────────────────\n\ninterface FormFieldContextValue {\n /** 字段名称 */\n name: string\n /** 字段错误信息,无错误时为 undefined */\n error: string | undefined\n /** 自动生成的控件 id */\n id: string\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue | null>(null)\n\nfunction useFormFieldContext(): FormFieldContextValue {\n const ctx = useContext(FormFieldContext)\n if (!ctx) {\n throw new Error('FormField 子组件必须在 <FormField> 内使用')\n }\n return ctx\n}\n\n// ─── Form ─────────────────────────────────────────────────────────────────────\n\nexport interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n /** 表单提交回调,已阻止默认行为 */\n onSubmit?: (event: FormEvent<HTMLFormElement>) => void\n}\n\n/**\n * 表单根容器,阻止默认提交行为后调用 onSubmit\n * @example\n * <Form onSubmit={handleSubmit} className=\"space-y-4\">\n * ...\n * </Form>\n */\nconst Form = forwardRef<HTMLFormElement, FormProps>(\n ({ className, onSubmit, children, ...props }, ref) => {\n function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault()\n onSubmit?.(event)\n }\n\n return (\n <form\n ref={ref}\n className={cn(className)}\n onSubmit={handleSubmit}\n {...props}\n >\n {children}\n </form>\n )\n },\n)\n\nForm.displayName = 'Form'\n\n// ─── FormField ────────────────────────────────────────────────────────────────\n\nexport interface FormFieldProps extends HTMLAttributes<HTMLDivElement> {\n /** 字段名称,用于关联 label/message */\n name: string\n /** 字段错误信息,有值时 FormMessage 显示红色提示 */\n error?: string\n}\n\n/**\n * 字段容器,通过 Context 向子组件提供 { name, error, id }\n * @example\n * <FormField name=\"email\" error={errors.email}>\n * <FormItem>\n * <FormLabel>邮箱</FormLabel>\n * <FormControl><Input /></FormControl>\n * <FormMessage />\n * </FormItem>\n * </FormField>\n */\nconst FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n ({ name, error, className, children, ...props }, ref) => {\n const generatedId = useId()\n\n return (\n <FormFieldContext.Provider value={{ name, error, id: generatedId }}>\n <div ref={ref} className={cn(className)} {...props}>\n {children}\n </div>\n </FormFieldContext.Provider>\n )\n },\n)\n\nFormField.displayName = 'FormField'\n\n// ─── FormItem ─────────────────────────────────────────────────────────────────\n\nexport interface FormItemProps extends HTMLAttributes<HTMLDivElement> {}\n\n/**\n * 字段垂直布局容器,提供 flex-col gap-1.5 间距\n * @example\n * <FormItem>\n * <FormLabel>用户名</FormLabel>\n * <FormControl><Input /></FormControl>\n * <FormMessage />\n * </FormItem>\n */\nconst FormItem = forwardRef<HTMLDivElement, FormItemProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col gap-1.5', className)}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nFormItem.displayName = 'FormItem'\n\n// ─── FormLabel ────────────────────────────────────────────────────────────────\n\nexport interface FormLabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** 是否为必填项,显示红色星号 */\n required?: boolean\n}\n\n/**\n * 表单字段标签,自动关联 FormField 生成的控件 id,支持 required 红星\n * @example\n * <FormLabel required>邮箱地址</FormLabel>\n */\nconst FormLabel = forwardRef<HTMLLabelElement, FormLabelProps>(\n ({ className, required, children, htmlFor, ...props }, ref) => {\n const ctx = useFormFieldContext()\n\n return (\n <Label\n ref={ref}\n htmlFor={htmlFor ?? ctx.id}\n required={required}\n className={cn(className)}\n {...props}\n >\n {children}\n </Label>\n )\n },\n)\n\nFormLabel.displayName = 'FormLabel'\n\n// ─── FormControl ──────────────────────────────────────────────────────────────\n\nexport interface FormControlProps {\n /** 单个表单控件子元素 */\n children: ReactElement\n}\n\n/**\n * 向子控件注入 id、aria-describedby 与 aria-invalid,实现无障碍关联\n * @example\n * <FormControl>\n * <Input placeholder=\"请输入邮箱\" />\n * </FormControl>\n */\nfunction FormControl({ children }: FormControlProps) {\n const ctx = useFormFieldContext()\n const descriptionId = `${ctx.id}-description`\n const messageId = `${ctx.id}-message`\n\n return cloneElement(children, {\n id: ctx.id,\n 'aria-describedby': ctx.error ? `${descriptionId} ${messageId}` : descriptionId,\n 'aria-invalid': ctx.error ? true : undefined,\n } as Record<string, unknown>)\n}\n\nFormControl.displayName = 'FormControl'\n\n// ─── FormDescription ──────────────────────────────────────────────────────────\n\nexport interface FormDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {}\n\n/**\n * 字段说明文字,灰色小字\n * @example\n * <FormDescription>请输入有效的电子邮箱地址</FormDescription>\n */\nconst FormDescription = forwardRef<HTMLParagraphElement, FormDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n const ctx = useFormFieldContext()\n\n return (\n <p\n ref={ref}\n id={`${ctx.id}-description`}\n className={cn('text-xs text-text-secondary', className)}\n {...props}\n >\n {children}\n </p>\n )\n },\n)\n\nFormDescription.displayName = 'FormDescription'\n\n// ─── FormMessage ──────────────────────────────────────────────────────────────\n\nexport interface FormMessageProps extends HTMLAttributes<HTMLParagraphElement> {\n /** 手动传入错误文本,优先级低于 FormField error prop */\n children?: React.ReactNode\n}\n\n/**\n * 字段错误提示,当 FormField 存在 error 时显示红色小字,无错误不渲染\n * @example\n * <FormMessage />\n */\nconst FormMessage = forwardRef<HTMLParagraphElement, FormMessageProps>(\n ({ className, children, ...props }, ref) => {\n const ctx = useFormFieldContext()\n const message = ctx.error ?? (typeof children === 'string' ? children : undefined)\n\n if (!message) return null\n\n return (\n <p\n ref={ref}\n id={`${ctx.id}-message`}\n className={cn('text-xs text-danger-soft-fg', className)}\n role=\"alert\"\n {...props}\n >\n {message}\n </p>\n )\n },\n)\n\nFormMessage.displayName = 'FormMessage'\n\n// ─── Exports ──────────────────────────────────────────────────────────────────\n\nexport {\n Form,\n FormField,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n}\n","/**\n * @description: Tabs 标签页组件 — 受控模式,支持无障碍访问\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { createContext, forwardRef, useContext } from 'react'\nimport { cn } from '../internal/cn'\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const ctx = useContext(TabsContext)\n if (!ctx) throw new Error('Tabs 子组件必须在 <Tabs> 内使用')\n return ctx\n}\n\nexport interface TabsProps {\n /** 当前激活的标签值 */\n value: string\n /** 切换标签回调 */\n onValueChange: (value: string) => void\n /** 子内容 */\n children: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** 对应的标签值 */\n value: string\n}\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 对应的标签值 */\n value: string\n}\n\n/**\n * 标签页容器\n * @example\n * <Tabs value={tab} onValueChange={setTab}>\n * <TabsList>\n * <TabsTrigger value=\"tab1\">基本信息</TabsTrigger>\n * <TabsTrigger value=\"tab2\">高级设置</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"tab1\">内容一</TabsContent>\n * <TabsContent value=\"tab2\">内容二</TabsContent>\n * </Tabs>\n */\nconst Tabs = forwardRef<HTMLDivElement, TabsProps>(({ value, onValueChange, children, className }, ref) => {\n return (\n <TabsContext.Provider value={{ value, onValueChange }}>\n <div ref={ref} className={cn('w-full', className)}>{children}</div>\n </TabsContext.Provider>\n )\n})\n\n/** 标签列表容器 */\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cn('inline-flex w-full items-center gap-0 border-b border-border-base', className)}\n {...props}\n >\n {children}\n </div>\n )\n})\n\n/** 单个标签触发器 */\nconst TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(({ value, className, children, ...props }, ref) => {\n const { value: activeValue, onValueChange } = useTabsContext()\n const isActive = activeValue === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n onClick={() => onValueChange(value)}\n className={cn(\n 'relative px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-1',\n 'after:absolute after:bottom-0 after:left-0 after:h-0.5 after:w-full after:transition-colors',\n isActive\n ? 'text-text-primary after:bg-primary'\n : 'text-text-secondary hover:text-text-primary after:bg-transparent',\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n})\n\n/** 标签内容面板 */\nconst TabsContent = forwardRef<HTMLDivElement, TabsContentProps>(({ value, className, children, ...props }, ref) => {\n const { value: activeValue } = useTabsContext()\n\n if (activeValue !== value) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n tabIndex={0}\n className={cn('mt-4 focus-visible:outline-none', className)}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabs.displayName = 'Tabs'\nTabsList.displayName = 'TabsList'\nTabsTrigger.displayName = 'TabsTrigger'\nTabsContent.displayName = 'TabsContent'\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","/**\n * @description: Accordion 手风琴组件 — 支持单选/多选展开,可折叠模式,ChevronDown 旋转动画\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { createContext, forwardRef, useContext, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\n/** 手风琴展开类型 */\nexport type AccordionType = 'single' | 'multiple'\n\ninterface AccordionContextValue {\n type: AccordionType\n /** single 模式下当前展开项的 value;multiple 模式下为数组 */\n value: string | string[]\n onValueChange: (value: string) => void\n /** 是否允许 single 模式下折叠已展开项 */\n collapsible: boolean\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null)\n\ninterface AccordionItemContextValue {\n value: string\n isOpen: boolean\n}\n\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null)\n\nfunction useAccordionContext() {\n const ctx = useContext(AccordionContext)\n if (!ctx) throw new Error('Accordion 子组件必须在 <Accordion> 内使用')\n return ctx\n}\n\nfunction useAccordionItemContext() {\n const ctx = useContext(AccordionItemContext)\n if (!ctx) throw new Error('AccordionTrigger/AccordionContent 必须在 <AccordionItem> 内使用')\n return ctx\n}\n\nexport interface AccordionSingleProps {\n type: 'single'\n /** 受控:当前展开项 */\n value?: string\n /** 非受控:默认展开项 */\n defaultValue?: string\n /** 状态变更回调 */\n onValueChange?: (value: string) => void\n /** 是否允许折叠已展开项 */\n collapsible?: boolean\n children?: React.ReactNode\n className?: string\n}\n\nexport interface AccordionMultipleProps {\n type: 'multiple'\n /** 受控:当前展开的多个项 */\n value?: string[]\n /** 非受控:默认展开的多个项 */\n defaultValue?: string[]\n /** 状态变更回调 */\n onValueChange?: (value: string[]) => void\n children?: React.ReactNode\n className?: string\n}\n\nexport type AccordionProps = AccordionSingleProps | AccordionMultipleProps\n\nexport interface AccordionItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 唯一标识 */\n value: string\n}\n\nexport type AccordionTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>\nexport type AccordionContentProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * 手风琴容器\n * @example\n * // 单选模式\n * <Accordion type=\"single\" collapsible defaultValue=\"item-1\">\n * <AccordionItem value=\"item-1\">\n * <AccordionTrigger>章节一</AccordionTrigger>\n * <AccordionContent>章节一的内容</AccordionContent>\n * </AccordionItem>\n * <AccordionItem value=\"item-2\">\n * <AccordionTrigger>章节二</AccordionTrigger>\n * <AccordionContent>章节二的内容</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n */\nconst Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n (props, ref) => {\n const { type, children, className, ...rest } = props\n\n const isSingle = type === 'single'\n const singleProps = isSingle ? (props as AccordionSingleProps) : null\n const multiProps = !isSingle ? (props as AccordionMultipleProps) : null\n\n const [internalSingle, setInternalSingle] = useState<string>(singleProps?.defaultValue ?? '')\n const [internalMulti, setInternalMulti] = useState<string[]>(multiProps?.defaultValue ?? [])\n\n const isControlledSingle = isSingle && singleProps?.value !== undefined\n const isControlledMulti = !isSingle && multiProps?.value !== undefined\n\n const value = isSingle\n ? isControlledSingle ? (singleProps!.value ?? '') : internalSingle\n : isControlledMulti ? (multiProps!.value ?? []) : internalMulti\n\n const collapsible = isSingle ? (singleProps?.collapsible ?? false) : false\n\n function handleValueChange(itemValue: string) {\n if (isSingle) {\n const current = value as string\n const next = current === itemValue && collapsible ? '' : itemValue\n if (!isControlledSingle) setInternalSingle(next)\n singleProps?.onValueChange?.(next)\n } else {\n const current = value as string[]\n const next = current.includes(itemValue)\n ? current.filter((v) => v !== itemValue)\n : [...current, itemValue]\n if (!isControlledMulti) setInternalMulti(next)\n multiProps?.onValueChange?.(next)\n }\n }\n\n // 过滤掉已被解构的 props 避免传到 DOM\n const { defaultValue: _dv, onValueChange: _ov, collapsible: _col, ...domRest } = rest as Record<string, unknown>\n void _dv; void _ov; void _col\n\n return (\n <AccordionContext.Provider value={{ type, value, onValueChange: handleValueChange, collapsible }}>\n <div ref={ref} className={cn('w-full divide-y divide-border-base rounded-md border border-border-base', className)} {...(domRest as React.HTMLAttributes<HTMLDivElement>)}>\n {children}\n </div>\n </AccordionContext.Provider>\n )\n }\n)\n\nAccordion.displayName = 'Accordion'\n\n/** 手风琴子项 */\nconst AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(({ value, className, children, ...props }, ref) => {\n const { value: activeValue, type } = useAccordionContext()\n\n const isOpen = type === 'single'\n ? activeValue === value\n : (activeValue as string[]).includes(value)\n\n return (\n <AccordionItemContext.Provider value={{ value, isOpen }}>\n <div ref={ref} className={cn('', className)} {...props}>\n {children}\n </div>\n </AccordionItemContext.Provider>\n )\n})\n\nAccordionItem.displayName = 'AccordionItem'\n\n/** 手风琴触发器,点击展开/收起 */\nconst AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(({ className, children, ...props }, ref) => {\n const { onValueChange } = useAccordionContext()\n const { value, isOpen } = useAccordionItemContext()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => onValueChange(value)}\n className={cn(\n 'flex w-full items-center justify-between px-4 py-3 text-left text-sm font-medium text-text-primary transition-colors hover:bg-surface-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-inset',\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={16}\n className={cn('shrink-0 text-text-secondary transition-transform duration-200', isOpen && 'rotate-180')}\n />\n </button>\n )\n})\n\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n/** 手风琴内容区域 */\nconst AccordionContent = forwardRef<HTMLDivElement, AccordionContentProps>(({ className, children, ...props }, ref) => {\n const { isOpen } = useAccordionItemContext()\n\n if (!isOpen) return null\n\n return (\n <div\n ref={ref}\n className={cn('px-4 pb-4 pt-1 text-sm text-text-secondary', className)}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nAccordionContent.displayName = 'AccordionContent'\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","/**\n * @description: Steps 步骤条组件 — 展示流程进度,支持水平/垂直方向,图标/勾选完成状态\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface StepItem {\n /** 步骤标题 */\n title: string\n /** 步骤描述(可选) */\n description?: string\n /** 自定义图标(可选,仅在未完成且非当前时生效) */\n icon?: React.ReactNode\n}\n\nexport interface StepsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 当前激活步骤下标(0-based) */\n current: number\n /** 步骤列表 */\n items: StepItem[]\n /** 排列方向 */\n direction?: 'horizontal' | 'vertical'\n /** 当前步骤状态 */\n status?: 'process' | 'finish' | 'error'\n}\n\n/**\n * 步骤条组件,展示流程进度\n * @example\n * <Steps\n * current={1}\n * items={[\n * { title: '填写信息', description: '输入基本资料' },\n * { title: '确认订单', description: '核对下单内容' },\n * { title: '完成支付' },\n * ]}\n * />\n */\nconst Steps = forwardRef<HTMLDivElement, StepsProps>(\n ({ current, items, direction = 'horizontal', status = 'process', className, ...props }, ref) => {\n const isHorizontal = direction === 'horizontal'\n\n return (\n <div\n ref={ref}\n className={cn(\n isHorizontal ? 'flex items-start' : 'flex flex-col gap-1',\n className,\n )}\n {...props}\n >\n {items.map((item, index) => {\n const isFinished = index < current || (index === current && status === 'finish')\n const isCurrent = index === current && status !== 'finish'\n const isError = index === current && status === 'error'\n const isLast = index === items.length - 1\n\n return (\n <div\n key={index}\n className={cn(\n isHorizontal ? 'flex flex-1 items-start' : 'flex items-start',\n )}\n >\n {/* 步骤图标 + 内容 */}\n <div className={cn('flex', isHorizontal ? 'flex-col items-center' : 'items-start')}>\n {/* 圆圈图标 */}\n <div\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 text-sm font-semibold shadow-sm transition-colors',\n isFinished && 'border-primary bg-primary text-primary-fg shadow-primary/20',\n isCurrent && !isError && 'border-primary bg-primary-soft text-primary-soft-fg shadow-primary/10',\n isError && 'border-danger bg-danger-soft text-danger-soft-fg shadow-danger/10',\n !isFinished && !isCurrent && !isError && 'border-border-strong bg-surface-1 text-text-tertiary',\n )}\n >\n {isFinished\n ? <Check size={16} strokeWidth={2.5} />\n : item.icon ?? <span>{index + 1}</span>}\n </div>\n\n {/* 连接线(水平方向在内容列中不显示,垂直方向在下方) */}\n {!isLast && !isHorizontal && (\n <div\n className={cn(\n 'ml-[17px] mt-1 w-0.5 flex-1 self-stretch rounded-full',\n isFinished ? 'bg-primary' : 'bg-border-strong',\n )}\n style={{ minHeight: '26px' }}\n />\n )}\n </div>\n\n {/* 文字内容 */}\n <div\n className={cn(\n isHorizontal ? 'mt-2 text-center' : 'ml-3.5 pb-5',\n isLast && !isHorizontal && 'pb-0',\n )}\n >\n <p\n className={cn(\n 'text-sm font-semibold leading-5',\n isFinished && 'text-text-primary',\n isCurrent && !isError && 'text-primary',\n isError && 'text-danger',\n !isFinished && !isCurrent && !isError && 'text-text-tertiary',\n )}\n >\n {item.title}\n </p>\n {item.description && (\n <p\n className={cn(\n 'mt-0.5 text-xs leading-5',\n isError ? 'text-danger' : 'text-text-secondary',\n )}\n >\n {item.description}\n </p>\n )}\n </div>\n\n {/* 连接线(水平方向,在两步之间) */}\n {!isLast && isHorizontal && (\n <div\n className={cn(\n 'mx-2 mt-4 h-0.5 flex-1',\n isFinished ? 'bg-primary' : 'bg-border-base',\n )}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n },\n)\n\nSteps.displayName = 'Steps'\n\nexport { Steps }\n","/**\n * @description: DropdownMenu 下拉菜单组件 — 点击触发,支持外部点击关闭,createPortal 定位\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\ninterface DropdownContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLElement | null>\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null)\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value)\n return\n }\n\n if (ref) {\n ref.current = value\n }\n}\n\nfunction useDropdownContext() {\n const ctx = useContext(DropdownContext)\n if (!ctx) throw new Error('Dropdown 子组件必须在 <DropdownMenu> 内使用')\n return ctx\n}\n\nexport interface DropdownMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface DropdownContentProps {\n children: React.ReactNode\n className?: string\n /** 对齐方向 */\n align?: 'start' | 'end'\n}\n\nexport interface DropdownItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** 是否为危险操作样式 */\n destructive?: boolean\n}\n\nexport type DropdownSeparatorProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * 下拉菜单容器\n * @example\n * <DropdownMenu>\n * <DropdownTrigger><Button>操作</Button></DropdownTrigger>\n * <DropdownContent align=\"end\">\n * <DropdownItem onClick={handleEdit}>编辑</DropdownItem>\n * <DropdownSeparator />\n * <DropdownItem destructive onClick={handleDelete}>删除</DropdownItem>\n * </DropdownContent>\n * </DropdownMenu>\n */\nconst DropdownMenu = forwardRef<HTMLDivElement, DropdownMenuProps>(({ children, className }, ref) => {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLElement | null>(null)\n\n return (\n <DropdownContext.Provider value={{ open, setOpen, triggerRef }}>\n <div ref={ref} className={cn('relative inline-block', className)}>{children}</div>\n </DropdownContext.Provider>\n )\n})\n\n/** 触发器包装器 */\nconst DropdownTrigger = forwardRef<HTMLDivElement, DropdownTriggerProps>(({ children, className }, ref) => {\n const { setOpen, open, triggerRef } = useDropdownContext()\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n assignRef(ref, node)\n },\n [ref, triggerRef]\n )\n\n return (\n <div\n ref={handleRef}\n className={cn('inline-flex cursor-pointer', className)}\n onClick={() => setOpen(!open)}\n >\n {children}\n </div>\n )\n})\n\n/** 下拉内容面板,通过 createPortal 渲染到 body */\nconst DropdownContent = forwardRef<HTMLDivElement, DropdownContentProps>(({ children, className, align = 'start' }, ref) => {\n const { open, setOpen, triggerRef } = useDropdownContext()\n const contentRef = useRef<HTMLDivElement>(null)\n const portalContainer = usePortalContainer()\n const [position, setPosition] = useState({ top: 0, left: 0 })\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n assignRef(ref, node)\n },\n [ref]\n )\n\n const updatePosition = useCallback(() => {\n if (!triggerRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const top = rect.bottom + window.scrollY + 4\n const left = align === 'end'\n ? rect.right + window.scrollX - (contentRef.current?.offsetWidth ?? 0)\n : rect.left + window.scrollX\n setPosition({ top, left })\n }, [align, triggerRef])\n\n useEffect(() => {\n if (!open) return\n updatePosition()\n }, [open, updatePosition])\n\n // 点击外部关闭\n useEffect(() => {\n if (!open) return\n function handleClickOutside(e: MouseEvent) {\n if (\n contentRef.current &&\n !contentRef.current.contains(e.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(e.target as Node)\n ) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [open, setOpen, triggerRef])\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={handleRef}\n style={{ top: position.top, left: position.left }}\n className={cn(\n 'absolute z-50 min-w-44 overflow-hidden rounded-lg border border-border-base bg-surface-1 p-1 text-text-primary shadow-xl',\n className\n )}\n >\n {children}\n </div>,\n portalContainer\n )\n})\n\n/** 菜单项 */\nconst DropdownItem = forwardRef<HTMLButtonElement, DropdownItemProps>(({ children, className, destructive = false, onClick, ...props }, ref) => {\n const { setOpen } = useDropdownContext()\n\n function handleClick(e: React.MouseEvent<HTMLButtonElement>) {\n setOpen(false)\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'flex min-h-8 w-full items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm leading-none transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50',\n destructive\n ? 'text-danger hover:bg-danger-soft focus-visible:bg-danger-soft'\n : 'text-text-primary hover:bg-surface-2 focus-visible:bg-surface-2',\n className\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n})\n\n/** 分隔线 */\nconst DropdownSeparator = forwardRef<HTMLDivElement, DropdownSeparatorProps>(({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('-mx-1 my-1 h-px bg-border-base', className)} {...props} />\n})\n\nDropdownMenu.displayName = 'DropdownMenu'\nDropdownTrigger.displayName = 'DropdownTrigger'\nDropdownContent.displayName = 'DropdownContent'\nDropdownItem.displayName = 'DropdownItem'\nDropdownSeparator.displayName = 'DropdownSeparator'\n\nexport { DropdownMenu, DropdownTrigger, DropdownContent, DropdownItem, DropdownSeparator }\n","/**\n * @description: Popover 浮层组件 — 点击触发,支持四方向定位,外部点击自动关闭\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\n/** 浮层显示方向 */\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left'\n\n/** 浮层对齐方式 */\nexport type PopoverAlign = 'start' | 'center' | 'end'\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLElement | null>\n}\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null)\n\nfunction usePopoverContext() {\n const ctx = useContext(PopoverContext)\n if (!ctx) throw new Error('Popover 子组件必须在 <Popover> 内使用')\n return ctx\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value)\n return\n }\n if (ref) {\n ref.current = value\n }\n}\n\nexport interface PopoverProps {\n /** 受控:是否显示 */\n open?: boolean\n /** 非受控:默认是否显示 */\n defaultOpen?: boolean\n /** 状态变更回调 */\n onOpenChange?: (open: boolean) => void\n /** 子内容 */\n children?: React.ReactNode\n}\n\nexport interface PopoverTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 浮层方向,默认 bottom */\n side?: PopoverSide\n /** 对齐方式,默认 center */\n align?: PopoverAlign\n /** 与触发器的间距,默认 4 */\n sideOffset?: number\n}\n\n/**\n * Popover 容器\n * @example\n * <Popover>\n * <PopoverTrigger><Button>点击打开</Button></PopoverTrigger>\n * <PopoverContent side=\"bottom\" align=\"center\">\n * <p className=\"text-sm text-text-secondary\">浮层内容,可放复杂组件</p>\n * </PopoverContent>\n * </Popover>\n */\nconst Popover = ({ open: controlledOpen, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const triggerRef = useRef<HTMLElement | null>(null)\n\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : internalOpen\n\n const setOpen = useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalOpen(value)\n onOpenChange?.(value)\n },\n [isControlled, onOpenChange]\n )\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef }}>\n {children}\n </PopoverContext.Provider>\n )\n}\n\nPopover.displayName = 'Popover'\n\n/** Popover 触发器 */\nconst PopoverTrigger = forwardRef<HTMLDivElement, PopoverTriggerProps>(({ children, className }, ref) => {\n const { setOpen, open, triggerRef } = usePopoverContext()\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n assignRef(ref, node)\n },\n [ref, triggerRef]\n )\n\n return (\n <div\n ref={handleRef}\n className={cn('inline-flex', className)}\n onClick={() => setOpen(!open)}\n >\n {children}\n </div>\n )\n})\n\nPopoverTrigger.displayName = 'PopoverTrigger'\n\n/** 计算浮层定位 */\nfunction calcPosition(\n triggerRect: DOMRect,\n contentEl: HTMLElement,\n side: PopoverSide,\n align: PopoverAlign,\n sideOffset: number\n): { top: number; left: number } {\n const cw = contentEl.offsetWidth\n const ch = contentEl.offsetHeight\n let top = 0\n let left = 0\n\n if (side === 'bottom') {\n top = triggerRect.bottom + window.scrollY + sideOffset\n } else if (side === 'top') {\n top = triggerRect.top + window.scrollY - ch - sideOffset\n } else if (side === 'left') {\n top = triggerRect.top + window.scrollY + triggerRect.height / 2 - ch / 2\n left = triggerRect.left + window.scrollX - cw - sideOffset\n return { top, left }\n } else {\n // right\n top = triggerRect.top + window.scrollY + triggerRect.height / 2 - ch / 2\n left = triggerRect.right + window.scrollX + sideOffset\n return { top, left }\n }\n\n // 水平对齐(top / bottom)\n if (align === 'start') {\n left = triggerRect.left + window.scrollX\n } else if (align === 'end') {\n left = triggerRect.right + window.scrollX - cw\n } else {\n left = triggerRect.left + window.scrollX + triggerRect.width / 2 - cw / 2\n }\n\n return { top, left }\n}\n\n/** Popover 内容浮层,通过 createPortal 渲染到 body */\nconst PopoverContent = forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ children, className, side = 'bottom', align = 'center', sideOffset = 4, ...props }, ref) => {\n const { open, setOpen, triggerRef } = usePopoverContext()\n const contentRef = useRef<HTMLDivElement>(null)\n const portalContainer = usePortalContainer()\n const [pos, setPos] = useState({ top: 0, left: 0 })\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n assignRef(ref, node)\n },\n [ref]\n )\n\n const updatePos = useCallback(() => {\n if (!triggerRef.current || !contentRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n setPos(calcPosition(rect, contentRef.current, side, align, sideOffset))\n }, [side, align, sideOffset, triggerRef])\n\n useEffect(() => {\n if (open) updatePos()\n }, [open, updatePos])\n\n // 点击外部关闭\n useEffect(() => {\n if (!open) return\n function handleMouseDown(e: MouseEvent) {\n if (\n contentRef.current &&\n !contentRef.current.contains(e.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(e.target as Node)\n ) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleMouseDown)\n return () => document.removeEventListener('mousedown', handleMouseDown)\n }, [open, setOpen, triggerRef])\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={handleRef}\n style={{ top: pos.top, left: pos.left }}\n className={cn(\n 'absolute z-50 min-w-40 rounded-md border border-border-base bg-surface-1 p-3 shadow-lg',\n className\n )}\n {...props}\n >\n {children}\n </div>,\n portalContainer\n )\n }\n)\n\nPopoverContent.displayName = 'PopoverContent'\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","/**\n * @description: ContextMenu 右键菜单组件 — 监听 contextmenu 事件,在鼠标位置展开浮层,点击外部或 ESC 关闭\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\ninterface ContextMenuPosition {\n x: number\n y: number\n}\n\ninterface ContextMenuContextValue {\n open: boolean\n position: ContextMenuPosition\n setOpen: (open: boolean) => void\n openAt: (pos: ContextMenuPosition) => void\n}\n\nconst ContextMenuContext = createContext<ContextMenuContextValue | null>(null)\n\nfunction useContextMenuContext() {\n const ctx = useContext(ContextMenuContext)\n if (!ctx) throw new Error('ContextMenu 子组件必须在 <ContextMenu> 内使用')\n return ctx\n}\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value)\n return\n }\n if (ref) {\n ref.current = value\n }\n}\n\nexport interface ContextMenuProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface ContextMenuTriggerProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport interface ContextMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport interface ContextMenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** 是否为危险操作样式 */\n destructive?: boolean\n}\n\nexport type ContextMenuSeparatorProps = React.HTMLAttributes<HTMLDivElement>\n\n/**\n * 右键菜单根容器\n * @example\n * <ContextMenu>\n * <ContextMenuTrigger>\n * <div className=\"border p-8 rounded\">在此区域右键</div>\n * </ContextMenuTrigger>\n * <ContextMenuContent>\n * <ContextMenuItem onClick={handleCopy}>复制</ContextMenuItem>\n * <ContextMenuItem onClick={handlePaste}>粘贴</ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem destructive onClick={handleDelete}>删除</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n */\nconst ContextMenu = forwardRef<HTMLDivElement, ContextMenuProps>(\n ({ children, className }, ref) => {\n const [open, setOpen] = useState(false)\n const [position, setPosition] = useState<ContextMenuPosition>({ x: 0, y: 0 })\n\n const openAt = useCallback((pos: ContextMenuPosition) => {\n setPosition(pos)\n setOpen(true)\n }, [])\n\n return (\n <ContextMenuContext.Provider value={{ open, position, setOpen, openAt }}>\n <div ref={ref} className={cn('relative', className)}>\n {children}\n </div>\n </ContextMenuContext.Provider>\n )\n },\n)\n\n/** 右键触发区域包裹元素 */\nconst ContextMenuTrigger = forwardRef<HTMLDivElement, ContextMenuTriggerProps>(\n ({ children, className, ...props }, ref) => {\n const { openAt } = useContextMenuContext()\n\n function handleContextMenu(e: React.MouseEvent<HTMLDivElement>) {\n e.preventDefault()\n openAt({ x: e.clientX, y: e.clientY })\n }\n\n return (\n <div\n ref={ref}\n className={cn(className)}\n onContextMenu={handleContextMenu}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\n/** 右键菜单内容面板,fixed 定位到鼠标位置 */\nconst ContextMenuContent = forwardRef<HTMLDivElement, ContextMenuContentProps>(\n ({ children, className, ...props }, ref) => {\n const { open, position, setOpen } = useContextMenuContext()\n const contentRef = useRef<HTMLDivElement>(null)\n const portalContainer = usePortalContainer()\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n assignRef(ref, node)\n },\n [ref],\n )\n\n // 点击外部关闭\n useEffect(() => {\n if (!open) return\n\n function handleMouseDown(e: MouseEvent) {\n if (contentRef.current && !contentRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n setOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleMouseDown)\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('mousedown', handleMouseDown)\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [open, setOpen])\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={handleRef}\n style={{ top: position.y, left: position.x }}\n className={cn(\n 'fixed z-50 min-w-40 rounded-md border border-border-base bg-surface-1 py-1 shadow-lg',\n className,\n )}\n {...props}\n >\n {children}\n </div>,\n portalContainer,\n )\n },\n)\n\n/** 右键菜单项 */\nconst ContextMenuItem = forwardRef<HTMLButtonElement, ContextMenuItemProps>(\n ({ children, className, destructive = false, onClick, ...props }, ref) => {\n const { setOpen } = useContextMenuContext()\n\n function handleClick(e: React.MouseEvent<HTMLButtonElement>) {\n setOpen(false)\n onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'w-full px-3 py-1.5 text-left text-sm transition-colors focus-visible:outline-none focus-visible:bg-surface-3',\n destructive\n ? 'text-danger hover:bg-danger-soft/10'\n : 'text-text-primary hover:bg-surface-3',\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n },\n)\n\n/** 右键菜单分隔线 */\nconst ContextMenuSeparator = forwardRef<HTMLDivElement, ContextMenuSeparatorProps>(\n ({ className, ...props }, ref) => {\n return <div ref={ref} className={cn('my-1 h-px bg-border-base', className)} {...props} />\n },\n)\n\nContextMenu.displayName = 'ContextMenu'\nContextMenuTrigger.displayName = 'ContextMenuTrigger'\nContextMenuContent.displayName = 'ContextMenuContent'\nContextMenuItem.displayName = 'ContextMenuItem'\nContextMenuSeparator.displayName = 'ContextMenuSeparator'\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n}\n","/**\n * @description: NavigationMenu 顶部横向导航菜单组件 — 支持直接链接与 hover 展开的下拉面板\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { createContext, forwardRef, useCallback, useContext, useRef, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\ninterface NavigationMenuContextValue {\n /** 当前展开的菜单项 ID */\n activeItem: string | null\n /** 设置展开菜单项 */\n setActiveItem: (id: string | null) => void\n}\n\nconst NavigationMenuContext = createContext<NavigationMenuContextValue | null>(null)\n\nfunction useNavigationMenuContext() {\n const ctx = useContext(NavigationMenuContext)\n if (!ctx) throw new Error('NavigationMenu 子组件必须在 <NavigationMenu> 内使用')\n return ctx\n}\n\ninterface NavigationMenuItemContextValue {\n /** 当前 Item 的唯一 ID */\n itemId: string\n}\n\nconst NavigationMenuItemContext = createContext<NavigationMenuItemContextValue | null>(null)\n\nfunction useNavigationMenuItemContext() {\n const ctx = useContext(NavigationMenuItemContext)\n if (!ctx) throw new Error('NavigationMenuTrigger/Content 必须在 <NavigationMenuItem> 内使用')\n return ctx\n}\n\nexport interface NavigationMenuProps extends React.HTMLAttributes<HTMLElement> {}\n\nexport interface NavigationMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport interface NavigationMenuLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** 是否为当前激活页 */\n active?: boolean\n}\n\nexport interface NavigationMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport interface NavigationMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nlet _idCounter = 0\n\n/**\n * 顶部横向导航菜单根容器\n * @example\n * <NavigationMenu>\n * <NavigationMenuItem>\n * <NavigationMenuLink href=\"/\">首页</NavigationMenuLink>\n * </NavigationMenuItem>\n * <NavigationMenuItem>\n * <NavigationMenuTrigger>产品</NavigationMenuTrigger>\n * <NavigationMenuContent>\n * <NavigationMenuLink href=\"/products/a\">产品 A</NavigationMenuLink>\n * <NavigationMenuLink href=\"/products/b\">产品 B</NavigationMenuLink>\n * </NavigationMenuContent>\n * </NavigationMenuItem>\n * </NavigationMenu>\n */\nconst NavigationMenu = forwardRef<HTMLElement, NavigationMenuProps>(\n ({ className, children, ...props }, ref) => {\n const [activeItem, setActiveItem] = useState<string | null>(null)\n\n return (\n <NavigationMenuContext.Provider value={{ activeItem, setActiveItem }}>\n <nav\n ref={ref}\n className={cn('relative flex items-center gap-1', className)}\n {...props}\n >\n {children}\n </nav>\n </NavigationMenuContext.Provider>\n )\n },\n)\n\n/** 导航菜单项容器,可包含 Link 或 Trigger + Content */\nconst NavigationMenuItem = forwardRef<HTMLDivElement, NavigationMenuItemProps>(\n ({ className, children, ...props }, ref) => {\n const itemIdRef = useRef<string>(`nav-item-${++_idCounter}`)\n const { activeItem, setActiveItem } = useNavigationMenuContext()\n const isOpen = activeItem === itemIdRef.current\n\n const handleMouseEnter = useCallback(() => {\n setActiveItem(itemIdRef.current)\n }, [setActiveItem])\n\n const handleMouseLeave = useCallback(() => {\n setActiveItem(null)\n }, [setActiveItem])\n\n return (\n <NavigationMenuItemContext.Provider value={{ itemId: itemIdRef.current }}>\n <div\n ref={ref}\n className={cn('relative', className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-state={isOpen ? 'open' : 'closed'}\n {...props}\n >\n {children}\n </div>\n </NavigationMenuItemContext.Provider>\n )\n },\n)\n\n/** 直接跳转的导航链接 */\nconst NavigationMenuLink = forwardRef<HTMLAnchorElement, NavigationMenuLinkProps>(\n ({ className, active = false, children, ...props }, ref) => {\n return (\n <a\n ref={ref}\n className={cn(\n 'inline-flex items-center rounded-md px-3 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-1',\n active\n ? 'bg-surface-3 text-text-primary'\n : 'text-text-secondary hover:bg-surface-3 hover:text-text-primary',\n className,\n )}\n {...props}\n >\n {children}\n </a>\n )\n },\n)\n\n/** 带下拉面板的触发器按钮 */\nconst NavigationMenuTrigger = forwardRef<HTMLButtonElement, NavigationMenuTriggerProps>(\n ({ className, children, ...props }, ref) => {\n const { activeItem } = useNavigationMenuContext()\n const { itemId } = useNavigationMenuItemContext()\n const isOpen = activeItem === itemId\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-expanded={isOpen}\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-3 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-1',\n isOpen\n ? 'bg-surface-3 text-text-primary'\n : 'text-text-secondary hover:bg-surface-3 hover:text-text-primary',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={14}\n className={cn('transition-transform duration-200', isOpen && 'rotate-180')}\n />\n </button>\n )\n },\n)\n\n/** 下拉面板内容 */\nconst NavigationMenuContent = forwardRef<HTMLDivElement, NavigationMenuContentProps>(\n ({ className, children, ...props }, ref) => {\n const { activeItem } = useNavigationMenuContext()\n const { itemId } = useNavigationMenuItemContext()\n const isOpen = activeItem === itemId\n\n if (!isOpen) return null\n\n return (\n <div\n ref={ref}\n className={cn(\n 'absolute left-0 top-full z-50 mt-1 min-w-40 rounded-md border border-border-base bg-surface-1 py-1 shadow-lg',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n )\n },\n)\n\nNavigationMenu.displayName = 'NavigationMenu'\nNavigationMenuItem.displayName = 'NavigationMenuItem'\nNavigationMenuLink.displayName = 'NavigationMenuLink'\nNavigationMenuTrigger.displayName = 'NavigationMenuTrigger'\nNavigationMenuContent.displayName = 'NavigationMenuContent'\n\nexport {\n NavigationMenu,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuTrigger,\n NavigationMenuContent,\n}\n","/**\n * @description: Avatar 头像组件 — 通过 Context 共享图片加载状态,加载完成后自动隐藏 Fallback,避免闪烁\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useState,\n type ImgHTMLAttributes,\n type HTMLAttributes,\n} from 'react'\nimport { User } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\n// ─── Context: 共享图片加载状态 ────────────────────────────────────────────────\n\ntype ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'\n\ninterface AvatarContextValue {\n imageLoadingStatus: ImageLoadingStatus\n setImageLoadingStatus: (status: ImageLoadingStatus) => void\n}\n\nconst AvatarContext = createContext<AvatarContextValue | null>(null)\n\nfunction useAvatarContext(componentName: string): AvatarContextValue {\n const ctx = useContext(AvatarContext)\n if (!ctx) {\n throw new Error(`<${componentName}> 必须在 <Avatar> 内使用`)\n }\n return ctx\n}\n\n// ─── 变体 ─────────────────────────────────────────────────────────────────────\n\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-surface-3',\n {\n variants: {\n size: {\n sm: 'h-8 w-8 text-xs',\n md: 'h-10 w-10 text-sm',\n lg: 'h-14 w-14 text-base',\n xl: 'h-20 w-20 text-xl',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\nexport interface AvatarProps\n extends HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof avatarVariants> {}\n\nexport interface AvatarImageProps extends ImgHTMLAttributes<HTMLImageElement> {\n /** 图片 URL */\n src: string\n /** alt 文本 */\n alt?: string\n}\n\nexport type AvatarFallbackProps = HTMLAttributes<HTMLSpanElement>\n\n// ─── Avatar ───────────────────────────────────────────────────────────────────\n\n/**\n * 头像容器,提供图片加载状态 Context\n * @example\n * <Avatar size=\"lg\">\n * <AvatarImage src=\"/user.png\" alt=\"用户头像\" />\n * <AvatarFallback>张</AvatarFallback>\n * </Avatar>\n */\nconst Avatar = forwardRef<HTMLSpanElement, AvatarProps>(\n ({ size, className, children, ...props }, ref) => {\n const [imageLoadingStatus, setImageLoadingStatus] =\n useState<ImageLoadingStatus>('idle')\n\n return (\n <AvatarContext.Provider value={{ imageLoadingStatus, setImageLoadingStatus }}>\n <span ref={ref} className={cn(avatarVariants({ size }), className)} {...props}>\n {children}\n </span>\n </AvatarContext.Provider>\n )\n },\n)\n\n// ─── AvatarImage ──────────────────────────────────────────────────────────────\n\n/** 头像图片 — 加载中、失败时不渲染(由 AvatarFallback 接管),加载成功后才显示 */\nconst AvatarImage = forwardRef<HTMLImageElement, AvatarImageProps>(\n ({ src, alt = '', className, onLoad, onError, ...props }, ref) => {\n const { imageLoadingStatus, setImageLoadingStatus } = useAvatarContext('AvatarImage')\n\n // 切换 src 时重置状态\n useEffect(() => {\n if (!src) {\n setImageLoadingStatus('error')\n return\n }\n setImageLoadingStatus('loading')\n }, [src, setImageLoadingStatus])\n\n // 仅在加载成功时渲染 <img>,避免加载中 / 失败时的闪烁\n if (imageLoadingStatus !== 'loaded' && imageLoadingStatus !== 'loading') {\n return null\n }\n\n return (\n <img\n ref={ref}\n src={src}\n alt={alt}\n onLoad={(event) => {\n setImageLoadingStatus('loaded')\n onLoad?.(event)\n }}\n onError={(event) => {\n setImageLoadingStatus('error')\n onError?.(event)\n }}\n className={cn(\n 'h-full w-full object-cover',\n imageLoadingStatus === 'loading' && 'invisible',\n className,\n )}\n {...props}\n />\n )\n },\n)\n\n// ─── AvatarFallback ───────────────────────────────────────────────────────────\n\n/** 回退内容 — 仅在图片未加载完成时显示,加载成功后自动隐藏 */\nconst AvatarFallback = forwardRef<HTMLSpanElement, AvatarFallbackProps>(\n ({ className, children, ...props }, ref) => {\n const { imageLoadingStatus } = useAvatarContext('AvatarFallback')\n\n if (imageLoadingStatus === 'loaded') return null\n\n return (\n <span\n ref={ref}\n className={cn(\n 'absolute inset-0 flex items-center justify-center font-medium text-text-secondary',\n className,\n )}\n {...props}\n >\n {children ?? <User size={16} />}\n </span>\n )\n },\n)\n\nAvatar.displayName = 'Avatar'\nAvatarImage.displayName = 'AvatarImage'\nAvatarFallback.displayName = 'AvatarFallback'\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","/**\n * @description: AvatarGroup 头像堆叠组组件 — 支持最大显示数量、超出用 +N 圆形代替,多尺寸\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, Children, isValidElement } from 'react'\nimport { cn } from '../internal/cn'\n\nexport type AvatarGroupSize = 'sm' | 'default' | 'lg'\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 最多显示的头像数量,超出用 +N 展示,默认 5 */\n max?: number\n /** 头像尺寸 */\n size?: AvatarGroupSize\n}\n\nconst SIZE_CLASSES: Record<AvatarGroupSize, string> = {\n sm: 'h-8 w-8 text-xs',\n default: 'h-10 w-10 text-sm',\n lg: 'h-14 w-14 text-base',\n}\n\nconst RING_SIZE_CLASSES: Record<AvatarGroupSize, string> = {\n sm: 'ring-2',\n default: 'ring-2',\n lg: 'ring-[3px]',\n}\n\nconst OVERLAP_CLASSES: Record<AvatarGroupSize, string> = {\n sm: '-ml-1.5',\n default: '-ml-2',\n lg: '-ml-3',\n}\n\n/**\n * 头像堆叠组,超出 max 时末尾显示 +N 灰底圆\n * @example\n * <AvatarGroup max={3} size=\"default\">\n * <Avatar><AvatarImage src=\"/a.png\" alt=\"用户A\" /></Avatar>\n * <Avatar><AvatarImage src=\"/b.png\" alt=\"用户B\" /><AvatarFallback>B</AvatarFallback></Avatar>\n * <Avatar><AvatarFallback>张</AvatarFallback></Avatar>\n * <Avatar><AvatarFallback>李</AvatarFallback></Avatar>\n * </AvatarGroup>\n */\nconst AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ max = 5, size = 'default', className, children, ...props }, ref) => {\n const allItems = Children.toArray(children).filter(isValidElement)\n const visibleItems = allItems.slice(0, max)\n const overflowCount = allItems.length - max\n\n return (\n <div\n ref={ref}\n className={cn('flex max-w-full items-center overflow-hidden py-0.5', className)}\n {...props}\n >\n {visibleItems.map((child, idx) => (\n <span\n key={idx}\n className={cn(\n 'relative inline-flex shrink-0 overflow-hidden rounded-full border border-border-base bg-surface-2 ring-surface-1',\n SIZE_CLASSES[size],\n RING_SIZE_CLASSES[size],\n idx > 0 && OVERLAP_CLASSES[size]\n )}\n >\n {child}\n </span>\n ))}\n {overflowCount > 0 && (\n <span\n className={cn(\n 'relative inline-flex shrink-0 items-center justify-center rounded-full border border-border-base bg-surface-2 font-medium text-text-secondary ring-surface-1',\n SIZE_CLASSES[size],\n RING_SIZE_CLASSES[size],\n OVERLAP_CLASSES[size]\n )}\n aria-label={`还有 ${overflowCount} 人`}\n >\n +{overflowCount}\n </span>\n )}\n </div>\n )\n }\n)\n\nAvatarGroup.displayName = 'AvatarGroup'\n\nexport { AvatarGroup }\n","/**\n * @description: Tooltip 提示组件 — hover 触发,延迟 200ms,支持四方向,黑色背景小三角箭头\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { createContext, forwardRef, useCallback, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { cn } from '../internal/cn'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\nexport interface TooltipProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface TooltipTriggerProps {\n children: React.ReactNode\n className?: string\n}\n\nexport interface TooltipContentProps {\n children: React.ReactNode\n /** 显示方向 */\n side?: 'top' | 'bottom' | 'left' | 'right'\n className?: string\n}\n\ninterface TooltipContextValue {\n open: boolean\n setOpen: (v: boolean) => void\n triggerRef: React.RefObject<HTMLElement | null>\n delayRef: React.RefObject<ReturnType<typeof setTimeout> | null>\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction assignRef<T>(ref: React.ForwardedRef<T>, value: T) {\n if (typeof ref === 'function') {\n ref(value)\n return\n }\n\n if (ref) {\n ref.current = value\n }\n}\n\nfunction useTooltipContext() {\n const ctx = useContext(TooltipContext)\n if (!ctx) throw new Error('Tooltip 子组件必须在 <Tooltip> 内使用')\n return ctx\n}\n\n/**\n * Tooltip 容器\n * @example\n * <Tooltip>\n * <TooltipTrigger><Button>悬停我</Button></TooltipTrigger>\n * <TooltipContent side=\"top\">这是提示文字</TooltipContent>\n * </Tooltip>\n */\nconst Tooltip = forwardRef<HTMLSpanElement, TooltipProps>(({ children, className }, ref) => {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLElement | null>(null)\n const delayRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n return () => {\n if (delayRef.current) {\n clearTimeout(delayRef.current)\n }\n }\n }, [])\n\n return (\n <TooltipContext.Provider value={{ open, setOpen, triggerRef, delayRef }}>\n <span ref={ref} className={cn('relative inline-flex', className)}>{children}</span>\n </TooltipContext.Provider>\n )\n})\n\n/** Tooltip 触发器 */\nconst TooltipTrigger = forwardRef<HTMLSpanElement, TooltipTriggerProps>(({ children, className }, ref) => {\n const { setOpen, triggerRef, delayRef } = useTooltipContext()\n\n const handleRef = useCallback(\n (node: HTMLSpanElement | null) => {\n triggerRef.current = node\n assignRef(ref, node)\n },\n [ref, triggerRef]\n )\n\n function handleMouseEnter() {\n delayRef.current = setTimeout(() => setOpen(true), 200)\n }\n\n function handleMouseLeave() {\n if (delayRef.current) clearTimeout(delayRef.current)\n setOpen(false)\n }\n\n return (\n <span\n ref={handleRef}\n className={cn('inline-flex', className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n )\n})\n\nconst arrowPositionClasses: Record<NonNullable<TooltipContentProps['side']>, string> = {\n top: 'after:absolute after:top-full after:left-1/2 after:-translate-x-1/2 after:border-4 after:border-transparent after:border-t-text-primary',\n bottom: 'after:absolute after:bottom-full after:left-1/2 after:-translate-x-1/2 after:border-4 after:border-transparent after:border-b-text-primary',\n left: 'after:absolute after:left-full after:top-1/2 after:-translate-y-1/2 after:border-4 after:border-transparent after:border-l-text-primary',\n right: 'after:absolute after:right-full after:top-1/2 after:-translate-y-1/2 after:border-4 after:border-transparent after:border-r-text-primary',\n}\n\n/** Tooltip 内容气泡 */\nconst TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(({ children, side = 'top', className }, ref) => {\n const { open, triggerRef } = useTooltipContext()\n const contentRef = useRef<HTMLDivElement>(null)\n const portalContainer = usePortalContainer()\n const [pos, setPos] = useState({ top: 0, left: 0 })\n\n const handleRef = useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n assignRef(ref, node)\n },\n [ref]\n )\n\n const updatePos = useCallback(() => {\n if (!triggerRef.current || !contentRef.current) return\n const rect = triggerRef.current.getBoundingClientRect()\n const cw = contentRef.current.offsetWidth\n const ch = contentRef.current.offsetHeight\n const gap = 8\n\n let top = 0\n let left = 0\n\n if (side === 'top') {\n top = rect.top + window.scrollY - ch - gap\n left = rect.left + window.scrollX + rect.width / 2 - cw / 2\n } else if (side === 'bottom') {\n top = rect.bottom + window.scrollY + gap\n left = rect.left + window.scrollX + rect.width / 2 - cw / 2\n } else if (side === 'left') {\n top = rect.top + window.scrollY + rect.height / 2 - ch / 2\n left = rect.left + window.scrollX - cw - gap\n } else {\n top = rect.top + window.scrollY + rect.height / 2 - ch / 2\n left = rect.right + window.scrollX + gap\n }\n\n setPos({ top, left })\n }, [side, triggerRef])\n\n useEffect(() => {\n if (open) updatePos()\n }, [open, updatePos])\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div\n ref={handleRef}\n style={{ top: pos.top, left: pos.left }}\n className={cn(\n 'absolute z-50 rounded-md bg-text-primary px-2.5 py-1.5 text-xs text-surface-1 shadow-md',\n arrowPositionClasses[side],\n className\n )}\n >\n {children}\n </div>,\n portalContainer\n )\n})\n\nTooltip.displayName = 'Tooltip'\nTooltipTrigger.displayName = 'TooltipTrigger'\nTooltipContent.displayName = 'TooltipContent'\n\nexport { Tooltip, TooltipTrigger, TooltipContent }\n","/**\n * @description: Alert 提示组件 — 左侧彩色边框 + 图标,支持 info/success/warning/destructive 变体\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { Info, CheckCircle, AlertTriangle, AlertCircle } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst alertVariants = cva(\n 'relative flex gap-3 rounded-md border-l-4 p-4',\n {\n variants: {\n variant: {\n default: 'border-l-primary bg-info-soft text-info-soft-fg',\n info: 'border-l-info bg-info-soft text-info-soft-fg',\n success: 'border-l-success bg-success-soft text-success-soft-fg',\n warning: 'border-l-warning bg-warning-soft text-warning-soft-fg',\n destructive: 'border-l-danger bg-danger-soft text-danger-soft-fg',\n },\n },\n defaultVariants: { variant: 'default' },\n }\n)\n\nconst iconMap = {\n default: AlertCircle,\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n destructive: AlertCircle,\n} as const\n\nconst iconColorMap = {\n default: 'text-info',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-danger',\n} as const\n\nexport interface AlertProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {}\n\nexport type AlertTitleProps = React.HTMLAttributes<HTMLParagraphElement>\nexport type AlertDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>\n\n/**\n * 提示横幅组件\n * @example\n * <Alert variant=\"success\">\n * <AlertTitle>操作成功</AlertTitle>\n * <AlertDescription>文件已成功上传。</AlertDescription>\n * </Alert>\n */\nconst Alert = forwardRef<HTMLDivElement, AlertProps>(\n ({ variant = 'default', className, children, ...props }, ref) => {\n const Icon = iconMap[variant ?? 'default']\n const iconColor = iconColorMap[variant ?? 'default']\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n >\n <Icon size={18} className={cn('mt-0.5 shrink-0', iconColor)} />\n <div className=\"flex flex-col gap-0.5\">{children}</div>\n </div>\n )\n }\n)\n\n/** 提示标题 */\nconst AlertTitle = forwardRef<HTMLParagraphElement, AlertTitleProps>(({ className, ...props }, ref) => {\n return <p ref={ref} className={cn('text-sm font-semibold leading-5', className)} {...props} />\n})\n\n/** 提示描述 */\nconst AlertDescription = forwardRef<HTMLParagraphElement, AlertDescriptionProps>(({ className, ...props }, ref) => {\n return <p ref={ref} className={cn('text-sm leading-5 opacity-90', className)} {...props} />\n})\n\nAlert.displayName = 'Alert'\nAlertTitle.displayName = 'AlertTitle'\nAlertDescription.displayName = 'AlertDescription'\n\nexport { Alert, AlertTitle, AlertDescription }\n","/**\n * @description: Breadcrumb 面包屑导航组件 — 最后一项为当前页无链接,分隔符使用 ChevronRight\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport type BreadcrumbProps = React.HTMLAttributes<HTMLElement>\nexport type BreadcrumbItemProps = React.HTMLAttributes<HTMLLIElement>\nexport interface BreadcrumbLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** 是否为当前页(当前页无链接,样式不同) */\n current?: boolean\n}\nexport type BreadcrumbSeparatorProps = React.HTMLAttributes<HTMLLIElement>\n\n/**\n * 面包屑导航\n * @example\n * <Breadcrumb>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/\">首页</BreadcrumbLink>\n * <BreadcrumbSeparator />\n * </BreadcrumbItem>\n * <BreadcrumbItem>\n * <BreadcrumbLink href=\"/settings\">设置</BreadcrumbLink>\n * <BreadcrumbSeparator />\n * </BreadcrumbItem>\n * <BreadcrumbItem>\n * <BreadcrumbLink current>个人资料</BreadcrumbLink>\n * </BreadcrumbItem>\n * </Breadcrumb>\n */\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(({ className, children, ...props }, ref) => {\n return (\n <nav ref={ref} aria-label=\"面包屑导航\" className={cn(className)} {...props}>\n <ol className=\"flex flex-wrap items-center gap-0 text-sm text-text-secondary\">{children}</ol>\n </nav>\n )\n})\n\n/** 面包屑项,包裹 BreadcrumbLink 和可选的 BreadcrumbSeparator */\nconst BreadcrumbItem = forwardRef<HTMLLIElement, BreadcrumbItemProps>(({ className, ...props }, ref) => {\n return <li ref={ref} className={cn('flex items-center gap-1', className)} {...props} />\n})\n\n/** 面包屑链接,current=true 时渲染为非链接的当前页标识 */\nconst BreadcrumbLink = forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n ({ current = false, className, children, href, ...props }, ref) => {\n if (current) {\n return (\n <span aria-current=\"page\" className={cn('font-medium text-text-primary', className)}>\n {children}\n </span>\n )\n }\n\n return (\n <a\n ref={ref}\n href={href}\n className={cn('transition-colors hover:text-text-primary', className)}\n {...props}\n >\n {children}\n </a>\n )\n }\n)\n\n/** 分隔符,默认使用 ChevronRight 图标 */\nconst BreadcrumbSeparator = forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <li\n ref={ref}\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('text-text-tertiary', className)}\n {...props}\n >\n {children ?? <ChevronRight size={14} />}\n </li>\n )\n }\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\nBreadcrumbItem.displayName = 'BreadcrumbItem'\nBreadcrumbLink.displayName = 'BreadcrumbLink'\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\nexport { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator }\n","/**\r\n * @description: Switch 开关组件 — 受控模式,支持 disabled、label、动画过渡\r\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\r\n * @date: 2026-04-15\r\n */\r\nimport { forwardRef, useId } from 'react'\r\nimport { cn } from '../internal/cn'\r\n\r\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\r\n /** 是否选中 */\r\n checked: boolean\r\n /** 切换回调 */\r\n onCheckedChange: (checked: boolean) => void\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 标签文本 */\r\n label?: string\r\n /** 标签位置 */\r\n labelPlacement?: 'left' | 'right'\r\n}\r\n\r\n/**\r\n * 开关组件\r\n * @example\r\n * <Switch checked={enabled} onCheckedChange={setEnabled} label=\"启用通知\" />\r\n * <Switch checked={dark} onCheckedChange={setDark} label=\"深色模式\" labelPlacement=\"left\" disabled />\r\n */\r\nconst Switch = forwardRef<HTMLButtonElement, SwitchProps>(\r\n (\r\n {\r\n checked,\r\n onCheckedChange,\r\n disabled = false,\r\n label,\r\n labelPlacement = 'right',\r\n className,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const generatedId = useId()\r\n const switchId = id ?? generatedId\r\n\r\n const track = (\r\n <button\r\n ref={ref}\r\n id={switchId}\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={checked}\r\n disabled={disabled}\r\n onClick={() => !disabled && onCheckedChange(!checked)}\n className={cn(\n 'relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border border-transparent p-0.5 shadow-sm transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/35 focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n checked ? 'bg-primary hover:bg-primary-hover' : 'bg-surface-3 hover:bg-border-strong',\n className\n )}\n {...props}\r\n >\r\n <span\r\n className={cn(\n 'pointer-events-none block h-5 w-5 rounded-full bg-primary-fg shadow-md ring-0 transition-transform duration-200',\n checked ? 'translate-x-5' : 'translate-x-0'\n )}\n />\r\n </button>\r\n )\r\n\r\n if (!label) return track\r\n\r\n return (\r\n <label\r\n htmlFor={switchId}\n className={cn(\n 'inline-flex cursor-pointer items-center gap-2.5 text-sm font-medium leading-5 text-text-primary',\n disabled && 'cursor-not-allowed opacity-50'\n )}\n >\r\n {labelPlacement === 'left' && (\r\n <span>{label}</span>\n )}\r\n {track}\r\n {labelPlacement === 'right' && (\r\n <span>{label}</span>\n )}\r\n </label>\r\n )\r\n }\r\n)\r\n\r\nSwitch.displayName = 'Switch'\r\n\r\nexport { Switch }\r\n","/**\n * @description: Textarea 多行文本输入组件 — 支持 label、error、helperText,forwardRef\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef, useId } from 'react'\nimport { cn } from '../internal/cn'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** 标签文本 */\n label?: string\n /** 错误提示文本,有值时边框变红 */\n error?: string\n /** 帮助说明文本 */\n helperText?: string\n /** 默认行数 */\n rows?: number\n}\n\n/**\n * 多行文本输入框\n * @example\n * <Textarea label=\"描述\" placeholder=\"请输入描述...\" rows={5} />\n * <Textarea label=\"备注\" error=\"内容不能为空\" value={text} onChange={handleChange} />\n * <Textarea label=\"简介\" helperText=\"最多 500 字\" rows={4} />\n */\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, label, error, helperText, id, rows = 3, ...props }, ref) => {\n const generatedId = useId()\n const textareaId = id ?? generatedId\n\n return (\n <div className=\"flex flex-col gap-1\">\n {label && (\n <label htmlFor={textareaId} className=\"text-sm font-medium text-text-primary\">\n {label}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n className={cn(\n 'w-full rounded-md border bg-surface-1 px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'resize-y',\n error\n ? 'border-danger focus-visible:ring-danger'\n : 'border-border-strong focus-visible:ring-ring/30',\n className\n )}\n {...props}\n />\n {error && <p className=\"text-xs text-danger\">{error}</p>}\n {!error && helperText && <p className=\"text-xs text-text-secondary\">{helperText}</p>}\n </div>\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","/**\n * @description: Skeleton 骨架屏组件 — 带 shimmer 动画,支持 text/circle/rect 变体\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst skeletonVariants = cva(\n 'animate-pulse bg-surface-3',\n {\n variants: {\n variant: {\n text: 'h-4 w-full rounded',\n circle: 'rounded-full',\n rect: 'rounded-md',\n },\n },\n defaultVariants: { variant: 'rect' },\n }\n)\n\nexport interface SkeletonProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {}\n\n/**\n * 骨架屏占位组件\n * @example\n * <Skeleton variant=\"text\" className=\"w-40\" />\n * <Skeleton variant=\"circle\" className=\"h-10 w-10\" />\n * <Skeleton variant=\"rect\" className=\"h-32 w-full\" />\n */\nconst Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(({ variant, className, ...props }, ref) => {\n return <div ref={ref} className={cn(skeletonVariants({ variant }), className)} aria-hidden=\"true\" {...props} />\n})\n\nSkeleton.displayName = 'Skeleton'\n\nexport { Skeleton }\n","/**\n * @description: Progress 进度条组件 — 支持 0-100 值、颜色、可选百分比文本、动画过渡\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { cn } from '../internal/cn'\n\nexport type ProgressColor = 'primary' | 'success' | 'warning' | 'danger' | 'info'\n\nconst progressColorClasses: Record<ProgressColor, string> = {\n primary: 'bg-primary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 当前进度值 0-100 */\n value: number\n /** 最大值,默认 100 */\n max?: number\n /** 是否显示百分比文本 */\n showLabel?: boolean\n /** 进度条语义颜色 */\n color?: ProgressColor\n}\n\n/**\n * 进度条组件\n * @example\n * <Progress value={60} showLabel />\n * <Progress value={80} color=\"success\" />\n * <Progress value={30} max={200} showLabel />\n */\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(({\n value,\n max = 100,\n showLabel = false,\n color = 'primary',\n className,\n ...props\n}, ref) => {\n const clamped = Math.min(Math.max(value, 0), max)\n const percent = Math.round((clamped / max) * 100)\n\n return (\n <div ref={ref} className={cn('flex items-center gap-3', className)} {...props}>\n <div\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n className=\"h-2 w-full overflow-hidden rounded-full bg-surface-2\"\n >\n <div\n className={cn('h-full rounded-full transition-all duration-500 ease-out', progressColorClasses[color])}\n style={{ width: `${percent}%` }}\n />\n </div>\n {showLabel && (\n <span className=\"shrink-0 text-xs font-medium text-text-secondary tabular-nums w-9 text-right\">\n {percent}%\n </span>\n )}\n </div>\n )\n})\n\nProgress.displayName = 'Progress'\n\nexport { Progress }\n","/**\n * @description: Sheet 侧边抽屉组件 — 从左/右侧滑入,遮罩关闭,ESC 关闭,body 滚动锁定\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { X } from 'lucide-react'\nimport { cn } from '../internal/cn'\nimport { useEscapeKey } from '../hooks/use-escape-key'\nimport { usePortalContainer } from '../internal/use-portal-container'\n\nexport interface SheetProps {\n /** 是否显示 */\n open: boolean\n /** 关闭回调 */\n onClose: () => void\n /** 滑入方向 */\n side?: 'left' | 'right'\n /** 抽屉标题 */\n title?: string\n /** 子内容 */\n children?: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\n/**\n * 侧边抽屉组件\n * @example\n * <Sheet open={isOpen} onClose={() => setIsOpen(false)} title=\"筛选条件\" side=\"right\">\n * <p>抽屉内容</p>\n * </Sheet>\n */\nconst Sheet = forwardRef<HTMLDivElement, SheetProps>(({ open, onClose, side = 'right', title, children, className }, ref) => {\n useEscapeKey(open, onClose)\n const portalContainer = usePortalContainer()\n\n if (!open || !portalContainer) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex\" role=\"dialog\" aria-modal=\"true\">\n {/* 遮罩层 */}\n <div\n className=\"absolute inset-0 bg-overlay transition-opacity\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n {/* 抽屉面板 */}\n <div\n ref={ref}\n className={cn(\n 'relative flex h-full w-80 max-w-full flex-col bg-surface-1 shadow-xl',\n 'transition-transform duration-300 ease-in-out',\n side === 'right' ? 'ml-auto translate-x-0' : 'mr-auto translate-x-0',\n className\n )}\n >\n {/* 标题栏 */}\n {title && (\n <div className=\"flex items-center justify-between border-b border-border-base px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-md p-1 text-text-tertiary hover:bg-surface-3 hover:text-text-secondary transition-colors\"\n aria-label=\"关闭\"\n >\n <X size={18} />\n </button>\n </div>\n )}\n {/* 内容区域 */}\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">{children}</div>\n </div>\n </div>,\n portalContainer\n )\n})\n\nSheet.displayName = 'Sheet'\n\nexport { Sheet }\n","/**\n * @description: EmptyState 空状态占位组件 — 居中显示图标、标题、描述和可选操作\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { type LucideIcon } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Lucide 图标组件 */\n icon?: LucideIcon\n /** 标题文字 */\n title: string\n /** 描述文字 */\n description?: string\n /** 操作区域(如按钮) */\n action?: React.ReactNode\n}\n\n/**\n * 空状态占位组件\n * @example\n * <EmptyState\n * icon={Inbox}\n * title=\"暂无数据\"\n * description=\"当前列表为空,请先添加内容\"\n * action={<Button onClick={handleAdd}>新增</Button>}\n * />\n */\nconst EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n ({ icon: Icon, title, description, action, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-center gap-3 py-16 text-center',\n className\n )}\n {...props}\n >\n {Icon && (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-surface-2\">\n <Icon size={28} className=\"text-text-tertiary\" />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-base font-semibold text-text-primary\">{title}</p>\n {description && <p className=\"max-w-xs text-sm text-text-secondary\">{description}</p>}\n </div>\n {action && <div className=\"mt-1\">{action}</div>}\n </div>\n )\n }\n)\n\nEmptyState.displayName = 'EmptyState'\n\nexport { EmptyState }\n","/**\n * @description: Separator 分割线组件 — 支持水平/垂直方向,纯展示组件\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef } from 'react'\nimport { cn } from '../internal/cn'\n\n/** 分割线方向 */\nexport type SeparatorOrientation = 'horizontal' | 'vertical'\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 方向,默认 horizontal */\n orientation?: SeparatorOrientation\n}\n\n/** 各方向样式映射 */\nconst ORIENTATION_CLASSES: Record<SeparatorOrientation, string> = {\n horizontal: 'h-px w-full bg-border-base',\n vertical: 'w-px h-full bg-border-base',\n}\n\n/**\n * 分割线\n * @example\n * // 水平分割线\n * <Separator />\n *\n * // 垂直分割线(父容器需设定高度)\n * <div className=\"flex h-8 items-center gap-4\">\n * <span>左侧文字</span>\n * <Separator orientation=\"vertical\" />\n * <span>右侧文字</span>\n * </div>\n */\nconst Separator = forwardRef<HTMLDivElement, SeparatorProps>(\n ({ orientation = 'horizontal', className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cn(ORIENTATION_CLASSES[orientation], className)}\n {...props}\n />\n )\n }\n)\n\nSeparator.displayName = 'Separator'\n\nexport { Separator }\n","/**\n * @description: Descriptions 详情描述列表组件 — 以 key-value 对形式展示结构化信息,支持有边框/无边框、多列布局\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef, Children, Fragment, isValidElement } from 'react'\nimport { cn } from '../internal/cn'\n\nexport type DescriptionsSize = 'sm' | 'default' | 'lg'\n\nexport interface DescriptionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** 列数,默认 2 */\n column?: 1 | 2 | 3 | 4\n /** 是否显示边框,类似表格样式 */\n bordered?: boolean\n /** 尺寸 */\n size?: DescriptionsSize\n /** 标题 */\n title?: React.ReactNode\n}\n\nexport interface DescriptionsItemProps {\n /** 标签(必需) */\n label: React.ReactNode\n /** 占几列,默认 1 */\n span?: number\n /** 子内容 */\n children?: React.ReactNode\n /** 额外类名 */\n className?: string\n}\n\nconst SIZE_LABEL_CLASSES: Record<DescriptionsSize, string> = {\n sm: 'px-3 py-2 text-xs',\n default: 'px-3.5 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n}\n\nconst SIZE_VALUE_CLASSES: Record<DescriptionsSize, string> = {\n sm: 'px-3 py-2 text-xs',\n default: 'px-3.5 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base',\n}\n\n/**\n * 详情描述列表条目\n * @example\n * <DescriptionsItem label=\"姓名\">张三</DescriptionsItem>\n * <DescriptionsItem label=\"地址\" span={2}>北京市朝阳区</DescriptionsItem>\n */\nconst DescriptionsItem = forwardRef<HTMLDivElement, DescriptionsItemProps>(\n ({ label, children, className, span: _span, ...props }, ref) => {\n return (\n <div ref={ref} className={className} {...props}>\n <span className=\"text-text-secondary\">{label}</span>\n <span className=\"text-text-primary\">{children}</span>\n </div>\n )\n }\n)\n\nDescriptionsItem.displayName = 'DescriptionsItem'\n\n/**\n * 详情描述列表容器\n * @example\n * <Descriptions column={2} bordered title=\"用户信息\">\n * <DescriptionsItem label=\"姓名\">张三</DescriptionsItem>\n * <DescriptionsItem label=\"年龄\">28</DescriptionsItem>\n * <DescriptionsItem label=\"地址\" span={2}>北京市朝阳区</DescriptionsItem>\n * </Descriptions>\n */\nconst Descriptions = forwardRef<HTMLDivElement, DescriptionsProps>(\n ({ column = 2, bordered = false, size = 'default', title, className, children, ...props }, ref) => {\n const items = Children.toArray(children).filter(\n (child): child is React.ReactElement<DescriptionsItemProps> =>\n isValidElement(child) && (child.type as { displayName?: string }).displayName === 'DescriptionsItem'\n )\n\n if (bordered) {\n // 有边框:类表格布局,label 列 + value 列交替,支持 span\n const rows: Array<Array<{ label: React.ReactNode; value: React.ReactNode; span: number }>> = []\n let currentRow: Array<{ label: React.ReactNode; value: React.ReactNode; span: number }> = []\n let currentColCount = 0\n\n for (const item of items) {\n const span = item.props.span ?? 1\n if (currentColCount + span > column) {\n rows.push(currentRow)\n currentRow = []\n currentColCount = 0\n }\n currentRow.push({ label: item.props.label, value: item.props.children, span })\n currentColCount += span\n }\n if (currentRow.length > 0) rows.push(currentRow)\n const labelColumnWidth = column === 1 ? '34%' : `${Math.max(12, 100 / (column * 2))}%`\n\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {title && (\n <div className=\"mb-3 text-base font-semibold text-text-primary\">{title}</div>\n )}\n <div className=\"overflow-hidden rounded-lg border border-border-base bg-surface-1\">\n <table className=\"w-full table-fixed border-separate border-spacing-0\">\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx}>\n {row.map((cell, cellIdx) => {\n const hasRowDivider = rowIdx < rows.length - 1\n return (\n <Fragment key={`${rowIdx}-${cellIdx}`}>\n <td\n className={cn(\n 'border-r border-border-base bg-surface-2/80 font-medium text-text-secondary',\n hasRowDivider && 'border-b',\n SIZE_LABEL_CLASSES[size]\n )}\n style={{ width: labelColumnWidth }}\n >\n {cell.label}\n </td>\n <td\n className={cn(\n 'break-words font-medium text-text-primary',\n hasRowDivider && 'border-b border-border-base',\n SIZE_VALUE_CLASSES[size]\n )}\n colSpan={cell.span > 1 ? cell.span * 2 - 1 : 1}\n >\n {cell.value}\n </td>\n </Fragment>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n }\n\n // 无边框:网格布局,label 灰字在上/左,content 黑字\n const GRID_COLS: Record<1 | 2 | 3 | 4, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n }\n\n return (\n <div ref={ref} className={cn('w-full', className)} {...props}>\n {title && (\n <div className=\"mb-3 text-base font-semibold text-text-primary\">{title}</div>\n )}\n <div className={cn('grid gap-x-6 gap-y-4', GRID_COLS[column])}>\n {items.map((item, idx) => {\n const span = item.props.span ?? 1\n const colSpanClass =\n span === 2 ? 'col-span-2' :\n span === 3 ? 'col-span-3' :\n span === 4 ? 'col-span-4' : ''\n return (\n <div key={idx} className={cn('flex flex-col gap-0.5', colSpanClass, item.props.className)}>\n <span className={cn('font-medium text-text-secondary', size === 'sm' ? 'text-xs' : size === 'lg' ? 'text-sm' : 'text-xs')}>\n {item.props.label}\n </span>\n <span className={cn('text-text-primary', size === 'sm' ? 'text-sm' : size === 'lg' ? 'text-base' : 'text-sm')}>\n {item.props.children}\n </span>\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n)\n\nDescriptions.displayName = 'Descriptions'\n\nexport { Descriptions, DescriptionsItem }\n","/**\n * @description: Statistic 统计数字卡片组件 — 展示标题 + 大数字 + 单位/前缀/趋势指示\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-17\n */\nimport { forwardRef } from 'react'\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport type StatisticSize = 'sm' | 'default' | 'lg'\nexport type StatisticTrend = 'up' | 'down' | 'flat'\n\nexport interface StatisticProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'prefix'> {\n /** 标题文案 */\n title?: React.ReactNode\n /** 统计数值(数字会自动格式化,字符串原样展示) */\n value: number | string\n /** 小数位数,仅 value 为 number 时生效 */\n precision?: number\n /** 数值前缀,如图标 */\n prefix?: React.ReactNode\n /** 数值后缀,如单位文字 */\n suffix?: React.ReactNode\n /** 趋势方向 */\n trend?: StatisticTrend\n /** 趋势说明文案,如 \"+12%\" */\n change?: string\n /** 尺寸 */\n size?: StatisticSize\n}\n\nconst SIZE_TITLE_CLASSES: Record<StatisticSize, string> = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n}\n\nconst SIZE_VALUE_CLASSES: Record<StatisticSize, string> = {\n sm: 'text-2xl',\n default: 'text-3xl',\n lg: 'text-4xl',\n}\n\nconst SIZE_SUFFIX_CLASSES: Record<StatisticSize, string> = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n}\n\nconst TREND_ICON_COLOR: Record<StatisticTrend, string> = {\n up: 'text-success',\n down: 'text-danger',\n flat: 'text-text-secondary',\n}\n\nconst TREND_TEXT_COLOR: Record<StatisticTrend, string> = {\n up: 'text-success',\n down: 'text-danger',\n flat: 'text-text-secondary',\n}\n\n/** 格式化数字,使用 Intl.NumberFormat */\nfunction formatValue(value: number | string, precision?: number): string {\n if (typeof value === 'string') return value\n return new Intl.NumberFormat('zh-CN', {\n minimumFractionDigits: precision ?? 0,\n maximumFractionDigits: precision ?? 0,\n }).format(value)\n}\n\n/**\n * 统计数字卡片组件\n * @example\n * <Statistic title=\"今日订单\" value={1234} suffix=\"单\" trend=\"up\" change=\"+12%\" />\n * <Statistic title=\"总收入\" value={98765.5} precision={2} prefix={<DollarSign size={20} />} />\n * <Statistic title=\"退单率\" value={3.2} precision={1} suffix=\"%\" trend=\"down\" change=\"-0.5%\" size=\"lg\" />\n */\nconst Statistic = forwardRef<HTMLDivElement, StatisticProps>(\n ({ title, value, precision, prefix, suffix, trend, change, size = 'default', className, ...props }, ref) => {\n const TrendIcon =\n trend === 'up' ? TrendingUp :\n trend === 'down' ? TrendingDown :\n trend === 'flat' ? Minus : null\n\n const iconSize = size === 'sm' ? 14 : size === 'lg' ? 18 : 16\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1', className)} {...props}>\n {title && (\n <span className={cn('font-medium text-text-secondary', SIZE_TITLE_CLASSES[size])}>\n {title}\n </span>\n )}\n <div className=\"flex items-baseline gap-1\">\n {prefix && (\n <span className={cn('text-text-primary', SIZE_SUFFIX_CLASSES[size])}>\n {prefix}\n </span>\n )}\n <span className={cn('font-bold tabular-nums text-text-primary', SIZE_VALUE_CLASSES[size])}>\n {formatValue(value, precision)}\n </span>\n {suffix && (\n <span className={cn('text-text-secondary', SIZE_SUFFIX_CLASSES[size])}>\n {suffix}\n </span>\n )}\n </div>\n {(trend || change) && (\n <div className=\"flex items-center gap-1\">\n {TrendIcon && trend && (\n <TrendIcon size={iconSize} className={TREND_ICON_COLOR[trend]} />\n )}\n {change && trend && (\n <span className={cn('text-xs font-medium', TREND_TEXT_COLOR[trend])}>\n {change}\n </span>\n )}\n </div>\n )}\n </div>\n )\n }\n)\n\nStatistic.displayName = 'Statistic'\n\nexport { Statistic }\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_react","import_react","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","assignRef","import_react","import_react_dom","import_jsx_runtime","assignRef","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_dom","import_jsx_runtime","assignRef","import_react","import_lucide_react","import_class_variance_authority","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_class_variance_authority","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react_dom","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","SIZE_VALUE_CLASSES"]}