@lite-code/aui-react 0.0.1

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 (83) hide show
  1. package/README.md +76 -0
  2. package/dist/alert/index.d.ts +14 -0
  3. package/dist/avatar/index.d.ts +28 -0
  4. package/dist/badge/index.d.ts +18 -0
  5. package/dist/breadcrumb/index.d.ts +18 -0
  6. package/dist/button/index.d.ts +11 -0
  7. package/dist/card/index.d.ts +25 -0
  8. package/dist/carousel/index.d.ts +17 -0
  9. package/dist/cascader/index.d.ts +25 -0
  10. package/dist/checkbox/index.d.ts +33 -0
  11. package/dist/collapse/index.d.ts +19 -0
  12. package/dist/datepicker/index.d.ts +26 -0
  13. package/dist/descriptions/index.d.ts +25 -0
  14. package/dist/drawer/index.d.ts +16 -0
  15. package/dist/dropdown/index.d.ts +29 -0
  16. package/dist/empty/index.d.ts +11 -0
  17. package/dist/form/context.d.ts +3 -0
  18. package/dist/form/index.d.ts +39 -0
  19. package/dist/form/item.d.ts +87 -0
  20. package/dist/form/list.d.ts +8 -0
  21. package/dist/form/store.d.ts +49 -0
  22. package/dist/form/types.d.ts +47 -0
  23. package/dist/grid/index.d.ts +35 -0
  24. package/dist/icon/index.d.ts +9 -0
  25. package/dist/image-compressor/engine.d.ts +55 -0
  26. package/dist/image-compressor/index.d.ts +5 -0
  27. package/dist/image-compressor/types.d.ts +44 -0
  28. package/dist/image-compressor/use-image-compressor.d.ts +21 -0
  29. package/dist/index.cjs.js +2 -0
  30. package/dist/index.cjs.js.map +1 -0
  31. package/dist/index.d.ts +93 -0
  32. package/dist/index.esm.js +2 -0
  33. package/dist/index.esm.js.map +1 -0
  34. package/dist/input/index.d.ts +12 -0
  35. package/dist/input-number/index.d.ts +23 -0
  36. package/dist/layer/index.d.ts +18 -0
  37. package/dist/menu/index.d.ts +24 -0
  38. package/dist/message/index.d.ts +18 -0
  39. package/dist/modal/index.d.ts +42 -0
  40. package/dist/pagination/index.d.ts +19 -0
  41. package/dist/popover/index.d.ts +18 -0
  42. package/dist/popover/util.d.ts +28 -0
  43. package/dist/progress/index.d.ts +17 -0
  44. package/dist/radio/index.d.ts +32 -0
  45. package/dist/rate/index.d.ts +20 -0
  46. package/dist/select/index.d.ts +23 -0
  47. package/dist/slider/index.d.ts +19 -0
  48. package/dist/space/index.d.ts +11 -0
  49. package/dist/spin/index.d.ts +12 -0
  50. package/dist/steps/index.d.ts +25 -0
  51. package/dist/switch/index.d.ts +18 -0
  52. package/dist/table/checkbox.d.ts +14 -0
  53. package/dist/table/empty.d.ts +5 -0
  54. package/dist/table/index.d.ts +2 -0
  55. package/dist/table/row-operation-cell.d.ts +9 -0
  56. package/dist/table/table.d.ts +3 -0
  57. package/dist/table/toolbar.d.ts +12 -0
  58. package/dist/table/types.d.ts +84 -0
  59. package/dist/table/utils.d.ts +19 -0
  60. package/dist/tabs/index.d.ts +22 -0
  61. package/dist/textarea/index.d.ts +10 -0
  62. package/dist/theme/theme-provider.d.ts +21 -0
  63. package/dist/timepicker/index.d.ts +12 -0
  64. package/dist/timepicker/scroll-column.d.ts +13 -0
  65. package/dist/timepicker/types.d.ts +43 -0
  66. package/dist/timepicker/utils.d.ts +13 -0
  67. package/dist/tooltip/index.d.ts +19 -0
  68. package/dist/tree/index.d.ts +29 -0
  69. package/dist/tree-select/index.d.ts +21 -0
  70. package/dist/upload/file-item.d.ts +10 -0
  71. package/dist/upload/index.d.ts +12 -0
  72. package/dist/upload/types.d.ts +58 -0
  73. package/dist/upload/use-upload.d.ts +6 -0
  74. package/dist/upload/utils.d.ts +5 -0
  75. package/dist/upload-manager/index.d.ts +10 -0
  76. package/dist/upload-manager/manager-item.d.ts +10 -0
  77. package/dist/upload-manager/preview-modal.d.ts +10 -0
  78. package/dist/upload-manager/types.d.ts +80 -0
  79. package/dist/upload-manager/use-upload-manager.d.ts +19 -0
  80. package/env.d.ts +2 -0
  81. package/package.json +47 -0
  82. package/rollup.config.js +36 -0
  83. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/grid/index.tsx","../src/form/types.ts","../src/form/store.ts","../src/form/context.ts","../src/icon/index.tsx","../src/input/index.tsx","../src/input-number/index.tsx","../src/textarea/index.tsx","../src/layer/index.tsx","../src/select/index.tsx","../src/switch/index.tsx","../src/checkbox/index.tsx","../src/radio/index.tsx","../src/slider/index.tsx","../src/rate/index.tsx","../src/datepicker/index.tsx","../src/timepicker/scroll-column.tsx","../src/timepicker/utils.ts","../src/timepicker/index.tsx","../src/progress/index.tsx","../src/upload/utils.ts","../src/upload/file-item.tsx","../src/upload/index.tsx","../src/upload/use-upload.ts","../src/tree/index.tsx","../src/tree-select/index.tsx","../src/cascader/index.tsx","../src/pagination/index.tsx","../src/table/utils.ts","../src/table/checkbox.tsx","../src/table/empty.tsx","../src/dropdown/index.tsx","../src/button/index.tsx","../src/modal/index.tsx","../src/table/row-operation-cell.tsx","../src/table/toolbar.tsx","../src/table/table.tsx","../src/form/list.tsx","../src/form/item.tsx","../src/form/index.tsx","../src/breadcrumb/index.tsx","../src/alert/index.tsx","../src/popover/util.ts","../src/popover/index.tsx","../src/avatar/index.tsx","../src/badge/index.tsx","../src/carousel/index.tsx","../src/collapse/index.tsx","../src/empty/index.tsx","../src/descriptions/index.tsx","../src/message/index.tsx","../src/drawer/index.tsx","../src/menu/index.tsx","../src/card/index.tsx","../src/space/index.tsx","../src/steps/index.tsx","../src/tooltip/index.tsx","../src/tabs/index.tsx","../src/spin/index.tsx","../src/theme/theme-provider.tsx","../src/image-compressor/engine.ts","../src/image-compressor/use-image-compressor.ts","../src/image-compressor/index.tsx","../src/upload-manager/use-upload-manager.ts","../src/upload-manager/manager-item.tsx","../src/upload-manager/preview-modal.tsx","../src/upload-manager/index.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { createContext, useContext, useEffect, useState } from \"react\";\nimport \"./grid.css\";\n\ntype Breakpoint = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\";\n\nconst BREAKPOINTS: Record<Breakpoint, number> = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600,\n};\n\ntype ColSize = number | { span?: number; offset?: number; order?: number };\n\nexport interface RowProps {\n gutter?: number | [number, number] | Partial<Record<Breakpoint, number>>;\n justify?:\n | \"start\"\n | \"end\"\n | \"center\"\n | \"space-around\"\n | \"space-between\"\n | \"space-evenly\";\n align?: \"top\" | \"middle\" | \"bottom\" | \"stretch\";\n wrap?: boolean;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface ColProps {\n span?: number;\n offset?: number;\n order?: number;\n flex?: string | number;\n xs?: ColSize;\n sm?: ColSize;\n md?: ColSize;\n lg?: ColSize;\n xl?: ColSize;\n xxl?: ColSize;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst GutterContext = createContext<[number, number]>([0, 0]);\n\ntype ResizeListener = () => void;\nconst listeners: Set<ResizeListener> = new Set();\nlet bound = false;\n\nfunction subscribe(fn: ResizeListener) {\n if (!bound && typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", () => listeners.forEach((l) => l()));\n bound = true;\n }\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n}\n\nfunction getCurrentBreakpoint(): Breakpoint {\n if (typeof window === \"undefined\") return \"md\";\n const w = window.innerWidth;\n if (w >= BREAKPOINTS.xxl) return \"xxl\";\n if (w >= BREAKPOINTS.xl) return \"xl\";\n if (w >= BREAKPOINTS.lg) return \"lg\";\n if (w >= BREAKPOINTS.md) return \"md\";\n if (w >= BREAKPOINTS.sm) return \"sm\";\n return \"xs\";\n}\n\nfunction useBreakpoint(): Breakpoint {\n const [bp, setBp] = useState<Breakpoint>(getCurrentBreakpoint);\n useEffect(() => subscribe(() => setBp(getCurrentBreakpoint())), []);\n return bp;\n}\n\nfunction resolveGutter(\n gutter: RowProps[\"gutter\"],\n bp: Breakpoint\n): [number, number] {\n if (!gutter) return [0, 0];\n if (typeof gutter === \"number\") return [gutter, gutter];\n if (Array.isArray(gutter)) return [gutter[0] ?? 0, gutter[1] ?? 0];\n const bpOrder: Breakpoint[] = [\"xxl\", \"xl\", \"lg\", \"md\", \"sm\", \"xs\"];\n const idx = bpOrder.indexOf(bp);\n for (let i = idx; i < bpOrder.length; i++) {\n const val = (gutter as Record<string, number>)[bpOrder[i]];\n if (val !== undefined) return [val, val];\n }\n return [0, 0];\n}\n\nconst JUSTIFY_MAP: Record<NonNullable<RowProps[\"justify\"]>, string> = {\n start: \"flex-start\",\n end: \"flex-end\",\n center: \"center\",\n \"space-around\": \"space-around\",\n \"space-between\": \"space-between\",\n \"space-evenly\": \"space-evenly\",\n};\n\nconst ALIGN_MAP: Record<NonNullable<RowProps[\"align\"]>, string> = {\n top: \"flex-start\",\n middle: \"center\",\n bottom: \"flex-end\",\n stretch: \"stretch\",\n};\n\nexport function Row({\n gutter,\n justify,\n align,\n wrap = true,\n children,\n className,\n style,\n}: RowProps) {\n const bp = useBreakpoint();\n const [hGutter, vGutter] = resolveGutter(gutter, bp);\n\n const rowStyle: React.CSSProperties = {\n marginLeft: hGutter ? -hGutter / 2 : undefined,\n marginRight: hGutter ? -hGutter / 2 : undefined,\n rowGap: vGutter ? vGutter : undefined,\n justifyContent: justify ? JUSTIFY_MAP[justify] : undefined,\n alignItems: align ? ALIGN_MAP[align] : undefined,\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n ...style,\n };\n\n const classes = [\"aui-row\", className].filter(Boolean).join(\" \");\n\n return (\n <GutterContext.Provider value={[hGutter, vGutter]}>\n <div className={classes} style={rowStyle}>\n {children}\n </div>\n </GutterContext.Provider>\n );\n}\n\nfunction resolveColSize(size: ColSize | undefined): {\n span?: number;\n offset?: number;\n order?: number;\n} {\n if (size === undefined) return {};\n if (typeof size === \"number\") return { span: size };\n return size;\n}\n\nconst BP_ORDER: Breakpoint[] = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"xxl\"];\n\nexport function Col({\n span,\n offset,\n order,\n flex,\n xs,\n sm,\n md,\n lg,\n xl,\n xxl,\n children,\n className,\n style,\n}: ColProps) {\n const [hGutter] = useContext(GutterContext);\n const bp = useBreakpoint();\n\n const bpProps: Partial<Record<Breakpoint, ColSize>> = {\n xs,\n sm,\n md,\n lg,\n xl,\n xxl,\n };\n\n let resolvedSpan = span;\n let resolvedOffset = offset;\n let resolvedOrder = order;\n\n const bpIdx = BP_ORDER.indexOf(bp);\n for (let i = bpIdx; i >= 0; i--) {\n const val = bpProps[BP_ORDER[i]];\n if (val !== undefined) {\n const s = resolveColSize(val);\n if (resolvedSpan === undefined && s.span !== undefined)\n resolvedSpan = s.span;\n if (resolvedOffset === undefined && s.offset !== undefined)\n resolvedOffset = s.offset;\n if (resolvedOrder === undefined && s.order !== undefined)\n resolvedOrder = s.order;\n break;\n }\n }\n\n const colStyle: React.CSSProperties = {\n paddingLeft: hGutter ? hGutter / 2 : undefined,\n paddingRight: hGutter ? hGutter / 2 : undefined,\n width:\n resolvedSpan !== undefined ? `${(resolvedSpan / 24) * 100}%` : undefined,\n marginLeft: resolvedOffset ? `${(resolvedOffset / 24) * 100}%` : undefined,\n order: resolvedOrder,\n flex:\n flex !== undefined\n ? typeof flex === \"number\"\n ? `${flex} ${flex} auto`\n : flex\n : undefined,\n ...style,\n };\n\n const classes = [\"aui-col\", className].filter(Boolean).join(\" \");\n\n return (\n <div className={classes} style={colStyle}>\n {children}\n </div>\n );\n}\n","import type React from \"react\";\n\nexport type NamePath = string | (string | number)[];\n\nexport interface Rule {\n required?: boolean;\n message?: string;\n min?: number;\n max?: number;\n len?: number;\n pattern?: RegExp;\n whitespace?: boolean;\n type?: \"string\" | \"number\" | \"email\" | \"url\" | \"boolean\" | \"array\" | \"object\";\n validator?: (rule: Rule, value: any) => Promise<void> | void;\n enum?: any[];\n}\n\nexport type RuleItem = Rule | ((form: FormInstance) => Rule);\n\nexport interface FieldError {\n name: NamePath;\n errors: string[];\n}\n\nexport interface FormInstance<Values = any> {\n getFieldValue(name: NamePath): any;\n getFieldsValue(nameList?: NamePath[]): Values;\n setFieldValue(name: NamePath, value: any): void;\n setFieldsValue(values: Partial<Values>): void;\n resetFields(fields?: NamePath[]): void;\n validateFields(nameList?: NamePath[]): Promise<Values>;\n getFieldError(name: NamePath): string[];\n getFieldsError(nameList?: NamePath[]): FieldError[];\n isFieldTouched(name: NamePath): boolean;\n submit(): void;\n}\n\nexport interface ColConfig {\n span?: number;\n}\n\nexport interface FormContextValue {\n store: any;\n layout: \"horizontal\" | \"vertical\" | \"inline\";\n labelCol: ColConfig;\n wrapperCol: ColConfig;\n colon: boolean;\n requiredMark: boolean;\n validateTrigger: string[];\n name?: string;\n column?: number;\n widget?: Record<string, React.ComponentType<any>>;\n}\n\nexport function normalizeName(name: NamePath): string {\n if (Array.isArray(name)) return name.join(\".\");\n return String(name);\n}\n","import type {\n Rule,\n RuleItem,\n FieldError,\n FormInstance,\n NamePath,\n} from \"./types\";\nimport { normalizeName } from \"./types\";\n\nconst storeRegistry = new WeakMap<object, FormStore<any>>();\n\nexport function getFormStore<V>(\n instance: FormInstance<V>\n): FormStore<V> | undefined {\n return storeRegistry.get(instance as object) as FormStore<V> | undefined;\n}\n\nconst EMAIL_RE = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\nconst URL_RE = /^https?:\\/\\/.+/;\n\nasync function runRule(rule: Rule, value: any): Promise<string | null> {\n try {\n if (rule.validator) {\n await rule.validator(rule, value);\n return null;\n }\n const isEmpty =\n value === undefined ||\n value === null ||\n value === \"\" ||\n (Array.isArray(value) && value.length === 0);\n\n if (rule.required && isEmpty) return rule.message ?? \"此项为必填项\";\n if (isEmpty) return null;\n\n const str = typeof value === \"string\" ? value : String(value);\n\n if (rule.whitespace && str.trim() === \"\")\n return rule.message ?? \"不能为纯空格\";\n if (rule.type === \"email\" && !EMAIL_RE.test(str))\n return rule.message ?? \"请输入有效的邮箱地址\";\n if (rule.type === \"url\" && !URL_RE.test(str))\n return rule.message ?? \"请输入有效的 URL\";\n if (rule.len !== undefined) {\n const len = typeof value === \"number\" ? value : str.length;\n if (len !== rule.len) return rule.message ?? `长度须为 ${rule.len} 位`;\n }\n if (rule.min !== undefined) {\n const n = typeof value === \"number\" ? value : str.length;\n if (n < rule.min)\n return (\n rule.message ??\n (typeof value === \"number\"\n ? `不得小于 ${rule.min}`\n : `至少 ${rule.min} 个字符`)\n );\n }\n if (rule.max !== undefined) {\n const n = typeof value === \"number\" ? value : str.length;\n if (n > rule.max)\n return (\n rule.message ??\n (typeof value === \"number\"\n ? `不得大于 ${rule.max}`\n : `至多 ${rule.max} 个字符`)\n );\n }\n if (rule.pattern && !rule.pattern.test(str))\n return rule.message ?? \"格式不正确\";\n if (rule.enum && !rule.enum.includes(value))\n return rule.message ?? `须为以下值之一:${rule.enum.join(\"、\")}`;\n return null;\n } catch (err: any) {\n return typeof err === \"string\" ? err : err?.message ?? \"验证失败\";\n }\n}\n\nasync function validateRules(value: any, rules: Rule[]): Promise<string[]> {\n const errors: string[] = [];\n for (const rule of rules) {\n const err = await runRule(rule, value);\n if (err !== null) errors.push(err);\n }\n return errors;\n}\n\ntype FieldMeta = { rules: RuleItem[]; touched: boolean };\ntype Listener = () => void;\n\nexport class FormStore<Values = Record<string, any>> {\n private values: Record<string, any> = {};\n private publicInstance: FormInstance<Values> | null = null;\n private initialValues: Record<string, any> = {};\n private errors: Record<string, string[]> = {};\n private meta: Record<string, FieldMeta> = {};\n private fieldListeners: Map<string, Set<Listener>> = new Map();\n private listPrefixes: Set<string> = new Set();\n private callbacks: {\n onFinish?: (values: Values) => void;\n onFinishFailed?: (info: {\n values: Values;\n errorFields: FieldError[];\n }) => void;\n onValuesChange?: (changed: Partial<Values>, all: Values) => void;\n } = {};\n\n setCallbacks(cbs: typeof this.callbacks) {\n this.callbacks = cbs;\n }\n\n setInitialValues(vals: Partial<Values>, init: boolean) {\n this.initialValues = { ...(vals as any) };\n if (init) this.values = { ...(vals as any) };\n }\n\n private notify(name: string) {\n this.fieldListeners.get(name)?.forEach((fn) => fn());\n }\n\n registerField(name: string, rules: RuleItem[], initialValue?: any) {\n if (!this.meta[name]) {\n this.meta[name] = { rules, touched: false };\n if (this.values[name] === undefined) {\n if (initialValue !== undefined) this.values[name] = initialValue;\n else if (this.initialValues[name] !== undefined)\n this.values[name] = this.initialValues[name];\n }\n } else {\n this.meta[name].rules = rules;\n }\n }\n\n unregisterField(name: string) {\n delete this.meta[name];\n }\n\n subscribeField(name: string, listener: Listener) {\n if (!this.fieldListeners.has(name))\n this.fieldListeners.set(name, new Set());\n this.fieldListeners.get(name)!.add(listener);\n return () => this.fieldListeners.get(name)?.delete(listener);\n }\n\n getFieldValue(name: string): any {\n return this.values[name];\n }\n\n registerList(prefix: string) {\n this.listPrefixes.add(prefix);\n }\n\n unregisterList(prefix: string) {\n this.listPrefixes.delete(prefix);\n }\n\n private unflatten(flat: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(flat)) {\n const listPrefix = [...this.listPrefixes].find((p) =>\n key.startsWith(p + \".\")\n );\n if (listPrefix) {\n const rest = key.slice(listPrefix.length + 1);\n const dot = rest.indexOf(\".\");\n if (dot !== -1) {\n const idx = parseInt(rest.slice(0, dot), 10);\n const sub = rest.slice(dot + 1);\n if (!isNaN(idx)) {\n if (!result[listPrefix]) result[listPrefix] = [];\n if (!result[listPrefix][idx]) result[listPrefix][idx] = {};\n result[listPrefix][idx][sub] = value;\n continue;\n }\n }\n }\n result[key] = value;\n }\n return result;\n }\n\n getFieldsValue(names?: string[]): Values {\n const flat = names\n ? names.reduce(\n (acc, n) => ({ ...acc, [n]: this.values[n] }),\n {} as Record<string, any>\n )\n : { ...this.values };\n return this.unflatten(flat) as Values;\n }\n\n setFieldValue(name: string, value: any) {\n const prev = this.values[name];\n this.values[name] = value;\n if (this.meta[name]) this.meta[name].touched = true;\n this.notify(name);\n if (prev !== value) {\n this.callbacks.onValuesChange?.(\n { [name]: value } as Partial<Values>,\n this.getFieldsValue()\n );\n }\n }\n\n setFieldsValue(vals: Partial<Values>) {\n const changed: Partial<Values> = {};\n Object.entries(vals as Record<string, any>).forEach(([k, v]) => {\n const prev = this.values[k];\n this.values[k] = v;\n this.notify(k);\n if (prev !== v) (changed as any)[k] = v;\n });\n if (Object.keys(changed).length > 0) {\n this.callbacks.onValuesChange?.(changed, this.getFieldsValue());\n }\n }\n\n resetFields(names?: string[]) {\n const keys = names ?? Object.keys(this.meta);\n keys.forEach((name) => {\n this.values[name] = this.initialValues[name];\n this.errors[name] = [];\n if (this.meta[name]) this.meta[name].touched = false;\n this.notify(name);\n });\n }\n\n getFieldError(name: string): string[] {\n return this.errors[name] ?? [];\n }\n\n getFieldsError(names?: string[]): FieldError[] {\n const keys = names ?? Object.keys(this.meta);\n return keys.map((name) => ({ name, errors: this.errors[name] ?? [] }));\n }\n\n isFieldTouched(name: string): boolean {\n return this.meta[name]?.touched ?? false;\n }\n\n async validateField(name: string): Promise<string[]> {\n const m = this.meta[name];\n if (!m) return [];\n const publicInstance = this.getPublicInstance();\n const resolvedRules: Rule[] = m.rules.map((r) =>\n typeof r === \"function\" ? r(publicInstance) : r\n );\n const errs = await validateRules(this.values[name], resolvedRules);\n this.errors[name] = errs;\n this.notify(name);\n return errs;\n }\n\n async validateFields(names?: string[]): Promise<Values> {\n const keys = names ?? Object.keys(this.meta);\n await Promise.all(keys.map((n) => this.validateField(n)));\n const errorFields = this.getFieldsError(keys).filter(\n (f) => f.errors.length > 0\n );\n if (errorFields.length > 0)\n throw { values: this.getFieldsValue(), errorFields };\n return this.getFieldsValue();\n }\n\n submit() {\n this.validateFields()\n .then((values) => this.callbacks.onFinish?.(values))\n .catch((info) => this.callbacks.onFinishFailed?.(info));\n }\n\n listRemove(prefix: string, index: number) {\n const prefixDot = `${prefix}.`;\n const allKeys = new Set([\n ...Object.keys(this.meta),\n ...Object.keys(this.values),\n ]);\n\n const byIndex: Record<number, Set<string>> = {};\n for (const key of allKeys) {\n if (!key.startsWith(prefixDot)) continue;\n const rest = key.slice(prefixDot.length);\n const dot = rest.indexOf(\".\");\n if (dot === -1) continue;\n const idx = parseInt(rest.slice(0, dot), 10);\n if (isNaN(idx) || idx < index) continue;\n const sub = rest.slice(dot + 1);\n (byIndex[idx] ??= new Set()).add(sub);\n }\n\n const indices = Object.keys(byIndex)\n .map(Number)\n .sort((a, b) => a - b);\n if (!indices.length) return;\n const maxIndex = indices[indices.length - 1];\n\n for (let i = index; i < maxIndex; i++) {\n for (const sub of byIndex[i + 1] ?? new Set()) {\n const from = `${prefix}.${i + 1}.${sub}`;\n const to = `${prefix}.${i}.${sub}`;\n this.values[to] = this.values[from];\n this.errors[to] = [...(this.errors[from] ?? [])];\n }\n }\n\n for (const sub of byIndex[maxIndex] ?? new Set()) {\n const key = `${prefix}.${maxIndex}.${sub}`;\n delete this.values[key];\n delete this.errors[key];\n delete this.meta[key];\n }\n }\n\n listAdd(prefix: string, index: number, initialValue: Record<string, any>) {\n for (const [sub, val] of Object.entries(initialValue)) {\n this.values[`${prefix}.${index}.${sub}`] = val;\n }\n }\n\n getPublicInstance(): FormInstance<Values> {\n if (this.publicInstance) return this.publicInstance;\n const instance: FormInstance<Values> = {\n getFieldValue: (name: NamePath) =>\n this.getFieldValue(normalizeName(name)),\n getFieldsValue: (nameList?: NamePath[]) =>\n this.getFieldsValue(nameList?.map(normalizeName)),\n setFieldValue: (name: NamePath, value: any) =>\n this.setFieldValue(normalizeName(name), value),\n setFieldsValue: (vals: Partial<Values>) => this.setFieldsValue(vals),\n resetFields: (fields?: NamePath[]) =>\n this.resetFields(fields?.map(normalizeName)),\n validateFields: (nameList?: NamePath[]) =>\n this.validateFields(nameList?.map(normalizeName)),\n getFieldError: (name: NamePath) =>\n this.getFieldError(normalizeName(name)),\n getFieldsError: (nameList?: NamePath[]) =>\n this.getFieldsError(nameList?.map(normalizeName)),\n isFieldTouched: (name: NamePath) =>\n this.isFieldTouched(normalizeName(name)),\n submit: () => this.submit(),\n };\n storeRegistry.set(instance, this);\n this.publicInstance = instance;\n return instance;\n }\n\n getInternalHooks() {\n return {\n registerField: this.registerField.bind(this),\n unregisterField: this.unregisterField.bind(this),\n subscribeField: this.subscribeField.bind(this),\n setCallbacks: this.setCallbacks.bind(this),\n setInitialValues: this.setInitialValues.bind(this),\n validateField: this.validateField.bind(this),\n listRemove: this.listRemove.bind(this),\n listAdd: this.listAdd.bind(this),\n registerList: this.registerList.bind(this),\n unregisterList: this.unregisterList.bind(this),\n };\n }\n}\n","import { createContext, useContext } from \"react\";\nimport type { FormContextValue } from \"./types\";\nimport { FormStore } from \"./store\";\n\nconst defaultStore = new FormStore();\n\nexport const FormContext = createContext<FormContextValue>({\n store: defaultStore,\n layout: \"horizontal\",\n labelCol: { span: 6 },\n wrapperCol: { span: 18 },\n colon: true,\n requiredMark: true,\n validateTrigger: [\"onChange\"],\n});\n\nexport function useFormContext() {\n return useContext(FormContext);\n}\n","import React from \"react\";\n\nexport type IconName =\n | \"x-circle\"\n | \"eye\"\n | \"eye-off\"\n | \"check\"\n | \"chevron-down\"\n | \"chevron-right\"\n | \"chevron-left\"\n | \"chevron-up\"\n | \"x\"\n | \"calendar\"\n | \"warn\"\n | \"spin\"\n | \"circle-check\"\n | \"circle-x\"\n | \"circle-warn\"\n | \"circle-info\"\n | \"circle-loading\"\n | \"empty-data\"\n | \"spinner\"\n | \"plus\"\n | \"refresh\"\n | \"upload\"\n | \"cloud-upload\"\n | \"file\"\n | \"file-image\"\n | \"trash\"\n | \"clock\";\n\nexport interface IconProps {\n name: IconName;\n size?: number | string;\n className?: string;\n style?: React.CSSProperties;\n}\n\ntype SvgAttrs = {\n size?: number | string;\n className?: string;\n style?: React.CSSProperties;\n};\n\nconst iconMap: Record<IconName, (attrs: SvgAttrs) => React.ReactElement> = {\n \"x-circle\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n className={className}\n style={{ display: \"block\", ...style }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--aui-text-3,#8b8b8f)\" />\n <path\n d=\"M15.5 8.5l-7 7M8.5 8.5l7 7\"\n stroke=\"var(--aui-bg,#fff)\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n eye: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ),\n \"eye-off\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ),\n check: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ),\n \"chevron-down\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n ),\n \"chevron-right\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n ),\n \"chevron-left\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n ),\n \"chevron-up\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n ),\n x: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n ),\n calendar: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n ),\n warn: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n style={style}\n >\n <rect x=\"10.5\" y=\"6\" width=\"3\" height=\"8\" rx=\"1.5\" />\n <circle cx=\"12\" cy=\"18\" r=\"1.8\" />\n </svg>\n ),\n spin: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={`aui-spin-icon${className ? ` ${className}` : \"\"}`}\n style={style}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 62.8\"\n />\n </svg>\n ),\n \"circle-check\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" />\n <polyline\n points=\"7 12.5 10.5 16 17 9\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n \"circle-x\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" />\n <line\n x1=\"8.5\"\n y1=\"8.5\"\n x2=\"15.5\"\n y2=\"15.5\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"15.5\"\n y1=\"8.5\"\n x2=\"8.5\"\n y2=\"15.5\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n \"circle-warn\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" />\n <line\n x1=\"12\"\n y1=\"7.5\"\n x2=\"12\"\n y2=\"13.5\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"12\" cy=\"16.5\" r=\"1.25\" fill=\"white\" />\n </svg>\n ),\n \"circle-info\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7.5\" r=\"1.25\" fill=\"white\" />\n <line\n x1=\"12\"\n y1=\"11\"\n x2=\"12\"\n y2=\"16.5\"\n stroke=\"white\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n \"circle-loading\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M12 2a10 10 0 0 1 10 10\" />\n </svg>\n ),\n spinner: ({ size, className, style }) => (\n <svg\n width={size ?? 24}\n height={size ?? 24}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"var(--aui-border,#e2e2e3)\"\n strokeWidth=\"3\"\n />\n <path\n d=\"M12 2 a10 10 0 0 1 10 10\"\n stroke=\"var(--aui-accent,#6366f1)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n ),\n plus: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n className={className}\n style={style}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n ),\n refresh: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </svg>\n ),\n upload: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n ),\n \"cloud-upload\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"16 16 12 12 8 16\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\" />\n <path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\" />\n </svg>\n ),\n file: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\" />\n <polyline points=\"13 2 13 9 20 9\" />\n </svg>\n ),\n \"file-image\": ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <path d=\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\" />\n <polyline points=\"13 2 13 9 20 9\" />\n <circle cx=\"10\" cy=\"14\" r=\"1.5\" />\n <polyline points=\"8 18 11 15 13 17 15 15 18 18\" />\n </svg>\n ),\n trash: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n <path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\" />\n </svg>\n ),\n clock: ({ size, className, style }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n style={style}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n ),\n \"empty-data\": ({ className, style }) => (\n <svg\n width=\"72\"\n height=\"56\"\n viewBox=\"0 0 72 56\"\n fill=\"none\"\n className={className}\n style={style}\n >\n <rect\n x=\"6\"\n y=\"22\"\n width=\"60\"\n height=\"30\"\n rx=\"4\"\n fill=\"var(--aui-bg-mute,#e8eaf0)\"\n />\n <path d=\"M6 22 L16 8 L56 8 L66 22Z\" fill=\"var(--aui-bg-soft,#d8dce8)\" />\n <rect\n x=\"22\"\n y=\"34\"\n width=\"28\"\n height=\"6\"\n rx=\"3\"\n fill=\"var(--aui-border,#c0c4d4)\"\n />\n <circle cx=\"56\" cy=\"10\" r=\"7\" fill=\"var(--aui-bg-soft,#d8dce8)\" />\n <circle cx=\"54\" cy=\"9\" r=\"1.2\" fill=\"var(--aui-text-3,#9ba8c9)\" />\n <circle cx=\"58\" cy=\"9\" r=\"1.2\" fill=\"var(--aui-text-3,#9ba8c9)\" />\n <path\n d=\"M54 12 q2 2 4 0\"\n stroke=\"var(--aui-text-3,#9ba8c9)\"\n strokeWidth=\"1.2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n <path d=\"M52 17 l-2 5 l7 -3\" fill=\"var(--aui-bg-soft,#d8dce8)\" />\n </svg>\n ),\n};\n\nexport function Icon({ name, size, className, style }: IconProps) {\n const render = iconMap[name];\n if (!render) return null;\n return render({ size, className, style });\n}\n","import React, { useState, useCallback, useEffect, useRef } from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./input.css\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"prefix\"> {\n size?: InputSize;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n trim?: boolean;\n clearable?: boolean;\n showCount?: boolean;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = \"md\",\n prefix,\n suffix,\n disabled,\n className,\n trim,\n clearable,\n showCount,\n type,\n value,\n defaultValue,\n onChange,\n onBlur,\n maxLength,\n ...rest\n },\n ref\n ) => {\n const [localValue, setLocalValue] = useState(\n (defaultValue ?? \"\") as string\n );\n const mounted = useRef(false);\n useEffect(() => {\n if (mounted.current) setLocalValue((value ?? \"\") as string);\n else mounted.current = true;\n }, [value]);\n const [showPass, setShowPass] = useState(false);\n\n const displayValue = (value ?? localValue) as string;\n const hasValue = Boolean(displayValue);\n const isPassword = type === \"password\";\n const inputType = isPassword ? (showPass ? \"text\" : \"password\") : type;\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n onChange?.(e);\n },\n [onChange]\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n if (trim) {\n const trimmed = e.target.value.trim();\n if (trimmed !== e.target.value) {\n setLocalValue(trimmed);\n onChange?.({\n ...e,\n target: { ...e.target, value: trimmed },\n currentTarget: { ...e.currentTarget, value: trimmed },\n } as React.ChangeEvent<HTMLInputElement>);\n }\n }\n onBlur?.(e);\n },\n [trim, onChange, onBlur]\n );\n\n const handleClear = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setLocalValue(\"\");\n onChange?.({\n target: { value: \"\" },\n } as React.ChangeEvent<HTMLInputElement>);\n };\n\n const showClear = clearable && hasValue && !disabled;\n const showEye = isPassword;\n const hasActions = showClear || showEye;\n const charCount = displayValue.length;\n\n const wrapperCls = [\n \"aui-input-wrapper\",\n `aui-input-${size}`,\n disabled ? \"aui-input-disabled\" : \"\",\n prefix ? \"aui-input-has-prefix\" : \"\",\n suffix || hasActions || showCount ? \"aui-input-has-suffix\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls}>\n {prefix && (\n <span className=\"aui-input-affix aui-input-prefix\">{prefix}</span>\n )}\n <input\n ref={ref}\n className=\"aui-input-native\"\n type={inputType}\n disabled={disabled}\n maxLength={maxLength}\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n {...rest}\n />\n {showCount && (\n <span className=\"aui-input-count\">\n {maxLength ? `${charCount} / ${maxLength}` : charCount}\n </span>\n )}\n {hasActions && (\n <span className=\"aui-input-actions\">\n {showClear && (\n <span\n className=\"aui-input-clear\"\n onMouseDown={handleClear}\n title=\"清空\"\n >\n <Icon name=\"x-circle\" size={14} />\n </span>\n )}\n {showEye && (\n <span\n className=\"aui-input-eye\"\n onMouseDown={(e) => {\n e.preventDefault();\n setShowPass((v) => !v);\n }}\n title={showPass ? \"隐藏密码\" : \"显示密码\"}\n >\n {showPass ? (\n <Icon name=\"eye-off\" size={16} />\n ) : (\n <Icon name=\"eye\" size={16} />\n )}\n </span>\n )}\n </span>\n )}\n {suffix && (\n <span className=\"aui-input-affix aui-input-suffix\">{suffix}</span>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n","import React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { Icon } from \"../icon\";\nimport type { InputSize } from \"../input\";\nimport \"./input-number.css\";\n\nexport interface InputNumberProps {\n value?: number | null;\n defaultValue?: number | null;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n disabled?: boolean;\n size?: InputSize;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n placeholder?: string;\n className?: string;\n style?: React.CSSProperties;\n onChange?: (value: number | null) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n formatter?: (value: number | null) => string;\n parser?: (displayValue: string) => number | null;\n}\n\nfunction clamp(val: number, min?: number, max?: number): number {\n if (min !== undefined && val < min) return min;\n if (max !== undefined && val > max) return max;\n return val;\n}\n\nfunction applyPrecision(val: number, precision?: number): number {\n if (precision === undefined) return val;\n return parseFloat(val.toFixed(precision));\n}\n\nfunction numToStr(\n val: number | null | undefined,\n precision?: number,\n formatter?: (v: number | null) => string\n): string {\n if (val === null || val === undefined) return \"\";\n if (formatter) return formatter(val);\n if (precision !== undefined) return val.toFixed(precision);\n return String(val);\n}\n\nexport const InputNumber = React.forwardRef<HTMLInputElement, InputNumberProps>(\n (\n {\n value,\n defaultValue,\n min,\n max,\n step = 1,\n precision,\n disabled,\n size = \"md\",\n prefix,\n suffix,\n placeholder,\n className,\n style,\n onChange,\n onBlur,\n formatter,\n parser,\n },\n ref\n ) => {\n const [localValue, setLocalValue] = useState<number | null>(\n value !== undefined ? value ?? null : defaultValue ?? null\n );\n const numValue = value !== undefined ? value ?? null : localValue;\n\n const [inputStr, setInputStr] = useState<string>(\n numToStr(numValue, precision, formatter)\n );\n const [focused, setFocused] = useState(false);\n const stepTimerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n const next = value !== undefined ? value ?? null : null;\n setLocalValue(next);\n if (!focused) setInputStr(numToStr(next, precision, formatter));\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const parseInput = useCallback(\n (str: string): number | null => {\n if (parser) return parser(str);\n const s = str.trim();\n if (s === \"\" || s === \"-\") return null;\n const n = parseFloat(s);\n return isNaN(n) ? null : n;\n },\n [parser]\n );\n\n const commit = useCallback(\n (raw: number | null) => {\n const next =\n raw !== null ? applyPrecision(clamp(raw, min, max), precision) : null;\n setLocalValue(next);\n onChange?.(next);\n const str = numToStr(next, precision, formatter);\n setInputStr(str);\n },\n [min, max, precision, formatter, onChange]\n );\n\n // Use refs so setInterval always calls the latest version\n const latestRef = useRef({ inputStr, numValue, step, parseInput, commit });\n latestRef.current = { inputStr, numValue, step, parseInput, commit };\n\n const doStep = useCallback((dir: 1 | -1) => {\n const {\n inputStr: str,\n numValue: num,\n step: s,\n parseInput: parse,\n commit: c,\n } = latestRef.current;\n const current = parse(str) ?? num ?? 0;\n c(current + dir * s);\n }, []);\n\n const startRepeat = useCallback(\n (dir: 1 | -1) => {\n doStep(dir);\n stepTimerRef.current = setInterval(() => doStep(dir), 120);\n },\n [doStep]\n );\n\n const stopRepeat = useCallback(() => {\n if (stepTimerRef.current) {\n clearInterval(stepTimerRef.current);\n stepTimerRef.current = null;\n }\n }, []);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputStr(e.target.value);\n };\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n commit(parseInput(inputStr));\n onBlur?.(e);\n },\n [commit, parseInput, inputStr, onBlur]\n );\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n doStep(1);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n doStep(-1);\n } else if (e.key === \"Enter\") {\n commit(parseInput(inputStr));\n }\n };\n\n const isUpDisabled =\n disabled || (max !== undefined && (numValue ?? -Infinity) >= max);\n const isDownDisabled =\n disabled || (min !== undefined && (numValue ?? Infinity) <= min);\n\n const wrapperCls = [\n \"aui-input-wrapper\",\n \"aui-input-number-wrapper\",\n `aui-input-${size}`,\n disabled ? \"aui-input-disabled\" : \"\",\n prefix ? \"aui-input-has-prefix\" : \"\",\n \"aui-input-has-suffix\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls} style={style}>\n {prefix && (\n <span className=\"aui-input-affix aui-input-prefix\">{prefix}</span>\n )}\n <input\n ref={ref}\n className=\"aui-input-native\"\n type=\"text\"\n inputMode=\"decimal\"\n disabled={disabled}\n placeholder={placeholder}\n value={inputStr}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={() => setFocused(true)}\n onKeyDown={handleKeyDown}\n />\n {suffix && (\n <span className=\"aui-input-affix aui-input-suffix\">{suffix}</span>\n )}\n <span className=\"aui-input-number-steps\">\n <span\n className={`aui-input-number-step${\n isUpDisabled ? \" aui-input-number-step-disabled\" : \"\"\n }`}\n onMouseDown={(e) => {\n e.preventDefault();\n if (!isUpDisabled) startRepeat(1);\n }}\n onMouseUp={stopRepeat}\n onMouseLeave={stopRepeat}\n >\n <Icon name=\"chevron-up\" size={10} />\n </span>\n <span\n className={`aui-input-number-step${\n isDownDisabled ? \" aui-input-number-step-disabled\" : \"\"\n }`}\n onMouseDown={(e) => {\n e.preventDefault();\n if (!isDownDisabled) startRepeat(-1);\n }}\n onMouseUp={stopRepeat}\n onMouseLeave={stopRepeat}\n >\n <Icon name=\"chevron-down\" size={10} />\n </span>\n </span>\n </div>\n );\n }\n);\n\nInputNumber.displayName = \"InputNumber\";\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./textarea.css\";\n\nexport type TextareaSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\"> {\n size?: TextareaSize;\n autoSize?: boolean;\n showCount?: boolean;\n clearable?: boolean;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size = \"md\",\n autoSize = false,\n showCount = false,\n clearable = false,\n value,\n defaultValue,\n onChange,\n disabled,\n maxLength,\n className,\n style,\n ...rest\n },\n ref\n ) => {\n const [localValue, setLocalValue] = useState(\n (defaultValue ?? \"\") as string\n );\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n setLocalValue((value ?? \"\") as string);\n }, [value]);\n const currentValue = (value ?? localValue) as string;\n\n const [focused, setFocused] = useState(false);\n const innerRef = useRef<HTMLTextAreaElement>(null);\n const textareaRef =\n (ref as React.RefObject<HTMLTextAreaElement>) ?? innerRef;\n\n const adjustHeight = useCallback(() => {\n const el = textareaRef.current;\n if (!el || !autoSize) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }, [autoSize, textareaRef]);\n\n useEffect(() => {\n adjustHeight();\n }, [currentValue, adjustHeight]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setLocalValue(e.target.value);\n onChange?.(e);\n },\n [onChange]\n );\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue(\"\");\n const nativeInput = textareaRef.current;\n if (nativeInput) {\n const syntheticEvent = Object.create(\n e\n ) as unknown as React.ChangeEvent<HTMLTextAreaElement>;\n Object.defineProperty(syntheticEvent, \"target\", {\n value: { ...nativeInput, value: \"\" },\n });\n onChange?.({\n target: { value: \"\" },\n } as React.ChangeEvent<HTMLTextAreaElement>);\n }\n },\n [onChange, textareaRef]\n );\n\n const hasClear = clearable && !disabled && currentValue.length > 0;\n const charCount = currentValue.length;\n const hasOverlay = hasClear || showCount;\n\n const wrapperCls = [\n \"aui-textarea\",\n `aui-textarea-${size}`,\n disabled ? \"aui-textarea-disabled\" : \"\",\n focused ? \"aui-textarea-focused\" : \"\",\n hasOverlay ? \"aui-textarea-has-overlay\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls} style={style}>\n <textarea\n ref={textareaRef}\n className=\"aui-textarea-native\"\n value={currentValue}\n disabled={disabled}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={(e) => {\n setFocused(true);\n rest.onFocus?.(e);\n }}\n onBlur={(e) => {\n setFocused(false);\n rest.onBlur?.(e);\n }}\n {...rest}\n />\n {hasClear && (\n <span className=\"aui-textarea-clear\" onClick={handleClear}>\n <Icon name=\"x-circle\" size={13} />\n </span>\n )}\n {showCount && (\n <span className=\"aui-textarea-count\">\n {maxLength ? `${charCount}/${maxLength}` : charCount}\n </span>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n","import React, { useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./layer.css\";\n\nexport interface LayerProps {\n open: boolean;\n triggerRef: React.RefObject<HTMLElement | null>;\n children: React.ReactNode;\n /** vertical gap between trigger bottom and layer top, default 4 */\n offset?: number;\n /** stretch layer width to match the trigger, default true */\n matchWidth?: boolean;\n /** override z-index, e.g. 2001 when used inside a Modal */\n zIndex?: number;\n className?: string;\n style?: React.CSSProperties;\n onClickOutside?: () => void;\n onEscape?: () => void;\n}\n\nexport function Layer({\n open,\n triggerRef,\n children,\n offset = 4,\n matchWidth = true,\n zIndex,\n className,\n style,\n onClickOutside,\n onEscape,\n}: LayerProps) {\n const posRef = useRef({ top: 0, left: 0, width: 0 });\n const layerRef = useRef<HTMLDivElement>(null);\n\n // Keep callback refs fresh so the scroll/event handlers never go stale\n const onClickOutsideRef = useRef(onClickOutside);\n onClickOutsideRef.current = onClickOutside;\n const onEscapeRef = useRef(onEscape);\n onEscapeRef.current = onEscape;\n\n // Kept in a ref so the scroll listener always calls the latest version\n // without needing to re-bind on every render.\n const applyPosDOMRef = useRef(() => {});\n applyPosDOMRef.current = () => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (!rect || !layerRef.current) return;\n posRef.current = {\n top: rect.bottom + offset,\n left: rect.left,\n width: rect.width,\n };\n layerRef.current.style.top = `${posRef.current.top}px`;\n layerRef.current.style.left = `${posRef.current.left}px`;\n };\n\n // Compute position during render so the portal is painted at the correct\n // position on the very first frame — no flash at (0,0).\n if (open && triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n posRef.current = {\n top: rect.bottom + offset,\n left: rect.left,\n width: rect.width,\n };\n }\n\n useEffect(() => {\n if (!open) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (\n !triggerRef.current?.contains(e.target as Node) &&\n !layerRef.current?.contains(e.target as Node)\n ) {\n onClickOutsideRef.current?.();\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onEscapeRef.current?.();\n };\n\n // passive: true lets the browser know we won't call preventDefault,\n // enabling hardware-accelerated scroll without waiting for JS.\n const handleScroll = () => applyPosDOMRef.current();\n\n document.addEventListener(\"mousedown\", handleMouseDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"scroll\", handleScroll, {\n capture: true,\n passive: true,\n });\n\n // Reposition when trigger resizes (e.g. multi-select tags wrapping)\n const ro =\n typeof ResizeObserver !== \"undefined\" && triggerRef.current\n ? new ResizeObserver(() => applyPosDOMRef.current())\n : null;\n if (ro && triggerRef.current) ro.observe(triggerRef.current);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleMouseDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"scroll\", handleScroll, true);\n ro?.disconnect();\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return ReactDOM.createPortal(\n <div\n ref={layerRef}\n className={[\"aui-layer\", className].filter(Boolean).join(\" \")}\n style={{\n top: posRef.current.top,\n left: posRef.current.left,\n width: matchWidth ? posRef.current.width : undefined,\n zIndex: zIndex,\n ...style,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>,\n document.body\n );\n}\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Layer } from \"../layer\";\nimport \"./select.css\";\n\nexport interface SelectOption {\n label: string;\n value: string | number;\n disabled?: boolean;\n}\n\nexport type SelectValue = string | number | (string | number)[];\n\nexport interface SelectProps {\n options?: SelectOption[];\n value?: SelectValue;\n onChange?: (value: SelectValue) => void;\n multiple?: boolean;\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n clearable?: boolean;\n searchable?: boolean;\n maxTagCount?: number;\n style?: React.CSSProperties;\n className?: string;\n}\n\nconst ITEM_HEIGHT = 34;\nconst DROPDOWN_HEIGHT = 256;\nconst BUFFER = 3;\n\n\nfunction highlightText(text: string, query: string): React.ReactNode {\n if (!query.trim()) return text;\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const parts = text.split(new RegExp(`(${escaped})`, \"gi\"));\n return parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <span key={i} className=\"aui-select-highlight\">\n {part}\n </span>\n ) : (\n part\n ),\n );\n}\n\n// ── Virtual option list ──────────────────────────────────────────────────────\nfunction VirtualOptionList({\n options,\n selectedValues,\n searchable,\n search,\n onSelect,\n}: {\n options: SelectOption[];\n selectedValues: (string | number)[];\n searchable: boolean;\n search: string;\n onSelect: (value: string | number, disabled?: boolean) => void;\n}) {\n const [scrollTop, setScrollTop] = useState(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // reset scroll when filtered list changes\n useEffect(() => {\n setScrollTop(0);\n if (containerRef.current) containerRef.current.scrollTop = 0;\n }, [options.length, search]);\n\n if (options.length === 0) {\n return <div className=\"aui-select-empty\">无匹配选项</div>;\n }\n\n const totalHeight = options.length * ITEM_HEIGHT;\n const startIdx = Math.max(0, Math.floor(scrollTop / ITEM_HEIGHT) - BUFFER);\n const endIdx = Math.min(\n options.length,\n Math.ceil((scrollTop + DROPDOWN_HEIGHT) / ITEM_HEIGHT) + BUFFER,\n );\n const visibleOptions = options.slice(startIdx, endIdx);\n const offsetY = startIdx * ITEM_HEIGHT;\n\n return (\n <div\n ref={containerRef}\n className=\"aui-select-option-list\"\n onScroll={(e) => setScrollTop(e.currentTarget.scrollTop)}\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n <div style={{ transform: `translateY(${offsetY}px)` }}>\n {visibleOptions.map((opt) => {\n const selected = selectedValues.includes(opt.value);\n return (\n <div\n key={opt.value}\n className={[\n \"aui-select-option\",\n selected ? \"aui-select-option-selected\" : \"\",\n opt.disabled ? \"aui-select-option-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => onSelect(opt.value, opt.disabled)}\n >\n <span>\n {searchable && search\n ? highlightText(opt.label, search)\n : opt.label}\n </span>\n <span\n className={`aui-select-check${selected ? \" aui-select-check-visible\" : \"\"}`}\n >\n <Icon name=\"check\" size={13} />\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nexport function Select({\n options = [],\n value,\n onChange,\n multiple = false,\n placeholder = \"请选择\",\n disabled = false,\n size = \"md\",\n clearable = false,\n searchable = false,\n maxTagCount = 10,\n style,\n className,\n}: SelectProps) {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const triggerRef = useRef<HTMLDivElement>(null);\n const inlineInputRef = useRef<HTMLInputElement>(null);\n\n const selectedValues: (string | number)[] = multiple\n ? Array.isArray(value)\n ? value\n : value != null\n ? [value as string | number]\n : []\n : value != null\n ? [value as string | number]\n : [];\n\n const filteredOptions =\n searchable && search\n ? options.filter((o) =>\n o.label.toLowerCase().includes(search.toLowerCase()),\n )\n : options;\n\n const getLabel = (val: string | number) =>\n options.find((o) => o.value === val)?.label ?? String(val);\n\n const handleOpen = () => {\n if (disabled) return;\n setOpen((v) => !v);\n if (open) setSearch(\"\");\n };\n\n const handleSelect = (optValue: string | number, optDisabled?: boolean) => {\n if (optDisabled) return;\n if (multiple) {\n const arr = Array.isArray(value)\n ? value\n : value != null\n ? [value as string | number]\n : [];\n const next = arr.includes(optValue)\n ? arr.filter((v) => v !== optValue)\n : [...arr, optValue];\n onChange?.(next);\n } else {\n onChange?.(optValue);\n setSearch(\"\");\n setOpen(false);\n }\n };\n\n const handleRemoveTag = (e: React.MouseEvent, val: string | number) => {\n e.stopPropagation();\n const arr = Array.isArray(value)\n ? value\n : value != null\n ? [value as string | number]\n : [];\n onChange?.(arr.filter((v) => v !== val));\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.(multiple ? [] : (undefined as any));\n setSearch(\"\");\n setOpen(false);\n };\n\n useEffect(() => {\n if (open && searchable) {\n setTimeout(() => inlineInputRef.current?.focus(), 0);\n }\n if (!open) setSearch(\"\");\n }, [open, searchable]);\n\n const hasClear = clearable && selectedValues.length > 0;\n\n const triggerCls = [\n \"aui-select\",\n `aui-select-${size}`,\n open ? \"aui-select-open\" : \"\",\n disabled ? \"aui-select-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const renderValues = () => {\n if (multiple) {\n return (\n <>\n {selectedValues.slice(0, maxTagCount).map((val) => (\n <span key={val} className=\"aui-select-tag\">\n <span className=\"aui-select-tag-label\">{getLabel(val)}</span>\n <span\n className=\"aui-select-tag-close\"\n onClick={(e) => handleRemoveTag(e, val)}\n >\n <Icon name=\"x\" size={10} />\n </span>\n </span>\n ))}\n {selectedValues.length > maxTagCount && (\n <span className=\"aui-select-tag-overflow\">\n +{selectedValues.length - maxTagCount}\n </span>\n )}\n {searchable && open && (\n <input\n ref={inlineInputRef}\n className=\"aui-select-inline-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"搜索...\"\n onClick={(e) => e.stopPropagation()}\n />\n )}\n {selectedValues.length === 0 && !(searchable && open) && (\n <span className=\"aui-select-placeholder\">{placeholder}</span>\n )}\n </>\n );\n }\n\n if (searchable && open) {\n return (\n <input\n ref={inlineInputRef}\n className=\"aui-select-inline-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={\n selectedValues.length > 0\n ? getLabel(selectedValues[0])\n : placeholder\n }\n onClick={(e) => e.stopPropagation()}\n />\n );\n }\n\n return selectedValues.length > 0 ? (\n <span className=\"aui-select-single-value\">\n {getLabel(selectedValues[0])}\n </span>\n ) : (\n <span className=\"aui-select-placeholder\">{placeholder}</span>\n );\n };\n\n return (\n <div\n ref={triggerRef}\n className={triggerCls}\n style={style}\n onClick={handleOpen}\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled}\n >\n <div className=\"aui-select-values\">{renderValues()}</div>\n <div className=\"aui-select-suffix\" onClick={(e) => e.stopPropagation()}>\n <span className=\"aui-select-icon-slot\">\n <span className=\"aui-select-arrow\" onClick={handleOpen}>\n <Icon name=\"chevron-down\" size={14} style={{ transform: open ? \"rotate(180deg)\" : \"none\", transition: \"transform 0.2s\" }} />\n </span>\n {hasClear && (\n <span className=\"aui-select-clear\" onClick={handleClear}>\n <Icon name=\"x\" size={10} />\n </span>\n )}\n </span>\n </div>\n\n <Layer\n open={open}\n triggerRef={triggerRef}\n className=\"aui-select-dropdown\"\n onClickOutside={() => setOpen(false)}\n onEscape={() => setOpen(false)}\n >\n <VirtualOptionList\n options={filteredOptions}\n selectedValues={selectedValues}\n searchable={searchable}\n search={search}\n onSelect={handleSelect}\n />\n </Layer>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from \"react\";\nimport \"./switch.css\";\n\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SwitchProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n size?: SwitchSize;\n checkedChildren?: React.ReactNode;\n uncheckedChildren?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Switch({\n checked,\n defaultChecked = false,\n onChange,\n disabled = false,\n size = \"md\",\n checkedChildren,\n uncheckedChildren,\n style,\n className,\n}: SwitchProps) {\n const [localChecked, setLocalChecked] = useState(defaultChecked);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n setLocalChecked(checked ?? false);\n }, [checked]);\n const currentChecked = checked ?? localChecked;\n\n const handleClick = () => {\n if (disabled) return;\n const next = !currentChecked;\n setLocalChecked(next);\n onChange?.(next);\n };\n\n const hasLabel = checkedChildren != null || uncheckedChildren != null;\n\n const cls = [\n \"aui-switch\",\n `aui-switch-${size}`,\n currentChecked ? \"aui-switch-checked\" : \"\",\n disabled ? \"aui-switch-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={currentChecked}\n className={cls}\n style={style}\n onClick={handleClick}\n disabled={disabled}\n >\n <span className=\"aui-switch-handle\" />\n {hasLabel && (\n <span className=\"aui-switch-inner\">\n {currentChecked ? checkedChildren : uncheckedChildren}\n </span>\n )}\n </button>\n );\n}\n\nSwitch.displayName = \"Switch\";\n","import React, {\n useState,\n useCallback,\n useContext,\n createContext,\n useRef,\n useEffect,\n} from \"react\";\nimport \"./checkbox.css\";\n\nexport type CheckboxSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface CheckboxProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onChange\" | \"checked\" | \"defaultChecked\" | \"value\"\n > {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean, e: React.ChangeEvent<HTMLInputElement>) => void;\n indeterminate?: boolean;\n size?: CheckboxSize;\n children?: React.ReactNode;\n value?: string | number;\n}\n\nexport interface CheckboxOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps {\n value?: (string | number)[];\n defaultValue?: (string | number)[];\n onChange?: (value: (string | number)[]) => void;\n options?: CheckboxOption[];\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n}\n\ninterface GroupContext {\n value: (string | number)[];\n toggle: (val: string | number, checked: boolean) => void;\n disabled?: boolean;\n}\n\nconst GroupCtx = createContext<GroupContext | null>(null);\n\nfunction CheckboxGroup({\n value,\n defaultValue,\n onChange,\n options,\n disabled,\n children,\n className,\n}: CheckboxGroupProps) {\n const [local, setLocal] = useState<(string | number)[]>(defaultValue ?? []);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n setLocal(value ?? []);\n }, [value]);\n const groupValue = value ?? local;\n\n const toggle = useCallback(\n (val: string | number, checked: boolean) => {\n const next = checked\n ? [...groupValue, val]\n : groupValue.filter((v) => v !== val);\n setLocal(next);\n onChange?.(next);\n },\n [groupValue, onChange]\n );\n\n return (\n <GroupCtx.Provider value={{ value: groupValue, toggle, disabled }}>\n <div\n className={[\"aui-checkbox-group\", className].filter(Boolean).join(\" \")}\n >\n {options\n ? options.map((opt) => (\n <Checkbox\n key={opt.value}\n value={opt.value}\n disabled={opt.disabled}\n >\n {opt.label}\n </Checkbox>\n ))\n : children}\n </div>\n </GroupCtx.Provider>\n );\n}\n\nexport function Checkbox({\n checked,\n defaultChecked,\n onChange,\n indeterminate,\n size = \"md\",\n disabled,\n children,\n value,\n className,\n ...rest\n}: CheckboxProps) {\n const group = useContext(GroupCtx);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const inGroup = group !== null && value !== undefined;\n const [local, setLocal] = useState(defaultChecked ?? false);\n const mountedRef = useRef<boolean>(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n if (!inGroup) setLocal(checked ?? false);\n }, [checked, inGroup]);\n\n const currentChecked = inGroup\n ? group.value.includes(value!)\n : checked ?? local;\n\n const isDisabled = disabled ?? group?.disabled;\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = !currentChecked && !!indeterminate;\n }\n }, [indeterminate, currentChecked]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.checked;\n if (inGroup) {\n group.toggle(value!, next);\n } else {\n setLocal(next);\n onChange?.(next, e);\n }\n },\n [inGroup, group, value, onChange]\n );\n\n const showIndeterminate = indeterminate && !currentChecked;\n\n const cls = [\n \"aui-checkbox\",\n `aui-checkbox-${size}`,\n currentChecked ? \"aui-checkbox-checked\" : \"\",\n showIndeterminate ? \"aui-checkbox-indeterminate\" : \"\",\n isDisabled ? \"aui-checkbox-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <label className={cls}>\n <span className=\"aui-checkbox-inner\">\n <input\n ref={inputRef}\n type=\"checkbox\"\n className=\"aui-checkbox-input\"\n checked={currentChecked}\n disabled={isDisabled}\n onChange={handleChange}\n {...rest}\n />\n <span className=\"aui-checkbox-box\">\n {(currentChecked || showIndeterminate) && (\n <svg className=\"aui-checkbox-icon\" viewBox=\"0 0 12 12\" fill=\"none\">\n {showIndeterminate ? (\n <line\n x1=\"2\"\n y1=\"6\"\n x2=\"10\"\n y2=\"6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n ) : (\n <polyline\n points=\"2,6.5 4.8,9.5 10,3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n </svg>\n )}\n </span>\n </span>\n {children !== undefined && (\n <span className=\"aui-checkbox-label\">{children}</span>\n )}\n </label>\n );\n}\n\nCheckbox.Group = CheckboxGroup;\nCheckbox.displayName = \"Checkbox\";\n","import React, {\n useState,\n useCallback,\n useContext,\n createContext,\n useEffect,\n useRef,\n} from \"react\";\nimport \"./radio.css\";\n\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RadioProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"onChange\" | \"checked\" | \"defaultChecked\" | \"value\"\n > {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean, e: React.ChangeEvent<HTMLInputElement>) => void;\n size?: RadioSize;\n children?: React.ReactNode;\n value?: string | number;\n}\n\nexport interface RadioOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n value?: string | number;\n defaultValue?: string | number;\n onChange?: (value: string | number) => void;\n options?: RadioOption[];\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n}\n\ninterface GroupContext {\n value: string | number | undefined;\n select: (val: string | number) => void;\n disabled?: boolean;\n}\n\nconst GroupCtx = createContext<GroupContext | null>(null);\n\nfunction RadioGroup({\n value,\n defaultValue,\n onChange,\n options,\n disabled,\n children,\n className,\n}: RadioGroupProps) {\n const [local, setLocal] = useState<string | number | undefined>(defaultValue);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n setLocal(value);\n }, [value]);\n const groupValue = value ?? local;\n\n const select = useCallback(\n (val: string | number) => {\n setLocal(val);\n onChange?.(val);\n },\n [onChange]\n );\n\n return (\n <GroupCtx.Provider value={{ value: groupValue, select, disabled }}>\n <div className={[\"aui-radio-group\", className].filter(Boolean).join(\" \")}>\n {options\n ? options.map((opt) => (\n <Radio key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </Radio>\n ))\n : children}\n </div>\n </GroupCtx.Provider>\n );\n}\n\nexport function Radio({\n checked,\n defaultChecked,\n onChange,\n size = \"md\",\n disabled,\n children,\n value,\n className,\n ...rest\n}: RadioProps) {\n const group = useContext(GroupCtx);\n\n const inGroup = group !== null && value !== undefined;\n const [local, setLocal] = useState(defaultChecked ?? false);\n const mountedRef = useRef(false);\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n if (!inGroup) setLocal(checked ?? false);\n }, [checked, inGroup]);\n\n const currentChecked = inGroup ? group.value === value : checked ?? local;\n\n const isDisabled = disabled ?? group?.disabled;\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!e.target.checked) return;\n if (inGroup) {\n group.select(value!);\n } else {\n setLocal(true);\n onChange?.(true, e);\n }\n },\n [inGroup, group, value, onChange]\n );\n\n const cls = [\n \"aui-radio\",\n `aui-radio-${size}`,\n currentChecked ? \"aui-radio-checked\" : \"\",\n isDisabled ? \"aui-radio-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <label className={cls}>\n <span className=\"aui-radio-inner\">\n <input\n type=\"radio\"\n className=\"aui-radio-input\"\n checked={currentChecked}\n disabled={isDisabled}\n onChange={handleChange}\n {...rest}\n />\n <span className=\"aui-radio-circle\">\n {currentChecked && <span className=\"aui-radio-dot\" />}\n </span>\n </span>\n {children !== undefined && (\n <span className=\"aui-radio-label\">{children}</span>\n )}\n </label>\n );\n}\n\nRadio.Group = RadioGroup;\nRadio.displayName = \"Radio\";\n","import React, { useState, useRef, useCallback, useEffect } from \"react\";\nimport \"./slider.css\";\n\nexport interface SliderProps {\n value?: number | [number, number];\n defaultValue?: number | [number, number];\n onChange?: (value: number | [number, number]) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n marks?: Record<number, React.ReactNode>;\n range?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction snapToStep(v: number, min: number, step: number) {\n return Math.round((v - min) / step) * step + min;\n}\n\nfunction pct(v: number, min: number, max: number) {\n return ((v - min) / (max - min)) * 100;\n}\n\nexport function Slider({\n value,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n marks,\n range = false,\n style,\n className,\n}: SliderProps) {\n const initSingle = (): number => {\n const dv = defaultValue;\n if (typeof dv === \"number\") return clamp(dv, min, max);\n return min;\n };\n const initRange = (): [number, number] => {\n const dv = defaultValue;\n if (Array.isArray(dv))\n return [clamp(dv[0], min, max), clamp(dv[1], min, max)];\n return [min, min];\n };\n\n const [localSingle, setLocalSingle] = useState<number>(initSingle);\n const [localRange, setLocalRange] = useState<[number, number]>(initRange);\n\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n if (range) {\n if (Array.isArray(value))\n setLocalRange([clamp(value[0], min, max), clamp(value[1], min, max)]);\n else setLocalRange([min, min]);\n } else {\n setLocalSingle(typeof value === \"number\" ? clamp(value, min, max) : min);\n }\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getSingle = (): number => {\n if (typeof value === \"number\") return clamp(value, min, max);\n return localSingle;\n };\n const getRange = (): [number, number] => {\n if (Array.isArray(value))\n return [clamp(value[0], min, max), clamp(value[1], min, max)];\n return localRange;\n };\n\n const trackRef = useRef<HTMLDivElement>(null);\n const draggingThumb = useRef<0 | 1 | null>(null);\n\n const valueToPos = (v: number) => pct(v, min, max);\n\n const posToValue = useCallback(\n (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return min;\n const raw = ((clientX - rect.left) / rect.width) * (max - min) + min;\n return clamp(snapToStep(raw, min, step), min, max);\n },\n [min, max, step]\n );\n\n const handleMouseDown = useCallback(\n (thumbIdx: 0 | 1) => (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n draggingThumb.current = thumbIdx;\n\n const onMove = (ev: MouseEvent) => {\n const v = posToValue(ev.clientX);\n if (!range) {\n setLocalSingle(v);\n onChange?.(v);\n } else {\n const [lo, hi] = getRange();\n let next: [number, number] = thumbIdx === 0 ? [v, hi] : [lo, v];\n // keep order\n if (next[0] > next[1]) next = [next[1], next[0]];\n setLocalRange(next);\n onChange?.(next);\n }\n };\n\n const onUp = () => {\n draggingThumb.current = null;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled, range, min, max, step, posToValue, onChange]\n );\n\n // Touch support\n const handleTouchStart = useCallback(\n (thumbIdx: 0 | 1) => (e: React.TouchEvent) => {\n if (disabled) return;\n draggingThumb.current = thumbIdx;\n\n const onMove = (ev: TouchEvent) => {\n const v = posToValue(ev.touches[0].clientX);\n if (!range) {\n setLocalSingle(v);\n onChange?.(v);\n } else {\n const [lo, hi] = getRange();\n let next: [number, number] = thumbIdx === 0 ? [v, hi] : [lo, v];\n if (next[0] > next[1]) next = [next[1], next[0]];\n setLocalRange(next);\n onChange?.(next);\n }\n };\n\n const onEnd = () => {\n draggingThumb.current = null;\n document.removeEventListener(\"touchmove\", onMove);\n document.removeEventListener(\"touchend\", onEnd);\n };\n\n document.addEventListener(\"touchmove\", onMove, { passive: true });\n document.addEventListener(\"touchend\", onEnd);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled, range, posToValue, onChange]\n );\n\n // Click on rail to jump\n const handleRailClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n const v = posToValue(e.clientX);\n if (!range) {\n setLocalSingle(v);\n onChange?.(v);\n } else {\n const [lo, hi] = getRange();\n // snap to nearest thumb\n const dLo = Math.abs(v - lo);\n const dHi = Math.abs(v - hi);\n let next: [number, number] = dLo <= dHi ? [v, hi] : [lo, v];\n if (next[0] > next[1]) next = [next[1], next[0]];\n setLocalRange(next);\n onChange?.(next);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled, range, posToValue, onChange]\n );\n\n const singleVal = getSingle();\n const [lo, hi] = getRange();\n\n const cls = [\n \"aui-slider\",\n disabled ? \"aui-slider-disabled\" : \"\",\n range ? \"aui-slider-range\" : \"\",\n marks ? \"aui-slider-with-marks\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const trackLeft = range ? `${valueToPos(lo)}%` : \"0%\";\n const trackWidth = range\n ? `${valueToPos(hi) - valueToPos(lo)}%`\n : `${valueToPos(singleVal)}%`;\n\n return (\n <div className={cls} style={style}>\n <div\n ref={trackRef}\n className=\"aui-slider-runway\"\n onClick={handleRailClick}\n >\n <div className=\"aui-slider-rail\" />\n <div\n className=\"aui-slider-track\"\n style={{ left: trackLeft, width: trackWidth }}\n />\n {/* Single thumb */}\n {!range && (\n <div\n className=\"aui-slider-thumb\"\n style={{ left: `${valueToPos(singleVal)}%` }}\n onMouseDown={handleMouseDown(0)}\n onTouchStart={handleTouchStart(0)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={singleVal}\n aria-disabled={disabled}\n />\n )}\n {/* Range thumbs */}\n {range && (\n <>\n <div\n className=\"aui-slider-thumb\"\n style={{ left: `${valueToPos(lo)}%` }}\n onMouseDown={handleMouseDown(0)}\n onTouchStart={handleTouchStart(0)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={lo}\n aria-disabled={disabled}\n />\n <div\n className=\"aui-slider-thumb\"\n style={{ left: `${valueToPos(hi)}%` }}\n onMouseDown={handleMouseDown(1)}\n onTouchStart={handleTouchStart(1)}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={hi}\n aria-disabled={disabled}\n />\n </>\n )}\n {/* Marks */}\n {marks &&\n Object.entries(marks).map(([k, label]) => {\n const mv = Number(k);\n const p = valueToPos(mv);\n const active = range ? mv >= lo && mv <= hi : mv <= singleVal;\n return (\n <div\n key={k}\n className={`aui-slider-mark-dot${\n active ? \" aui-slider-mark-dot-active\" : \"\"\n }`}\n style={{ left: `${p}%` }}\n />\n );\n })}\n </div>\n {/* Mark labels below rail */}\n {marks && (\n <div className=\"aui-slider-marks\">\n {Object.entries(marks).map(([k, label]) => {\n const mv = Number(k);\n const p = valueToPos(mv);\n return (\n <span\n key={k}\n className=\"aui-slider-mark-label\"\n style={{ left: `${p}%` }}\n >\n {label}\n </span>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nSlider.displayName = \"Slider\";\n","import React, { useState, useEffect, useRef } from \"react\";\nimport \"./rate.css\";\n\nexport type RateSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RateProps {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n count?: number;\n allowHalf?: boolean;\n allowClear?: boolean;\n disabled?: boolean;\n character?: React.ReactNode;\n size?: RateSize;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Rate({\n value,\n defaultValue = 0,\n onChange,\n count = 5,\n allowHalf = false,\n allowClear = true,\n disabled = false,\n character = \"★\",\n size = \"md\",\n style,\n className,\n}: RateProps) {\n const [localValue, setLocalValue] = useState(defaultValue);\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n setLocalValue(value ?? 0);\n }, [value]);\n const [hoverValue, setHoverValue] = useState(-1);\n\n const currentValue = value ?? localValue;\n const displayValue = hoverValue >= 0 ? hoverValue : currentValue;\n\n const getStarStatus = (i: number): \"full\" | \"half\" | \"empty\" => {\n if (displayValue >= i + 1) return \"full\";\n if (allowHalf && displayValue >= i + 0.5) return \"half\";\n return \"empty\";\n };\n\n const resolveValue = (e: React.MouseEvent, i: number) => {\n if (!allowHalf) return i + 1;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n return e.clientX - rect.left < rect.width / 2 ? i + 0.5 : i + 1;\n };\n\n const handleMouseMove = (e: React.MouseEvent, i: number) => {\n if (disabled) return;\n setHoverValue(resolveValue(e, i));\n };\n\n const handleMouseLeave = () => {\n if (!disabled) setHoverValue(-1);\n };\n\n const handleClick = (e: React.MouseEvent, i: number) => {\n if (disabled) return;\n const v = resolveValue(e, i);\n const next = allowClear && v === currentValue ? 0 : v;\n setLocalValue(next);\n onChange?.(next);\n };\n\n const cls = [\n \"aui-rate\",\n `aui-rate-${size}`,\n disabled ? \"aui-rate-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style} onMouseLeave={handleMouseLeave}>\n {Array.from({ length: count }, (_, i) => {\n const status = getStarStatus(i);\n return (\n <span\n key={i}\n className={`aui-rate-star aui-rate-star-${status}`}\n onMouseMove={(e) => handleMouseMove(e, i)}\n onClick={(e) => handleClick(e, i)}\n >\n {/* gray base */}\n <span className=\"aui-rate-star-base\" aria-hidden=\"true\">\n {character}\n </span>\n {/* yellow fill, width clips to 0/50%/100% */}\n <span className=\"aui-rate-star-fill\" aria-hidden=\"true\">\n {character}\n </span>\n </span>\n );\n })}\n </div>\n );\n}\n\nRate.displayName = \"Rate\";\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Layer } from \"../layer\";\nimport \"./datepicker.css\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\nexport type DatePickerSize = \"sm\" | \"md\" | \"lg\";\nexport type PickerType = \"date\" | \"month\" | \"year\";\ntype PanelView = \"day\" | \"month\" | \"year\";\nexport type SingleValue = Date | string | null;\nexport type RangeValue = [SingleValue, SingleValue];\n\nexport interface DatePickerProps {\n value?: SingleValue | RangeValue;\n defaultValue?: SingleValue | RangeValue;\n onChange?: (\n value: Date | null | [Date | null, Date | null],\n str: string | [string, string]\n ) => void;\n picker?: PickerType;\n range?: boolean;\n disabled?: boolean;\n clearable?: boolean;\n size?: DatePickerSize;\n placeholder?: string;\n format?: string;\n min?: SingleValue;\n max?: SingleValue;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\nfunction toDate(val: SingleValue): Date | null {\n if (!val) return null;\n if (val instanceof Date) return isNaN(val.getTime()) ? null : val;\n const d = new Date(val);\n return isNaN(d.getTime()) ? null : d;\n}\n\nfunction fmt(date: Date, format: string): string {\n return format\n .replace(\"YYYY\", String(date.getFullYear()))\n .replace(\"MM\", String(date.getMonth() + 1).padStart(2, \"0\"))\n .replace(\"DD\", String(date.getDate()).padStart(2, \"0\"));\n}\n\nfunction defaultFmt(picker: PickerType): string {\n if (picker === \"year\") return \"YYYY\";\n if (picker === \"month\") return \"YYYY-MM\";\n return \"YYYY-MM-DD\";\n}\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\nfunction isSameMonth(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\n}\nfunction isSameYear(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear();\n}\n\n// Ordered range helpers\nfunction rangeOrder(\n s: Date | null,\n e: Date | null\n): [Date | null, Date | null] {\n if (!s || !e) return [s, e];\n return s <= e ? [s, e] : [e, s];\n}\nfunction dayInRange(d: Date, s: Date | null, e: Date | null): boolean {\n if (!s || !e) return false;\n const [lo, hi] = rangeOrder(s, e) as [Date, Date];\n const t = d.getTime();\n return t > lo.getTime() && t < hi.getTime();\n}\nfunction monthInRange(d: Date, s: Date | null, e: Date | null): boolean {\n if (!s || !e) return false;\n const [lo, hi] = rangeOrder(s, e) as [Date, Date];\n const dm = new Date(d.getFullYear(), d.getMonth(), 1).getTime();\n const lm = new Date(lo.getFullYear(), lo.getMonth(), 1).getTime();\n const hm = new Date(hi.getFullYear(), hi.getMonth(), 1).getTime();\n return dm > lm && dm < hm;\n}\nfunction yearInRange(y: number, s: Date | null, e: Date | null): boolean {\n if (!s || !e) return false;\n const [lo, hi] = rangeOrder(s, e) as [Date, Date];\n return y > lo.getFullYear() && y < hi.getFullYear();\n}\n\n// ── Constants ─────────────────────────────────────────────────────────────────\nconst WEEKDAYS = [\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\nconst MONTHS_LABEL = [\n \"1月\",\n \"2月\",\n \"3月\",\n \"4月\",\n \"5月\",\n \"6月\",\n \"7月\",\n \"8月\",\n \"9月\",\n \"10月\",\n \"11月\",\n \"12月\",\n];\n\n// ── Component ─────────────────────────────────────────────────────────────────\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n picker = \"date\",\n range = false,\n disabled = false,\n clearable = false,\n size = \"md\",\n placeholder,\n format,\n min,\n max,\n style,\n className,\n}: DatePickerProps) {\n const resolvedFmt = format ?? defaultFmt(picker);\n const resolvedPlaceholder =\n placeholder ??\n (range\n ? `请选择${\n picker === \"year\" ? \"年份\" : picker === \"month\" ? \"月份\" : \"日期\"\n }范围`\n : `请选择${\n picker === \"year\" ? \"年份\" : picker === \"month\" ? \"月份\" : \"日期\"\n }`);\n\n const initialView: PanelView =\n picker === \"year\" ? \"year\" : picker === \"month\" ? \"month\" : \"day\";\n\n // ── Value state ──\n const [localSingle, setLocalSingle] = useState<Date | null>(() =>\n range ? null : toDate(defaultValue as SingleValue)\n );\n const [localRange, setLocalRange] = useState<[Date | null, Date | null]>(\n () => {\n if (!range || !defaultValue) return [null, null];\n const rv = defaultValue as RangeValue;\n return [toDate(rv[0]), toDate(rv[1])];\n }\n );\n\n const mounted = useRef(false);\n useEffect(() => {\n if (!mounted.current) {\n mounted.current = true;\n return;\n }\n if (!range) {\n setLocalSingle(toDate(value as SingleValue));\n } else if (value) {\n const rv = value as RangeValue;\n setLocalRange([toDate(rv[0]), toDate(rv[1])]);\n } else {\n setLocalRange([null, null]);\n }\n }, [value]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const getSingle = (): Date | null =>\n value !== undefined ? toDate(value as SingleValue) : localSingle;\n\n const getRange = (): [Date | null, Date | null] => {\n if (value !== undefined) {\n const v = value as RangeValue;\n return v ? [toDate(v[0]), toDate(v[1])] : [null, null];\n }\n return localRange;\n };\n\n // ── Panel state ──\n const [open, setOpen] = useState(false);\n const [panelView, setPanelView] = useState<PanelView>(initialView);\n const [viewYear, setViewYear] = useState(() => {\n const d = range ? getRange()[0] : getSingle();\n return (d ?? new Date()).getFullYear();\n });\n const [viewMonth, setViewMonth] = useState(() => {\n const d = range ? getRange()[0] : getSingle();\n return (d ?? new Date()).getMonth();\n });\n // Range selection\n const [pendingStart, setPendingStart] = useState<Date | null>(null);\n const [hoverDate, setHoverDate] = useState<Date | null>(null);\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const today = new Date();\n const minDate = toDate(min ?? null);\n const maxDate = toDate(max ?? null);\n\n // ── Disabled check ──\n const isDisabledDate = (d: Date): boolean => {\n const t = new Date(d);\n t.setHours(0, 0, 0, 0);\n if (minDate) {\n const mn = new Date(minDate);\n mn.setHours(0, 0, 0, 0);\n if (t < mn) return true;\n }\n if (maxDate) {\n const mx = new Date(maxDate);\n mx.setHours(0, 0, 0, 0);\n if (t > mx) return true;\n }\n return false;\n };\n\n // ── Open/Close ──\n const handleOpen = () => {\n if (disabled) return;\n if (!open) {\n setPanelView(initialView);\n const ref = range ? getRange()[0] : getSingle();\n const d = ref ?? today;\n setViewYear(d.getFullYear());\n setViewMonth(d.getMonth());\n if (range) {\n setPendingStart(null);\n setHoverDate(null);\n }\n }\n setOpen((v) => !v);\n };\n\n // ── Commit helpers ──\n const commitSingle = (date: Date) => {\n setLocalSingle(date);\n onChange?.(date, fmt(date, resolvedFmt));\n setOpen(false);\n };\n\n const commitRange = (a: Date, b: Date) => {\n const [s, e] = rangeOrder(a, b) as [Date, Date];\n setLocalRange([s, e]);\n onChange?.([s, e], [fmt(s, resolvedFmt), fmt(e, resolvedFmt)]);\n setPendingStart(null);\n setHoverDate(null);\n setOpen(false);\n };\n\n // ── Selection ──\n const handleDaySelect = (day: number) => {\n const d = new Date(viewYear, viewMonth, day);\n if (isDisabledDate(d)) return;\n if (!range) {\n commitSingle(d);\n return;\n }\n if (!pendingStart) {\n setPendingStart(d);\n } else {\n commitRange(pendingStart, d);\n }\n };\n\n const handleMonthSelect = (month: number) => {\n if (picker !== \"month\") {\n setViewMonth(month);\n setPanelView(\"day\");\n return;\n }\n const d = new Date(viewYear, month, 1);\n if (!range) {\n commitSingle(d);\n return;\n }\n if (!pendingStart) {\n setPendingStart(d);\n } else {\n commitRange(pendingStart, new Date(viewYear, month + 1, 0));\n }\n };\n\n const handleYearSelect = (year: number) => {\n if (picker === \"date\") {\n setViewYear(year);\n setPanelView(\"month\");\n return;\n }\n if (picker === \"month\") {\n setViewYear(year);\n setPanelView(\"month\");\n return;\n }\n const d = new Date(year, 0, 1);\n if (!range) {\n commitSingle(d);\n return;\n }\n if (!pendingStart) {\n setPendingStart(d);\n } else {\n commitRange(pendingStart, new Date(year, 11, 31));\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (range) setLocalRange([null, null]);\n else setLocalSingle(null);\n onChange?.(range ? [null, null] : null, range ? [\"\", \"\"] : \"\");\n setPendingStart(null);\n };\n\n // ── Navigation ──\n const prevMonth = () =>\n viewMonth === 0\n ? (setViewYear((y) => y - 1), setViewMonth(11))\n : setViewMonth((m) => m - 1);\n const nextMonth = () =>\n viewMonth === 11\n ? (setViewYear((y) => y + 1), setViewMonth(0))\n : setViewMonth((m) => m + 1);\n const prevYear = () => setViewYear((y) => y - 1);\n const nextYear = () => setViewYear((y) => y + 1);\n const decadeStart = Math.floor(viewYear / 12) * 12;\n const prevDecade = () => setViewYear((y) => y - 12);\n const nextDecade = () => setViewYear((y) => y + 12);\n\n // ── Display text ──\n const currentSingle = getSingle();\n const [rangeS, rangeE] = getRange();\n\n // For range: resolve what to show (hover preview takes precedence over confirmed range)\n const displayRangeS = pendingStart ?? rangeS;\n const displayRangeE = pendingStart ? hoverDate : rangeE;\n const [orderedS, orderedE] = rangeOrder(displayRangeS, displayRangeE);\n\n let displayText = \"\";\n if (range) {\n const sStr = orderedS ? fmt(orderedS, resolvedFmt) : \"\";\n const eStr = orderedE ? fmt(orderedE, resolvedFmt) : \"\";\n if (sStr || eStr) displayText = `${sStr} ~ ${eStr}`;\n } else {\n displayText = currentSingle ? fmt(currentSingle, resolvedFmt) : \"\";\n }\n\n const showClear =\n clearable &&\n !disabled &&\n (range ? rangeS !== null || rangeE !== null : currentSingle !== null);\n\n // ── Render: Header ──\n const renderHeader = () => {\n if (panelView === \"day\") {\n return (\n <div className=\"aui-datepicker-header\">\n <button\n className=\"aui-datepicker-nav\"\n onClick={prevMonth}\n type=\"button\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </button>\n <div className=\"aui-datepicker-header-labels\">\n <button\n className=\"aui-datepicker-header-btn\"\n type=\"button\"\n onClick={() => setPanelView(\"year\")}\n >\n {viewYear}年\n </button>\n <button\n className=\"aui-datepicker-header-btn\"\n type=\"button\"\n onClick={() => setPanelView(\"month\")}\n >\n {MONTHS_LABEL[viewMonth]}\n </button>\n </div>\n <button\n className=\"aui-datepicker-nav\"\n onClick={nextMonth}\n type=\"button\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </button>\n </div>\n );\n }\n if (panelView === \"month\") {\n return (\n <div className=\"aui-datepicker-header\">\n <button\n className=\"aui-datepicker-nav\"\n onClick={prevYear}\n type=\"button\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </button>\n <div className=\"aui-datepicker-header-labels\">\n {picker === \"month\" ? (\n <span className=\"aui-datepicker-month-label\">{viewYear}年</span>\n ) : (\n <button\n className=\"aui-datepicker-header-btn\"\n type=\"button\"\n onClick={() => setPanelView(\"year\")}\n >\n {viewYear}年\n </button>\n )}\n </div>\n <button\n className=\"aui-datepicker-nav\"\n onClick={nextYear}\n type=\"button\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </button>\n </div>\n );\n }\n return (\n <div className=\"aui-datepicker-header\">\n <button\n className=\"aui-datepicker-nav\"\n onClick={prevDecade}\n type=\"button\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </button>\n <span className=\"aui-datepicker-month-label\">\n {decadeStart} – {decadeStart + 11}\n </span>\n <button\n className=\"aui-datepicker-nav\"\n onClick={nextDecade}\n type=\"button\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </button>\n </div>\n );\n };\n\n // ── Render: Day grid ──\n const renderDayView = () => {\n const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();\n const firstDay = new Date(viewYear, viewMonth, 1).getDay();\n const cells: (number | null)[] = [\n ...Array(firstDay).fill(null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ];\n while (cells.length % 7 !== 0) cells.push(null);\n\n // Range references for in-grid coloring\n const rS = range ? pendingStart ?? rangeS : null;\n const rE = range ? (pendingStart ? hoverDate : rangeE) : null;\n const [loDate, hiDate] = rangeOrder(rS, rE);\n\n return (\n <>\n <div className=\"aui-datepicker-weekdays\">\n {WEEKDAYS.map((w) => (\n <span key={w} className=\"aui-datepicker-weekday\">\n {w}\n </span>\n ))}\n </div>\n <div className=\"aui-datepicker-days\">\n {cells.map((day, i) => {\n if (day === null)\n return (\n <span\n key={`e-${i}`}\n className=\"aui-datepicker-day aui-datepicker-day-empty\"\n />\n );\n\n const date = new Date(viewYear, viewMonth, day);\n const dis = isDisabledDate(date);\n const isToday = isSameDay(date, today);\n const isSel =\n !range && currentSingle ? isSameDay(date, currentSingle) : false;\n const isPending =\n range && pendingStart ? isSameDay(date, pendingStart) : false;\n const isStart =\n range && !pendingStart && loDate\n ? isSameDay(date, loDate)\n : false;\n const isEnd =\n range && !pendingStart && hiDate\n ? isSameDay(date, hiDate)\n : false;\n const inRng = range ? dayInRange(date, loDate, hiDate) : false;\n\n const cls = [\n \"aui-datepicker-day\",\n dis ? \"aui-dp-disabled\" : \"\",\n isToday && !isSel && !isPending && !isStart && !isEnd\n ? \"aui-dp-today\"\n : \"\",\n isSel || isPending ? \"aui-dp-selected\" : \"\",\n isStart ? \"aui-dp-range-start\" : \"\",\n isEnd ? \"aui-dp-range-end\" : \"\",\n inRng ? \"aui-dp-in-range\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n key={day}\n type=\"button\"\n className={cls}\n onClick={() => !dis && handleDaySelect(day)}\n onMouseEnter={() => range && setHoverDate(date)}\n onMouseLeave={() => range && setHoverDate(null)}\n disabled={dis}\n >\n <span>{day}</span>\n </button>\n );\n })}\n </div>\n </>\n );\n };\n\n // ── Render: Month grid ──\n const renderMonthView = () => {\n const rS = range ? pendingStart ?? rangeS : null;\n const rE = range ? (pendingStart ? hoverDate : rangeE) : null;\n const [loDate, hiDate] = rangeOrder(rS, rE);\n\n return (\n <div className=\"aui-datepicker-month-grid\">\n {Array.from({ length: 12 }, (_, i) => {\n const date = new Date(viewYear, i, 1);\n const isCurrent = isSameMonth(date, today);\n const isSel =\n !range && currentSingle ? isSameMonth(date, currentSingle) : false;\n const isPending =\n range && pendingStart ? isSameMonth(date, pendingStart) : false;\n const isStart =\n range && !pendingStart && loDate\n ? isSameMonth(date, loDate)\n : false;\n const isEnd =\n range && !pendingStart && hiDate\n ? isSameMonth(date, hiDate)\n : false;\n const inRng =\n picker === \"month\" ? monthInRange(date, loDate, hiDate) : false;\n\n const cls = [\n \"aui-datepicker-grid-item\",\n isCurrent && !isSel && !isPending && !isStart && !isEnd\n ? \"aui-dp-grid-current\"\n : \"\",\n isSel || isPending ? \"aui-dp-grid-selected\" : \"\",\n isStart ? \"aui-dp-grid-range-start\" : \"\",\n isEnd ? \"aui-dp-grid-range-end\" : \"\",\n inRng ? \"aui-dp-grid-in-range\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n key={i}\n type=\"button\"\n className={cls}\n onClick={() => handleMonthSelect(i)}\n onMouseEnter={() =>\n range && picker === \"month\" && setHoverDate(date)\n }\n onMouseLeave={() =>\n range && picker === \"month\" && setHoverDate(null)\n }\n >\n <span>{i + 1}月</span>\n </button>\n );\n })}\n </div>\n );\n };\n\n // ── Render: Year grid ──\n const renderYearView = () => {\n const rS = range ? pendingStart ?? rangeS : null;\n const rE = range ? (pendingStart ? hoverDate : rangeE) : null;\n const [loDate, hiDate] = rangeOrder(rS, rE);\n\n return (\n <div className=\"aui-datepicker-year-grid\">\n {Array.from({ length: 12 }, (_, i) => {\n const year = decadeStart + i;\n const date = new Date(year, 0, 1);\n const isCurrent = year === today.getFullYear();\n const isSel =\n !range && currentSingle ? isSameYear(date, currentSingle) : false;\n const isPending =\n range && pendingStart ? isSameYear(date, pendingStart) : false;\n const isStart =\n range && !pendingStart && loDate ? isSameYear(date, loDate) : false;\n const isEnd =\n range && !pendingStart && hiDate ? isSameYear(date, hiDate) : false;\n const inRng =\n picker === \"year\" ? yearInRange(year, loDate, hiDate) : false;\n\n const cls = [\n \"aui-datepicker-grid-item\",\n isCurrent && !isSel && !isPending && !isStart && !isEnd\n ? \"aui-dp-grid-current\"\n : \"\",\n isSel || isPending ? \"aui-dp-grid-selected\" : \"\",\n isStart ? \"aui-dp-grid-range-start\" : \"\",\n isEnd ? \"aui-dp-grid-range-end\" : \"\",\n inRng ? \"aui-dp-grid-in-range\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n key={year}\n type=\"button\"\n className={cls}\n onClick={() => handleYearSelect(year)}\n onMouseEnter={() =>\n range && picker === \"year\" && setHoverDate(date)\n }\n onMouseLeave={() =>\n range && picker === \"year\" && setHoverDate(null)\n }\n >\n <span>{year}</span>\n </button>\n );\n })}\n </div>\n );\n };\n\n // ── Trigger ──\n const startText = range && orderedS ? fmt(orderedS, resolvedFmt) : null;\n const endText = range && orderedE ? fmt(orderedE, resolvedFmt) : null;\n const startActive = range && open && !pendingStart;\n const endActive = range && open && !!pendingStart;\n\n const triggerCls = [\n \"aui-datepicker\",\n `aui-datepicker-${size}`,\n open ? \"aui-datepicker-open\" : \"\",\n disabled ? \"aui-datepicker-disabled\" : \"\",\n range ? \"aui-datepicker-range\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const panel = (\n <Layer\n open={open}\n triggerRef={triggerRef}\n matchWidth={false}\n className=\"aui-datepicker-panel\"\n onClickOutside={() => setOpen(false)}\n onEscape={() => {\n setOpen(false);\n setPendingStart(null);\n }}\n >\n {renderHeader()}\n {panelView === \"day\" && renderDayView()}\n {panelView === \"month\" && renderMonthView()}\n {panelView === \"year\" && renderYearView()}\n {picker === \"date\" && panelView === \"day\" && (\n <div className=\"aui-datepicker-footer\">\n <button\n type=\"button\"\n className=\"aui-datepicker-today-btn\"\n onClick={() => {\n if (!isDisabledDate(today)) {\n if (!range) {\n commitSingle(today);\n } else {\n setViewYear(today.getFullYear());\n setViewMonth(today.getMonth());\n }\n }\n }}\n >\n 今天\n </button>\n </div>\n )}\n </Layer>\n );\n\n return (\n <div\n ref={triggerRef}\n className={triggerCls}\n style={style}\n onClick={handleOpen}\n >\n {range ? (\n <>\n <span\n className={[\n \"aui-datepicker-range-input\",\n startActive ? \"aui-datepicker-range-input-active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {startText ? (\n <span className=\"aui-datepicker-text\">{startText}</span>\n ) : (\n <span className=\"aui-datepicker-placeholder\">开始日期</span>\n )}\n </span>\n <span className=\"aui-datepicker-range-sep\">~</span>\n <span\n className={[\n \"aui-datepicker-range-input\",\n endActive ? \"aui-datepicker-range-input-active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {endText ? (\n <span className=\"aui-datepicker-text\">{endText}</span>\n ) : (\n <span className=\"aui-datepicker-placeholder\">结束日期</span>\n )}\n </span>\n </>\n ) : (\n <span className=\"aui-datepicker-value\">\n {displayText ? (\n <span className=\"aui-datepicker-text\">{displayText}</span>\n ) : (\n <span className=\"aui-datepicker-placeholder\">\n {resolvedPlaceholder}\n </span>\n )}\n </span>\n )}\n <span\n className=\"aui-datepicker-suffix\"\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"aui-datepicker-suffix-inner\">\n <span className=\"aui-datepicker-icon\">\n <Icon name=\"calendar\" size={14} />\n </span>\n {showClear && (\n <span className=\"aui-datepicker-clear\" onClick={handleClear}>\n <Icon name=\"x-circle\" size={13} />\n </span>\n )}\n </span>\n </span>\n {panel}\n </div>\n );\n}\n\nDatePicker.displayName = \"DatePicker\";\n","import { useRef, useEffect, useLayoutEffect, useCallback } from \"react\";\n\nconst ITEM_H = 36;\nconst VISIBLE = 5;\n\nexport interface ScrollColumnProps {\n values: number[];\n selected: number;\n disabledValues?: number[];\n onSelect: (val: number) => void;\n label?: string;\n}\n\nexport function ScrollColumn({\n values,\n selected,\n disabledValues = [],\n onSelect,\n label,\n}: ScrollColumnProps) {\n const containerRef = useRef<HTMLUListElement>(null);\n const disabledSet = new Set(disabledValues);\n\n const scrollTo = useCallback((idx: number, smooth: boolean) => {\n const el = containerRef.current;\n if (!el) return;\n const top = idx * ITEM_H;\n if (smooth) {\n el.scrollTo({ top, behavior: \"smooth\" });\n } else {\n el.scrollTop = top;\n }\n }, []);\n\n useLayoutEffect(() => {\n const idx = values.indexOf(selected);\n if (idx >= 0) scrollTo(idx, false);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const idx = values.indexOf(selected);\n if (idx >= 0) scrollTo(idx, true);\n }, [selected, values, scrollTo]);\n\n const handleClick = (val: number, idx: number) => {\n if (disabledSet.has(val)) return;\n onSelect(val);\n scrollTo(idx, true);\n };\n\n return (\n <div className=\"aui-tp-col\">\n <ul\n ref={containerRef}\n className=\"aui-tp-col-inner\"\n style={{ height: ITEM_H * VISIBLE }}\n >\n {values.map((val, idx) => {\n const isSelected = val === selected;\n const isDisabled = disabledSet.has(val);\n const cls = [\n \"aui-tp-item\",\n isSelected ? \"aui-tp-item-selected\" : \"\",\n isDisabled ? \"aui-tp-item-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <li key={val} className={cls} onClick={() => handleClick(val, idx)}>\n {String(val).padStart(2, \"0\")}\n </li>\n );\n })}\n </ul>\n {label && <span className=\"aui-tp-col-label\">{label}</span>}\n </div>\n );\n}\n\nexport interface AmPmColumnProps {\n value: \"AM\" | \"PM\";\n onSelect: (v: \"AM\" | \"PM\") => void;\n}\n\nexport function AmPmColumn({ value, onSelect }: AmPmColumnProps) {\n const options: (\"AM\" | \"PM\")[] = [\"AM\", \"PM\"];\n return (\n <div className=\"aui-tp-col aui-tp-col-ampm\">\n <ul\n className=\"aui-tp-col-inner aui-tp-col-ampm-inner\"\n style={{ height: ITEM_H * VISIBLE }}\n >\n {options.map((v) => (\n <li\n key={v}\n className={`aui-tp-item${\n value === v ? \" aui-tp-item-selected\" : \"\"\n }`}\n onClick={() => onSelect(v)}\n >\n {v}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","import type { TimeValue } from \"./types\";\n\nexport function parseFormat(fmt: string) {\n return {\n showHour: /[Hh]/.test(fmt),\n showMinute: /m/.test(fmt),\n showSecond: /s/.test(fmt),\n use12: /[aA]/.test(fmt),\n };\n}\n\nexport function buildStepValues(total: number, step: number, start = 0): number[] {\n const vals: number[] = [];\n for (let i = start; i < total; i += step) vals.push(i);\n return vals;\n}\n\nexport function parseTimeInput(val: Date | string | null | undefined): TimeValue | null {\n if (!val) return null;\n if (val instanceof Date) {\n return { hour: val.getHours(), minute: val.getMinutes(), second: val.getSeconds() };\n }\n const m = val.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?(?:\\s*(am|pm))?$/i);\n if (!m) return null;\n let hour = parseInt(m[1]);\n const minute = parseInt(m[2]);\n const second = m[3] ? parseInt(m[3]) : 0;\n const ampm = m[4]?.toLowerCase();\n if (ampm === \"pm\" && hour < 12) hour += 12;\n if (ampm === \"am\" && hour === 12) hour = 0;\n return { hour, minute, second };\n}\n\nexport function formatTimeValue(tv: TimeValue, fmt: string): string {\n const { hour, minute, second } = tv;\n const use12 = /[aA]/.test(fmt);\n const ampm = hour < 12 ? \"AM\" : \"PM\";\n const displayH = use12 ? (hour % 12 || 12) : hour;\n const pad = (n: number) => String(n).padStart(2, \"0\");\n\n return fmt\n .replace(/HH/, pad(hour))\n .replace(/H/, String(hour))\n .replace(/hh/, pad(displayH))\n .replace(/h/, String(displayH))\n .replace(/mm/, pad(minute))\n .replace(/ss/, pad(second))\n .replace(/A/, ampm)\n .replace(/a/, ampm.toLowerCase());\n}\n\nexport function timeValueToDate(tv: TimeValue): Date {\n const d = new Date();\n d.setHours(tv.hour, tv.minute, tv.second, 0);\n return d;\n}\n\nexport function resolveFormat(fmt: string | undefined, use12Hours: boolean): string {\n if (fmt) return fmt;\n return use12Hours ? \"hh:mm:ss a\" : \"HH:mm:ss\";\n}\n\nexport function defaultTimeValue(): TimeValue {\n return { hour: 0, minute: 0, second: 0 };\n}\n","import React, { useState, useRef, useCallback } from \"react\";\nimport { Layer } from \"../layer\";\nimport { Icon } from \"../icon\";\nimport { ScrollColumn, AmPmColumn } from \"./scroll-column\";\nimport {\n parseFormat,\n buildStepValues,\n parseTimeInput,\n formatTimeValue,\n timeValueToDate,\n resolveFormat,\n defaultTimeValue,\n} from \"./utils\";\nimport type { TimeValue, TimePickerProps, TimeRangePickerProps } from \"./types\";\nimport \"./timepicker.css\";\n\nexport type {\n TimePickerSize,\n TimePickerProps,\n TimeRangePickerProps,\n TimeValue,\n} from \"./types\";\n\n// ── Time Panel ─────────────────────────────────────────────────────────────────\n\ninterface TimePanelProps {\n value: TimeValue;\n fmt: string;\n hourStep: number;\n minuteStep: number;\n secondStep: number;\n disabledHours?: () => number[];\n disabledMinutes?: (h: number) => number[];\n disabledSeconds?: (h: number, m: number) => number[];\n onChange: (tv: TimeValue) => void;\n onConfirm: () => void;\n}\n\nfunction TimePanel({\n value,\n fmt,\n hourStep,\n minuteStep,\n secondStep,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n onChange,\n onConfirm,\n}: TimePanelProps) {\n const { showHour, showMinute, showSecond, use12 } = parseFormat(fmt);\n const ampm: \"AM\" | \"PM\" = value.hour < 12 ? \"AM\" : \"PM\";\n\n const hours12 = buildStepValues(12, hourStep, 1);\n const hours24 = buildStepValues(24, hourStep);\n const minutes = buildStepValues(60, minuteStep);\n const seconds = buildStepValues(60, secondStep);\n\n const dHours = disabledHours?.() ?? [];\n const dMinutes = disabledMinutes?.(value.hour) ?? [];\n const dSeconds = disabledSeconds?.(value.hour, value.minute) ?? [];\n\n const display12H = value.hour % 12 || 12;\n\n const setHour = (h: number) => onChange({ ...value, hour: h });\n const setMinute = (m: number) => onChange({ ...value, minute: m });\n const setSecond = (s: number) => onChange({ ...value, second: s });\n\n const setAmPm = (v: \"AM\" | \"PM\") => {\n let h = value.hour;\n if (v === \"PM\" && h < 12) h += 12;\n if (v === \"AM\" && h >= 12) h -= 12;\n onChange({ ...value, hour: h });\n };\n\n const set12H = (h: number) => {\n const base = ampm === \"PM\" ? 12 : 0;\n const actual = h === 12 ? base : h + base;\n onChange({ ...value, hour: actual });\n };\n\n return (\n <div className=\"aui-tp-panel\">\n <div className=\"aui-tp-columns\">\n {showHour && (\n <ScrollColumn\n values={use12 ? hours12 : hours24}\n selected={use12 ? display12H : value.hour}\n disabledValues={dHours}\n onSelect={use12 ? set12H : setHour}\n label={use12 ? undefined : \"时\"}\n />\n )}\n {showMinute && (\n <ScrollColumn\n values={minutes}\n selected={value.minute}\n disabledValues={dMinutes}\n onSelect={setMinute}\n label={showHour ? \"分\" : undefined}\n />\n )}\n {showSecond && (\n <ScrollColumn\n values={seconds}\n selected={value.second}\n disabledValues={dSeconds}\n onSelect={setSecond}\n label=\"秒\"\n />\n )}\n {use12 && <AmPmColumn value={ampm} onSelect={setAmPm} />}\n </div>\n <div className=\"aui-tp-footer\">\n <button type=\"button\" className=\"aui-tp-ok-btn\" onClick={onConfirm}>\n 确定\n </button>\n </div>\n </div>\n );\n}\n\n// ── TimePicker ─────────────────────────────────────────────────────────────────\n\nfunction TimePickerBase({\n value: controlledValue,\n defaultValue,\n onChange,\n format: fmtProp,\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n clearable = false,\n disabled = false,\n size = \"md\",\n placeholder = \"请选择时间\",\n style,\n className,\n}: TimePickerProps) {\n const fmt = resolveFormat(fmtProp, use12Hours);\n const controlledRef = useRef(controlledValue !== undefined);\n if (controlledValue !== undefined) controlledRef.current = true;\n const isControlled = controlledRef.current;\n\n const initVal =\n parseTimeInput(isControlled ? controlledValue : defaultValue) ?? null;\n const [internalValue, setInternalValue] = useState<TimeValue | null>(initVal);\n const [panelValue, setPanelValue] = useState<TimeValue>(defaultTimeValue());\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const currentValue = isControlled\n ? parseTimeInput(controlledValue) ?? null\n : internalValue;\n\n const handleOpen = () => {\n if (disabled) return;\n setPanelValue(currentValue ?? defaultTimeValue());\n setOpen(true);\n };\n\n const handleConfirm = useCallback(() => {\n if (!isControlled) setInternalValue(panelValue);\n onChange?.(timeValueToDate(panelValue), formatTimeValue(panelValue, fmt));\n setOpen(false);\n }, [panelValue, fmt, isControlled, onChange]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) setInternalValue(null);\n onChange?.(null, \"\");\n };\n\n const displayText = currentValue ? formatTimeValue(currentValue, fmt) : \"\";\n const showClear = clearable && !!currentValue && !disabled;\n\n const triggerCls = [\n \"aui-tp-trigger\",\n `aui-tp-trigger-${size}`,\n open ? \"aui-tp-trigger-open\" : \"\",\n disabled ? \"aui-tp-trigger-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <>\n <div\n ref={triggerRef}\n className={triggerCls}\n style={style}\n onClick={handleOpen}\n >\n <span className={displayText ? \"aui-tp-value\" : \"aui-tp-placeholder\"}>\n {displayText || placeholder}\n </span>\n <span className=\"aui-tp-suffix\">\n {showClear && (\n <span className=\"aui-tp-clear\" onClick={handleClear}>\n <Icon name=\"x-circle\" size={14} />\n </span>\n )}\n <span className=\"aui-tp-clock-icon\">\n <Icon name=\"clock\" size={14} />\n </span>\n </span>\n </div>\n <Layer\n open={open}\n triggerRef={triggerRef}\n matchWidth={false}\n onClickOutside={() => setOpen(false)}\n onEscape={() => setOpen(false)}\n >\n <TimePanel\n value={panelValue}\n fmt={fmt}\n hourStep={hourStep}\n minuteStep={minuteStep}\n secondStep={secondStep}\n disabledHours={disabledHours}\n disabledMinutes={disabledMinutes}\n disabledSeconds={disabledSeconds}\n onChange={setPanelValue}\n onConfirm={handleConfirm}\n />\n </Layer>\n </>\n );\n}\n\n// ── TimePicker.RangePicker ─────────────────────────────────────────────────────\n\nfunction RangePicker({\n value: controlledValue,\n defaultValue,\n onChange,\n format: fmtProp,\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n clearable = false,\n disabled = false,\n size = \"md\",\n placeholder = [\"开始时间\", \"结束时间\"],\n style,\n className,\n}: TimeRangePickerProps) {\n const fmt = resolveFormat(fmtProp, use12Hours);\n const controlledRef = useRef(controlledValue !== undefined);\n if (controlledValue !== undefined) controlledRef.current = true;\n const isControlled = controlledRef.current;\n\n const initStart =\n parseTimeInput(isControlled ? controlledValue?.[0] : defaultValue?.[0]) ??\n null;\n const initEnd =\n parseTimeInput(isControlled ? controlledValue?.[1] : defaultValue?.[1]) ??\n null;\n const [internalStart, setInternalStart] = useState<TimeValue | null>(\n initStart\n );\n const [internalEnd, setInternalEnd] = useState<TimeValue | null>(initEnd);\n const [activePanel, setActivePanel] = useState<\"start\" | \"end\" | null>(null);\n const [panelValue, setPanelValue] = useState<TimeValue>(defaultTimeValue());\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const startVal = isControlled\n ? parseTimeInput(controlledValue?.[0]) ?? null\n : internalStart;\n const endVal = isControlled\n ? parseTimeInput(controlledValue?.[1]) ?? null\n : internalEnd;\n\n const handleOpen = (panel: \"start\" | \"end\") => {\n if (disabled) return;\n const current = panel === \"start\" ? startVal : endVal;\n setPanelValue(current ?? defaultTimeValue());\n setActivePanel(panel);\n };\n\n const handleConfirm = useCallback(() => {\n const newStart = activePanel === \"start\" ? panelValue : startVal;\n const newEnd = activePanel === \"end\" ? panelValue : endVal;\n if (!isControlled) {\n if (activePanel === \"start\") setInternalStart(panelValue);\n else setInternalEnd(panelValue);\n }\n onChange?.(\n [\n newStart ? timeValueToDate(newStart) : null,\n newEnd ? timeValueToDate(newEnd) : null,\n ],\n [\n newStart ? formatTimeValue(newStart, fmt) : \"\",\n newEnd ? formatTimeValue(newEnd, fmt) : \"\",\n ]\n );\n setActivePanel(null);\n }, [activePanel, panelValue, startVal, endVal, fmt, isControlled, onChange]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalStart(null);\n setInternalEnd(null);\n }\n onChange?.([null, null], [\"\", \"\"]);\n };\n\n const showClear = clearable && (!!startVal || !!endVal) && !disabled;\n\n const triggerCls = [\n \"aui-tp-trigger aui-tp-trigger-range\",\n `aui-tp-trigger-${size}`,\n activePanel ? \"aui-tp-trigger-open\" : \"\",\n disabled ? \"aui-tp-trigger-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <>\n <div ref={triggerRef} className={triggerCls} style={style}>\n <span\n className={`aui-tp-range-part${\n activePanel === \"start\" ? \" aui-tp-range-active\" : \"\"\n }`}\n onClick={() => handleOpen(\"start\")}\n >\n <span className={startVal ? \"aui-tp-value\" : \"aui-tp-placeholder\"}>\n {startVal ? formatTimeValue(startVal, fmt) : placeholder[0]}\n </span>\n </span>\n <span className=\"aui-tp-range-sep\">—</span>\n <span\n className={`aui-tp-range-part${\n activePanel === \"end\" ? \" aui-tp-range-active\" : \"\"\n }`}\n onClick={() => handleOpen(\"end\")}\n >\n <span className={endVal ? \"aui-tp-value\" : \"aui-tp-placeholder\"}>\n {endVal ? formatTimeValue(endVal, fmt) : placeholder[1]}\n </span>\n </span>\n <span className=\"aui-tp-suffix\">\n {showClear && (\n <span className=\"aui-tp-clear\" onClick={handleClear}>\n <Icon name=\"x-circle\" size={14} />\n </span>\n )}\n <span className=\"aui-tp-clock-icon\">\n <Icon name=\"clock\" size={14} />\n </span>\n </span>\n </div>\n <Layer\n open={activePanel !== null}\n triggerRef={triggerRef}\n matchWidth={false}\n onClickOutside={() => setActivePanel(null)}\n onEscape={() => setActivePanel(null)}\n >\n <TimePanel\n value={panelValue}\n fmt={fmt}\n hourStep={hourStep}\n minuteStep={minuteStep}\n secondStep={secondStep}\n onChange={setPanelValue}\n onConfirm={handleConfirm}\n />\n </Layer>\n </>\n );\n}\n\nRangePicker.displayName = \"TimePicker.RangePicker\";\n\nexport const TimePicker = Object.assign(TimePickerBase, {\n RangePicker,\n displayName: \"TimePicker\",\n});\n","import React from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./progress.css\";\n\n// ── Types ──────────────────────────────────────────────────────────────────────\nexport type ProgressType = \"line\" | \"line-inner\" | \"circle\" | \"dashboard\";\nexport type ProgressStatus =\n | \"normal\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"active\";\nexport type ProgressSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ProgressProps {\n percent?: number;\n type?: ProgressType;\n status?: ProgressStatus;\n strokeWidth?: number;\n showInfo?: boolean;\n format?: (percent: number) => React.ReactNode;\n size?: ProgressSize;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// Badge icon: colored circle + symbol inside\nfunction StatusBadge({ status }: { status: ProgressStatus }) {\n const map: Record<string, { cls: string; icon: React.ReactNode }> = {\n success: { cls: \"aui-progress-badge-success\", icon: <Icon name=\"check\" /> },\n error: { cls: \"aui-progress-badge-error\", icon: <Icon name=\"x\" /> },\n warning: { cls: \"aui-progress-badge-warning\", icon: <Icon name=\"warn\" /> },\n };\n const cfg = map[status];\n if (!cfg) return null;\n return <span className={`aui-progress-badge ${cfg.cls}`}>{cfg.icon}</span>;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\nfunction clamp(v: number) {\n return Math.min(100, Math.max(0, v));\n}\n\nconst lineHeights: Record<ProgressSize, number> = { sm: 4, md: 8, lg: 12 };\n\n// ── Line Progress ──────────────────────────────────────────────────────────────\nfunction LineProgress({\n pct,\n status,\n strokeWidth,\n size = \"md\",\n showInfo,\n infoNode,\n}: {\n pct: number;\n status: ProgressStatus;\n strokeWidth?: number;\n size: ProgressSize;\n showInfo: boolean;\n infoNode: React.ReactNode;\n}) {\n const h = `${strokeWidth ?? lineHeights[size]}px`;\n const hasBadge =\n status === \"success\" || status === \"error\" || status === \"warning\";\n\n return (\n <div className={`aui-progress-line aui-progress-${status}`}>\n <div className=\"aui-progress-outer\" style={{ height: h }}>\n <div\n className={`aui-progress-bg${status === \"active\" ? \" aui-progress-active\" : \"\"}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n {showInfo && (\n <span className=\"aui-progress-text\">\n {hasBadge ? <StatusBadge status={status} /> : infoNode}\n </span>\n )}\n </div>\n );\n}\n\n// ── Line-Inner Progress ────────────────────────────────────────────────────────\nfunction LineInnerProgress({\n pct,\n status,\n strokeWidth,\n showInfo,\n}: {\n pct: number;\n status: ProgressStatus;\n strokeWidth?: number;\n showInfo: boolean;\n}) {\n const h = `${strokeWidth ?? 22}px`;\n // show text inside bar when fill is wide enough (≥10%)\n const textInside = pct >= 10;\n const textOutside = pct > 0 && pct < 10;\n\n return (\n <div className={`aui-progress-line-inner aui-progress-${status}`}>\n <div className=\"aui-progress-outer\" style={{ height: h }}>\n <div\n className={`aui-progress-bg${status === \"active\" ? \" aui-progress-active\" : \"\"}`}\n style={{ width: `${pct}%` }}\n >\n {showInfo && textInside && (\n <span className=\"aui-progress-inner-label aui-progress-inner-label-in\">\n {pct}%\n </span>\n )}\n </div>\n {showInfo && textOutside && (\n <span\n className=\"aui-progress-inner-label aui-progress-inner-label-out\"\n style={{ left: `calc(${pct}% + 6px)` }}\n >\n {pct}%\n </span>\n )}\n {showInfo && pct === 0 && (\n <span\n className=\"aui-progress-inner-label aui-progress-inner-label-out\"\n style={{ left: 6 }}\n >\n 0%\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ── Circle / Dashboard Progress ────────────────────────────────────────────────\nfunction CircleProgress({\n pct,\n status,\n strokeWidth = 6,\n type,\n showInfo,\n infoNode,\n}: {\n pct: number;\n status: ProgressStatus;\n strokeWidth?: number;\n type: \"circle\" | \"dashboard\";\n showInfo: boolean;\n infoNode: React.ReactNode;\n}) {\n const size = 80;\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n\n const gapDegree = type === \"dashboard\" ? 75 : 0;\n const arcLen = circumference * ((360 - gapDegree) / 360);\n const offset = circumference * (gapDegree / 2 / 360);\n const fillLen = arcLen * (pct / 100);\n const emptyLen = arcLen - fillLen;\n const rotate = 90 + gapDegree / 2;\n\n const hasBadge =\n status === \"success\" || status === \"error\" || status === \"warning\";\n\n return (\n <div className={`aui-progress-circle aui-progress-${status}`}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle\n className=\"aui-progress-circle-track\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeDasharray={`${arcLen} ${circumference - arcLen}`}\n strokeDashoffset={-offset}\n strokeLinecap=\"round\"\n style={{\n transform: `rotate(${rotate}deg)`,\n transformOrigin: \"50% 50%\",\n }}\n />\n {pct > 0 && (\n <circle\n className=\"aui-progress-circle-fill\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeDasharray={`${fillLen} ${emptyLen + (circumference - arcLen)}`}\n strokeDashoffset={-offset}\n strokeLinecap=\"round\"\n style={{\n transform: `rotate(${rotate}deg)`,\n transformOrigin: \"50% 50%\",\n transition: \"stroke-dasharray 0.3s ease\",\n }}\n />\n )}\n </svg>\n {showInfo && (\n <div className=\"aui-progress-circle-info\">\n {hasBadge ? <StatusBadge status={status} /> : infoNode}\n </div>\n )}\n </div>\n );\n}\n\n// ── Progress ───────────────────────────────────────────────────────────────────\nexport function Progress({\n percent = 0,\n type = \"line\",\n status = \"normal\",\n strokeWidth,\n showInfo = true,\n format,\n size = \"md\",\n style,\n className,\n}: ProgressProps) {\n const pct = clamp(percent);\n\n const resolvedStatus: ProgressStatus =\n status === \"normal\" && pct === 100 ? \"success\" : status;\n\n const defaultInfo = `${pct}%`;\n const infoNode = format ? format(pct) : defaultInfo;\n\n const cls = [\"aui-progress\", `aui-progress-type-${type}`, className ?? \"\"]\n .filter(Boolean)\n .join(\" \");\n\n if (type === \"circle\" || type === \"dashboard\") {\n return (\n <div className={cls} style={style}>\n <CircleProgress\n pct={pct}\n status={resolvedStatus}\n strokeWidth={strokeWidth}\n type={type}\n showInfo={showInfo}\n infoNode={infoNode}\n />\n </div>\n );\n }\n\n if (type === \"line-inner\") {\n return (\n <div className={cls} style={style}>\n <LineInnerProgress\n pct={pct}\n status={resolvedStatus}\n strokeWidth={strokeWidth}\n showInfo={showInfo}\n />\n </div>\n );\n }\n\n return (\n <div className={cls} style={style}>\n <LineProgress\n pct={pct}\n status={resolvedStatus}\n strokeWidth={strokeWidth}\n size={size}\n showInfo={showInfo}\n infoNode={infoNode}\n />\n </div>\n );\n}\n","import type { AnyUploadFile, UploadRequestOption } from \"./types\";\n\nexport function genUid() {\n return `upload-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n}\n\nexport function formatFileSize(size: number) {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function isImageType(file: AnyUploadFile) {\n return (\n (file.type && file.type.startsWith(\"image/\")) ||\n /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(file.name)\n );\n}\n\nexport function defaultRequest<T>(options: UploadRequestOption<T>) {\n const {\n action,\n file,\n filename = \"file\",\n headers,\n data,\n method = \"POST\",\n onProgress,\n onSuccess,\n onError,\n } = options;\n\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append(filename, file);\n if (data) {\n Object.entries(data).forEach(([k, v]) => formData.append(k, v));\n }\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.total > 0 && onProgress) {\n onProgress({ percent: Math.round((e.loaded / e.total) * 100) });\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n let body: T;\n try {\n body = JSON.parse(xhr.responseText) as T;\n } catch {\n body = xhr.responseText as unknown as T;\n }\n onSuccess?.(body, xhr);\n } else {\n onError?.(new Error(`Upload failed: ${xhr.status}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n onError?.(new Error(\"Network error\"));\n });\n\n xhr.open(method, action);\n if (headers) {\n Object.entries(headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n }\n xhr.send(formData);\n}\n","import React from \"react\";\nimport { Icon } from \"../icon\";\nimport { Progress } from \"../progress\";\nimport type { AnyUploadFile, UploadListType } from \"./types\";\nimport { formatFileSize, isImageType } from \"./utils\";\n\nexport interface FileItemProps {\n file: AnyUploadFile;\n listType: UploadListType;\n showPreviewIcon: boolean;\n showRemoveIcon: boolean;\n onRemove: (file: AnyUploadFile) => void;\n onPreview?: (file: AnyUploadFile) => void;\n}\n\nfunction statusCls(file: AnyUploadFile) {\n if (file.status === \"error\") return \"aui-upload-file-error\";\n if (file.status === \"uploading\") return \"aui-upload-file-uploading\";\n return \"aui-upload-file-done\";\n}\n\nfunction CardItem({\n file,\n showPreviewIcon,\n showRemoveIcon,\n onRemove,\n onPreview,\n}: FileItemProps) {\n const isImage = isImageType(file);\n const thumbSrc = file.thumbUrl || file.url;\n\n return (\n <div className={`aui-upload-card-item ${statusCls(file)}`}>\n {thumbSrc ? (\n <img src={thumbSrc} alt={file.name} className=\"aui-upload-card-thumb\" />\n ) : (\n <div className=\"aui-upload-card-placeholder\">\n <Icon name={isImage ? \"file-image\" : \"file\"} size={28} />\n </div>\n )}\n\n {file.status === \"uploading\" && (\n <div className=\"aui-upload-card-progress\">\n <Progress percent={file.percent ?? 0} showInfo={false} size=\"sm\" />\n <span className=\"aui-upload-card-percent\">{file.percent ?? 0}%</span>\n </div>\n )}\n\n <div className=\"aui-upload-card-mask\">\n {showPreviewIcon && (file.url || file.thumbUrl) && (\n <button\n type=\"button\"\n className=\"aui-upload-card-action\"\n onClick={() => onPreview?.(file)}\n title=\"预览\"\n >\n <Icon name=\"eye\" size={16} />\n </button>\n )}\n {showRemoveIcon && (\n <button\n type=\"button\"\n className=\"aui-upload-card-action aui-upload-card-action-remove\"\n onClick={() => onRemove(file)}\n title=\"删除\"\n >\n <Icon name=\"trash\" size={16} />\n </button>\n )}\n </div>\n\n {file.status === \"error\" && (\n <div className=\"aui-upload-card-error-overlay\">\n <Icon name=\"circle-x\" size={20} />\n </div>\n )}\n </div>\n );\n}\n\nfunction ListItem({\n file,\n listType,\n showPreviewIcon,\n showRemoveIcon,\n onRemove,\n onPreview,\n}: FileItemProps) {\n const isImage = isImageType(file);\n const thumbSrc = file.thumbUrl || file.url;\n const isPicture = listType === \"picture\";\n\n return (\n <div className={`aui-upload-list-item ${statusCls(file)}`}>\n {isPicture ? (\n <div className=\"aui-upload-list-thumb\">\n {thumbSrc ? (\n <img src={thumbSrc} alt={file.name} />\n ) : (\n <Icon name={isImage ? \"file-image\" : \"file\"} size={16} />\n )}\n </div>\n ) : (\n <span className=\"aui-upload-list-icon\">\n {file.status === \"uploading\" ? (\n <Icon name=\"circle-loading\" size={14} className=\"aui-spin-anim\" />\n ) : file.status === \"error\" ? (\n <Icon name=\"circle-x\" size={14} />\n ) : (\n <Icon name=\"file\" size={14} />\n )}\n </span>\n )}\n\n <div className=\"aui-upload-list-info\">\n <a\n className=\"aui-upload-list-name\"\n href={file.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n title={file.name}\n onClick={\n file.url\n ? undefined\n : (e) => {\n e.preventDefault();\n onPreview?.(file);\n }\n }\n >\n {file.name}\n </a>\n {file.size !== undefined && (\n <span className=\"aui-upload-list-size\">\n {formatFileSize(file.size)}\n </span>\n )}\n </div>\n\n {file.status === \"uploading\" && (\n <div className=\"aui-upload-list-progress\">\n <Progress percent={file.percent ?? 0} showInfo={false} size=\"sm\" />\n </div>\n )}\n\n {file.status === \"error\" && (\n <span\n className=\"aui-upload-list-error-msg\"\n title={String(file.error ?? \"上传失败\")}\n >\n 上传失败\n </span>\n )}\n\n <div className=\"aui-upload-list-actions\">\n {showPreviewIcon && (file.url || file.thumbUrl) && (\n <button\n type=\"button\"\n className=\"aui-upload-action-btn\"\n onClick={() => onPreview?.(file)}\n title=\"预览\"\n >\n <Icon name=\"eye\" size={14} />\n </button>\n )}\n {showRemoveIcon && (\n <button\n type=\"button\"\n className=\"aui-upload-action-btn\"\n onClick={() => onRemove(file)}\n title=\"删除\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function FileItem(props: FileItemProps) {\n if (props.listType === \"picture-card\") return <CardItem {...props} />;\n return <ListItem {...props} />;\n}\n","import React, { useRef, useState, useId } from \"react\";\nimport { Icon } from \"../icon\";\nimport { FileItem } from \"./file-item\";\nimport { useUpload } from \"./use-upload\";\nimport type { UploadProps } from \"./types\";\nimport \"./upload.css\";\n\nexport type {\n UploadListType,\n UploadStatus,\n UploadFile,\n UploadChangeParam,\n UploadRequestOption,\n UploadProps,\n} from \"./types\";\n\nfunction UploadBase<T = unknown>(props: UploadProps<T>) {\n const {\n accept,\n disabled = false,\n listType = \"text\",\n multiple = false,\n showUploadList = true,\n children,\n className,\n style,\n onPreview,\n drag = false,\n } = props;\n\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n const { fileList, handleFiles, handleRemove } = useUpload(props);\n\n const showList = showUploadList !== false;\n const showPreviewIcon =\n typeof showUploadList === \"object\"\n ? showUploadList.showPreviewIcon ?? true\n : true;\n const showRemoveIcon =\n typeof showUploadList === \"object\"\n ? showUploadList.showRemoveIcon ?? true\n : true;\n\n const triggerSelect = () => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n };\n\n const onDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled) setDragging(true);\n };\n const onDragLeave = () => setDragging(false);\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n if (disabled) return;\n const files = Array.from(e.dataTransfer.files);\n handleFiles(multiple ? files : files.slice(0, 1));\n };\n\n const isCard = listType === \"picture-card\";\n const reachedMax =\n props.maxCount !== undefined && fileList.length >= props.maxCount;\n\n const defaultBtn = (\n <button type=\"button\" className=\"aui-upload-btn\" disabled={disabled}>\n <Icon name=\"upload\" size={14} />\n <span>点击上传</span>\n </button>\n );\n\n const wrapperCls = [\n \"aui-upload\",\n drag ? \"aui-upload-drag-zone\" : \"\",\n drag && dragging ? \"aui-upload-drag-over\" : \"\",\n disabled ? \"aui-upload-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const sharedItemProps = {\n listType,\n showPreviewIcon,\n showRemoveIcon,\n onRemove: handleRemove,\n onPreview,\n };\n\n return (\n <div\n className={`aui-upload-wrapper${\n isCard ? \" aui-upload-wrapper-card\" : \"\"\n }`}\n style={style}\n >\n {isCard ? (\n <div className=\"aui-upload-card-list\">\n {fileList.map((file) => (\n <FileItem key={file.uid} file={file} {...sharedItemProps} />\n ))}\n {!reachedMax && (\n <div\n className={`aui-upload-card-trigger ${\n disabled ? \"aui-upload-disabled\" : \"\"\n }`}\n onClick={triggerSelect}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <Icon name=\"plus\" size={20} />\n <span>上传</span>\n </div>\n )}\n </div>\n ) : (\n <>\n {!reachedMax && (\n <div\n className={wrapperCls}\n onClick={drag ? triggerSelect : undefined}\n onDragOver={drag ? onDragOver : undefined}\n onDragLeave={drag ? onDragLeave : undefined}\n onDrop={drag ? onDrop : undefined}\n >\n {drag ? (\n <div className=\"aui-upload-drag-content\">\n {children ?? (\n <>\n <Icon\n name=\"cloud-upload\"\n size={40}\n className=\"aui-upload-drag-icon\"\n />\n <p className=\"aui-upload-drag-text\">\n 点击或拖拽文件到此区域上传\n </p>\n <p className=\"aui-upload-drag-hint\">支持单次或批量上传</p>\n </>\n )}\n </div>\n ) : (\n <span onClick={triggerSelect}>{children ?? defaultBtn}</span>\n )}\n </div>\n )}\n {showList && fileList.length > 0 && (\n <div className={`aui-upload-list aui-upload-list-${listType}`}>\n {fileList.map((file) => (\n <FileItem key={file.uid} file={file} {...sharedItemProps} />\n ))}\n </div>\n )}\n </>\n )}\n\n <input\n id={inputId}\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"aui-upload-input\"\n onChange={onInputChange}\n disabled={disabled}\n />\n </div>\n );\n}\n\nfunction Dragger<T = unknown>(props: Omit<UploadProps<T>, \"drag\">) {\n return <UploadBase<T> {...props} drag />;\n}\nDragger.displayName = \"Upload.Dragger\";\n\nexport const Upload = Object.assign(UploadBase, {\n Dragger,\n displayName: \"Upload\",\n});\n","import { useState, useCallback } from \"react\";\nimport type { UploadFile, UploadProps, UploadRequestOption } from \"./types\";\nimport { genUid, defaultRequest } from \"./utils\";\n\nexport function useUpload<T>(props: UploadProps<T>) {\n const {\n action,\n beforeUpload,\n customRequest,\n defaultFileList,\n fileList: controlledFileList,\n maxCount,\n name = \"file\",\n onChange,\n onRemove,\n } = props;\n\n const isControlled = controlledFileList !== undefined;\n const [internalList, setInternalList] = useState<UploadFile<T>[]>(\n defaultFileList ?? []\n );\n\n const fileList = isControlled ? controlledFileList! : internalList;\n\n const updateList = useCallback(\n (updater: (prev: UploadFile<T>[]) => UploadFile<T>[]) => {\n if (!isControlled) setInternalList(updater);\n },\n [isControlled]\n );\n\n const updateFile = useCallback(\n (id: string, patch: Partial<UploadFile<T>>) => {\n updateList((prev) =>\n prev.map((f) => (f.uid === id ? { ...f, ...patch } : f))\n );\n const current = fileList.find((f) => f.uid === id);\n if (current && onChange) {\n const updated = { ...current, ...patch };\n onChange({\n file: updated,\n fileList: fileList.map((f) => (f.uid === id ? updated : f)),\n });\n }\n },\n [fileList, onChange, updateList]\n );\n\n const handleFiles = useCallback(\n async (files: File[]) => {\n const validFiles = maxCount\n ? files.slice(0, maxCount - fileList.length)\n : files;\n if (validFiles.length === 0) return;\n\n const newItems: UploadFile<T>[] = [];\n\n for (const raw of validFiles) {\n let picked: File | boolean = raw;\n\n if (beforeUpload) {\n try {\n const result = await beforeUpload(raw, validFiles);\n if (result === false) continue;\n if (result instanceof File) picked = result;\n } catch {\n continue;\n }\n }\n\n const actualFile = picked instanceof File ? picked : raw;\n const thumbUrl = actualFile.type.startsWith(\"image/\")\n ? URL.createObjectURL(actualFile)\n : undefined;\n\n newItems.push({\n uid: genUid(),\n name: actualFile.name,\n size: actualFile.size,\n type: actualFile.type,\n status: \"uploading\",\n percent: 0,\n originFileObj: actualFile,\n thumbUrl,\n });\n }\n\n if (newItems.length === 0) return;\n\n updateList((prev) => [...prev, ...newItems]);\n if (onChange) {\n onChange({\n file: newItems[newItems.length - 1],\n fileList: [...fileList, ...newItems],\n });\n }\n\n for (const item of newItems) {\n const doUpload = customRequest ?? defaultRequest;\n\n let resolvedAction = \"\";\n if (typeof action === \"string\") resolvedAction = action;\n else if (typeof action === \"function\") {\n try {\n resolvedAction = await action(item.originFileObj!);\n } catch {\n /* no-op */\n }\n }\n\n if (!resolvedAction && !customRequest) {\n updateFile(item.uid, { status: \"done\", percent: 100 });\n continue;\n }\n\n doUpload({\n action: resolvedAction,\n file: item.originFileObj!,\n filename: name,\n onProgress: ({ percent }) => updateFile(item.uid, { percent }),\n onSuccess: (body) =>\n updateFile(item.uid, {\n status: \"done\",\n percent: 100,\n response: body,\n }),\n onError: (err) =>\n updateFile(item.uid, { status: \"error\", error: err.message }),\n } as UploadRequestOption<T>);\n }\n },\n [\n action,\n beforeUpload,\n customRequest,\n fileList,\n maxCount,\n name,\n onChange,\n updateFile,\n updateList,\n ]\n );\n\n const handleRemove = useCallback(\n async (file: UploadFile<T>) => {\n if (onRemove) {\n const result = await onRemove(file);\n if (result === false) return;\n }\n updateList((prev) => prev.filter((f) => f.uid !== file.uid));\n if (onChange) {\n onChange({\n file: { ...file, status: \"removed\" },\n fileList: fileList.filter((f) => f.uid !== file.uid),\n });\n }\n },\n [fileList, onChange, onRemove, updateList]\n );\n\n return { fileList, handleFiles, handleRemove };\n}\n","import React, { useState, useCallback, useMemo } from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./tree.css\";\n\nexport interface TreeNodeData {\n key: string | number;\n label: React.ReactNode;\n children?: TreeNodeData[];\n disabled?: boolean;\n disableCheckbox?: boolean;\n icon?: React.ReactNode;\n}\n\nexport interface TreeProps {\n data: TreeNodeData[];\n defaultExpandAll?: boolean;\n expandedKeys?: (string | number)[];\n defaultExpandedKeys?: (string | number)[];\n onExpand?: (keys: (string | number)[]) => void;\n selectable?: boolean;\n selectedKeys?: (string | number)[];\n defaultSelectedKeys?: (string | number)[];\n onSelect?: (keys: (string | number)[]) => void;\n checkable?: boolean;\n checkedKeys?: (string | number)[];\n defaultCheckedKeys?: (string | number)[];\n onCheck?: (keys: (string | number)[]) => void;\n line?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction getAllLeafKeys(node: TreeNodeData): (string | number)[] {\n if (!node.children || node.children.length === 0) return [node.key];\n return node.children.flatMap(getAllLeafKeys);\n}\n\nfunction collectAllParentKeys(data: TreeNodeData[]): (string | number)[] {\n const keys: (string | number)[] = [];\n function traverse(nodes: TreeNodeData[]) {\n for (const node of nodes) {\n if (node.children && node.children.length > 0) {\n keys.push(node.key);\n traverse(node.children);\n }\n }\n }\n traverse(data);\n return keys;\n}\n\ntype CheckState = \"none\" | \"indeterminate\" | \"checked\";\n\nfunction getCheckState(\n node: TreeNodeData,\n checkedSet: Set<string | number>\n): CheckState {\n const leaves = getAllLeafKeys(node);\n if (leaves.length === 0) return \"none\";\n const count = leaves.filter((k) => checkedSet.has(k)).length;\n if (count === 0) return \"none\";\n if (count === leaves.length) return \"checked\";\n return \"indeterminate\";\n}\n\n// ── Inline Checkbox ────────────────────────────────────────────────────────────\n\nfunction TreeCheckbox({\n checkState,\n disabled,\n onChange,\n}: {\n checkState: CheckState;\n disabled?: boolean;\n onChange: () => void;\n}) {\n const cls = [\n \"aui-tree-checkbox\",\n checkState === \"checked\" ? \"aui-tree-checkbox-checked\" : \"\",\n checkState === \"indeterminate\" ? \"aui-tree-checkbox-indeterminate\" : \"\",\n disabled ? \"aui-tree-checkbox-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span\n className={cls}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) onChange();\n }}\n >\n {checkState === \"checked\" && (\n <svg viewBox=\"0 0 12 12\" fill=\"none\">\n <polyline\n points=\"2,6.5 4.8,9.5 10,3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n {checkState === \"indeterminate\" && (\n <svg viewBox=\"0 0 12 12\" fill=\"none\">\n <line\n x1=\"2\"\n y1=\"6\"\n x2=\"10\"\n y2=\"6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </span>\n );\n}\n\n// ── TreeNode ───────────────────────────────────────────────────────────────────\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expandedSet: Set<string | number>;\n selectedSet: Set<string | number>;\n checkedSet: Set<string | number>;\n checkable: boolean;\n selectable: boolean;\n line: boolean;\n onToggleExpand: (key: string | number) => void;\n onToggleSelect: (key: string | number) => void;\n onToggleCheck: (node: TreeNodeData) => void;\n}\n\nfunction TreeNode({\n node,\n depth,\n expandedSet,\n selectedSet,\n checkedSet,\n checkable,\n selectable,\n line,\n onToggleExpand,\n onToggleSelect,\n onToggleCheck,\n}: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = expandedSet.has(node.key);\n const isSelected = selectedSet.has(node.key);\n const checkState = checkable ? getCheckState(node, checkedSet) : \"none\";\n\n const contentCls = [\n \"aui-tree-node-content\",\n isSelected ? \"aui-tree-node-selected\" : \"\",\n node.disabled ? \"aui-tree-node-disabled\" : \"\",\n selectable && !node.disabled ? \"aui-tree-node-selectable\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"aui-tree-node\">\n <div\n className={contentCls}\n style={{ paddingLeft: depth * 22 + 4 }}\n onClick={() => {\n if (node.disabled) return;\n if (selectable) onToggleSelect(node.key);\n }}\n >\n <span\n className={[\n \"aui-tree-switcher\",\n hasChildren\n ? line\n ? \"aui-tree-switcher-has-children aui-tree-switcher-box\"\n : \"aui-tree-switcher-has-children aui-tree-switcher-arrow\"\n : \"aui-tree-switcher-leaf\",\n ].join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n if (hasChildren) onToggleExpand(node.key);\n }}\n >\n {hasChildren &&\n (line ? (\n isExpanded ? (\n \"−\"\n ) : (\n \"+\"\n )\n ) : (\n <Icon\n name=\"chevron-right\"\n className={`aui-tree-arrow-icon${\n isExpanded ? \" aui-tree-arrow-icon-open\" : \"\"\n }`}\n />\n ))}\n </span>\n\n {checkable && (\n <TreeCheckbox\n checkState={checkState}\n disabled={node.disabled || node.disableCheckbox}\n onChange={() => onToggleCheck(node)}\n />\n )}\n\n {node.icon && <span className=\"aui-tree-node-icon\">{node.icon}</span>}\n <span className=\"aui-tree-node-label\">{node.label}</span>\n </div>\n\n {hasChildren && isExpanded && (\n <div\n className=\"aui-tree-children\"\n style={\n { \"--guide-left\": `${depth * 22 + 13}px` } as React.CSSProperties\n }\n >\n {node.children!.map((child) => (\n <TreeNode\n key={child.key}\n node={child}\n depth={depth + 1}\n expandedSet={expandedSet}\n selectedSet={selectedSet}\n checkedSet={checkedSet}\n checkable={checkable}\n selectable={selectable}\n line={line}\n onToggleExpand={onToggleExpand}\n onToggleSelect={onToggleSelect}\n onToggleCheck={onToggleCheck}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Tree ───────────────────────────────────────────────────────────────────────\n\nexport function Tree({\n data,\n defaultExpandAll = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpand,\n selectable = true,\n selectedKeys,\n defaultSelectedKeys,\n onSelect,\n checkable = false,\n checkedKeys,\n defaultCheckedKeys,\n onCheck,\n line = true,\n style,\n className,\n}: TreeProps) {\n const initialExpanded = useMemo(\n () =>\n defaultExpandAll ? collectAllParentKeys(data) : defaultExpandedKeys ?? [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const [internalExpanded, setInternalExpanded] =\n useState<(string | number)[]>(initialExpanded);\n const currentExpanded =\n expandedKeys !== undefined ? expandedKeys : internalExpanded;\n const expandedSet = useMemo(\n () => new Set(currentExpanded),\n [currentExpanded]\n );\n\n const [internalSelected, setInternalSelected] = useState<(string | number)[]>(\n defaultSelectedKeys ?? []\n );\n const currentSelected =\n selectedKeys !== undefined ? selectedKeys : internalSelected;\n const selectedSet = useMemo(\n () => new Set(currentSelected),\n [currentSelected]\n );\n\n const [internalChecked, setInternalChecked] = useState<(string | number)[]>(\n defaultCheckedKeys ?? []\n );\n const currentChecked =\n checkedKeys !== undefined ? checkedKeys : internalChecked;\n const checkedSet = useMemo(() => new Set(currentChecked), [currentChecked]);\n\n const handleToggleExpand = useCallback(\n (key: string | number) => {\n const next = currentExpanded.includes(key)\n ? currentExpanded.filter((k) => k !== key)\n : [...currentExpanded, key];\n if (expandedKeys === undefined) setInternalExpanded(next);\n onExpand?.(next);\n },\n [currentExpanded, expandedKeys, onExpand]\n );\n\n const handleToggleSelect = useCallback(\n (key: string | number) => {\n const next = currentSelected.includes(key)\n ? currentSelected.filter((k) => k !== key)\n : [...currentSelected, key];\n if (selectedKeys === undefined) setInternalSelected(next);\n onSelect?.(next);\n },\n [currentSelected, selectedKeys, onSelect]\n );\n\n const handleToggleCheck = useCallback(\n (node: TreeNodeData) => {\n const leafKeys = getAllLeafKeys(node);\n const state = getCheckState(node, checkedSet);\n let next: (string | number)[];\n if (state === \"checked\") {\n next = currentChecked.filter((k) => !leafKeys.includes(k));\n } else {\n const toAdd = leafKeys.filter((k) => !checkedSet.has(k));\n next = [...currentChecked, ...toAdd];\n }\n if (checkedKeys === undefined) setInternalChecked(next);\n onCheck?.(next);\n },\n [currentChecked, checkedSet, checkedKeys, onCheck]\n );\n\n const cls = [\"aui-tree\", !line && \"aui-tree-no-line\", className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style}>\n {data.map((node) => (\n <TreeNode\n key={node.key}\n node={node}\n depth={0}\n expandedSet={expandedSet}\n selectedSet={selectedSet}\n checkedSet={checkedSet}\n checkable={checkable}\n selectable={selectable}\n line={line}\n onToggleExpand={handleToggleExpand}\n onToggleSelect={handleToggleSelect}\n onToggleCheck={handleToggleCheck}\n />\n ))}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, useMemo } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Layer } from \"../layer\";\nimport { Tree } from \"../tree\";\nimport type { TreeNodeData } from \"../tree\";\nimport \"./tree-select.css\";\n\nexport type TreeSelectValue = string | number | (string | number)[];\n\nexport interface TreeSelectProps {\n data: TreeNodeData[];\n value?: TreeSelectValue;\n onChange?: (value: TreeSelectValue) => void;\n multiple?: boolean;\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n clearable?: boolean;\n searchable?: boolean;\n defaultExpandAll?: boolean;\n maxTagCount?: number;\n line?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nfunction buildLabelMap(\n data: TreeNodeData[]\n): Map<string | number, React.ReactNode> {\n const map = new Map<string | number, React.ReactNode>();\n function traverse(nodes: TreeNodeData[]) {\n for (const node of nodes) {\n map.set(node.key, node.label);\n if (node.children) traverse(node.children);\n }\n }\n traverse(data);\n return map;\n}\n\nfunction filterTree(data: TreeNodeData[], query: string): TreeNodeData[] {\n if (!query.trim()) return data;\n const q = query.toLowerCase();\n function filter(nodes: TreeNodeData[]): TreeNodeData[] {\n return nodes.reduce<TreeNodeData[]>((acc, node) => {\n const label = typeof node.label === \"string\" ? node.label : \"\";\n const selfMatch = label.toLowerCase().includes(q);\n const filteredChildren = node.children ? filter(node.children) : [];\n if (selfMatch) {\n acc.push(node);\n } else if (filteredChildren.length > 0) {\n acc.push({ ...node, children: filteredChildren });\n }\n return acc;\n }, []);\n }\n return filter(data);\n}\n\nfunction getSearchExpandedKeys(\n data: TreeNodeData[],\n query: string\n): (string | number)[] {\n const keys: (string | number)[] = [];\n const q = query.toLowerCase();\n function traverse(nodes: TreeNodeData[]): boolean {\n let hasMatch = false;\n for (const node of nodes) {\n const label = typeof node.label === \"string\" ? node.label : \"\";\n const selfMatch = label.toLowerCase().includes(q);\n const childMatch = node.children ? traverse(node.children) : false;\n if ((selfMatch || childMatch) && node.children?.length) {\n keys.push(node.key);\n }\n if (selfMatch || childMatch) hasMatch = true;\n }\n return hasMatch;\n }\n traverse(data);\n return keys;\n}\n\nexport function TreeSelect({\n data,\n value,\n onChange,\n multiple = false,\n placeholder = \"请选择\",\n disabled = false,\n size = \"md\",\n clearable = false,\n searchable = false,\n defaultExpandAll = false,\n maxTagCount = 10,\n line = false,\n style,\n className,\n}: TreeSelectProps) {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const triggerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const selectedValues: (string | number)[] = multiple\n ? Array.isArray(value)\n ? value\n : value != null\n ? [value as string | number]\n : []\n : value != null\n ? [value as string | number]\n : [];\n\n const labelMap = useMemo(() => buildLabelMap(data), [data]);\n const filteredData = useMemo(() => filterTree(data, search), [data, search]);\n const searchExpandedKeys = useMemo(\n () => (search ? getSearchExpandedKeys(data, search) : undefined),\n [data, search]\n );\n\n useEffect(() => {\n if (open && searchable) {\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }\n if (!open) setSearch(\"\");\n }, [open, searchable]);\n\n const handleOpen = () => {\n if (disabled) return;\n setOpen((v) => !v);\n };\n\n const handleSelect = (keys: (string | number)[]) => {\n // Tree accumulates selections; find the newly added key by diffing with current value\n const added = keys.find((k) => !selectedValues.includes(k));\n if (added != null) {\n onChange?.(added);\n } else {\n // User clicked the already-selected node → deselect\n onChange?.(undefined as unknown as TreeSelectValue);\n }\n setOpen(false);\n };\n\n const handleCheck = (keys: (string | number)[]) => {\n onChange?.(keys);\n };\n\n const handleRemoveTag = (e: React.MouseEvent, val: string | number) => {\n e.stopPropagation();\n onChange?.(selectedValues.filter((v) => v !== val));\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.(multiple ? [] : (undefined as unknown as TreeSelectValue));\n setOpen(false);\n };\n\n const hasClear = clearable && selectedValues.length > 0;\n const overflowCount = selectedValues.length - maxTagCount;\n\n const triggerCls = [\n \"aui-tree-select\",\n `aui-tree-select-${size}`,\n open ? \"aui-tree-select-open\" : \"\",\n disabled ? \"aui-tree-select-disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const renderTriggerContent = () => {\n if (multiple) {\n return (\n <>\n {selectedValues.slice(0, maxTagCount).map((val) => (\n <span key={val} className=\"aui-tree-select-tag\">\n <span className=\"aui-tree-select-tag-label\">\n {labelMap.get(val) ?? String(val)}\n </span>\n {!disabled && (\n <span\n className=\"aui-tree-select-tag-close\"\n onClick={(e) => handleRemoveTag(e, val)}\n >\n <Icon name=\"x\" size={10} />\n </span>\n )}\n </span>\n ))}\n {overflowCount > 0 && (\n <span className=\"aui-tree-select-tag-overflow\">\n +{overflowCount}\n </span>\n )}\n {searchable && open && (\n <input\n ref={searchInputRef}\n className=\"aui-tree-select-inline-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"搜索...\"\n onClick={(e) => e.stopPropagation()}\n />\n )}\n {selectedValues.length === 0 && !(searchable && open) && (\n <span className=\"aui-tree-select-placeholder\">{placeholder}</span>\n )}\n </>\n );\n }\n\n if (searchable && open) {\n return (\n <input\n ref={searchInputRef}\n className=\"aui-tree-select-inline-input\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={\n selectedValues.length > 0\n ? String(labelMap.get(selectedValues[0]) ?? selectedValues[0])\n : placeholder\n }\n onClick={(e) => e.stopPropagation()}\n />\n );\n }\n\n if (selectedValues.length > 0) {\n return (\n <span className=\"aui-tree-select-single-value\">\n {labelMap.get(selectedValues[0]) ?? String(selectedValues[0])}\n </span>\n );\n }\n return <span className=\"aui-tree-select-placeholder\">{placeholder}</span>;\n };\n\n return (\n <div\n ref={triggerRef}\n className={triggerCls}\n style={style}\n onClick={handleOpen}\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled}\n >\n <div className=\"aui-tree-select-values\">{renderTriggerContent()}</div>\n\n <div\n className=\"aui-tree-select-suffix\"\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"aui-tree-select-icon-slot\">\n <span className=\"aui-tree-select-arrow\" onClick={handleOpen}>\n <Icon\n name=\"chevron-down\"\n size={14}\n style={{\n transform: open ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 0.2s\",\n }}\n />\n </span>\n {hasClear && (\n <span className=\"aui-tree-select-clear\" onClick={handleClear}>\n <Icon name=\"x\" size={10} />\n </span>\n )}\n </span>\n </div>\n\n <Layer\n open={open}\n triggerRef={triggerRef}\n className=\"aui-tree-select-dropdown\"\n onClickOutside={() => setOpen(false)}\n onEscape={() => setOpen(false)}\n >\n {filteredData.length === 0 ? (\n <div className=\"aui-tree-select-empty\">无匹配选项</div>\n ) : (\n <div className=\"aui-tree-select-tree-wrap\">\n <Tree\n data={filteredData}\n defaultExpandAll={defaultExpandAll}\n expandedKeys={searchExpandedKeys}\n selectable={!multiple}\n selectedKeys={multiple ? [] : selectedValues}\n onSelect={!multiple ? handleSelect : undefined}\n checkable={multiple}\n checkedKeys={multiple ? selectedValues : []}\n onCheck={multiple ? handleCheck : undefined}\n line={line}\n />\n </div>\n )}\n </Layer>\n </div>\n );\n}\n","import React, { useState, useRef } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Layer } from \"../layer\";\nimport \"./cascader.css\";\n\nexport interface CascaderOption {\n label: string;\n value: string | number;\n children?: CascaderOption[];\n disabled?: boolean;\n}\n\nexport type CascaderValue = (string | number)[];\n\nexport interface CascaderProps {\n options?: CascaderOption[];\n /** 单选时为 CascaderValue,多选时为 CascaderValue[] */\n value?: CascaderValue | CascaderValue[];\n onChange?: (\n value: CascaderValue | CascaderValue[],\n selectedOptions: CascaderOption[] | CascaderOption[][]\n ) => void;\n multiple?: boolean;\n maxTagCount?: number;\n placeholder?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n clearable?: boolean;\n separator?: string;\n style?: React.CSSProperties;\n className?: string;\n}\n\nfunction findPath(\n options: CascaderOption[],\n value: CascaderValue\n): CascaderOption[] {\n const result: CascaderOption[] = [];\n function walk(opts: CascaderOption[], depth: number): boolean {\n for (const opt of opts) {\n if (opt.value === value[depth]) {\n result.push(opt);\n if (depth === value.length - 1) return true;\n if (opt.children && walk(opt.children, depth + 1)) return true;\n result.pop();\n }\n }\n return false;\n }\n walk(options, 0);\n return result;\n}\n\nfunction pathEqual(a: CascaderValue, b: CascaderValue): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n/** 递归获取某节点下所有叶子节点路径 */\nfunction getAllLeafPaths(\n opt: CascaderOption,\n prefix: CascaderValue\n): CascaderValue[] {\n if (!opt.children || opt.children.length === 0) return [prefix];\n return opt.children.flatMap((child) =>\n getAllLeafPaths(child, [...prefix, child.value])\n );\n}\n\n/** 返回节点的 checkbox 状态 */\nfunction getCheckState(\n opt: CascaderOption,\n prefix: CascaderValue,\n selectedPaths: CascaderValue[]\n): \"checked\" | \"indeterminate\" | \"unchecked\" {\n const isLeaf = !opt.children || opt.children.length === 0;\n if (isLeaf) {\n return selectedPaths.some((p) => pathEqual(p, prefix))\n ? \"checked\"\n : \"unchecked\";\n }\n const leafPaths = getAllLeafPaths(opt, prefix);\n const checkedCount = leafPaths.filter((lp) =>\n selectedPaths.some((sp) => pathEqual(sp, lp))\n ).length;\n if (checkedCount === 0) return \"unchecked\";\n if (checkedCount === leafPaths.length) return \"checked\";\n return \"indeterminate\";\n}\n\nexport function Cascader({\n options = [],\n value,\n onChange,\n multiple = false,\n maxTagCount = 10,\n placeholder = \"请选择\",\n disabled = false,\n size = \"md\",\n clearable = false,\n separator = \" / \",\n style,\n className,\n}: CascaderProps) {\n const [open, setOpen] = useState(false);\n const [activePath, setActivePath] = useState<CascaderValue>([]);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n const selectedPaths: CascaderValue[] = multiple\n ? Array.isArray(value) && value.length > 0 && Array.isArray(value[0])\n ? (value as CascaderValue[])\n : []\n : value && (value as CascaderValue).length > 0\n ? [value as CascaderValue]\n : [];\n\n const getPathLabel = (path: CascaderValue) =>\n findPath(options, path)\n .map((o) => o.label)\n .join(separator);\n\n const handleOpen = () => {\n if (disabled) return;\n if (!open) {\n // 有已选路径时展开到第一条,让用户看到当前选中的上下文\n setActivePath(selectedPaths.length > 0 ? selectedPaths[0] : []);\n }\n setOpen((v) => !v);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange?.(multiple ? [] : [], []);\n setActivePath([]);\n setOpen(false);\n };\n\n const handleRemoveTag = (e: React.MouseEvent, path: CascaderValue) => {\n e.stopPropagation();\n const nextPaths = (value as CascaderValue[]).filter(\n (p) => !pathEqual(p, path)\n );\n onChange?.(\n nextPaths,\n nextPaths.map((p) => findPath(options, p))\n );\n };\n\n /** 行点击:只负责展开,单选叶节点同时触发选中 */\n const handleRowClick = (colIdx: number, opt: CascaderOption) => {\n if (opt.disabled) return;\n const newPath = [\n ...activePath.slice(0, colIdx),\n opt.value,\n ] as CascaderValue;\n setActivePath(newPath);\n\n if (!multiple && (!opt.children || opt.children.length === 0)) {\n onChange?.(newPath, findPath(options, newPath));\n setOpen(false);\n }\n };\n\n /** checkbox 点击:只负责勾选/取消,阻止冒泡到行 */\n const handleCheckboxToggle = (\n colIdx: number,\n opt: CascaderOption,\n e: React.MouseEvent\n ) => {\n e.stopPropagation();\n if (opt.disabled || !multiple) return;\n\n const prefix = [...activePath.slice(0, colIdx), opt.value] as CascaderValue;\n const isLeaf = !opt.children || opt.children.length === 0;\n const currentPaths =\n Array.isArray(value) && value.length > 0 && Array.isArray(value[0])\n ? (value as CascaderValue[])\n : [];\n\n let nextPaths: CascaderValue[];\n\n if (isLeaf) {\n const exists = currentPaths.some((p) => pathEqual(p, prefix));\n nextPaths = exists\n ? currentPaths.filter((p) => !pathEqual(p, prefix))\n : [...currentPaths, prefix];\n } else {\n const leafPaths = getAllLeafPaths(opt, prefix);\n const allChecked = leafPaths.every((lp) =>\n currentPaths.some((sp) => pathEqual(sp, lp))\n );\n if (allChecked) {\n nextPaths = currentPaths.filter(\n (cp) => !leafPaths.some((lp) => pathEqual(lp, cp))\n );\n } else {\n const missing = leafPaths.filter(\n (lp) => !currentPaths.some((sp) => pathEqual(sp, lp))\n );\n nextPaths = [...currentPaths, ...missing];\n }\n }\n\n onChange?.(\n nextPaths,\n nextPaths.map((p) => findPath(options, p))\n );\n };\n\n // 构建各列\n const columns: CascaderOption[][] = [options];\n for (let i = 0; i < activePath.length; i++) {\n const active = columns[i].find((o) => o.value === activePath[i]);\n if (active?.children?.length) columns.push(active.children);\n else break;\n }\n\n const hasClear = clearable && !disabled && selectedPaths.length > 0;\n\n const triggerCls = [\n \"aui-cascader\",\n `aui-cascader-${size}`,\n open ? \"aui-cascader-open\" : \"\",\n disabled ? \"aui-cascader-disabled\" : \"\",\n hasClear ? \"aui-cascader-clearable\" : \"\",\n multiple ? \"aui-cascader-multiple\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const renderTriggerContent = () => {\n if (multiple) {\n if (selectedPaths.length === 0)\n return <span className=\"aui-cascader-placeholder\">{placeholder}</span>;\n return (\n <>\n {selectedPaths.slice(0, maxTagCount).map((path, i) => (\n <span key={i} className=\"aui-cascader-tag\">\n <span className=\"aui-cascader-tag-label\">\n {getPathLabel(path)}\n </span>\n <span\n className=\"aui-cascader-tag-close\"\n onClick={(e) => handleRemoveTag(e, path)}\n >\n <Icon name=\"x\" size={10} />\n </span>\n </span>\n ))}\n {selectedPaths.length > maxTagCount && (\n <span className=\"aui-cascader-tag-overflow\">\n +{selectedPaths.length - maxTagCount}\n </span>\n )}\n </>\n );\n }\n const displayText =\n selectedPaths.length > 0 ? getPathLabel(selectedPaths[0]) : \"\";\n return displayText ? (\n <span className=\"aui-cascader-text\">{displayText}</span>\n ) : (\n <span className=\"aui-cascader-placeholder\">{placeholder}</span>\n );\n };\n\n return (\n <div\n ref={triggerRef}\n className={triggerCls}\n style={style}\n onClick={handleOpen}\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled}\n >\n <div className=\"aui-cascader-values\">{renderTriggerContent()}</div>\n <div className=\"aui-cascader-suffix\" onClick={(e) => e.stopPropagation()}>\n <span className=\"aui-cascader-icon-slot\">\n <span className=\"aui-cascader-arrow\" onClick={handleOpen}>\n <Icon\n name=\"chevron-down\"\n size={14}\n style={{\n transform: open ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 0.2s\",\n }}\n />\n </span>\n {hasClear && (\n <span className=\"aui-cascader-clear\" onClick={handleClear}>\n <Icon name=\"x\" size={10} />\n </span>\n )}\n </span>\n </div>\n\n <Layer\n open={open}\n triggerRef={triggerRef}\n matchWidth={false}\n className=\"aui-cascader-dropdown\"\n onClickOutside={() => setOpen(false)}\n onEscape={() => setOpen(false)}\n >\n <div className=\"aui-cascader-menus\">\n {columns.map((col, colIdx) => (\n <div key={colIdx} className=\"aui-cascader-menu\">\n {col.map((opt) => {\n const prefix = [\n ...activePath.slice(0, colIdx),\n opt.value,\n ] as CascaderValue;\n const isLeaf = !opt.children || opt.children.length === 0;\n const isActive = activePath[colIdx] === opt.value;\n const checkState = multiple\n ? getCheckState(opt, prefix, selectedPaths)\n : null;\n const isSingleSelected =\n !multiple && selectedPaths.some((p) => pathEqual(p, prefix));\n\n return (\n <div\n key={opt.value}\n className={[\n \"aui-cascader-option\",\n isActive ? \"aui-cascader-option-active\" : \"\",\n isSingleSelected ? \"aui-cascader-option-selected\" : \"\",\n opt.disabled ? \"aui-cascader-option-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n handleRowClick(colIdx, opt);\n }}\n >\n {multiple && (\n <span\n className={[\n \"aui-cascader-checkbox\",\n checkState === \"checked\"\n ? \"aui-cascader-checkbox-checked\"\n : \"\",\n checkState === \"indeterminate\"\n ? \"aui-cascader-checkbox-indeterminate\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => handleCheckboxToggle(colIdx, opt, e)}\n >\n {checkState === \"checked\" && (\n <Icon name=\"check\" size={10} />\n )}\n {checkState === \"indeterminate\" && (\n <span className=\"aui-cascader-checkbox-dash\" />\n )}\n </span>\n )}\n <span className=\"aui-cascader-option-label\">\n {opt.label}\n </span>\n {!isLeaf && (\n <Icon\n name=\"chevron-right\"\n size={12}\n className=\"aui-cascader-option-arrow\"\n />\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </Layer>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { Select } from \"../select\";\nimport { Icon } from \"../icon\";\nimport \"./pagination.css\";\n\nexport interface PaginationProps {\n total: number;\n current?: number;\n defaultCurrent?: number;\n pageSize?: number;\n defaultPageSize?: number;\n pageSizeOptions?: number[];\n showSizeChanger?: boolean;\n showQuickJumper?: boolean;\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize: number) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\";\n style?: React.CSSProperties;\n className?: string;\n}\n\n// 只在右侧出现一个省略号:始终显示第 1 页,当前页附近 ±2,最后一页\nfunction getPageItems(current: number, pageCount: number): (number | \"...\")[] {\n if (pageCount <= 7) return Array.from({ length: pageCount }, (_, i) => i + 1);\n\n // 始终展示第 1 页 + 最后一页 + 当前页附近窗口\n const winL = Math.max(2, current - 2);\n const winR = Math.min(pageCount - 1, current + 2);\n\n const items: (number | \"...\")[] = [1];\n // 窗口开始是否紧接 1\n if (winL > 2) items.push(\"...\");\n for (let i = winL; i <= winR; i++) items.push(i);\n // 只在窗口右侧有缺口时加一个省略号\n if (winR < pageCount - 1) items.push(\"...\");\n items.push(pageCount);\n return items;\n}\n\n\nexport function Pagination({\n total,\n current: controlledPage,\n defaultCurrent = 1,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal,\n onChange,\n disabled = false,\n size = \"md\",\n style,\n className,\n}: PaginationProps) {\n const isPageControlled = controlledPage !== undefined;\n const isSizeControlled = controlledPageSize !== undefined;\n\n const [internalPage, setInternalPage] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpValue, setJumpValue] = useState(\"\");\n\n const page = isPageControlled ? controlledPage! : internalPage;\n const pageSize = isSizeControlled ? controlledPageSize! : internalPageSize;\n const pageCount = Math.max(1, Math.ceil(total / pageSize));\n\n function go(nextPage: number, nextPageSize = pageSize) {\n if (disabled) return;\n const clamped = Math.max(1, Math.min(pageCount, nextPage));\n if (!isPageControlled) setInternalPage(clamped);\n if (!isSizeControlled) setInternalPageSize(nextPageSize);\n onChange?.(clamped, nextPageSize);\n }\n\n function handleSizeChange(val: string | number | (string | number)[] | null) {\n const nextSize = Number(val);\n if (!nextSize) return;\n const newPageCount = Math.max(1, Math.ceil(total / nextSize));\n const nextPage = Math.min(page, newPageCount);\n if (!isSizeControlled) setInternalPageSize(nextSize);\n if (!isPageControlled) setInternalPage(nextPage);\n onChange?.(nextPage, nextSize);\n }\n\n function handleJump(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key !== \"Enter\") return;\n const n = parseInt(jumpValue, 10);\n if (!isNaN(n)) go(n);\n setJumpValue(\"\");\n }\n\n const rangeStart = Math.min(total, (page - 1) * pageSize + 1);\n const rangeEnd = Math.min(total, page * pageSize);\n const items = getPageItems(page, pageCount);\n\n const selectSize = size === \"sm\" ? \"sm\" : \"md\";\n const sizeOptions = pageSizeOptions.map((opt) => ({\n value: opt,\n label: `${opt} 条/页`,\n }));\n\n const cls = [\n \"aui-pagination\",\n `aui-pagination-${size}`,\n disabled ? \"aui-pagination-disabled\" : \"\",\n className ?? \"\",\n ].filter(Boolean).join(\" \");\n\n return (\n <div className={cls} style={style}>\n {showTotal && (\n <span className=\"aui-pagination-total\">\n {showTotal(total, [rangeStart, rangeEnd])}\n </span>\n )}\n\n <button\n className=\"aui-pagination-btn aui-pagination-prev\"\n disabled={disabled || page <= 1}\n onClick={() => go(page - 1)}\n aria-label=\"上一页\"\n >\n <Icon name=\"chevron-left\" size={14} />\n </button>\n\n {items.map((item, idx) =>\n item === \"...\" ? (\n <span key={`ellipsis-${idx}`} className=\"aui-pagination-ellipsis\">\n •••\n </span>\n ) : (\n <button\n key={item}\n className={[\n \"aui-pagination-btn aui-pagination-item\",\n item === page ? \"aui-pagination-item-active\" : \"\",\n ].filter(Boolean).join(\" \")}\n disabled={disabled}\n onClick={() => go(item)}\n >\n {item}\n </button>\n )\n )}\n\n <button\n className=\"aui-pagination-btn aui-pagination-next\"\n disabled={disabled || page >= pageCount}\n onClick={() => go(page + 1)}\n aria-label=\"下一页\"\n >\n <Icon name=\"chevron-right\" size={14} />\n </button>\n\n {showSizeChanger && (\n <Select\n options={sizeOptions}\n value={pageSize}\n onChange={handleSizeChange}\n disabled={disabled}\n size={selectSize}\n style={{ width: 100, minWidth: 0 }}\n />\n )}\n\n {showQuickJumper && (\n <span className=\"aui-pagination-jumper\">\n 跳至\n <input\n className=\"aui-pagination-jumper-input\"\n type=\"text\"\n inputMode=\"numeric\"\n value={jumpValue}\n disabled={disabled}\n onChange={(e) => setJumpValue(e.target.value.replace(/\\D/g, \"\"))}\n onKeyDown={handleJump}\n />\n 页\n </span>\n )}\n </div>\n );\n}\n","import type { TableColumn, TableProps } from \"./types\";\n\nexport type HeaderSegment<T> =\n | { type: \"leaf\"; col: TableColumn<T> }\n | { type: \"group\"; label: string; cols: TableColumn<T>[] };\n\nexport function buildHeaderSegments<T>(\n columns: TableColumn<T>[]\n): HeaderSegment<T>[] {\n const segments: HeaderSegment<T>[] = [];\n let i = 0;\n while (i < columns.length) {\n const col = columns[i];\n if (!col.group) {\n segments.push({ type: \"leaf\", col });\n i++;\n } else {\n const label = col.group;\n const cols: TableColumn<T>[] = [col];\n i++;\n while (i < columns.length && columns[i].group === label) {\n cols.push(columns[i]);\n i++;\n }\n segments.push({ type: \"group\", label, cols });\n }\n }\n return segments;\n}\n\nexport function getRowKey<T extends Record<string, any>>(\n record: T,\n index: number,\n rowKey?: TableProps<T>[\"rowKey\"]\n): string {\n if (typeof rowKey === \"function\") return String(rowKey(record));\n if (typeof rowKey === \"string\") return String(record[rowKey] ?? index);\n return String((record as any).id ?? (record as any).key ?? index);\n}\n\nexport function getCellValue<T extends Record<string, any>>(\n record: T,\n col: TableColumn<T>\n): any {\n if (!col.dataIndex) return undefined;\n return col.dataIndex.split(\".\").reduce((obj: any, key) => obj?.[key], record);\n}\n\nexport function computeStickyOffsets(columns: TableColumn[]): {\n left: Record<string, number>;\n right: Record<string, number>;\n lastLeftKey: string | null;\n firstRightKey: string | null;\n} {\n const leftCols = columns.filter((c) => c.fixed === \"left\");\n const rightCols = columns.filter((c) => c.fixed === \"right\");\n const left: Record<string, number> = {};\n let acc = 0;\n for (const col of leftCols) {\n left[col.key] = acc;\n acc += typeof col.width === \"number\" ? col.width : 0;\n }\n const right: Record<string, number> = {};\n acc = 0;\n for (const col of [...rightCols].reverse()) {\n right[col.key] = acc;\n acc += typeof col.width === \"number\" ? col.width : 0;\n }\n return {\n left,\n right,\n lastLeftKey: leftCols.length ? leftCols[leftCols.length - 1].key : null,\n firstRightKey: rightCols.length ? rightCols[0].key : null,\n };\n}\n\nexport const ROW_HEIGHT: Record<\"sm\" | \"md\" | \"lg\", number> = {\n sm: 33,\n md: 41,\n lg: 49,\n};\n","import React from \"react\";\n\ninterface TableCheckboxProps {\n checked: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\ninterface TableRadioProps {\n checked: boolean;\n disabled?: boolean;\n onChange?: () => void;\n}\n\nexport function TableRadio({ checked, disabled, onChange }: TableRadioProps) {\n return (\n <span\n className={[\n \"aui-table-radio\",\n checked ? \"aui-table-radio-checked\" : \"\",\n disabled ? \"aui-table-radio-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) onChange?.();\n }}\n >\n {checked && <span className=\"aui-table-radio-dot\" />}\n </span>\n );\n}\n\nexport function TableCheckbox({\n checked,\n indeterminate,\n disabled,\n onChange,\n}: TableCheckboxProps) {\n return (\n <span\n className={[\n \"aui-table-checkbox\",\n checked ? \"aui-table-checkbox-checked\" : \"\",\n indeterminate ? \"aui-table-checkbox-indeterminate\" : \"\",\n disabled ? \"aui-table-checkbox-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) onChange?.(!checked);\n }}\n >\n {indeterminate && !checked && (\n <span className=\"aui-table-checkbox-dash\" />\n )}\n {checked && !indeterminate && (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <polyline\n points=\"1.5 5 4 7.5 8.5 2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n );\n}\n","import React from \"react\";\nimport { Icon } from \"../icon\";\n\nexport function EmptyState({ content }: { content?: React.ReactNode }) {\n return (\n <div className=\"aui-table-empty\">\n <Icon name=\"empty-data\" />\n <span className=\"aui-table-empty-text\">{content ?? \"暂无数据\"}</span>\n </div>\n );\n}\n\nexport function LoadingOverlay() {\n return (\n <div className=\"aui-table-loading-overlay\">\n <Icon name=\"spinner\" size={32} className=\"aui-table-spinner\" />\n </div>\n );\n}\n","import React, {\n useRef,\n useState,\n useEffect,\n useLayoutEffect,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport \"./dropdown.css\";\n\nexport type DropdownTrigger = \"click\" | \"hover\" | \"contextMenu\";\n\nexport interface DropdownMenuItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactNode;\n disabled?: boolean;\n danger?: boolean;\n onClick?: () => void;\n}\n\nexport interface DropdownDivider {\n type: \"divider\";\n key?: string | number;\n}\n\nexport type DropdownItem = DropdownMenuItem | DropdownDivider;\n\nexport interface DropdownProps {\n items: DropdownItem[];\n trigger?: DropdownTrigger;\n disabled?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onSelect?: (key: string | number) => void;\n children: React.ReactElement;\n className?: string;\n style?: React.CSSProperties;\n}\n\n// ── Positioning ───────────────────────────────────────────────────────────────\n\nconst OFFSET = 4;\n\ninterface MenuPos {\n top: number;\n left: number;\n}\n\nfunction calcPos(triggerEl: HTMLElement): MenuPos {\n const rect = triggerEl.getBoundingClientRect();\n return { top: rect.bottom + OFFSET, left: rect.left };\n}\n\nfunction calcPosAtMouse(x: number, y: number): MenuPos {\n return { top: y + OFFSET, left: x };\n}\n\n// ── Menu panel ────────────────────────────────────────────────────────────────\n\ninterface MenuPanelProps {\n items: DropdownItem[];\n pos: MenuPos;\n menuRef: React.RefObject<HTMLDivElement>;\n onSelect: (key: string | number) => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nfunction MenuPanel({\n items,\n pos,\n menuRef,\n onSelect,\n onMouseEnter,\n onMouseLeave,\n}: MenuPanelProps) {\n const style: React.CSSProperties = {\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n };\n\n return createPortal(\n <div\n ref={menuRef}\n className=\"aui-dropdown-menu\"\n style={style}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {items.map((item, i) => {\n if (\"type\" in item && item.type === \"divider\") {\n return (\n <div\n key={item.key ?? `divider-${i}`}\n className=\"aui-dropdown-divider\"\n />\n );\n }\n\n const menuItem = item as DropdownMenuItem;\n const cls = [\n \"aui-dropdown-item\",\n menuItem.disabled ? \"aui-dropdown-item-disabled\" : \"\",\n menuItem.danger ? \"aui-dropdown-item-danger\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={menuItem.key}\n className={cls}\n onClick={() => {\n if (menuItem.disabled) return;\n menuItem.onClick?.();\n onSelect(menuItem.key);\n }}\n >\n {menuItem.icon && (\n <span className=\"aui-dropdown-item-icon\">{menuItem.icon}</span>\n )}\n <span className=\"aui-dropdown-item-label\">{menuItem.label}</span>\n </div>\n );\n })}\n </div>,\n document.body\n );\n}\n\n// ── Dropdown ──────────────────────────────────────────────────────────────────\n\nexport function Dropdown({\n items,\n trigger = \"click\",\n disabled = false,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onSelect,\n children,\n className,\n style,\n}: DropdownProps) {\n const isControlled = openProp !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const open = isControlled ? openProp! : internalOpen;\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const menuRef = useRef<HTMLDivElement>(null!);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mousePosRef = useRef({ x: 0, y: 0 });\n\n const [pos, setPos] = useState<MenuPos>({ top: 0, left: 0 });\n\n // ── Callbacks ──────────────────────────────────────────────────────────────\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // ── Position on open ──────────────────────────────────────────────────────\n useLayoutEffect(() => {\n if (!open) return;\n if (trigger === \"contextMenu\") {\n setPos(calcPosAtMouse(mousePosRef.current.x, mousePosRef.current.y));\n } else if (triggerRef.current) {\n setPos(calcPos(triggerRef.current));\n }\n }, [open, trigger]);\n\n // ── Reposition on scroll / resize ─────────────────────────────────────────\n useEffect(() => {\n if (!open || trigger === \"contextMenu\") return;\n const update = () => {\n if (triggerRef.current) setPos(calcPos(triggerRef.current));\n };\n window.addEventListener(\"scroll\", update, { capture: true, passive: true });\n window.addEventListener(\"resize\", update, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [open, trigger]);\n\n // ── Click outside / Escape ────────────────────────────────────────────────\n useEffect(() => {\n if (!open) return;\n function onMouseDown(e: MouseEvent) {\n const target = e.target as Node;\n // For contextMenu, close on any click; for others, close on outside click\n if (trigger === \"contextMenu\") {\n if (!menuRef.current?.contains(target)) {\n setOpen(false);\n }\n return;\n }\n if (\n !triggerRef.current?.contains(target) &&\n !menuRef.current?.contains(target)\n ) {\n setOpen(false);\n }\n }\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n function onScroll() {\n if (trigger === \"contextMenu\") setOpen(false);\n }\n document.addEventListener(\"mousedown\", onMouseDown);\n document.addEventListener(\"keydown\", onKeyDown);\n if (trigger === \"contextMenu\") {\n document.addEventListener(\"scroll\", onScroll, {\n capture: true,\n passive: true,\n });\n }\n return () => {\n document.removeEventListener(\"mousedown\", onMouseDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n document.removeEventListener(\"scroll\", onScroll, true);\n };\n }, [open, setOpen, trigger]);\n\n // ── Hover helpers ─────────────────────────────────────────────────────────\n function clearHoverTimer() {\n if (hoverTimerRef.current !== null) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n }\n function scheduleClose() {\n hoverTimerRef.current = setTimeout(() => setOpen(false), 150);\n }\n\n // ── Trigger props ─────────────────────────────────────────────────────────\n const triggerProps: Record<string, any> =\n trigger === \"hover\"\n ? {\n onMouseEnter: () => {\n clearHoverTimer();\n if (!disabled) setOpen(true);\n },\n onMouseLeave: scheduleClose,\n }\n : trigger === \"contextMenu\"\n ? {\n onContextMenu: (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n mousePosRef.current = { x: e.clientX, y: e.clientY };\n setOpen(true);\n },\n }\n : {\n onClick: () => {\n if (!disabled) setOpen(!open);\n },\n };\n\n const handleSelect = (key: string | number) => {\n onSelect?.(key);\n setOpen(false);\n };\n\n return (\n <span\n ref={triggerRef}\n className={[\"aui-dropdown-trigger\", className].filter(Boolean).join(\" \")}\n style={{ display: \"inline-block\", ...style }}\n {...triggerProps}\n >\n {React.cloneElement(children, {\n disabled: disabled || (children.props as any).disabled,\n })}\n {open && (\n <MenuPanel\n items={items}\n pos={pos}\n menuRef={menuRef}\n onSelect={handleSelect}\n onMouseEnter={trigger === \"hover\" ? clearHoverTimer : undefined}\n onMouseLeave={trigger === \"hover\" ? scheduleClose : undefined}\n />\n )}\n </span>\n );\n}\n","import React from \"react\";\nimport \"./button.css\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n children?: React.ReactNode;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n disabled,\n children,\n className,\n ...rest\n },\n ref,\n ) => {\n const cls = [\n \"aui-btn\",\n `aui-btn-${size}`,\n `aui-btn-${variant}`,\n loading ? \"aui-btn-loading\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button ref={ref} className={cls} disabled={disabled || loading} {...rest}>\n {loading && <span className=\"aui-btn-spinner\" aria-hidden=\"true\" />}\n {children}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n","import React, { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { createRoot } from \"react-dom/client\";\nimport { Icon } from \"../icon\";\nimport type { IconName } from \"../icon\";\nimport \"./modal.css\";\nimport { Button } from \"../button\";\n\nexport interface ModalProps {\n open: boolean;\n onClose?: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode | null;\n width?: number | string;\n closable?: boolean;\n mask?: boolean | { blur?: boolean };\n}\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n width = 520,\n closable = true,\n mask = true,\n}: ModalProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n requestAnimationFrame(() =>\n requestAnimationFrame(() => setVisible(true))\n );\n } else {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), 220);\n return () => clearTimeout(t);\n }\n }, [open]);\n\n useEffect(() => {\n if (!open || !closable) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closable, onClose]);\n\n if (!mounted || typeof document === \"undefined\") return null;\n\n const w = typeof width === \"number\" ? `${width}px` : width;\n\n const maskBlur = typeof mask === \"object\" && mask?.blur;\n const maskHidden = mask === false;\n\n const node = (\n <div\n className={[\n \"aui-modal-overlay\",\n visible ? \"aui-modal-visible\" : \"\",\n maskHidden ? \"aui-modal-no-mask\" : \"\",\n maskBlur ? \"aui-modal-blur\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) =>\n e.target === e.currentTarget && closable && !maskHidden && onClose?.()\n }\n >\n <div\n className=\"aui-modal-dialog\"\n style={{ width: w }}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {(title != null || closable) && (\n <div className=\"aui-modal-header\">\n {title != null && <div className=\"aui-modal-title\">{title}</div>}\n {closable && (\n <button\n className=\"aui-modal-close\"\n onClick={onClose}\n aria-label=\"关闭\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n )}\n </div>\n )}\n <div className=\"aui-modal-body\">{children}</div>\n {footer !== null && (\n <div className=\"aui-modal-footer\">\n {footer ?? (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={onClose}>\n 取消\n </Button>\n <Button size=\"sm\" onClick={onClose}>\n 确定\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n}\n\n// ── Static Modal API ──────────────────────────────────────────────────────────\n\nexport type StaticModalType = \"info\" | \"success\" | \"error\" | \"warning\";\n\nexport interface StaticModalOptions {\n title?: React.ReactNode;\n content?: React.ReactNode;\n width?: number | string;\n okText?: string;\n onClose?: () => void;\n}\n\nexport interface ConfirmModalOptions {\n title?: React.ReactNode;\n content?: React.ReactNode;\n width?: number | string;\n text?: { ok?: string; cancel?: string };\n onOk?: () => void | Promise<void>;\n onClose?: () => void | Promise<void>;\n}\n\nconst typeIconMap: Record<StaticModalType, IconName> = {\n info: \"circle-info\",\n success: \"circle-check\",\n error: \"circle-x\",\n warning: \"circle-warn\",\n};\n\ninterface StaticInnerProps {\n type?: StaticModalType;\n title?: React.ReactNode;\n content?: React.ReactNode;\n width?: number | string;\n okText?: string;\n cancelText?: string;\n isConfirm?: boolean;\n onOk?: () => void | Promise<void>;\n onClose?: () => void | Promise<void>;\n onUnmount: () => void;\n}\n\nfunction StaticModalInner({\n type,\n title,\n content,\n width,\n okText = \"确定\",\n cancelText = \"取消\",\n isConfirm,\n onOk,\n onClose,\n onUnmount,\n}: StaticInnerProps) {\n const [open, setOpen] = useState(true);\n const [okLoading, setOkLoading] = useState(false);\n const [cancelLoading, setCancelLoading] = useState(false);\n\n const close =\n (cb?: () => void | Promise<void>, setLoading?: (v: boolean) => void) =>\n async () => {\n if (cb) {\n const result = cb();\n if (result instanceof Promise) {\n setLoading?.(true);\n try {\n await result;\n } finally {\n setLoading?.(false);\n }\n }\n }\n setOpen(false);\n setTimeout(onUnmount, 220);\n };\n\n const handleClose = close(onClose, setCancelLoading);\n const handleOk = close(onOk, setOkLoading);\n\n const titleNode = type ? (\n <span className=\"aui-modal-type-title\">\n <span className={`aui-modal-type-${type}`}>\n <Icon name={typeIconMap[type]} size={18} />\n </span>\n {title}\n </span>\n ) : (\n title\n );\n\n return (\n <Modal\n open={open}\n onClose={handleClose}\n title={titleNode}\n width={width}\n footer={\n isConfirm ? (\n <>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleClose}\n loading={cancelLoading}\n >\n {cancelText}\n </Button>\n <Button size=\"sm\" onClick={handleOk} loading={okLoading}>\n {okText}\n </Button>\n </>\n ) : (\n <Button size=\"sm\" onClick={handleOk} loading={okLoading}>\n {okText}\n </Button>\n )\n }\n >\n {content}\n </Modal>\n );\n}\n\nfunction mountModal(props: Omit<StaticInnerProps, \"onUnmount\">) {\n if (typeof document === \"undefined\") return;\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n const root = createRoot(container);\n const unmount = () => {\n root.unmount();\n container.remove();\n };\n root.render(<StaticModalInner {...props} onUnmount={unmount} />);\n}\n\nfunction createTypeMethod(type?: StaticModalType) {\n return (options: StaticModalOptions) =>\n mountModal({\n type,\n title: options.title,\n content: options.content,\n width: options.width,\n okText: options.okText,\n onClose: options.onClose,\n });\n}\n\nModal.show = createTypeMethod(undefined);\nModal.info = createTypeMethod(\"info\");\nModal.success = createTypeMethod(\"success\");\nModal.error = createTypeMethod(\"error\");\nModal.warning = createTypeMethod(\"warning\");\n\nModal.confirm = (options: ConfirmModalOptions) =>\n mountModal({\n title: options.title,\n content: options.content,\n width: options.width,\n isConfirm: true,\n okText: options.text?.ok,\n cancelText: options.text?.cancel,\n onOk: options.onOk,\n onClose: options.onClose,\n });\n","import React, { useState } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Dropdown } from \"../dropdown\";\nimport { Modal } from \"../modal\";\nimport type { DropdownItem } from \"../dropdown\";\nimport type { RowMenuItem, RowMenuApi } from \"./types\";\n\ninterface RowOperationCellProps<T> {\n record: T;\n menus: RowMenuItem<T>[];\n maxCount: number;\n search?: () => void | Promise<void>;\n}\n\nexport function RowOperationCell<T>({\n record,\n menus,\n maxCount,\n search,\n}: RowOperationCellProps<T>) {\n const [loadingIdx, setLoadingIdx] = useState<number | null>(null);\n\n const api: RowMenuApi<T> = { record, search };\n\n const visibleMenus = menus.filter((m) => {\n const v = typeof m.visible === \"function\" ? m.visible(api) : m.visible;\n return v !== false;\n });\n\n const inlineMenus = visibleMenus.slice(0, maxCount);\n const overflowMenus = visibleMenus.slice(maxCount);\n\n async function handleClick(menu: RowMenuItem<T>, idx: number) {\n const isDisabled =\n typeof menu.disabled === \"function\" ? menu.disabled(api) : menu.disabled;\n if (isDisabled) return;\n\n async function doAction() {\n setLoadingIdx(idx);\n try {\n await menu.onClick?.(api);\n } finally {\n setLoadingIdx(null);\n }\n }\n\n if (menu.confirm) {\n Modal.confirm({\n title: \"操作确认\",\n content: menu.confirm,\n onOk: doAction,\n });\n return;\n }\n await doAction();\n }\n\n const overflowDropdownItems: DropdownItem[] = overflowMenus.map((menu, i) => {\n const realIdx = maxCount + i;\n const isDisabled =\n typeof menu.disabled === \"function\" ? menu.disabled(api) : menu.disabled;\n return {\n key: realIdx,\n label: menu.label,\n disabled: !!isDisabled,\n onClick: () => handleClick(menu, realIdx),\n };\n });\n\n return (\n <div className=\"aui-table-row-ops\">\n {inlineMenus.map((menu, i) => {\n const isDisabled =\n typeof menu.disabled === \"function\"\n ? menu.disabled(api)\n : menu.disabled;\n return (\n <React.Fragment key={i}>\n {i > 0 && <span className=\"aui-table-op-divider\" />}\n <button\n className={[\n \"aui-table-op-btn\",\n isDisabled ? \"aui-table-op-btn-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => handleClick(menu, i)}\n disabled={loadingIdx !== null || !!isDisabled}\n >\n {loadingIdx === i && <span className=\"aui-table-op-loading\" />}\n {menu.label}\n </button>\n </React.Fragment>\n );\n })}\n {overflowMenus.length > 0 && (\n <>\n {inlineMenus.length > 0 && <span className=\"aui-table-op-divider\" />}\n <Dropdown items={overflowDropdownItems} trigger=\"click\">\n <button className=\"aui-table-op-btn\">\n 更多\n <Icon\n name=\"chevron-down\"\n size={12}\n style={{ verticalAlign: \"middle\", marginLeft: 2 }}\n />\n </button>\n </Dropdown>\n </>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Button } from \"../button\";\nimport type { ButtonSize } from \"../button\";\nimport { Icon } from \"../icon\";\nimport type { TableToolItem, TableToolbarApi } from \"./types\";\n\ninterface ToolbarProps<T> {\n title?: React.ReactNode;\n tools?: TableToolItem<T>[];\n onRefresh?: () => void | Promise<void>;\n toolbarApi: TableToolbarApi<T>;\n btnSize: ButtonSize;\n}\n\nexport function Toolbar<T>({\n title,\n tools,\n onRefresh,\n toolbarApi,\n btnSize,\n}: ToolbarProps<T>) {\n return (\n <div className=\"aui-table-toolbar\">\n <div className=\"aui-table-toolbar-title\">{title}</div>\n <div className=\"aui-table-toolbar-actions\">\n {tools?.map((tool, i) => {\n const isDisabled =\n typeof tool.disabled === \"function\"\n ? tool.disabled(toolbarApi)\n : tool.disabled;\n return (\n <Button\n key={i}\n variant={tool.type ?? \"primary\"}\n size={btnSize}\n disabled={isDisabled}\n onClick={() => tool.onClick?.(toolbarApi)}\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 4 }}\n >\n {tool.icon && <Icon name={tool.icon} size={14} />}\n {tool.label}\n </Button>\n );\n })}\n {onRefresh && (\n <button\n className=\"aui-table-refresh-btn\"\n onClick={onRefresh}\n title=\"刷新\"\n >\n <Icon name=\"refresh\" size={15} />\n </button>\n )}\n </div>\n </div>\n );\n}\n","import React, { useRef, useState, useEffect, useCallback } from \"react\";\nimport { Pagination } from \"../pagination\";\nimport \"./table.css\";\nimport type { TableProps, TableColumn } from \"./types\";\nimport {\n getRowKey,\n getCellValue,\n computeStickyOffsets,\n buildHeaderSegments,\n ROW_HEIGHT,\n} from \"./utils\";\nimport { TableCheckbox, TableRadio } from \"./checkbox\";\nimport { EmptyState, LoadingOverlay } from \"./empty\";\nimport { RowOperationCell } from \"./row-operation-cell\";\nimport { Toolbar } from \"./toolbar\";\n\ninterface FlatRow<T> {\n record: T;\n depth: number;\n key: string | number;\n hasChildren: boolean;\n}\n\nfunction flattenTree<T extends Record<string, any>>(\n data: T[],\n childrenKey: string,\n expandedSet: Set<string>,\n getKeyFn: (r: T, i: number) => string | number,\n depth = 0\n): FlatRow<T>[] {\n const result: FlatRow<T>[] = [];\n data.forEach((record, i) => {\n const key = getKeyFn(record, i);\n const children = record[childrenKey] as T[] | undefined;\n const hasChildren = !!(children && children.length > 0);\n result.push({ record, depth, key, hasChildren });\n if (hasChildren && expandedSet.has(String(key))) {\n result.push(\n ...flattenTree(children!, childrenKey, expandedSet, getKeyFn, depth + 1)\n );\n }\n });\n return result;\n}\n\nfunction ExpandIcon({ expanded }: { expanded: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n className=\"aui-table-expand-svg\"\n >\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"13\"\n height=\"13\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n />\n {!expanded && (\n <line\n x1=\"7\"\n y1=\"3.5\"\n x2=\"7\"\n y2=\"10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n )}\n <line\n x1=\"3.5\"\n y1=\"7\"\n x2=\"10.5\"\n y2=\"7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function Table<T extends Record<string, any> = any>({\n columns,\n dataSource = [],\n rowKey,\n bordered = false,\n striped = false,\n size = \"md\",\n scroll,\n loading = false,\n empty,\n rowSelection,\n virtual = false,\n pagination,\n title,\n tools,\n rowOperations,\n onRefresh,\n summary,\n childrenColumnName = \"children\",\n expandedRowKeys,\n defaultExpandedRowKeys,\n onExpand,\n indentSize = 16,\n style,\n className,\n}: TableProps<T>) {\n const hasFixed = columns.some((c) => c.fixed);\n const { left, right, lastLeftKey, firstRightKey } =\n computeStickyOffsets(columns);\n const hasRowOps = !!rowOperations?.menus?.length;\n\n // ── Pagination ────────────────────────────────────────────────────────────\n const paginationEnabled = pagination !== false && pagination !== undefined;\n const isPaginationPageControlled =\n paginationEnabled && pagination.current !== undefined;\n const isPaginationSizeControlled =\n paginationEnabled && pagination.pageSize !== undefined;\n const [internalPaginationPage, setInternalPaginationPage] = useState(\n (paginationEnabled && pagination.defaultCurrent) || 1\n );\n const [internalPaginationSize, setInternalPaginationSize] = useState(\n (paginationEnabled && pagination.defaultPageSize) || 10\n );\n const paginationPage = isPaginationPageControlled\n ? pagination!.current!\n : internalPaginationPage;\n const paginationPageSize = isPaginationSizeControlled\n ? pagination!.pageSize!\n : internalPaginationSize;\n\n const pagedDataSource = paginationEnabled\n ? dataSource.slice(\n (paginationPage - 1) * paginationPageSize,\n paginationPage * paginationPageSize\n )\n : dataSource;\n\n function handlePaginationChange(page: number, pageSize: number) {\n if (!isPaginationPageControlled) setInternalPaginationPage(page);\n if (!isPaginationSizeControlled) setInternalPaginationSize(pageSize);\n pagination && pagination.onChange?.(page, pageSize);\n }\n\n // ── Tree ──────────────────────────────────────────────────────────────────\n const isTreeMode = dataSource.some((r) => {\n const children = r[childrenColumnName];\n return Array.isArray(children) && children.length > 0;\n });\n\n const isExpandControlled = expandedRowKeys !== undefined;\n const [internalExpandedKeys, setInternalExpandedKeys] = useState<\n (string | number)[]\n >(defaultExpandedRowKeys ?? []);\n const activeExpandedKeys = isExpandControlled\n ? expandedRowKeys!\n : internalExpandedKeys;\n const expandedSet = new Set(activeExpandedKeys.map(String));\n\n function toggleExpand(record: T, key: string | number) {\n const keyStr = String(key);\n const isExpanded = expandedSet.has(keyStr);\n const nextKeys = isExpanded\n ? activeExpandedKeys.filter((k) => String(k) !== keyStr)\n : [...activeExpandedKeys, key];\n if (!isExpandControlled) setInternalExpandedKeys(nextKeys);\n onExpand?.(!isExpanded, record);\n }\n\n const getKeyFn = useCallback(\n (r: T, i: number) => getRowKey(r, i, rowKey),\n [rowKey]\n );\n\n const allFlatRows: FlatRow<T>[] = isTreeMode\n ? flattenTree(pagedDataSource, childrenColumnName, expandedSet, getKeyFn)\n : pagedDataSource.map((record, i) => ({\n record,\n depth: 0,\n key: getRowKey(record, i, rowKey),\n hasChildren: false,\n }));\n\n // ── Virtual scrolling ─────────────────────────────────────────────────────\n const virtualEnabled = virtual && typeof scroll?.y === \"number\";\n const estRowHeight = ROW_HEIGHT[size];\n const viewportHeight = virtualEnabled ? (scroll!.y as number) : 0;\n const OVERSCAN = 5;\n\n const [scrollTop, setScrollTop] = useState(0);\n const [pingLeft, setPingLeft] = useState(false);\n const [pingRight, setPingRight] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (!el) return;\n if (virtualEnabled) setScrollTop(el.scrollTop);\n if (hasFixed) {\n setPingLeft(el.scrollLeft > 0);\n setPingRight(el.scrollLeft < el.scrollWidth - el.clientWidth - 1);\n }\n }, [virtualEnabled, hasFixed]);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || (!hasFixed && !virtualEnabled)) return;\n handleScroll();\n el.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", handleScroll);\n }, [hasFixed, virtualEnabled, handleScroll]);\n\n const totalCount = allFlatRows.length;\n let startIdx = 0;\n let endIdx = totalCount - 1;\n let topSpacerHeight = 0;\n let bottomSpacerHeight = 0;\n\n if (virtualEnabled && totalCount > 0) {\n startIdx = Math.max(0, Math.floor(scrollTop / estRowHeight) - OVERSCAN);\n endIdx = Math.min(\n totalCount - 1,\n Math.ceil((scrollTop + viewportHeight) / estRowHeight) + OVERSCAN\n );\n topSpacerHeight = startIdx * estRowHeight;\n bottomSpacerHeight = (totalCount - endIdx - 1) * estRowHeight;\n }\n\n const visibleFlatRows = virtualEnabled\n ? allFlatRows.slice(startIdx, endIdx + 1)\n : allFlatRows;\n\n // ── Row selection ─────────────────────────────────────────────────────────\n const isControlled =\n rowSelection && rowSelection.selectedRowKeys !== undefined;\n const [internalKeys, setInternalKeys] = useState<(string | number)[]>([]);\n const selectedKeys = isControlled\n ? rowSelection!.selectedRowKeys!\n : internalKeys;\n\n const enabledRowKeys = pagedDataSource\n .map((r, i) => ({\n key: getRowKey(r, i, rowKey),\n disabled: rowSelection?.getCheckboxProps?.(r)?.disabled,\n }))\n .filter((r) => !r.disabled)\n .map((r) => r.key);\n\n const selectedSet = new Set(selectedKeys.map(String));\n const allSelected =\n enabledRowKeys.length > 0 &&\n enabledRowKeys.every((k) => selectedSet.has(String(k)));\n const someSelected = enabledRowKeys.some((k) => selectedSet.has(String(k)));\n\n function fireChange(nextKeys: (string | number)[]) {\n if (!isControlled) setInternalKeys(nextKeys);\n const nextRows = pagedDataSource.filter((r, i) =>\n nextKeys.map(String).includes(String(getRowKey(r, i, rowKey)))\n );\n rowSelection?.onChange?.(nextKeys, nextRows);\n }\n\n function toggleAll() {\n if (allSelected) {\n fireChange(\n selectedKeys.filter((k) => !enabledRowKeys.includes(String(k)))\n );\n } else {\n fireChange(\n Array.from(new Set([...selectedKeys.map(String), ...enabledRowKeys]))\n );\n }\n }\n\n function toggleRow(key: string) {\n const isRadio = rowSelection?.type === \"radio\";\n let nextKeys: (string | number)[];\n if (isRadio) {\n nextKeys = [key];\n } else if (selectedSet.has(key)) {\n nextKeys = selectedKeys.filter((k) => String(k) !== key);\n } else {\n nextKeys = [...selectedKeys, key];\n }\n fireChange(nextKeys);\n }\n\n // ── Render helpers ────────────────────────────────────────────────────────\n const wrapperCls = [\n \"aui-table-wrapper\",\n bordered ? \"aui-table-bordered\" : \"\",\n striped ? \"aui-table-striped\" : \"\",\n `aui-table-${size}`,\n hasFixed ? \"aui-table-has-fixed\" : \"\",\n pingLeft ? \"aui-table-ping-left\" : \"\",\n pingRight ? \"aui-table-ping-right\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const containerStyle: React.CSSProperties = {};\n if (scroll?.x) containerStyle.overflowX = \"auto\";\n if (scroll?.y) {\n containerStyle.overflowY = \"auto\";\n containerStyle.maxHeight =\n typeof scroll.y === \"number\" ? `${scroll.y}px` : scroll.y;\n }\n\n const tableStyle: React.CSSProperties = {};\n if (scroll?.x) {\n tableStyle.minWidth =\n typeof scroll.x === \"number\" ? `${scroll.x}px` : scroll.x;\n }\n\n const getCellStyle = (col: TableColumn<T>): React.CSSProperties => {\n const s: React.CSSProperties = {};\n if (col.width)\n s.width = typeof col.width === \"number\" ? `${col.width}px` : col.width;\n if (col.align) s.textAlign = col.align;\n if (col.fixed === \"left\") {\n s.position = \"sticky\";\n s.left = `${left[col.key] ?? 0}px`;\n s.zIndex = 2;\n }\n if (col.fixed === \"right\") {\n s.position = \"sticky\";\n s.right = `${right[col.key] ?? 0}px`;\n s.zIndex = 2;\n }\n return s;\n };\n\n const getColCls = (col: TableColumn<T>) =>\n [\n col.fixed === \"left\" ? \"aui-table-cell-fix-left\" : \"\",\n col.fixed === \"right\" ? \"aui-table-cell-fix-right\" : \"\",\n col.key === lastLeftKey ? \"aui-table-cell-fix-left-last\" : \"\",\n col.key === firstRightKey ? \"aui-table-cell-fix-right-first\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const totalCols =\n columns.length + (rowSelection ? 1 : 0) + (hasRowOps ? 1 : 0);\n const isRadio = rowSelection?.type === \"radio\";\n\n // ── Grouped header ────────────────────────────────────────────────────────\n const hasGroup = columns.some((c) => c.group);\n const headerSegments = hasGroup ? buildHeaderSegments(columns) : null;\n const groupedLeafCols = hasGroup ? columns.filter((c) => c.group) : [];\n\n // ── Toolbar ───────────────────────────────────────────────────────────────\n const showToolbar = !!(title || (tools && tools.length > 0) || onRefresh);\n const toolbarApi = { data: dataSource };\n const btnSize = size === \"lg\" ? \"md\" : \"sm\";\n\n return (\n <div className={wrapperCls} style={style}>\n {loading && <LoadingOverlay />}\n\n {showToolbar && (\n <Toolbar\n title={title}\n tools={tools}\n onRefresh={onRefresh}\n toolbarApi={toolbarApi}\n btnSize={btnSize}\n />\n )}\n\n <div\n ref={containerRef}\n className={[\n \"aui-table-container\",\n scroll?.y ? \"aui-table-scroll-y\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={containerStyle}\n >\n <table className=\"aui-table\" style={tableStyle}>\n <thead className=\"aui-table-thead\">\n {/* ── Single-row header (no groups) ── */}\n {!hasGroup && (\n <tr>\n {rowSelection && (\n <th className=\"aui-table-th aui-table-selection-th\">\n {!isRadio && (\n <TableCheckbox\n checked={allSelected}\n indeterminate={!allSelected && someSelected}\n onChange={toggleAll}\n />\n )}\n </th>\n )}\n {columns.map((col) => (\n <th\n key={col.key}\n className={`aui-table-th ${getColCls(col)}`}\n style={getCellStyle(col)}\n >\n {col.title}\n </th>\n ))}\n {hasRowOps && (\n <th\n className=\"aui-table-th\"\n style={{\n width: rowOperations!.width\n ? `${rowOperations!.width}px`\n : undefined,\n }}\n >\n 操作\n </th>\n )}\n </tr>\n )}\n\n {/* ── Two-row grouped header ── */}\n {hasGroup && headerSegments && (\n <>\n <tr>\n {rowSelection && (\n <th\n className=\"aui-table-th aui-table-selection-th\"\n rowSpan={2}\n >\n {!isRadio && (\n <TableCheckbox\n checked={allSelected}\n indeterminate={!allSelected && someSelected}\n onChange={toggleAll}\n />\n )}\n </th>\n )}\n {headerSegments.map((seg, i) =>\n seg.type === \"leaf\" ? (\n <th\n key={seg.col.key}\n className={`aui-table-th ${getColCls(seg.col)}`}\n style={getCellStyle(seg.col)}\n rowSpan={2}\n >\n {seg.col.title}\n </th>\n ) : (\n <th\n key={`group-${i}`}\n className=\"aui-table-th aui-table-th-group\"\n colSpan={seg.cols.length}\n >\n {seg.label}\n </th>\n )\n )}\n {hasRowOps && (\n <th\n className=\"aui-table-th\"\n rowSpan={2}\n style={{\n width: rowOperations!.width\n ? `${rowOperations!.width}px`\n : undefined,\n }}\n >\n 操作\n </th>\n )}\n </tr>\n <tr\n className={\n // last grouped leaf isn't the last column → `:last-child` wrongly removes its border-right\n groupedLeafCols.length > 0 &&\n (groupedLeafCols[groupedLeafCols.length - 1].key !==\n columns[columns.length - 1].key ||\n hasRowOps)\n ? \"aui-table-thead-sub aui-table-thead-sub-gap\"\n : \"aui-table-thead-sub\"\n }\n >\n {groupedLeafCols.map((col) => (\n <th\n key={col.key}\n className={`aui-table-th ${getColCls(col)}`}\n style={getCellStyle(col)}\n >\n {col.title}\n </th>\n ))}\n </tr>\n </>\n )}\n </thead>\n\n <tbody className=\"aui-table-tbody\">\n {dataSource.length === 0 ? (\n <tr>\n <td colSpan={totalCols} className=\"aui-table-empty-cell\">\n <EmptyState content={empty} />\n </td>\n </tr>\n ) : (\n <>\n {topSpacerHeight > 0 && (\n <tr className=\"aui-table-virtual-spacer\" aria-hidden=\"true\">\n <td\n colSpan={totalCols}\n style={{\n height: topSpacerHeight,\n padding: 0,\n border: \"none\",\n }}\n />\n </tr>\n )}\n {visibleFlatRows.map(\n ({ record, depth, key, hasChildren }, offset) => {\n const rowIndex = startIdx + offset;\n const isSelected = selectedSet.has(String(key));\n const isDisabled =\n rowSelection?.getCheckboxProps?.(record)?.disabled ??\n false;\n const isExpanded = expandedSet.has(String(key));\n return (\n <tr\n key={key}\n className={[\n \"aui-table-row\",\n isSelected ? \"aui-table-row-selected\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() =>\n rowSelection && !isDisabled && toggleRow(String(key))\n }\n >\n {rowSelection && (\n <td className=\"aui-table-td aui-table-selection-td\">\n {isRadio ? (\n <TableRadio\n checked={isSelected}\n disabled={isDisabled}\n onChange={() =>\n !isDisabled && toggleRow(String(key))\n }\n />\n ) : (\n <TableCheckbox\n checked={isSelected}\n disabled={isDisabled}\n onChange={() =>\n !isDisabled && toggleRow(String(key))\n }\n />\n )}\n </td>\n )}\n {columns.map((col, colIdx) => {\n const cellContent = col.render\n ? col.render(\n getCellValue(record, col),\n record,\n rowIndex\n )\n : getCellValue(record, col);\n return (\n <td\n key={col.key}\n className={`aui-table-td ${getColCls(col)}`}\n style={getCellStyle(col)}\n >\n {isTreeMode && colIdx === 0 ? (\n <span className=\"aui-table-tree-cell\">\n <span\n className=\"aui-table-tree-indent\"\n style={{\n width: depth * indentSize,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n {hasChildren ? (\n <span\n className=\"aui-table-expand-icon\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(record, key);\n }}\n >\n <ExpandIcon expanded={isExpanded} />\n </span>\n ) : (\n <span className=\"aui-table-expand-icon-placeholder\" />\n )}\n {cellContent}\n </span>\n ) : (\n cellContent\n )}\n </td>\n );\n })}\n {hasRowOps && (\n <td className=\"aui-table-td\">\n <RowOperationCell\n record={record}\n menus={rowOperations!.menus!}\n maxCount={rowOperations!.maxCount ?? 3}\n search={onRefresh}\n />\n </td>\n )}\n </tr>\n );\n }\n )}\n {bottomSpacerHeight > 0 && (\n <tr className=\"aui-table-virtual-spacer\" aria-hidden=\"true\">\n <td\n colSpan={totalCols}\n style={{\n height: bottomSpacerHeight,\n padding: 0,\n border: \"none\",\n }}\n />\n </tr>\n )}\n </>\n )}\n </tbody>\n\n {summary && summary.length > 0 && (\n <tfoot className=\"aui-table-tfoot\">\n {summary.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"aui-table-summary-row\">\n {rowSelection && (\n <td className=\"aui-table-td aui-table-summary-td\" />\n )}\n {row.map((cell, cellIdx) => (\n <td\n key={cellIdx}\n className=\"aui-table-td aui-table-summary-td\"\n colSpan={cell.colSpan}\n rowSpan={cell.rowSpan}\n >\n {cell.render()}\n </td>\n ))}\n {hasRowOps && (\n <td className=\"aui-table-td aui-table-summary-td\" />\n )}\n </tr>\n ))}\n </tfoot>\n )}\n </table>\n </div>\n\n {paginationEnabled && (\n <div className=\"aui-table-pagination\">\n <Pagination\n {...pagination}\n total={dataSource.length}\n current={paginationPage}\n pageSize={paginationPageSize}\n onChange={handlePaginationChange}\n size={size === \"sm\" ? \"sm\" : \"md\"}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useContext, useRef, useEffect } from \"react\";\nimport { FormContext } from \"./context\";\nimport { normalizeName } from \"./types\";\nimport type { NamePath } from \"./types\";\nimport { FormItem } from \"./item\";\nimport type { FormItemProps } from \"./item\";\nimport { Table } from \"../table\";\n\nexport interface FormListProps {\n name: NamePath;\n items?: FormItemProps[];\n addText?: string;\n}\n\nconst IconPlus = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n);\n\nconst IconX = () => (\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nexport function FormList({ name, items = [], addText }: FormListProps) {\n const ctx = useContext(FormContext);\n const prefix = normalizeName(name);\n const counterRef = useRef(0);\n const [keys, setKeys] = useState<number[]>([]);\n\n const internalHooks = ctx.store.getInternalHooks();\n\n useEffect(() => {\n internalHooks.registerList(prefix);\n return () => internalHooks.unregisterList(prefix);\n }, [prefix, internalHooks]);\n\n const add = () => setKeys((prev) => [...prev, counterRef.current++]);\n\n const remove = (index: number) => {\n internalHooks.listRemove(prefix, index);\n setKeys((prev) => prev.filter((_, i) => i !== index));\n };\n\n const isRequired = (item: FormItemProps) =>\n item.required === true ||\n (item.rules as any[])?.some(\n (r: any) => typeof r !== \"function\" && r.required === true\n );\n\n const dataSource = keys.map((key, index) => ({ key, index }));\n\n const columns = [\n {\n key: \"_index\",\n title: \"序号\",\n width: 40,\n render: (_: any, __: any, index: number) => (\n <span\n style={{\n fontSize: 12,\n color: \"var(--aui-text-3,#aaa)\",\n userSelect: \"none\" as const,\n }}\n >\n {index + 1}\n </span>\n ),\n },\n ...items.map((item) => ({\n key: String(item.name ?? item.label),\n title: (\n <span>\n {isRequired(item) && (\n <span style={{ color: \"#ef4444\", marginRight: 3 }}>*</span>\n )}\n {item.label}\n </span>\n ),\n render: (_: any, record: { key: number; index: number }) => (\n <FormItem\n {...item}\n label={undefined}\n hideMessage\n name={\n item.name !== undefined\n ? `${prefix}.${record.index}.${normalizeName(\n item.name as NamePath\n )}`\n : undefined\n }\n style={{ marginBottom: 0, ...(item.style ?? {}) }}\n />\n ),\n })),\n {\n key: \"_action\",\n width: 48,\n align: \"center\" as const,\n // + 按钮内置在表头\n title: (\n <button\n type=\"button\"\n onClick={add}\n title={addText ?? \"添加\"}\n style={{\n width: 24,\n height: 24,\n border: \"1px solid var(--aui-border,#e2e2e3)\",\n borderRadius: 4,\n background: \"none\",\n cursor: \"pointer\",\n color: \"var(--aui-text-2,#555)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"border-color 0.15s, color 0.15s\",\n }}\n onMouseEnter={(e) => {\n const b = e.currentTarget;\n b.style.borderColor = \"var(--aui-primary,#646cff)\";\n b.style.color = \"var(--aui-primary,#646cff)\";\n }}\n onMouseLeave={(e) => {\n const b = e.currentTarget;\n b.style.borderColor = \"var(--aui-border,#e2e2e3)\";\n b.style.color = \"var(--aui-text-2,#555)\";\n }}\n >\n <IconPlus />\n </button>\n ),\n render: (_: any, record: { key: number; index: number }) => (\n <button\n type=\"button\"\n onClick={() => remove(record.index)}\n style={{\n width: 24,\n height: 24,\n border: \"none\",\n background: \"none\",\n cursor: \"pointer\",\n color: \"var(--aui-text-3,#aaa)\",\n borderRadius: 4,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 0.15s\",\n padding: 0,\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = \"#ef4444\")}\n onMouseLeave={(e) =>\n (e.currentTarget.style.color = \"var(--aui-text-3,#aaa)\")\n }\n >\n <IconX />\n </button>\n ),\n },\n ];\n\n return (\n <Table\n columns={columns}\n dataSource={dataSource}\n rowKey={(r: any) => r.key}\n bordered\n size=\"sm\"\n pagination={false}\n />\n );\n}\n","import React, { useEffect, useReducer, useCallback, useMemo } from \"react\";\nimport { Col } from \"../grid\";\nimport { useFormContext } from \"./context\";\nimport type { RuleItem, NamePath, ColConfig } from \"./types\";\nimport { normalizeName } from \"./types\";\nimport { Input } from \"../input\";\nimport type { InputProps } from \"../input\";\nimport { InputNumber } from \"../input-number\";\nimport type { InputNumberProps } from \"../input-number\";\nimport { Textarea } from \"../textarea\";\nimport type { TextareaProps } from \"../textarea\";\nimport { Select } from \"../select\";\nimport type { SelectProps } from \"../select\";\nimport { Switch } from \"../switch\";\nimport type { SwitchProps } from \"../switch\";\nimport { Checkbox } from \"../checkbox\";\nimport type { CheckboxProps, CheckboxGroupProps } from \"../checkbox\";\nimport { Radio } from \"../radio\";\nimport type { RadioGroupProps } from \"../radio\";\nimport { Slider } from \"../slider\";\nimport type { SliderProps } from \"../slider\";\nimport { Rate } from \"../rate\";\nimport type { RateProps } from \"../rate\";\nimport { DatePicker } from \"../datepicker\";\nimport type { DatePickerProps } from \"../datepicker\";\nimport { TimePicker } from \"../timepicker\";\nimport type { TimePickerProps, TimeRangePickerProps } from \"../timepicker\";\nimport { Upload } from \"../upload\";\nimport type { UploadProps } from \"../upload\";\nimport { TreeSelect } from \"../tree-select\";\nimport type { TreeSelectProps } from \"../tree-select\";\nimport { Cascader } from \"../cascader\";\nimport type { CascaderProps } from \"../cascader\";\nimport { FormList, FormListProps } from \"./list\";\n\nexport type FormItemType =\n | \"Input\"\n | \"InputNumber\"\n | \"Textarea\"\n | \"Select\"\n | \"Switch\"\n | \"Checkbox\"\n | \"CheckboxGroup\"\n | \"RadioGroup\"\n | \"Slider\"\n | \"Rate\"\n | \"DatePicker\"\n | \"TimePicker\"\n | \"TimeRangePicker\"\n | \"Upload\"\n | \"TreeSelect\"\n | \"Cascader\"\n | \"FormList\";\n\nconst COMPONENT_MAP: Record<FormItemType, React.ComponentType<any>> = {\n Input,\n InputNumber,\n Textarea,\n Select,\n Switch,\n Checkbox,\n CheckboxGroup: Checkbox.Group,\n RadioGroup: Radio.Group,\n Slider,\n Rate,\n DatePicker,\n TimePicker,\n TimeRangePicker: TimePicker.RangePicker,\n Upload,\n TreeSelect,\n Cascader,\n FormList,\n};\n\nconst TYPE_VALUE_PROP: Partial<Record<FormItemType, string>> = {\n Switch: \"checked\",\n Checkbox: \"checked\",\n Upload: \"fileList\",\n};\n\ntype ComponentPropsMap = {\n Input: InputProps;\n InputNumber: InputNumberProps;\n Textarea: TextareaProps;\n Select: SelectProps;\n Switch: SwitchProps;\n Checkbox: CheckboxProps;\n CheckboxGroup: CheckboxGroupProps;\n RadioGroup: RadioGroupProps;\n Slider: SliderProps;\n Rate: RateProps;\n DatePicker: DatePickerProps;\n TimePicker: TimePickerProps;\n TimeRangePicker: TimeRangePickerProps;\n Upload: UploadProps;\n TreeSelect: TreeSelectProps;\n Cascader: CascaderProps;\n FormList: FormListProps;\n};\n\nexport interface FormItemRenderProps {\n form: import(\"./types\").FormInstance;\n value?: any;\n onChange?: (...args: any[]) => void;\n onBlur?: () => void;\n status?: \"error\" | \"\";\n}\n\nexport type FormItemRenderFn = React.ComponentType<\n FormItemRenderProps & Record<string, any>\n>;\n\ntype TypedProps =\n | {\n [K in FormItemType]: { type: K; props?: Partial<ComponentPropsMap[K]> };\n }[FormItemType]\n | { type: FormItemRenderFn; props?: Record<string, any> }\n | { type: string; props?: Record<string, any> }\n | { type?: undefined; props?: never };\n\ninterface FormItemBaseProps {\n name?: NamePath;\n label?: React.ReactNode;\n rules?: RuleItem[];\n required?: boolean;\n colon?: boolean;\n labelCol?: ColConfig;\n wrapperCol?: ColConfig;\n validateTrigger?: string | string[];\n valuePropName?: string;\n getValueFromEvent?: (...args: any[]) => any;\n help?: React.ReactNode;\n extra?: React.ReactNode;\n noStyle?: boolean;\n hideMessage?: boolean;\n span?: number;\n effect?: NamePath[];\n visible?: (form: import(\"./types\").FormInstance) => boolean;\n mergeProps?: (form: import(\"./types\").FormInstance) => Record<string, any>;\n normalize?: (value: any, prevValue: any, prevValues: any) => any;\n initialValue?: any;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport type FormItemProps = FormItemBaseProps & TypedProps;\n\nfunction defaultGetValueFromEvent(firstArg: any): any {\n if (typeof firstArg === \"boolean\") return firstArg;\n if (firstArg && firstArg.target) {\n if (firstArg.target.type === \"checkbox\") return firstArg.target.checked;\n return firstArg.target.value;\n }\n return firstArg;\n}\n\nconst AUTO_REQUIRED_RULE: RuleItem = { required: true, message: \"不能为空\" };\n\nexport function FormItem({\n name,\n label,\n rules = [] as RuleItem[],\n required,\n colon: colonProp,\n labelCol: labelColProp,\n wrapperCol: wrapperColProp,\n validateTrigger: validateTriggerProp,\n valuePropName: valuePropNameProp,\n getValueFromEvent,\n help,\n extra,\n noStyle,\n hideMessage,\n span = 1,\n effect,\n visible,\n normalize,\n initialValue,\n type,\n props: componentProps,\n mergeProps,\n className,\n style,\n}: FormItemProps) {\n const ctx = useFormContext();\n const {\n store,\n layout,\n colon: ctxColon,\n requiredMark,\n validateTrigger: ctxTrigger,\n column,\n } = ctx;\n\n const resolvedLabelCol = labelColProp ?? ctx.labelCol;\n const resolvedWrapperCol = wrapperColProp ?? ctx.wrapperCol;\n const resolvedColon = colonProp !== undefined ? colonProp : ctxColon;\n const valuePropName =\n valuePropNameProp ??\n (typeof type === \"string\"\n ? TYPE_VALUE_PROP[type as FormItemType]\n : undefined) ??\n \"value\";\n const resolvedTrigger = useMemo(\n () =>\n validateTriggerProp !== undefined\n ? Array.isArray(validateTriggerProp)\n ? validateTriggerProp\n : [validateTriggerProp]\n : ctxTrigger,\n [validateTriggerProp, ctxTrigger]\n );\n\n const [, forceUpdate] = useReducer((x: number) => x + 1, 0);\n\n const normalizedName = name !== undefined ? normalizeName(name) : undefined;\n\n const internalHooks = useMemo(() => store.getInternalHooks(), [store]);\n\n const effectiveRules = useMemo(() => {\n if (\n required === true &&\n !rules.some((r) => typeof r !== \"function\" && r.required === true)\n ) {\n return [AUTO_REQUIRED_RULE, ...rules];\n }\n return rules;\n }, [required, rules]);\n\n // Register field\n useEffect(() => {\n if (normalizedName === undefined) return;\n internalHooks.registerField(normalizedName, effectiveRules, initialValue);\n return () => internalHooks.unregisterField(normalizedName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [normalizedName]);\n\n // Update rules when they change\n useEffect(() => {\n if (normalizedName !== undefined) {\n internalHooks.registerField(normalizedName, effectiveRules, undefined);\n }\n }, [normalizedName, internalHooks, effectiveRules]);\n\n // Subscribe to field changes\n useEffect(() => {\n if (normalizedName === undefined) return;\n return internalHooks.subscribeField(normalizedName, forceUpdate);\n }, [normalizedName, internalHooks]);\n\n // Subscribe to effect\n useEffect(() => {\n if (!effect?.length) return;\n const unsubs = effect.map((dep) =>\n internalHooks.subscribeField(normalizeName(dep), forceUpdate)\n );\n return () => unsubs.forEach((fn) => fn());\n }, [effect, internalHooks]);\n\n const getValue = useCallback(\n () =>\n normalizedName !== undefined\n ? store.getFieldValue(normalizedName)\n : undefined,\n [normalizedName, store]\n );\n\n const errors =\n normalizedName !== undefined ? store.getFieldError(normalizedName) : [];\n\n const handleChange = useCallback(\n (...args: any[]) => {\n if (normalizedName === undefined) return;\n const rawValue = getValueFromEvent\n ? getValueFromEvent(...args)\n : defaultGetValueFromEvent(args[0]);\n const finalValue = normalize\n ? normalize(\n rawValue,\n store.getFieldValue(normalizedName),\n store.getFieldsValue()\n )\n : rawValue;\n store.setFieldValue(normalizedName, finalValue);\n if (resolvedTrigger.includes(\"onChange\")) {\n internalHooks.validateField(normalizedName);\n }\n },\n [\n normalizedName,\n getValueFromEvent,\n normalize,\n store,\n resolvedTrigger,\n internalHooks,\n ]\n );\n\n const handleBlur = useCallback(() => {\n if (normalizedName === undefined) return;\n if (resolvedTrigger.includes(\"onBlur\")) {\n internalHooks.validateField(normalizedName);\n }\n }, [normalizedName, resolvedTrigger, internalHooks]);\n\n const isRequired =\n required !== undefined\n ? required\n : effectiveRules.some(\n (r) => typeof r !== \"function\" && r.required === true\n );\n\n const hasError = errors.length > 0;\n\n if (visible !== undefined && !visible(store.getPublicInstance())) {\n return null;\n }\n\n // Build child control\n const resolveComp = (t: typeof type) => {\n if (!t) return undefined;\n if (typeof t === \"function\") return t;\n return (COMPONENT_MAP as any)[t] ?? ctx.widget?.[t as string];\n };\n\n const extraProps = mergeProps\n ? mergeProps(store.getPublicInstance())\n : undefined;\n\n // 用户可能在 props / mergeProps 里传入自己的 onChange / onBlur,需要与内部处理组合调用\n const userOnChange =\n (extraProps as any)?.onChange ?? (componentProps as any)?.onChange;\n const composedOnChange = userOnChange\n ? (...args: any[]) => {\n handleChange(...args);\n userOnChange(...args);\n }\n : handleChange;\n\n const userOnBlur =\n (extraProps as any)?.onBlur ?? (componentProps as any)?.onBlur;\n const composedOnBlur = userOnBlur\n ? () => {\n handleBlur();\n userOnBlur();\n }\n : handleBlur;\n\n let controlNode: React.ReactNode = undefined;\n if (normalizedName !== undefined && type !== undefined) {\n const Comp = resolveComp(type);\n if (Comp) {\n const value = getValue();\n const isCustom =\n typeof type === \"function\" || !!ctx.widget?.[type as string];\n controlNode = React.createElement(Comp, {\n ...(isCustom\n ? { form: store.getPublicInstance(), status: hasError ? \"error\" : \"\" }\n : {}),\n ...componentProps,\n ...extraProps,\n [valuePropName]: value,\n onChange: composedOnChange,\n onBlur: composedOnBlur,\n id: ctx.name ? `${ctx.name}_${normalizedName}` : normalizedName,\n });\n }\n } else if (type !== undefined) {\n const Comp = resolveComp(type);\n if (Comp)\n controlNode = React.createElement(Comp, {\n ...componentProps,\n ...extraProps,\n });\n }\n\n if (noStyle) {\n return <>{controlNode}</>;\n }\n\n const labelStyle: React.CSSProperties =\n layout === \"horizontal\" && resolvedLabelCol.span !== undefined\n ? { width: `${(resolvedLabelCol.span / 24) * 100}%` }\n : {};\n const controlStyle: React.CSSProperties =\n layout === \"horizontal\" && resolvedWrapperCol.span !== undefined\n ? { width: `${(resolvedWrapperCol.span / 24) * 100}%` }\n : {};\n\n const itemClasses = [\n \"aui-form-item\",\n hasError ? \"aui-form-item-has-error\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const labelId = ctx.name ? `${ctx.name}_${normalizedName}` : normalizedName;\n\n const labelContent = (\n <label\n className={[\n requiredMark && isRequired ? \"aui-form-item-required\" : \"\",\n !resolvedColon ? \"aui-form-item-no-colon\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n htmlFor={labelId}\n >\n {label}\n </label>\n );\n\n const explainContent =\n !hideMessage && (normalizedName !== undefined || help) ? (\n <div className=\"aui-form-item-explain\">\n {hasError\n ? errors.map((err: string, i: number) => (\n <div key={i} className=\"aui-form-item-explain-error\">\n {err}\n </div>\n ))\n : help && <div className=\"aui-form-item-explain-help\">{help}</div>}\n </div>\n ) : null;\n\n const itemEl =\n layout === \"inline\" ? (\n <div className={itemClasses} style={style}>\n {label && <div className=\"aui-form-item-label\">{labelContent}</div>}\n <div className=\"aui-form-item-control\">\n <div className=\"aui-form-item-control-input\">{controlNode}</div>\n {explainContent}\n {extra && <div className=\"aui-form-item-extra\">{extra}</div>}\n </div>\n </div>\n ) : (\n <div className={itemClasses} style={style}>\n <div className=\"aui-form-item-row\">\n {label !== undefined && (\n <div className=\"aui-form-item-label\" style={labelStyle}>\n {labelContent}\n </div>\n )}\n <div\n className=\"aui-form-item-control\"\n style={label !== undefined ? controlStyle : undefined}\n >\n <div className=\"aui-form-item-control-input\">{controlNode}</div>\n {explainContent}\n {extra && <div className=\"aui-form-item-extra\">{extra}</div>}\n </div>\n </div>\n </div>\n );\n\n if (column !== undefined) {\n const colSpan = Math.min(Math.round((span * 24) / column), 24);\n return <Col span={colSpan}>{itemEl}</Col>;\n }\n\n return itemEl;\n}\n","import React, { useRef, useEffect, useCallback, useMemo } from \"react\";\nimport \"./form.css\";\nimport { Row } from \"../grid\";\nimport { FormStore, getFormStore } from \"./store\";\nimport { FormContext } from \"./context\";\nimport { FormItem } from \"./item\";\nimport type { FormItemProps } from \"./item\";\nimport { FormList } from \"./list\";\nimport type {\n FormInstance,\n FormContextValue,\n FieldError,\n ColConfig,\n} from \"./types\";\n\nexport { FormItem };\nexport type {\n FormItemProps,\n FormItemType,\n FormItemRenderProps,\n FormItemRenderFn,\n} from \"./item\";\nexport { FormList };\nexport type { FormListProps } from \"./list\";\n\n// ─── useForm ──────────────────────────────────────────────────────────────────\n\nexport function useForm<Values = any>(): [FormInstance<Values>] {\n const storeRef = useRef<FormStore<Values> | null>(null);\n if (!storeRef.current) storeRef.current = new FormStore<Values>();\n return [storeRef.current.getPublicInstance()];\n}\n\n// ─── Form ─────────────────────────────────────────────────────────────────────\n\nexport interface FormProps<Values = any> {\n form?: FormInstance<Values>;\n onFinish?: (values: Values) => void;\n onFinishFailed?: (info: {\n values: Values;\n errorFields: FieldError[];\n }) => void;\n initialValues?: Partial<Values>;\n layout?: \"horizontal\" | \"vertical\" | \"inline\";\n labelCol?: ColConfig;\n wrapperCol?: ColConfig;\n colon?: boolean;\n requiredMark?: boolean;\n validateTrigger?: string | string[];\n onValuesChange?: (changed: Partial<Values>, all: Values) => void;\n name?: string;\n column?: number;\n items?: FormItemProps[];\n widget?: Record<string, React.ComponentType<any>>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Form<Values = any>({\n form,\n onFinish,\n onFinishFailed,\n initialValues,\n layout = \"horizontal\",\n labelCol = { span: 6 },\n wrapperCol = { span: 18 },\n colon = true,\n requiredMark = true,\n validateTrigger = \"onChange\",\n onValuesChange,\n name,\n column,\n items,\n widget,\n className,\n style,\n}: FormProps<Values>) {\n const storeRef = useRef<FormStore<Values> | null>(null);\n if (!storeRef.current) {\n storeRef.current =\n (form !== undefined ? getFormStore(form) : undefined) ??\n new FormStore<Values>();\n }\n const store = storeRef.current;\n\n const internalHooks = useMemo(() => store.getInternalHooks(), [store]);\n\n const initializedRef = useRef(false);\n if (!initializedRef.current) {\n if (initialValues) {\n internalHooks.setInitialValues(initialValues as any, true);\n }\n initializedRef.current = true;\n }\n\n useEffect(() => {\n internalHooks.setCallbacks({\n onFinish: onFinish as any,\n onFinishFailed: onFinishFailed as any,\n onValuesChange: onValuesChange as any,\n });\n }, [onFinish, onFinishFailed, onValuesChange, internalHooks]);\n\n const triggers = useMemo(\n () =>\n Array.isArray(validateTrigger) ? validateTrigger : [validateTrigger],\n [validateTrigger]\n );\n\n const ctx: FormContextValue = useMemo(\n () => ({\n store,\n layout,\n labelCol,\n wrapperCol,\n colon,\n requiredMark,\n validateTrigger: triggers,\n name,\n column,\n widget,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n store,\n layout,\n labelCol,\n wrapperCol,\n colon,\n requiredMark,\n triggers,\n name,\n column,\n widget,\n ]\n );\n\n const handleSubmit = useCallback(\n (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n e.stopPropagation();\n store.submit();\n },\n [store]\n );\n\n const classes = [\"aui-form\", `aui-form-${layout}`, className]\n .filter(Boolean)\n .join(\" \");\n\n const renderItem = (itemProps: FormItemProps, i: number) => {\n if ((itemProps as any).type === \"FormList\") {\n const { name: listName, props: listProps } = itemProps as any;\n return <FormList key={i} name={listName} {...(listProps ?? {})} />;\n }\n return <FormItem key={i} {...(itemProps as any)} />;\n };\n\n return (\n <FormContext.Provider value={ctx}>\n <form\n className={classes}\n style={style}\n onSubmit={handleSubmit}\n name={name}\n >\n {column ? (\n <Row gutter={[8, 0]}>{items?.map(renderItem)}</Row>\n ) : (\n items?.map(renderItem)\n )}\n </form>\n </FormContext.Provider>\n );\n}\n\n// ─── Attach statics ───────────────────────────────────────────────────────────\n\nForm.Item = FormItem;\nForm.List = FormList;\nForm.useForm = useForm;\n","import React, { useState } from \"react\";\nimport { Dropdown } from \"../dropdown\";\nimport { Icon } from \"../icon\";\nimport type { DropdownItem } from \"../dropdown\";\nimport \"./breadcrumb.css\";\n\nexport interface BreadcrumbItem {\n label: React.ReactNode;\n href?: string;\n onClick?: (e: React.MouseEvent) => void;\n menu?: DropdownItem[];\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n fontSize?: number | string;\n max?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Breadcrumb({\n items,\n separator = \"/\",\n fontSize,\n max,\n className,\n style,\n}: BreadcrumbProps) {\n type Slot =\n | { kind: \"item\"; item: BreadcrumbItem; isLast: boolean }\n | { kind: \"ellipsis\"; hidden: BreadcrumbItem[] };\n\n let slots: Slot[];\n\n if (max && items.length > max) {\n const keepLast = max - 1;\n const hidden = items.slice(1, items.length - keepLast);\n slots = [\n { kind: \"item\", item: items[0], isLast: false },\n { kind: \"ellipsis\", hidden },\n ...items.slice(items.length - keepLast).map((item, i, arr) => ({\n kind: \"item\" as const,\n item,\n isLast: i === arr.length - 1,\n })),\n ];\n } else {\n slots = items.map((item, i) => ({\n kind: \"item\" as const,\n item,\n isLast: i === items.length - 1,\n }));\n }\n\n const containerStyle: React.CSSProperties = {\n ...style,\n ...(fontSize != null\n ? { fontSize: typeof fontSize === \"number\" ? `${fontSize}px` : fontSize }\n : {}),\n };\n\n return (\n <nav\n className={[\"aui-breadcrumb\", className].filter(Boolean).join(\" \")}\n style={containerStyle}\n aria-label=\"breadcrumb\"\n >\n <ol className=\"aui-breadcrumb-list\">\n {slots.map((slot, i) => (\n <React.Fragment key={i}>\n {i > 0 && (\n <li className=\"aui-breadcrumb-sep\" aria-hidden=\"true\">\n {separator}\n </li>\n )}\n {slot.kind === \"ellipsis\" ? (\n <EllipsisSlot hidden={slot.hidden} />\n ) : (\n <ItemSlot item={slot.item} isLast={slot.isLast} />\n )}\n </React.Fragment>\n ))}\n </ol>\n </nav>\n );\n}\n\nfunction EllipsisSlot({ hidden }: { hidden: BreadcrumbItem[] }) {\n const dropdownItems: DropdownItem[] = hidden.map((item, i) => ({\n key: i,\n label: item.label,\n onClick: item.onClick\n ? () => item.onClick?.({} as React.MouseEvent)\n : undefined,\n }));\n\n if (dropdownItems.length === 0) {\n return (\n <li className=\"aui-breadcrumb-item\">\n <span className=\"aui-breadcrumb-ellipsis-text\">…</span>\n </li>\n );\n }\n\n return (\n <li className=\"aui-breadcrumb-item\">\n <Dropdown items={dropdownItems} trigger=\"click\">\n <span className=\"aui-breadcrumb-link aui-breadcrumb-ellipsis-text\">\n …\n </span>\n </Dropdown>\n </li>\n );\n}\n\nfunction ItemSlot({ item, isLast }: { item: BreadcrumbItem; isLast: boolean }) {\n const [dropdownOpen, setDropdownOpen] = useState(false);\n\n if (isLast) {\n return (\n <li className=\"aui-breadcrumb-item\">\n <span className=\"aui-breadcrumb-current\">{item.label}</span>\n </li>\n );\n }\n\n if (item.menu && item.menu.length > 0) {\n return (\n <li className=\"aui-breadcrumb-item\">\n <Dropdown\n items={item.menu}\n trigger=\"click\"\n onOpenChange={setDropdownOpen}\n >\n <span className=\"aui-breadcrumb-link aui-breadcrumb-has-menu\">\n {item.label}\n <Icon\n name=\"chevron-down\"\n size={12}\n style={{\n marginLeft: 2,\n transition: \"transform 0.2s\",\n transform: dropdownOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n />\n </span>\n </Dropdown>\n </li>\n );\n }\n\n if (item.href) {\n return (\n <li className=\"aui-breadcrumb-item\">\n <a\n className=\"aui-breadcrumb-link\"\n href={item.href}\n onClick={item.onClick}\n >\n {item.label}\n </a>\n </li>\n );\n }\n\n return (\n <li className=\"aui-breadcrumb-item\">\n <span\n className=\"aui-breadcrumb-link\"\n onClick={item.onClick}\n style={item.onClick ? { cursor: \"pointer\" } : undefined}\n >\n {item.label}\n </span>\n </li>\n );\n}\n","import React, { useState } from \"react\";\nimport { Icon } from \"../icon\";\nimport type { IconName } from \"../icon\";\nimport \"./alert.css\";\n\nexport type AlertType = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface AlertProps {\n type?: AlertType;\n message: React.ReactNode;\n description?: React.ReactNode;\n closable?: boolean;\n showIcon?: boolean;\n onClose?: () => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst iconMap: Record<AlertType, IconName> = {\n info: \"circle-info\",\n success: \"circle-check\",\n warning: \"circle-warn\",\n danger: \"circle-x\",\n};\n\nexport function Alert({\n type = \"info\",\n message,\n description,\n closable = false,\n showIcon = true,\n onClose,\n className,\n style,\n}: AlertProps) {\n const [closed, setClosed] = useState(false);\n\n if (closed) return null;\n\n const handleClose = () => {\n setClosed(true);\n onClose?.();\n };\n\n const cls = [\n \"aui-alert\",\n `aui-alert-${type}`,\n description ? \"aui-alert-with-desc\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style} role=\"alert\">\n {showIcon && (\n <span className=\"aui-alert-icon\">\n <Icon name={iconMap[type]} size={description ? 20 : 16} />\n </span>\n )}\n <div className=\"aui-alert-content\">\n <div className=\"aui-alert-message\">{message}</div>\n {description && (\n <div className=\"aui-alert-description\">{description}</div>\n )}\n </div>\n {closable && (\n <button className=\"aui-alert-close\" onClick={handleClose} aria-label=\"关闭\">\n <Icon name=\"x\" size={14} />\n </button>\n )}\n </div>\n );\n}\n","export type BasePlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Flip a base direction */\nexport function flipBase(p: string): BasePlacement {\n if (p.startsWith(\"top\")) return \"bottom\";\n if (p.startsWith(\"bottom\")) return \"top\";\n if (p.startsWith(\"left\")) return \"right\";\n if (p.startsWith(\"right\")) return \"left\";\n return \"bottom\";\n}\n\n/** Flip a placement preserving the variant suffix */\nexport function flipPlacement(p: string): string {\n if (p.startsWith(\"top\")) return \"bottom\" + p.slice(3);\n if (p.startsWith(\"bottom\")) return \"top\" + p.slice(6);\n if (p.startsWith(\"left\")) return \"right\" + p.slice(4);\n if (p.startsWith(\"right\")) return \"left\" + p.slice(5);\n return p;\n}\n\n/**\n * Check if the tooltip/popover overflows the viewport in its primary axis.\n * `pos` must be the raw (unclamped) top/left values.\n */\nexport function isOverflowing(\n p: string,\n top: number,\n left: number,\n fW: number,\n fH: number\n): boolean {\n if (p.startsWith(\"top\")) return top < 0;\n if (p.startsWith(\"bottom\")) return top + fH > window.innerHeight;\n if (p.startsWith(\"left\")) return left < 0;\n if (p.startsWith(\"right\")) return left + fW > window.innerWidth;\n return false;\n}\n\n/** Clamp top/left so the floating element stays within the viewport */\nexport function clampToViewport(\n top: number,\n left: number,\n fW: number,\n fH: number,\n margin = 4\n): { top: number; left: number } {\n return {\n top: Math.max(margin, Math.min(top, window.innerHeight - fH - margin)),\n left: Math.max(margin, Math.min(left, window.innerWidth - fW - margin)),\n };\n}\n\n/**\n * Resolve the effective placement with auto-flip.\n * Tries `preferred`, flips to opposite if it overflows.\n * Returns the final placement and clamped position.\n */\nexport function resolvePlacement<T extends string>(\n preferred: T,\n triggerRect: DOMRect,\n fW: number,\n fH: number,\n offset: number,\n compute: (\n p: T,\n tRect: DOMRect,\n fW: number,\n fH: number,\n offset: number\n ) => { top: number; left: number }\n): { placement: T; top: number; left: number } {\n let p = preferred;\n let { top, left } = compute(p, triggerRect, fW, fH, offset);\n\n if (isOverflowing(p, top, left, fW, fH)) {\n const flipped = flipPlacement(p) as T;\n const flippedPos = compute(flipped, triggerRect, fW, fH, offset);\n // Only flip if the opposite direction actually fits better\n if (!isOverflowing(flipped, flippedPos.top, flippedPos.left, fW, fH)) {\n p = flipped;\n top = flippedPos.top;\n left = flippedPos.left;\n }\n }\n\n const clamped = clampToViewport(top, left, fW, fH);\n return { placement: p, ...clamped };\n}\n","import React, {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { resolvePlacement } from \"./util\";\nimport \"./popover.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type PopoverTrigger = \"click\" | \"hover\";\n\nexport interface PopoverProps {\n children: React.ReactElement;\n title?: React.ReactNode;\n content?: React.ReactNode;\n placement?: PopoverPlacement;\n trigger?: PopoverTrigger;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n offset?: number;\n style?: React.CSSProperties;\n className?: string;\n}\n\nfunction calcPopoverPos(\n p: PopoverPlacement,\n tRect: DOMRect,\n pW: number,\n pH: number,\n offset: number\n) {\n let top: number, left: number;\n switch (p) {\n case \"top\":\n top = tRect.top - pH - offset;\n left = tRect.left + (tRect.width - pW) / 2;\n break;\n case \"left\":\n top = tRect.top + (tRect.height - pH) / 2;\n left = tRect.left - pW - offset;\n break;\n case \"right\":\n top = tRect.top + (tRect.height - pH) / 2;\n left = tRect.right + offset;\n break;\n default: // bottom\n top = tRect.bottom + offset;\n left = tRect.left + (tRect.width - pW) / 2;\n }\n return { top, left };\n}\n\nexport function Popover({\n children,\n title,\n content,\n placement = \"bottom\",\n trigger = \"click\",\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n offset = 8,\n style,\n className,\n}: PopoverProps) {\n const isControlled = openProp !== undefined;\n const [localOpen, setLocalOpen] = useState(defaultOpen);\n const isOpen = isControlled ? openProp! : localOpen;\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n // Keep callbacks in refs so event handlers never go stale\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setLocalOpen(next);\n onOpenChangeRef.current?.(next);\n },\n [isControlled]\n );\n\n // Position updater stored in ref: always captures latest placement/offset,\n // but scroll handler never needs to re-bind — zero React overhead on scroll.\n const applyPosDOMRef = useRef(() => {});\n applyPosDOMRef.current = () => {\n const triggerEl = triggerRef.current;\n const popoverEl = popoverRef.current;\n if (!triggerEl || !popoverEl) return;\n\n const tRect = triggerEl.getBoundingClientRect();\n const pW = popoverEl.offsetWidth;\n const pH = popoverEl.offsetHeight;\n\n const result = resolvePlacement(\n placement,\n tRect,\n pW,\n pH,\n offset,\n calcPopoverPos\n );\n\n popoverEl.style.top = `${result.top}px`;\n popoverEl.style.left = `${result.left}px`;\n popoverEl.style.visibility = \"visible\";\n\n const nextCls = `aui-popover-${result.placement}`;\n if (!popoverEl.classList.contains(nextCls)) {\n popoverEl.className = popoverEl.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"aui-popover-\") || c === \"aui-popover\")\n .concat(nextCls)\n .join(\" \");\n }\n };\n\n // First paint: runs synchronously after DOM mutations, before browser paint.\n // Measures popover size, applies correct position, then reveals — no flicker.\n useLayoutEffect(() => {\n if (!isOpen) return;\n applyPosDOMRef.current();\n }, [isOpen]);\n\n // Scroll / resize: direct DOM mutation, scroll handler never re-binds.\n useEffect(() => {\n if (!isOpen) return;\n const handle = () => applyPosDOMRef.current();\n window.addEventListener(\"scroll\", handle, { capture: true, passive: true });\n window.addEventListener(\"resize\", handle);\n return () => {\n window.removeEventListener(\"scroll\", handle, true);\n window.removeEventListener(\"resize\", handle);\n };\n }, [isOpen]);\n\n // Click outside (click trigger only)\n useEffect(() => {\n if (!isOpen || trigger !== \"click\") return;\n const handler = (e: MouseEvent) => {\n if (\n !triggerRef.current?.contains(e.target as Node) &&\n !popoverRef.current?.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isOpen, trigger, setOpen]);\n\n // Escape key\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, setOpen]);\n\n const triggerProps =\n trigger === \"click\"\n ? { onClick: () => setOpen(!isOpen) }\n : {\n onMouseEnter: () => {\n clearTimeout(closeTimerRef.current);\n setOpen(true);\n },\n onMouseLeave: () => {\n closeTimerRef.current = setTimeout(() => setOpen(false), 150);\n },\n };\n\n const popoverHoverProps =\n trigger === \"hover\"\n ? {\n onMouseEnter: () => clearTimeout(closeTimerRef.current),\n onMouseLeave: () => {\n closeTimerRef.current = setTimeout(() => setOpen(false), 150);\n },\n }\n : {};\n\n const popoverCls = [\"aui-popover\", `aui-popover-${placement}`, className]\n .filter(Boolean)\n .join(\" \");\n\n const portal =\n isOpen && typeof document !== \"undefined\"\n ? ReactDOM.createPortal(\n <div\n ref={popoverRef}\n className={popoverCls}\n style={style}\n {...popoverHoverProps}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"aui-popover-arrow\" />\n <div className=\"aui-popover-inner\">\n {title !== undefined && (\n <div className=\"aui-popover-title\">{title}</div>\n )}\n {content !== undefined && (\n <div className=\"aui-popover-content\">{content}</div>\n )}\n </div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <>\n <span ref={triggerRef} className=\"aui-popover-trigger\" {...triggerProps}>\n {children}\n </span>\n {portal}\n </>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Popover } from \"../popover\";\nimport \"./avatar.css\";\n\nexport type AvatarShape = \"circle\" | \"square\";\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\" | number;\n\nexport interface AvatarProps {\n src?: string;\n alt?: string;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n shape?: AvatarShape;\n size?: AvatarSize;\n color?: string;\n background?: string;\n gap?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport interface AvatarGroupProps {\n children: React.ReactNode;\n max?: number;\n renderMax?: (count: number) => React.ReactNode;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst SIZE_MAP: Record<string, number> = { sm: 28, md: 36, lg: 48 };\n\nfunction resolveSize(size: AvatarSize = \"md\"): number {\n return typeof size === \"number\" ? size : (SIZE_MAP[size] ?? 36);\n}\n\n// Default user icon (inline SVG, no dependency on Icon component)\nfunction UserIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"60%\" height=\"60%\">\n <path d=\"M12 12c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm0 2c-3.33 0-10 1.67-10 5v2h20v-2c0-3.33-6.67-5-10-5z\" />\n </svg>\n );\n}\n\nexport function Avatar({\n src,\n alt,\n icon,\n children,\n shape = \"circle\",\n size = \"md\",\n color,\n background,\n gap = 4,\n className,\n style,\n}: AvatarProps) {\n const sizeNum = resolveSize(size);\n const textRef = useRef<HTMLSpanElement>(null);\n const [scale, setScale] = useState(1);\n\n useEffect(() => {\n if (!textRef.current || !children) return;\n const available = sizeNum - gap * 2;\n const textW = textRef.current.scrollWidth;\n setScale(textW > available ? available / textW : 1);\n }, [children, sizeNum, gap]);\n\n const cls = [\n \"aui-avatar\",\n `aui-avatar-${shape}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const inlineStyle: React.CSSProperties = {\n width: sizeNum,\n height: sizeNum,\n fontSize: sizeNum * 0.42,\n ...(color ? { color } : {}),\n ...(background ? { background } : {}),\n ...style,\n };\n\n let content: React.ReactNode;\n\n if (src) {\n content = (\n <img className=\"aui-avatar-img\" src={src} alt={alt ?? \"\"} />\n );\n } else if (children != null) {\n content = (\n <span\n ref={textRef}\n className=\"aui-avatar-text\"\n style={scale !== 1 ? { transform: `scale(${scale})`, transformOrigin: \"center center\" } : undefined}\n >\n {children}\n </span>\n );\n } else {\n content = icon ?? <UserIcon />;\n }\n\n return (\n <span className={cls} style={inlineStyle}>\n {content}\n </span>\n );\n}\n\n// ── AvatarGroup ───────────────────────────────────────────────────────────────\n\nexport function AvatarGroup({\n children,\n max,\n renderMax,\n size,\n shape,\n className,\n style,\n}: AvatarGroupProps) {\n const items = React.Children.toArray(children);\n const total = items.length;\n\n let visible = items;\n let overflowCount = 0;\n\n if (max != null && total > max) {\n visible = items.slice(0, max);\n overflowCount = total - max;\n }\n\n const cls = [\"aui-avatar-group\", className].filter(Boolean).join(\" \");\n\n return (\n <div className={cls} style={style}>\n {visible.map((child, i) => {\n const extraProps: Partial<AvatarProps> = {};\n if (size != null) extraProps.size = size;\n if (shape != null) extraProps.shape = shape;\n return (\n <span key={i} className=\"aui-avatar-group-item\" style={{ zIndex: total - i }}>\n {React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<AvatarProps>, extraProps)\n : child}\n </span>\n );\n })}\n {overflowCount > 0 && (\n <span className=\"aui-avatar-group-item\" style={{ zIndex: 0 }}>\n <Popover\n trigger=\"hover\"\n placement=\"top\"\n content={\n <div className=\"aui-avatar-group-overflow-popover\">\n {items.slice(max!).map((child, i) => (\n <span key={i}>\n {React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<AvatarProps>, {\n size: size ?? \"md\",\n shape: shape,\n })\n : child}\n </span>\n ))}\n </div>\n }\n >\n <Avatar size={size} shape={shape}>\n {renderMax ? renderMax(overflowCount) : `+${overflowCount}`}\n </Avatar>\n </Popover>\n </span>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport \"./badge.css\";\n\nexport type BadgeStatus =\n | \"default\"\n | \"processing\"\n | \"error\"\n | \"warning\"\n | \"success\";\nexport type BadgeSize = \"default\" | \"small\";\n\nexport interface BadgeProps {\n count?: number;\n overflowCount?: number;\n dot?: boolean;\n status?: BadgeStatus;\n text?: React.ReactNode;\n size?: BadgeSize;\n showZero?: boolean;\n offset?: [number, number];\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Badge({\n count,\n overflowCount = 99,\n dot = false,\n status,\n text,\n size = \"default\",\n showZero = false,\n offset,\n children,\n className,\n style,\n}: BadgeProps) {\n // ── Standalone status dot (no children) ──────────────────────────────────\n if (!children && status) {\n return (\n <span\n className={[\"aui-badge-status-wrapper\", className]\n .filter(Boolean)\n .join(\" \")}\n style={style}\n >\n <span className={`aui-badge-status-dot aui-badge-status-${status}`} />\n {text && <span className=\"aui-badge-status-text\">{text}</span>}\n </span>\n );\n }\n\n // ── Badge wrapping a child ────────────────────────────────────────────────\n const hasCount = count !== undefined;\n const isOverflow = hasCount && count! > overflowCount;\n const displayContent = isOverflow ? `${overflowCount}+` : count;\n const visible = dot || (hasCount && (count! > 0 || showZero));\n\n const supStyle: React.CSSProperties = {};\n if (offset) {\n supStyle.marginTop = offset[1];\n supStyle.marginRight = -offset[0];\n }\n\n const supCls = [\n \"aui-badge-count\",\n dot ? \"aui-badge-dot\" : \"\",\n size === \"small\" ? \"aui-badge-count-sm\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span\n className={[\"aui-badge\", className].filter(Boolean).join(\" \")}\n style={style}\n >\n {children}\n {visible && (\n <sup className={supCls} style={supStyle}>\n {!dot && displayContent}\n </sup>\n )}\n </span>\n );\n}\n","import React, { useState, useEffect, useRef, useCallback } from \"react\";\nimport \"./carousel.css\";\n\nexport interface CarouselProps {\n children: React.ReactNode;\n autoplay?: boolean;\n autoplayInterval?: number;\n dots?: boolean;\n arrows?: boolean;\n loop?: boolean;\n defaultIndex?: number;\n index?: number;\n effect?: \"slide\" | \"fade\";\n onChange?: (index: number) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Carousel({\n children,\n autoplay = false,\n autoplayInterval = 3000,\n dots = true,\n arrows = true,\n loop = true,\n defaultIndex = 0,\n index: controlledIndex,\n effect = \"slide\",\n onChange,\n className,\n style,\n}: CarouselProps) {\n const slides = React.Children.toArray(children);\n const count = slides.length;\n\n const isControlled = controlledIndex !== undefined;\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\n const current = isControlled ? controlledIndex! : internalIndex;\n\n const [isPaused, setIsPaused] = useState(false);\n const currentRef = useRef(current);\n currentRef.current = current;\n\n const goTo = useCallback(\n (idx: number) => {\n const next = loop\n ? ((idx % count) + count) % count\n : Math.max(0, Math.min(count - 1, idx));\n if (!isControlled) setInternalIndex(next);\n onChange?.(next);\n },\n [count, loop, isControlled, onChange]\n );\n\n const prev = () => goTo(currentRef.current - 1);\n const next = () => goTo(currentRef.current + 1);\n\n useEffect(() => {\n if (!autoplay || isPaused || count <= 1) return;\n const id = setInterval(() => {\n const nextIdx = loop\n ? (currentRef.current + 1) % count\n : Math.min(currentRef.current + 1, count - 1);\n if (!isControlled) setInternalIndex(nextIdx);\n onChange?.(nextIdx);\n }, autoplayInterval);\n return () => clearInterval(id);\n }, [\n autoplay,\n isPaused,\n autoplayInterval,\n count,\n loop,\n isControlled,\n onChange,\n ]);\n\n if (count === 0) return null;\n\n return (\n <div\n className={[\"aui-carousel\", className].filter(Boolean).join(\" \")}\n style={style}\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n <div className=\"aui-carousel-viewport\">\n {effect === \"slide\" ? (\n <div\n className=\"aui-carousel-track\"\n style={{ transform: `translateX(-${current * 100}%)` }}\n >\n {slides.map((slide, i) => (\n <div key={i} className=\"aui-carousel-slide\">\n {slide}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"aui-carousel-fade-track\">\n {slides.map((slide, i) => (\n <div\n key={i}\n className={[\n \"aui-carousel-fade-slide\",\n i === current ? \"aui-carousel-fade-active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {slide}\n </div>\n ))}\n </div>\n )}\n </div>\n\n {arrows && count > 1 && (\n <>\n <button\n className=\"aui-carousel-arrow aui-carousel-arrow-prev\"\n onClick={prev}\n aria-label=\"上一张\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"14\" height=\"14\">\n <polyline\n points=\"15 18 9 12 15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <button\n className=\"aui-carousel-arrow aui-carousel-arrow-next\"\n onClick={next}\n aria-label=\"下一张\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"14\" height=\"14\">\n <polyline\n points=\"9 18 15 12 9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </>\n )}\n\n {dots && count > 1 && (\n <div className=\"aui-carousel-dots\">\n {slides.map((_, i) => (\n <button\n key={i}\n className={[\n \"aui-carousel-dot\",\n i === current ? \"aui-carousel-dot-active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => goTo(i)}\n aria-label={`第 ${i + 1} 张`}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport \"./collapse.css\";\n\nexport interface CollapseItem {\n key: string;\n label: React.ReactNode;\n children: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface CollapseProps {\n items: CollapseItem[];\n defaultActiveKeys?: string[];\n activeKeys?: string[];\n accordion?: boolean;\n onChange?: (keys: string[]) => void;\n bordered?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Collapse({\n items,\n defaultActiveKeys = [],\n activeKeys: controlledKeys,\n accordion = false,\n onChange,\n bordered = true,\n className,\n style,\n}: CollapseProps) {\n const isControlled = controlledKeys !== undefined;\n const [internalKeys, setInternalKeys] = useState<string[]>(defaultActiveKeys);\n const activeKeys = isControlled ? controlledKeys! : internalKeys;\n const activeSet = new Set(activeKeys);\n\n function toggle(key: string) {\n let next: string[];\n if (accordion) {\n next = activeSet.has(key) ? [] : [key];\n } else {\n next = activeSet.has(key)\n ? activeKeys.filter((k) => k !== key)\n : [...activeKeys, key];\n }\n if (!isControlled) setInternalKeys(next);\n onChange?.(next);\n }\n\n return (\n <div\n className={[\n \"aui-collapse\",\n bordered ? \"aui-collapse-bordered\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={style}\n >\n {items.map((item, idx) => {\n const isOpen = activeSet.has(item.key);\n return (\n <div\n key={item.key}\n className={[\n \"aui-collapse-item\",\n isOpen ? \"aui-collapse-item-active\" : \"\",\n item.disabled ? \"aui-collapse-item-disabled\" : \"\",\n idx === items.length - 1 ? \"aui-collapse-item-last\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <button\n className=\"aui-collapse-header\"\n onClick={() => !item.disabled && toggle(item.key)}\n aria-expanded={isOpen}\n disabled={item.disabled}\n >\n <span\n className={[\n \"aui-collapse-arrow\",\n isOpen ? \"aui-collapse-arrow-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" width=\"12\" height=\"12\">\n <polyline\n points=\"9 18 15 12 9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n <span className=\"aui-collapse-label\">{item.label}</span>\n </button>\n\n <div\n className={[\n \"aui-collapse-content\",\n isOpen ? \"aui-collapse-content-open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"aui-collapse-content-inner\">\n <div className=\"aui-collapse-content-box\">{item.children}</div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import React from \"react\";\nimport \"./empty.css\";\n\nfunction EmptyIllustration() {\n return (\n <svg\n width=\"200\"\n height=\"160\"\n viewBox=\"0 0 200 160\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <defs>\n <linearGradient\n id=\"emptyGradBody\"\n x1=\"60\"\n y1=\"55\"\n x2=\"140\"\n y2=\"140\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0%\" stopColor=\"#f5f6ff\" />\n <stop offset=\"100%\" stopColor=\"#eceef8\" />\n </linearGradient>\n <linearGradient\n id=\"emptyGradLid\"\n x1=\"60\"\n y1=\"25\"\n x2=\"140\"\n y2=\"60\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop offset=\"0%\" stopColor=\"#eef0fc\" />\n <stop offset=\"100%\" stopColor=\"#e4e7f6\" />\n </linearGradient>\n </defs>\n\n {/* soft glow circle behind */}\n <circle cx=\"100\" cy=\"88\" r=\"62\" fill=\"rgba(99,102,241,0.05)\" />\n\n {/* ground shadow */}\n <ellipse cx=\"100\" cy=\"144\" rx=\"46\" ry=\"6\" fill=\"rgba(99,102,241,0.07)\" />\n\n {/* inbox body */}\n <rect\n x=\"34\"\n y=\"76\"\n width=\"132\"\n height=\"62\"\n rx=\"8\"\n fill=\"url(#emptyGradBody)\"\n stroke=\"#dde0f0\"\n strokeWidth=\"1.5\"\n />\n\n {/* divider line in inbox */}\n <line\n x1=\"34\"\n y1=\"102\"\n x2=\"166\"\n y2=\"102\"\n stroke=\"#dde0f0\"\n strokeWidth=\"1.5\"\n />\n\n {/* inbox bottom row - two placeholder blocks */}\n <rect x=\"46\" y=\"113\" width=\"40\" height=\"7\" rx=\"3.5\" fill=\"#e8eaf6\" />\n <rect x=\"92\" y=\"113\" width=\"60\" height=\"7\" rx=\"3.5\" fill=\"#e8eaf6\" />\n\n {/* lid left flap */}\n <path\n d=\"M34 102 L54 76 H100 V102 Z\"\n fill=\"url(#emptyGradLid)\"\n stroke=\"#dde0f0\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n {/* lid right flap */}\n <path\n d=\"M166 102 L146 76 H100 V102 Z\"\n fill=\"url(#emptyGradBody)\"\n stroke=\"#dde0f0\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n\n {/* envelope / letter flying out — center card */}\n <g transform=\"translate(100,52) rotate(-6)\">\n <rect\n x=\"-28\"\n y=\"-20\"\n width=\"56\"\n height=\"40\"\n rx=\"5\"\n fill=\"#fff\"\n stroke=\"#c7cbeb\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M-28 -20 L0 4 L28 -20\"\n stroke=\"#c7cbeb\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n <rect x=\"-16\" y=\"6\" width=\"32\" height=\"4\" rx=\"2\" fill=\"#e8eaf6\" />\n <rect x=\"-10\" y=\"14\" width=\"20\" height=\"4\" rx=\"2\" fill=\"#e8eaf6\" />\n </g>\n\n {/* accent dot top-left */}\n <circle cx=\"44\" cy=\"38\" r=\"5\" fill=\"rgba(99,102,241,0.15)\" />\n <circle cx=\"36\" cy=\"50\" r=\"3\" fill=\"rgba(99,102,241,0.1)\" />\n {/* accent dot top-right */}\n <circle cx=\"158\" cy=\"34\" r=\"7\" fill=\"rgba(99,102,241,0.1)\" />\n <circle cx=\"168\" cy=\"52\" r=\"4\" fill=\"rgba(99,102,241,0.08)\" />\n </svg>\n );\n}\n\nexport interface EmptyProps {\n image?: React.ReactNode | null;\n imageStyle?: React.CSSProperties;\n description?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Empty({\n image,\n imageStyle,\n description = \"暂无数据\",\n children,\n className,\n style,\n}: EmptyProps) {\n const showImage = image !== null;\n const imgContent =\n image !== undefined && image !== null ? image : <EmptyIllustration />;\n\n return (\n <div\n className={[\"aui-empty\", className ?? \"\"].filter(Boolean).join(\" \")}\n style={style}\n >\n {showImage && (\n <div className=\"aui-empty-image\" style={imageStyle}>\n {imgContent}\n </div>\n )}\n {description !== null && (\n <p className=\"aui-empty-description\">{description}</p>\n )}\n {children && <div className=\"aui-empty-footer\">{children}</div>}\n </div>\n );\n}\n","import React from \"react\";\nimport \"./descriptions.css\";\n\nexport interface DescriptionItem {\n label: string;\n value: React.ReactNode;\n /** 占据的列数,默认 1 */\n span?: number;\n}\n\nexport interface DescriptionsProps {\n /** 标题 */\n title?: React.ReactNode;\n /** 数据项 */\n items: DescriptionItem[];\n /** 每行列数,默认 3 */\n column?: number;\n /** 冒号分隔符,默认 ':' */\n colon?: string;\n /** 是否显示边框(表格样式) */\n bordered?: boolean;\n labelStyle?: React.CSSProperties;\n contentStyle?: React.CSSProperties;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Descriptions({\n title,\n items,\n column = 3,\n colon = \":\",\n bordered = false,\n labelStyle,\n contentStyle,\n style,\n className,\n}: DescriptionsProps) {\n const wrapperCls = [\n \"aui-descriptions\",\n bordered ? \"aui-descriptions-bordered\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls} style={style}>\n {title && <div className=\"aui-descriptions-title\">{title}</div>}\n <div\n className=\"aui-descriptions-view\"\n style={{ gridTemplateColumns: `repeat(${column}, 1fr)` }}\n >\n {items.map((item, i) => (\n <div\n key={i}\n className=\"aui-descriptions-item\"\n style={{ gridColumn: `span ${item.span ?? 1}` }}\n >\n <span\n className=\"aui-descriptions-label\"\n style={labelStyle}\n >\n {item.label}\n {colon}\n </span>\n <span\n className=\"aui-descriptions-content\"\n style={contentStyle}\n >\n {item.value}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { Icon } from \"../icon\";\nimport type { IconName } from \"../icon\";\nimport \"./message.css\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\nexport type MessageType = \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n\nexport interface MessageOptions {\n duration?: number; // seconds, 0 = never auto-close\n key?: string; // deduplicate by key\n closable?: boolean; // show close button\n}\n\ninterface MsgItem {\n id: number;\n key?: string;\n type: MessageType;\n content: React.ReactNode;\n duration: number;\n closable: boolean;\n}\n\n// ── Module-level store ────────────────────────────────────────────────────────\nlet items: MsgItem[] = [];\nlet listeners: Array<() => void> = [];\nlet idCounter = 0;\n\nfunction subscribe(fn: () => void) {\n listeners.push(fn);\n return () => {\n listeners = listeners.filter((l) => l !== fn);\n };\n}\n\nfunction notify() {\n listeners.forEach((fn) => fn());\n}\n\nfunction addItem(item: MsgItem) {\n // If same key exists, replace it\n if (item.key) {\n items = items.map((i) => (i.key === item.key ? item : i));\n if (!items.find((i) => i.key === item.key)) {\n items = [...items, item];\n }\n } else {\n items = [...items, item];\n }\n notify();\n}\n\nfunction removeItem(id: number) {\n items = items.filter((i) => i.id !== id);\n notify();\n}\n\n// ── Icons ─────────────────────────────────────────────────────────────────────\nconst messageIconNames: Record<MessageType, IconName> = {\n success: \"circle-check\",\n error: \"circle-x\",\n warning: \"circle-warn\",\n info: \"circle-info\",\n loading: \"circle-loading\",\n};\n\n// ── Single message item component ─────────────────────────────────────────────\nfunction MessageItem({ id, type, content, duration, closable }: MsgItem) {\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const raf = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(raf);\n }, []);\n\n useEffect(() => {\n if (duration <= 0) return;\n const t = setTimeout(() => handleClose(), duration * 1000);\n return () => clearTimeout(t);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration]);\n\n const handleClose = () => {\n setVisible(false);\n setTimeout(() => removeItem(id), 280);\n };\n\n return (\n <div\n className={[\n \"aui-message-item\",\n `aui-message-item-${type}`,\n visible ? \"aui-message-item-visible\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span className=\"aui-message-icon\"><Icon name={messageIconNames[type]} /></span>\n <span className=\"aui-message-content\">{content}</span>\n {closable && (\n <button\n className=\"aui-message-close\"\n onClick={handleClose}\n type=\"button\"\n aria-label=\"关闭\"\n >\n <Icon name=\"x\" />\n </button>\n )}\n </div>\n );\n}\n\n// ── Container component ───────────────────────────────────────────────────────\nfunction MessageContainer() {\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n const unsub = subscribe(() => forceUpdate((n) => n + 1));\n return unsub;\n }, []);\n\n return (\n <div className=\"aui-message-wrapper\">\n {items.map((item) => (\n <MessageItem key={item.id as any} {...item} />\n ))}\n </div>\n );\n}\n\n// ── Lazy singleton mount ──────────────────────────────────────────────────────\nlet root: ReturnType<typeof ReactDOM.createRoot> | null = null;\n\nfunction ensureMounted() {\n if (root) return;\n const el = document.createElement(\"div\");\n el.setAttribute(\"data-aui-message\", \"\");\n document.body.appendChild(el);\n root = ReactDOM.createRoot(el);\n root.render(<MessageContainer />);\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\nfunction open(\n type: MessageType,\n content: React.ReactNode,\n options?: number | MessageOptions,\n): () => void {\n ensureMounted();\n const opts: MessageOptions =\n typeof options === \"number\" ? { duration: options } : (options ?? {});\n const duration = opts.duration ?? (type === \"loading\" ? 0 : 3);\n const id = ++idCounter;\n const closable = opts.closable ?? false;\n // defer to ensure the container is rendered\n setTimeout(\n () => addItem({ id, key: opts.key, type, content, duration, closable }),\n 0,\n );\n return () => removeItem(id);\n}\n\nfunction closeAll() {\n items = [];\n notify();\n}\n\nexport const message = {\n success: (content: React.ReactNode, options?: number | MessageOptions) =>\n open(\"success\", content, options),\n error: (content: React.ReactNode, options?: number | MessageOptions) =>\n open(\"error\", content, options),\n warning: (content: React.ReactNode, options?: number | MessageOptions) =>\n open(\"warning\", content, options),\n info: (content: React.ReactNode, options?: number | MessageOptions) =>\n open(\"info\", content, options),\n loading: (content: React.ReactNode, options?: number | MessageOptions) =>\n open(\"loading\", content, options),\n closeAll,\n};\n","import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Icon } from \"../icon\";\nimport \"./drawer.css\";\nimport { Button } from \"../button\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose?: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode | null;\n placement?: DrawerPlacement;\n width?: number | string;\n height?: number | string;\n closable?: boolean;\n bodyStyle?: React.CSSProperties;\n}\n\nexport function Drawer({\n open,\n onClose,\n title,\n children,\n footer,\n placement = \"right\",\n width = 360,\n height = 320,\n closable = true,\n bodyStyle,\n}: DrawerProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n requestAnimationFrame(() =>\n requestAnimationFrame(() => setVisible(true)),\n );\n } else {\n setVisible(false);\n document.body.style.overflow = \"\";\n document.documentElement.style.overflow = \"\";\n const t = setTimeout(() => setMounted(false), 260);\n return () => clearTimeout(t);\n }\n return () => {\n document.body.style.overflow = \"\";\n document.documentElement.style.overflow = \"\";\n };\n }, [open]);\n\n useEffect(() => {\n if (!open || !closable) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, closable, onClose]);\n\n if (!mounted || typeof document === \"undefined\") return null;\n\n const isHorizontal = placement === \"left\" || placement === \"right\";\n const sizeStyle = isHorizontal\n ? { width: typeof width === \"number\" ? `${width}px` : width }\n : { height: typeof height === \"number\" ? `${height}px` : height };\n\n const node = (\n <>\n <div\n className={`aui-drawer-overlay${visible ? \" aui-drawer-visible\" : \"\"}`}\n onClick={() => closable && onClose?.()}\n />\n <div\n className={`aui-drawer-panel aui-drawer-${placement}${visible ? \" aui-drawer-visible\" : \"\"}`}\n style={sizeStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {(title != null || closable) && (\n <div className=\"aui-drawer-header\">\n {title != null && <div className=\"aui-drawer-title\">{title}</div>}\n {closable && (\n <button\n className=\"aui-drawer-close\"\n onClick={onClose}\n aria-label=\"关闭\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n )}\n </div>\n )}\n <div className=\"aui-drawer-body\" style={bodyStyle}>\n {children}\n </div>\n {footer !== null && (\n <div className=\"aui-drawer-footer\">\n {footer ?? (\n <>\n <Button variant=\"secondary\" size=\"sm\" onClick={onClose}>\n 取消\n </Button>\n <Button size=\"sm\" onClick={onClose}>\n 确定\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n return ReactDOM.createPortal(node, document.body);\n}\n","import React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Icon } from \"../icon\";\nimport \"./menu.css\";\n\n// ── Types ──────────────────────────────────────────────────────────────────────\nexport type MenuMode = \"vertical\" | \"horizontal\" | \"inline\";\n\nexport interface MenuItemType {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n disabled?: boolean;\n children?: MenuItemType[];\n}\n\nexport interface MenuProps {\n items: MenuItemType[];\n selectedKey?: string;\n defaultSelectedKey?: string;\n openKeys?: string[];\n defaultOpenKeys?: string[];\n onSelect?: (key: string) => void;\n onOpenChange?: (openKeys: string[]) => void;\n mode?: MenuMode;\n collapsed?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\nfunction hasSelectedDescendant(items: MenuItemType[], key: string): boolean {\n return items.some(\n (item) =>\n item.key === key ||\n (item.children ? hasSelectedDescendant(item.children, key) : false),\n );\n}\n\n// ── Horizontal SubMenu (portal popup) ─────────────────────────────────────────\ninterface HSubMenuProps {\n item: MenuItemType;\n selectedKey: string;\n openKeys: string[];\n onSelect: (key: string) => void;\n onOpenChange: (key: string) => void;\n}\n\nfunction HSubMenu({\n item,\n selectedKey,\n openKeys,\n onSelect,\n onOpenChange,\n}: HSubMenuProps) {\n const titleRef = useRef<HTMLDivElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n const isOpen = openKeys.includes(item.key);\n const hasSelectedChild = hasSelectedDescendant(\n item.children ?? [],\n selectedKey,\n );\n\n const titleCls = [\n \"aui-menu-submenu-title\",\n \"aui-menu-submenu-title-h\",\n hasSelectedChild ? \"aui-menu-submenu-title-active\" : \"\",\n item.disabled ? \"aui-menu-item-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (item.disabled) return;\n if (!isOpen) {\n const rect = titleRef.current?.getBoundingClientRect();\n if (rect) setPos({ top: rect.bottom + 4, left: rect.left });\n }\n onOpenChange(item.key);\n };\n\n // close on outside click / scroll\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: MouseEvent) => {\n if (\n !titleRef.current?.contains(e.target as Node) &&\n !popupRef.current?.contains(e.target as Node)\n ) {\n onOpenChange(item.key);\n }\n };\n const onScroll = () => onOpenChange(item.key);\n document.addEventListener(\"mousedown\", handler);\n window.addEventListener(\"scroll\", onScroll, true);\n return () => {\n document.removeEventListener(\"mousedown\", handler);\n window.removeEventListener(\"scroll\", onScroll, true);\n };\n }, [isOpen, item.key, onOpenChange]);\n\n const popup =\n isOpen && typeof document !== \"undefined\"\n ? ReactDOM.createPortal(\n <div\n ref={popupRef}\n className=\"aui-menu-submenu-popup\"\n style={{ top: pos.top, left: pos.left }}\n onClick={(e) => e.stopPropagation()}\n >\n {(item.children ?? []).map((child) =>\n child.children ? (\n <InlineSubMenu\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n onSelect={onSelect}\n depth={0}\n />\n ) : (\n <MenuItem\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n onSelect={(k) => {\n onSelect(k);\n onOpenChange(item.key); // close after select\n }}\n depth={0}\n collapsed={false}\n />\n ),\n )}\n </div>,\n document.body,\n )\n : null;\n\n return (\n <div className=\"aui-menu-submenu aui-menu-submenu-horizontal\">\n <div ref={titleRef} className={titleCls} onClick={handleClick}>\n {item.icon && <span className=\"aui-menu-item-icon\">{item.icon}</span>}\n <span className=\"aui-menu-item-label\">{item.label}</span>\n <span className=\"aui-menu-submenu-arrow\">\n <Icon name=\"chevron-down\" />\n </span>\n </div>\n {popup}\n </div>\n );\n}\n\n// ── Inline SubMenu (expand in place) ──────────────────────────────────────────\ninterface InlineSubMenuProps {\n item: MenuItemType;\n selectedKey: string;\n onSelect: (key: string) => void;\n depth: number;\n}\n\nfunction InlineSubMenu({\n item,\n selectedKey,\n onSelect,\n depth,\n}: InlineSubMenuProps) {\n const [open, setOpen] = useState(false);\n const hasSelectedChild = hasSelectedDescendant(\n item.children ?? [],\n selectedKey,\n );\n\n const titleCls = [\n \"aui-menu-submenu-title\",\n hasSelectedChild ? \"aui-menu-submenu-title-active\" : \"\",\n item.disabled ? \"aui-menu-item-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={`aui-menu-submenu${open ? \" aui-menu-submenu-open\" : \"\"}`}>\n <div\n className={titleCls}\n style={{ paddingLeft: 16 + depth * 16 }}\n onClick={(e) => {\n e.stopPropagation();\n if (!item.disabled) setOpen((v) => !v);\n }}\n >\n {item.icon && <span className=\"aui-menu-item-icon\">{item.icon}</span>}\n <span className=\"aui-menu-item-label\">{item.label}</span>\n <span className=\"aui-menu-submenu-arrow\">\n {open ? <Icon name=\"chevron-down\" /> : <Icon name=\"chevron-right\" />}\n </span>\n </div>\n {open && (\n <div className=\"aui-menu-submenu-children\">\n {(item.children ?? []).map((child) =>\n child.children ? (\n <InlineSubMenu\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n onSelect={onSelect}\n depth={depth + 1}\n />\n ) : (\n <MenuItem\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n onSelect={onSelect}\n depth={depth + 1}\n collapsed={false}\n />\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── Vertical/Inline SubMenu (controlled open state) ───────────────────────────\ninterface SubMenuProps {\n item: MenuItemType;\n selectedKey: string;\n openKeys: string[];\n onSelect: (key: string) => void;\n onOpenChange: (key: string) => void;\n depth: number;\n collapsed: boolean;\n}\n\nfunction SubMenu({\n item,\n selectedKey,\n openKeys,\n onSelect,\n onOpenChange,\n depth,\n collapsed,\n}: SubMenuProps) {\n const isOpen = openKeys.includes(item.key);\n const hasSelectedChild = hasSelectedDescendant(\n item.children ?? [],\n selectedKey,\n );\n\n const titleCls = [\n \"aui-menu-submenu-title\",\n hasSelectedChild ? \"aui-menu-submenu-title-active\" : \"\",\n item.disabled ? \"aui-menu-item-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={`aui-menu-submenu${isOpen ? \" aui-menu-submenu-open\" : \"\"}`}\n >\n <div\n className={titleCls}\n onClick={(e) => {\n e.stopPropagation();\n if (!item.disabled) onOpenChange(item.key);\n }}\n style={{ paddingLeft: collapsed ? undefined : 16 + depth * 16 }}\n >\n {item.icon && <span className=\"aui-menu-item-icon\">{item.icon}</span>}\n {!collapsed && (\n <span className=\"aui-menu-item-label\">{item.label}</span>\n )}\n {!collapsed && (\n <span className=\"aui-menu-submenu-arrow\">\n {isOpen ? <Icon name=\"chevron-down\" /> : <Icon name=\"chevron-right\" />}\n </span>\n )}\n </div>\n {isOpen && !collapsed && (\n <div className=\"aui-menu-submenu-children\">\n {(item.children ?? []).map((child) =>\n child.children ? (\n <SubMenu\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n openKeys={openKeys}\n onSelect={onSelect}\n onOpenChange={onOpenChange}\n depth={depth + 1}\n collapsed={false}\n />\n ) : (\n <MenuItem\n key={child.key}\n item={child}\n selectedKey={selectedKey}\n onSelect={onSelect}\n depth={depth + 1}\n collapsed={false}\n />\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── MenuItem Component ─────────────────────────────────────────────────────────\ninterface MenuItemProps {\n item: MenuItemType;\n selectedKey: string;\n onSelect: (key: string) => void;\n depth: number;\n collapsed: boolean;\n}\n\nfunction MenuItem({\n item,\n selectedKey,\n onSelect,\n depth,\n collapsed,\n}: MenuItemProps) {\n const isSelected = item.key === selectedKey;\n\n const cls = [\n \"aui-menu-item\",\n isSelected ? \"aui-menu-item-selected\" : \"\",\n item.disabled ? \"aui-menu-item-disabled\" : \"\",\n collapsed ? \"aui-menu-item-collapsed\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n className={cls}\n style={{ paddingLeft: collapsed ? undefined : 16 + depth * 16 }}\n onClick={() => !item.disabled && onSelect(item.key)}\n title={collapsed ? String(item.label) : undefined}\n >\n {item.icon && <span className=\"aui-menu-item-icon\">{item.icon}</span>}\n {!collapsed && <span className=\"aui-menu-item-label\">{item.label}</span>}\n </div>\n );\n}\n\n// ── Menu Component ─────────────────────────────────────────────────────────────\nexport function Menu({\n items,\n selectedKey,\n defaultSelectedKey,\n openKeys,\n defaultOpenKeys = [],\n onSelect,\n onOpenChange,\n mode = \"vertical\",\n collapsed = false,\n style,\n className,\n}: MenuProps) {\n const [internalSelected, setInternalSelected] = useState(\n defaultSelectedKey ?? \"\",\n );\n const [internalOpen, setInternalOpen] = useState<string[]>(defaultOpenKeys);\n\n const currentSelected =\n selectedKey !== undefined ? selectedKey : internalSelected;\n const currentOpen = openKeys !== undefined ? openKeys : internalOpen;\n\n const handleSelect = useCallback(\n (key: string) => {\n if (selectedKey === undefined) setInternalSelected(key);\n onSelect?.(key);\n },\n [selectedKey, onSelect],\n );\n\n const handleOpenChange = useCallback(\n (key: string) => {\n // horizontal: only one open at a time, toggle\n const next =\n mode === \"horizontal\"\n ? currentOpen.includes(key)\n ? []\n : [key]\n : currentOpen.includes(key)\n ? currentOpen.filter((k) => k !== key)\n : [...currentOpen, key];\n if (openKeys === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [currentOpen, openKeys, onOpenChange, mode],\n );\n\n const cls = [\n \"aui-menu\",\n `aui-menu-${mode}`,\n collapsed ? \"aui-menu-collapsed\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style}>\n {items.map((item) => {\n if (item.children) {\n if (mode === \"horizontal\") {\n return (\n <HSubMenu\n key={item.key}\n item={item}\n selectedKey={currentSelected}\n openKeys={currentOpen}\n onSelect={handleSelect}\n onOpenChange={handleOpenChange}\n />\n );\n }\n return (\n <SubMenu\n key={item.key}\n item={item}\n selectedKey={currentSelected}\n openKeys={currentOpen}\n onSelect={handleSelect}\n onOpenChange={handleOpenChange}\n depth={0}\n collapsed={collapsed}\n />\n );\n }\n return (\n <MenuItem\n key={item.key}\n item={item}\n selectedKey={currentSelected}\n onSelect={handleSelect}\n depth={0}\n collapsed={collapsed}\n />\n );\n })}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./card.css\";\n\nexport type CardSize = \"sm\" | \"md\" | \"lg\";\nexport type CardShadow = \"always\" | \"hover\" | \"never\";\n\nexport interface CardProps {\n title?: React.ReactNode;\n extra?: React.ReactNode;\n cover?: React.ReactNode;\n footer?: React.ReactNode;\n children?: React.ReactNode;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapseChange?: (collapsed: boolean) => void;\n bordered?: boolean;\n shadow?: CardShadow;\n loading?: boolean;\n size?: CardSize;\n /** 右侧流光彩线动画 */\n shimmer?: boolean;\n className?: string;\n style?: React.CSSProperties;\n bodyStyle?: React.CSSProperties;\n}\n\nexport function Card({\n title,\n extra,\n cover,\n footer,\n children,\n collapsible = false,\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapseChange,\n bordered = true,\n shadow = \"never\",\n loading = false,\n size = \"md\",\n shimmer = false,\n className,\n style,\n bodyStyle,\n}: CardProps) {\n const isControlled = collapsedProp !== undefined;\n const [localCollapsed, setLocalCollapsed] = useState(defaultCollapsed);\n const collapsed = isControlled ? collapsedProp! : localCollapsed;\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const [bodyHeight, setBodyHeight] = useState<number | undefined>(\n collapsed ? 0 : undefined,\n );\n\n useEffect(() => {\n const el = bodyRef.current;\n if (!el) return;\n if (!collapsed) {\n setBodyHeight(el.scrollHeight);\n const t = setTimeout(() => setBodyHeight(undefined), 280);\n return () => clearTimeout(t);\n } else {\n setBodyHeight(el.scrollHeight);\n requestAnimationFrame(() =>\n requestAnimationFrame(() => setBodyHeight(0)),\n );\n }\n }, [collapsed]);\n\n const toggleCollapse = () => {\n const next = !collapsed;\n if (!isControlled) setLocalCollapsed(next);\n onCollapseChange?.(next);\n };\n\n const hasHeader = title !== undefined || extra !== undefined || collapsible;\n\n const wrapperCls = [\n \"aui-card\",\n `aui-card-${size}`,\n bordered ? \"aui-card-bordered\" : \"\",\n `aui-card-shadow-${shadow}`,\n loading ? \"aui-card-loading\" : \"\",\n collapsed ? \"aui-card-collapsed\" : \"\",\n shimmer ? \"aui-card-shimmer\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls} style={style}>\n {cover && <div className=\"aui-card-cover\">{cover}</div>}\n\n {hasHeader && (\n <div\n className={`aui-card-header${collapsible ? \" aui-card-header-collapsible\" : \"\"}`}\n onClick={collapsible ? toggleCollapse : undefined}\n >\n {/* 左侧:折叠图标 + 标题 */}\n <div className=\"aui-card-header-left\">\n {collapsible && (\n <span\n className={`aui-card-collapse-icon${collapsed ? \" aui-card-collapse-icon-collapsed\" : \"\"}`}\n >\n <Icon name=\"chevron-down\" size={16} />\n </span>\n )}\n {title !== undefined && (\n <div className=\"aui-card-title\">{title}</div>\n )}\n </div>\n\n {/* 右侧:extra */}\n {extra !== undefined && (\n <div\n className=\"aui-card-extra\"\n onClick={(e) => collapsible && e.stopPropagation()}\n >\n {extra}\n </div>\n )}\n </div>\n )}\n\n <div\n ref={bodyRef}\n className=\"aui-card-body-wrap\"\n style={\n collapsible\n ? {\n height: bodyHeight !== undefined ? `${bodyHeight}px` : \"auto\",\n overflow:\n collapsed || bodyHeight !== undefined ? \"hidden\" : \"visible\",\n }\n : undefined\n }\n >\n {loading ? (\n <div className=\"aui-card-body aui-card-body-loading\" style={bodyStyle}>\n <div className=\"aui-card-skeleton\" />\n <div className=\"aui-card-skeleton aui-card-skeleton-short\" />\n <div className=\"aui-card-skeleton\" />\n <div className=\"aui-card-skeleton aui-card-skeleton-short\" />\n </div>\n ) : (\n <div className=\"aui-card-body\" style={bodyStyle}>\n {children}\n </div>\n )}\n </div>\n\n {footer && <div className=\"aui-card-footer\">{footer}</div>}\n </div>\n );\n}\n","import React from \"react\";\n\nexport interface SpaceProps {\n direction?: \"horizontal\" | \"vertical\";\n gap?: number | string;\n align?: \"start\" | \"center\" | \"end\" | \"baseline\";\n wrap?: boolean;\n style?: React.CSSProperties;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function Space({\n direction = \"horizontal\",\n gap = 8,\n align,\n wrap = false,\n style,\n className,\n children,\n}: SpaceProps) {\n const alignItems =\n align ?? (direction === \"vertical\" ? \"flex-start\" : \"center\");\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: direction === \"vertical\" ? \"column\" : \"row\",\n gap,\n alignItems,\n flexWrap: wrap ? \"wrap\" : \"nowrap\",\n ...style,\n }}\n >\n {children}\n </div>\n );\n}\n","import React from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./steps.css\";\n\nexport type StepStatus = \"wait\" | \"process\" | \"finish\" | \"error\";\nexport type StepsDirection = \"horizontal\" | \"vertical\";\nexport type StepsType = \"default\" | \"dot\" | \"navigation\";\nexport type StepsSize = \"sm\" | \"md\";\n\nexport interface StepItem {\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n status?: StepStatus;\n disabled?: boolean;\n}\n\nexport interface StepsProps {\n current?: number;\n items: StepItem[];\n direction?: StepsDirection;\n type?: StepsType;\n size?: StepsSize;\n status?: StepStatus;\n onChange?: (index: number) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction resolveStatus(\n index: number,\n current: number,\n globalStatus: StepStatus,\n itemStatus?: StepStatus,\n): StepStatus {\n if (itemStatus) return itemStatus;\n if (index < current) return \"finish\";\n if (index === current) return globalStatus === \"error\" ? \"error\" : \"process\";\n return \"wait\";\n}\n\nfunction StepIcon({\n index,\n status,\n icon,\n type,\n}: {\n index: number;\n status: StepStatus;\n icon?: React.ReactNode;\n type: StepsType;\n}) {\n if (type === \"dot\") {\n return <span className=\"aui-step-dot\" />;\n }\n\n if (icon) {\n return <span className=\"aui-step-icon-custom\">{icon}</span>;\n }\n\n if (status === \"finish\") {\n return (\n <span className=\"aui-step-icon\">\n <Icon name=\"check\" size={14} />\n </span>\n );\n }\n if (status === \"error\") {\n return (\n <span className=\"aui-step-icon\">\n <Icon name=\"x\" size={14} />\n </span>\n );\n }\n\n return <span className=\"aui-step-icon\">{index + 1}</span>;\n}\n\nexport function Steps({\n current = 0,\n items,\n direction = \"horizontal\",\n type = \"default\",\n size = \"md\",\n status = \"process\",\n onChange,\n className,\n style,\n}: StepsProps) {\n const wrapperCls = [\n \"aui-steps\",\n `aui-steps-${direction}`,\n `aui-steps-${type}`,\n `aui-steps-${size}`,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={wrapperCls} style={style}>\n {items.map((item, index) => {\n const resolvedStatus = resolveStatus(\n index,\n current,\n status,\n item.status,\n );\n const isLast = index === items.length - 1;\n const clickable = !!onChange && !item.disabled;\n\n const stepCls = [\n \"aui-step\",\n `aui-step-${resolvedStatus}`,\n isLast ? \"aui-step-last\" : \"\",\n clickable ? \"aui-step-clickable\" : \"\",\n item.disabled ? \"aui-step-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={index}\n className={stepCls}\n onClick={\n clickable && !item.disabled\n ? () => onChange!(index)\n : undefined\n }\n >\n {/* 连接线 */}\n {!isLast && <div className=\"aui-step-tail\" />}\n\n {/* 图标区 */}\n <div className=\"aui-step-head\">\n <StepIcon\n index={index}\n status={resolvedStatus}\n icon={item.icon}\n type={type}\n />\n </div>\n\n {/* 文字区 */}\n <div className=\"aui-step-content\">\n <div className=\"aui-step-title\">{item.title}</div>\n {item.description && (\n <div className=\"aui-step-desc\">{item.description}</div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import React, {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { resolvePlacement } from \"../popover/util\";\nimport \"./tooltip.css\";\n\nexport type TooltipPlacement =\n | \"top\"\n | \"topLeft\"\n | \"topRight\"\n | \"bottom\"\n | \"bottomLeft\"\n | \"bottomRight\"\n | \"left\"\n | \"leftTop\"\n | \"leftBottom\"\n | \"right\"\n | \"rightTop\"\n | \"rightBottom\";\n\nexport type TooltipTrigger = \"hover\" | \"click\" | \"focus\";\n\nexport interface TooltipProps {\n children: React.ReactElement;\n title?: React.ReactNode;\n placement?: TooltipPlacement;\n trigger?: TooltipTrigger;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n mouseEnterDelay?: number;\n mouseLeaveDelay?: number;\n color?: string;\n overlayStyle?: React.CSSProperties;\n overlayClassName?: string;\n}\n\nfunction calcPos(\n placement: TooltipPlacement,\n tRect: DOMRect,\n pW: number,\n pH: number,\n offset: number\n): { top: number; left: number } {\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case \"top\":\n top = tRect.top - pH - offset;\n left = tRect.left + (tRect.width - pW) / 2;\n break;\n case \"topLeft\":\n top = tRect.top - pH - offset;\n left = tRect.left;\n break;\n case \"topRight\":\n top = tRect.top - pH - offset;\n left = tRect.right - pW;\n break;\n case \"bottom\":\n top = tRect.bottom + offset;\n left = tRect.left + (tRect.width - pW) / 2;\n break;\n case \"bottomLeft\":\n top = tRect.bottom + offset;\n left = tRect.left;\n break;\n case \"bottomRight\":\n top = tRect.bottom + offset;\n left = tRect.right - pW;\n break;\n case \"left\":\n top = tRect.top + (tRect.height - pH) / 2;\n left = tRect.left - pW - offset;\n break;\n case \"leftTop\":\n top = tRect.top;\n left = tRect.left - pW - offset;\n break;\n case \"leftBottom\":\n top = tRect.bottom - pH;\n left = tRect.left - pW - offset;\n break;\n case \"right\":\n top = tRect.top + (tRect.height - pH) / 2;\n left = tRect.right + offset;\n break;\n case \"rightTop\":\n top = tRect.top;\n left = tRect.right + offset;\n break;\n case \"rightBottom\":\n top = tRect.bottom - pH;\n left = tRect.right + offset;\n break;\n }\n\n return { top, left };\n}\n\nexport function Tooltip({\n children,\n title,\n placement = \"top\",\n trigger = \"hover\",\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n mouseEnterDelay = 0.1,\n mouseLeaveDelay = 0.1,\n color,\n overlayStyle,\n overlayClassName,\n}: TooltipProps) {\n const isControlled = openProp !== undefined;\n const [localOpen, setLocalOpen] = useState(defaultOpen);\n const isOpen = isControlled ? openProp! : localOpen;\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const enterTimerRef = useRef<ReturnType<typeof setTimeout>>();\n const leaveTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setLocalOpen(next);\n onOpenChangeRef.current?.(next);\n },\n [isControlled]\n );\n\n const applyPosDOMRef = useRef(() => {});\n applyPosDOMRef.current = () => {\n const triggerEl = triggerRef.current;\n const tooltipEl = tooltipRef.current;\n if (!triggerEl || !tooltipEl) return;\n\n const tRect = triggerEl.getBoundingClientRect();\n const pW = tooltipEl.offsetWidth;\n const pH = tooltipEl.offsetHeight;\n\n const result = resolvePlacement(placement, tRect, pW, pH, 8, calcPos);\n\n tooltipEl.style.top = `${result.top}px`;\n tooltipEl.style.left = `${result.left}px`;\n tooltipEl.style.visibility = \"visible\";\n\n // Sync placement class: strip old, set correct one\n const nextCls = `aui-tooltip-${result.placement}`;\n if (!tooltipEl.classList.contains(nextCls)) {\n tooltipEl.className = tooltipEl.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"aui-tooltip-\") || c === \"aui-tooltip\")\n .concat(nextCls)\n .join(\" \");\n }\n };\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n applyPosDOMRef.current();\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handle = () => applyPosDOMRef.current();\n window.addEventListener(\"scroll\", handle, { capture: true, passive: true });\n window.addEventListener(\"resize\", handle);\n return () => {\n window.removeEventListener(\"scroll\", handle, true);\n window.removeEventListener(\"resize\", handle);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen || trigger !== \"click\") return;\n const handler = (e: MouseEvent) => {\n if (!triggerRef.current?.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [isOpen, trigger, setOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, setOpen]);\n\n const triggerProps: React.HTMLAttributes<HTMLSpanElement> = {};\n\n if (trigger === \"hover\") {\n triggerProps.onMouseEnter = () => {\n clearTimeout(leaveTimerRef.current);\n enterTimerRef.current = setTimeout(\n () => setOpen(true),\n mouseEnterDelay * 1000\n );\n };\n triggerProps.onMouseLeave = () => {\n clearTimeout(enterTimerRef.current);\n leaveTimerRef.current = setTimeout(\n () => setOpen(false),\n mouseLeaveDelay * 1000\n );\n };\n } else if (trigger === \"click\") {\n triggerProps.onClick = () => setOpen(!isOpen);\n } else if (trigger === \"focus\") {\n triggerProps.onFocus = () => setOpen(true);\n triggerProps.onBlur = () => setOpen(false);\n }\n\n const tooltipHoverProps: React.HTMLAttributes<HTMLDivElement> =\n trigger === \"hover\"\n ? {\n onMouseEnter: () => clearTimeout(leaveTimerRef.current),\n onMouseLeave: () => {\n leaveTimerRef.current = setTimeout(\n () => setOpen(false),\n mouseLeaveDelay * 1000\n );\n },\n }\n : {};\n\n const tooltipClickProps: React.HTMLAttributes<HTMLDivElement> =\n trigger === \"click\" ? { onClick: (e) => e.stopPropagation() } : {};\n\n const customStyle: React.CSSProperties = color\n ? ({ \"--aui-tooltip-bg\": color } as React.CSSProperties)\n : {};\n\n const tooltipCls = [\n \"aui-tooltip\",\n `aui-tooltip-${placement}`,\n overlayClassName,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (title == null || title === \"\") return children;\n\n const portal =\n isOpen && typeof document !== \"undefined\"\n ? ReactDOM.createPortal(\n <div\n ref={tooltipRef}\n className={tooltipCls}\n style={{ ...customStyle, ...overlayStyle }}\n {...tooltipHoverProps}\n {...tooltipClickProps}\n >\n <div className=\"aui-tooltip-arrow\" />\n <div className=\"aui-tooltip-inner\">{title}</div>\n </div>,\n document.body\n )\n : null;\n\n return (\n <>\n <span ref={triggerRef} className=\"aui-tooltip-trigger\" {...triggerProps}>\n {children}\n </span>\n {portal}\n </>\n );\n}\n","import React, {\n useState,\n useRef,\n useLayoutEffect,\n useEffect,\n useCallback,\n} from \"react\";\nimport \"./tabs.css\";\n\nexport interface TabItem {\n key: string;\n label: React.ReactNode;\n children?: React.ReactNode;\n disabled?: boolean;\n icon?: React.ReactNode;\n}\n\nexport type TabsType = \"line\" | \"segment\";\nexport type TabsPosition = \"top\" | \"left\";\n\nexport interface TabsProps {\n items: TabItem[];\n activeKey?: string;\n defaultActiveKey?: string;\n onChange?: (key: string) => void;\n type?: TabsType;\n position?: TabsPosition;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Tabs({\n items,\n activeKey: activeKeyProp,\n defaultActiveKey,\n onChange,\n type = \"line\",\n position = \"top\",\n style,\n className,\n}: TabsProps) {\n const [internalActive, setInternalActive] = useState(\n defaultActiveKey ?? items[0]?.key ?? \"\"\n );\n const activeKey =\n activeKeyProp !== undefined ? activeKeyProp : internalActive;\n\n const navRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const [inkStyle, setInkStyle] = useState({ left: 0, width: 0 });\n const [inkLeftStyle, setInkLeftStyle] = useState({ top: 0, height: 0 });\n\n // scroll arrows\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n const updateScrollState = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const isLeft = position === \"left\";\n if (isLeft) {\n setCanScrollPrev(el.scrollTop > 0);\n setCanScrollNext(el.scrollTop + el.clientHeight < el.scrollHeight - 1);\n } else {\n setCanScrollPrev(el.scrollLeft > 0);\n setCanScrollNext(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }\n }, [position]);\n\n useEffect(() => {\n const el = listRef.current;\n if (!el) return;\n updateScrollState();\n el.addEventListener(\"scroll\", updateScrollState);\n const ro = new ResizeObserver(updateScrollState);\n ro.observe(el);\n return () => {\n el.removeEventListener(\"scroll\", updateScrollState);\n ro.disconnect();\n };\n }, [updateScrollState, items]);\n\n useLayoutEffect(() => {\n if (position === \"left\") {\n if (!listRef.current) return;\n const el = listRef.current.querySelector<HTMLElement>(\n \".aui-tabs-nav-item-active\"\n );\n if (!el) return;\n setInkLeftStyle({ top: el.offsetTop, height: el.offsetHeight });\n return;\n }\n if (type !== \"line\" || !navRef.current) return;\n const el = navRef.current.querySelector<HTMLElement>(\n \".aui-tabs-nav-item-active\"\n );\n if (!el) return;\n setInkStyle({ left: el.offsetLeft, width: el.offsetWidth });\n }, [activeKey, type, items, position]);\n\n const activeIndex = items.findIndex((i) => i.key === activeKey);\n const segmentThumbStyle =\n type === \"segment\"\n ? {\n transform: `translateX(${activeIndex * 100}%)`,\n width: `${100 / items.length}%`,\n }\n : {};\n\n const handleClick = useCallback(\n (key: string, disabled?: boolean) => {\n if (disabled) return;\n if (activeKeyProp === undefined) setInternalActive(key);\n onChange?.(key);\n },\n [activeKeyProp, onChange]\n );\n\n const scroll = (dir: \"prev\" | \"next\") => {\n const el = listRef.current;\n if (!el) return;\n const isLeft = position === \"left\";\n const amount = 120;\n if (isLeft) {\n el.scrollBy({\n top: dir === \"prev\" ? -amount : amount,\n behavior: \"smooth\",\n });\n } else {\n el.scrollBy({\n left: dir === \"prev\" ? -amount : amount,\n behavior: \"smooth\",\n });\n }\n };\n\n const activeItem = items.find((i) => i.key === activeKey);\n\n const showArrows = canScrollPrev || canScrollNext;\n\n const navItems = items.map((item) => {\n const isActive = item.key === activeKey;\n const itemCls = [\n \"aui-tabs-nav-item\",\n isActive ? \"aui-tabs-nav-item-active\" : \"\",\n item.disabled ? \"aui-tabs-nav-item-disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <div\n key={item.key}\n className={itemCls}\n onClick={() => handleClick(item.key, item.disabled)}\n >\n {item.icon && (\n <span className=\"aui-tabs-nav-item-icon\">{item.icon}</span>\n )}\n {item.label}\n </div>\n );\n });\n\n if (position === \"left\") {\n const rootCls = [\"aui-tabs\", \"aui-tabs-left\", className]\n .filter(Boolean)\n .join(\" \");\n return (\n <div className={rootCls} style={style}>\n <div className=\"aui-tabs-nav aui-tabs-nav-left\" ref={navRef}>\n {showArrows && (\n <button\n className=\"aui-tabs-arrow aui-tabs-arrow-up\"\n disabled={!canScrollPrev}\n onClick={() => scroll(\"prev\")}\n >\n ‹\n </button>\n )}\n <div className=\"aui-tabs-nav-list\" ref={listRef}>\n {navItems}\n <div\n className=\"aui-tabs-ink-bar-left\"\n style={{ top: inkLeftStyle.top, height: inkLeftStyle.height }}\n />\n </div>\n {showArrows && (\n <button\n className=\"aui-tabs-arrow aui-tabs-arrow-down\"\n disabled={!canScrollNext}\n onClick={() => scroll(\"next\")}\n >\n ›\n </button>\n )}\n </div>\n {activeItem?.children !== undefined && (\n <div className=\"aui-tabs-content aui-tabs-content-left\">\n {activeItem.children}\n </div>\n )}\n </div>\n );\n }\n\n const cls = [\"aui-tabs\", `aui-tabs-${type}`, className]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style}>\n <div className=\"aui-tabs-nav\" ref={navRef}>\n {showArrows && (\n <button\n className=\"aui-tabs-arrow aui-tabs-arrow-left\"\n disabled={!canScrollPrev}\n onClick={() => scroll(\"prev\")}\n >\n ‹\n </button>\n )}\n <div className=\"aui-tabs-nav-list\" ref={listRef}>\n {type === \"segment\" && (\n <div className=\"aui-tabs-segment-thumb\" style={segmentThumbStyle} />\n )}\n {navItems}\n {type === \"line\" && (\n <div\n className=\"aui-tabs-ink-bar\"\n style={{ left: inkStyle.left, width: inkStyle.width }}\n />\n )}\n </div>\n {showArrows && (\n <button\n className=\"aui-tabs-arrow aui-tabs-arrow-right\"\n disabled={!canScrollNext}\n onClick={() => scroll(\"next\")}\n >\n ›\n </button>\n )}\n </div>\n {activeItem?.children !== undefined && (\n <div className=\"aui-tabs-content\">{activeItem.children}</div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Icon } from \"../icon\";\nimport \"./spin.css\";\n\nexport type SpinSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SpinProps {\n spinning?: boolean;\n size?: SpinSize;\n tip?: string;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Spin({\n spinning = true,\n size = \"md\",\n tip,\n children,\n style,\n className,\n}: SpinProps) {\n const spinner = (\n <div className={`aui-spin aui-spin-${size}`}>\n <Icon name=\"spin\" />\n {tip && <p className=\"aui-spin-tip\">{tip}</p>}\n </div>\n );\n\n if (!children) {\n if (!spinning) return null;\n return (\n <div className={className} style={style}>\n {spinner}\n </div>\n );\n }\n\n const cls = [\n \"aui-spin-container\",\n spinning ? \"aui-spin-container-spinning\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls} style={style}>\n {spinning && <div className=\"aui-spin-overlay\">{spinner}</div>}\n <div className={spinning ? \"aui-spin-content-blur\" : \"\"}>{children}</div>\n </div>\n );\n}\n","import React, { createContext, useContext, useEffect, useState } from \"react\";\n\nexport type Theme = \"light\" | \"dark\";\nexport type AccentColor = string;\n\ninterface ThemeContextValue {\n theme: Theme;\n accentColor: AccentColor;\n setTheme: (t: Theme) => void;\n setAccentColor: (c: AccentColor) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: \"light\",\n accentColor: \"#6366f1\",\n setTheme: () => {},\n setAccentColor: () => {},\n});\n\nexport const ACCENT_PRESETS = [\n { label: \"Indigo\", value: \"#6366f1\" },\n { label: \"Violet\", value: \"#8b5cf6\" },\n { label: \"Sky\", value: \"#197afa\" },\n { label: \"Emerald\", value: \"#10b981\" },\n { label: \"Rose\", value: \"#f43f5e\" },\n { label: \"Amber\", value: \"#f59e0b\" },\n];\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: Theme;\n defaultAccentColor?: AccentColor;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\",\n defaultAccentColor = \"#6366f1\",\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(defaultTheme);\n const [accentColor, setAccentColorState] =\n useState<AccentColor>(defaultAccentColor);\n\n const setTheme = (t: Theme) => {\n setThemeState(t);\n document.documentElement.setAttribute(\"data-theme\", t);\n if (t === \"dark\") {\n document.documentElement.classList.add(\"dark\");\n } else {\n document.documentElement.classList.remove(\"dark\");\n }\n };\n\n const setAccentColor = (c: AccentColor) => {\n setAccentColorState(c);\n document.documentElement.style.setProperty(\"--aui-accent\", c);\n };\n\n useEffect(() => {\n document.documentElement.style.setProperty(\"--aui-accent\", accentColor);\n }, [accentColor]);\n\n return (\n <ThemeContext.Provider\n value={{ theme, accentColor, setTheme, setAccentColor }}\n >\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n return useContext(ThemeContext);\n}\n","/**\n * 图片压缩核心引擎\n * - 现代格式优先:AVIF → WebP → PNG/JPEG\n * - 阶梯缩放:逐步 50% 消除锯齿\n * - 二分质量搜索:精准命中目标体积\n */\n\n// ─────────────────────────────────────────────\n// 格式支持检测\n// ─────────────────────────────────────────────\nconst formatSupportCache = new Map<string, boolean>();\n\nfunction detectFormatSupport(mimeType: string): boolean {\n if (formatSupportCache.has(mimeType))\n return formatSupportCache.get(mimeType)!;\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const result = canvas.toDataURL(mimeType).startsWith(`data:${mimeType}`);\n formatSupportCache.set(mimeType, result);\n return result;\n}\n\nexport function resolveOutputFormat(\n hasAlpha: boolean,\n prefer: CompressFormat\n): string {\n if (prefer !== \"auto\") return `image/${prefer}`;\n if (detectFormatSupport(\"image/avif\")) return \"image/avif\";\n if (detectFormatSupport(\"image/webp\")) return \"image/webp\";\n return hasAlpha ? \"image/png\" : \"image/jpeg\";\n}\n\n// ─────────────────────────────────────────────\n// 透明通道采样检测\n// ─────────────────────────────────────────────\nexport function detectAlpha(imageData: ImageData): boolean {\n const { data } = imageData;\n for (let i = 3; i < data.length; i += 4 * 40) {\n if (data[i] < 255) return true;\n }\n return false;\n}\n\n// ─────────────────────────────────────────────\n// 尺寸等比缩放(不放大)\n// ─────────────────────────────────────────────\nexport function calcScaledSize(\n srcW: number,\n srcH: number,\n maxW: number,\n maxH: number\n): { width: number; height: number } {\n let w = srcW;\n let h = srcH;\n if (maxW > 0 && w > maxW) {\n h = Math.round((h * maxW) / w);\n w = maxW;\n }\n if (maxH > 0 && h > maxH) {\n w = Math.round((w * maxH) / h);\n h = maxH;\n }\n return { width: w, height: h };\n}\n\n// ─────────────────────────────────────────────\n// 阶梯缩放绘制(消除大比例缩放锯齿)\n// ─────────────────────────────────────────────\nexport function drawToCanvas(\n source: HTMLImageElement | ImageBitmap,\n targetW: number,\n targetH: number\n): HTMLCanvasElement {\n const srcW =\n (source as HTMLImageElement).naturalWidth ?? (source as ImageBitmap).width;\n const srcH =\n (source as HTMLImageElement).naturalHeight ??\n (source as ImageBitmap).height;\n\n let canvas = document.createElement(\"canvas\");\n canvas.width = srcW;\n canvas.height = srcH;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n canvas.getContext(\"2d\")!.drawImage(source, 0, 0, srcW, srcH);\n\n let curW = srcW;\n let curH = srcH;\n\n // 每步最多缩小 50%,渐进到目标\n while (curW > targetW * 2 || curH > targetH * 2) {\n const stepW = Math.max(Math.floor(curW / 2), targetW);\n const stepH = Math.max(Math.floor(curH / 2), targetH);\n const step = document.createElement(\"canvas\");\n step.width = stepW;\n step.height = stepH;\n const sCtx = step.getContext(\"2d\")!;\n sCtx.imageSmoothingEnabled = true;\n sCtx.imageSmoothingQuality = \"high\";\n sCtx.drawImage(canvas, 0, 0, stepW, stepH);\n canvas = step;\n curW = stepW;\n curH = stepH;\n }\n\n if (curW !== targetW || curH !== targetH) {\n const final = document.createElement(\"canvas\");\n final.width = targetW;\n final.height = targetH;\n const fCtx = final.getContext(\"2d\")!;\n fCtx.imageSmoothingEnabled = true;\n fCtx.imageSmoothingQuality = \"high\";\n fCtx.drawImage(canvas, 0, 0, targetW, targetH);\n return final;\n }\n\n return canvas;\n}\n\n// ─────────────────────────────────────────────\n// Canvas → Blob\n// ─────────────────────────────────────────────\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n mimeType: string,\n quality: number\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (b) => (b ? resolve(b) : reject(new Error(`toBlob failed: ${mimeType}`))),\n mimeType,\n quality\n );\n });\n}\n\n// ─────────────────────────────────────────────\n// 二分法质量搜索\n// ─────────────────────────────────────────────\nexport async function binarySearchQuality(\n canvas: HTMLCanvasElement,\n mimeType: string,\n targetSize: number,\n minQ: number,\n maxQ: number,\n step: number,\n onIteration?: (q: number) => void\n): Promise<Blob> {\n // 最高质量已满足?\n const hiBlob = await canvasToBlob(canvas, mimeType, maxQ);\n if (hiBlob.size <= targetSize) return hiBlob;\n\n // 最低质量仍超限?只能返回最低质量\n const loBlob = await canvasToBlob(canvas, mimeType, minQ);\n if (loBlob.size > targetSize) return loBlob;\n\n let lo = minQ;\n let hi = maxQ;\n let best = loBlob;\n\n while (hi - lo > step) {\n const mid = parseFloat(((lo + hi) / 2).toFixed(3));\n onIteration?.(mid);\n const blob = await canvasToBlob(canvas, mimeType, mid);\n if (blob.size <= targetSize) {\n best = blob;\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return best;\n}\n\n// ─────────────────────────────────────────────\n// 加载图片\n// ─────────────────────────────────────────────\nexport function loadImage(\n source: File | Blob | string\n): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const isUrl = typeof source === \"string\";\n const url = isUrl ? source : URL.createObjectURL(source);\n\n img.onload = () => {\n if (!isUrl) URL.revokeObjectURL(url);\n resolve(img);\n };\n img.onerror = () => {\n if (!isUrl) URL.revokeObjectURL(url);\n reject(new Error(\"图片加载失败\"));\n };\n img.src = url;\n });\n}\n\n// ─────────────────────────────────────────────\n// Blob → dataURL\n// ─────────────────────────────────────────────\nexport function blobToDataURL(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\n\n// ─────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────\nexport type CompressFormat = \"auto\" | \"webp\" | \"avif\" | \"jpeg\" | \"png\";\n\nexport interface CompressOptions {\n /** 最大宽度(px),0 = 不限 */\n maxWidth?: number;\n /** 最大高度(px),0 = 不限 */\n maxHeight?: number;\n /** 初始质量 0~1 */\n quality?: number;\n /** 目标文件大小上限(bytes),0 = 不限 */\n targetSize?: number;\n /** 二分法收敛精度 */\n qualityStep?: number;\n /** 最低质量兜底 */\n minQuality?: number;\n /** 格式偏好 */\n format?: CompressFormat;\n /** 是否保留透明通道 */\n preserveAlpha?: boolean;\n}\n\nexport interface CompressResult {\n blob: Blob;\n dataURL: string;\n format: string;\n quality: number;\n originalSize: number;\n compressedSize: number;\n /** 体积比,越低越好 */\n ratio: number;\n originalDimensions: { width: number; height: number };\n outputDimensions: { width: number; height: number };\n}\n\nconst DEFAULTS: Required<CompressOptions> = {\n maxWidth: 1920,\n maxHeight: 1080,\n quality: 0.85,\n targetSize: 0,\n qualityStep: 0.02,\n minQuality: 0.3,\n format: \"auto\",\n preserveAlpha: true,\n};\n\n// ─────────────────────────────────────────────\n// 主函数\n// ─────────────────────────────────────────────\nexport async function compressImage(\n input: File | Blob | string,\n options: CompressOptions = {}\n): Promise<CompressResult> {\n const opts = { ...DEFAULTS, ...options };\n\n const img = await loadImage(input);\n const srcW = img.naturalWidth;\n const srcH = img.naturalHeight;\n\n const originalSize =\n input instanceof File || input instanceof Blob\n ? input.size\n : Math.round((input.length * 3) / 4);\n\n const { width: tW, height: tH } = calcScaledSize(\n srcW,\n srcH,\n opts.maxWidth,\n opts.maxHeight\n );\n const canvas = drawToCanvas(img, tW, tH);\n const imageData = canvas.getContext(\"2d\")!.getImageData(0, 0, tW, tH);\n const hasAlpha = opts.preserveAlpha && detectAlpha(imageData);\n const mimeType = resolveOutputFormat(hasAlpha, opts.format);\n\n let finalBlob: Blob;\n let finalQuality = opts.quality;\n\n if (opts.targetSize > 0) {\n const direct = await canvasToBlob(canvas, mimeType, opts.quality);\n if (direct.size <= opts.targetSize) {\n finalBlob = direct;\n } else {\n finalBlob = await binarySearchQuality(\n canvas,\n mimeType,\n opts.targetSize,\n opts.minQuality,\n opts.quality,\n opts.qualityStep\n );\n finalQuality = opts.minQuality;\n }\n } else {\n finalBlob = await canvasToBlob(canvas, mimeType, opts.quality);\n }\n\n const dataURL = await blobToDataURL(finalBlob);\n\n return {\n blob: finalBlob,\n dataURL,\n format: mimeType,\n quality: finalQuality,\n originalSize,\n compressedSize: finalBlob.size,\n ratio: parseFloat((finalBlob.size / originalSize).toFixed(4)),\n originalDimensions: { width: srcW, height: srcH },\n outputDimensions: { width: tW, height: tH },\n };\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { compressImage } from \"./engine\";\nimport type { CompressFile, ImageCompressorProps } from \"./types\";\n\nlet uidCounter = 0;\nfunction genUid() {\n return `img-${Date.now()}-${++uidCounter}`;\n}\n\nexport function useImageCompressor(props: ImageCompressorProps) {\n const {\n concurrency = 3,\n compressOptions = {},\n onChange,\n onComplete,\n onFileComplete,\n maxCount,\n getOutputFilename,\n } = props;\n\n const [files, setFiles] = useState<CompressFile[]>([]);\n const [compressing, setCompressing] = useState(false);\n\n // 保持最新 props 引用,避免闭包过期\n const propsRef = useRef(props);\n propsRef.current = props;\n\n const updateFiles = useCallback(\n (updater: (prev: CompressFile[]) => CompressFile[]) => {\n setFiles((prev) => {\n const next = updater(prev);\n propsRef.current.onChange?.(next);\n return next;\n });\n },\n []\n );\n\n /** 添加文件到列表(不立即压缩) */\n const addFiles = useCallback(\n (rawFiles: File[]) => {\n const limited = maxCount ? rawFiles.slice(0, maxCount) : rawFiles;\n const newItems: CompressFile[] = limited.map((f) => ({\n uid: genUid(),\n originFile: f,\n status: \"idle\" as const,\n }));\n updateFiles((prev) => {\n const merged = [...prev, ...newItems];\n return maxCount ? merged.slice(-maxCount) : merged;\n });\n return newItems;\n },\n [maxCount, updateFiles]\n );\n\n /** 压缩单个 CompressFile(内部) */\n const compressOne = useCallback(\n async (item: CompressFile): Promise<CompressFile> => {\n // 标记 compressing\n updateFiles((prev) =>\n prev.map((f) =>\n f.uid === item.uid ? { ...f, status: \"compressing\" } : f\n )\n );\n\n try {\n const result = await compressImage(item.originFile, compressOptions);\n const done: CompressFile = { ...item, status: \"done\", result };\n updateFiles((prev) => prev.map((f) => (f.uid === item.uid ? done : f)));\n propsRef.current.onFileComplete?.(done);\n return done;\n } catch (e) {\n const errItem: CompressFile = {\n ...item,\n status: \"error\",\n error: e instanceof Error ? e.message : \"压缩失败\",\n };\n updateFiles((prev) =>\n prev.map((f) => (f.uid === item.uid ? errItem : f))\n );\n return errItem;\n }\n },\n [compressOptions, updateFiles]\n );\n\n /** 并发压缩队列 */\n const runCompress = useCallback(\n async (targets: CompressFile[]) => {\n if (!targets.length) return;\n setCompressing(true);\n\n const queue = [...targets];\n const results: CompressFile[] = [];\n\n const worker = async () => {\n while (queue.length > 0) {\n const item = queue.shift()!;\n results.push(await compressOne(item));\n }\n };\n\n const pool = Math.min(concurrency, targets.length);\n await Promise.all(Array.from({ length: pool }, worker));\n\n setCompressing(false);\n propsRef.current.onComplete?.(results);\n },\n [compressOne, concurrency]\n );\n\n /** 选文件 + 自动压缩(autoCompress=true 时) */\n const handleFiles = useCallback(\n (rawFiles: File[]) => {\n const items = addFiles(rawFiles);\n if (propsRef.current.autoCompress) {\n runCompress(items);\n }\n },\n [addFiles, runCompress]\n );\n\n /** 手动触发:压缩所有 idle 文件 */\n const compress = useCallback(() => {\n setFiles((prev) => {\n const idle = prev.filter((f) => f.status === \"idle\");\n if (idle.length) runCompress(idle);\n return prev;\n });\n }, [runCompress]);\n\n /** 压缩全部(含已完成的重新压缩) */\n const compressAll = useCallback(() => {\n setFiles((prev) => {\n const all = prev.map((f) => ({\n ...f,\n status: \"idle\" as const,\n result: undefined,\n error: undefined,\n }));\n runCompress(all);\n return all;\n });\n }, [runCompress]);\n\n /** 移除文件 */\n const removeFile = useCallback(\n (uid: string) => {\n updateFiles((prev) => prev.filter((f) => f.uid !== uid));\n },\n [updateFiles]\n );\n\n /** 清空全部 */\n const clearAll = useCallback(() => {\n updateFiles(() => []);\n setCompressing(false);\n }, [updateFiles]);\n\n /** 下载单个结果 */\n const downloadFile = useCallback(\n (item: CompressFile) => {\n if (!item.result) return;\n const ext = item.result.format.split(\"/\")[1];\n const name = getOutputFilename\n ? getOutputFilename(item)\n : item.originFile.name.replace(/\\.[^.]+$/, \"\") + `_compressed.${ext}`;\n\n const url = URL.createObjectURL(item.result.blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.click();\n URL.revokeObjectURL(url);\n },\n [getOutputFilename]\n );\n\n /** 下载全部已完成的文件 */\n const downloadAll = useCallback(() => {\n files.filter((f) => f.status === \"done\").forEach((f) => downloadFile(f));\n }, [files, downloadFile]);\n\n // 统计\n const stats = {\n total: files.length,\n idle: files.filter((f) => f.status === \"idle\").length,\n doing: files.filter((f) => f.status === \"compressing\").length,\n done: files.filter((f) => f.status === \"done\").length,\n error: files.filter((f) => f.status === \"error\").length,\n savedBytes: files\n .filter((f) => f.status === \"done\" && f.result)\n .reduce(\n (acc, f) => acc + f.result!.originalSize - f.result!.compressedSize,\n 0\n ),\n savedRatio: (() => {\n const doneFiles = files.filter((f) => f.status === \"done\" && f.result);\n if (!doneFiles.length) return 0;\n const origTotal = doneFiles.reduce(\n (a, f) => a + f.result!.originalSize,\n 0\n );\n const compTotal = doneFiles.reduce(\n (a, f) => a + f.result!.compressedSize,\n 0\n );\n return origTotal > 0\n ? parseFloat(((1 - compTotal / origTotal) * 100).toFixed(1))\n : 0;\n })(),\n };\n\n return {\n files,\n compressing,\n stats,\n handleFiles,\n compress,\n compressAll,\n removeFile,\n clearAll,\n downloadFile,\n downloadAll,\n };\n}\n","import React, { useId, useRef, useState } from \"react\";\nimport { useImageCompressor } from \"./use-image-compressor\";\nimport type { CompressFile, ImageCompressorProps } from \"./types\";\nimport \"./image-compressor.css\";\n\nexport { useImageCompressor } from \"./use-image-compressor\";\nexport type {\n ImageCompressorProps,\n CompressFile,\n CompressResult,\n CompressOptions,\n CompressFormat,\n ImageCompressorStatus,\n} from \"./types\";\n\n// ── 工具 ──────────────────────────────────────────────────────────────────────\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n}\n\n// ── 对比预览弹层 ──────────────────────────────────────────────────────────────\ninterface PreviewModalProps {\n file: CompressFile;\n origURL: string;\n onClose: () => void;\n}\n\nfunction PreviewModal({ file, origURL, onClose }: PreviewModalProps) {\n const r = file.result!;\n return (\n <div\n className=\"aui-imgc-preview-overlay\"\n onClick={(e) => e.target === e.currentTarget && onClose()}\n >\n <div className=\"aui-imgc-preview-modal\">\n <div className=\"aui-imgc-preview-header\">\n <span>🔍 对比预览 — {file.originFile.name}</span>\n <button\n className=\"aui-imgc-icon-btn aui-imgc-icon-btn--remove\"\n onClick={onClose}\n title=\"关闭\"\n >\n ✕\n </button>\n </div>\n <div className=\"aui-imgc-preview-body\">\n <div className=\"aui-imgc-preview-pane\">\n <span className=\"aui-imgc-preview-pane-label\">原图</span>\n <img className=\"aui-imgc-preview-img\" src={origURL} alt=\"原图\" />\n <p className=\"aui-imgc-preview-meta\">\n {r.originalDimensions.width} × {r.originalDimensions.height}\n <br />\n {formatBytes(r.originalSize)}\n </p>\n </div>\n <div className=\"aui-imgc-preview-pane\">\n <span className=\"aui-imgc-preview-pane-label\">压缩后</span>\n <img\n className=\"aui-imgc-preview-img\"\n src={r.dataURL}\n alt=\"压缩后\"\n />\n <p className=\"aui-imgc-preview-meta\">\n {r.outputDimensions.width} × {r.outputDimensions.height}\n <br />\n {formatBytes(r.compressedSize)}\n <br />\n <strong style={{ color: \"#16a34a\" }}>\n 节省 {((1 - r.ratio) * 100).toFixed(1)}%\n </strong>\n </p>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ── 单文件卡片 ─────────────────────────────────────────────────────────────────\ninterface FileCardProps {\n file: CompressFile;\n onRemove: (uid: string) => void;\n onDownload: (file: CompressFile) => void;\n onPreview: (file: CompressFile) => void;\n}\n\nfunction FileCard({ file, onRemove, onDownload, onPreview }: FileCardProps) {\n const origURL = React.useMemo(\n () => URL.createObjectURL(file.originFile),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [file.uid]\n );\n\n React.useEffect(() => () => URL.revokeObjectURL(origURL), [origURL]);\n\n const thumb =\n file.status === \"done\" && file.result ? file.result.dataURL : origURL;\n\n const cardCls = [\n \"aui-imgc-card\",\n file.status === \"compressing\" ? \"aui-imgc-card--compressing\" : \"\",\n file.status === \"done\" ? \"aui-imgc-card--done\" : \"\",\n file.status === \"error\" ? \"aui-imgc-card--error\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const r = file.result;\n\n return (\n <div className={cardCls}>\n {/* 缩略图 */}\n <img className=\"aui-imgc-thumb\" src={thumb} alt={file.originFile.name} />\n\n {/* 信息 */}\n <div className=\"aui-imgc-info\">\n <div className=\"aui-imgc-name\">{file.originFile.name}</div>\n\n {file.status === \"idle\" && (\n <div className=\"aui-imgc-status-row\">\n <span>{formatBytes(file.originFile.size)}</span>\n <span style={{ color: \"#94a3b8\" }}>· 待压缩</span>\n </div>\n )}\n\n {file.status === \"compressing\" && (\n <>\n <div className=\"aui-imgc-status-row\">\n <span style={{ color: \"var(--aui-accent, #6366f1)\" }}>\n ⏳ 压缩中…\n </span>\n </div>\n <div className=\"aui-imgc-progress\">\n <div className=\"aui-imgc-progress-fill\" />\n </div>\n </>\n )}\n\n {file.status === \"done\" && r && (\n <div className=\"aui-imgc-result-row\">\n <span className=\"aui-imgc-size-from\">\n {formatBytes(r.originalSize)}\n </span>\n <span className=\"aui-imgc-size-arrow\">→</span>\n <span className=\"aui-imgc-size-to\">\n {formatBytes(r.compressedSize)}\n </span>\n <span className=\"aui-imgc-badge aui-imgc-badge--saved\">\n -{((1 - r.ratio) * 100).toFixed(1)}%\n </span>\n <span className=\"aui-imgc-badge aui-imgc-badge--format\">\n {r.format.split(\"/\")[1].toUpperCase()}\n </span>\n </div>\n )}\n\n {file.status === \"error\" && (\n <div className=\"aui-imgc-error-msg\">❌ {file.error}</div>\n )}\n </div>\n\n {/* 操作按钮 */}\n <div className=\"aui-imgc-card-actions\">\n {file.status === \"done\" && (\n <>\n <button\n className=\"aui-imgc-icon-btn\"\n title=\"对比预览\"\n onClick={() => onPreview(file)}\n >\n 🔍\n </button>\n <button\n className=\"aui-imgc-icon-btn aui-imgc-icon-btn--download\"\n title=\"下载\"\n onClick={() => onDownload(file)}\n >\n ⬇\n </button>\n </>\n )}\n <button\n className=\"aui-imgc-icon-btn aui-imgc-icon-btn--remove\"\n title=\"移除\"\n onClick={() => onRemove(file.uid)}\n >\n ✕\n </button>\n </div>\n </div>\n );\n}\n\n// ── 主组件 ─────────────────────────────────────────────────────────────────────\nexport function ImageCompressor(props: ImageCompressorProps) {\n const {\n multiple = true,\n accept = \"image/*\",\n showActions = true,\n showStats = true,\n className,\n style,\n compressOptions,\n } = props;\n\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n const [previewFile, setPreviewFile] = useState<CompressFile | null>(null);\n const [previewOrigURL, setPreviewOrigURL] = useState(\"\");\n\n const {\n files,\n compressing,\n stats,\n handleFiles,\n compress,\n clearAll,\n removeFile,\n downloadFile,\n downloadAll,\n } = useImageCompressor(props);\n\n const triggerSelect = () => inputRef.current?.click();\n\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n handleFiles(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n };\n\n const onDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(true);\n };\n const onDragLeave = () => setDragging(false);\n const onDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n const raw = Array.from(e.dataTransfer.files).filter((f) =>\n f.type.startsWith(\"image/\")\n );\n handleFiles(multiple ? raw : raw.slice(0, 1));\n };\n\n const openPreview = (file: CompressFile) => {\n const url = URL.createObjectURL(file.originFile);\n setPreviewOrigURL(url);\n setPreviewFile(file);\n };\n\n const closePreview = () => {\n URL.revokeObjectURL(previewOrigURL);\n setPreviewFile(null);\n setPreviewOrigURL(\"\");\n };\n\n const hasIdle = stats.idle > 0;\n const hasDone = stats.done > 0;\n\n const rootCls = [\"aui-imgc\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <div className={rootCls} style={style}>\n {/* 上传区 */}\n <div\n className={[\"aui-imgc-drop\", dragging ? \"aui-imgc-drop--over\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n onClick={triggerSelect}\n >\n <span className=\"aui-imgc-drop-icon\">🖼️</span>\n <span className=\"aui-imgc-drop-title\">\n 拖拽图片到此处,或\n <span className=\"aui-imgc-drop-link\">点击选择</span>\n </span>\n <span className=\"aui-imgc-drop-hint\">\n 支持 JPG · PNG · WebP · AVIF\n {props.maxCount ? `,最多 ${props.maxCount} 张` : \"\"}\n </span>\n\n {compressOptions?.format && compressOptions.format !== \"auto\" && (\n <span className=\"aui-imgc-drop-hint\">\n 输出格式:{compressOptions.format.toUpperCase()}\n </span>\n )}\n </div>\n\n <input\n id={inputId}\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"aui-imgc-input\"\n onChange={onInputChange}\n />\n\n {/* 统计栏 */}\n {showStats && files.length > 0 && (\n <div className=\"aui-imgc-stats\">\n <div className=\"aui-imgc-stats-item\">\n <span className=\"aui-imgc-stats-label\">共</span>\n <span className=\"aui-imgc-stats-value\">{stats.total}</span>\n </div>\n <div className=\"aui-imgc-stats-divider\" />\n <div className=\"aui-imgc-stats-item\">\n <span className=\"aui-imgc-stats-label\">已完成</span>\n <span className=\"aui-imgc-stats-value\">{stats.done}</span>\n </div>\n {stats.error > 0 && (\n <>\n <div className=\"aui-imgc-stats-divider\" />\n <div className=\"aui-imgc-stats-item\">\n <span className=\"aui-imgc-stats-label\">失败</span>\n <span\n className=\"aui-imgc-stats-value\"\n style={{ color: \"#dc2626\" }}\n >\n {stats.error}\n </span>\n </div>\n </>\n )}\n {hasDone && (\n <>\n <div className=\"aui-imgc-stats-divider\" />\n <div className=\"aui-imgc-stats-item\">\n <span className=\"aui-imgc-stats-label\">共节省</span>\n <span className=\"aui-imgc-stats-value aui-imgc-stats-value--green\">\n {formatBytes(stats.savedBytes)}\n </span>\n </div>\n <div className=\"aui-imgc-stats-item\">\n <span className=\"aui-imgc-stats-label\">平均压缩率</span>\n <span className=\"aui-imgc-stats-value aui-imgc-stats-value--green\">\n -{stats.savedRatio}%\n </span>\n </div>\n </>\n )}\n </div>\n )}\n\n {/* 操作栏 */}\n {showActions && files.length > 0 && (\n <div className=\"aui-imgc-actions\">\n {hasIdle && (\n <button\n className=\"aui-btn aui-btn-md aui-btn-primary\"\n onClick={compress}\n disabled={compressing}\n >\n {compressing ? \"⏳ 压缩中…\" : \"🚀 开始压缩\"}\n </button>\n )}\n {hasDone && (\n <button\n className=\"aui-btn aui-btn-md aui-btn-outline\"\n onClick={downloadAll}\n disabled={compressing}\n >\n ⬇ 全部下载\n </button>\n )}\n <button\n className=\"aui-btn aui-btn-md aui-btn-ghost\"\n onClick={clearAll}\n disabled={compressing}\n >\n 🗑 清空\n </button>\n </div>\n )}\n\n {/* 文件列表 */}\n {files.length > 0 && (\n <div className=\"aui-imgc-list\">\n {files.map((f) => (\n <FileCard\n key={f.uid}\n file={f}\n onRemove={removeFile}\n onDownload={downloadFile}\n onPreview={openPreview}\n />\n ))}\n </div>\n )}\n\n {/* 对比预览弹层 */}\n {previewFile && previewFile.result && (\n <PreviewModal\n file={previewFile}\n origURL={previewOrigURL}\n onClose={closePreview}\n />\n )}\n </div>\n );\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport type {\n UploadManagerFile,\n UploadManagerProps,\n UploadManagerRequestOption,\n} from \"./types\";\n\nlet uidCounter = 0;\nfunction genUid() {\n return `um-${Date.now()}-${++uidCounter}`;\n}\n\nexport function formatFileSize(size: number): string {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function isImageFile(file: UploadManagerFile): boolean {\n return (\n file.type.startsWith(\"image/\") ||\n /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(file.name)\n );\n}\n\nexport function isVideoFile(file: UploadManagerFile): boolean {\n return (\n file.type.startsWith(\"video/\") ||\n /\\.(mp4|webm|ogg|mov|avi)$/i.test(file.name)\n );\n}\n\nfunction defaultRequest<T>(\n options: UploadManagerRequestOption<T>\n): XMLHttpRequest | void {\n const {\n action,\n file,\n filename = \"file\",\n headers,\n data,\n method = \"POST\",\n onProgress,\n onSuccess,\n onError,\n } = options;\n\n const xhr = new XMLHttpRequest();\n const formData = new FormData();\n formData.append(filename, file);\n if (data) {\n Object.entries(data).forEach(([k, v]) => formData.append(k, v));\n }\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.total > 0 && onProgress) {\n onProgress({ percent: Math.round((e.loaded / e.total) * 100) });\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n let body: T;\n try {\n body = JSON.parse(xhr.responseText) as T;\n } catch {\n body = xhr.responseText as unknown as T;\n }\n onSuccess?.(body, xhr);\n } else {\n onError?.(new Error(`上传失败:HTTP ${xhr.status}`));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n onError?.(new Error(\"网络错误,请检查连接后重试\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n onError?.(new Error(\"上传已取消\"));\n });\n\n xhr.open(method, action);\n if (headers) {\n Object.entries(headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n }\n xhr.send(formData);\n\n return xhr;\n}\n\nexport function useUploadManager<T>(props: UploadManagerProps<T>) {\n const {\n action,\n beforeUpload,\n customRequest,\n defaultFileList,\n fileList: controlledFileList,\n maxCount,\n maxSize,\n name = \"file\",\n headers,\n data,\n autoUpload = true,\n onChange,\n onRemove,\n } = props;\n\n const isControlled = controlledFileList !== undefined;\n const [internalList, setInternalList] = useState<UploadManagerFile<T>[]>(\n defaultFileList ?? []\n );\n\n // 保存每个文件对应的 XHR 实例,用于取消上传\n const xhrMapRef = useRef<Map<string, XMLHttpRequest>>(new Map());\n\n const fileList = isControlled ? controlledFileList! : internalList;\n\n const updateList = useCallback(\n (updater: (prev: UploadManagerFile<T>[]) => UploadManagerFile<T>[]) => {\n if (!isControlled) setInternalList(updater);\n },\n [isControlled]\n );\n\n const updateFile = useCallback(\n (uid: string, patch: Partial<UploadManagerFile<T>>) => {\n updateList((prev) =>\n prev.map((f) => (f.uid === uid ? { ...f, ...patch } : f))\n );\n if (onChange) {\n const current = fileList.find((f) => f.uid === uid);\n if (current) {\n const updated = { ...current, ...patch };\n onChange({\n file: updated,\n fileList: fileList.map((f) => (f.uid === uid ? updated : f)),\n });\n }\n }\n },\n [fileList, onChange, updateList]\n );\n\n // 执行单文件上传\n const doUpload = useCallback(\n async (item: UploadManagerFile<T>) => {\n const doRequest = customRequest ?? defaultRequest;\n\n let resolvedAction = \"\";\n if (typeof action === \"string\") resolvedAction = action;\n else if (typeof action === \"function\") {\n try {\n resolvedAction = await action(item.originFileObj);\n } catch {\n updateFile(item.uid, {\n status: \"error\",\n errorMessage: \"获取上传地址失败\",\n });\n return;\n }\n }\n\n if (!resolvedAction && !customRequest) {\n // 没有配置 action 也没有 customRequest,直接标记为成功(演示模式)\n updateFile(item.uid, { status: \"done\", percent: 100 });\n return;\n }\n\n updateFile(item.uid, { status: \"uploading\", percent: 0 });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = doRequest({\n action: resolvedAction,\n file: item.originFileObj,\n filename: name,\n headers,\n data,\n onProgress: ({ percent }) => updateFile(item.uid, { percent }),\n onSuccess: (body) => {\n xhrMapRef.current.delete(item.uid);\n updateFile(item.uid, {\n status: \"done\",\n percent: 100,\n response: body,\n });\n },\n onError: (err) => {\n xhrMapRef.current.delete(item.uid);\n updateFile(item.uid, { status: \"error\", errorMessage: err.message });\n },\n } as UploadManagerRequestOption<T>);\n\n if (result instanceof XMLHttpRequest) {\n xhrMapRef.current.set(item.uid, result);\n }\n },\n [action, customRequest, data, headers, name, updateFile]\n );\n\n // 添加文件(选择 / 拖拽触发)\n const addFiles = useCallback(\n async (rawFiles: File[]) => {\n const remaining = maxCount ? maxCount - fileList.length : Infinity;\n const sliced = rawFiles.slice(0, remaining > 0 ? remaining : 0);\n if (sliced.length === 0) return;\n\n const newItems: UploadManagerFile<T>[] = [];\n\n for (const raw of sliced) {\n // 文件大小校验\n if (maxSize && raw.size > maxSize) {\n // 将超限文件加入列表并标记错误,方便用户看到\n newItems.push({\n uid: genUid(),\n name: raw.name,\n size: raw.size,\n type: raw.type,\n status: \"error\",\n percent: 0,\n originFileObj: raw,\n errorMessage: `文件大小超出限制(最大 ${formatFileSize(maxSize)})`,\n addedAt: Date.now(),\n });\n continue;\n }\n\n let picked: File | boolean = raw;\n if (beforeUpload) {\n try {\n const result = await beforeUpload(raw, sliced);\n if (result === false) continue;\n if (result instanceof File) picked = result;\n } catch {\n continue;\n }\n }\n\n const actualFile = picked instanceof File ? picked : raw;\n const relativePath =\n (actualFile as any).webkitRelativePath || undefined;\n const isImage =\n actualFile.type.startsWith(\"image/\") ||\n /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(actualFile.name);\n const thumbUrl = isImage ? URL.createObjectURL(actualFile) : undefined;\n\n newItems.push({\n uid: genUid(),\n name: actualFile.name,\n size: actualFile.size,\n type: actualFile.type,\n status: autoUpload ? \"uploading\" : \"pending\",\n percent: 0,\n originFileObj: actualFile,\n thumbUrl,\n relativePath,\n addedAt: Date.now(),\n });\n }\n\n if (newItems.length === 0) return;\n\n updateList((prev) => [...prev, ...newItems]);\n\n if (onChange) {\n const last = newItems[newItems.length - 1];\n onChange({ file: last, fileList: [...fileList, ...newItems] });\n }\n\n if (autoUpload) {\n for (const item of newItems) {\n if (item.status !== \"error\") {\n doUpload(item);\n }\n }\n }\n },\n [\n autoUpload,\n beforeUpload,\n doUpload,\n fileList,\n maxCount,\n maxSize,\n onChange,\n updateList,\n ]\n );\n\n // 手动触发上传(autoUpload=false 时)\n const startUpload = useCallback(\n (uid?: string) => {\n const targets = uid\n ? fileList.filter((f) => f.uid === uid && f.status === \"pending\")\n : fileList.filter((f) => f.status === \"pending\");\n targets.forEach((f) => doUpload(f));\n },\n [doUpload, fileList]\n );\n\n // 重试单个失败文件\n const retryFile = useCallback(\n (uid: string) => {\n const file = fileList.find((f) => f.uid === uid);\n if (file && file.status === \"error\") {\n doUpload({\n ...file,\n status: \"uploading\",\n percent: 0,\n errorMessage: undefined,\n });\n }\n },\n [doUpload, fileList]\n );\n\n // 移除文件\n const removeFile = useCallback(\n async (file: UploadManagerFile<T>) => {\n if (onRemove) {\n const result = await onRemove(file);\n if (result === false) return;\n }\n // 取消正在上传的请求\n const xhr = xhrMapRef.current.get(file.uid);\n if (xhr) {\n xhr.abort();\n xhrMapRef.current.delete(file.uid);\n }\n // 释放 ObjectURL\n if (file.thumbUrl && file.thumbUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(file.thumbUrl);\n }\n updateList((prev) => prev.filter((f) => f.uid !== file.uid));\n if (onChange) {\n onChange({\n file: { ...file, status: \"error\" },\n fileList: fileList.filter((f) => f.uid !== file.uid),\n });\n }\n },\n [fileList, onChange, onRemove, updateList]\n );\n\n // 清除所有文件\n const clearAll = useCallback(() => {\n fileList.forEach((f) => {\n const xhr = xhrMapRef.current.get(f.uid);\n if (xhr) xhr.abort();\n if (f.thumbUrl && f.thumbUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(f.thumbUrl);\n }\n });\n xhrMapRef.current.clear();\n updateList(() => []);\n }, [fileList, updateList]);\n\n // 统计信息\n const stats = {\n total: fileList.length,\n pending: fileList.filter((f) => f.status === \"pending\").length,\n uploading: fileList.filter((f) => f.status === \"uploading\").length,\n done: fileList.filter((f) => f.status === \"done\").length,\n error: fileList.filter((f) => f.status === \"error\").length,\n };\n\n return {\n fileList,\n stats,\n addFiles,\n startUpload,\n retryFile,\n removeFile,\n clearAll,\n };\n}\n","import { Icon } from \"../icon\";\nimport { Progress } from \"../progress\";\nimport type { UploadManagerFile } from \"./types\";\nimport { formatFileSize, isImageFile, isVideoFile } from \"./use-upload-manager\";\n\nexport interface ManagerItemProps {\n file: UploadManagerFile;\n onRemove: (file: UploadManagerFile) => void;\n onRetry: (uid: string) => void;\n onPreview: (file: UploadManagerFile) => void;\n /** 树形视图中已由目录行展示层级,不再在条目内重复显示相对路径 */\n hideRelativePath?: boolean;\n}\n\nfunction FileTypeIcon({ file }: { file: UploadManagerFile }) {\n if (file.status === \"uploading\") {\n return (\n <Icon name=\"circle-loading\" size={16} className=\"aui-um-item-spin\" />\n );\n }\n if (file.status === \"error\") {\n return <Icon name=\"circle-x\" size={16} />;\n }\n if (file.status === \"done\") {\n return <Icon name=\"circle-check\" size={16} />;\n }\n // pending\n if (isImageFile(file)) return <Icon name=\"file-image\" size={16} />;\n return <Icon name=\"file\" size={16} />;\n}\n\nfunction statusCls(file: UploadManagerFile): string {\n const map: Record<string, string> = {\n uploading: \"aui-um-item--uploading\",\n done: \"aui-um-item--done\",\n error: \"aui-um-item--error\",\n pending: \"aui-um-item--pending\",\n };\n return map[file.status] ?? \"\";\n}\n\nfunction Thumbnail({\n file,\n onPreview,\n}: {\n file: UploadManagerFile;\n onPreview: () => void;\n}) {\n const canPreview = isImageFile(file) || isVideoFile(file);\n const src = file.thumbUrl;\n\n if (!src) {\n return (\n <div className=\"aui-um-item-thumb aui-um-item-thumb--icon\">\n <Icon name={isImageFile(file) ? \"file-image\" : \"file\"} size={22} />\n </div>\n );\n }\n\n return (\n <div\n className={`aui-um-item-thumb${\n canPreview ? \" aui-um-item-thumb--clickable\" : \"\"\n }`}\n onClick={canPreview ? onPreview : undefined}\n title={canPreview ? \"点击预览\" : undefined}\n >\n {isVideoFile(file) ? (\n <div className=\"aui-um-item-thumb-video\">\n <Icon name=\"file\" size={22} />\n <span className=\"aui-um-item-thumb-video-badge\">▶</span>\n </div>\n ) : (\n <img src={src} alt={file.name} draggable={false} />\n )}\n {file.status === \"uploading\" && (\n <div className=\"aui-um-item-thumb-overlay\">\n <span className=\"aui-um-item-thumb-percent\">{file.percent}%</span>\n </div>\n )}\n </div>\n );\n}\n\nexport function ManagerItem({\n file,\n onRemove,\n onRetry,\n onPreview,\n hideRelativePath,\n}: ManagerItemProps) {\n const canPreview =\n (isImageFile(file) || isVideoFile(file)) && file.status !== \"uploading\";\n\n return (\n <div className={`aui-um-item ${statusCls(file)}`}>\n {/* 缩略图 */}\n <Thumbnail file={file} onPreview={() => onPreview(file)} />\n\n {/* 文件信息 */}\n <div className=\"aui-um-item-info\">\n <div className=\"aui-um-item-row\">\n <span\n className={`aui-um-item-name${\n canPreview ? \" aui-um-item-name--link\" : \"\"\n }`}\n title={file.relativePath ?? file.name}\n onClick={canPreview ? () => onPreview(file) : undefined}\n >\n {file.name}\n </span>\n <span className=\"aui-um-item-size\">{formatFileSize(file.size)}</span>\n </div>\n {/* 有层级时显示相对路径(hideRelativePath=true 时由父级树形行展示,跳过) */}\n {!hideRelativePath &&\n file.relativePath &&\n file.relativePath !== file.name &&\n (() => {\n const dir = file.relativePath.includes(\"/\")\n ? file.relativePath.slice(0, file.relativePath.lastIndexOf(\"/\"))\n : null;\n return dir ? (\n <div className=\"aui-um-item-path\" title={file.relativePath}>\n {dir}\n </div>\n ) : null;\n })()}\n\n {/* 上传进度条 */}\n {file.status === \"uploading\" && (\n <div className=\"aui-um-item-progress\">\n <Progress\n percent={file.percent}\n size=\"sm\"\n showInfo={false}\n status=\"normal\"\n />\n <span className=\"aui-um-item-progress-text\">{file.percent}%</span>\n </div>\n )}\n\n {/* 错误信息 */}\n {file.status === \"error\" && (\n <div className=\"aui-um-item-error\">\n <span\n className=\"aui-um-item-error-msg\"\n title={file.errorMessage ?? \"上传失败\"}\n >\n {file.errorMessage ?? \"上传失败\"}\n </span>\n </div>\n )}\n\n {/* 成功信息 */}\n {file.status === \"done\" && (\n <div className=\"aui-um-item-success\">上传成功</div>\n )}\n\n {/* 等待中 */}\n {file.status === \"pending\" && (\n <div className=\"aui-um-item-pending\">等待上传</div>\n )}\n </div>\n\n {/* 状态图标 */}\n <div\n className={`aui-um-item-status-icon aui-um-item-status--${file.status}`}\n >\n <FileTypeIcon file={file} />\n </div>\n\n {/* 操作按钮 */}\n <div className=\"aui-um-item-actions\">\n {file.status === \"error\" && (\n <button\n type=\"button\"\n className=\"aui-um-item-action-btn aui-um-item-action-retry\"\n onClick={() => onRetry(file.uid)}\n title=\"重试\"\n >\n <Icon name=\"refresh\" size={14} />\n </button>\n )}\n <button\n type=\"button\"\n className=\"aui-um-item-action-btn aui-um-item-action-remove\"\n onClick={() => onRemove(file)}\n title=\"移除\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Icon } from \"../icon\";\nimport type { UploadManagerFile } from \"./types\";\nimport { isImageFile, isVideoFile } from \"./use-upload-manager\";\n\ninterface PreviewModalProps {\n file: UploadManagerFile | null;\n fileList: UploadManagerFile[];\n onClose: () => void;\n onNavigate: (file: UploadManagerFile) => void;\n}\n\n// 可预览类型\nfunction isPreviewable(file: UploadManagerFile): boolean {\n return (\n isImageFile(file) || isVideoFile(file) || file.type === \"application/pdf\"\n );\n}\n\nfunction PreviewContent({ file }: { file: UploadManagerFile }) {\n const src = file.thumbUrl || (file as { url?: string }).url || \"\";\n\n if (isVideoFile(file)) {\n return (\n <video\n key={file.uid}\n src={src}\n controls\n className=\"aui-um-preview-media\"\n style={{ maxWidth: \"100%\", maxHeight: \"100%\", outline: \"none\" }}\n />\n );\n }\n\n if (file.type === \"application/pdf\") {\n return (\n <iframe\n src={src}\n className=\"aui-um-preview-media\"\n style={{\n width: \"80vw\",\n height: \"80vh\",\n border: \"none\",\n borderRadius: 8,\n }}\n title={file.name}\n />\n );\n }\n\n return (\n <img\n key={file.uid}\n src={src}\n alt={file.name}\n className=\"aui-um-preview-img\"\n draggable={false}\n />\n );\n}\n\nexport function PreviewModal({\n file,\n fileList,\n onClose,\n onNavigate,\n}: PreviewModalProps) {\n const [visible, setVisible] = useState(false);\n const [leaving, setLeaving] = useState(false);\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // 可预览的文件列表(用于左右切换)\n const previewableList = fileList.filter(isPreviewable);\n const currentIndex = file\n ? previewableList.findIndex((f) => f.uid === file.uid)\n : -1;\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < previewableList.length - 1;\n\n useEffect(() => {\n if (file) {\n setLeaving(false);\n requestAnimationFrame(() => setVisible(true));\n } else {\n setVisible(false);\n }\n }, [file]);\n\n const handleClose = useCallback(() => {\n setLeaving(true);\n setVisible(false);\n setTimeout(onClose, 200);\n }, [onClose]);\n\n const handlePrev = useCallback(() => {\n if (hasPrev) onNavigate(previewableList[currentIndex - 1]);\n }, [currentIndex, hasPrev, onNavigate, previewableList]);\n\n const handleNext = useCallback(() => {\n if (hasNext) onNavigate(previewableList[currentIndex + 1]);\n }, [currentIndex, hasNext, onNavigate, previewableList]);\n\n useEffect(() => {\n if (!file) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") handleClose();\n if (e.key === \"ArrowLeft\") handlePrev();\n if (e.key === \"ArrowRight\") handleNext();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [file, handleClose, handleNext, handlePrev]);\n\n if (!file && !leaving) return null;\n\n return createPortal(\n <div\n ref={overlayRef}\n className={`aui-um-preview-overlay${\n visible ? \" aui-um-preview-visible\" : \"\"\n }`}\n onClick={(e) => {\n if (e.target === overlayRef.current) handleClose();\n }}\n >\n <div className=\"aui-um-preview-header\">\n <span className=\"aui-um-preview-title\" title={file?.name}>\n {file?.name}\n </span>\n {previewableList.length > 1 && (\n <span className=\"aui-um-preview-counter\">\n {currentIndex + 1} / {previewableList.length}\n </span>\n )}\n <button\n type=\"button\"\n className=\"aui-um-preview-close\"\n onClick={handleClose}\n title=\"关闭(Esc)\"\n >\n <Icon name=\"x\" size={20} />\n </button>\n </div>\n\n <div className=\"aui-um-preview-body\">\n {hasPrev && (\n <button\n type=\"button\"\n className=\"aui-um-preview-nav aui-um-preview-nav-prev\"\n onClick={handlePrev}\n title=\"上一张(←)\"\n >\n <Icon name=\"chevron-left\" size={24} />\n </button>\n )}\n\n <div className=\"aui-um-preview-content\">\n {file && isPreviewable(file) ? (\n <PreviewContent file={file} />\n ) : (\n <div className=\"aui-um-preview-unsupported\">\n <Icon name=\"file\" size={48} />\n <p>此文件类型不支持预览</p>\n </div>\n )}\n </div>\n\n {hasNext && (\n <button\n type=\"button\"\n className=\"aui-um-preview-nav aui-um-preview-nav-next\"\n onClick={handleNext}\n title=\"下一张(→)\"\n >\n <Icon name=\"chevron-right\" size={24} />\n </button>\n )}\n </div>\n </div>,\n document.body\n );\n}\n","import React, { useId, useRef, useState, useCallback } from \"react\";\nimport { Icon } from \"../icon\";\nimport { Button } from \"../button\";\nimport { ManagerItem } from \"./manager-item\";\nimport { PreviewModal } from \"./preview-modal\";\nimport { useUploadManager } from \"./use-upload-manager\";\nimport type { UploadManagerFile, UploadManagerProps } from \"./types\";\nimport \"./upload-manager.css\";\n\nexport type { UploadManagerFile, UploadManagerProps } from \"./types\";\nexport type {\n UploadManagerStatus,\n UploadManagerRequestOption,\n UploadManagerChangeParam,\n} from \"./types\";\nexport { useUploadManager } from \"./use-upload-manager\";\n\n// ── 树形结构 ──────────────────────────────────────────────────────────────────\n\ninterface TreeDir {\n kind: \"dir\";\n name: string;\n children: TreeNode[];\n}\ninterface TreeFile {\n kind: \"file\";\n file: UploadManagerFile;\n}\ntype TreeNode = TreeDir | TreeFile;\n\n/** 将扁平 fileList 按 relativePath 构建目录树 */\nfunction buildTree(fileList: UploadManagerFile[]): TreeNode[] {\n const root: TreeNode[] = [];\n\n for (const file of fileList) {\n const parts = file.relativePath\n ? file.relativePath.split(\"/\")\n : [file.name];\n\n let nodes = root;\n // 遍历目录部分(parts 除最后一段外都是目录)\n for (let i = 0; i < parts.length - 1; i++) {\n const dirName = parts[i];\n let dir = nodes.find(\n (n): n is TreeDir => n.kind === \"dir\" && n.name === dirName\n );\n if (!dir) {\n dir = { kind: \"dir\", name: dirName, children: [] };\n nodes.push(dir);\n }\n nodes = dir.children;\n }\n nodes.push({ kind: \"file\", file });\n }\n\n return root;\n}\n\n// ── 目录节点(可折叠)────────────────────────────────────────────────────────\n\ninterface DirNodeProps {\n node: TreeDir;\n depth: number;\n onRemove: (file: UploadManagerFile) => void;\n onRetry: (uid: string) => void;\n onPreview: (file: UploadManagerFile) => void;\n}\n\nfunction DirNode({ node, depth, onRemove, onRetry, onPreview }: DirNodeProps) {\n const [open, setOpen] = useState(true);\n return (\n <div className=\"aui-um-tree-dir\">\n <button\n type=\"button\"\n className=\"aui-um-tree-dir-row\"\n style={{ paddingLeft: depth * 16 + 8 }}\n onClick={() => setOpen((v) => !v)}\n >\n <Icon\n name={open ? \"chevron-down\" : \"chevron-right\"}\n size={14}\n className=\"aui-um-tree-chevron\"\n />\n <Icon name=\"file\" size={14} className=\"aui-um-tree-folder-icon\" />\n <span className=\"aui-um-tree-dir-name\">{node.name}</span>\n <span className=\"aui-um-tree-dir-count\">{countFiles(node)} 个</span>\n </button>\n {open && (\n <div className=\"aui-um-tree-dir-children\">\n {node.children.map((child, i) =>\n child.kind === \"dir\" ? (\n <DirNode\n key={child.name + i}\n node={child}\n depth={depth + 1}\n onRemove={onRemove}\n onRetry={onRetry}\n onPreview={onPreview}\n />\n ) : (\n <div\n key={child.file.uid}\n className=\"aui-um-tree-file-row\"\n style={{ paddingLeft: (depth + 1) * 16 + 8 }}\n >\n <ManagerItem\n file={child.file}\n onRemove={onRemove}\n onRetry={onRetry}\n onPreview={onPreview}\n hideRelativePath\n />\n </div>\n )\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction countFiles(node: TreeDir): number {\n let n = 0;\n for (const child of node.children) {\n if (child.kind === \"file\") n++;\n else n += countFiles(child);\n }\n return n;\n}\n\n// ── 树形文件列表 ──────────────────────────────────────────────────────────────\n\ninterface FileTreeProps {\n fileList: UploadManagerFile[];\n onRemove: (file: UploadManagerFile) => void;\n onRetry: (uid: string) => void;\n onPreview: (file: UploadManagerFile) => void;\n}\n\nfunction FileTree({ fileList, onRemove, onRetry, onPreview }: FileTreeProps) {\n const tree = buildTree(fileList);\n return (\n <div className=\"aui-um-tree\">\n {tree.map((node, i) =>\n node.kind === \"dir\" ? (\n <DirNode\n key={node.name + i}\n node={node}\n depth={0}\n onRemove={onRemove}\n onRetry={onRetry}\n onPreview={onPreview}\n />\n ) : (\n <div\n key={node.file.uid}\n className=\"aui-um-tree-file-row aui-um-tree-file-row--root\"\n >\n <ManagerItem\n file={node.file}\n onRemove={onRemove}\n onRetry={onRetry}\n onPreview={onPreview}\n hideRelativePath\n />\n </div>\n )\n )}\n </div>\n );\n}\n\n// ── 递归遍历拖拽的 FileSystemEntry ────────────────────────────────────────────\n\nasync function collectFromEntries(entries: FileSystemEntry[]): Promise<File[]> {\n const files: File[] = [];\n\n const traverse = async (entry: FileSystemEntry, basePath = \"\") => {\n if (entry.isFile) {\n const file = await new Promise<File>((res) =>\n (entry as FileSystemFileEntry).file(res)\n );\n const rel = basePath ? `${basePath}/${file.name}` : file.name;\n Object.defineProperty(file, \"webkitRelativePath\", {\n value: rel,\n writable: false,\n configurable: true,\n });\n files.push(file);\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readAll = (): Promise<FileSystemEntry[]> =>\n new Promise((res) => {\n const all: FileSystemEntry[] = [];\n const readBatch = () =>\n reader.readEntries((batch) => {\n if (!batch.length) return res(all);\n all.push(...batch);\n readBatch();\n });\n readBatch();\n });\n const children = await readAll();\n const nextBase = basePath ? `${basePath}/${entry.name}` : entry.name;\n for (const child of children) await traverse(child, nextBase);\n }\n };\n\n for (const entry of entries) await traverse(entry);\n return files;\n}\n\n// ── 主组件 ────────────────────────────────────────────────────────────────────\n\nfunction UploadManagerBase<T = unknown>(props: UploadManagerProps<T>) {\n const {\n accept,\n multiple = true,\n disabled = false,\n autoUpload = true,\n maxCount,\n hint,\n onPreview: customOnPreview,\n className,\n style,\n } = props;\n\n const inputId = useId();\n const folderInputId = useId();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const folderInputRef = useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = useState(false);\n const [previewFile, setPreviewFile] = useState<UploadManagerFile | null>(\n null\n );\n\n const {\n fileList,\n stats,\n addFiles,\n startUpload,\n retryFile,\n removeFile,\n clearAll,\n } = useUploadManager(props);\n\n const reachedMax = maxCount !== undefined && fileList.length >= maxCount;\n\n const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n addFiles(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n };\n\n const onDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n if (!disabled && !reachedMax) setDragging(true);\n };\n const onDragLeave = (e: React.DragEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setDragging(false);\n }\n };\n const onDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n if (disabled || reachedMax) return;\n\n const entries = Array.from(e.dataTransfer.items)\n .map((item) => item.webkitGetAsEntry())\n .filter(Boolean) as FileSystemEntry[];\n\n if (entries.length) {\n const files = await collectFromEntries(entries);\n addFiles(multiple ? files : files.slice(0, 1));\n } else {\n const files = Array.from(e.dataTransfer.files);\n addFiles(multiple ? files : files.slice(0, 1));\n }\n };\n\n const handlePreview = useCallback(\n (file: UploadManagerFile) => {\n if (customOnPreview) {\n customOnPreview(file as UploadManagerFile<T>);\n } else {\n setPreviewFile(file);\n }\n },\n [customOnPreview]\n );\n\n const dropZoneCls = [\n \"aui-um-dropzone\",\n dragging ? \"aui-um-dropzone--over\" : \"\",\n disabled || reachedMax ? \"aui-um-dropzone--disabled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const hasUploading = stats.uploading > 0;\n const allDone = stats.total > 0 && stats.done + stats.error === stats.total;\n\n return (\n <div\n className={[\"aui-upload-manager\", className ?? \"\"]\n .filter(Boolean)\n .join(\" \")}\n style={style}\n >\n {/* ── 拖拽区域 ── */}\n {!reachedMax && (\n <div\n className={dropZoneCls}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className=\"aui-um-dropzone-content\">\n <Icon\n name=\"cloud-upload\"\n size={36}\n className=\"aui-um-dropzone-icon\"\n />\n <p className=\"aui-um-dropzone-text\">将文件或文件夹拖拽到此处</p>\n <p className=\"aui-um-dropzone-hint\">\n {hint ?? (\n <>\n {multiple ? \"支持批量上传\" : \"仅支持单文件上传\"}\n {maxCount ? `,最多 ${maxCount} 个` : \"\"}\n </>\n )}\n </p>\n {!disabled && (\n <div className=\"aui-um-dropzone-btns\">\n <Button\n size=\"sm\"\n variant=\"primary\"\n onClick={() => fileInputRef.current?.click()}\n >\n 选择文件\n </Button>\n {multiple && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => folderInputRef.current?.click()}\n >\n 选择文件夹\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* ── 工具栏 ── */}\n {fileList.length > 0 && (\n <div className=\"aui-um-toolbar\">\n <div className=\"aui-um-toolbar-stats\">\n <span className=\"aui-um-stat\">共 {stats.total} 个</span>\n {stats.uploading > 0 && (\n <span className=\"aui-um-stat aui-um-stat--uploading\">\n 上传中 {stats.uploading}\n </span>\n )}\n {stats.done > 0 && (\n <span className=\"aui-um-stat aui-um-stat--done\">\n 成功 {stats.done}\n </span>\n )}\n {stats.error > 0 && (\n <span className=\"aui-um-stat aui-um-stat--error\">\n 失败 {stats.error}\n </span>\n )}\n {stats.pending > 0 && (\n <span className=\"aui-um-stat aui-um-stat--pending\">\n 待上传 {stats.pending}\n </span>\n )}\n </div>\n\n <div className=\"aui-um-toolbar-actions\">\n {!autoUpload && stats.pending > 0 && (\n <Button\n size=\"sm\"\n variant=\"primary\"\n loading={hasUploading}\n onClick={() => startUpload()}\n >\n <Icon name=\"upload\" size={13} />\n 开始上传\n </Button>\n )}\n {stats.error > 0 && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n fileList\n .filter((f) => f.status === \"error\")\n .forEach((f) => retryFile(f.uid));\n }}\n >\n <Icon name=\"refresh\" size={13} />\n 全部重试\n </Button>\n )}\n <button\n type=\"button\"\n className=\"aui-um-clear-btn\"\n onClick={clearAll}\n title=\"清空列表\"\n >\n <Icon name=\"trash\" size={14} />\n <span>清空</span>\n </button>\n </div>\n </div>\n )}\n\n {/* ── 整体进度条 ── */}\n {fileList.length > 0 && (\n <div className=\"aui-um-overall-progress\">\n <div className=\"aui-um-overall-track\">\n <div\n className={`aui-um-overall-fill${\n hasUploading ? \" aui-um-overall-fill--active\" : \"\"\n }${\n allDone && stats.error === 0\n ? \" aui-um-overall-fill--success\"\n : \"\"\n }${\n allDone && stats.error > 0\n ? \" aui-um-overall-fill--partial\"\n : \"\"\n }`}\n style={{\n width: `${\n stats.total > 0\n ? Math.round(\n ((stats.done + stats.error) / stats.total) * 100\n )\n : 0\n }%`,\n }}\n />\n </div>\n <span className=\"aui-um-overall-label\">\n {allDone\n ? stats.error === 0\n ? \"全部上传完成\"\n : `完成 ${stats.done},失败 ${stats.error}`\n : hasUploading\n ? `上传中… ${stats.done + stats.error}/${stats.total}`\n : `${stats.done + stats.error}/${stats.total}`}\n </span>\n </div>\n )}\n\n {/* ── 树形文件列表 ── */}\n {fileList.length > 0 && (\n <FileTree\n fileList={fileList as UploadManagerFile[]}\n onRemove={removeFile as (f: UploadManagerFile) => void}\n onRetry={retryFile}\n onPreview={handlePreview}\n />\n )}\n\n {/* 隐藏:选文件 */}\n <input\n id={inputId}\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"aui-um-input\"\n onChange={onInputChange}\n disabled={disabled}\n />\n {/* 隐藏:选文件夹 */}\n <input\n id={folderInputId}\n ref={folderInputRef}\n type=\"file\"\n // @ts-ignore\n webkitdirectory=\"true\"\n multiple\n className=\"aui-um-input\"\n onChange={onInputChange}\n disabled={disabled}\n />\n\n {/* 预览弹窗 */}\n {!customOnPreview && (\n <PreviewModal\n file={previewFile}\n fileList={fileList as UploadManagerFile[]}\n onClose={() => setPreviewFile(null)}\n onNavigate={(f) => setPreviewFile(f)}\n />\n )}\n </div>\n );\n}\n\nUploadManagerBase.displayName = \"UploadManager\";\n\nexport const UploadManager = UploadManagerBase;\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","BREAKPOINTS","GutterContext","createContext","listeners","Set","bound","getCurrentBreakpoint","window","w","innerWidth","useBreakpoint","bp","setBp","useState","useEffect","subscribe","fn","addEventListener","forEach","l","add","delete","JUSTIFY_MAP","start","end","center","ALIGN_MAP","top","middle","bottom","stretch","Row","gutter","justify","align","wrap","children","className","hGutter","vGutter","Array","isArray","bpOrder","i","indexOf","length","val","undefined","resolveGutter","rowStyle","marginLeft","marginRight","rowGap","justifyContent","alignItems","flexWrap","classes","filter","Boolean","join","_jsx","Provider","value","resolveColSize","size","span","BP_ORDER","Col","offset","order","flex","xs","sm","md","lg","xl","xxl","useContext","bpProps","resolvedSpan","resolvedOffset","resolvedOrder","s","colStyle","paddingLeft","paddingRight","width","normalizeName","name","String","storeRegistry","WeakMap","EMAIL_RE","URL_RE","async","runRule","rule","validator","isEmpty","required","message","str","whitespace","trim","test","len","min","max","pattern","enum","includes","err","FormStore","constructor","this","values","publicInstance","initialValues","errors","meta","fieldListeners","Map","listPrefixes","callbacks","setCallbacks","cbs","setInitialValues","vals","init","notify","get","registerField","rules","initialValue","touched","unregisterField","subscribeField","listener","has","set","getFieldValue","registerList","prefix","unregisterList","unflatten","flat","result","key","Object","entries","listPrefix","find","p","startsWith","rest","slice","dot","idx","parseInt","sub","isNaN","getFieldsValue","names","reduce","acc","n","setFieldValue","prev","onValuesChange","setFieldsValue","changed","k","v","keys","resetFields","getFieldError","getFieldsError","map","isFieldTouched","validateField","m","getPublicInstance","resolvedRules","r","errs","push","validateRules","validateFields","Promise","all","errorFields","f","submit","then","onFinish","catch","info","onFinishFailed","listRemove","index","prefixDot","allKeys","byIndex","indices","Number","sort","a","b","maxIndex","from","to","listAdd","instance","nameList","fields","getInternalHooks","bind","FormContext","store","layout","labelCol","wrapperCol","colon","requiredMark","validateTrigger","iconMap","_jsxs","height","viewBox","display","cx","cy","fill","d","stroke","strokeWidth","strokeLinecap","eye","strokeLinejoin","x1","y1","x2","y2","check","points","x","calendar","y","rx","ry","warn","spin","strokeDasharray","spinner","plus","refresh","upload","file","trash","clock","Icon","render","Input","React","forwardRef","suffix","disabled","clearable","showCount","defaultValue","onChange","onBlur","maxLength","localValue","setLocalValue","mounted","useRef","current","showPass","setShowPass","displayValue","hasValue","isPassword","inputType","handleChange","useCallback","e","target","handleBlur","trimmed","currentTarget","showClear","showEye","hasActions","charCount","wrapperCls","onMouseDown","preventDefault","stopPropagation","title","displayName","numToStr","precision","formatter","toFixed","InputNumber","step","placeholder","parser","numValue","inputStr","setInputStr","focused","setFocused","stepTimerRef","next","parseInput","parseFloat","commit","raw","applyPrecision","clamp","latestRef","doStep","dir","num","parse","c","startRepeat","setInterval","stopRepeat","clearInterval","isUpDisabled","Infinity","isDownDisabled","inputMode","onFocus","onKeyDown","onMouseUp","onMouseLeave","Textarea","autoSize","currentValue","innerRef","textareaRef","adjustHeight","el","scrollHeight","handleClear","nativeInput","syntheticEvent","create","defineProperty","hasClear","onClick","Layer","open","triggerRef","matchWidth","zIndex","onClickOutside","onEscape","posRef","left","layerRef","onClickOutsideRef","onEscapeRef","applyPosDOMRef","rect","getBoundingClientRect","handleMouseDown","contains","handleKeyDown","handleScroll","capture","passive","ro","ResizeObserver","observe","removeEventListener","disconnect","ReactDOM","createPortal","body","highlightText","text","query","escaped","replace","split","RegExp","part","toLowerCase","VirtualOptionList","options","selectedValues","searchable","search","onSelect","scrollTop","setScrollTop","containerRef","totalHeight","startIdx","Math","floor","endIdx","ceil","visibleOptions","onScroll","position","transform","opt","selected","label","Select","multiple","maxTagCount","setOpen","setSearch","inlineInputRef","filteredOptions","o","getLabel","handleOpen","setTimeout","focus","triggerCls","role","_Fragment","arr","handleRemoveTag","transition","optValue","optDisabled","Switch","checked","defaultChecked","checkedChildren","uncheckedChildren","localChecked","setLocalChecked","currentChecked","hasLabel","cls","GroupCtx","Checkbox","indeterminate","group","inputRef","inGroup","local","setLocal","mountedRef","isDisabled","toggle","showIndeterminate","Group","groupValue","Radio","select","Slider","marks","range","localSingle","setLocalSingle","localRange","setLocalRange","dv","getRange","trackRef","draggingThumb","valueToPos","pct","posToValue","clientX","round","snapToStep","thumbIdx","onMove","ev","lo","hi","onUp","handleTouchStart","touches","onEnd","handleRailClick","abs","singleVal","trackLeft","trackWidth","onTouchStart","tabIndex","mv","Rate","count","allowHalf","allowClear","character","hoverValue","setHoverValue","resolveValue","_","status","getStarStatus","onMouseMove","handleMouseMove","handleClick","toDate","Date","getTime","fmt","date","format","getFullYear","getMonth","padStart","getDate","isSameDay","isSameMonth","isSameYear","rangeOrder","WEEKDAYS","MONTHS_LABEL","DatePicker","picker","resolvedFmt","defaultFmt","resolvedPlaceholder","initialView","rv","getSingle","panelView","setPanelView","viewYear","setViewYear","viewMonth","setViewMonth","pendingStart","setPendingStart","hoverDate","setHoverDate","today","minDate","maxDate","isDisabledDate","t","setHours","mn","mx","commitSingle","commitRange","prevMonth","nextMonth","prevYear","nextYear","decadeStart","prevDecade","nextDecade","currentSingle","rangeS","rangeE","displayRangeS","displayRangeE","orderedS","orderedE","displayText","sStr","eStr","startText","endText","startActive","endActive","panel","daysInMonth","firstDay","getDay","cells","rS","rE","loDate","hiDate","day","dis","isToday","isSel","isPending","isStart","isEnd","inRng","dayInRange","handleDaySelect","onMouseEnter","renderDayView","isCurrent","dm","lm","hm","monthInRange","month","handleMonthSelect","renderMonthView","year","yearInRange","handleYearSelect","renderYearView","ScrollColumn","disabledValues","disabledSet","scrollTo","smooth","behavior","useLayoutEffect","ITEM_H","AmPmColumn","buildStepValues","total","parseTimeInput","hour","getHours","minute","getMinutes","second","getSeconds","match","ampm","formatTimeValue","tv","displayH","pad","timeValueToDate","resolveFormat","use12Hours","TimePanel","hourStep","minuteStep","secondStep","disabledHours","disabledMinutes","disabledSeconds","onConfirm","showHour","showMinute","showSecond","use12","parseFormat","hours12","hours24","minutes","seconds","dHours","dMinutes","dSeconds","display12H","h","base","actual","RangePicker","controlledValue","fmtProp","controlledRef","isControlled","initStart","initEnd","internalStart","setInternalStart","internalEnd","setInternalEnd","activePanel","setActivePanel","panelValue","setPanelValue","startVal","endVal","handleConfirm","newStart","newEnd","TimePicker","assign","initVal","internalValue","setInternalValue","StatusBadge","cfg","success","icon","error","warning","lineHeights","LineProgress","showInfo","infoNode","hasBadge","LineInnerProgress","textOutside","CircleProgress","radius","circumference","PI","gapDegree","arcLen","fillLen","emptyLen","rotate","strokeDashoffset","transformOrigin","Progress","percent","resolvedStatus","defaultInfo","genUid","now","random","toString","isImageType","defaultRequest","action","filename","headers","data","method","onProgress","onSuccess","onError","xhr","XMLHttpRequest","formData","FormData","append","loaded","JSON","responseText","Error","setRequestHeader","send","statusCls","CardItem","showPreviewIcon","showRemoveIcon","onRemove","onPreview","isImage","thumbSrc","thumbUrl","url","src","alt","ListItem","listType","isPicture","href","rel","FileItem","props","UploadBase","accept","showUploadList","drag","inputId","useId","dragging","setDragging","fileList","handleFiles","handleRemove","beforeUpload","customRequest","defaultFileList","controlledFileList","maxCount","internalList","setInternalList","updateList","updater","updateFile","id","patch","uid","updated","files","validFiles","newItems","picked","File","actualFile","URL","createObjectURL","originFileObj","item","doUpload","resolvedAction","response","useUpload","showList","triggerSelect","click","onDragOver","onDragLeave","onDrop","dataTransfer","isCard","reachedMax","defaultBtn","sharedItemProps","Dragger","Upload","getAllLeafKeys","node","flatMap","getCheckState","checkedSet","leaves","TreeCheckbox","checkState","TreeNode","depth","expandedSet","selectedSet","checkable","selectable","line","onToggleExpand","onToggleSelect","onToggleCheck","hasChildren","isExpanded","isSelected","contentCls","disableCheckbox","child","Tree","defaultExpandAll","expandedKeys","defaultExpandedKeys","onExpand","selectedKeys","defaultSelectedKeys","checkedKeys","defaultCheckedKeys","onCheck","initialExpanded","useMemo","traverse","nodes","collectAllParentKeys","internalExpanded","setInternalExpanded","currentExpanded","internalSelected","setInternalSelected","currentSelected","internalChecked","setInternalChecked","handleToggleExpand","handleToggleSelect","handleToggleCheck","leafKeys","toAdd","TreeSelect","searchInputRef","labelMap","buildLabelMap","filteredData","q","selfMatch","filteredChildren","filterTree","searchExpandedKeys","hasMatch","childMatch","getSearchExpandedKeys","overflowCount","added","findPath","walk","opts","pop","pathEqual","every","getAllLeafPaths","Cascader","separator","activePath","setActivePath","selectedPaths","getPathLabel","path","columns","active","nextPaths","renderTriggerContent","col","colIdx","isLeaf","isActive","some","leafPaths","checkedCount","lp","sp","isSingleSelected","newPath","handleRowClick","currentPaths","cp","missing","handleCheckboxToggle","Pagination","controlledPage","defaultCurrent","pageSize","controlledPageSize","defaultPageSize","pageSizeOptions","showSizeChanger","showQuickJumper","showTotal","isPageControlled","isSizeControlled","internalPage","setInternalPage","internalPageSize","setInternalPageSize","jumpValue","setJumpValue","page","pageCount","go","nextPage","nextPageSize","clamped","rangeStart","rangeEnd","items","winL","winR","getPageItems","selectSize","sizeOptions","nextSize","newPageCount","minWidth","getRowKey","record","rowKey","getCellValue","dataIndex","obj","ROW_HEIGHT","TableRadio","TableCheckbox","EmptyState","content","LoadingOverlay","calcPos","triggerEl","MenuPanel","pos","menuRef","menuItem","danger","Dropdown","trigger","openProp","defaultOpen","onOpenChange","internalOpen","setInternalOpen","hoverTimerRef","mousePosRef","setPos","clearHoverTimer","clearTimeout","scheduleClose","update","triggerProps","onContextMenu","clientY","cloneElement","Button","variant","loading","Modal","onClose","footer","closable","mask","setMounted","visible","setVisible","requestAnimationFrame","onKey","maskHidden","blur","typeIconMap","StaticModalInner","okText","cancelText","isConfirm","onOk","onUnmount","okLoading","setOkLoading","cancelLoading","setCancelLoading","close","cb","setLoading","handleClose","handleOk","titleNode","mountModal","container","root","createRoot","unmount","remove","createTypeMethod","RowOperationCell","menus","loadingIdx","setLoadingIdx","api","visibleMenus","inlineMenus","overflowMenus","menu","doAction","confirm","overflowDropdownItems","realIdx","Fragment","verticalAlign","Toolbar","tools","onRefresh","toolbarApi","btnSize","tool","gap","flattenTree","childrenKey","getKeyFn","ExpandIcon","expanded","Table","dataSource","bordered","striped","scroll","empty","rowSelection","virtual","pagination","rowOperations","summary","childrenColumnName","expandedRowKeys","defaultExpandedRowKeys","indentSize","hasFixed","fixed","right","lastLeftKey","firstRightKey","leftCols","rightCols","reverse","computeStickyOffsets","hasRowOps","paginationEnabled","isPaginationPageControlled","isPaginationSizeControlled","internalPaginationPage","setInternalPaginationPage","internalPaginationSize","setInternalPaginationSize","paginationPage","paginationPageSize","pagedDataSource","isTreeMode","isExpandControlled","internalExpandedKeys","setInternalExpandedKeys","activeExpandedKeys","allFlatRows","virtualEnabled","estRowHeight","viewportHeight","pingLeft","setPingLeft","pingRight","setPingRight","scrollLeft","scrollWidth","clientWidth","totalCount","topSpacerHeight","bottomSpacerHeight","visibleFlatRows","selectedRowKeys","internalKeys","setInternalKeys","enabledRowKeys","getCheckboxProps","allSelected","someSelected","fireChange","nextKeys","nextRows","toggleAll","toggleRow","containerStyle","overflowX","overflowY","maxHeight","tableStyle","getCellStyle","textAlign","getColCls","totalCols","isRadio","hasGroup","headerSegments","segments","cols","buildHeaderSegments","groupedLeafCols","showToolbar","rowSpan","seg","colSpan","padding","border","rowIndex","cellContent","flexShrink","keyStr","toggleExpand","row","rowIdx","cell","cellIdx","show","ok","cancel","IconPlus","IconX","FormList","addText","ctx","counterRef","setKeys","internalHooks","isRequired","__","fontSize","color","userSelect","FormItem","hideMessage","marginBottom","borderRadius","background","cursor","borderColor","COMPONENT_MAP","CheckboxGroup","RadioGroup","TimeRangePicker","TYPE_VALUE_PROP","AUTO_REQUIRED_RULE","colonProp","labelColProp","wrapperColProp","validateTriggerProp","valuePropName","valuePropNameProp","getValueFromEvent","help","extra","noStyle","effect","normalize","componentProps","mergeProps","ctxColon","ctxTrigger","column","resolvedLabelCol","resolvedWrapperCol","resolvedColon","resolvedTrigger","forceUpdate","useReducer","normalizedName","effectiveRules","unsubs","dep","getValue","args","rawValue","firstArg","finalValue","hasError","resolveComp","widget","extraProps","userOnChange","composedOnChange","userOnBlur","composedOnBlur","controlNode","Comp","isCustom","form","labelStyle","controlStyle","itemClasses","labelId","labelContent","htmlFor","explainContent","itemEl","useForm","storeRef","Form","initializedRef","triggers","handleSubmit","renderItem","itemProps","listName","listProps","onSubmit","Item","List","Breadcrumb","slots","keepLast","hidden","kind","isLast","slot","EllipsisSlot","ItemSlot","dropdownItems","dropdownOpen","setDropdownOpen","Alert","description","showIcon","closed","setClosed","isOverflowing","fW","fH","innerHeight","resolvePlacement","preferred","triggerRect","compute","flipped","flipPlacement","flippedPos","margin","clampToViewport","placement","calcPopoverPos","tRect","pW","pH","Popover","localOpen","setLocalOpen","isOpen","popoverRef","closeTimerRef","onOpenChangeRef","popoverEl","offsetWidth","offsetHeight","visibility","nextCls","classList","concat","handle","handler","popoverHoverProps","popoverCls","portal","SIZE_MAP","UserIcon","Avatar","shape","sizeNum","resolveSize","textRef","scale","setScale","available","textW","inlineStyle","AvatarGroup","renderMax","Children","toArray","isValidElement","Badge","showZero","hasCount","displayContent","supStyle","marginTop","supCls","Carousel","autoplay","autoplayInterval","dots","arrows","loop","defaultIndex","controlledIndex","slides","internalIndex","setInternalIndex","isPaused","setIsPaused","currentRef","goTo","nextIdx","slide","Collapse","defaultActiveKeys","activeKeys","controlledKeys","accordion","activeSet","EmptyIllustration","xmlns","gradientUnits","stopColor","Empty","image","imageStyle","showImage","imgContent","Descriptions","contentStyle","gridTemplateColumns","gridColumn","idCounter","removeItem","messageIconNames","MessageItem","duration","raf","cancelAnimationFrame","MessageContainer","setAttribute","ensureMounted","addItem","closeAll","Drawer","bodyStyle","overflow","documentElement","sizeStyle","hasSelectedDescendant","HSubMenu","selectedKey","openKeys","titleRef","popupRef","titleCls","popup","InlineSubMenu","MenuItem","collapsed","SubMenu","Menu","defaultSelectedKey","defaultOpenKeys","mode","currentOpen","handleSelect","handleOpenChange","Card","cover","collapsible","defaultCollapsed","collapsedProp","onCollapseChange","shadow","shimmer","localCollapsed","setLocalCollapsed","bodyRef","bodyHeight","setBodyHeight","hasHeader","Space","direction","flexDirection","StepIcon","Steps","globalStatus","itemStatus","resolveStatus","clickable","stepCls","Tooltip","mouseEnterDelay","mouseLeaveDelay","overlayStyle","overlayClassName","tooltipRef","enterTimerRef","leaveTimerRef","tooltipEl","tooltipHoverProps","tooltipClickProps","customStyle","tooltipCls","Tabs","activeKey","activeKeyProp","defaultActiveKey","internalActive","setInternalActive","navRef","listRef","inkStyle","setInkStyle","inkLeftStyle","setInkLeftStyle","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","updateScrollState","clientHeight","querySelector","offsetTop","offsetLeft","activeIndex","findIndex","segmentThumbStyle","amount","scrollBy","activeItem","showArrows","navItems","itemCls","rootCls","Spin","spinning","tip","ThemeContext","theme","accentColor","setTheme","setAccentColor","ACCENT_PRESETS","ThemeProvider","defaultTheme","defaultAccentColor","setThemeState","setAccentColorState","setProperty","useTheme","formatSupportCache","detectFormatSupport","mimeType","canvas","toDataURL","canvasToBlob","quality","resolve","reject","toBlob","DEFAULTS","maxWidth","targetSize","qualityStep","minQuality","preserveAlpha","compressImage","input","img","source","Image","isUrl","onload","revokeObjectURL","onerror","srcW","naturalWidth","srcH","naturalHeight","originalSize","Blob","tW","tH","maxW","maxH","calcScaledSize","targetW","targetH","getContext","drawImage","curW","curH","stepW","stepH","sCtx","imageSmoothingEnabled","imageSmoothingQuality","final","fCtx","drawToCanvas","imageData","getImageData","hasAlpha","detectAlpha","prefer","resolveOutputFormat","finalBlob","finalQuality","direct","minQ","maxQ","hiBlob","loBlob","best","mid","blob","binarySearchQuality","dataURL","reader","FileReader","readAsDataURL","compressedSize","ratio","originalDimensions","outputDimensions","uidCounter","useImageCompressor","concurrency","compressOptions","onComplete","onFileComplete","getOutputFilename","setFiles","compressing","setCompressing","propsRef","updateFiles","addFiles","rawFiles","originFile","merged","compressOne","done","errItem","runCompress","targets","queue","results","pool","shift","autoCompress","compress","idle","compressAll","removeFile","clearAll","downloadFile","ext","download","downloadAll","stats","doing","savedBytes","savedRatio","doneFiles","origTotal","compTotal","formatBytes","bytes","PreviewModal","origURL","FileCard","onDownload","thumb","cardCls","toUpperCase","ImageCompressor","showActions","showStats","previewFile","setPreviewFile","previewOrigURL","setPreviewOrigURL","openPreview","hasIdle","hasDone","formatFileSize","isImageFile","isVideoFile","useUploadManager","maxSize","autoUpload","xhrMapRef","doRequest","errorMessage","remaining","sliced","addedAt","relativePath","webkitRelativePath","last","startUpload","retryFile","abort","clear","pending","uploading","FileTypeIcon","Thumbnail","canPreview","draggable","ManagerItem","onRetry","hideRelativePath","lastIndexOf","isPreviewable","PreviewContent","controls","outline","onNavigate","leaving","setLeaving","overlayRef","previewableList","currentIndex","hasPrev","hasNext","handlePrev","handleNext","DirNode","countFiles","FileTree","tree","parts","dirName","buildTree","UploadManagerBase","hint","customOnPreview","folderInputId","fileInputRef","folderInputRef","onInputChange","handlePreview","dropZoneCls","hasUploading","allDone","relatedTarget","webkitGetAsEntry","entry","basePath","isFile","res","writable","configurable","isDirectory","createReader","readAll","readBatch","readEntries","batch","nextBase","collectFromEntries","webkitdirectory","UploadManager"],"mappings":"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","x_google_ignoreList":[0]}