@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.
- package/README.md +76 -0
- package/dist/alert/index.d.ts +14 -0
- package/dist/avatar/index.d.ts +28 -0
- package/dist/badge/index.d.ts +18 -0
- package/dist/breadcrumb/index.d.ts +18 -0
- package/dist/button/index.d.ts +11 -0
- package/dist/card/index.d.ts +25 -0
- package/dist/carousel/index.d.ts +17 -0
- package/dist/cascader/index.d.ts +25 -0
- package/dist/checkbox/index.d.ts +33 -0
- package/dist/collapse/index.d.ts +19 -0
- package/dist/datepicker/index.d.ts +26 -0
- package/dist/descriptions/index.d.ts +25 -0
- package/dist/drawer/index.d.ts +16 -0
- package/dist/dropdown/index.d.ts +29 -0
- package/dist/empty/index.d.ts +11 -0
- package/dist/form/context.d.ts +3 -0
- package/dist/form/index.d.ts +39 -0
- package/dist/form/item.d.ts +87 -0
- package/dist/form/list.d.ts +8 -0
- package/dist/form/store.d.ts +49 -0
- package/dist/form/types.d.ts +47 -0
- package/dist/grid/index.d.ts +35 -0
- package/dist/icon/index.d.ts +9 -0
- package/dist/image-compressor/engine.d.ts +55 -0
- package/dist/image-compressor/index.d.ts +5 -0
- package/dist/image-compressor/types.d.ts +44 -0
- package/dist/image-compressor/use-image-compressor.d.ts +21 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/input/index.d.ts +12 -0
- package/dist/input-number/index.d.ts +23 -0
- package/dist/layer/index.d.ts +18 -0
- package/dist/menu/index.d.ts +24 -0
- package/dist/message/index.d.ts +18 -0
- package/dist/modal/index.d.ts +42 -0
- package/dist/pagination/index.d.ts +19 -0
- package/dist/popover/index.d.ts +18 -0
- package/dist/popover/util.d.ts +28 -0
- package/dist/progress/index.d.ts +17 -0
- package/dist/radio/index.d.ts +32 -0
- package/dist/rate/index.d.ts +20 -0
- package/dist/select/index.d.ts +23 -0
- package/dist/slider/index.d.ts +19 -0
- package/dist/space/index.d.ts +11 -0
- package/dist/spin/index.d.ts +12 -0
- package/dist/steps/index.d.ts +25 -0
- package/dist/switch/index.d.ts +18 -0
- package/dist/table/checkbox.d.ts +14 -0
- package/dist/table/empty.d.ts +5 -0
- package/dist/table/index.d.ts +2 -0
- package/dist/table/row-operation-cell.d.ts +9 -0
- package/dist/table/table.d.ts +3 -0
- package/dist/table/toolbar.d.ts +12 -0
- package/dist/table/types.d.ts +84 -0
- package/dist/table/utils.d.ts +19 -0
- package/dist/tabs/index.d.ts +22 -0
- package/dist/textarea/index.d.ts +10 -0
- package/dist/theme/theme-provider.d.ts +21 -0
- package/dist/timepicker/index.d.ts +12 -0
- package/dist/timepicker/scroll-column.d.ts +13 -0
- package/dist/timepicker/types.d.ts +43 -0
- package/dist/timepicker/utils.d.ts +13 -0
- package/dist/tooltip/index.d.ts +19 -0
- package/dist/tree/index.d.ts +29 -0
- package/dist/tree-select/index.d.ts +21 -0
- package/dist/upload/file-item.d.ts +10 -0
- package/dist/upload/index.d.ts +12 -0
- package/dist/upload/types.d.ts +58 -0
- package/dist/upload/use-upload.d.ts +6 -0
- package/dist/upload/utils.d.ts +5 -0
- package/dist/upload-manager/index.d.ts +10 -0
- package/dist/upload-manager/manager-item.d.ts +10 -0
- package/dist/upload-manager/preview-modal.d.ts +10 -0
- package/dist/upload-manager/types.d.ts +80 -0
- package/dist/upload-manager/use-upload-manager.d.ts +19 -0
- package/env.d.ts +2 -0
- package/package.json +47 -0
- package/rollup.config.js +36 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.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/empty/index.tsx","../src/message/index.tsx","../src/menu/index.tsx","../src/steps/index.tsx","../src/tooltip/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","../src/badge/index.tsx","../src/card/index.tsx","../src/carousel/index.tsx","../src/collapse/index.tsx","../src/descriptions/index.tsx","../src/drawer/index.tsx","../src/space/index.tsx","../src/spin/index.tsx","../src/tabs/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 \"./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, { 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, { 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 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, { 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","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, 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, { 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 \"./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, { 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 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 \"./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, {\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"],"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","defaultStore","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","offsetY","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","active","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","textInside","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","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","maskBlur","blur","maskHidden","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","EllipsisSlot","hidden","dropdownItems","ItemSlot","isLast","dropdownOpen","setDropdownOpen","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","EmptyIllustration","xmlns","gradientUnits","stopColor","idCounter","removeItem","messageIconNames","MessageItem","duration","raf","cancelAnimationFrame","MessageContainer","setAttribute","ensureMounted","addItem","closeAll","hasSelectedDescendant","HSubMenu","selectedKey","openKeys","titleRef","popupRef","titleCls","popup","InlineSubMenu","MenuItem","collapsed","SubMenu","StepIcon","ThemeContext","theme","accentColor","setTheme","setAccentColor","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","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","findIndex","hasPrev","hasNext","handlePrev","handleNext","DirNode","countFiles","kind","FileTree","tree","parts","dirName","buildTree","UploadManagerBase","hint","customOnPreview","folderInputId","fileInputRef","folderInputRef","previewFile","setPreviewFile","onInputChange","handlePreview","dropZoneCls","hasUploading","allDone","relatedTarget","webkitGetAsEntry","entry","basePath","isFile","res","writable","configurable","isDirectory","createReader","readAll","readBatch","readEntries","batch","nextBase","collectFromEntries","webkitdirectory","UploadManager","description","showIcon","closed","setClosed","renderMax","Children","toArray","isValidElement","showZero","hasCount","displayContent","supStyle","marginTop","supCls","slots","keepLast","slot","cover","collapsible","defaultCollapsed","collapsedProp","onCollapseChange","shadow","shimmer","bodyStyle","localCollapsed","setLocalCollapsed","bodyRef","bodyHeight","setBodyHeight","hasHeader","overflow","autoplay","autoplayInterval","dots","arrows","loop","defaultIndex","controlledIndex","slides","internalIndex","setInternalIndex","isPaused","setIsPaused","currentRef","goTo","nextIdx","slide","defaultActiveKeys","activeKeys","controlledKeys","accordion","activeSet","contentStyle","gridTemplateColumns","gridColumn","documentElement","sizeStyle","image","imageStyle","showImage","imgContent","showActions","showStats","previewOrigURL","setPreviewOrigURL","openPreview","hasIdle","hasDone","rootCls","defaultSelectedKey","defaultOpenKeys","mode","currentOpen","handleSelect","handleOpenChange","direction","flexDirection","spinning","tip","globalStatus","itemStatus","resolveStatus","clickable","stepCls","activeKey","activeKeyProp","defaultActiveKey","internalActive","setInternalActive","navRef","listRef","inkStyle","setInkStyle","inkLeftStyle","setInkLeftStyle","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","updateScrollState","clientHeight","querySelector","offsetTop","offsetLeft","activeIndex","segmentThumbStyle","amount","scrollBy","activeItem","showArrows","navItems","itemCls","defaultTheme","defaultAccentColor","setThemeState","setAccentColorState","setProperty","mouseEnterDelay","mouseLeaveDelay","overlayStyle","overlayClassName","tooltipRef","enterTimerRef","leaveTimerRef","tooltipEl","tooltipHoverProps","tooltipClickProps","customStyle","tooltipCls"],"mappings":"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","x_google_ignoreList":[0]}
|