aha-components 1.4.6 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Alert/index.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/icons/index.tsx","../src/components/Pagination/index.tsx","../src/components/Checkbox/index.tsx","../src/components/Table/index.tsx","../src/components/Radio/index.tsx","../src/components/Tab/index.tsx","../src/components/Progress/index.tsx","../src/components/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/index.tsx","../src/components/Select/index.tsx","../src/components/Form/FormContext.tsx","../src/components/Form/index.tsx","../src/components/Form/FormItem.tsx","../src/components/MenuList/index.tsx","../src/components/Tooltip/index.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\n\nexport interface ThemeConfig {\n primaryColor?: string;\n}\n\nconst defaultTheme: ThemeConfig = {\n primaryColor: '#FB6011',\n};\n\nconst ThemeContext = createContext<ThemeConfig>(defaultTheme);\n\nexport interface ThemeProviderProps {\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const themeValue = useMemo(() => {\n return {\n ...defaultTheme,\n ...theme,\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={themeValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeConfig => {\n const context = useContext(ThemeContext);\n if (!context) {\n // 如果没有 Provider,返回默认主题\n return defaultTheme;\n }\n return context;\n};\n\n// 导出默认主题色,供组件内部使用\nexport const getDefaultPrimaryColor = () => defaultTheme.primaryColor!;\n\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ButtonType = 'default' | 'primary';\nexport type ButtonSize = 'small' | 'mediumSmall' | 'medium' | 'large';\n\nexport interface ButtonProps {\n /** 按钮内容 */\n children?: React.ReactNode;\n /** 按钮类型 */\n type?: ButtonType;\n /** 按钮尺寸 */\n size?: ButtonSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否加载中 */\n loading?: boolean;\n /** 点击事件 */\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** 按钮原生type */\n htmlType?: 'button' | 'submit' | 'reset';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 图标 */\n icon?: React.ReactNode;\n /** 图标位置 */\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\n// 尺寸配置:高度分别为 32、36、40、48px\nconst SIZE_CONFIG = {\n small: {\n height: '32px',\n paddingLeft: '12px',\n paddingRight: '12px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n mediumSmall: {\n height: '36px',\n paddingLeft: '14px',\n paddingRight: '14px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n medium: {\n height: '40px',\n paddingLeft: '16px',\n paddingRight: '16px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '18px',\n gap: '8px',\n },\n large: {\n height: '48px',\n paddingLeft: '20px',\n paddingRight: '20px',\n fontSize: '16px',\n lineHeight: '24px',\n iconSize: '20px',\n gap: '8px',\n },\n};\n\n// Loading 图标组件\nconst LoadingIcon: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n // 使用 React 方式注入样式,避免在模块顶层操作 DOM\n const loadingStyles = `\n @keyframes aha-button-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n\n return (\n <>\n <style>{loadingStyles}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'aha-button-spin 1s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n );\n};\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'default',\n size = 'medium',\n disabled = false,\n loading = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const sizeConfig = SIZE_CONFIG[size];\n const isDisabled = disabled || loading;\n\n // 计算按钮样式\n const getButtonStyles = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingLeft: sizeConfig.paddingLeft,\n paddingRight: sizeConfig.paddingRight,\n fontSize: sizeConfig.fontSize,\n lineHeight: sizeConfig.lineHeight,\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n borderRadius: '8px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'all 0.2s',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n ...style,\n };\n\n if (type === 'primary') {\n // Primary 按钮:使用主题色,所有状态下文字都是白色\n baseStyle.color = '#FFFFFF';\n baseStyle.backgroundColor = primaryColor;\n if (disabled) {\n // disabled状态:保持primary样式,通过降低透明度表示禁用\n baseStyle.opacity = 0.4;\n baseStyle.cursor = 'not-allowed';\n } else if (loading) {\n // loading状态:保持primary样式(主题色背景)\n baseStyle.backgroundColor = primaryColor;\n } else if (isPressed) {\n baseStyle.backgroundColor = '#EC470A'; // 按下时的深色\n } else if (isHovered) {\n baseStyle.backgroundColor = '#FD843A'; // hover时的浅色\n }\n } else {\n // Default 按钮:白色背景,灰色边框\n if (disabled) {\n // disabled状态:灰色背景,灰色文字\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#D6D3D1';\n baseStyle.border = '1px solid #E7E5E4';\n } else if (loading) {\n // loading状态:保持default样式(白色背景+边框)\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isPressed) {\n baseStyle.backgroundColor = '#F5F5F4';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isHovered) {\n // Hover 状态:浅灰色背景,边框稍微变深,增强阴影\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 2px 4px 0px rgba(12, 10, 9, 0.08)';\n } else {\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n }\n }\n\n return baseStyle;\n };\n\n // 处理点击事件\n const handleClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // 渲染图标\n const renderIcon = () => {\n if (loading) {\n // loading时,根据按钮类型确定颜色\n // primary按钮:白色图标;default按钮:黑色图标\n const iconColor = type === 'primary' ? '#FFFFFF' : '#101828';\n const iconSize = parseInt(sizeConfig.iconSize.replace('px', ''));\n return <LoadingIcon size={iconSize} color={iconColor} />;\n }\n if (icon) {\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: sizeConfig.iconSize,\n height: sizeConfig.iconSize,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n }\n return null;\n };\n\n const buttonStyle = getButtonStyles();\n\n return (\n <button\n type={htmlType}\n className={`aha-button aha-button--${type} aha-button--${size} ${isDisabled ? 'aha-button--disabled' : ''} ${loading ? 'aha-button--loading' : ''} ${className}`}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => !isDisabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n style={buttonStyle}\n {...rest}\n >\n {/* loading时,图标总是在左侧显示,忽略iconPosition */}\n {loading && renderIcon()}\n {!loading && iconPosition === 'left' && renderIcon()}\n {children && <span style={{ display: 'inline-block' }}>{children}</span>}\n {!loading && iconPosition === 'right' && renderIcon()}\n </button>\n );\n};\n\nButton.displayName = 'Button';\n\nexport default Button;\n","export const AlertIcon = {\n success: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 1.66663C5.40002 1.66663 1.66669 5.39996 1.66669 9.99996C1.66669 14.6 5.40002 18.3333 10 18.3333C14.6 18.3333 18.3334 14.6 18.3334 9.99996C18.3334 5.39996 14.6 1.66663 10 1.66663ZM13.3584 8.49997L9.46668 12.3833C9.35001 12.5083 9.19168 12.5666 9.02501 12.5666C8.86668 12.5666 8.70834 12.5083 8.58334 12.3833L6.64169 10.4417C6.40002 10.2 6.40002 9.79994 6.64169 9.55827C6.88336 9.3166 7.28335 9.3166 7.52502 9.55827L9.02501 11.0583L12.475 7.61664C12.7167 7.36664 13.1167 7.36664 13.3584 7.61664C13.6 7.8583 13.6 8.24997 13.3584 8.49997Z\"\n fill=\"#00BC7D\"\n />\n </svg>\n ),\n error: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17.1342 6.3009L13.6999 2.86666C13.4658 2.63249 13.1474 2.50085 12.8157 2.50085H7.18504C6.85337 2.50085 6.53584 2.63249 6.30084 2.86666L2.8666 6.3009C2.63243 6.53507 2.50079 6.85343 2.50079 7.1851V12.8158C2.50079 13.1475 2.63243 13.465 2.8666 13.7L6.30084 17.1342C6.53501 17.3684 6.85337 17.5 7.18504 17.5H12.8157C13.1474 17.5 13.4649 17.3684 13.6999 17.1342L17.1342 13.7C17.3683 13.4658 17.5 13.1475 17.5 12.8158V7.1851C17.5 6.85343 17.3683 6.53507 17.1342 6.3009ZM12.525 11.6417C12.7692 11.8858 12.7692 12.2817 12.525 12.5259C12.4033 12.6475 12.2433 12.7092 12.0833 12.7092C11.9233 12.7092 11.7633 12.6484 11.6416 12.5259L9.99998 10.8842L8.35834 12.5259C8.23667 12.6475 8.07665 12.7092 7.91665 12.7092C7.75665 12.7092 7.59662 12.6484 7.47496 12.5259C7.23079 12.2817 7.23079 11.8858 7.47496 11.6417L9.1166 10L7.47496 8.3584C7.23079 8.11423 7.23079 7.71837 7.47496 7.4742C7.71912 7.23004 8.11498 7.23004 8.35915 7.4742L10.0008 9.11585L11.6424 7.4742C11.8866 7.23004 12.2825 7.23004 12.5266 7.4742C12.7708 7.71837 12.7708 8.11423 12.5266 8.3584L10.885 10L12.525 11.6417Z\"\n fill=\"#FB2C36\"\n />\n </svg>\n ),\n warning: (\n <svg \n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.0057 14.2935L12.4999 3.99662C11.4333 2.00162 8.56744 2.00162 7.49995 3.99662L1.99417 14.2935C1.01583 16.1235 2.3442 18.3334 4.42337 18.3334H15.5765C17.6549 18.3334 18.9841 16.1226 18.0057 14.2935ZM9.37495 8.33337C9.37495 7.98837 9.65494 7.70837 9.99994 7.70837C10.3449 7.70837 10.6249 7.98837 10.6249 8.33337V11.6667C10.6249 12.0117 10.3449 12.2917 9.99994 12.2917C9.65494 12.2917 9.37495 12.0117 9.37495 11.6667V8.33337ZM10.0166 15C9.55663 15 9.17902 14.6267 9.17902 14.1667C9.17902 13.7067 9.54829 13.3334 10.0083 13.3334H10.0166C10.4775 13.3334 10.85 13.7067 10.85 14.1667C10.85 14.6267 10.4766 15 10.0166 15Z\"\n fill=\"#FE9A00\"\n />\n </svg>\n ),\n info: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6875 2.5H5.3125C3.4375 2.5 2.5 3.4375 2.5 5.3125V14.6875C2.5 16.5625 3.4375 17.5 5.3125 17.5H14.6875C16.5625 17.5 17.5 16.5625 17.5 14.6875V5.3125C17.5 3.4375 16.5625 2.5 14.6875 2.5ZM10.625 13.75C10.625 14.095 10.345 14.375 10 14.375C9.655 14.375 9.375 14.095 9.375 13.75V9.9408C9.375 9.5958 9.655 9.3158 10 9.3158C10.345 9.3158 10.625 9.5958 10.625 9.9408V13.75ZM10.0167 7.91667C9.55668 7.91667 9.17908 7.54333 9.17908 7.08333C9.17908 6.62333 9.54834 6.25 10.0083 6.25H10.0167C10.4775 6.25 10.85 6.62333 10.85 7.08333C10.85 7.54333 10.4767 7.91667 10.0167 7.91667Z\"\n fill=\"#2B7FFF\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"#57534D\"\n />\n </svg>\n);\n","import React, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2 relative\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div \n className=\"flex flex-col gap-1\"\n style={closeable ? { paddingRight: '2rem' } : {}}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && <div className=\"mt-3\">{action}</div>}\n </div>\n {action && !closeable && <div className=\"ml-3\">{action}</div>}\n {closeable && (\n <div\n className=\"absolute right-4 top-3 cursor-pointer\"\n onClick={handleClose}\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TagColor = 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet' | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\nexport type TagVariant = 'light' | 'fill';\nexport type TagSize = 'large' | 'small';\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color: TagColor; // 必需属性,支持预定义颜色或自定义十六进制颜色\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean; // 仅对 light 变体有效\n icon?: React.ReactElement; // 只允许 React 元素,不接受字符串\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// 颜色配置\nconst COLOR_CONFIG = {\n Green: {\n light: {\n bg: '#ECFDF5',\n text: '#006045',\n border: '#A4F4CF',\n },\n fill: {\n bg: '#00BC7D',\n text: '#FFFFFF',\n }\n },\n Red: {\n light: {\n bg: '#FEF2F2',\n text: '#9F0712',\n border: '#FFC9C9',\n },\n fill: {\n bg: '#FB2C36',\n text: '#FFFFFF',\n }\n },\n Orange: {\n light: {\n bg: '#FFF6ED',\n text: '#9B2911',\n border: '#FFD1A9',\n },\n fill: {\n bg: '#FB6011',\n text: '#FFFFFF',\n }\n },\n Cyan: {\n light: {\n bg: '#ECFEFF',\n text: '#005F78',\n border: '#A2F4FD',\n },\n fill: {\n bg: '#00B8DB',\n text: '#FFFFFF',\n }\n },\n Violet: {\n light: {\n bg: '#F5F3FF',\n text: '#5D0EC0',\n border: '#DDD6FF',\n },\n fill: {\n bg: '#8E51FF',\n text: '#FFFFFF',\n }\n },\n Pink: {\n light: {\n bg: '#FDF2F8',\n text: '#A3004C',\n border: '#FCCEE8',\n },\n fill: {\n bg: '#F6339A',\n text: '#FFFFFF',\n }\n },\n Gray: {\n light: {\n bg: '#F5F5F4',\n text: '#292524',\n border: '#E7E5E4',\n },\n fill: {\n bg: '#292524',\n text: '#FFFFFF',\n }\n },\n Yellow: {\n light: {\n bg: '#FFFBEB',\n text: '#973C00',\n border: '#FEE685',\n },\n fill: {\n bg: '#FE9A00',\n text: '#FFFFFF',\n }\n },\n Blue: {\n light: {\n bg: '#EFF6FF',\n text: '#193CB8',\n border: '#BEDBFF',\n },\n fill: {\n bg: '#2B7FFF',\n text: '#FFFFFF',\n }\n }\n};\n\n// 尺寸配置\nconst SIZE_CONFIG = {\n large: {\n padding: 'px-2 py-0.5',\n textSize: 'text-sm',\n iconSize: 'w-4 h-4',\n gap: 'gap-1',\n },\n small: {\n padding: 'px-2 py-0.5', // 与 large 相同的外层 padding\n textSize: 'text-xs',\n iconSize: 'w-3 h-3',\n gap: 'gap-0.5',\n }\n};\n\n// 获取颜色配置的函数\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的配置\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n // 如果是 Orange 颜色,使用主题色\n if (color === 'Orange' && primaryColor) {\n return {\n ...config,\n fill: {\n ...config.fill,\n bg: primaryColor,\n },\n };\n }\n return config;\n }\n \n // 如果是自定义颜色(十六进制),生成配置\n if (typeof color === 'string' && color.startsWith('#')) {\n // 将十六进制转换为 RGB 值\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n return {\n light: {\n bg: `rgba(${r}, ${g}, ${b}, 0.1)`, // 10% 透明度\n text: color,\n border: `rgba(${r}, ${g}, ${b}, 0.3)`, // 30% 透明度\n },\n fill: {\n bg: color,\n text: '#FFFFFF',\n }\n };\n }\n \n // 默认返回绿色配置\n return COLOR_CONFIG.Green;\n};\n\n// 获取图标颜色的函数\nconst getIconColor = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的图标颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#009966';\n case 'Red': return '#E7000B';\n case 'Orange': return primaryColor || '#E17100'; // 使用主题色\n case 'Blue': return '#155DFC';\n case 'Yellow': return '#EC470A';\n case 'Cyan': return '#0092B8';\n case 'Violet': return '#7F22FE';\n case 'Pink': return '#E60076';\n case 'Gray': return '#57534D';\n default: return '#009966';\n }\n }\n \n // 如果是自定义颜色,返回原色\n if (typeof color === 'string' && color.startsWith('#')) {\n return color;\n }\n \n return '#009966';\n};\n\n// 获取边框颜色的函数\nconst getOutlineColor = (color: TagColor) => {\n // 如果是预定义颜色,返回对应的边框颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#A4F4CF';\n case 'Red': return '#FFC9C9';\n case 'Orange': return '#FFD1A9';\n case 'Blue': return '#BEDBFF';\n case 'Yellow': return '#FFD1A9';\n case 'Cyan': return '#A2F4FD';\n case 'Violet': return '#DDD6FF';\n case 'Pink': return '#FCCEE8';\n case 'Gray': return '#E7E5E4';\n default: return '#A4F4CF';\n }\n }\n \n // 如果是自定义颜色,返回带透明度的颜色\n if (typeof color === 'string' && color.startsWith('#')) {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n return `rgba(${r}, ${g}, ${b}, 0.3)`; // 30% 透明度\n }\n \n return '#A4F4CF';\n};\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'large',\n stroke = false,\n icon,\n iconPosition = 'none',\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const colorConfig = getColorConfig(color, primaryColor);\n const sizeConfig = SIZE_CONFIG[size];\n \n // 构建基础样式对象\n const baseStyle: React.CSSProperties = {\n borderRadius: '0.375rem', // rounded-md\n display: 'inline-flex',\n justifyContent: 'start',\n alignItems: 'center',\n padding: '2px 8px', // px-2 py-0.5 (所有尺寸都相同)\n gap: size === 'large' ? '4px' : '2px', // gap-1 or gap-0.5\n fontWeight: 500, // font-medium\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: size === 'large' ? '1.375' : '1', // leading-snug or leading-none\n transition: 'all 0.2s',\n fontSize: size === 'large' ? '14px' : '12px', // text-sm or text-xs\n height: size === 'small' ? '20px' : '24px', // Small 尺寸 20px,Large 尺寸 24px\n };\n\n // 根据变体和颜色添加样式\n if (variant === 'light') {\n baseStyle.backgroundColor = colorConfig.light.bg;\n baseStyle.color = colorConfig.light.text;\n if (stroke) {\n // 使用 outline 样式而不是 border\n baseStyle.outline = '1px solid';\n baseStyle.outlineOffset = '-1px';\n // 根据颜色设置 outline 颜色\n baseStyle.outlineColor = getOutlineColor(color);\n }\n }\n\n // 添加点击样式\n if (onClick) {\n baseStyle.cursor = 'pointer';\n baseStyle.opacity = '1';\n }\n\n // 构建类名\n const baseClasses = [\n 'rounded-md',\n 'inline-flex',\n 'justify-start',\n 'items-center',\n sizeConfig.padding,\n sizeConfig.gap,\n 'font-medium',\n 'font-dm-sans',\n size === 'large' ? 'leading-snug' : 'leading-none',\n 'transition-colors',\n 'duration-200',\n size === 'small' ? 'h-5' : 'h-6' // Small 尺寸 20px,Large 尺寸 24px\n ].filter(Boolean); // 过滤掉空字符串\n\n // 为 fill 变体添加样式\n if (variant === 'fill') {\n baseStyle.backgroundColor = colorConfig.fill.bg;\n baseStyle.color = colorConfig.fill.text;\n }\n\n if (onClick) {\n baseClasses.push('cursor-pointer', 'hover:opacity-80');\n }\n\n if (className) {\n baseClasses.push(className);\n }\n\n const containerClasses = baseClasses.join(' ');\n\n // 渲染图标\n const renderIcon = () => {\n if (!icon) return null;\n \n // 根据颜色设置图标颜色\n const iconColor = getIconColor(color, primaryColor);\n \n // 根据尺寸设置图标大小\n const iconSize = size === 'small' ? '14px' : '16px';\n \n return (\n <div className=\"flex items-center justify-center\" style={{ width: iconSize, height: iconSize }}>\n {icon.type === 'svg' ? (\n React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: iconSize,\n height: iconSize,\n style: { fill: iconColor }\n })\n ) : (\n icon\n )}\n </div>\n );\n };\n\n // 渲染文本内容\n const renderContent = () => {\n return (\n <div className=\"px-1 flex justify-center items-center\">\n <div className={`justify-center ${sizeConfig.textSize} font-medium font-dm-sans ${size === 'large' ? 'leading-snug' : 'leading-none'}`}>\n {children}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={containerClasses}\n style={baseStyle}\n onClick={onClick}\n {...rest}\n >\n {iconPosition === 'leading' && renderIcon()}\n {renderContent()}\n {iconPosition === 'after' && renderIcon()}\n </div>\n );\n};\n\nexport default Tag;\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (\n item: number | string,\n index: number\n ): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: \"none\",\n background: isActive ? \"#FAFAF9\" : \"white\",\n backgroundColor: isActive ? \"#FAFAF9\" : \"white\",\n color: isActive ? primaryColor : \"#79716B\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 上一页\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 下一页\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n {getPageNumbers().map((item, index) => renderItem(item, index))}\n </div>\n\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )}\n\n {showSizeChanger && (\n <select\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n style={{\n padding: size === \"small\" ? \"6px 12px\" : \"8px 12px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: size === \"small\" ? \"12px\" : \"14px\",\n lineHeight: size === \"small\" ? \"18px\" : \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: \"white\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} 条/页\n </option>\n ))}\n </select>\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 跳至\n </span>\n <input\n type=\"number\"\n min=\"1\"\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onKeyPress={(e) => e.key === \"Enter\" && handleJumpTo()}\n disabled={disabled}\n style={{\n width: \"56px\",\n height: size === \"small\" ? \"28px\" : \"36px\",\n padding: \"0 8px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = primaryColor;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 页\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 确定\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n}) => {\n const { primaryColor } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const isChecked = checked || indeterminate;\n const backgroundColor = disabled\n ? '#FAFAF9'\n : isChecked\n ? primaryColor\n : 'white';\n const borderColor = disabled ? '#FAFAF9' : isChecked ? primaryColor : '#D7D3D0';\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '4px', // spacing-sm 通常是 4px\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n opacity: isChecked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n }}\n >\n {indeterminate ? (\n <MinusIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n ) : (\n <CheckIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n )}\n </div>\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"checkbox\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate;\n }}\n onChange={onChange}\n disabled={disabled}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n \n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n borderRadius: '8px',\n border: '1px solid #EAECF0',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div ref={tableRef} className={`aha-table aha-table-mobile-wrapper ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div ref={tableRef} className={`aha-table ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={bordered ? 'bordered' : ''}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n};\n\nexport default Table;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked, value },\n currentTarget: { checked: !checked, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const backgroundColor = disabled\n ? '#FAFAF9'\n : checked\n ? primaryColor\n : 'white';\n const borderColor = disabled \n ? '#FAFAF9' \n : checked \n ? primaryColor \n : '#D7D3D0';\n\n return (\n <div\n className={`aha-radio ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '50%',\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: '8px',\n height: '8px',\n minWidth: '8px',\n minHeight: '8px',\n borderRadius: '50%',\n backgroundColor: 'white',\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"radio\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n value={value}\n name={name}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '-1px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n textareaRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize]);\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n };\n\n updatePosition();\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单 */\n submit: () => Promise<any>;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFields] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFields((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n setFields((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFields((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const errorInfo = {\n values: getFieldsValue(),\n errorFields: errors,\n };\n onFinishFailed?.(errorInfo);\n throw errorInfo;\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFields((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFields((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n }), [\n fields, // fields 必须在依赖中,这样 FormItem 才能重新渲染显示错误\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n// 导出 FormItem 作为 Form.Item\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n};\nFormWithItem.Item = FormItem;\n\nexport default FormWithItem;\n\n","import React, { useContext, useEffect, useRef, useMemo } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件\n if (child.type && typeof child.type === 'object' && 'displayName' in child.type) {\n const displayName = (child.type as any).displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={itemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__spreadArray","to","from","pack","ar","l","Array","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","ThemeProvider","_a","theme","children","themeValue","useMemo","_jsx","Provider","useTheme","context","useContext","SIZE_CONFIG","small","height","paddingLeft","paddingRight","fontSize","lineHeight","iconSize","gap","mediumSmall","medium","large","LoadingIcon","size","color","_jsxs","_Fragment","width","viewBox","fill","style","animation","cx","cy","r","stroke","strokeWidth","strokeLinecap","strokeDasharray","strokeDashoffset","opacity","Button","baseStyle","_b","type","_c","_d","disabled","_e","loading","onClick","_f","htmlType","_g","className","icon","_h","iconPosition","rest","_j","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","sizeConfig","isDisabled","renderIcon","iconColor","parseInt","replace","display","alignItems","justifyContent","flexShrink","buttonStyle","position","fontWeight","fontFamily","borderRadius","border","cursor","outline","transition","userSelect","WebkitTapHighlightColor","backgroundColor","boxShadow","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","d","error","warning","info","CloseIcon","Alert","title","description","showIcon","closeable","action","onClose","visible","setVisible","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","filter","toast","getToasts","subscribe","listener","_this","add","delete","forEach","clearAll","toastManager","ToastContainer","setToasts","useEffect","currentToasts","unsubscribe","map","topLeftToasts","topRightToasts","bottomLeftToasts","bottomRightToasts","top","left","zIndex","pointerEvents","flexDirection","ToastItem","right","bottom","isVisible","setIsVisible","isExiting","setIsExiting","message","duration","showClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","overflow","transform","padding","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","Toast","ensureToastContainer","closeToast","clearAllToasts","debugToast","window","document","getElementById","toastContainerRoot","isInitializing","toastSuccess","options","toastError","toastInfo","toastQuestion","toastContainerElement","existingContainer","createElement","appendChild","createRoot","require","render","import","catch","warn","ToastProvider","mounted","setMounted","createPortal","COLOR_CONFIG","Green","light","bg","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","textSize","Tag","variant","colorConfig","config","startsWith","hex","substr","b","getColorConfig","outlineOffset","outlineColor","getOutlineColor","baseClasses","Boolean","containerClasses","join","getIconColor","React","cloneElement","CheckIcon","strokeLinejoin","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","current","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onChange","onShowSizeChange","simple","hideOnSinglePage","_m","_o","responsive","showLessItems","itemRender","_q","_r","internalCurrent","setInternalCurrent","_s","internalPageSize","setInternalPageSize","_t","jumpToPage","setJumpToPage","totalPages","ceil","undefined","handlePageChange","page","handleJumpTo","margin","marginLeft","start","end","min","flexWrap","pages","getPageNumbers","item","index","isActive","element","max","renderItem","newPageSize","Number","target","newTotalPages","newCurrent","borderColor","onKeyPress","key","onFocus","onBlur","goButton","Checkbox","checked","indeterminate","isChecked","minHeight","boxSizing","ref","el","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Table","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","_p","tableLayout","onSorterChange","onPaginationChange","onRow","expandable","rowClassName","onHeaderRow","sticky","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","_u","currentPage","setCurrentPage","_v","setPageSize","_w","draggedRowIndex","setDraggedRowIndex","_x","dragOverRowIndex","setDragOverRowIndex","_y","isMobile","setIsMobile","tableRef","useRef","headerRef","checkMobile","innerWidth","addEventListener","removeEventListener","handleSelect","selected","checkboxProps","getCheckboxProps","newSelectedRowKeys","k","selectedRows","includes","onSelect","Event","handleSelectAll","currentPageData","keys","changeRows","onSelectAll","handleSort","column","columnKey","isArray","dataIndex","newSorters","set","sorterArray","entries","find","c","field","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","_i","state_1","processedData","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","offset","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","textAlign","borderBottom","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","some","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderRows","isSelected","isExpanded","rowProps","isLastRow","Fragment","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","colSpan","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","x","sum","String","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","maxHeight","marginBottom","displayValue","paddingBottom","scrollContainerStyle","overflowX","overflowY","Radio","name","Tab","items","layout","defaultValue","controlledValue","mode","scrollable","normalizedItems","firstItem","isControlled","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","isNaN","initialValue","internalValue","setInternalValue","currentValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","updatePosition_1","underlineRef","containerRect","getBoundingClientRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","scrollIntoView","behavior","block","inline","requestAnimationFrame","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","prev","updateBackgroundSliderPosition","firstKey_2","container","scrollTimeout_2","updatePosition_2","handleScroll_2","containerStyle","scrollBehavior","scrollbarWidth","WebkitOverflowScrolling","itemKey","itemKeyType","currentValueType","whiteSpace","iconType","isReactElement","isValidElement","iconValue","badge","customElement","itemStyle","renderBackgroundStyle","Progress","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","round","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","Input","forwardRef","readOnly","prefix","suffix","allowClear","onClear","placeholder","onPressEnter","restProps","inputRef","focused","setFocused","handleClear","focus","showClear","sizeStyles","paddingTop","baseStyles","WebkitAppearance","MozAppearance","appearance","onKeyDown","autoComplete","autoCorrect","autoCapitalize","spellCheck","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","thumbSize","thumbOffset","default","thumbLeft","role","newChecked","Select","showSearch","filterOption","onDeselect","onSearch","onDropdownVisibleChange","dropdownClassName","dropdownStyle","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","internalOpen","setInternalOpen","searchValue","setSearchValue","focusedIndex","setFocusedIndex","selectRef","dropdownRef","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","opt","getFilteredOptions","toLowerCase","search","filteredOptions","rect","scrollY","scrollX","handleClickOutside","event","contains","handleKeyDown","option","focusedItem","querySelectorAll","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","val","overscrollBehavior","isFocused","FormContext","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","initialFields","touched","validating","fields","setFields","fieldsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","rules_1","rule","validator","string","number","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","errorFields","resetFields","setFieldsValue","allValues_2","submit","useImperativeHandle","contextValue","formStyle","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","content","showTooltip","setShowTooltip","tooltipRef","borderLeft","borderRight","Children","child","childProps","fieldValue_1","setFieldValue_1","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneChild","MenuList","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","skipGlobalClick","renderMenuItem","danger","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","viewportHeight","innerHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","Tooltip","trigger","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","internalVisible","setInternalVisible","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","triggerRef","timeoutRef","hideTimeoutRef","updatePosition","finalPosition","preferredPosition","candidates_1","pos","getPositionCandidates","candidate","getAutoPosition","arrowPos","tooltipAbsoluteLeft","tooltipAbsoluteTop","getArrowPosition","hideTooltip","keepTooltipVisible","tryUpdatePosition_1","tooltipContainerStyle","calculateTooltipMaxWidth","updateMaxWidth","tooltipContentStyle","wordWrap","tooltipContent","handleTriggerMouseLeave","triggerProps"],"mappings":"kRA+BO,IAAIA,EAAW,WAQlB,OAPAA,EAAWC,OAAOC,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAII,KADTL,EAAIG,UAAUF,GACOJ,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,IAE9E,OAAON,CACV,EACMH,EAASa,MAAMC,KAAMP,UAChC,EAEO,SAASQ,EAAOX,EAAGY,GACtB,IAAIb,EAAI,CAAA,EACR,IAAK,IAAIM,KAAKL,EAAOH,OAAOS,UAAUC,eAAeC,KAAKR,EAAGK,IAAMO,EAAEC,QAAQR,GAAK,IAC9EN,EAAEM,GAAKL,EAAEK,IACb,GAAS,MAALL,GAAqD,mBAAjCH,OAAOiB,sBACtB,KAAIb,EAAI,EAAb,IAAgBI,EAAIR,OAAOiB,sBAAsBd,GAAIC,EAAII,EAAED,OAAQH,IAC3DW,EAAEC,QAAQR,EAAEJ,IAAM,GAAKJ,OAAOS,UAAUS,qBAAqBP,KAAKR,EAAGK,EAAEJ,MACvEF,EAAEM,EAAEJ,IAAMD,EAAEK,EAAEJ,IAF4B,CAItD,OAAOF,CACX,CA8DO,SAASiB,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,UAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,GAAQ,CAAG,MAAOb,GAAKW,EAAOX,GAAO,CAC3F,SAASgB,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAU,CAAC,MAAOb,GAAKW,EAAOX,GAAO,CAC9F,SAASc,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,EAAE,SAAUG,GAAWA,EAAQG,EAAO,IAIhBM,KAAKP,EAAWI,EAAY,CAC9GF,GAAMN,EAAYA,EAAUX,MAAMQ,EAASC,GAAc,KAAKS,OACtE,EACA,CAEO,SAASK,EAAYf,EAASgB,GACjC,IAAsGC,EAAGC,EAAGpC,EAAxGqC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPvC,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,EAAG,EAAIwC,KAAM,GAAIC,IAAK,IAAeC,EAAI5C,OAAO6C,QAA4B,mBAAbC,SAA0BA,SAAW9C,QAAQS,WACtL,OAAOmC,EAAEd,KAAOiB,EAAK,GAAIH,EAAS,MAAIG,EAAK,GAAIH,EAAU,OAAIG,EAAK,GAAsB,mBAAXC,SAA0BJ,EAAEI,OAAOC,UAAY,WAAa,OAAOpC,IAAO,GAAG+B,EAC1J,SAASG,EAAK1C,GAAK,OAAO,SAAU6C,GAAK,OACzC,SAAcC,GACV,GAAId,EAAG,MAAM,IAAIe,UAAU,mCAC3B,KAAOR,IAAMA,EAAI,EAAGO,EAAG,KAAOZ,EAAI,IAAKA,OACnC,GAAIF,EAAI,EAAGC,IAAMpC,EAAY,EAARiD,EAAG,GAASb,EAAU,OAAIa,EAAG,GAAKb,EAAS,SAAOpC,EAAIoC,EAAU,SAAMpC,EAAES,KAAK2B,GAAI,GAAKA,EAAER,SAAW5B,EAAIA,EAAES,KAAK2B,EAAGa,EAAG,KAAKlB,KAAM,OAAO/B,EAE3J,OADIoC,EAAI,EAAGpC,IAAGiD,EAAK,CAAS,EAARA,EAAG,GAAQjD,EAAE0B,QACzBuB,EAAG,IACP,KAAK,EAAG,KAAK,EAAGjD,EAAIiD,EAAI,MACxB,KAAK,EAAc,OAAXZ,EAAEC,QAAgB,CAAEZ,MAAOuB,EAAG,GAAIlB,MAAM,GAChD,KAAK,EAAGM,EAAEC,QAASF,EAAIa,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKZ,EAAEI,IAAIU,MAAOd,EAAEG,KAAKW,MAAO,SACxC,QACI,KAAMnD,EAAIqC,EAAEG,MAAMxC,EAAIA,EAAEK,OAAS,GAAKL,EAAEA,EAAEK,OAAS,KAAkB,IAAV4C,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEZ,EAAI,EAAG,QAAW,CAC5G,GAAc,IAAVY,EAAG,MAAcjD,GAAMiD,EAAG,GAAKjD,EAAE,IAAMiD,EAAG,GAAKjD,EAAE,IAAM,CAAEqC,EAAEC,MAAQW,EAAG,GAAI,KAAQ,CACtF,GAAc,IAAVA,EAAG,IAAYZ,EAAEC,MAAQtC,EAAE,GAAI,CAAEqC,EAAEC,MAAQtC,EAAE,GAAIA,EAAIiD,EAAI,KAAQ,CACrE,GAAIjD,GAAKqC,EAAEC,MAAQtC,EAAE,GAAI,CAAEqC,EAAEC,MAAQtC,EAAE,GAAIqC,EAAEI,IAAIW,KAAKH,GAAK,KAAQ,CAC/DjD,EAAE,IAAIqC,EAAEI,IAAIU,MAChBd,EAAEG,KAAKW,MAAO,SAEtBF,EAAKf,EAAKzB,KAAKS,EAASmB,EAC3B,CAAC,MAAOxB,GAAKoC,EAAK,CAAC,EAAGpC,GAAIuB,EAAI,CAAE,CAAW,QAAED,EAAInC,EAAI,CAAI,CAC1D,GAAY,EAARiD,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAEvB,MAAOuB,EAAG,GAAKA,EAAG,QAAK,EAAQlB,MAAM,EAC7E,CAtB+CJ,CAAK,CAACxB,EAAG6C,GAAM,CAAG,CAuBtE,CA+DO,SAASK,EAAcC,EAAIC,EAAMC,GACpC,GAAIA,GAA6B,IAArBpD,UAAUC,OAAc,IAAK,IAA4BoD,EAAxBvD,EAAI,EAAGwD,EAAIH,EAAKlD,OAAYH,EAAIwD,EAAGxD,KACxEuD,GAAQvD,KAAKqD,IACRE,IAAIA,EAAKE,MAAMpD,UAAUqD,MAAMnD,KAAK8C,EAAM,EAAGrD,IAClDuD,EAAGvD,GAAKqD,EAAKrD,IAGrB,OAAOoD,EAAGO,OAAOJ,GAAME,MAAMpD,UAAUqD,MAAMnD,KAAK8C,GACtD,CA2GkD,mBAApBO,iBAAiCA,gBClU/D,IAAMC,EAA4B,CAChCC,aAAc,WAGVC,EAAeC,EAA2BH,GAOnCI,EAA8C,SAACC,OAAEC,EAAKD,EAAAC,MAAEC,EAAQF,EAAAE,SACrEC,EAAaC,EAAQ,WACzB,OACK3E,EAAAA,EAAA,CAAA,EAAAkE,GACAM,EAEP,EAAG,CAACA,IAEJ,OACEI,EAACR,EAAaS,SAAQ,CAAChD,MAAO6C,EAAUD,SACrCA,GAGP,EAEaK,EAAW,WACtB,IAAMC,EAAUC,EAAWZ,GAC3B,OAAKW,GAEIb,CAGX,ECNMe,EAAc,CAClBC,MAAO,CACLC,OAAQ,OACRC,YAAa,OACbC,aAAc,OACdC,SAAU,OACVC,WAAY,OACZC,SAAU,OACVC,IAAK,OAEPC,YAAa,CACXP,OAAQ,OACRC,YAAa,OACbC,aAAc,OACdC,SAAU,OACVC,WAAY,OACZC,SAAU,OACVC,IAAK,OAEPE,OAAQ,CACNR,OAAQ,OACRC,YAAa,OACbC,aAAc,OACdC,SAAU,OACVC,WAAY,OACZC,SAAU,OACVC,IAAK,OAEPG,MAAO,CACLT,OAAQ,OACRC,YAAa,OACbC,aAAc,OACdC,SAAU,OACVC,WAAY,OACZC,SAAU,OACVC,IAAK,QAKHI,EAAyD,SAACtB,OAAEuB,EAAIvB,EAAAuB,KAAEC,EAAKxB,EAAAwB,MAS3E,OACEC,EACEC,EAAA,CAAAxB,SAAA,CAAAG,EAAA,QAAA,CAAAH,SATkB,oIAUlBuB,EACE,MAAA,CAAAE,MAAOJ,EACPX,OAAQW,EACRK,QAAQ,YACRC,KAAK,OACLC,MAAO,CACLC,UAAW,sCACZ7B,SAAA,CAEDG,EACE,SAAA,CAAA2B,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAQX,EACRY,YAAY,IACZC,cAAc,QACdC,gBAAgB,KAChBC,iBAAiB,KACjBC,QAAQ,QAEVnC,EAAA,SAAA,CACE2B,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAQX,EACRY,YAAY,IACZC,cAAc,QACdC,gBAAgB,KAChBC,iBAAiB,YAK3B,EAEME,EAAgC,SAACzC,GACrC,IAsBQ0C,EAtBRxC,EAAQF,EAAAE,SACRyC,EAAA3C,EAAA4C,KAAAA,OAAO,IAAAD,EAAA,UAASA,EAChBE,EAAe7C,EAAAuB,KAAfA,OAAO,IAAAsB,EAAA,SAAQA,EACfC,EAAgB9C,EAAA+C,SAAhBA,OAAQ,IAAAD,GAAQA,EAChBE,EAAAhD,EAAAiD,QAAAA,OAAU,IAAAD,KACVE,EAAOlD,EAAAkD,QACPC,EAAmBnD,EAAAoD,SAAnBA,OAAQ,IAAAD,EAAG,SAAQA,EACnBE,EAAArD,EAAAsD,UAAAA,OAAY,IAAAD,EAAA,KACZvB,EAAK9B,EAAA8B,MACLyB,EAAIvD,EAAAuD,KACJC,EAAAxD,EAAAyD,aAAAA,OAAe,IAAAD,EAAA,OAAMA,EAClBE,EAAIlH,EAAAwD,EAZ8B,gHAc7B2D,EAA6BpD,IAAUX,aAAvCA,OAAY,IAAA+D,EAAG,UAASA,EAC1BC,EAA4BC,GAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACxBI,EAA4BH,GAAS,GAApCI,EAASD,EAAA,GAAEE,EAAYF,EAAA,GAExBG,EAAazD,EAAYa,GACzB6C,EAAarB,GAAYE,EAwFzBoB,EAAa,WACjB,GAAIpB,EAAS,CAGX,IAAMqB,EAAqB,YAAT1B,EAAqB,UAAY,UAC7C3B,EAAWsD,SAASJ,EAAWlD,SAASuD,QAAQ,KAAM,KAC5D,OAAOnE,EAACiB,EAAW,CAACC,KAAMN,EAAUO,MAAO8C,GAC5C,CACD,OAAIf,EAEAlD,EACE,OAAA,CAAAyB,MAAO,CACL2C,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAOwC,EAAWlD,SAClBL,OAAQuD,EAAWlD,SACnB2D,WAAY,GAGb1E,SAAAqD,IAIA,IACT,EAEMsB,GA/GEnC,KACJoC,SAAU,WACVL,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBzD,IAAKiD,EAAWjD,IAChBN,OAAQuD,EAAWvD,OACnBC,YAAasD,EAAWtD,YACxBC,aAAcqD,EAAWrD,aACzBC,SAAUoD,EAAWpD,SACrBC,WAAYmD,EAAWnD,WACvB+D,WAAY,IACZC,WAAY,sBACZC,aAAc,MACdC,OAAQ,OACRC,OAAQf,EAAa,cAAgB,UACrCgB,QAAS,OACTC,WAAY,WACZC,WAAY,OACZC,wBAAyB,eACtBzD,GAGQ,YAATc,GAEFF,EAAUlB,MAAQ,UAClBkB,EAAU8C,gBAAkB5F,EACxBmD,GAEFL,EAAUF,QAAU,GACpBE,EAAUyC,OAAS,eACVlC,EAETP,EAAU8C,gBAAkB5F,EACnBqE,EACTvB,EAAU8C,gBAAkB,UACnB1B,IACTpB,EAAU8C,gBAAkB,YAI1BzC,GAEFL,EAAU8C,gBAAkB,UAC5B9C,EAAUlB,MAAQ,UAClBkB,EAAUwC,OAAS,qBACVjC,GAETP,EAAU8C,gBAAkB,UAC5B9C,EAAUlB,MAAQ,UAClBkB,EAAUwC,OAAS,oBACnBxC,EAAU+C,UAAY,yCACbxB,GACTvB,EAAU8C,gBAAkB,UAC5B9C,EAAUlB,MAAQ,UAClBkB,EAAUwC,OAAS,oBACnBxC,EAAU+C,UAAY,yCACb3B,GAETpB,EAAU8C,gBAAkB,UAC5B9C,EAAUlB,MAAQ,UAClBkB,EAAUwC,OAAS,oBACnBxC,EAAU+C,UAAY,0CAEtB/C,EAAU8C,gBAAkB,UAC5B9C,EAAUlB,MAAQ,UAClBkB,EAAUwC,OAAS,oBACnBxC,EAAU+C,UAAY,yCAInB/C,GA0CT,OACEjB,EACE,SAAAhG,EAAA,CAAAmH,KAAMQ,EACNE,UAAW,0BAAA7D,OAA0BmD,EAAI,iBAAAnD,OAAgB8B,EAAI,KAAA9B,OAAI2E,EAAa,uBAAyB,GAAE,KAAA3E,OAAIwD,EAAU,sBAAwB,GAAE,KAAAxD,OAAI6D,GACrJP,SAAUqB,EACVlB,QA3CgB,SAACzG,GACf2H,EACF3H,EAAEiJ,iBAGJxC,SAAAA,EAAUzG,EACZ,EAsCIkJ,aAAc,WAAM,OAACvB,GAAcL,GAAa,IAChD6B,aAAc,WACZ7B,GAAa,GACbG,GAAa,EACf,EACA2B,YAAa,WAAM,OAACzB,GAAcF,GAAa,EAA5B,EACnB4B,UAAW,WAAM,OAAA5B,GAAa,IAC9BpC,MAAO+C,GACHnB,EAGH,CAAAxD,SAAA,CAAA+C,GAAWoB,KACVpB,GAA4B,SAAjBQ,GAA2BY,IACvCnE,GAAYG,EAAA,OAAA,CAAMyB,MAAO,CAAE2C,QAAS,gBAAmBvE,SAAAA,KACtD+C,GAA4B,UAAjBQ,GAA4BY,OAG/C,EAEA5B,EAAOsD,YAAc,SCzRd,IAAMC,EAAY,CACvBC,QACE5F,EAAA,MAAA,CACEiD,UAAU,gBACV3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAENhG,SAAAG,EAAA,OAAA,CACE8F,EAAE,6hBACFtE,KAAK,cAIXuE,MACE/F,EAAA,MAAA,CACEiD,UAAU,gBACV3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAENhG,SAAAG,EAAA,OAAA,CACE8F,EAAE,gjCACFtE,KAAK,cAIXwE,QACEhG,EAAA,MAAA,CACEiD,UAAU,gBACV3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAENhG,SAAAG,EAAA,OAAA,CACE8F,EAAE,2mBACFtE,KAAK,cAIXyE,KACEjG,EAAA,MAAA,CACEiD,UAAU,gBACV3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAENhG,SAAAG,EAAA,OAAA,CACE8F,EAAE,6jBACFtE,KAAK,eAMA0E,EACXlG,EAAA,MAAA,CACEiD,UAAU,gBACV3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAENhG,SAAAG,EAAA,OAAA,CACE8F,EAAE,0lBACFtE,KAAK,cCzDL2E,EAA8B,SAACxG,OACnC2C,EAAc3C,EAAAsD,UAAdA,OAAY,IAAAX,EAAA,KACZE,EAAA7C,EAAA4C,KAAAA,OAAO,IAAAC,EAAA,SACP4D,EAAKzG,EAAAyG,MACLC,EAAW1G,EAAA0G,YACX5D,EAAsB9C,EAAAuD,KAAtBA,OAAI,IAAAT,EAAGkD,EAAUpD,GAAKE,EACtBE,EAAehD,EAAA2G,SAAfA,OAAW,IAAA3D,GAAIA,EACfG,EAAiBnD,EAAA4G,UAAjBA,OAAY,IAAAzD,GAAKA,EACjB0D,EAAM7G,EAAA6G,OACN3G,EAAQF,EAAAE,SACR4G,EAAO9G,EAAA8G,QAYDzD,EAAwBQ,GAAS,GAAhCkD,EAAO1D,EAAA,GAAE2D,EAAU3D,EAAA,GAM1B,OAAK0D,EAGHtF,EACE,MAAA,CAAA6B,UAAW,GAAA7D,OApBK,qDAoBS,KAAAA,OAAI6D,GAC7BxB,MAlBe,CACjBmE,QAAS,CAAET,gBAAiB,WAC5BY,MAAO,CAAEZ,gBAAiB,WAC1Ba,QAAS,CAAEb,gBAAiB,WAC5Bc,KAAM,CAAEd,gBAAiB,YAcL5C,GAAK1C,SAAA,CAEtByG,GAAYpD,EACb9B,EACE,MAAA,CAAA6B,UAAU,sBACVxB,MAAO8E,EAAY,CAAE9F,aAAc,QAAW,GAAEZ,SAAA,CAE/CuG,GACCpG,EAAA,MAAA,CAAKiD,UAAU,uFAAsFpD,SAClGuG,IAGJC,GACCrG,EAAA,MAAA,CAAKiD,UAAU,yFACZpD,SAAAwG,IAGJxG,GACCG,EAAK,MAAA,CAAAiD,UAAU,yFACZpD,SAAAA,IAGJ2G,GAAUD,GAAavG,EAAA,MAAA,CAAKiD,UAAU,OAAMpD,SAAE2G,OAEhDA,IAAWD,GAAavG,EAAA,MAAA,CAAKiD,UAAU,OAAMpD,SAAE2G,IAC/CD,GACCvG,EACE,MAAA,CAAAiD,UAAU,wCACVJ,QAtCY,WAClB8D,GAAW,GACXF,SAAAA,GACF,EAqCS5G,SAAAqG,OAnCY,IAwCvB,ECrFaU,EAAY,CACvBhB,QACE5F,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,sCAEN7F,EACE,OAAA,CAAA8F,EAAE,sXACFtE,KAAK,cAIXuE,MACE/F,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,sCAEN7F,EACE,OAAA,CAAA8F,EAAE,0iCACFtE,KAAK,cAIXqF,SACE7G,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,sCAEN7F,EACE,OAAA,CAAA8F,EAAE,yjCACFtE,KAAK,cAIXyE,KACEjG,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,sCAEN7F,EACE,OAAA,CAAA8F,EAAE,yjCACFtE,KAAK,eAMA0E,EAAY,SAACvG,GAAE,IAAAsD,EAAStD,EAAAsD,UACnC,OACEjD,EACE,MAAA,CAAAiD,UAAW,iBAAA7D,OAAiB6D,GAC5B3B,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,eACLqE,MAAM,sCAEN7F,EACE,OAAA,CAAA8F,EAAE,0lBACFtE,KAAK,kBAIb,ECvCAsF,EAAA,WAAA,SAAAA,IACU5K,KAAM6K,OAAoB,GAC1B7K,KAAA8K,UAA6B,IAAIC,GAmC1C,CAAD,OAjCEH,EAAQhL,UAAAoL,SAAR,SAASC,GACP,IAAMC,EAAKC,KAAKC,SAASC,SAAS,IAAIpI,OAAO,GACvCqI,EAAgB,CAAEJ,KAAID,MAAKA,GAIjC,OAHAjL,KAAK6K,OAAOpI,KAAK6I,GACjBC,QAAQC,IAAI,2BAA4BN,EAAI,QAASlL,KAAK6K,OAAOnL,QACjEM,KAAKyL,kBACEP,GAGTN,EAAWhL,UAAA8L,YAAX,SAAYR,GACVlL,KAAK6K,OAAS7K,KAAK6K,OAAOc,OAAO,SAACC,GAAU,OAAAA,EAAMV,KAAOA,CAAE,GAC3DlL,KAAKyL,mBAGPb,EAAAhL,UAAAiM,UAAA,WACE,OAAAnJ,EAAA,GAAW1C,KAAK6K,QAAM,IAGxBD,EAAShL,UAAAkM,UAAT,SAAUC,GAAV,IAGCC,EAAAhM,KADC,OADAA,KAAK8K,UAAUmB,IAAIF,GACZ,WAAM,OAAAC,EAAKlB,UAAUoB,OAAOH,KAG7BnB,EAAAhL,UAAA6L,gBAAR,WACEF,QAAQC,IAAI,sBAAuBxL,KAAK8K,UAAU9F,MAClDhF,KAAK8K,UAAUqB,QAAQ,SAACJ,GAAa,OAAAA,GAAA,IAIvCnB,EAAAhL,UAAAwM,SAAA,WACEpM,KAAK6K,OAAS,GACd7K,KAAKyL,mBAERb,CAAD,IAGMyB,EAAe,IAAIzB,EAGnB0B,EAA2B,WACzB,IAAA7I,EAAsB6D,EAA0B,IAA/CuD,EAAMpH,EAAA,GAAE8I,EAAS9I,EAAA,GAExB+I,EAAU,WACRjB,QAAQC,IAAI,+BAGZ,IAAMiB,EAAgBJ,EAAaR,YACnCN,QAAQC,IAAI,sBAAuBiB,EAAc/M,QACjD6M,EAAUE,GAEV,IAAMC,EAAcL,EAAaP,UAAU,WACzC,IAAMW,EAAgBJ,EAAaR,YACnCN,QAAQC,IAAI,2BAA4BiB,EAAc/M,OAAQ,aAAc+M,EAAcE,IAAI,SAAAtN,GAAK,OAAAA,EAAE6L,EAAF,IACnGqB,EAAUE,EACZ,GACA,OAAOC,CACR,EAAE,IAGH,IAAME,EAAgB/B,EAAOc,OAC3B,SAACC,GAAU,MAAyB,aAAzBA,EAAMX,MAAM1C,QAAuB,GAE1CsE,EAAiBhC,EAAOc,OAC5B,SAACC,GAAU,MAAyB,cAAzBA,EAAMX,MAAM1C,QAAwB,GAE3CuE,EAAmBjC,EAAOc,OAC9B,SAACC,GAAU,MAAyB,gBAAzBA,EAAMX,MAAM1C,QAA0B,GAE7CwE,EAAoBlC,EAAOc,OAC/B,SAACC,GAAU,MAAyB,iBAAzBA,EAAMX,MAAM1C,QAA2B,GAGpD,OACErD,EAAAC,EAAA,CAAAxB,SAAA,CAEEG,EAAK,MAAA,CAAAyB,MAAO,CACVgD,SAAU,QACVyE,IAAK,OACLC,KAAM,OACNC,OAAQ,KACRC,cAAe,OACfjF,QAAS,OACTkF,cAAe,SACfzI,IAAK,OAEJhB,SAAAiJ,EAAcD,IAAI,SAACf,GAAU,OAC5B9H,EAACuJ,EAA6BnO,EAAA,CAAA,EAAA0M,GAAdA,EAAMV,GACvB,KAIHpH,EAAK,MAAA,CAAAyB,MAAO,CACVgD,SAAU,QACVyE,IAAK,OACLM,MAAO,OACPJ,OAAQ,KACRC,cAAe,OACfjF,QAAS,OACTkF,cAAe,SACfzI,IAAK,OAEJhB,SAAAkJ,EAAeF,IAAI,SAACf,GAAU,OAC7B9H,EAACuJ,EAA6BnO,EAAA,CAAA,EAAA0M,GAAdA,EAAMV,GACvB,KAIHpH,EAAK,MAAA,CAAAyB,MAAO,CACVgD,SAAU,QACVgF,OAAQ,OACRN,KAAM,OACNC,OAAQ,KACRC,cAAe,OACfjF,QAAS,OACTkF,cAAe,SACfzI,IAAK,OAEJhB,SAAAmJ,EAAiBH,IAAI,SAACf,GAAU,OAC/B9H,EAACuJ,EAA6BnO,EAAA,CAAA,EAAA0M,GAAdA,EAAMV,GACvB,KAIHpH,EAAK,MAAA,CAAAyB,MAAO,CACVgD,SAAU,QACVgF,OAAQ,OACRD,MAAO,OACPJ,OAAQ,KACRC,cAAe,OACfjF,QAAS,OACTkF,cAAe,SACfzI,IAAK,OAEJhB,SAAAoJ,EAAkBJ,IAAI,SAACf,GAAU,OAChC9H,EAACuJ,EAASnO,EAAA,CAAA,EAAoB0M,GAAdA,EAAMV,GADU,OAM1C,EAGMmC,EAAqC,SAAC5J,OAAEyH,EAAEzH,EAAAyH,GAAED,EAAKxH,EAAAwH,MAC/C7E,EAA4BkB,GAAS,GAApCkG,EAASpH,EAAA,GAAEqH,EAAYrH,EAAA,GACxBE,EAA4BgB,GAAS,GAApCoG,EAASpH,EAAA,GAAEqH,EAAYrH,EAAA,GAG5BsH,EASE3C,EAAK2C,QARPrH,EAQE0E,EAAK5E,KARPA,OAAO,IAAAE,EAAA,OAAMA,EACbE,EAOEwE,EAPa4C,SAAfA,OAAQ,IAAApH,EAAG,IAAIA,EACfO,EAMEiE,EANEjE,KACJsD,EAKEW,EAAKX,OAJP1D,EAIEqE,EAAK6C,UAJPA,OAAY,IAAAlH,GAAIA,EAChB2D,EAGEU,EAAKV,QAFP5D,EAEEsE,EAFKtE,QAELsE,EADYlE,UAIhB,IA0BMgH,EA1BgB,SAAC1H,GACrB,OAAQA,GACN,IAAK,UACH,MAAO,CACL2H,QAAS,UACTC,YAAavD,EAAUhB,SAE3B,IAAK,QACH,MAAO,CACLsE,QAAS,UACTC,YAAavD,EAAUb,OAE3B,IAAK,WACH,MAAO,CACLmE,QAAS,UACTC,YAAavD,EAAUC,UAG3B,QACE,MAAO,CACLqD,QAAS,UACTC,YAAavD,EAAUX,MAG/B,CAEmBmE,CAAc7H,GAGjCmG,EAAU,WACR,IAAM2B,EAAQC,WAAW,WACvBX,GAAa,EACd,EAAE,IACH,OAAO,WAAM,OAAAY,aAAaF,EAAM,CACjC,EAAE,IAGH3B,EAAU,WACR,GAAIqB,EAAW,EAAG,CAChB,IAAMS,EAAQF,WAAW,WACvBG,GACD,EAAEV,GACH,OAAO,WAAM,OAAAQ,aAAaC,EAAM,CACjC,GACA,CAACT,EAAU3C,IAEd,IAAMqD,EAAcC,EAAY,WAC9Bb,GAAa,GACbS,WAAW,WACT/B,EAAaX,YAAYR,GACzBX,SAAAA,GACD,EAAE,IACL,EAAG,CAACW,EAAIX,IAEFkE,EAAcD,EAAY,WAC9B7H,SAAAA,GACF,EAAG,CAACA,IAEJ,OACE7C,EACE,MAAA,CAAAyB,MAAO,CACL4H,cAAe,OACfuB,SAAU,QACVC,WAAY,QACZjG,aAAc,MACdQ,UAAW,0EACX0F,SAAU,SACVC,UAAWrB,IAAcE,EAAY,yBAA2B,8BAChEzH,QAASuH,IAAcE,EAAY,EAAI,EACvC5E,WAAY,qBACZP,SAAU,WACVK,OAAQjC,EAAU,UAAY,WAEhCA,QAAS8H,EAET9K,SAAAuB,EAAA,MAAA,CAAKK,MAAO,CACV2C,QAAS,OACTC,WAAY,aACZ2G,QAAS,OACT7F,gBAAiB8E,EAAWC,QAC5B/I,MAAO,SAGPtB,SAAA,CAAAG,EAAA,MAAA,CAAKyB,MAAO,CACV8C,WAAY,EACZjD,MAAO,OACPf,OAAQ,OACRqE,aAAc,MACdR,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB2G,YAAa,OAEZpL,SAAAqD,GAAQ+G,EAAWE,cAItB/I,EAAK,MAAA,CAAAK,MAAO,CACVyJ,KAAM,EACNC,SAAU,EACV1K,aAAc,QAEdZ,SAAA,CAAAG,EAAA,MAAA,CAAKyB,MAAO,CACVH,MAAO,OACPgD,eAAgB,aAChBnD,MAAO,UACPT,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZhE,WAAY,QAEXd,SAAAiK,IAIFtD,GAAUxG,SAAKyB,MAAO,CAAE2J,UAAW,QAAWvL,SAAA2G,OAIhDwD,GACChK,EACE,SAAA,CAAA6C,QAAS,SAACzG,GACRA,EAAEiP,kBACFZ,GACD,EACDhJ,MAAO,CACL8C,WAAY,EACZjD,MAAO,OACPf,OAAQ,OACRqE,aAAc,MACdR,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBU,WAAY,YACZP,SAAU,WACVyE,IAAK,OACLM,MAAO,OACPqB,WAAY,cACZhG,OAAQ,OACRC,OAAQ,UACR3D,MAAO,SAETmE,aAAc,SAAClJ,GACbA,EAAEkP,cAAc7J,MAAMoJ,WAAa,0BACrC,EACAtF,aAAc,SAACnJ,GACbA,EAAEkP,cAAc7J,MAAMoJ,WAAa,eACpChL,SAEDG,EAACkG,EAAS,CAAA,SAMtB,EAGMqF,EAA8B,SAACpE,GAGnC,OAAOnH,EAACuJ,EAAS,CAACnC,GAAG,SAASD,MAAOA,GACvC,EAGaW,EAAQ,SAACX,GAapB,OAZAM,QAAQC,IAAI,qBAAsBP,GAGlCqE,IAGAlB,WAAW,WACT,IAAMlD,EAAKmB,EAAarB,SAASC,GACjCM,QAAQC,IAAI,yBAA0BN,EACvC,EAAE,KAGIC,KAAKC,SAASC,SAAS,IAAIpI,OAAO,EAC3C,EAGasM,EAAa,SAACrE,GACzBmB,EAAaX,YAAYR,EAC3B,EAGasE,EAAiB,WAC5BnD,EAAaD,UACf,EAGaqD,EAAa,WACxBlE,QAAQC,IAAI,sBACZD,QAAQC,IAAI,QAA2B,oBAAXkE,OAAyB,MAAQ,OAC7DnE,QAAQC,IAAI,eAAoC,oBAAbmE,UACnCpE,QAAQC,IAAI,QAASmE,SAASC,eAAe,wBAC7CrE,QAAQC,IAAI,eAAgBa,EAAaR,aACzCN,QAAQC,IAAI,SAAUqE,GACtBtE,QAAQC,IAAI,WAAYsE,GACxBvE,QAAQC,IAAI,uBACd,EAGauE,EAAe,SAC1BnC,EACAoC,GAGA,OADAV,IACO1D,EAAW1M,EAAAA,EAAA,CAAA,EAAA8Q,GAAS,CAAApC,QAAOA,EAAEvH,KAAM,YAC5C,EAEa4J,EAAa,SAACrC,EAAiBoC,GAE1C,OADAV,IACO1D,EAAW1M,EAAAA,EAAA,CAAA,EAAA8Q,GAAS,CAAApC,QAAOA,EAAEvH,KAAM,UAC5C,EAEa6J,EAAY,SAACtC,EAAiBoC,GAEzC,OADAV,IACO1D,EAAW1M,EAAAA,EAAA,CAAA,EAAA8Q,GAAS,CAAApC,QAAOA,EAAEvH,KAAM,SAC5C,EAEa8J,EAAgB,SAC3BvC,EACAoC,GAGA,OADAV,IACO1D,EAAW1M,EAAAA,EAAA,CAAA,EAAA8Q,GAAS,CAAApC,QAAOA,EAAEvH,KAAM,aAC5C,EAGI+J,EAA4C,KAC5CP,EAA0B,KAC1BC,GAAiB,EAEfR,EAAuB,WAI3B,GAHA/D,QAAQC,IAAI,mBAGU,oBAAXkE,QAA8C,oBAAbC,SAM5C,GAAIG,EACFvE,QAAQC,IAAI,2BAId,GAAK4E,EAwDH7E,QAAQC,IAAI,yBAxDc,CAC1BD,QAAQC,IAAI,wBACZsE,GAAiB,EAEjB,IAEE,IAAMO,EAAoBV,SAASC,eAAe,uBAClD,GAAIS,EAIF,OAHA9E,QAAQC,IAAI,mBACZ4E,EAAwBC,OACxBP,GAAiB,GAKnBvE,QAAQC,IAAI,kBACZ4E,EAAwBT,SAASW,cAAc,QACzBpF,GAAK,sBAC3ByE,SAASpO,KAAKgP,YAAYH,GAC1B7E,QAAQC,IAAI,+BAGZD,QAAQC,IAAI,wBACZ,IAEU,IAAAgF,EAAeC,QAAQ,+BAC/BlF,QAAQC,IAAI,gCACZqE,EAAqBW,EAAWJ,GAChC7E,QAAQC,IAAI,+BACZqE,EAAmBa,OAAO5M,EAACwI,EAAc,CAAA,IACzCf,QAAQC,IAAI,iBACZsE,GAAiB,CAClB,CAAC,MAAOjG,GACP0B,QAAQC,IAAI,uBAAwB3B,GAEpC8G,OAAO,oBAAoBtP,KAAK,SAACoC,GAAE,IAAA+M,EAAU/M,EAAA+M,WAC3C,IACEjF,QAAQC,IAAI,gCACZqE,EAAqBW,EAAWJ,GAChC7E,QAAQC,IAAI,+BACZqE,EAAmBa,OAAO5M,EAACwI,EAAc,CAAA,IACzCf,QAAQC,IAAI,gBACb,CAAC,MAAO3B,GACP0B,QAAQ1B,MAAM,gBAAiBA,EAChC,CACDiG,GAAiB,CACnB,GAAGc,MAAM,SAAC/G,GACR0B,QAAQ1B,MAAM,wBAAyBA,GACvCiG,GAAiB,CACnB,EACD,CACF,CAAC,MAAOjG,GACP0B,QAAQ1B,MAAM,gBAAiBA,GAC/BiG,GAAiB,CAClB,CACF,MAjECvE,QAAQsF,KAAK,0BAoEjB,EAGaC,EAAyD,SAACrN,GACrE,IAAAE,EAAQF,EAAAE,SAEFyC,EAAwBkB,GAAS,GAAhCyJ,EAAO3K,EAAA,GAAE4K,EAAU5K,EAAA,GAM1B,OAJAoG,EAAU,WACRwE,GAAW,EACZ,EAAE,IAGD9L,EACGC,EAAA,CAAAxB,SAAA,CAAAA,EACAoN,GAAWE,EAAanN,EAACwI,EAAc,CAAA,GAAKqD,SAASpO,QAG5D,ECvfM2P,EAAe,CACnBC,MAAO,CACLC,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVC,IAAK,CACHH,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVE,OAAQ,CACNJ,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVG,KAAM,CACJL,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVI,OAAQ,CACNN,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVK,KAAM,CACJP,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVM,KAAM,CACJR,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVO,OAAQ,CACNT,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,YAGVQ,KAAM,CACJV,MAAO,CACLC,GAAI,UACJC,KAAM,UACN3I,OAAQ,WAEVrD,KAAM,CACJ+L,GAAI,UACJC,KAAM,aAMNnN,EAAc,CAClBW,MAAO,CACLgK,QAAS,cACTiD,SAAU,UACVrN,SAAU,UACVC,IAAK,SAEPP,MAAO,CACL0K,QAAS,cACTiD,SAAU,UACVrN,SAAU,UACVC,IAAK,YAuGHqN,EAA0B,SAACvO,GAC/B,IAAAE,aACAsB,UACAmB,EAAA3C,EAAAwO,QAAAA,OAAU,IAAA7L,EAAA,UACVE,EAAA7C,EAAAuB,KAAAA,OAAO,IAAAsB,EAAA,UACPC,EAAA9C,EAAAmC,OAAAA,OAAS,IAAAW,KACTS,SACAP,EAAAhD,EAAAyD,aAAAA,OAAY,IAAAT,EAAG,OAAMA,EACrBG,EAAAnD,EAAAsD,UAAAA,OAAS,IAAAH,EAAG,GAAEA,EACdD,YACGQ,EAV4BlH,EAAAwD,EAAA,CAAA,WAAA,QAAA,UAAA,OAAA,SAAA,OAAA,eAAA,YAAA,YAYvBJ,EAAiBW,iBACnBkO,EA/Ge,SAACjN,EAAiB5B,GAEvC,GAAqB,iBAAV4B,GAAsBA,KAASiM,EAAc,CACtD,IAAMiB,EAASjB,EAAajM,GAE5B,MAAc,WAAVA,GAAsB5B,EAEnBnE,EAAAA,EAAA,CAAA,EAAAiT,GACH,CAAA7M,KACKpG,EAAAA,EAAA,CAAA,EAAAiT,EAAO7M,MACV,CAAA+L,GAAIhO,MAIH8O,CACR,CAGD,GAAqB,iBAAVlN,GAAsBA,EAAMmN,WAAW,KAAM,CAEtD,IAAMC,EAAMpN,EAAMgD,QAAQ,IAAK,IACzBtC,EAAIqC,SAASqK,EAAIC,OAAO,EAAG,GAAI,IAC/BvQ,EAAIiG,SAASqK,EAAIC,OAAO,EAAG,GAAI,IAC/BC,EAAIvK,SAASqK,EAAIC,OAAO,EAAG,GAAI,IAErC,MAAO,CACLlB,MAAO,CACLC,GAAI,eAAQ1L,EAAC,MAAAzC,OAAKnB,EAAM,MAAAmB,OAAAqP,EAAS,UACjCjB,KAAMrM,EACN0D,OAAQ,eAAQhD,EAAC,MAAAzC,OAAKnB,EAAM,MAAAmB,OAAAqP,EAAS,WAEvCjN,KAAM,CACJ+L,GAAIpM,EACJqM,KAAM,WAGX,CAGD,OAAOJ,EAAaC,KACtB,CAuEsBqB,CAAevN,EAAO5B,GACpCuE,EAAazD,EAAYa,GAGzBmB,EAAiC,CACrCuC,aAAc,WACdR,QAAS,cACTE,eAAgB,QAChBD,WAAY,SACZ2G,QAAS,UACTnK,IAAc,UAATK,EAAmB,MAAQ,MAChCwD,WAAY,IACZC,WAAY,sBACZhE,WAAqB,UAATO,EAAmB,QAAU,IACzC8D,WAAY,WACZtE,SAAmB,UAATQ,EAAmB,OAAS,OACtCX,OAAiB,UAATW,EAAmB,OAAS,QAItB,UAAZiN,IACF9L,EAAU8C,gBAAkBiJ,EAAYd,MAAMC,GAC9ClL,EAAUlB,MAAQiN,EAAYd,MAAME,KAChC1L,IAEFO,EAAU0C,QAAU,YACpB1C,EAAUsM,cAAgB,OAE1BtM,EAAUuM,aAtEQ,SAACzN,GAEvB,GAAqB,iBAAVA,GAAsBA,KAASiM,EACxC,OAAQjM,GACN,IAAK,QASL,QAAS,MAAO,UARhB,IAAK,MAAO,MAAO,UACnB,IAAK,SAEL,IAAK,SAAU,MAAO,UADtB,IAAK,OAAQ,MAAO,UAEpB,IAAK,OAAQ,MAAO,UACpB,IAAK,SAAU,MAAO,UACtB,IAAK,OAAQ,MAAO,UACpB,IAAK,OAAQ,MAAO,UAMxB,GAAqB,iBAAVA,GAAsBA,EAAMmN,WAAW,KAAM,CACtD,IAAMC,EAAMpN,EAAMgD,QAAQ,IAAK,IACzBtC,EAAIqC,SAASqK,EAAIC,OAAO,EAAG,GAAI,IAC/BvQ,EAAIiG,SAASqK,EAAIC,OAAO,EAAG,GAAI,IAC/BC,EAAIvK,SAASqK,EAAIC,OAAO,EAAG,GAAI,IACrC,MAAO,QAAApP,OAAQyC,EAAM,MAAAzC,OAAAnB,eAAMwQ,EAAC,SAC7B,CAED,MAAO,SACT,CA2C+BI,CAAgB1N,KAKzC0B,IACFR,EAAUyC,OAAS,UACnBzC,EAAUF,QAAU,KAItB,IAAM2M,EAAc,CAClB,aACA,cACA,gBACA,eACAhL,EAAWkH,QACXlH,EAAWjD,IACX,cACA,eACS,UAATK,EAAmB,eAAiB,eACpC,oBACA,eACS,UAATA,EAAmB,MAAQ,OAC3B2G,OAAOkH,SAGO,SAAZZ,IACF9L,EAAU8C,gBAAkBiJ,EAAY5M,KAAK+L,GAC7ClL,EAAUlB,MAAQiN,EAAY5M,KAAKgM,MAGjC3K,GACFiM,EAAYnQ,KAAK,iBAAkB,oBAGjCsE,GACF6L,EAAYnQ,KAAKsE,GAGnB,IAAM+L,EAAmBF,EAAYG,KAAK,KAGpCjL,EAAa,WACjB,IAAKd,EAAM,OAAO,KAGlB,IAAMe,EA/IW,SAAC9C,EAAiB5B,GAErC,GAAqB,iBAAV4B,GAAsBA,KAASiM,EACxC,OAAQjM,GACN,IAAK,QASL,QAAS,MAAO,UARhB,IAAK,MAAO,MAAO,UACnB,IAAK,SAAU,OAAO5B,GAAgB,UACtC,IAAK,OAAQ,MAAO,UACpB,IAAK,SAAU,MAAO,UACtB,IAAK,OAAQ,MAAO,UACpB,IAAK,SAAU,MAAO,UACtB,IAAK,OAAQ,MAAO,UACpB,IAAK,OAAQ,MAAO,UAMxB,MAAqB,iBAAV4B,GAAsBA,EAAMmN,WAAW,KACzCnN,EAGF,SACT,CAwHsB+N,CAAa/N,EAAO5B,GAGhCqB,EAAoB,UAATM,EAAmB,OAAS,OAE7C,OACElB,EAAA,MAAA,CAAKiD,UAAU,mCAAmCxB,MAAO,CAAEH,MAAOV,EAAUL,OAAQK,GAAUf,SAC7E,QAAdqD,EAAKX,KACJ4M,EAAMC,aAAalM,EAAqD,CACtE5B,MAAOV,EACPL,OAAQK,EACRa,MAAO,CAAED,KAAMyC,KAGjB,GAIR,EAaA,OACE7C,EAAA,MAAAhG,EAAA,CACE6H,UAAW+L,EACXvN,MAAOY,EACPQ,QAASA,GACLQ,EAEH,CAAAxD,SAAA,CAAiB,YAAjBuD,GAA8BY,IAf/BhE,EAAA,MAAA,CAAKiD,UAAU,wCAAuCpD,SACpDG,EAAK,MAAA,CAAAiD,UAAW,kBAAA7D,OAAkB0E,EAAWmK,SAAqC,8BAAA7O,OAAS,UAAT8B,EAAmB,eAAiB,gBACnHrB,SAAAA,MAea,UAAjBuD,GAA4BY,OAGnC,EC/WaqL,EAGR,SAAC1P,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BzB,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAAG,EAAA,OAAA,CACE8F,EAAE,yCACFhE,OAAO,QACPC,YAAY,IACZC,cAAc,QACdsN,eAAe,WAfU,EAqBlBC,EAGR,SAAC5P,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BzB,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAAG,EAAA,OAAA,CACE8F,EAAE,cACFhE,OAAO,QACPC,YAAY,IACZC,cAAc,QACdsN,eAAe,WAfU,EAqBlBE,GAGR,SAAC7P,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BzB,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAAG,EAAA,OAAA,CACE8F,EAAE,4CACFhE,OAAO,UACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,WAfU,EAqBlBG,GAGR,SAAC9P,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BL,EAAA,MAAA,CACEE,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,YAEPzB,EACE,OAAA,CAAA8F,EAAE,uBACFhE,OAAO,UACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,UAEjBtP,EAAA,OAAA,CACE8F,EAAE,wBACFhE,OAAO,eACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,YAtBU,EA4BlBI,GAGR,SAAC/P,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BL,EAAA,MAAA,CACEE,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,YAEPzB,EACE,OAAA,CAAA8F,EAAE,wBACFhE,OAAO,UACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,UAEjBtP,EAAA,OAAA,CACE8F,EAAE,uBACFhE,OAAO,eACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,YAtBU,EA2BlBK,GAGR,SAAChQ,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BzB,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAAG,EAAA,OAAA,CACE8F,EAAE,4EACFhE,OAAO,eACPC,YAAY,UACZC,cAAc,QACdsN,eAAe,WAfU,EAoBlBM,GAGR,SAACjQ,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BzB,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAAG,EAAA,OAAA,CACE8F,EAAE,4EACFhE,OAAO,eACPC,YAAY,UACZC,cAAc,QACdsN,eAAe,WAfU,EAoBlBO,GAGR,SAAClQ,OAAEsD,EAAStD,EAAAsD,UAAExB,EAAK9B,EAAA8B,MAAO,OAC7BL,EACE,MAAA,CAAAE,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWA,EACXxB,MAAOA,EAEP5B,SAAA,CAAAG,EAAA,IAAA,CAAG8P,SAAS,+BACV9P,EACE,OAAA,CAAA8F,EAAE,kbACFhE,OAAO,eACPC,YAAY,UACZC,cAAc,QACdsN,eAAe,YAGnBtP,mBACEA,EAAU,WAAA,CAAAoH,GAAG,yBACXpH,EAAM,OAAA,CAAAsB,MAAM,KAAKf,OAAO,KAAKiB,KAAK,uBArBX,ECzJzBuO,GAAwC,SAACpQ,OACpCqQ,EAAiBrQ,EAAAsQ,QAC1B3N,EAAA3C,EAAAuQ,eAAAA,OAAiB,IAAA5N,EAAA,EAACA,EAClBE,EAAS7C,EAAAwQ,MAATA,OAAK,IAAA3N,EAAG,EAACA,EACC4N,EAAkBzQ,EAAA0Q,SAC5B5N,EAAA9C,EAAA2Q,gBAAAA,OAAkB,IAAA7N,EAAA,GAAEA,EACpBE,EAAuBhD,EAAA4Q,gBAAvBA,OAAkB,IAAA5N,GAAKA,EACvBG,EAA2CnD,EAAA6Q,gBAA3CA,OAAe,IAAA1N,EAAG,CAAC,KAAM,KAAM,KAAM,OAAMA,EAC3CE,EAAuBrD,EAAA8Q,gBAAvBA,OAAe,IAAAzN,GAAQA,EACvB0N,EAAS/Q,EAAA+Q,UACTC,EAAQhR,EAAAgR,SACRC,EAAgBjR,EAAAiR,iBAChBzN,EAAAxD,EAAAkR,OAAAA,OAAS,IAAA1N,GAAKA,EACdG,EAAgB3D,EAAA+C,SAAhBA,OAAW,IAAAY,GAAKA,EAChBC,EAAwB5D,EAAAmR,iBAAxBA,OAAgB,IAAAvN,GAAQA,EACxBI,EAAAhE,EAAAsD,UAAAA,aAAY,GAAEU,EACdlC,EAAK9B,EAAA8B,MACLsP,EAAgBpR,EAAAuB,KAAhBA,OAAI,IAAA6P,EAAG,UAASA,EAChBC,EAAArR,EAAAsR,WAAAA,OAAa,IAAAD,GAAKA,EACGrR,EAAAuR,cACrB,IAAAC,EAAUxR,EAAAwR,WAEFC,EAA6BlR,IAAUX,aAAvCA,OAAY,IAAA6R,EAAG,UAASA,EAC1BC,EAAwC7N,EAAS0M,GAAhDoB,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GACpCG,EAA0ChO,EAAS8M,GAAlDmB,EAAgBD,EAAA,GAAEE,EAAmBF,EAAA,GACtCG,EAA8BnO,EAAS,IAAtCoO,EAAUD,EAAA,GAAEE,EAAaF,EAAA,GAE1B1B,EAAUD,QAAAA,EAAqBsB,EAC/BjB,EAAWD,QAAAA,EAAsBqB,EAEjCK,EAAa/R,EACjB,WAAM,OAAAsH,KAAK0K,KAAK5B,EAAQE,EAAS,EACjC,CAACF,EAAOE,IAGV3H,EAAU,gBACkBsJ,IAAtBhC,GACFuB,EAAmBvB,EAEvB,EAAG,CAACA,IAEJtH,EAAU,gBACmBsJ,IAAvB5B,GACFsB,EAAoBtB,EAExB,EAAG,CAACA,IAEJ,IAAM6B,GAAmB,SAACC,GACpBA,EAAO,GAAKA,EAAOJ,GAAcI,IAASjC,GAAWvN,SAE/BsP,IAAtBhC,GACFuB,EAAmBW,GAErBvB,SAAAA,EAAWuB,EAAM7B,GACnB,EAiBM8B,GAAe,WACnB,IAAMD,EAAOhO,SAAS0N,EAAY,IAC9BM,GAAQ,GAAKA,GAAQJ,IACvBG,GAAiBC,GACjBL,EAAc,IAElB,EA6HA,GAAIf,GAAoBgB,GAAc,EACpC,OAAO,KAGT,GAAIjB,EACF,OACEzP,EACE,MAAA,CAAA6B,UAAW,wCAAA7D,OAAwC6D,GACnDxB,MAAOA,EAAK5B,SAAA,CAEZG,EAACoC,EAAM,CACLS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAA3B,EACfvN,SAAUA,GAAwB,IAAZuN,EACtB1N,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLwJ,YAAa,MACbpG,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAIT/E,SAAA,QACTuB,EACE,OAAA,CAAAK,MAAO,CACL2Q,OAAQ,QACR1R,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,uBAGb9E,SAAA,CAAAoQ,QAAY6B,KAEf9R,EAACoC,EACC,CAAAS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAAE,EAC5CvN,SAAUA,GAAYuN,IAAY6B,EAClCvP,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACL4Q,WAAY,MACZxN,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAIT/E,SAAA,WAKf,IAAMyS,IAASrC,EAAU,GAAKI,EAAW,EACnCkC,GAAMlL,KAAKmL,IAAIvC,EAAUI,EAAUF,GAEzC,OACE/O,EAAA,MAAA,CACE6B,UAAW,yBAAyB7D,OAAA6D,GACpCxB,MAAKrG,EAAA,CACHgJ,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBmO,SAAUxB,EAAa,OAAS,SAChCtM,WAAY,uBACTlD,GAGJ5B,SAAA,CAAA6Q,GACC1Q,EAAK,MAAA,CAAAiD,UAAU,wFAAuFpD,SACnG6Q,EAAUP,EAAO,CAACmC,GAAOC,OAI9BnR,EAAA,MAAA,CACEK,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZxD,IAAK,QAGNhB,SAAA,CAAAsR,EACCA,EACElB,EAAU,EACV,OACAjQ,EAACoC,EAAM,CACLS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAAE,EAC5CvN,SAAUA,GAAwB,IAAZuN,EACtB1N,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLlB,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACTnK,IAAK,MACLgE,OAAQ,oBACRO,UAAW,OACXR,aAAc,OACf/E,SAEDuB,EAAK,MAAA,CAAA6B,UAAU,0BACbpD,SAAA,CAAAG,EAAC2P,GAAa,CAAA,GAAI,IAAA3P,EAAA,OAAA,CAAAH,SAAA,mBAKxBG,EAACoC,EACC,CAAAS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAAE,EAC5CvN,SAAUA,GAAwB,IAAZuN,EACtB1N,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLlB,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACTnK,IAAK,MACLgE,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAGhB/E,SAAAuB,EAAA,MAAA,CAAK6B,UAAU,0BAAyBpD,SAAA,CACtCG,EAAC2P,GAAa,CAAA,GAAI,IAAA3P,EAAA,OAAA,CAAAH,SAAA,kBAKxBG,EAAA,MAAA,CAAKyB,MAAO,CAAE2C,QAAS,OAAQC,WAAY,SAAUxD,IAAK,GAAGhB,SAxP5C,WACrB,GAAIiS,GAAc,EAChB,OAAO5S,MAAMJ,KAAK,CAAElD,OAAQkW,GAAc,SAAClU,EAAGnC,GAAM,OAAAA,EAAI,CAAC,GAG3D,IAAMiX,EAA6B,GAEnC,GAAIzC,GAAW,EAAG,CAChB,IAAK,IAAIxU,EAAI,EAAGA,GAAK,EAAGA,IACtBiX,EAAM/T,KAAKlD,GAEbiX,EAAM/T,KAAK,aACX+T,EAAM/T,KAAKmT,EACZ,MAAM,GAAI7B,GAAW6B,EAAa,EAAG,CACpCY,EAAM/T,KAAK,GACX+T,EAAM/T,KAAK,aACX,IAASlD,EAAIqW,EAAa,EAAGrW,GAAKqW,EAAYrW,IAC5CiX,EAAM/T,KAAKlD,EAEd,KAAM,CACLiX,EAAM/T,KAAK,GACX+T,EAAM/T,KAAK,aACX,IAASlD,EAAIwU,EAAU,EAAGxU,GAAKwU,EAAU,EAAGxU,IAC1CiX,EAAM/T,KAAKlD,GAEbiX,EAAM/T,KAAK,aACX+T,EAAM/T,KAAKmT,EACZ,CAED,OAAOY,CACT,CA2NSC,GAAiB9J,IAAI,SAAC+J,EAAMC,GAAU,OAzN5B,SACjBD,GAGA,GAAoB,iBAATA,EAAmB,CAC5B,IAAME,EAAWF,IAAS3C,EACpB8C,EACJ/S,EAACoC,EAAM,CAELS,QAAS,WAAM,OAAAoP,GAAiBW,IAChClQ,SAAUA,EACVH,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACL0J,SAAmB,UAATjK,EAAmB,OAAS,OACtCX,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACToH,OAAQ,EACR1N,WAAYoO,EAAW,IAAM,IAC7BjO,OAAQ,OACRgG,WAAYiI,EAAW,UAAY,QACnC3N,gBAAiB2N,EAAW,UAAY,QACxC3R,MAAO2R,EAAWvT,EAAe,UACjC6F,UAAW,OACXR,aAAc,OACf/E,SAEA+S,GAnBIA,GAuBT,OAAOzB,EAAaA,EAAWyB,EAAM,OAAQG,GAAWA,CACzD,CAED,GAAa,cAATH,EAsBF,OArBMG,EACJ/S,EAACoC,EAEC,CAAAS,QAAS,WAAM,OAAAoP,GAAiB5K,KAAK2L,IAAI,EAAG/C,EAAU,KACtDvN,SAAUA,EACVH,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACL0J,SAAmB,UAATjK,EAAmB,OAAS,OACtCX,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACToH,OAAQ,EACRvN,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAZZ/E,SAAA,OAAA,aAmBDsR,EACHA,EAAWlB,EAAU,EAAG,YAAa8C,GACrCA,EAGN,GAAa,cAATH,EAsBF,OArBMG,EACJ/S,EAACoC,EAEC,CAAAS,QAAS,WAAM,OAAAoP,GAAiB5K,KAAKmL,IAAIV,EAAY7B,EAAU,KAC/DvN,SAAUA,EACVH,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACL0J,SAAmB,UAATjK,EAAmB,OAAS,OACtCX,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACToH,OAAQ,EACRvN,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAZZ/E,SAAA,OAAA,aAmBDsR,EACHA,EAAWlB,EAAU,EAAG,YAAa8C,GACrCA,EAGN,OAAO,IACT,CAgI+CE,CAAWL,EAAY,KAG/DzB,EACCA,EACElB,EAAU,EACV,OACAjQ,EAACoC,GACCS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAAE,EAC5CvN,SAAUA,GAAYuN,IAAY6B,EAClCvP,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLlB,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACTnK,IAAK,MACLgE,OAAQ,oBACRO,UAAW,OACXR,aAAc,OACf/E,SAEDuB,EAAK,MAAA,CAAA6B,UAAU,0BACbpD,SAAA,CAAAG,EAAA,OAAA,CAAAH,SAAA,SAAkB,IAAAG,EAAC4P,GAAc,UAKvC5P,EAACoC,EACC,CAAAS,QAAS,WAAM,OAAAoP,GAAiBhC,EAAU,EAAE,EAC5CvN,SAAUA,GAAYuN,IAAY6B,EAClCvP,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLlB,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,SACTnK,IAAK,MACLgE,OAAQ,oBACRO,UAAW,OACXR,aAAc,OAGhB/E,SAAAuB,EAAA,MAAA,CAAK6B,UAAU,oCACbjD,EAAiB,OAAA,CAAAH,SAAA,SAAA,IAACG,EAAC4P,GAAc,CAAA,QAKtCW,GACCvQ,EACE,SAAA,CAAA/C,MAAOoT,EACPM,SAAU,SAACvU,GAAM,OAlUG8W,EAkUkBC,OAAO/W,EAAEgX,OAAOnW,OAjUxDoW,EAAgBhM,KAAK0K,KAAK5B,EAAQ+C,GAClCI,EAAarD,EAAUoD,EAAgBA,EAAgBpD,OAElC+B,IAAvB5B,GACFsB,EAAoBwB,QAEIlB,IAAtBhC,GACFuB,EAAmB+B,GAGrB1C,SAAAA,EAAmB0C,EAAYJ,QAC/BvC,SAAAA,EAAW2C,EAAYJ,IAZI,IAACA,EACtBG,EACAC,GAiUE5Q,SAAUA,EACVjB,MAAO,CACLuJ,QAAkB,UAAT9J,EAAmB,WAAa,WACzC2D,OAAQ,oBACRD,aAAc,MACdlE,SAAmB,UAATQ,EAAmB,OAAS,OACtCP,WAAqB,UAATO,EAAmB,OAAS,OACxCC,MAAO,UACPwD,WAAY,sBACZG,OAAQpC,EAAW,cAAgB,UACnCyC,gBAAiB,QACjBJ,QAAS,OACTC,WAAY,YAEdM,aAAc,SAAClJ,GACRsG,IACHtG,EAAEkP,cAAc7J,MAAM8R,YAAchU,EAExC,EACAgG,aAAc,SAACnJ,GACbA,EAAEkP,cAAc7J,MAAM8R,YAAc,SACrC,EAEA1T,SAAA2Q,EAAgB3H,IAAI,SAAC3H,GAAS,OAC7BE,EAAmB,SAAA,CAAAnE,MAAOiE,EAAIrB,SAAA,CAC3BqB,EAAI,SADMA,EAGd,KAIJuP,GACCrP,EAAA,MAAA,CACEK,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZxD,IAAK,MACL8D,WAAY,uBAGd9E,SAAA,CAAAG,EAAA,OAAA,CACEyB,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAO,WAIJtB,SAAA,OACPG,EACE,QAAA,CAAAuC,KAAK,SACLiQ,IAAI,IACJvV,MAAO2U,EACPjB,SAAU,SAACvU,GAAM,OAAAyV,EAAczV,EAAEgX,OAAOnW,MAAM,EAC9CuW,WAAY,SAACpX,GAAM,MAAU,UAAVA,EAAEqX,KAAmBtB,IAAc,EACtDzP,SAAUA,EACVjB,MAAO,CACLH,MAAO,OACPf,OAAiB,UAATW,EAAmB,OAAS,OACpC8J,QAAS,QACTnG,OAAQ,oBACRD,aAAc,MACdlE,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZI,QAAS,OACTC,WAAY,YAEd0O,QAAS,SAACtX,GACRA,EAAEkP,cAAc7J,MAAM8R,YAAchU,CACtC,EACAoU,OAAQ,SAACvX,GACPA,EAAEkP,cAAc7J,MAAM8R,YAAc,SACrC,IAEHvT,EACE,OAAA,CAAAyB,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAO,WACRtB,SAAA,MAIyB,iBAApB4Q,GAAgCA,EAAgBmD,SACtD5T,EAACoC,GACCS,QAASsP,GACTzP,SAAUA,EACVH,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLoD,OAAQ,oBACRO,UAAW,OACXR,aAAc,OACf/E,SAEA4Q,EAAgBmD,WAGnB5T,EAACoC,EACC,CAAAS,QAASsP,GACTzP,SAAUA,EACVH,KAAK,UACLrB,KAAe,YAATA,EAAqB,SAAW,QACtCO,MAAO,CACLoD,OAAQ,oBACRO,UAAW,OACXR,aAAc,OACf/E,SAAA,eAUjB,ECpgBMgU,GAAoC,SAAClU,GACzC,IAAA2C,EAAA3C,EAAAmU,QAAAA,OAAU,IAAAxR,KACVE,EAAA7C,EAAAoU,cAAAA,cAAqBvR,EACrBC,EAAA9C,EAAA+C,SAAAA,OAAQ,IAAAD,GAAQA,EAChBkO,EAAQhR,EAAAgR,SACRhO,cAAAM,OAAY,IAAAN,EAAA,KACZlB,EAAK9B,EAAA8B,MACL5B,EAAQF,EAAAE,SAEAN,EAAiBW,iBAYnB8T,EAAYF,GAAWC,EACvB5O,EAAkBzC,EACpB,UACAsR,EACAzU,EACA,QACEgU,EAAc7Q,EAAW,UAAYsR,EAAYzU,EAAe,UAEtE,OACE6B,EACE,MAAA,CAAA6B,UAAW,gBAAgB7D,OAAA6D,GAC3BxB,SACE2C,QAAS,cACTC,WAAY,SACZxD,IAAK,MACLiE,OAAQpC,EAAW,cAAgB,WAChCjB,GAELoB,QA5BgB,SAACzG,GACfsG,IAMJiO,SAAAA,EAJuB,CACrByC,OAAQ,CAAEU,SAAUA,GACpBxI,cAAe,CAAEwI,SAAUA,KAG/B,EAsBIjU,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACLgD,SAAU,WACVnD,MAAO,OACPf,OAAQ,OACR4K,SAAU,OACV8I,UAAW,OACXrP,aAAc,MACdC,OAAQ,aAAazF,OAAAmU,GACrBpO,gBAAeA,EACff,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBU,WAAY,WACZT,WAAY,EACZ2P,UAAW,cAGbrU,SAAAG,EAAA,MAAA,CACEyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACR4B,QAAS6R,EAAY,EAAI,EACzBhP,WAAY,eACZqE,cAAe,QAGhBxJ,SACCG,EADD+T,EACExE,EAEAF,EAFU,CAAA5N,MAAO,CAAEH,MAAO,OAAQf,OAAQ,OAAQ6D,QAAS,eAMjEvE,GACCG,EACE,OAAA,CAAAyB,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAOuB,EAAW,UAAY,UAC9BiC,WAAY,uBACb9E,SAEAA,IAGLG,EAAA,QAAA,CACEuC,KAAK,WACLuR,QAASA,EACTK,IAAK,SAACC,GACAA,IAAIA,EAAGL,cAAgBA,EAC5B,EACDpD,SAAUA,EACVjO,SAAUA,EACVjB,MAAO,CACLgD,SAAU,WACVtC,QAAS,EACTb,MAAO,EACPf,OAAQ,EACR8I,cAAe,QAChB,cACW,WAIpB,EAEAwK,GAASnO,YAAc,WCqCvB,IAAM2O,GAAW,SAACC,EAAUC,GAC1B,MAAoB,iBAATA,EACFD,aAAG,EAAHA,EAAMC,GAERA,EAAKC,OAAO,SAACC,EAAKhB,GAAQ,OAAAgB,aAAG,EAAHA,EAAMhB,IAAMa,EAC/C,EAEMI,GAAY,SAAKC,EAAWC,WAChC,MAAsB,mBAAXA,EACFA,EAAOD,GAEM,iBAAXC,EAC0B,QAA5BjV,EAAA0U,GAASM,EAAQC,UAAW,IAAAjV,EAAAA,EAAA,GAEX,UAAlBgV,EAAelB,WAAG,IAAAnR,EAAAA,EAAI,EAChC,EAIMuS,GAAqD,SAAClV,GAAE,IAAAmV,EAAKnV,EAAAmV,MACzDvV,EAAiBW,iBAEzB,MAAc,WAAV4U,EAEA9U,EAAC0P,GAAW,CAACjO,MAAO,CAAEN,MAAO5B,KAGnB,YAAVuV,EAEA9U,EAACyP,GAAY,CAAChO,MAAO,CAAEN,MAAO5B,KAIhCS,EAACwP,GAAQ,CAAA,EAEb,EAMMuF,GAAQ,SAAsCpV,eAClDmD,EAAAnD,EAAAqV,QAAAA,OAAU,IAAAlS,EAAA,GAAEA,EACZE,EAAerD,EAAAsV,WAAfA,OAAU,IAAAjS,EAAG,GAAEA,EACfG,EAAcxD,EAAAiV,OAAdA,OAAM,IAAAzR,EAAG,MAAKA,EACd+R,EAAYvV,EAAAuV,aACZ5R,EAAkB3D,EAAAwV,WAAlBA,OAAU,IAAA7R,GAAQA,EAClBC,EAAe5D,EAAAuB,KAAfA,OAAI,IAAAqC,EAAG,SAAQA,EACfI,EAAAhE,EAAAyV,SAAAA,OAAW,IAAAzR,GAAKA,EACDhE,EAAAiD,QAAA,IACfyS,EAAM1V,EAAA0V,OACNrE,EAAiBrR,EAAA2V,WAAjBA,OAAU,IAAAtE,GAAOA,EACjB5K,EAAKzG,EAAAyG,MACLmP,EAAM5V,EAAA4V,OACNC,EAAO7V,EAAA6V,QACPC,EAAM9V,EAAA8V,OACNC,gBAAAC,OAAc,IAAAD,EAAA,OAAMA,EACpB/E,EAAQhR,EAAAgR,SACRiF,EAAcjW,EAAAiW,eACdC,EAAkBlW,EAAAkW,mBAClBC,EAAKnW,EAAAmW,MACL1E,EAAAzR,EAAAsD,UAAAA,OAAY,IAAAmO,EAAA,GAAEA,EACd3P,EAAK9B,EAAA8B,MACLsU,EAAUpW,EAAAoW,WACVC,EAAYrW,EAAAqW,aACZC,EAAWtW,EAAAsW,YACLtW,EAAAuW,WACH7S,EA1B+ClH,EAAAwD,EAAA,CAAA,UAAA,aAAA,SAAA,eAAA,aAAA,OAAA,WAAA,UAAA,SAAA,aAAA,QAAA,SAAA,UAAA,SAAA,cAAA,WAAA,iBAAA,qBAAA,QAAA,YAAA,QAAA,aAAA,eAAA,cAAA,WA6B5C0R,EAAwC7N,GAC5C0R,aAAY,EAAZA,EAAciB,mBAAmBjB,aAAY,EAAZA,EAAckB,yBAA0B,IADpED,EAAe9E,EAAA,GAAEgF,OAKxB3N,EAAU,gBAC8BsJ,KAAlCkD,aAAY,EAAZA,EAAciB,kBAChBE,EAAmBnB,EAAaiB,kBAEjC,CAACjB,aAAA,EAAAA,EAAciB,kBACZ,IAAA3E,EAAwBhO,EAAiC,IAAI8S,KAA5DC,EAAO/E,EAAA,GAAEgF,QACV7E,GAAwCnO,GAC5CuS,eAAAA,EAAYU,yBAA0B,IADjCC,SAAiBC,SAGlBC,GAAgCpT,EACpC2R,GAAoC,iBAAfA,IAChBA,EAAWlF,SAAWkF,EAAWjF,iBAClC,GAHC2G,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAK5BG,GAA0BvT,EAC9B2R,GAAoC,iBAAfA,IAChBA,EAAW9E,UAAY8E,EAAW7E,kBACnC,IAHCD,GAAQ0G,GAAA,GAAEC,GAAWD,GAAA,GAO5BrO,EAAU,WACJyM,GAAoC,iBAAfA,SACInD,IAAvBmD,EAAWlF,SACb6G,GAAe3B,EAAWlF,cAEA+B,IAAxBmD,EAAW9E,UACb2G,GAAY7B,EAAW9E,UAG7B,EAAG,CAAC8E,IACE,IAAA8B,GAAwCzT,EAAwB,MAA/D0T,GAAeD,GAAA,GAAEE,GAAkBF,GAAA,GACpCG,GAA0C5T,EAAwB,MAAjE6T,GAAgBD,GAAA,GAAEE,GAAmBF,GAAA,GACtCG,GAA0B/T,GAAS,GAAlCgU,GAAQD,GAAA,GAAEE,GAAWF,GAAA,GACtBG,GAAWC,EAAuB,MAClCC,GAAYD,EAAgC,MAGlDjP,EAAU,WACR,IAAMmP,EAAc,WAClBJ,GAAY7L,OAAOkM,WAAa,IAClC,EAGA,OAFAD,IACAjM,OAAOmM,iBAAiB,SAAUF,GAC3B,WAAM,OAAAjM,OAAOoM,oBAAoB,SAAUH,GACnD,EAAE,IAGH,IAAMI,GAAevN,EAAY,SAACiK,EAAWuD,aAErCC,EAAiD,QAAjCxY,EAAAuV,aAAA,EAAAA,EAAckD,wBAAmB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAAP,GACvD,KAAIwD,aAAa,EAAbA,EAAezV,UAAnB,CAIA,IACI2V,EADE5E,EAAMiB,GAAUC,EAAQC,GAI5ByD,EADyB,WAAvBnD,aAAY,EAAZA,EAAc3S,MACK2V,EAAW,CAACzE,GAAO,GAEpCyE,EACuBtZ,EAAAA,EAAA,GAAAuX,GAAiB,GAAA,CAAA1C,OAErB0C,EAAgBtO,OAAO,SAAAyQ,GAAK,OAAAA,IAAM7E,CAAN,GAIrD4C,EAAmBgC,GAEnB,IAAME,EAAetD,EAAWpN,OAAO,SAAA/B,GAAK,OAAAuS,EAAmBG,SAAS9D,GAAU5O,EAAG8O,GAAQ,GAEvE,QAAtBtS,EAAA4S,aAAY,EAAZA,EAAcvE,gBAAQ,IAAArO,GAAAA,EAAAtG,KAAAkZ,EAAGmD,EAAoBE,WAC7C/V,EAAA0S,aAAY,EAAZA,EAAcuD,gCAAW9D,EAAQuD,EAAUK,EAAc,IAAIG,MAAM,UApBlE,CAqBF,EAAE,CAACvC,EAAiBvB,EAAQM,EAAcD,IAErC0D,GAAkBjO,EAAY,SAACwN,EAAmBU,WAEhDC,EAAOD,EACV/Q,OAAO,SAAA/B,GAAC,IAAAnG,EAAI,QAAkC,QAAjCA,EAAAuV,eAAAA,EAAckD,wBAAmB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAApP,GAAGpD,SAAQ,GACzDmG,IAAI,SAAA/C,GAAK,OAAA4O,GAAU5O,EAAG8O,EAAb,GACNyD,EAAqBH,EAAWW,EAAO,GAE7CxC,EAAmBgC,GAEnB,IAAME,EAAetD,EAAWpN,OAAO,SAAA/B,GAAK,OAAAuS,EAAmBG,SAAS9D,GAAU5O,EAAG8O,GAAQ,GACvFkE,EAAaZ,EAAWU,EAAgB/Q,OAAO,SAAA/B,GAAC,IAAAnG,EAAI,QAA+B,QAA9BA,EAAAuV,eAAAA,EAAckD,wBAAgB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAGpP,GAAGpD,SAAQ,GAAI,GAErF,QAAtB/C,EAAAuV,aAAY,EAAZA,EAAcvE,gBAAQ,IAAAhR,GAAAA,EAAA3D,KAAAkZ,EAAGmD,EAAoBE,GACjB,QAA5BjW,EAAA4S,aAAY,EAAZA,EAAc6D,mBAAc,IAAAzW,GAAAA,EAAAtG,KAAAkZ,EAAAgD,EAAUK,EAAcO,EACrD,EAAE,CAAClE,EAAQM,EAAcD,IAGpB+D,GAAatO,EAAY,SAACuO,EAAuBnE,GACrD,IAAMoE,EAAYD,EAAOxF,MAAQvU,MAAMia,QAAQF,EAAOG,WAAaH,EAAOG,UAAUnK,KAAK,KAAOgK,EAAOG,WACvG,GAAKF,EAAL,CAEA,IAAMG,EAAa,IAAI/C,IAAIC,GAEb,OAAVzB,EACFuE,EAAWjR,OAAO8Q,GAElBG,EAAWC,IAAIJ,EAAqBpE,GAGtC0B,GAAW6C,GAGX,IAAME,EAAiCra,MAAMJ,KAAKua,EAAWG,WAAW3Q,IAAI,SAAClJ,OAAC8T,EAAG9T,EAAA,GAAEmV,EAAKnV,EAAA,GAKtF,MAAO,CACLsZ,OALUjE,EAAQyE,KAAK,SAAAC,GAEvB,OADaA,EAAEjG,MAAQvU,MAAMia,QAAQO,EAAEN,WAAaM,EAAEN,UAAUnK,KAAK,KAAOyK,EAAEN,cAC9D3F,CAClB,IAEiBwF,EACfnE,MAAOA,EACP6E,MAAOlG,EACPyF,UAAWzF,EAEf,GAGMmG,EAAiC,CACrCX,OAAMA,EACNnE,MAAOA,EACP6E,MAAOT,EACPA,UAAWA,GAITD,EAAOrD,gBACTqD,EAAOrD,eAAegE,GAIpBhE,GACFA,EAAsC,IAAvB2D,EAAY3d,OAAe2d,EAAY,GAAKA,GAIzD5I,GACFA,EACE,CAAEV,QAAS4G,GAAaxG,SAAQA,IAChC,CAAA,EACuB,IAAvBkJ,EAAY3d,OAAe2d,EAAY,GAAKA,EAC5C,CAAEM,kBAAmB5E,EAAYzO,OAAQ,QAlDtB,CAqDzB,EAAG,CAAC+P,EAAS5F,EAAUiF,EAAgBiB,GAAaxG,GAAU4E,EAAYD,IAGrDtK,EAAY,SAACiK,EAAWmF,WAEvCC,EADEtG,EAAMiB,GAAUC,EAAQC,GAI5BmF,EADED,EACuBlb,EAAAA,EAAA,GAAA8X,IAAiB,GAAA,CAAAjD,OAErBiD,GAAgB7O,OAAO,SAAAyQ,GAAK,OAAAA,IAAM7E,CAAN,GAGnDkD,GAAmBoD,GACC,QAApBpa,EAAAoW,aAAU,EAAVA,EAAYiE,gBAAQ,IAAAra,GAAAA,EAAA3D,KAAA+Z,EAAG+D,EAAUnF,GACD,QAAhCrS,EAAAyT,aAAA,EAAAA,EAAYkE,4BAAoB,IAAA3X,GAAAA,EAAAtG,KAAA+Z,EAAGgE,EACpC,EAAE,CAACrD,GAAiB9B,EAAQmB,IAG7B,IAAMmE,GAAmBxP,EAAY,WACnC,IAAIyP,EAASvb,EAAA,GAAOqW,GAAU,GAiC9B,OA9BIsB,EAAQrV,KAAO,GACjBiZ,EAAUC,KAAK,SAACC,EAAG5L,GAEjB,IADA,IACY6L,EAAA,SAAApB,EAAWpE,GACrB,IAAMmE,EAASjE,EAAQyE,KAAK,SAAAc,GAE1B,OADeA,EAAI9G,MAAQvU,MAAMia,QAAQoB,EAAInB,WAAamB,EAAInB,UAAUnK,KAAK,KAAOsL,EAAInB,cACtEF,CACpB,GAEA,IAAKD,EAAiB,MAAA,WAEtB,IAAIuB,EAAgB,EAEpB,GAA6B,mBAAlBvB,EAAOwB,OAChBD,EAAgBvB,EAAOwB,OAAOJ,EAAG5L,QAC5B,IAAsB,IAAlBwK,EAAOwB,OAAiB,CACjC,IAAMC,EAAOrG,GAASgG,EAAGpB,EAAOG,WAAaF,GACvCyB,EAAOtG,GAAS5F,EAAGwK,EAAOG,WAAaF,GACzCwB,EAAOC,EAAMH,GAAiB,EACzBE,EAAOC,IAAMH,EAAgB,EACvC,CAED,OAAsB,IAAlBA,SACe,WAAV1F,EAAqB0F,GAAiBA,QAD/C,OAnB+BI,EADX1b,MAAMJ,KAAKyX,EAAQiD,WACRqB,EAAAD,EAAAhf,OAAAif,IAAa,CAAnC,IAAAlb,OAACmb,EAAAR,EAAS3a,EAAA,GAAOA,EAAA,wCAsB3B,CACD,OAAO,CACT,GAGKwa,CACR,EAAE,CAAClF,EAAYsB,EAASvB,IAEnB+F,GAAgBb,KAGhBc,GAAgBjb,EAAQ,WAC5B,IAAmB,IAAfoV,IAAyBA,EAAY,OAAO4F,GAEhD,IAAMzI,GAASuE,GAAc,GAAKxG,GAC5BkC,EAAMD,EAAQjC,GACpB,OAAO0K,GAAc5b,MAAMmT,EAAOC,EACnC,EAAE,CAACwI,GAAelE,GAAaxG,GAAU8E,IAEpClD,GAAmBvH,EAAY,SAACwH,EAAchR,WAC5CgS,EAAchS,QAAAA,EAAQmP,GAgB5B,GAfAyG,GAAe5E,GACXhR,GAAM8V,GAAY9V,GAGlB2U,GACFA,EAAmB3D,EAAMgB,GAIvBiC,GAAoC,iBAAfA,IACJ,QAAnBxV,EAAAwV,EAAWxE,gBAAQ,IAAAhR,GAAAA,EAAA3D,KAAAmZ,EAAGjD,EAAMhR,GACxBA,IAAiC,QAA3BoB,EAAA6S,EAAWvE,wBAAgB,IAAAtO,GAAAA,EAAAtG,KAAAmZ,EAAGjD,EAAMhR,KAI5CyP,EAAU,CACZ,IAAM4I,EAAiCra,MAAMJ,KAAKyX,EAAQiD,WAAW3Q,IAAI,SAAClJ,OAAC8T,EAAG9T,EAAA,GAAEmV,EAAKnV,EAAA,GAKnF,MAAO,CACLsZ,OALUjE,EAAQyE,KAAK,SAAAC,GAEvB,OADaA,EAAEjG,MAAQvU,MAAMia,QAAQO,EAAEN,WAAaM,EAAEN,UAAUnK,KAAK,KAAOyK,EAAEN,cAC9D3F,CAClB,GAGEqB,MAAOA,EACP6E,MAAOlG,EACPyF,UAAWzF,EAEf,GAEA9C,EACE,CAAEV,QAASiC,EAAM7B,SAAU6C,GAC3B,CAAA,EACuB,IAAvBqG,EAAY3d,OAAe2d,EAAY,GAAKA,EAC5C,CAAEM,kBAAmBkB,GAAevU,OAAQ,YAE/C,CACH,EAAG,CAAC2O,EAAYU,EAAoBlF,EAAUN,GAAUkG,EAASvB,EAAS+F,KAGpEE,GAAavQ,EAAY,SAACuO,EAAuBtE,EAAW9B,GAChE,IAAM5V,EAAQoX,GAASM,EAAQsE,EAAOG,WAAa,IAEnD,OAAIH,EAAOrM,OACFqM,EAAOrM,OAAO3P,EAAO0X,EAAQ9B,GAG/B5V,CACR,EAAE,IAGGie,GAAiBxQ,EAAY,SAACyQ,EAAqBC,EAA+CC,GACtG,GAAKD,EAAL,CAEA,IAAME,GAA2B,IAAVF,EAAiB,OAASA,EAC7CG,EAAS,EAEb,GAAuB,SAAnBD,EAA2B,CAG7B,GAAIpG,IAAwC,SAAvBA,EAAakG,QAA2C,IAAvBlG,EAAakG,OAIjEG,GAHwD,iBAA7BrG,EAAasG,YACpCtG,EAAasG,YACwB,iBAA7BtG,EAAasG,YAA2BtX,SAASgR,EAAasG,aAAe,GAI3F,IAAK,IAAI/f,EAAI,EAAGA,EAAI0f,EAAa1f,IAAK,CAEpC,GAAkB,UADZ8e,EAAMvF,EAAQvZ,IACZ2f,QAAkC,IAAdb,EAAIa,MAI9BG,GAHiBhB,EAAIjZ,MACK,iBAAdiZ,EAAIjZ,MAAqBiZ,EAAIjZ,MAAQ4C,SAASqW,EAAIjZ,QAAoB,EAC9E,GAGP,CACD,OAAOia,CACR,CAAM,GAAuB,UAAnBD,EAA4B,CAErC,IAAS7f,EAAI0f,EAAc,EAAG1f,EAAIuZ,EAAQpZ,OAAQH,IAAK,CACrD,IAAM8e,EACN,GAAkB,WADZA,EAAMvF,EAAQvZ,IACZ2f,MAING,GAHiBhB,EAAIjZ,MACK,iBAAdiZ,EAAIjZ,MAAqBiZ,EAAIjZ,MAAQ4C,SAASqW,EAAIjZ,QAAoB,EAC9E,GAGP,CAED,GAAI4T,GAAuC,UAAvBA,EAAakG,MAI/BG,GAHwD,iBAA7BrG,EAAasG,YACpCtG,EAAasG,YACwB,iBAA7BtG,EAAasG,YAA2BtX,SAASgR,EAAasG,aAAe,GAG3F,OAAOD,CACR,CA5C2B,CA+C9B,EAAG,CAACvG,EAASE,IAGPuG,GAAe/Q,EAAY,WAC/B,IAAK4K,EAAY,OAAO,KAExB,IAmGgBoG,EACAC,EACAC,EACAC,EAtGVC,EAAgB9G,EAAQnM,IAAI,SAACoQ,EAAQ8C,SACnC7C,EAAYD,EAAOxF,MAAQvU,MAAMia,QAAQF,EAAOG,WAAaH,EAAOG,UAAUnK,KAAK,KAAOgK,EAAOG,YAAc2C,EAC/GC,EAAYzF,EAAQ0F,IAAI/C,IAAwB,KAChDgD,EAAchB,GAAea,EAAU9C,EAAOmC,OAAO,GACrDI,EAAcvC,EAAO3X,MACE,iBAAjB2X,EAAO3X,MAAqB,UAAG2X,EAAO3X,MAAS,MAAG2X,EAAO3X,WACjE0Q,EAEJ,OACEhS,EAAA,KAAA5E,EAAA,CAEE6H,UAAW,GAAG7D,OAAA6Z,EAAOhW,WAAa,GAAM,KAAA7D,OAAA6Z,EAAOkD,MAAQ,QAAA/c,OAAQ6Z,EAAOkD,OAAU,IAChF1a,MAAO,CACLH,MAAOka,EACPrQ,SAAU8N,EAAO9N,SAAuC,iBAApB8N,EAAO9N,SAAwB,GAAA/L,OAAG6Z,EAAO9N,SAAY,MAAG8N,EAAO9N,SAAaqQ,QAAexJ,EAC/HpH,SAAU4Q,EACV/W,SAAUwU,EAAOmC,MAAQ,SAAW,WACpCjS,KAAuB,SAAjB8P,EAAOmC,QAAqC,IAAjBnC,EAAOmC,WAAkCpJ,IAAhBkK,EAA4B,UAAGA,EAAW,MAAO,SAAOlK,EAClHxI,MAAwB,UAAjByP,EAAOmC,WAAqCpJ,IAAhBkK,EAA4B,GAAA9c,OAAG8c,EAAW,MAAO,SAAOlK,EAC3F5I,OAAQ6P,EAAOmC,MAA0B,SAAjBnC,EAAOmC,QAAqC,IAAjBnC,EAAOmC,MAAiB,GAAK,EAAK,EACrFjW,iBAAiB8T,EAAOmC,MAAQ,WAChChW,UAA4B,SAAjB6T,EAAOmC,QAAqC,IAAjBnC,EAAOmC,MACzC,gCACiB,UAAjBnC,EAAOmC,MACP,sCACApJ,EACJhH,QAAS,YACToR,UAAWnD,EAAOkD,OAAS,OAC3BE,aAAc,oBACd3X,WAAY,IACZhE,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,yBAEU,QAAnBhF,EAAAsZ,EAAOqD,oBAAY,IAAA3c,OAAA,EAAAA,EAAA3D,KAAAid,EAAGA,KAAW,CAAE,EAExC,CAAApZ,SAAAuB,EAAA,MAAA,CACEK,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZxD,IAAK,MACLyD,eAAiC,UAAjB2U,EAAOkD,MAAoB,WAA8B,WAAjBlD,EAAOkD,MAAqB,SAAW,cAGjGtc,SAAA,CAAAG,EAAA,OAAA,CAAMyB,MAAO,CAAEiD,WAAY,IAAKhE,SAAU,OAAQC,WAAY,OAAQQ,MAAO,WAAWtB,SAC7D,mBAAjBoZ,EAAO7S,MAAuB6S,EAAO7S,MAAM,CAAE4V,UAASA,EAAEO,WAAYtD,IAAYA,EAAO7S,QAEhG6S,EAAOwB,QACNza,EACE,SAAA,CAAA6C,QAAS,WAEPmW,GAAWC,EADqB,OAAd+C,EAAqB,SAAyB,WAAdA,EAAyB,UAAY,KAExF,EACDva,MAAO,CACLoD,OAAQ,OACRgG,WAAY,OACZ/F,OAAQ,UACRV,QAAS,OACTC,WAAY,SACZ2G,QAAS,MACT7J,MAAO6a,EAAY,UAAY,WAChCnc,SAEDG,EAAC6U,GAAiB,CAACC,MAAOkH,QAAahK,WAtDxCkH,EA4DX,GAGA,GAAIhE,EAAc,CAChB,IAAMsH,EAAkD,iBAA7BtH,EAAasG,YACpC,GAAApc,OAAG8V,EAAasG,YAAe,MACM,iBAA7BtG,EAAasG,YAA2BtG,EAAasG,YAAc,OACzEiB,EACJzc,EAAA,KAAA,CAEEyB,MAAO,CACLH,MAAOkb,EACP/X,SAAUyQ,EAAakG,MAAQ,SAAW,WAC1CjS,KAA6B,SAAvB+L,EAAakG,QAA2C,IAAvBlG,EAAakG,MAAiB,WAAQpJ,EAC7ExI,MAA8B,UAAvB0L,EAAakG,MAAoB,WAAQpJ,EAChD5I,OAAQ8L,EAAakG,MAAgC,SAAvBlG,EAAakG,QAA2C,IAAvBlG,EAAakG,MAAiB,GAAK,GAAM,EACxGjW,gBAAiB,UACjB6F,QAAS,YACTqR,aAAc,oBACd3X,WAAY,IACZhE,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZyX,UAAW,UACZvc,SAEDuB,EAAK,MAAA,CAAAK,MAAO,CAAE2C,QAAS,OAAQC,WAAY,SAAUC,eAAgB,UAClEzE,SAAA,EAACqV,EAAawH,eAAuC,UAAtBxH,EAAa3S,OACrCmZ,EAAcV,GAAcnT,OAAO,SAAA/B,GAAK,IAAAnG,EAAA,QAA8B,UAA7BuV,EAAakD,wBAAgB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAGpP,GAAGpD,SAAQ,GACpFiZ,EAAcD,EAAY7S,IAAI,SAAA/C,GAAK,OAAA4O,GAAU5O,EAAG8O,EAAO,GACvDgH,EAAcF,EAAY9f,OAAS,GAAK+f,EAAYgB,MAAM,SAAAlJ,GAAO,OAAA0C,EAAgBqC,SAAS/E,EAAI,GAC9FoI,EAAeF,EAAYiB,KAAK,SAAAnJ,GAAO,OAAA0C,EAAgBqC,SAAS/E,EAAI,GAGxEzT,EAAC6T,GAAQ,CACPC,QAAS8H,EACT7H,cAAe8H,IAAiBD,EAChCjL,SAAU,SAACvU,GAAM,OAAAuc,GAAgBvc,EAAEgX,OAAOU,QAASkH,GAAc,KAItE9F,EAAa2H,aAAe7c,EAAM,OAAA,CAAAyB,MAAO,CAAE4Q,WAAY6C,EAAawH,cAAgB,EAAI,OAAU7c,SAAAqV,EAAa2H,kBAjC9G,aAqCRf,EAAcgB,QAAQL,EACvB,CAED,IAAMM,EAAiB9G,aAAW,EAAXA,EAAcjB,EAAS,GAE9C,OACEhV,EAAO,QAAA,CAAAmU,IAAKyD,YACV5X,EAAQ,KAAA5E,EAAA,CAAA,EAAC2hB,GAAkB,GAAG,CAAAld,SAAGic,MAGtC,EAAE,CAAC9G,EAASM,EAAYiB,EAASrB,EAAciB,EAAiB6E,GAAepG,EAAQoE,GAAYL,GAAiBtD,EAAQY,EAAaiF,KAGpI8B,GAAkBtS,EAAY,SAACmI,GACnCsE,GAAmBtE,EACpB,EAAE,IAEGoK,GAAiBvS,EAAY,SAACtO,EAAoByW,GACtDzW,EAAEiJ,iBACFiS,GAAoBzE,EACrB,EAAE,IAEGqK,GAAaxS,EAAY,SAACtO,EAAoB+gB,GAElD,GADA/gB,EAAEiJ,iBACsB,OAApB6R,IAA4BA,KAAoBiG,EAGlD,OAFAhG,GAAmB,WACnBG,GAAoB,MAItB,IAAM8F,EAAOxe,EAAA,GAAOoc,IAAa,GAC3BqC,EAAcD,EAAQlG,IAC5BkG,EAAQE,OAAOpG,GAAiB,GAChCkG,EAAQE,OAAOH,EAAW,EAAGE,GAG7BlG,GAAmB,MACnBG,GAAoB,KACtB,EAAG,CAACJ,GAAiB8D,KAEfuC,GAAgB7S,EAAY,WAChCyM,GAAmB,MACnBG,GAAoB,KACrB,EAAE,IAGGkG,GAAa9S,EAAY,WAC7B,OAAOsQ,GAAcnS,IAAI,SAAC8L,EAAQ9B,SAC1BY,EAAMiB,GAAUC,EAAQC,GACxB6I,EAAatH,EAAgBqC,SAAS/E,GACtCiK,EAAahH,GAAgB8B,SAAS/E,GACtCkK,GAAW7H,aAAK,EAALA,EAAQnB,EAAQ9B,KAAU,CAAA,EACrC+K,EAAY/K,IAAUmI,GAAcpf,OAAS,EAEnD,OACEwF,EAAC+N,EAAM0O,SACL,CAAAhe,SAAA,CAAAuB,EAAA,KAAAhG,EAAA,CACE6H,UAAW,UAA2B,mBAAjB+S,EAA8BA,EAAarB,EAAQ9B,GAASmD,GAAgB,GAAM,KAAA5W,OAAA8X,KAAoBrE,EAAQ,WAAa,GAAE,KAAAzT,OAAIiY,KAAqBxE,EAAQ,YAAc,IACjMiL,WAAW,EACXC,YAAa,WAAM,OAAAf,GAAgBnK,EAAM,EACzCmL,WAAY,SAAC5hB,GAAM,OAAA6gB,GAAe7gB,EAAGyW,EAAM,EAC3CoL,OAAQ,SAAC7hB,GAAM,OAAA8gB,GAAW9gB,EAAGyW,IAC7BqL,UAAWX,GACX9b,MACErG,EAAA,CAAA0J,OAAQ,OACR3C,QAAS+U,KAAoBrE,EAAQ,GAAM,EAC3C1N,gBAAiBkS,KAAqBxE,EAAQ,UAAY,QAC1D7N,WAAY,yBACT2Y,EAASlc,OAEd6D,aAAc,SAAClJ,GACT8a,KAAoBrE,GAASwE,KAAqBxE,IACpDzW,EAAEkP,cAAc7J,MAAM0D,gBAAkB,UAE5C,EACAI,aAAc,SAACnJ,GACT8a,KAAoBrE,GAASwE,KAAqBxE,IACpDzW,EAAEkP,cAAc7J,MAAM0D,gBAAkB,WAGxCwY,EAEH,CAAA9d,SAAA,CAAAqV,GACClV,EAAA,KAAA,CACEyB,MAAO,CACLH,MAA2C,iBAA7B4T,EAAasG,YACvB,GAAApc,OAAG8V,EAAasG,YAAe,MACM,iBAA7BtG,EAAasG,YAA2BtG,EAAasG,YAAc,OAC/E/W,SAAUyQ,EAAakG,MAAQ,SAAW,WAC1CjS,KAA6B,SAAvB+L,EAAakG,QAA2C,IAAvBlG,EAAakG,MAAiB,WAAQpJ,EAC7ExI,MAA8B,UAAvB0L,EAAakG,MAAoB,WAAQpJ,EAChD5I,OAAQ8L,EAAakG,MAAgC,SAAvBlG,EAAakG,QAA2C,IAAvBlG,EAAakG,MAAiB,GAAK,GAAM,EACxGjW,gBAAiB,QACjB6F,QAAS,OACTqR,aAAcuB,EAAY,OAAS,oBACnCxB,UAAW,UACZvc,SAEDG,EAAK,MAAA,CAAAyB,MAAO,CAAE2C,QAAS,OAAQC,WAAY,SAAUC,eAAgB,UAAUzE,SAC7EG,EAAC6T,GACC,CAAAC,QAAS2J,EACT9M,SAAU,SAACvU,GAAM,OAAA6b,GAAatD,EAAQvY,EAAEgX,OAAOU,UAC/CpR,SAA0C,QAAhC/C,EAAAuV,EAAakD,wBAAmB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAAP,GAAQjS,eAKzDsS,EAAQnM,IAAI,SAACoQ,EAAQ8C,SACd7C,EAAYD,EAAOxF,MAAQvU,MAAMia,QAAQF,EAAOG,WAAaH,EAAOG,UAAUnK,KAAK,KAAOgK,EAAOG,YAAc2C,EAC/GoC,GAA4B,QAAhBxe,EAAAsZ,EAAOmF,cAAS,IAAAze,OAAA,EAAAA,EAAA3D,KAAAid,EAAAtE,EAAQ9B,KAAU,GAC9CqJ,EAAchB,GAAea,EAAU9C,EAAOmC,OAAO,GACrDI,EAAcvC,EAAO3X,MACE,iBAAjB2X,EAAO3X,MAAqB,UAAG2X,EAAO3X,MAAS,MAAG2X,EAAO3X,WACjE0Q,EAEJ,OACEhS,UAEEiD,UAAW,UAAGgW,EAAOhW,WAAa,GAAE,KAAA7D,OAAI6Z,EAAOkD,MAAQ,eAAQlD,EAAOkD,OAAU,IAChF1a,MAAKrG,EAAA,CACHkG,MAAOka,EACPrQ,SAAU8N,EAAO9N,SAAuC,iBAApB8N,EAAO9N,SAAwB,GAAA/L,OAAG6Z,EAAO9N,eAAe8N,EAAO9N,SAAaqQ,QAAexJ,EAC/HpH,SAAU4Q,EACV/W,SAAUwU,EAAOmC,MAAQ,SAAW,WACpCjS,KAAuB,SAAjB8P,EAAOmC,QAAqC,IAAjBnC,EAAOmC,WAAkCpJ,IAAhBkK,EAA4B,GAAG9c,OAAA8c,QAAkB,SAAOlK,EAClHxI,MAAwB,UAAjByP,EAAOmC,WAAqCpJ,IAAhBkK,EAA4B,GAAA9c,OAAG8c,EAAW,MAAO,SAAOlK,EAC3F5I,OAAQ6P,EAAOmC,MAA0B,SAAjBnC,EAAOmC,QAAqC,IAAjBnC,EAAOmC,MAAiB,GAAK,EAAK,EACrFjW,gBAAiB,QACjBC,UAA4B,SAAjB6T,EAAOmC,QAAqC,IAAjBnC,EAAOmC,MACzC,gCACiB,UAAjBnC,EAAOmC,MACP,sCACApJ,EACJhH,QAAS,OACTqR,aAAcuB,EAAY,OAAS,oBACnCld,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZyX,UAAWnD,EAAOkD,OAAS,QACxBgC,EAAU1c,OAEf4c,QAASpF,EAAOoF,QAChBC,QAASrF,EAAOqF,SACZH,EAEH,CAAAte,SAAAob,GAAWhC,EAAQtE,EAAQ9B,KA7BvBqG,UAkCZnD,aAAU,EAAVA,EAAYwI,oBAAqBb,GAChC1d,EACE,KAAA,CAAAH,SAAAG,EAAA,KAAA,CAAIqe,QAASrJ,EAAQpZ,QAAUsZ,EAAe,EAAI,YAC/Ca,EAAWwI,kBAAkB5J,EAAQ9B,EAAO,GAAG,SAnGnCY,EAyGzB,EACF,EAAG,CAACuH,GAAepG,EAAQuB,EAAiBO,GAAiBxB,EAAcF,EAASc,EAAOE,EAAciC,GAAcgD,GAAYlF,EAAYmB,GAAiBG,GAAkB2F,GAAiBC,GAAgBC,GAAYK,GAAerC,KAGxOsD,GAAmB,iBACvB,IAAmB,IAAfrJ,IAAyBA,EAAY,OAAO,KAEhD,IAAMhF,EAA4B,QAApBxQ,EAAAwV,EAAWhF,aAAS,IAAAxQ,EAAAA,EAAAob,GAAcnf,OAC1C6I,EAAW0Q,EAAW1Q,UAAY,cAExC,OACEzE,EACE,MAAA,CAAAyB,MAAO,CACL2J,UAAW,OACXhH,QAAS,OACTE,eAAgBG,EAAS+T,SAAS,SAAW,WAAa/T,EAAS+T,SAAS,QAAU,aAAe,UACtG3Y,SAEDG,EAAC+P,GACC,CAAAE,QAAS4G,GACT1G,MAAOA,EACPE,SAAUA,GACVE,gBAAiB4E,EAAW5E,gBAC5BC,gBAAiB2E,EAAW3E,gBAC5BC,gBAAiB0E,EAAW1E,gBAC5BC,UAAWyE,EAAWzE,UACtBC,SAAUsB,GACVrB,iBAAkBqB,GAClBpB,OAAQsE,EAAWtE,OACnBI,WAAYkE,EAAWlE,WACvB/P,KAAe,UAATA,EAAmB,QAAU,aAI3C,EA+DMud,GAAkB1e,EAAQ,WAC9B,OAAOiV,EAAQ4H,KAAK,SAAArC,GAAO,OAAAA,EAAIa,KAAK,IAAMlG,GAAgBA,EAAakG,KACzE,EAAG,CAACpG,EAASE,IAGPwJ,GAAqB3e,EAAQ,WACjC,OAAOiV,EAAQ2H,MAAM,SAAApC,GAAO,OAAAA,EAAIjZ,WAAY4T,GAAgBA,EAAasG,YAC3E,EAAG,CAACxG,EAASE,IAKPyJ,GAAa5e,EAAQ,WAEzB,GAAI0V,aAAM,EAANA,EAAQmJ,EAAG,CACb,GAAwB,iBAAbnJ,EAAOmJ,EAChB,OAAOnJ,EAAOmJ,EACT,IAAiB,IAAbnJ,EAAOmJ,EAShB,OAPiB5J,EAAQR,OAAO,SAACqK,EAAKtE,GAIpC,OAAOsE,GAHGtE,EAAIjZ,MACY,iBAAdiZ,EAAIjZ,MAAqBiZ,EAAIjZ,MAAQ4C,SAAS4a,OAAOvE,EAAIjZ,OAAO6C,QAAQ,KAAM,MAAQ,EAC9F,IAEL,EAAE,IACuB+Q,EAAoD,iBAA7BA,EAAasG,YAA2BtG,EAAasG,YAActX,SAAS4a,OAAO5J,EAAasG,aAAe,MAAMrX,QAAQ,KAAM,MAAQ,GAAM,EAGrM,CAID,GAAIsa,GAaF,OAXsBzJ,EAAQR,OAAO,SAACqK,EAAKtE,GACzC,OAAIA,EAAIa,OAASb,EAAIjZ,MAEZud,GADwB,iBAAdtE,EAAIjZ,MAAqBiZ,EAAIjZ,MAAQ4C,SAAS4a,OAAOvE,EAAIjZ,OAAO6C,QAAQ,KAAM,MAAQ,GAGlG0a,CACR,EAAE,IACwB3J,GAAgBA,EAAakG,OAASlG,EAAasG,YACrC,iBAA7BtG,EAAasG,YAA2BtG,EAAasG,YAActX,SAAS4a,OAAO5J,EAAasG,aAAarX,QAAQ,KAAM,MAAQ,GAC3I,EAOP,EAAE,CAAC6Q,EAASS,aAAM,EAANA,EAAQmJ,EAAG1J,EAAcuJ,KAGhCM,GAAuBhf,EAAQ,WACnC,MAAoB,UAAhB4V,GACA8I,IACAC,IAEA1J,EAAQ4H,KAAK,SAAArC,GAAO,OAAAA,EAAIjZ,QAJQ,QAK7BqU,CACR,EAAE,CAACA,EAAa8I,GAAiBC,GAAoB1J,IAEhDgK,GAAkC,CACtC1d,MAAO,OACP6J,SAAUwT,GAAa,GAAAvf,OAAGuf,GAAU,MAAO,OAC3CM,eAAgB,WAChBC,cAAe,EACfvJ,YAAaoJ,GACb5Z,gBAAiB,QACjBP,aAAc,MACdC,OAAQ,qBAGJsa,MACJ1a,SAAU,WACVnD,MAAO,OACPsJ,SAAU,OACVwU,UAAgC,iBAAd3J,aAAA,EAAAA,EAAQ9X,GAAiB,GAAAyB,OAAGqW,EAAO9X,EAAC,WAAOqU,EAC7DpN,aAAc,OACXnD,GAIL,GAAI+V,GACF,OACEpW,EAAK,MAAAhG,EAAA,CAAA+Y,IAAKuD,GAAUzU,UAAW,sCAAsC7D,OAAA6D,GAAaxB,MAAO0d,IAAkB9b,EACxG,CAAAxD,SAAA,CAAAuG,GAASpG,EAAK,MAAA,CAAAyB,MAAO,CAAE4d,aAAc,QAAQxf,SAAGuG,EAAM2U,MACtD5F,GAAoC,iBAAfA,IAA8C,QAAnB7S,EAAA6S,EAAW1Q,gBAAQ,IAAAnC,OAAA,EAAAA,EAAEgM,WAAW,SAAUkQ,KAjJ7Fxe,EAAA,MAAA,CAAKiD,UAAU,mBAAkBpD,SAC9Bmb,GAAcnS,IAAI,SAAC8L,EAAQ9B,SACpBY,EAAMiB,GAAUC,EAAQC,GACxB6I,EAAatH,EAAgBqC,SAAS/E,GAE5C,OACErS,EAEE,MAAA,CAAA6B,UAAW,wBAAA7D,OAAwBqe,EAAa,WAAa,IAC7Dhc,MAAO,CACLoD,OAAQ,oBACRD,aAAc,MACdoG,QAAS,OACTqU,aAAc,OACdla,gBAAiBsY,EAAa,UAAY,SAG3C5d,SAAA,CAAAqV,GACClV,EAAK,MAAA,CAAAyB,MAAO,CAAE4d,aAAc,OAC1Bxf,SAAAG,EAAC6T,GACC,CAAAC,QAAS2J,EACT9M,SAAU,SAACvU,GAAM,OAAA6b,GAAatD,EAAQvY,EAAEgX,OAAOU,UAC/CpR,SAAuC,QAA7B/C,EAAAuV,EAAakD,wBAAgB,IAAAzY,OAAA,EAAAA,EAAA3D,KAAAkZ,EAAGP,GAAQjS,aAIvDsS,EAAQnM,IAAI,SAACoQ,GACZ,IAAMC,EAAYD,EAAOxF,MAAQvU,MAAMia,QAAQF,EAAOG,WAAaH,EAAOG,UAAUnK,KAAK,KAAOgK,EAAOG,WACjGnc,EAAQoX,GAASM,EAAQsE,EAAOG,WAAa,IAC7CkG,EAAerG,EAAOrM,OAASqM,EAAOrM,OAAO3P,EAAO0X,EAAQ9B,GAAS5V,EAE3E,OACEmE,EAEE,MAAA,CAAAK,MAAO,CACL2C,QAAS,OACTE,eAAgB,gBAChB+a,aAAc,MACdE,cAAe,MACflD,aAAc,qBAGhBxc,SAAA,CAAAuB,EAAA,OAAA,CAAMK,MAAO,CAAEiD,WAAY,OAAQvD,MAAO,kBACf,mBAAjB8X,EAAO7S,MAAuB6S,EAAO7S,MAAM,CAAE,GAAI6S,EAAO7S,MAC3D,OACPpG,EAAM,OAAA,CAAAyB,MAAO,CAAEyJ,KAAM,EAAGkR,UAAW,SAASvc,SAAGyf,MAZ1CpG,EAeX,KAzCKzF,EA4CV,KAgGA8B,GAAUvV,SAAKyB,MAAO,CAAE2J,UAAW,QAAWvL,SAAA0V,EAAOwF,MACrD5F,IAAqC,iBAAfA,KAAgD,QAArB3S,EAAA2S,EAAW1Q,gBAAU,IAAAjC,OAAA,EAAAA,EAAA8L,WAAW,UAAkBkQ,SAM1G,IAAMgB,GAA4C,CAChD/a,SAAU,WACVgb,WAAYhK,aAAM,EAANA,EAAQmJ,IAAKH,GAAmB,OAAS,UACrDiB,WAAWjK,eAAAA,EAAQ9X,GAAI,OAAS,UAChC2D,MAAO,OAGPsJ,UAAwB,KAAd6K,eAAAA,EAAQmJ,GACd,OACqB,iBAAdnJ,aAAA,EAAAA,EAAQmJ,GACf,GAAAxf,OAAGqW,EAAOmJ,EAAK,WACf5M,EACJoN,UAAgC,iBAAd3J,aAAA,EAAAA,EAAQ9X,GAAiB,GAAAyB,OAAGqW,EAAO9X,EAAK,WAAGqU,EAE7DpN,aAAc,OAGhB,OACExD,EAAA,MAAAhG,EAAA,CAAK+Y,IAAKuD,GAAUzU,UAAW,aAAa7D,OAAA6D,GAAaxB,MAAO0d,IAAkB9b,EAAI,CAAAxD,SAAA,CACnFuG,GAASpG,EAAK,MAAA,CAAAyB,MAAO,CAAE4d,aAAc,iBAAWjZ,EAAM2U,MACtD5F,GAAoC,iBAAfA,IAAgD,QAArB1S,EAAA0S,EAAW1Q,gBAAU,IAAAhC,OAAA,EAAAA,EAAA6L,WAAW,SAAUkQ,KAC3Fxe,EAAK,MAAA,CAAAyB,MAAO+d,GACV3f,SAAAG,EAAA,MAAA,CAAKyB,MAAO,CACVH,MAAO,OACP6J,SAAUwT,GAAa,GAAGvf,OAAAuf,GAAc,MAAG,OAC3Cva,QAAS,SAETvE,SAAAuB,EAAA,QAAA,CAAOK,MAAOud,GAAY/b,UAAWmS,EAAW,WAAa,GAAEvV,SAAA,CAC5D4b,KACDzb,EAAQ,QAAA,CAAAH,SAAA2d,OACPhI,GACCxV,EAAA,QAAA,CAAAH,SACEG,EACE,KAAA,CAAAH,SAAAG,EAAA,KAAA,CAAIqe,QAASrJ,EAAQpZ,QAAUsZ,EAAe,EAAI,GAAErV,SAAG2V,EAAQuF,iBAO1ExF,GAAUvV,EAAK,MAAA,CAAAyB,MAAO,CAAE2J,UAAW,QAAQvL,SAAG0V,EAAOwF,MACrD5F,IAAqC,iBAAfA,KAA8C,UAAnBA,EAAW1Q,gBAAQ,IAAA9B,OAAA,EAAAA,EAAE2L,WAAW,UAAkBkQ,QAG1G,ECjiCMmB,GAA8B,SAAChgB,GACnC,IAAA2C,EAAA3C,EAAAmU,QAAAA,OAAU,IAAAxR,KACVE,EAAA7C,EAAA+C,SAAAA,OAAW,IAAAF,GAAKA,EAChBmO,EAAQhR,EAAAgR,SACRlO,EAAc9C,EAAAsD,UAAdA,OAAS,IAAAR,EAAG,GAAEA,EACdhB,EAAK9B,EAAA8B,MACL5B,aACA5C,EAAK0C,EAAA1C,MACL2iB,EAAIjgB,EAAAigB,KAEIjd,EAA6BzC,IAAUX,aAAvCA,OAAY,IAAAoD,EAAG,UAASA,EAY1BwC,EAAkBzC,EACpB,UACAoR,EACAvU,EACA,QACEgU,EAAc7Q,EAChB,UACAoR,EACAvU,EACA,UAEJ,OACE6B,EACE,MAAA,CAAA6B,UAAW,aAAa7D,OAAA6D,GACxBxB,SACE2C,QAAS,cACTC,WAAY,SACZxD,IAAK,MACLiE,OAAQpC,EAAW,cAAgB,WAChCjB,GAELoB,QA/BgB,SAACzG,GACfsG,IAMJiO,SAAAA,EAJuB,CACrByC,OAAQ,CAAEU,SAAUA,EAAS7W,MAAKA,GAClCqO,cAAe,CAAEwI,SAAUA,EAAS7W,MAAKA,KAG7C,EAyBI4C,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACLgD,SAAU,WACVnD,MAAO,OACPf,OAAQ,OACR4K,SAAU,OACV8I,UAAW,OACXrP,aAAc,MACdC,OAAQ,aAAazF,OAAAmU,GACrBpO,gBAAeA,EACff,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBU,WAAY,WACZT,WAAY,EACZ2P,UAAW,cAGbrU,SAAAG,EAAA,MAAA,CACEyB,MAAO,CACLH,MAAO,MACPf,OAAQ,MACR4K,SAAU,MACV8I,UAAW,MACXrP,aAAc,MACdO,gBAAiB,QACjBhD,QAAS2R,EAAU,EAAI,EACvB9O,WAAY,eACZqE,cAAe,OACf6K,UAAW,kBAIhBrU,GACCG,EAAA,OAAA,CACEyB,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAOuB,EAAW,UAAY,UAC9BiC,WAAY,uBACb9E,SAEAA,IAGLG,EACE,QAAA,CAAAuC,KAAK,QACLuR,QAASA,EACTnD,SAAUA,EACVjO,SAAUA,EACVzF,MAAOA,EACP2iB,KAAMA,EACNne,MAAO,CACLgD,SAAU,WACVtC,QAAS,EACTb,MAAO,EACPf,OAAQ,EACR8I,cAAe,QAChB,cACW,WAIpB,EAEAsW,GAAMja,YAAc,QC/Fd,IAAAma,GAA0B,SAAClgB,GAC/B,IAAA2C,EAAA3C,EAAAmgB,MAAAA,OAAQ,IAAAxd,EAAA,KACRE,EAAA7C,EAAAwO,QAAAA,OAAU,IAAA3L,EAAA,cACVC,EAAA9C,EAAAogB,OAAAA,OAAS,IAAAtd,EAAA,QAAOA,EAChBud,EAAYrgB,EAAAqgB,aACLC,EAAetgB,EAAA1C,MACtB0T,EAAQhR,EAAAgR,SACRhO,EAAchD,EAAAsD,UAAdA,OAAS,IAAAN,EAAG,GAAEA,EACdG,EAAiBnD,EAAAugB,KAAjBA,OAAI,IAAApd,EAAG,WAAUA,EACjBE,EAAkBrD,EAAAwgB,WAAlBA,OAAU,IAAAnd,GAAQA,EACfK,EAV4BlH,EAAAwD,EAAA,CAAA,QAAA,UAAA,SAAA,eAAA,QAAA,WAAA,YAAA,OAAA,eAYvBJ,EAAiBW,iBAGzB,IAAK4f,GAA0B,IAAjBA,EAAMlkB,OAClB,OAAO,KAKT,IAAMwkB,EAA6BrgB,EAAQ,WACzC,GAAqB,IAAjB+f,EAAMlkB,OAAc,MAAO,GAG/B,IAAMykB,EAAYP,EAAM,GACxB,MAAyB,iBAAdO,GAA+C,iBAAdA,EAClCP,EAA8BjX,IAAI,SAAC+J,EAAMC,GAAU,MAAC,CAC1DY,IAAKqL,OAAOlM,GACZ/U,MAAOihB,OAAOlM,GACd,GAGGkN,CACT,EAAG,CAACA,IAGEQ,OAAmCtO,IAApBiO,EACfM,EAA4BH,EAAgBxkB,OAAS,EAAIwkB,EAAgB,GAAG3M,IAAM,GAGlF+M,EAAkB,SAACvjB,GACvB,QAAc+U,IAAV/U,EAAqB,OAAOsjB,EAGhC,IAAME,EAAaL,EAAgB3G,KAAK,SAAA7G,GAEtC,GAAIA,EAAKa,MAAQxW,EAAO,OAAO,EAG/B,GAAI6hB,OAAOlM,EAAKa,OAASqL,OAAO7hB,GAAQ,OAAO,EAG/C,IAAMyjB,EAAUvN,OAAOP,EAAKa,KACtBkN,EAAWxN,OAAOlW,GACxB,OAAK2jB,MAAMF,KAAaE,MAAMD,IAAaD,IAAYC,CAKzD,GAEA,OAAIF,EAEKA,EAAWhN,IAIb8M,CACT,EAEMpd,EAAoCK,EAA0B,iBAE5Dqd,EAAkD,QAAnClhB,EAAAsgB,QAAAA,EAAmBD,SAAgB,IAAArgB,EAAAA,EAAA4gB,EAExD,OADmBC,EAAgBK,EAErC,GALOC,OAAeC,OAQhBC,EAAeV,OACItO,IAApBiO,EAAgCO,EAAgBP,GAAmBM,EACpEO,EAGJpY,EAAU,WACRjB,QAAQC,IAAI,4BAA6BsZ,EAAc,eAAgBA,GACvEvZ,QAAQC,IAAI,+BAAgC0Y,EAAgBvX,IAAI,SAAA+J,GAAQ,MAAC,CAAEa,IAAKb,EAAKa,IAAKlR,YAAaqQ,EAAKa,IAAM,IAClHhM,QAAQC,IAAI,+BAAgCuY,EAAiB,gBAAiBK,EAC/E,EAAE,CAACU,EAAcZ,EAAiBH,EAAiBK,IAEpD,IAAMW,EAAiBvW,EACrB,SAAC+I,EAAsB/Q,GACrB,IAAIA,EAAJ,CACK4d,GACHS,EAAiBtN,GAGnB,IACMyN,EAAsC,iBADvBpB,EAAM,IAC4C,iBAARrM,EAAmBA,EAAsB,iBAARA,EAAmBqL,OAAOrL,GAAOA,EAIjI,GAHA9C,SAAAA,EAAWuQ,GAGPf,GAA0B,cAAZhS,EAAyB,CACzC,IAAMgT,EAAmBC,EAAQnR,QAAQoR,EAAa5N,IAChD6N,EAAYC,EAAatR,QAC/B,GAAIkR,GAAoBG,EAAW,CAEjCE,EAAevR,SAAU,EAGzB,IAoBIwR,EApBEC,EAAiB,WACrB,GAAKJ,GAAcK,EAAa1R,SAAYkR,EAA5C,CACA,IAAMS,EAAgBN,EAAUO,wBAC1BC,EAAUX,EAAiBU,wBAEjC,GAAID,EAActgB,MAAQ,GAAKwgB,EAAQxgB,MAAQ,EAAG,CAGhD,IAAMygB,EAAaT,EAAUS,YAAc,EACrC5Y,EAAO2Y,EAAQ3Y,KAAOyY,EAAczY,KAAO4Y,EAC3CzgB,EAAQwgB,EAAQxgB,MACtB0gB,EAAkB,CAChB1gB,MAAO,GAAGlC,OAAAkC,EAAS,MACnB6H,KAAM,GAAG/J,OAAA+J,EAAQ,MACjBhH,QAAS,GAEZ,CAfoE,CAgBvE,EAIM8f,EAAe,WACnBP,IACAnX,aAAakX,GACbA,EAAgBnX,WAAW,WAEzBoX,IACAF,EAAevR,SAAU,EACzBqR,EAAUtJ,oBAAoB,SAAUiK,EACzC,EAAE,IACL,EAEAX,EAAUvJ,iBAAiB,SAAUkK,EAAc,CAAEC,SAAS,IAG9Df,EAAiBgB,eAAe,CAC9BC,SAAU,SACVC,MAAO,UACPC,OAAQ,WAIVC,sBAAsB,WACpBA,sBAAsB,WACpBb,GACF,EACF,EACD,CACF,CAlEoB,CAmEvB,EACA,CAACpB,EAAc3P,EAAUmP,EAAOK,EAAYhS,IAGxCqU,EAAapC,EAAgB3G,KAAK,SAAC7G,GAEvC,GAAIA,EAAKa,MAAQuN,EAAc,OAAO,EACtC,GAAIlC,OAAOlM,EAAKa,OAASqL,OAAOkC,GAAe,OAAO,EAEtD,IAAMN,EAAUvN,OAAOP,EAAKa,KACtBgP,EAAatP,OAAO6N,GAC1B,OAAKJ,MAAMF,KAAaE,MAAM6B,IAAe/B,IAAY+B,CAE3D,GACMC,EAAcnjB,GAAgB,UAG9B6hB,EAAUzJ,EAAiD,CAAA,GAG3D0J,EAAe,SAAC5N,GAAiC,OAAAqL,OAAOrL,IACxDkO,EAAehK,EAAuB,MACtCgL,EAAsBhL,EAAuB,MAC7C4J,EAAe5J,EAAuB,MACtCiL,EAAyBjL,EAAuB,MAChDkL,EAAsBlL,EAAwB,IACzBA,EAAoB,IAAI1Q,KACnD,IAAMua,EAAiB7J,GAAgB,GACjCrU,EAAsCE,EAA8B,CACxElC,MAAO,EACP6H,KAAM,EACNhH,QAAS,IAHJ2gB,EAAcxf,EAAA,GAAE0e,OAKjBze,EAAoDC,EAA8B,CACtFlC,MAAO,EACP6H,KAAM,EACNhH,QAAS,IAHJ4gB,EAAqBxf,EAAA,GAAEyf,OAOxBC,GAA0BvY,EAAY,WAC1B,cAAZyD,GAA4BoT,EAAatR,SAAY+Q,GAKzDuB,sBAAsB,WACpBA,sBAAsB,WAEpB,GAAKZ,EAAa1R,SAAYsR,EAAatR,QAA3C,CAIA,IAAIiT,EAAY9B,EAAQnR,QAAQoR,EAAaL,IAG7C,IAAKkC,GAAa9C,EAAgBxkB,OAAS,EAAG,CAC5C,IAAMunB,EAAW/C,EAAgB,GAAG3M,IACpCyP,EAAY9B,EAAQnR,QAAQoR,EAAa8B,GAC1C,CAED,GAAKD,EAAL,CAIA,IAAMtB,EAAgBL,EAAatR,QAAQ4R,wBACrCC,EAAUoB,EAAUrB,wBAG1B,GAA4B,IAAxBD,EAActgB,OAAiC,IAAlBwgB,EAAQxgB,MAAzC,CASA,IAAMygB,EAAaR,EAAatR,QAAQ8R,YAAc,EAChD5Y,EAAO2Y,EAAQ3Y,KAAOyY,EAAczY,KAAO4Y,EAC3CzgB,EAAQwgB,EAAQxgB,MAChB8hB,EAAU,GAAGhkB,OAAA+J,QACbka,EAAW,GAAGjkB,OAAAkC,QAGpB0gB,EAAkB,SAACsB,GACjB,OAAIA,EAAKna,OAASia,GAAWE,EAAKhiB,QAAU+hB,GAA6B,IAAjBC,EAAKnhB,QACpDmhB,EAEF,CACLhiB,MAAO+hB,EACPla,KAAMia,EACNjhB,QAAS,EAEb,EAvBC,CARA,CAZA,CA4CH,EACF,EACD,EAAE,CAACgM,EAAS6S,EAAcZ,IAGrBmD,GAAiC7Y,EAAY,WACjC,eAAZyD,GAA6ByU,EAAuB3S,SAAY0S,EAAoB1S,SAAY+Q,GAKpGuB,sBAAsB,WACpBA,sBAAsB,WAEpB,GAAKI,EAAoB1S,SAAY2S,EAAuB3S,QAA5D,CAIA,IAAIiT,EAAY9B,EAAQnR,QAAQoR,EAAaL,IAG7C,IAAKkC,GAAa9C,EAAgBxkB,OAAS,EAAG,CAC5C,IAAM4nB,EAAWpD,EAAgB,GAAG3M,IACpCyP,EAAY9B,EAAQnR,QAAQoR,EAAamC,GAC1C,CAED,GAAKN,EAAL,CAIA,IAAMtB,EAAgBgB,EAAuB3S,QAAQ4R,wBAC/CC,EAAUoB,EAAUrB,wBAG1B,GAA4B,IAAxBD,EAActgB,OAAiC,IAAlBwgB,EAAQxgB,MAAzC,CAIA,IAAM6H,EAAO2Y,EAAQ3Y,KAAOyY,EAAczY,KACpC7H,EAAQwgB,EAAQxgB,MAChB8hB,EAAU,GAAGhkB,OAAA+J,QACbka,EAAW,GAAGjkB,OAAAkC,QAGpB0hB,EAAyB,SAACM,GACxB,OAAIA,EAAKna,OAASia,GAAWE,EAAKhiB,QAAU+hB,GAA6B,IAAjBC,EAAKnhB,QACpDmhB,EAEF,CACLhiB,MAAO+hB,EACPla,KAAMia,EACNjhB,QAAS,EAEb,EAjBC,CARA,CAZA,CAsCH,EACF,EACD,EAAE,CAACgM,EAAS6S,EAAcZ,IAG3B1X,EAAU,WAEHsY,EAMD6B,EAAoB5S,UAAY+Q,IAKpC6B,EAAoB5S,QAAU+Q,EAId,cAAZ7S,GAA2BoT,EAAatR,UAAYuR,EAAevR,SACrEgT,KAIc,eAAZ9U,GAA4ByU,EAAuB3S,SAAW0S,EAAoB1S,SACpFsT,MApBAV,EAAoB5S,QAAU,EAsBlC,EAAG,CAAC+Q,EAAc7S,EAASiS,EAAgBxkB,OAAQ0kB,EAAc2C,GAAyBM,KAI1F7a,EAAU,WACR,GAAKsY,EAAL,CAGA,IAAM3W,EAAQC,WAAW,WACvB,GAAgB,cAAZ6D,GAEI+U,EAAY9B,EAAQnR,QAAQoR,EAAaL,MAC9BO,EAAatR,SAAW0R,EAAa1R,UACpDgT,KAGI9C,GACF+C,EAAUf,eAAe,CACvBC,SAAU,SACVC,MAAO,UACPC,OAAQ,iBAIT,GAAgB,eAAZnU,EAA0B,CAEnC,IAAM+U,EACN,IADMA,EAAY9B,EAAQnR,QAAQoR,EAAaL,MAC9B4B,EAAuB3S,SAAW0S,EAAoB1S,QAAS,CAC9E,IAAM2R,EAAgBgB,EAAuB3S,QAAQ4R,wBAC/CC,EAAUoB,EAAUrB,wBAE1B,GAAID,EAActgB,MAAQ,GAAKwgB,EAAQxgB,MAAQ,EAAG,CAChD,IAAM6H,EAAO2Y,EAAQ3Y,KAAOyY,EAAczY,KACpC7H,EAAQwgB,EAAQxgB,MAChB8hB,EAAU,GAAGhkB,OAAA+J,QACbka,EAAW,GAAGjkB,OAAAkC,QAEpB0hB,EAAyB,CACvB1hB,MAAO+hB,EACPla,KAAMia,EACNjhB,QAAS,GAEZ,CACF,CACF,CACF,EAAE,KAEH,OAAO,WAAM,OAAAoI,aAAaF,EAAM,CA1CN,CA4C3B,EAAE,IAIH3B,EAAU,WACR,GAAKyX,GAA0B,cAAZhS,GAA4B6S,IAG3CQ,EAAevR,QAAnB,CAEA,IAAM5F,EAAQC,WAAW,WACvB,IAAM4Y,EAAY9B,EAAQnR,QAAQoR,EAAaL,IACzCyC,EAAYlC,EAAatR,QAC/B,GAAIiT,GAAaO,EAAW,CAC1BjC,EAAevR,SAAU,EAGzB,IAoBIyT,EApBEC,EAAiB,WACrB,GAAKF,GAAc9B,EAAa1R,SAAYiT,EAA5C,CACA,IAAMtB,EAAgB6B,EAAU5B,wBAC1BC,EAAUoB,EAAUrB,wBAE1B,GAAID,EAActgB,MAAQ,GAAKwgB,EAAQxgB,MAAQ,EAAG,CAGhD,IAAMygB,EAAa0B,EAAU1B,YAAc,EACrC5Y,EAAO2Y,EAAQ3Y,KAAOyY,EAAczY,KAAO4Y,EAC3CzgB,EAAQwgB,EAAQxgB,MACtB0gB,EAAkB,CAChB1gB,MAAO,GAAGlC,OAAAkC,EAAS,MACnB6H,KAAM,GAAG/J,OAAA+J,EAAQ,MACjBhH,QAAS,GAEZ,CAf6D,CAgBhE,EAIMyhB,EAAe,WACnBD,IACApZ,aAAamZ,GACbA,EAAgBpZ,WAAW,WACzBqZ,IACAnC,EAAevR,SAAU,EACzBwT,EAAUzL,oBAAoB,SAAU4L,EACzC,EAAE,IACL,EAEAH,EAAU1L,iBAAiB,SAAU6L,EAAc,CAAE1B,SAAS,IAE9DgB,EAAUf,eAAe,CACvBC,SAAU,SACVC,MAAO,UACPC,OAAQ,WAIVC,sBAAsB,WACpBA,sBAAsB,WACpBoB,GACF,EACF,EACD,CACF,EAAE,IAEH,OAAO,WAAM,OAAApZ,aAAaF,EAAM,CAzDG,CA0DpC,EAAE,CAAC2W,EAAcb,EAAYhS,IAG9B,IACQ0V,GA8bR,OACEziB,EAAA,MAAA,CAAK6B,UAAU,oBAAmBpD,SAAA,CACnB,cAAZsO,GAhcG0V,GAAsC,CAC1Czf,QAAS,OACTC,WAAY,SACZxD,IAAK,OACLwb,aAAc,oBACdkD,cAAe,IACf9a,SAAU,YAIR0b,IACF0D,GAAepE,UAAY,OAC3BoE,GAAenE,UAAY,SAC3BmE,GAAeC,eAAiB,SAEhCD,GAAeE,eAAiB,OAEhCF,GAAeG,wBAA0B,SAIzC5iB,EAAA,MAAAhG,EAAA,CACE+Y,IAAKoN,EACLte,UAAW,8BAA8B7D,OAAA+gB,EAAa,sBAAwB,GAAE,KAAA/gB,OAAI6D,GACpFxB,MAAOoiB,IACHxgB,EAAI,CAAAxD,SAAA,CAGRG,EACE,MAAA,CAAAmU,IAAKwN,EACLlgB,MAAKrG,EAAA,CACHqJ,SAAU,WACVgF,OAAQ,OACRlJ,OAAQ,MACR4E,gBAAiBud,EACjB9d,aAAc,cACdI,WAAY,6GACT8d,KAIN1C,EAAgBvX,IAAI,SAAC+J,GAEpB,IAAME,EAAW,WAEf,GAAIF,EAAKa,MAAQuN,EACf,OAAO,EAGT,GAAIlC,OAAOlM,EAAKa,OAASqL,OAAOkC,GAC9B,OAAO,EAGT,IAAMN,EAAUvN,OAAOP,EAAKa,KACtBgP,EAAatP,OAAO6N,GAC1B,OAAKJ,MAAMF,KAAaE,MAAM6B,IAAe/B,IAAY+B,CAI1D,CAhBgB,GA8BjB,OAXI7P,EAAKa,MAAQ2M,EAAgB,GAAG3M,KAClChM,QAAQC,IAAI,8BAA+B,CACzCuc,QAASrR,EAAKa,IACdyQ,mBAAoBtR,EAAKa,IACzBuN,aAAYA,EACZmD,wBAAyBnD,EACzBlO,SAAQA,EACR3E,QAAOA,IAKT/M,EAAA,MAAA,CAEE+S,IAAK,SAACC,GACJgN,EAAQnR,QAAQoR,EAAazO,EAAKa,MAAQW,CAC3C,EACDvR,QAAS,WAAM,OAAAoe,EAAerO,EAAKa,IAAKb,EAAKlQ,SAAS,EACtDjB,MAAO,CACLgD,SAAU,WACVuG,QAAS,SACTlG,OAAQ8N,EAAKlQ,SAAW,cAAgB,UACxC0B,QAAS,OACTC,WAAY,SACZxD,IAAK,MACLsB,QAASyQ,EAAKlQ,SAAW,GAAM,EAC/BsC,WAAY,yBAEZT,WAAY4b,EAAa,OAAInO,EAC7BoS,WAAYjE,EAAa,cAAWnO,GACrCnS,SAAA,CAGA+S,EAAK1P,MAAQ,iBAENmhB,SAAkBzR,EAAK1P,KACvBohB,EAAiBnV,EAAMoV,eAAe3R,EAAK1P,MASjD,OARAuE,QAAQC,IAAI,2BAA4B,CACtCuc,QAASrR,EAAKa,IACd4Q,SAAQA,EACRC,eAAcA,EACdE,UAAW5R,EAAK1P,OAIdiM,EAAMoV,eAAe3R,EAAK1P,MAE1BlD,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW4P,EAAc,UAChC1d,WAAY,0BACbnF,SAEAsP,EAAMC,aAAawD,EAAK1P,KAAiC,CACxD5B,MAAO,GACPf,OAAQ,GACRkB,MAAKrG,EAAAA,EAAA,CAAA,EACwB,QAAvBuE,EAAAiT,EAAK1P,KAAKiE,aAAa,IAAAxH,OAAA,EAAAA,EAAE8B,OAAK,CAClCN,MAAO2R,EAAW4P,EAAc,UAChC1d,WAAY,+BAQG,mBAAd4N,EAAK1P,KAEZlD,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW4P,EAAc,UAChC1d,WAAY,0BACbnF,SAEAsP,EAAM3C,cAAcoG,EAAK1P,KAAkC,CAC1D5B,MAAO,GACPf,OAAQ,GACRkB,MAAO,CACLN,MAAO2R,EAAW4P,EAAc,eASxC1iB,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW4P,EAAc,UAChC1d,WAAY,0BACbnF,SAEA+S,EAAK1P,MAGX,CA/Ea,GAkFdlD,EAAA,OAAA,CACEyB,MAAO,CACLf,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZxD,MAAO2R,EAAW4P,EAAc,UAChC/hB,WAAY,QACZqE,WAAY,0BAGbnF,SAAA+S,EAAK/U,aAIQmU,IAAfY,EAAK6R,OAAsC,OAAf7R,EAAK6R,OAChCzkB,EAAA,MAAA,CACEyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB6G,SAAU,OACV5K,OAAQ,OACRyK,QAAS,QACTpG,aAAc,OACdO,gBAAiB,UACjBN,OAAQ,oBACR1D,MAAO,UACPT,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZhE,WAAY,IACZqE,WAAY,wBACbnF,SAEA+S,EAAK6R,QAKT7R,EAAK8R,gBA7ID9R,EAAKa,YAsJQ,WAC5B,IAAMoQ,EAAsC,CAC1Czf,QAAS,OACTC,WAAY,SACZc,gBAAiB,UACjBP,aAAc,MACdoG,QAAS,MACTnG,OAAQ,oBACRhE,IAAK,MACL4D,SAAU,YAUZ,OANEof,EAAeviB,MADF,UAAXye,EACqB,OAGA,cAIvB3e,EAAA,MAAAhG,EAAA,CACE+Y,IAAKyO,EACL3f,UAAW,wCAAA7D,OAAwC2gB,EAAM,KAAA3gB,OAAI6D,GAC7DxB,MAAOoiB,GACHxgB,EAAI,CAAAxD,SAAA,CAGRG,EACE,MAAA,CAAAmU,IAAKwO,EACLlhB,MAAKrG,EAAA,CACHqJ,SAAU,WACVyE,IAAK,MACLO,OAAQ,MACR7E,aAAc,MACdO,gBAAiB,UACjBN,OAAQ,OACRO,UAAW,wCACXJ,WAAY,4GACZqE,cAAe,QACZ0Z,KAIN3C,EAAgBvX,IAAI,SAAC+J,GAEpB,IAAME,EAAW,WAEf,GAAIF,EAAKa,MAAQuN,EACf,OAAO,EAGT,GAAIlC,OAAOlM,EAAKa,OAASqL,OAAOkC,GAC9B,OAAO,EAGT,IAAMN,EAAUvN,OAAOP,EAAKa,KACtBgP,EAAatP,OAAO6N,GAC1B,OAAKJ,MAAMF,KAAaE,MAAM6B,IAAe/B,IAAY+B,CAI1D,CAhBgB,GAmBb7P,EAAKa,MAAQ2M,EAAgB,GAAG3M,KAClChM,QAAQC,IAAI,8BAA+B,CACzCuc,QAASrR,EAAKa,IACdyQ,mBAAoBtR,EAAKa,IACzBuN,aAAYA,EACZmD,wBAAyBnD,EACzBlO,SAAQA,EACR3E,QAAOA,IAIX,IAAMwW,EAAiC,CACrClgB,SAAU,WACVuG,QAAS,WACTlG,OAAQ8N,EAAKlQ,SAAW,cAAgB,UACxC0B,QAAS,OACTC,WAAY,SACZxD,IAAK,MACL+D,aAAc,MACdzC,QAASyQ,EAAKlQ,SAAW,GAAM,EAC/BwI,KAAiB,UAAX6U,EAAqB,EAAI,OAC/Bzb,eAAgB,SAChBa,gBAAiB,cACjBN,OAAQ,wBACRG,WAAY,yBACZoE,OAAQ,GAGV,OACEhI,EAAA,MAAA,CAEE+S,IAAK,SAACC,GACJgN,EAAQnR,QAAQoR,EAAazO,EAAKa,MAAQW,GAE5CvR,QAAS,WAAM,OAAAoe,EAAerO,EAAKa,IAAKb,EAAKlQ,SAAS,EACtDjB,MAAOkjB,EAAS9kB,SAAA,CAGf+S,EAAK1P,MAAQ,iBAEZ,OAAIiM,EAAMoV,eAAe3R,EAAK1P,MAE1BlD,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW,UAAY,UAC9B9N,WAAY,0BACbnF,SAEAsP,EAAMC,aAAawD,EAAK1P,KAAiC,CACxD5B,MAAO,GACPf,OAAQ,GACRkB,MAAKrG,EAAAA,EAAA,CAAA,EACwB,QAAvBuE,EAAAiT,EAAK1P,KAAKiE,aAAa,IAAAxH,OAAA,EAAAA,EAAE8B,OAAK,CAClCN,MAAO2R,EAAW,UAAY,UAC9B9N,WAAY,+BAQG,mBAAd4N,EAAK1P,KAEZlD,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW,UAAY,UAC9B9N,WAAY,0BACbnF,SAEAsP,EAAM3C,cAAcoG,EAAK1P,KAAkC,CAC1D5B,MAAO,GACPf,OAAQ,GACRkB,MAAO,CACLN,MAAO2R,EAAW,UAAY,eAStC9S,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACRY,MAAO2R,EAAW,UAAY,UAC9B9N,WAAY,0BACbnF,SAEA+S,EAAK1P,MAGX,CArEa,GAwEdlD,EAAA,OAAA,CACEyB,MAAO,CACLf,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZxD,MAAO2R,EAAW,UAAY,UAC9BnS,WAAY,QACZqE,WAAY,0BAGbnF,SAAA+S,EAAK/U,aAIQmU,IAAfY,EAAK6R,OAAsC,OAAf7R,EAAK6R,OAChCzkB,EAAA,MAAA,CACEyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB6G,SAAU,OACV5K,OAAQ,OACRyK,QAAS,QACTpG,aAAc,OACdO,gBAAiB,UACjBN,OAAQ,oBACR1D,MAAO,UACPT,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZhE,WAAY,IACZqE,WAAY,wBACbnF,SAEA+S,EAAK6R,QAKT7R,EAAK8R,gBAvHD9R,EAAKa,UA6HtB,CAIwDmR,GAGnDzE,GAA0B,cAAZhS,GACbnO,EAAA,QAAA,CAAAH,SACG,iNAUK,aAATqgB,IAAuBsC,aAAA,EAAAA,EAAY3iB,WAClCG,EAAA,MAAA,CAAKiD,UAAU,kBAAkBxB,MAAO,CAAE2J,UAAW,QAAQvL,SAC1D2iB,EAAW3iB,aAKtB,EC14BMglB,GAAoC,SAACllB,GACzC,IAAA2C,EAAW3C,EAAAmlB,QAAXA,OAAO,IAAAxiB,EAAG,EAACA,EACXE,EAAe7C,EAAA4C,KAAfA,OAAI,IAAAC,EAAG,SAAQA,EACfC,EAAW9C,EAAA2B,MAAXA,OAAK,IAAAmB,EAAG,IAAGA,EACX2D,UACe2e,EAAiBplB,EAAAqlB,cAChCriB,gBAAAsiB,OAAc,IAAAtiB,KACdG,EAAAnD,EAAAulB,SAAAA,OAAW,IAAApiB,GAAKA,EAChBE,WAAAmiB,OAAS,IAAAniB,EAAA,WACTG,EAAAxD,EAAAsD,UAAAA,aAAY,GAAEE,EACd1B,EAAK9B,EAAA8B,MACL2jB,EAAWzlB,EAAAylB,YACX9hB,EAAsB3D,EAAA0lB,WAAtBA,OAAU,IAAA/hB,EAAG,UAASA,EACnBD,EAAIlH,EAAAwD,EAbkC,qIAejCJ,EAAiBW,iBAGnBolB,EAAoBje,KAAKmL,IAAI,IAAKnL,KAAK2L,IAAI,EAAG8R,IAG9CS,EAAgB5N,GAAO,GACvBpU,EAAoCC,GAAS,GAA5CgiB,EAAajiB,EAAA,GAAEkiB,EAAgBliB,EAAA,GAChCI,EAA0CH,EAAS,GAAlDkiB,EAAgB/hB,EAAA,GAAEgiB,EAAkChiB,EAAA,GAE3D+E,EAAU,WACR,GAAIwc,GAAYK,EAActV,SAAWqV,EAAoB,EAAG,CAE9DC,EAActV,SAAU,EAExB0V,EAAoB,GACpBF,GAAiB,GAEjBlD,sBAAsB,WACpBA,sBAAsB,WACpBoD,EAAoBL,EACtB,EACF,GAEA,IAAM9a,EAAQF,WAAW,WACvBmb,GAAiB,GACjBE,EAAoBL,EACrB,EAAE,KACH,OAAO,WAAM,OAAA/a,aAAaC,EAAM,CACjC,CAAU+a,EAActV,SAEvBsV,EAActV,SAAU,EACxBwV,GAAiB,GACjBE,EAAoBL,IAGpBK,EAAoBL,EAExB,EAAG,CAACJ,EAAUI,IAGd,IAAIM,EAAmBR,GAAe7lB,GAAgB,UAGvC,YAAX4lB,EACFS,EAAmB,UACC,cAAXT,IACTS,EAAmB,WAIrB,IAAMZ,EAAiCD,GA/EhB,SAkFjBhjB,EAAcsF,KAAK2L,IAAI,EAAG3L,KAAKwe,MAAc,IAARvkB,IAGrCwkB,GAAUxkB,EAAQS,GAAe,EAGjCgkB,EAA4B,eAATxjB,EAAwBjB,EAAQ,EAAIA,EAGvD0kB,EAtFC,OAwFDC,EAnFC,OAsFDC,EAAuB,WAE3B,IAAMC,EAAkB/f,GAA2B,YAAlB4e,EAC7B1jB,EAAQ,EAAI,GAAK,EACjBA,EAGE8kB,EAAgB,EAAI/e,KAAKgf,GAAKP,EAG9BvK,EAAS6K,GADQZ,EAAgBE,EAAmBJ,GACT,IAAOc,EAExD,OACEhlB,EACE,MAAA,CAAAK,MAAO,CACLgD,SAAU,WACVnD,MAAOA,EACPf,OAAQ4lB,EACR/hB,QAAS,OACTC,WAAY,SACZC,eAAgB,UAIlBzE,SAAA,CAAAuB,EAAA,MAAA,CACEE,MAAOA,EACPf,OAAQe,EACRG,MAAO,CACLgD,SAAU,WACVyE,IAAK,EACLC,KAAM,GACPtJ,SAAA,CAGDG,YACE2B,GAAIL,EAAQ,EACZM,GAAIN,EAAQ,EACZO,EAAGikB,EACHtkB,KAAK,OACLM,OAAQujB,EACRtjB,YAAaA,EACbC,cAAc,UAGhBhC,EAAA,SAAA,CACE2B,GAAIL,EAAQ,EACZM,GAAIN,EAAQ,EACZO,EAAGikB,EACHtkB,KAAK,OACLM,OAAQ8jB,EACR7jB,YAAaA,EACbC,cAAc,QACdC,gBAAiBmkB,EACjBlkB,iBAAkBqZ,EAClBxQ,UAAW,cAAA3L,OAAckC,EAAQ,cAAKA,EAAQ,EAAI,KAClDG,MAAO,CACLuD,WAAYwgB,EAAgB,8BAAgC,aAMjEpf,GAA2B,WAAlB4e,EACR5jB,EAAA,MAAA,CACEK,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,MACL6B,UAAW,wBACXqR,UAAW,SACXhY,QAAS,OACTkF,cAAe,SACfjF,WAAY,SACZC,eAAgB,SAChBzD,IAAK,GAGPhB,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACLf,SAAUslB,EACV7kB,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAAuG,IAEF6e,GACCjlB,EAAA,MAAA,CACEyB,MAAO,CACLf,SAAUulB,EACVvhB,WAAY,IACZvD,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAA,GAAAT,OAAGiI,KAAKwe,MAAMP,GAAqB,UAK1ClkB,EAAAC,EAAA,CAAAxB,SAAA,CACGolB,GACCjlB,EACE,MAAA,CAAAyB,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,GAAG9J,OAAAkC,EAAQ,EAAC,MACjByJ,UAAW,wBACXqR,UAAW,SACX1b,SAAUulB,EACVvhB,WAAY,IACZvD,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAA,GAAAT,OAAGiI,KAAKwe,MAAMP,UAGlBlf,GAA2B,YAAlB4e,GACRhlB,EAAA,MAAA,CACEyB,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,GAAG9J,OAAAkC,EAAS,MACjByJ,UAAW,mBACXK,UAAW,MACXgR,UAAW,SACX1b,SAAUslB,EACV7kB,MAAO,UACPwD,WAAY,sBACZhE,WAAY,QACbd,SAEAuG,SAOf,EAgKMyd,KACJzf,QAAS,cACTkF,cAAe,SACfjF,WAAY,SACZ/C,MAAOA,GACJG,GAgBL,OACEzB,WACEiD,UAAW,qCAA8BV,EAAI,KAAAnD,OAAI6D,GACjDxB,MAAOoiB,GACHxgB,EAAI,CAAAxD,SAhBW,WACrB,OAAQ0C,GACN,IAAK,SACH,OAAO2jB,IACT,IAAK,aACH,OAnKEI,EAASvkB,EAAc,EACvBwkB,EAAOjlB,EAAQS,EAAc,EAE7BykB,GALAC,EAAYV,EADChkB,GAMSA,EAAc,EAIpC2kB,EAAeX,EAAmB,EAVrBhkB,EAUuC,EAAIA,EAAc,EAKtEokB,EAAkB/f,GAA2B,YAAlB4e,EADLyB,EAEF,EAAI,GAAK,EAFPA,EAMtBE,EAA0Btf,KAAKgf,GAAKP,EAGpCc,EAAmBD,GADFnB,EAAgBE,EAAmBJ,GACW,IAAOqB,EAG1EvlB,EACE,MAAA,CAAAK,MAAO,CACLgD,SAAU,WACVnD,MAAOA,EACPf,OAAQ4lB,EACRrb,SAAU,UACXjL,SAAA,CAGDuB,SACEE,MAAOA,EACPf,OAAQkmB,EACRllB,QAAS,cAAOD,EAAK,KAAAlC,OAAIqnB,GACzBhlB,MAAO,CACLgD,SAAU,WACVyE,IAAK,EACLC,KAAM,GACPtJ,SAAA,CAGDG,UACE8F,EAAG,KAAK1G,OAAAknB,cAAUE,EAAO,OAAApnB,OAAM0mB,EAAM,KAAA1mB,OAAI0mB,EAAgB,WAAA1mB,OAAAmnB,EAAQ,KAAAnnB,OAAAonB,GACjEhlB,KAAK,OACLM,OAAQujB,EACRtjB,YAAaA,EACbC,cAAc,UAGhBhC,EAAA,OAAA,CACE8F,EAAG,KAAA1G,OAAKknB,EAAM,KAAAlnB,OAAIonB,EAAa,OAAApnB,OAAA0mB,EAAU,KAAA1mB,OAAA0mB,oBAAgBS,EAAI,KAAAnnB,OAAIonB,GACjEhlB,KAAK,OACLM,OAAQ8jB,EACR7jB,YAAaA,EACbC,cAAc,QACdC,gBAAiB0kB,EACjBzkB,iBAAkB0kB,EAClBnlB,MAAO,CACLuD,WAAYwgB,EAAgB,8BAAgC,aAMjEpf,GAA2B,WAAlB4e,EACR5jB,EAAA,MAAA,CACEK,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,GAAG9J,OAAAsnB,EAAe,MACvB3b,UAAW,wBACXqR,UAAW,SACXhY,QAAS,OACTkF,cAAe,SACfjF,WAAY,SACZC,eAAgB,SAChBzD,IAAK,GAGPhB,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACLf,SAAUslB,EACV7kB,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAAuG,IAEF6e,GACCjlB,EAAA,MAAA,CACEyB,MAAO,CACLf,SAAUulB,EACVvhB,WAAY,IACZvD,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAA,GAAAT,OAAGiI,KAAKwe,MAAMP,GAAqB,UAK1ClkB,EAAAC,EAAA,CAAAxB,SAAA,CACGolB,GACCjlB,EACE,MAAA,CAAAyB,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,GAAA9J,OAAGsnB,EAAW,MACnB3b,UAAW,wBACXqR,UAAW,SACX1b,SAAUulB,EACVvhB,WAAY,IACZvD,MAAO,UACPwD,WAAY,sBACZhE,WAAY,GAGbd,SAAA,GAAAT,OAAGiI,KAAKwe,MAAMP,UAGlBlf,GAA2B,YAAlB4e,GACRhlB,EAAA,MAAA,CACEyB,MAAO,CACLgD,SAAU,WACV0E,KAAM,MACND,IAAK,GAAA9J,OAAGqnB,EAAS,MACjB1b,UAAW,mBACXK,UAAW,MACXgR,UAAW,SACX1b,SAAUslB,EACV7kB,MAAO,UACPwD,WAAY,sBACZhE,WAAY,QACbd,SAEAuG,UAwBX,QAEE,OADAqB,QAAQsF,KAAK,yBAAkBxK,EAAI,uDAC5B2jB,IA9KoB,IAMzBO,EAEAH,EACAC,EAEAC,EAIAE,EAKAP,EAKAQ,EAGAC,CAoJR,CAQKC,KAGP,ECvaMC,GAAQC,EACZ,SACEpnB,EAqBAwU,GApBE,IAAA7R,SAAApB,aAAO,SAAQoB,EACfE,EAAgB7C,EAAA+C,SAAhBA,OAAQ,IAAAF,GAAQA,EAChBC,UAAAsD,cAAatD,EACbE,EAAAhD,EAAAqnB,SAAAA,OAAQ,IAAArkB,GAAQA,EAChBskB,EAAMtnB,EAAAsnB,OACNC,EAAMvnB,EAAAunB,OACNpkB,EAAkBnD,EAAAwnB,WAAlBA,OAAa,IAAArkB,KACbskB,EAAOznB,EAAAynB,QACPpkB,cAAAC,aAAY,GAAED,EACdvB,EAAK9B,EAAA8B,MACL0B,EAAAxD,EAAA4C,KAAAA,OAAI,IAAAY,EAAG,OAAMA,EACbkkB,EAAW1nB,EAAA0nB,YACXpqB,EAAK0C,EAAA1C,MACL+iB,EAAYrgB,EAAAqgB,aACZrP,EAAQhR,EAAAgR,SACR+C,EAAO/T,EAAA+T,QACPC,EAAMhU,EAAAgU,OACN2T,EAAY3nB,EAAA2nB,aACTC,EAASprB,EAAAwD,EAnBd,8LAuBQ2D,EAA6BpD,IAAUX,aAAvCA,OAAY,IAAA+D,EAAG,UAASA,EAC1BkkB,EAAW7P,EAAyB,MACpCpU,EAAoC4L,EAAM3L,SAC9Cwc,GAAgB/iB,GAAS,IADpB6jB,OAAeC,OAGhBpd,EAAwBwL,EAAM3L,UAAS,GAAtCikB,EAAO9jB,EAAA,GAAE+jB,OAGhBhf,EAAU,WACW,mBAARyL,EACTA,EAAIqT,EAASvX,SACJkE,IACRA,EAAwDlE,QACvDuX,EAASvX,QAEf,EAAG,CAACkE,IAGJ,IAAMmM,OAAyBtO,IAAV/U,EACf+jB,EAAeV,EAAerjB,EAAQ6jB,EA0BtC6G,EAAc,SAACvrB,SACnBA,EAAEiP,kBACGiV,GACHS,EAAiB,IAOnBpQ,SAAAA,EAJuB,CACrByC,OAAQ,CAAEnW,MAAO,IACjBqO,cAAe,CAAErO,MAAO,MAG1BmqB,SAAAA,IACkB,QAAlBznB,EAAA6nB,EAASvX,eAAS,IAAAtQ,GAAAA,EAAAioB,OACpB,EAEMC,EAAYV,GAAcnG,IAAiBte,EAI3ColB,EAAa,CACjBxnB,MAAO,CACLC,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,OAEjBze,YAAa,CACXP,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,OAEjBxe,OAAQ,CACNR,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,OAEjBve,MAAO,CACLT,OAAQ,OACRwnB,WAAY,OACZxI,cAAe,SAMb9e,EADkBymB,GAAUW,EACK,OAAS,OAE1CG,KACJ1mB,MAAO,OACP4S,UAAW,aACXvP,WAAY,sBACZC,aAAc,MACdC,OAAQ,aAAAzF,OAAa2G,EAAQ,UAAY0hB,EAAUloB,EAAe,WAClE4F,gBAAiBzC,GAAuBskB,EAAZ,UAAmC,UAC/D7lB,MAAOuB,EAAW,UAAY,UAC9BhC,SAAU,OACVgE,WAAY,IACZ/D,WAAY,OACZH,YAAaymB,EAAS,OAAS,OAC/BxmB,eACAsnB,WAAYD,EAAW5mB,GAAM6mB,WAC7BxI,cAAeuI,EAAW5mB,GAAMqe,cAChCva,WAAY,WACZD,QAAS,OACTkjB,iBAAkB,OAClBC,cAAe,YACfC,WAAY,QACT1mB,GAuEL,OACEL,EAAAC,EAAA,CAAAxB,SAAA,CACEG,EAAQ,QAAA,CAAAH,SArEc,+pCAsEtBuB,EAAA,MAAA,CACE6B,UAAW,qBAAqB7D,OAAA6D,GAChCxB,MAAO,CACLgD,SAAU,WACVL,QAAS,cACTC,WAAY,SACZ/C,MAAO,QACRzB,SAAA,CAEAonB,GACCjnB,EAAA,OAAA,CACEyB,MAAO,CACLgD,SAAU,WACV0E,KAAM,OACN/E,QAAS,OACTC,WAAY,SACZlD,MAAOuB,EAAW,UAAY,UAC9B0G,OAAQ,EACRC,cAAe,QAGhBxJ,SAAAonB,IAGLjnB,aACEmU,IAAKqT,EACLjlB,KAAMA,EACNtF,MAAO+jB,EACPqG,YAAaA,EACb3kB,SAAUA,EACVskB,SAAUA,EACVrW,SAnMa,SAACvU,GACfkkB,GACHS,EAAiB3kB,EAAEgX,OAAOnW,OAE5B0T,SAAAA,EAAWvU,EACb,EA+LQsX,QA7LY,SAACtX,GACnBsrB,GAAW,GACXhU,SAAAA,EAAUtX,EACZ,EA2LQuX,OAzLW,SAACvX,GAClBsrB,GAAW,GACX/T,SAAAA,EAASvX,EACX,EAuLQgsB,UArLc,SAAChsB,SACP,UAAVA,EAAEqX,KAAmB6T,GACvBA,EAAalrB,GAEO,QAAtBuD,EAAA4nB,EAAUa,iBAAY,IAAAzoB,GAAAA,EAAA3D,KAAAurB,EAAAnrB,EACxB,EAiLQqF,MAAOumB,EACPK,aAAcd,EAAUc,cAAgB,MACxCC,YAAaf,EAAUe,aAAe,MACtCC,eAAgBhB,EAAUgB,gBAAkB,MAC5CC,WAAYjB,EAAUiB,aAAc,GAChCjB,KAEJL,GAAUW,IACVzmB,EACE,OAAA,CAAAK,MAAO,CACLgD,SAAU,WACV+E,MAAO,OACPpF,QAAS,OACTC,WAAY,SACZxD,IAAK,MACLM,MAAOuB,EAAW,UAAY,UAC9B0G,OAAQ,GAGTvJ,SAAA,CAAAgoB,GAAa7nB,EAjFN,WAAM,OACtBA,EAAA,MAAA,CACEsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACNhD,QAAS8kB,EACTlmB,MAAO,CACLqD,OAAQ,UACRP,WAAY,EACZpD,MAAO,WAGTtB,SAAAG,EAAA,OAAA,CACE8F,EAAE,uBACFhE,OAAO,eACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,aA8Da,CAAA,GACvB4X,GAAUlnB,EAAM,OAAA,CAAAyB,MAAO,CAAE4H,cAAe,QAAQxJ,SAAGqnB,YAMhE,GAGFJ,GAAMphB,YAAc,QCxRpB,IAAM+iB,GAAW1B,EACf,SACEpnB,EAkBAwU,GAjBE,IAAA7R,aAAAI,OAAW,IAAAJ,KACXE,EAAA7C,EAAAoG,MAAAA,cAAavD,EACbC,EAAA9C,EAAAqnB,SAAAA,OAAQ,IAAAvkB,GAAQA,EAChBE,EAAiBhD,EAAA+oB,UAAjBA,OAAS,IAAA/lB,GAAQA,EACjBgmB,EAAShpB,EAAAgpB,UACT7lB,EAAcnD,EAAAsD,UAAdA,OAAS,IAAAH,EAAG,GAAEA,EACdrB,EAAK9B,EAAA8B,MACL4lB,EAAW1nB,EAAA0nB,YACXpqB,UACA+iB,EAAYrgB,EAAAqgB,aACZhd,SAAA4lB,OAAO,IAAA5lB,EAAA,IACPG,EAAAxD,EAAAkpB,SAAAA,cAAgB1lB,EAChBwN,aACA+C,EAAO/T,EAAA+T,QACPC,EAAMhU,EAAAgU,OACH4T,EAASprB,EAAAwD,EAhBd,kKAoBQ2D,EAA6BpD,IAAUX,aAAvCA,OAAY,IAAA+D,EAAG,UAASA,EAC1BwlB,EAAcnR,EAA4B,MAC1CpU,EAAoC4L,EAAM3L,SAC9Cwc,GAAgB/iB,GAAS,IADpB6jB,OAAeC,OAGhBpd,EAAwBwL,EAAM3L,UAAS,GAAtCikB,EAAO9jB,EAAA,GAAE+jB,OACV3W,EAAsB5B,EAAM3L,cAA6BwO,GAAxDzR,EAAMwQ,EAAA,GAAEgY,OAGfrgB,EAAU,WACW,mBAARyL,EACTA,EAAI2U,EAAY7Y,SACPkE,IACRA,EAA2DlE,QAC1D6Y,EAAY7Y,QAElB,EAAG,CAACkE,IAGJ,IAAMmM,OAAyBtO,IAAV/U,EACf+jB,EAAeV,EAAerjB,EAAQ6jB,EACtCkI,EAAgBlK,OAAOkC,GAAgB,IAAIplB,OAoBjD8M,EAAU,WACR,GAAImgB,GAAYC,EAAY7Y,QAAS,CACnC,IAAMgZ,EAAWH,EAAY7Y,QACvBiZ,EACgB,iBAAbL,GAAwBA,EAASK,SAAe,EACnDC,EACgB,iBAAbN,EAAwBA,EAASM,aAAUnX,EAGpDiX,EAASxnB,MAAMlB,OAAS,OACxB,IAAM6oB,EAAeH,EAASG,aAGxBzoB,EAAauD,SACjB0H,OAAOyd,iBAAiBJ,GAAUtoB,YAAc,KAChD,IAEIsT,EAAYiV,EAAUvoB,EACtBye,EAAY+J,EAAUA,EAAUxoB,OAAaqR,EAE/CsX,EAAYjiB,KAAK2L,IAAIoW,EAAcnV,GACnCmL,IACFkK,EAAYjiB,KAAKmL,IAAI8W,EAAWlK,IAGlC6J,EAASxnB,MAAMlB,OAAS,GAAGnB,OAAAkqB,QAC3BP,EAAUO,EACX,CACH,EAAG,CAACtI,EAAc6H,IAElB,IAAMb,EACJ5sB,EAAAA,EAAA,CAAAkG,MAAO,OACP4S,UAAW,aACXvP,WAAY,sBACZC,aAAc,MACdC,OAAQ,oBAAakB,EAAQ,UAAY0hB,EAAUloB,EAAe,WAClE4F,gBAAiBzC,GAAuBskB,EAAZ,UAAmC,UAC/D7lB,MAAOuB,EAAW,UAAY,UAC9BhC,SAAU,OACVgE,WAAY,IACZ/D,WAAY,OACZqK,QAAS,YACT5F,UAAW,mCACXJ,WAAY,WACZD,QAAS,OACTwkB,OAAQV,EAAW,OAAS,WAC5B/jB,OAAQpC,EAAW,cAAgB,OACnCulB,iBAAkB,OAClBE,WAAY,aACGnW,IAAXzR,GAAwBsoB,EAAW,CAAEtoB,OAAQ,GAAAnB,OAAGmB,EAAU,OAAK,CAAE,GAClEkB,GAqCL,OACEL,EAAAC,EAAA,CAAAxB,SAAA,CACEG,EAAQ,QAAA,CAAAH,SAnCc,62BAoCtBuB,EAAA,MAAA,CACE6B,UAAW,wBAAwB7D,OAAA6D,GACnCxB,MAAO,CACLgD,SAAU,WACVL,QAAS,cACTkF,cAAe,SACfhI,MAAO,QAGTzB,SAAA,CAAAG,EAAA,WAAA5E,EAAA,CACE+Y,IAAK2U,EACL7rB,MAAO+jB,EACPqG,YAAaA,EACb3kB,SAAUA,EACVskB,SAAUA,EACV4B,KAAMC,OAAW7W,EAAY4W,EAC7BD,UAAWA,EACXhY,SA7Ha,SAACvU,GACfkkB,GACHS,EAAiB3kB,EAAEgX,OAAOnW,OAE5B0T,SAAAA,EAAWvU,EACb,EAyHQsX,QAvHY,SAACtX,GACnBsrB,GAAW,GACXhU,SAAAA,EAAUtX,EACZ,EAqHQuX,OAnHW,SAACvX,GAClBsrB,GAAW,GACX/T,SAAAA,EAASvX,EACX,EAiHQqF,MAAOumB,EACPK,aAAcd,EAAUc,cAAgB,MACxCC,YAAaf,EAAUe,aAAe,MACtCC,eAAgBhB,EAAUgB,gBAAkB,MAC5CC,WAAYjB,EAAUiB,aAAc,GAChCjB,KAENmB,GAAaC,IACb3oB,EACE,MAAA,CAAAyB,MAAO,CACL2C,QAAS,OACTE,eAAgB,WAChB8G,UAAW,MACX1K,SAAU,OACVC,WAAY,OACZQ,MAAOuB,EAAW,UAAY,UAC9BiC,WAAY,uBAGb9E,SAAA8oB,EACCvnB,oBACG4nB,EAAa,MAAKL,KAGrB3oB,EAAO,OAAA,CAAAH,SAAAmpB,WAOnB,GAGFP,GAAS/iB,YAAc,WCxNjB,IAAA8jB,GAAgC,SAAC7pB,OAC5B8pB,EAAiB9pB,EAAAmU,QAC1BxR,EAAsB3C,EAAA+pB,eAAtBA,OAAiB,IAAApnB,GAAKA,EACtBE,EAAgB7C,EAAA+C,SAAhBA,OAAW,IAAAF,GAAKA,EAChBmO,EAAQhR,EAAAgR,SACR9N,EAAOlD,EAAAkD,QACP8mB,EAAehqB,EAAAgqB,gBACfC,EAAiBjqB,EAAAiqB,kBACjBnnB,SAAAvB,aAAO,UAASuB,EAChBE,EAAAhD,EAAAiD,QAAAA,cAAeD,EACfG,EAAAnD,EAAAsD,UAAAA,aAAY,GAAEH,EACdrB,EAAK9B,EAAA8B,MAEGuB,EAA6B9C,IAAUX,aAAvCA,OAAY,IAAAyD,EAAG,UAASA,EAC1BG,EAAwCgM,EAAM3L,SAASkmB,GAAtDG,EAAe1mB,EAAA,GAAE2mB,OAClBxJ,OAAqCtO,IAAtByX,EACf3V,EAAUwM,EAAemJ,EAAoBI,EA+B7Cxb,EAjBa,CACjB/N,MAAO,CACLgB,MAAO,OACPf,OAAQ,OACRwpB,UAAW,OACXC,YAAa,MACbtpB,SAAU,QAEZupB,QAAS,CACP3oB,MAAO,OACPf,OAAQ,OACRwpB,UAAW,OACXC,YAAa,MACbtpB,SAAU,SAIYQ,GACpB8S,EAAYF,GAAWlR,EAGvBuC,EAAkBzC,EACpB,UACAsR,EACAzU,EACA,UAGE2qB,EAAYlW,EACd,sBAAe3F,EAAO0b,UAAe,OAAA3qB,OAAAiP,EAAO2b,YAAc,KAC1D3b,EAAO2b,YAEX,OACE5oB,YACEmB,KAAK,SACL4nB,KAAK,SAAQ,eACCrW,EACdpR,SAAUA,GAAYE,EACtBC,QAlDgB,SAACzG,GACnB,IAAIsG,IAAYE,EAAhB,CAEA,IAAMwnB,GAActW,EACfwM,GACHwJ,EAAmBM,GAErBzZ,SAAAA,EAAWyZ,EAAYhuB,GACvByG,SAAAA,EAAUunB,EAAYhuB,EAPU,CAQlC,EA0CI6G,UAAW,cAAA7D,OAAc6D,GACzBxB,MACErG,EAAA,CAAAqJ,SAAU,WACVL,QAAS,cACTC,WAAY,SACZC,eAAgB0P,EAAY,WAAa,aACzC1S,MAAO+M,EAAO/M,MACdf,OAAQ8N,EAAO9N,OACfyK,QAAS,IACToH,OAAQ,IACRvN,OAAQ,OACRD,aAAuB,UAAT1D,EAAmB,OAAS,OAC1CiE,kBACAL,OAAQpC,GAAYE,EAAU,cAAgB,UAC9CoC,WAAY,WACZD,QAAS,OACTmP,UAAW,cACRzS,GAAK5B,SAAA,EAIR8pB,GAAmBC,IACnB5pB,EAAA,OAAA,CACEyB,MAAO,CACLgD,SAAU,WACV0E,KAAM6K,EAAY,MAAQ,OAC1BxK,MAAOwK,EAAY,OAAS,MAC5BtT,SAAU2N,EAAO3N,SACjBC,WAAY,IACZQ,MAAO,UACPwD,WAAY,sBACZD,WAAY,IACZM,WAAY,eACZ7C,QAASO,EAAW,GAAM,EAC1B0G,OAAQ,EACRC,cAAe,QAChBxJ,SAEAmU,EAAY2V,EAAkBC,IAKnC5pB,EAAA,OAAA,CACEyB,MAAO,CACLgD,SAAU,WACV0E,KAAM+gB,EACNhhB,IAAK,MACL6B,UAAW,mBACXzJ,MAAO+M,EAAO0b,UACdxpB,OAAQ8N,EAAO0b,UACfnlB,aAAc,MACdO,gBAAiB,UACjBC,UAAW,+BACXJ,WAAY,mCACZZ,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB8E,OAAQ,GACTvJ,SAEA+C,GACCxB,SACEE,MAAgB,UAATJ,EAAmB,IAAM,KAChCX,OAAiB,UAATW,EAAmB,IAAM,KACjCK,QAAQ,YACRC,KAAK,OACLC,MAAO,CACLC,UAAW,2BACZ7B,SAAA,CAEDG,oBACG,qLAOHA,EAAA,SAAA,CACE2B,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAO,eACPC,YAAY,IACZC,cAAc,QACdC,gBAAgB,KAChBC,iBAAiB,KACjBC,QAAQ,QAEVnC,YACE2B,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAO,eACPC,YAAY,IACZC,cAAc,QACdC,gBAAgB,KAChBC,iBAAiB,cAO/B,EAEAsnB,GAAO9jB,YAAc,SC5Hf,IAAA2kB,GAAgC,SAAC1qB,SAC9BsgB,EAAetgB,EAAA1C,MACtB+iB,EAAYrgB,EAAAqgB,aACZxd,EAAY7C,EAAAuM,QAAZA,OAAO,IAAA1J,EAAG,GAAEA,EACZ0d,EAAIvgB,EAAAugB,KACJzd,EAAgB9C,EAAA+C,SAAhBA,OAAQ,IAAAD,GAAQA,EAChBE,EAAAhD,EAAAoG,MAAAA,OAAQ,IAAApD,GAAKA,EACbG,EAA6BnD,EAAA0nB,YAA7BA,OAAW,IAAAvkB,EAAG,gBAAeA,EAC7BE,EAAArD,EAAAuB,KAAAA,OAAO,IAAA8B,EAAA,SAAQA,EACfG,EAAkBxD,EAAA2qB,WAAlBA,OAAU,IAAAnnB,GAAQA,EAClBG,EAAA3D,EAAA4qB,aAAAA,OAAe,IAAAjnB,GAAIA,EACnBC,EAAkB5D,EAAAwnB,WAAlBA,OAAU,IAAA5jB,GAAQA,EAClBoN,EAAQhR,EAAAgR,SACR8H,EAAQ9Y,EAAA8Y,SACR+R,EAAU7qB,EAAA6qB,WACVC,EAAQ9qB,EAAA8qB,SACR/W,EAAO/T,EAAA+T,QACPC,EAAMhU,EAAAgU,OACN+W,EAAuB/qB,EAAA+qB,wBACvB/mB,EAAAhE,EAAAsD,UAAAA,OAAY,IAAAU,EAAA,GAAEA,EACdlC,EAAK9B,EAAA8B,MACLsP,EAAApR,EAAAgrB,kBAAAA,OAAoB,IAAA5Z,EAAA,GAAEA,EACtB6Z,EAAajrB,EAAAirB,cACb5Z,EAAArR,EAAAkrB,YAAAA,OAAc,IAAA7Z,GAAKA,EACb8Z,EAAcnrB,EAAAorB,KACpBC,EAAWrrB,EAAAqrB,YACXC,EAAStrB,EAAAsrB,UACTC,EAAYvrB,EAAAurB,aAEJxV,EAA6BxV,IAAUX,aAAvCA,QAAY,IAAAmW,EAAG,UAASA,EAC1BtE,GAAoC5N,OAEvBwO,IAAjBgO,EAA6BA,EAAgBE,EAAO,QAAKlO,GAFpD8O,GAAa1P,GAAA,GAAE2P,SAGhB1P,GAAkC7N,EAASqnB,GAA1CM,GAAY9Z,GAAA,GAAE+Z,GAAe/Z,GAAA,GAC9BG,GAAgChO,EAAS,IAAxC6nB,GAAW7Z,GAAA,GAAE8Z,GAAc9Z,GAAA,GAC5BG,GAAkCnO,GAAU,GAA3C+nB,GAAY5Z,GAAA,GAAE6Z,GAAe7Z,GAAA,GAE9B8Z,GAAY9T,EAAuB,MACnC6P,GAAW7P,EAAyB,MACpC+T,GAAc/T,EAAuB,MACrCf,GAA0CpT,EAA8D,MAAvGmoB,GAAgB/U,GAAA,GAAEgV,GAAmBhV,GAAA,GAEtC0J,QAAmCtO,IAApBiO,EACf4L,QAAsC7Z,IAAnB8Y,EACnB9J,GAAeV,GAAeL,EAAkBa,GAChDgL,GAASD,GAAmBf,EAAiBK,GAC7CY,GAAsB,aAAT7L,GAAgC,SAATA,EAGpC8L,GAAqBthB,EAAY,WACrC,IAAKsW,GAAc,MAAO,GAC1B,IAAMiL,EAAS/sB,MAAMia,QAAQ6H,IAAgBA,GAAe,CAACA,IAC7D,OAAO9U,EAAQrE,OAAO,SAACqkB,GAAQ,OAAAD,EAAOzT,SAAS0T,EAAIjvB,MAAM,EAC3D,EAAG,CAAC+jB,GAAc9U,IAGZigB,GAAqBzhB,EAAY,WACrC,OAAK4f,GAAee,IAEC,IAAjBd,EAA+Bre,EAEP,mBAAjBqe,EACFre,EAAQrE,OAAO,SAACqkB,GAAQ,OAAA3B,EAAac,GAAaa,EAA1B,GAI1BhgB,EAAQrE,OAAO,SAACqkB,GACrB,IAAMruB,EAAQihB,OAAOoN,EAAIruB,OAAS,IAAIuuB,cAChCC,EAAShB,GAAYe,cAC3B,OAAOvuB,EAAM2a,SAAS6T,EACxB,GAbwCngB,CAczC,EAAE,CAACA,EAASmf,GAAaf,EAAYC,IAEhC+B,GAAkBvsB,EAAQ,WAAM,OAAAosB,IAAoB,EAAE,CAACA,KAG7DzjB,EAAU,WACR,GAAIojB,IAAUL,GAAUxb,QAAS,CAC/B,IAAMyR,EAAiB,WACrB,GAAI+J,GAAUxb,QAAS,CACrB,IAAMsc,EAAOd,GAAUxb,QAAQ4R,wBAC/B+J,GAAoB,CAClB1iB,IAAKqjB,EAAK9iB,OAASmC,OAAO4gB,QAAU,EACpCrjB,KAAMojB,EAAKpjB,KAAOyC,OAAO6gB,QACzBnrB,MAAOirB,EAAKjrB,OAEf,CACH,EAQA,OANAogB,IAGA9V,OAAOmM,iBAAiB,SAAU2J,GAClC9V,OAAOmM,iBAAiB,SAAU2J,GAAgB,GAE3C,WACL9V,OAAOoM,oBAAoB,SAAU0J,GACrC9V,OAAOoM,oBAAoB,SAAU0J,GAAgB,EACvD,CACD,CACCkK,GAAoB,KAExB,EAAG,CAACE,KAGJpjB,EAAU,WACR,IAAMgkB,EAAqB,SAACC,GAC1B,IAAMvZ,EAASuZ,EAAMvZ,OAEnBqY,GAAUxb,UACTwb,GAAUxb,QAAQ2c,SAASxZ,IAC5BsY,GAAYzb,UACXyb,GAAYzb,QAAQ2c,SAASxZ,KAEzByY,IACHT,IAAgB,GAElBV,SAAAA,GAA0B,GAC1BY,GAAe,IAEnB,EAEA,GAAIQ,GAIF,OAFAjgB,SAASkM,iBAAiB,YAAa2U,GAAoB,GAC3D7gB,SAASkM,iBAAiB,aAAc2U,GAAoB,GACrD,WACL7gB,SAASmM,oBAAoB,YAAa0U,GAAoB,GAC9D7gB,SAASmM,oBAAoB,aAAc0U,GAAoB,EACjE,CAEH,EAAE,CAACZ,GAAQD,GAAkBnB,IAG9BhiB,EAAU,WACR,GAAKojB,GAAL,CAEA,IAAMe,EAAgB,SAACzwB,SACrB,GAAc,cAAVA,EAAEqX,IACJrX,EAAEiJ,iBACFmmB,GAAgB,SAAClI,GACf,OAAAA,EAAOgJ,GAAgB1wB,OAAS,EAAI0nB,EAAO,EAAIA,CAA/C,QAEG,GAAc,YAAVlnB,EAAEqX,IACXrX,EAAEiJ,iBACFmmB,GAAgB,SAAClI,GAAS,OAACA,EAAO,EAAIA,EAAO,EAAI,CAAE,QAC9C,GAAc,UAAVlnB,EAAEqX,KAAmB8X,IAAgB,EAAG,CACjDnvB,EAAEiJ,iBACF,IAAMynB,EAASR,GAAgBf,IAC3BuB,IAAWA,EAAOpqB,UACpBuV,GAAa6U,EAEhB,KAAoB,WAAV1wB,EAAEqX,MACXrX,EAAEiJ,iBACGwmB,IACHT,IAAgB,GAElBV,SAAAA,GAA0B,GACP,QAAnB/qB,EAAA8rB,GAAUxb,eAAS,IAAAtQ,GAAAA,EAAAioB,QAEvB,EAGA,OADAhc,OAAOmM,iBAAiB,UAAW8U,GAC5B,WACLjhB,OAAOoM,oBAAoB,UAAW6U,EACxC,CA9BoB,CA+BtB,EAAG,CAACf,GAAQQ,GAAiBf,GAAcM,GAAkBnB,IAG7DhiB,EAAU,WACR,GAAI6iB,IAAgB,GAAKG,GAAYzb,QAAS,CAC5C,IACM8c,EADQrB,GAAYzb,QAAQ+c,iBAAiB,sBACzBzB,IACtBwB,GACFA,EAAY5K,eAAe,CAAEE,MAAO,UAAWD,SAAU,UAE5D,CACH,EAAG,CAACmJ,KAEJ,IAAMtT,GAAevN,EAAY,SAACoiB,SAChC,IAAIA,EAAOpqB,SAEX,GAAIqpB,GAAY,CACd,IAGIkB,EAHEC,EAAgBhuB,MAAMia,QAAQ6H,IAAgBA,GAAe,GAChDkM,EAAc1U,SAASsU,EAAO7vB,QAI/CgwB,EAAYC,EAAcrlB,OAAO,SAACtJ,GAAM,OAAAA,IAAMuuB,EAAO7vB,KAAb,GACxCutB,SAAAA,EAAasC,EAAO7vB,MAAO6vB,KAE3BG,SAAgBC,GAAa,GAAA,CAAEJ,EAAO7vB,WACtCwb,SAAAA,EAAWqU,EAAO7vB,MAAO6vB,IAGtBxM,IACHS,GAAiBkM,GAGnB,IAAME,EAAkBjhB,EAAQrE,OAAO,SAACqkB,GAAQ,OAAAe,EAAUzU,SAAS0T,EAAIjvB,MAAM,GAC7E0T,SAAAA,EAAWsc,EAAWE,EACvB,MACM7M,IACHS,GAAiB+L,EAAO7vB,OAE1B0T,SAAAA,EAAWmc,EAAO7vB,MAAO6vB,GACzBrU,SAAAA,EAAWqU,EAAO7vB,MAAO6vB,GAEpBjB,IACHT,IAAgB,GAElBV,SAAAA,GAA0B,GAC1BY,GAAe,IACI,QAAnB3rB,EAAA8rB,GAAUxb,eAAS,IAAAtQ,GAAAA,EAAAioB,OAEtB,EAAE,CAACmE,GAAY/K,GAAcV,GAAcuL,GAAkB3f,EAASyE,EAAU8H,EAAU+R,EAAYE,IAEjG0C,GAAkB1iB,EAAY,SAACtO,EAAqBa,GAExD,GADAb,EAAEiP,kBACE0gB,IAAc7sB,MAAMia,QAAQ6H,IAAe,CAC7C,IAAMqM,EAAYrM,GAAanZ,OAAO,SAACtJ,GAAM,OAAAA,IAAMtB,CAAN,GACvC6vB,EAAS5gB,EAAQuN,KAAK,SAACyS,GAAQ,OAAAA,EAAIjvB,QAAUA,CAAd,GAChCqjB,IACHS,GAAiBsM,GAEnB1c,SAAAA,EAAW0c,EAAWrB,MACtBxB,SAAAA,EAAavtB,EAAO6vB,EACrB,CACH,EAAG,CAACf,GAAY/K,GAAcV,GAAcpU,EAASyE,EAAU6Z,EAAYwB,KAErErE,GAAc,SAACvrB,GACnBA,EAAEiP,kBACF,IAAMiiB,EAA8DvB,GAAa,QAAK/Z,EACjFsO,IACHS,GAAiBuM,GAEnB3c,SAAAA,EAAW2c,EAAiB,IAC5BhC,GAAe,GACjB,EAkCMxD,GAAa,CACjBxnB,MAAO,CACLC,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,MACf7e,SAAU,OACVC,WAAY,QAEdG,YAAa,CACXP,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,MACf7e,SAAU,OACVC,WAAY,QAEdI,OAAQ,CACNR,OAAQ,OACRwnB,WAAY,MACZxI,cAAe,MACf7e,SAAU,OACVC,WAAY,QAEdK,MAAO,CACLT,OAAQ,OACRwnB,WAAY,OACZxI,cAAe,OACf7e,SAAU,OACVC,WAAY,SAIV4sB,GAAkBxtB,EAAQ,WAAM,OAAAisB,IAAoB,EAAE,CAACA,KACvDnE,GAAY9nB,EAAQ,WAAM,OAAAonB,GAAcnG,KAAiBte,CAAQ,EAAE,CAACykB,EAAYnG,GAActe,IAC9F8qB,GAAWztB,EAAQ,WACvB,OAAAgsB,GACI7sB,MAAMia,QAAQ6H,KAAiBA,GAAaplB,OAAS,EACrDolB,UAAwE,KAAjBA,EAF3D,EAGA,CAAC+K,GAAY/K,KAITyM,GAAa1tB,EAAQ,WACzB,IAAKgsB,KAAe7sB,MAAMia,QAAQ6H,KAAyC,IAAxBA,GAAaplB,OAC9D,OAAO,KAGT,IAAM8xB,EACY,eAAhB1C,EACIuC,GAAgBpuB,MAAM,EAAG,GACzB6rB,EACAuC,GAAgBpuB,MAAM,EAAG6rB,GACzBuC,GAEAI,EACJ3C,GAAeuC,GAAgB3xB,OAAS8xB,EAAW9xB,OAC/C2xB,GAAgB3xB,OAAS8xB,EAAW9xB,OACpC,EAEN,OACEwF,EACE,MAAA,CAAAK,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZoO,SAAU,OACV5R,IAAK,MACLqK,KAAM,EACNC,SAAU,GACXtL,SAAA,CAEA6tB,EAAW7kB,IAAI,SAACikB,GACf,IAAMc,EAAW,CACf/vB,MAAOivB,EAAOjvB,MACdZ,MAAO6vB,EAAO7vB,MACd4wB,UAAWnrB,EACX+D,QAAS,WAAM,OAAA2mB,GAAgB,CAAS,EAAEN,EAAO7vB,MAAM,GAGzD,OAAIguB,EACKjrB,EAACmP,EAAM0O,mBAA6BoN,EAAU2C,IAAzBd,EAAO7vB,OAInCmE,EAEE,OAAA,CAAAK,MAAO,CACL2C,QAAS,cACTC,WAAY,SACZxD,IAAK,MACLmK,QAAS,UACT7F,gBAAiB,UACjBP,aAAc,MACdlE,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZiG,SAAU,QAGZ/K,SAAA,CAAAG,EAAA,OAAA,CACEyB,MAAO,CACLqJ,SAAU,SACVgjB,aAAc,WACd1J,WAAY,UACbvkB,SAEAitB,EAAOjvB,SAER6E,GACA1C,EAAA,OAAA,CACE6C,QAAS,SAACzG,GAAM,OAAAgxB,GAAgBhxB,EAAG0wB,EAAO7vB,MAAM,EAChDwE,MAAO,CACLqD,OAAQ,UACRV,QAAS,OACTC,WAAY,SACZlD,MAAO,UACPkR,WAAY,OAGdxS,SAAAG,EAAA,MAAA,CACEsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BAA4BhG,SAElCG,EACE,OAAA,CAAA8F,EAAE,mBACFhE,OAAO,eACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,gBA/ClBwd,EAAO7vB,SAuDjB0wB,EAAiB,GAChBvsB,EACE,OAAA,CAAAK,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,uBACb9E,SAAA,CAAA,IAEC8tB,OAKZ,EAAG,CAAC5B,GAAY/K,GAAcuM,GAAiBvC,EAAatoB,EAAUuoB,IAiEtE,OACE7pB,EACEC,EAAA,CAAAxB,SAAA,CAAAG,EAAA,QAAA,CAAAH,SAf4B,gNAgB5BuB,SACE+S,IAAKsX,GACLxoB,UAAW,cAAc7D,OAAA6D,GACzBxB,SACEgD,SAAU,WACVL,QAAS,cACTC,WAAY,SACZ/C,MAAO,OACP6J,SAAU,QACV+I,UAAW,aACXvP,WAAY,sBACZC,aAAc,MACdC,OAAQ,aAAazF,OAAA2G,EAAQ,UAAY+lB,GAASvsB,GAAe,WACjE4F,gBAAiBzC,EAAW,UAAY,UACxCoC,OAAQpC,EAAW,cAAgB,UACnCsC,WAAY,WACZxE,YAAa,OACbC,aAAc,OACdsnB,WAAYD,GAAW5mB,GAAM6mB,WAC7BxI,cAAeuI,GAAW5mB,GAAMqe,cAChC7e,SAAUonB,GAAW5mB,GAAMR,SAC3BC,WAAYmnB,GAAW5mB,GAAMP,WAC7B+D,WAAY,IACZQ,wBAAyB,cACzB6oB,mBAAoB,OACpBC,YAAa,eACb/oB,WAAY,QACTxD,GAELoB,QAzRe,WACnB,IAAIH,EAAJ,CACA,IAAMurB,GAAWnC,GACZD,IACHT,GAAgB6C,GAElBvD,SAAAA,EAA0BuD,GACtBA,GAAW3D,EACbhgB,WAAW,iBACS,QAAlB3K,EAAA6nB,GAASvX,eAAS,IAAAtQ,GAAAA,EAAAioB,OACnB,EAAE,GAEH0D,GAAe,GAXI,CAavB,EA4QM5X,QAnQc,SAACtX,GACnBsX,SAAAA,EAAUtX,EACZ,EAkQMuX,OAhQa,SAACvX,GAClBuX,SAAAA,EAASvX,EACX,EA+PM8xB,aAAc,SAAC9xB,GAERsG,IACHtG,EAAEkP,cAAc7J,MAAMU,QAAU,MAEpC,EACAgsB,WAAY,SAAC/xB,GACXA,EAAEkP,cAAc7J,MAAMU,QAAU,GAClC,EACAisB,SAAU1rB,GAAY,EAAI,EAE1B7C,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZ6G,KAAM,EACNC,SAAU,EACVtK,IAAK,OACNhB,SAEAksB,GACE0B,IACCztB,EAAA,OADcqnB,EACd,CACE5lB,MAAO,CACLyJ,KAAM,EACNJ,SAAU,SACVgjB,aAAc,WACd1J,WAAY,SACZjjB,MAAO,UACPT,SAAU,OACVC,WAAY,OACZ+D,WAAY,KACb7E,SAEAwnB,GAGH,CAAM5lB,MAAO,CAAEyJ,KAAM,EAAG+I,UAAW,UAC9BqW,GAAcwB,GACrB9rB,EACE,QAAA,CAAAmU,IAAKqT,GACLjlB,KAAK,OACLtF,MAAOouB,GACP1a,SAvTS,SAACvU,GACpB,IAAMiyB,EAAMjyB,EAAEgX,OAAOnW,MACrBquB,GAAe+C,GACf5D,SAAAA,EAAW4D,GACX7C,IAAiB,EACnB,EAmTY3oB,QAAS,SAACzG,GAAM,OAAAA,EAAEiP,iBAAiB,EACnCqI,QAAS,SAACtX,GAAM,OAAAA,EAAEiP,iBAAiB,EACnC5J,MAAO,CACLyJ,KAAM,EACNrG,OAAQ,OACRE,QAAS,OACT8F,WAAY,cACZnK,SAAU,OACVC,WAAY,OACZ+D,WAAY,IACZvD,MAAOuB,EAAW,UAAY,UAC9BiC,WAAY,sBACZwG,SAAU,EACV8c,iBAAkB,OAClBE,WAAY,QAEdd,YAAamG,QAAWxb,EAAYqV,EACpCgB,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,IAGdxoB,EAAA,OAAA,CACEyB,MAAO,CACLyJ,KAAM,EACNJ,SAAU,SACVgjB,aAAc,WACd1J,WAAY,SACZjjB,MAAOqsB,GACH9qB,EACE,UACA,UACF,UACJhC,SAAU,OACVC,WAAY,OACZ+D,WAAY,IACZuP,UAAW,OACX7P,QAAS,gBACVvE,SAEA2tB,IACqB,QAAlBlrB,EAAAirB,GAAgB,UAAE,IAAAjrB,OAAA,EAAAA,EAAEzE,QAASmjB,GAC7BqG,GAAe,QAKzBjmB,EACE,MAAA,CAAAK,MAAO,CACLgD,SAAU,WACV+E,MAAO,OACPpF,QAAS,OACTC,WAAY,SACZxD,IAAK,OACNhB,SAAA,CAEAgoB,IAAa7nB,EA9KJ,WAAM,OACtBA,EAAA,MAAA,CACEsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACNhD,QAAS8kB,GACTlmB,MAAO,CACLqD,OAAQ,UACRP,WAAY,EACZpD,MAAO,WAGTtB,SAAAG,EAAA,OAAA,CACE8F,EAAE,uBACFhE,OAAO,eACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,aA2Jc,IAC3BtP,EAvMU,SAACL,GAAU,IAAAorB,EAAIprB,EAAAmsB,OAA4B,OAC3D9rB,SACEsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACNpE,MAAO,CACLsJ,UAAWggB,EAAO,iBAAmB,eACrC/lB,WAAY,6BACZT,WAAY,GAGd1E,SAAAG,EAAA,OAAA,CACE8F,EAAE,iBACFhE,OAAO,UACPC,YAAY,MACZC,cAAc,QACdsN,eAAe,WAlBwC,EAuM1C,CAAAwc,OAAQA,WAItBA,IAAUH,IAAoBxe,EAC7BnN,EACE,MAAA,CAAAmU,IAAKuX,GACLzoB,UAAW,uBAAA7D,OAAuBurB,GAClClpB,MACErG,EAAA,CAAAqJ,SAAU,WACVyE,IAAK,GAAA9J,OAAGusB,GAAiBziB,IAAG,MAC5BC,KAAM,GAAA/J,OAAGusB,GAAiBxiB,KAAI,MAC9B7H,MAAO,GAAAlC,OAAGusB,GAAiBrqB,MAAK,MAChC8H,OAAQ,KACRjE,gBAAiB,UACjBP,aAAc,MACdQ,UAAW,iCACXP,OAAQ,oBACRua,UAAW,QACXtU,SAAU,OACV3I,QAAS,EACT4I,UAAW,mBACXrJ,UAAW,wCACXsiB,wBAAyB,QACzBsK,mBAAoB,WACjB1D,GAGJ/qB,SAA2B,IAA3BysB,GAAgB1wB,OACfoE,EACE,MAAA,CAAAyB,MAAO,CACLuJ,QAAS,WACToR,UAAW,SACXjb,MAAO,UACPT,SAAU,OACViE,WAAY,uBACb9E,SAAA,YAKHysB,GAAgBzjB,IAAI,SAACikB,EAAQja,GAC3B,IAAM4K,EAAasO,GACf7sB,MAAMia,QAAQ6H,KAAiBA,GAAaxI,SAASsU,EAAO7vB,OAC5D+jB,KAAiB8L,EAAO7vB,MACtBsxB,EAAY1b,IAAU0Y,GAG5B,OAAIL,EAEAlrB,SAEEiD,UAAW,4BAAsB6pB,EAAOpqB,SAAkC,GAAvB,qBAA6B,KAAAtD,OAAAqe,EAAa,eAAiB,IAC9G5a,QAAS,WAAM,OAACiqB,EAAOpqB,UAAYuV,GAAa6U,EAAjC,EACfrrB,MAAO,CACLqD,OAAQgoB,EAAOpqB,SAAW,cAAgB,UAC1CsC,WAAY,yBAGbnF,SAAAqrB,EAAa4B,EAAQ,CACpB5U,SAAUuF,EACVgK,QAAS8G,EACT7rB,SAAUoqB,EAAOpqB,WAAY,KAX1BoqB,EAAO7vB,OAmBhBmE,EAEE,MAAA,CAAA6B,UAAW,qBAAqB7D,OAAC0tB,EAAOpqB,SAAkC,GAAvB,iCAA6B+a,EAAa,eAAiB,IAC9G5a,QAAS,WAAM,OAAAoV,GAAa6U,IAC5BrrB,MAAO,CACLuJ,QAAS,WACTlG,OAAQgoB,EAAOpqB,SAAW,cAAgB,UAC1CvB,MAAO2rB,EAAOpqB,SAAW,UAAY,UACrChC,SAAU,OACVC,WAAY,OACZgE,WAAY,sBACZP,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBU,WAAY,yBACbnF,SAAA,CAEDG,EAAO,OAAA,CAAAH,SAAAitB,EAAOjvB,QAEb4f,GACCzd,EACE,MAAA,CAAAsB,MAAM,KACNf,OAAO,KACPgB,QAAQ,YACRC,KAAK,OACLqE,MAAM,6BACN5C,UAAWsrB,EAAY,SAAW,YAElCvuB,EACE,OAAA,CAAA8F,EAAE,iCACFhE,OAAQvC,GACRwC,YAAY,IACZC,cAAc,QACdsN,eAAe,cAhChBwd,EAAO7vB,WAyCtB4O,SAASpO,QAIjB,EAEA4sB,GAAO3kB,YAAc,SCpwBd,IAAM8oB,GAAc/uB,EAAuC,MCF5DgvB,GAAOtf,EAAM4X,WACjB,SACEpnB,EAaAwU,OAZE7R,EAAkB3C,EAAA+uB,cAAlBA,OAAa,IAAApsB,EAAG,CAAE,EAAAA,EAClBqsB,EAAchvB,EAAAgvB,eACdC,EAAQjvB,EAAAivB,SACRC,EAAclvB,EAAAkvB,eACdrsB,EAAoB7C,EAAAmvB,WAApBA,OAAU,IAAAtsB,EAAG,QAAOA,EACpBC,EAAA9C,EAAAovB,WAAAA,OAAa,IAAAtsB,EAAA,UACbE,EAAAhD,EAAAogB,OAAAA,OAAS,IAAApd,EAAA,eACThD,EAAAuB,KACA,IAAA8B,EAAArD,EAAAsD,UAAAA,OAAY,IAAAD,EAAA,GAAEA,EACdvB,EAAK9B,EAAA8B,MACL5B,EAAQF,EAAAE,SAIJsD,EAAsBK,EAAoC,WAC9D,IAAMwrB,EAA2C,CAAA,EASjD,OARA3zB,OAAOwd,KAAK6V,GAAermB,QAAQ,SAACoL,GAClCub,EAAcvb,GAAO,CACnBxW,MAAOyxB,EAAcjb,GACrB1N,WAAOiM,EACPid,SAAS,EACTC,YAAY,EAEhB,GACOF,CACT,GAXOG,OAAQC,OAcTC,EAAY1X,EAAOwX,GACzBzmB,EAAU,WACR2mB,EAAUpf,QAAUkf,CACtB,EAAG,CAACA,IAGJ,IAAMG,EAAgB5kB,EAAY,SAACkV,SACjC,OAAgC,QAAzBjgB,EAAA0vB,EAAUpf,QAAQ2P,UAAO,IAAAjgB,OAAA,EAAAA,EAAA1C,KACjC,EAAE,IAGGsyB,EAAgB7kB,EAAY,SAACkV,EAAc3iB,GAC/CmyB,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GA+BvB,GA9BKkM,EAAU5P,GAQb4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAA3iB,MAAKA,IATPuyB,EAAU5P,GAAQ,CAChB3iB,MAAKA,EACL8I,WAAOiM,EACPid,SAAS,EACTC,YAAY,GAUZG,EAAUpf,QAAQ2P,GACpByP,EAAUpf,QAAQ2P,UACbyP,EAAUpf,QAAQ2P,IAAK,CAC1B3iB,MAAKA,IAGPoyB,EAAUpf,QAAQ2P,GAAQ,CACxB3iB,MAAKA,EACL8I,WAAOiM,EACPid,SAAS,EACTC,YAAY,GAKZP,EAAgB,CAClB,IAAMc,EAAqC,CAAA,EAC3CA,EAAc7P,GAAQ3iB,EACtB,IAAMyyB,EAAiC,CAAA,EACvCr0B,OAAOwd,KAAK2W,GAAWnnB,QAAQ,SAACoL,GAC9Bic,EAAUjc,GAAO+b,EAAU/b,GAAKxW,KAClC,GACA0xB,EAAec,EAAeC,EAC/B,CAED,OAAOF,CACT,EACF,EAAG,CAACb,IAGEgB,EAAgBjlB,EAAY,SAACkV,SACjC,OAAgC,QAAzBjgB,EAAA0vB,EAAUpf,QAAQ2P,UAAO,IAAAjgB,OAAA,EAAAA,EAAAoG,KACjC,EAAE,IAGG6pB,EAAgBllB,EAAY,SAACkV,EAAc7Z,GAE3CspB,EAAUpf,QAAQ2P,KACpByP,EAAUpf,QAAQ2P,UACbyP,EAAUpf,QAAQ2P,IAAK,CAC1B7Z,MAAKA,KAKTqpB,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAcvB,OAbKkM,EAAU5P,GAQb4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAA7Z,MAAKA,IATPypB,EAAU5P,GAAQ,CAChB3iB,WAAO+U,EACPjM,MAAKA,EACLkpB,SAAS,EACTC,YAAY,GAQTM,CACT,EACD,EAAE,IAGGK,EAAiBnlB,EAAY,SAACkV,SAClC,OAAgC,QAAzBjgB,EAAA0vB,EAAUpf,QAAQ2P,UAAO,IAAAjgB,OAAA,EAAAA,EAAAsvB,WAAW,CAC5C,EAAE,IAGGa,EAAkBplB,EAAY,SAACkV,EAAcqP,GAE7CI,EAAUpf,QAAQ2P,KACpByP,EAAUpf,QAAQ2P,UACbyP,EAAUpf,QAAQ2P,IAAK,CAC1BqP,QAAOA,KAKXG,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAcvB,OAbKkM,EAAU5P,GAQb4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAAqP,QAAOA,IATTO,EAAU5P,GAAQ,CAChB3iB,WAAO+U,EACPjM,WAAOiM,EACPid,QAAOA,EACPC,YAAY,GAQTM,CACT,EACD,EAAE,IAGGO,EAAoBrlB,EAAY,SAACkV,SACrC,OAAgC,QAAzBjgB,EAAA0vB,EAAUpf,QAAQ2P,UAAO,IAAAjgB,OAAA,EAAAA,EAAAuvB,cAAc,CAC/C,EAAE,IAGGc,EAAqBtlB,EAAY,SAACkV,EAAcsP,GAEhDG,EAAUpf,QAAQ2P,KACpByP,EAAUpf,QAAQ2P,UACbyP,EAAUpf,QAAQ2P,IAAK,CAC1BsP,WAAUA,KAKdE,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAcvB,OAbKkM,EAAU5P,GAQb4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAAsP,WAAUA,IATZM,EAAU5P,GAAQ,CAChB3iB,WAAO+U,EACPjM,WAAOiM,EACPid,SAAS,EACTC,WAAUA,GAQPM,CACT,EACD,EAAE,IAGGS,EAAmBtY,IAEzBsY,EAAiBhgB,QAAU,SAAC2P,EAAc1T,GACxCkjB,EAAU,SAAC9L,GAET,GAAIA,EAAK1D,GAAO,CACd,IAAMsQ,EAAgB5M,EAAK1D,GAAMuQ,OAAS,GACpCC,EAAWlkB,EAAQikB,OAAS,GAG9BE,EAAaH,EAAct0B,SAAWw0B,EAASx0B,OACnD,GAAIy0B,GAAcH,EAAct0B,OAAS,EACvC,IAAK,IAAIH,EAAI,EAAGA,EAAIy0B,EAAct0B,OAAQH,IAAK,CAC7C,IAAM60B,EAAeJ,EAAcz0B,GAC7B80B,EAAUH,EAAS30B,GACzB,IACE60B,aAAY,EAAZA,EAAcE,aAAaD,aAAO,EAAPA,EAASC,YACpCF,aAAY,EAAZA,EAAcxmB,YAAYymB,aAAO,EAAPA,EAASzmB,WACnCwmB,aAAY,EAAZA,EAAc/tB,SAASguB,aAAO,EAAPA,EAAShuB,QAChC+tB,aAAY,EAAZA,EAAcG,YAAYF,aAAO,EAAPA,EAASE,WACnCH,aAAY,EAAZA,EAAc9d,QAAQ+d,aAAO,EAAPA,EAAS/d,OAC/B8d,aAAY,EAAZA,EAActd,QAAQud,aAAO,EAAPA,EAASvd,OAC/Bsd,aAAY,EAAZA,EAAcI,QAAQH,aAAO,EAAPA,EAASG,OAC/BJ,aAAA,EAAAA,EAAcK,eAAeJ,aAAA,EAAAA,EAASI,YACtC,CACAN,GAAa,EACb,KACD,CACF,CAGH,GAAIA,GAAc/M,EAAK1D,GAAM4Q,WAAatkB,EAAQskB,SAChD,OAAOlN,CAEV,CAED,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAiBvB,OAhBKkM,EAAU5P,GAUb4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAAuQ,MAAOjkB,EAAQikB,MACfK,SAAUtkB,EAAQskB,WAZpBhB,EAAU5P,GAAQ,CAChB3iB,MAAOyxB,EAAc9O,GACrB7Z,WAAOiM,EACPid,SAAS,EACTC,YAAY,EACZiB,MAAOjkB,EAAQikB,MACfK,SAAUtkB,EAAQskB,UASfhB,CACT,EACF,EAEA,IAAMoB,EAAgBlmB,EAAY,SAACkV,EAAc1T,SACvB,QAAxBvM,EAAAswB,EAAiBhgB,eAAO,IAAAtQ,GAAAA,EAAA3D,KAAAi0B,EAAGrQ,EAAM1T,EAClC,EAAE,IAGG2kB,EAAkBnmB,EAAY,SAACkV,GACnCwP,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAEvB,cADOkM,EAAU5P,GACV4P,CACT,EACD,EAAE,IAGGsB,EAAgBpmB,EAAY,SAAOkV,GAAY,OAAApjB,OAAA,OAAA,OAAA,EAAA,kFAGnD,KADMmd,EAAQ0V,EAAUpf,QAAQ2P,IAE9B,MAAA,CAAA,OAAO5N,GAGTge,EAAmBpQ,GAAM,GAEnBuQ,EAAQxW,EAAMwW,OAAS,GAGLtV,EAAA,EAALkW,EAAKZ,mBAAL,KAAAtV,YAAK,MAAA,CAAA,EAAA,GAItB,GAJSmW,EAAID,EAAAlW,GACP5d,EAAQ0c,EAAM1c,MAGhB+zB,EAAKR,WACHvzB,SAAmD,KAAVA,GAE3C,OADA8I,EAAQirB,EAAKlnB,SAAW,GAAG1K,OAAAwgB,kBACrB,CAAA,EAAA,GAKV,GAAIoR,EAAKzuB,MAALyuB,MAAa/zB,GAAmD,KAAVA,IAgBlDg0B,EAf+C,CACnDC,OAAQ,SAAC3yB,GAAM,MAAa,iBAANA,CAAc,EACpC4yB,OAAQ,SAAC5yB,GAAM,MAAa,iBAANA,IAAmBqiB,MAAMriB,EAAE,EACjD6yB,QAAS,SAAC7yB,GAAM,MAAa,kBAANA,CAAe,EACtC8yB,MAAO,SAAC9yB,GAAM,MAAA,6BAA6B+yB,KAAKxS,OAAOvgB,GAAG,EAC1DgzB,IAAK,SAAChzB,GACJ,IAEE,OADA,IAAIizB,IAAI1S,OAAOvgB,KACR,CACR,CAAC,MAAAoB,GACA,OAAO,CACR,CACF,GAGuBqxB,EAAKzuB,SACb0uB,EAAUh0B,GAE1B,OADA8I,EAAQirB,EAAKlnB,SAAW,GAAA1K,OAAGwgB,EAAI,qBAAAxgB,OAAoB4xB,EAAKzuB,MAClD,CAAA,EAAA,GAKV,GAAIyuB,EAAKP,SAALO,MAAgB/zB,GAAmD,KAAVA,IACtD+zB,EAAKP,QAAQa,KAAKxS,OAAO7hB,IAE5B,OADA8I,EAAQirB,EAAKlnB,SAAW,GAAG1K,OAAAwgB,wBACrB,CAAA,EAAA,GAKV,QAAiB5N,IAAbgf,EAAKxe,KAALwe,MAA0B/zB,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMrB,OAASuX,OAAOlW,IACpD+zB,EAAKxe,IAElB,OADAzM,EAAQirB,EAAKlnB,SAAW,GAAA1K,OAAGwgB,EAAI,sBAAAxgB,OAAqB4xB,EAAKxe,KACnD,CAAA,EAAA,GAKV,QAAiBR,IAAbgf,EAAKhe,KAALge,MAA0B/zB,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMrB,OAASuX,OAAOlW,IACpD+zB,EAAKhe,IAElB,OADAjN,EAAQirB,EAAKlnB,SAAW,GAAA1K,OAAGwgB,EAAI,qBAAAxgB,OAAoB4xB,EAAKhe,KAClD,CAAA,EAAA,GAKV,QAAiBhB,IAAbgf,EAAKN,KAALM,MAA0B/zB,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMrB,OAASuX,OAAOlW,MAClD+zB,EAAKN,IAEpB,OADA3qB,EAAQirB,EAAKlnB,SAAW,GAAA1K,OAAGwgB,EAAI,qBAAAxgB,OAAoB4xB,EAAKN,KAClD,CAAA,EAAA,GAKV,GAAIM,EAAKL,YAA+B,iBAAV1zB,GAAsBA,EAAMw0B,SAAWx0B,EAEnE,OADA8I,EAAQirB,EAAKlnB,SAAW,GAAG1K,OAAAwgB,2BACrB,CAAA,EAAA,OAIJoR,EAAKC,UAAL,MAAc,CAAA,EAAA,oBAEd,6BAAM,CAAA,EAAAD,EAAKC,UAAUD,EAAM/zB,kBAA3B0C,EAAA7B,oBAGA,kBADAiI,GAAQ2rB,eAAAA,EAAK5nB,UAAWknB,EAAKlnB,SAAW,GAAG1K,OAAAwgB,wBACrC,CAAA,EAAA,iBAlFO/E,iBAmInB,OA3CIwU,EAAUpf,QAAQ2P,GACpByP,EAAUpf,QAAQ2P,UACbyP,EAAUpf,QAAQ2P,KACrB7Z,MAAKA,EACLmpB,YAAY,EACZD,SAAS,IAGXI,EAAUpf,QAAQ2P,GAAQ,CACxB3iB,MAAO0c,EAAM1c,MACb8I,MAAKA,EACLkpB,SAAS,EACTC,YAAY,EACZiB,MAAOxW,EAAMwW,MACbK,SAAU7W,EAAM6W,UAKpBpB,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAmBvB,OAlBIkM,EAAU5P,GACZ4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAA7Z,QACAmpB,YAAY,EACZD,SAAS,IAIXO,EAAU5P,GAAQ,CAChB3iB,MAAO0c,EAAM1c,MACb8I,MAAKA,EACLkpB,SAAS,EACTC,YAAY,EACZiB,MAAOxW,EAAMwW,MACbK,SAAU7W,EAAM6W,UAGbhB,CACT,GAGA,CAAA,EAAOzpB,SACN,IAGG4rB,EAAiBjnB,EAAY,SAACknB,GAClC,IAAMC,EAAgBxC,EAAUpf,QAC1Bgc,EAA8B,CAAA,EAOpC,OANoB2F,GAAYv2B,OAAOwd,KAAKgZ,IAEhCxpB,QAAQ,SAACuX,SACnBqM,EAAOrM,GAA6B,QAArBjgB,EAAAkyB,EAAcjS,UAAO,IAAAjgB,OAAA,EAAAA,EAAA1C,KACtC,GAEOgvB,CACR,EAAE,IAGG6F,EAAiBpnB,EAAY,SAAOknB,GAAmB,OAAAp1B,OAAA,OAAA,OAAA,EAAA,wEAOjC,OALpBq1B,EAAgBxC,EAAUpf,QAC1B8hB,EAAmBH,GAAYv2B,OAAOwd,KAAKgZ,GAC3CG,EAAoD,GAG1B,CAAA,EAAAn1B,QAAQo1B,IACtCF,EAAiBlpB,IAAI,SAAO+W,GAAI,OAAApjB,OAAA,OAAA,OAAA,EAAA,oEAG1B,OAFEmd,EAAQkY,EAAcjS,KAEfjG,EAAMwW,OAASxW,EAAMwW,MAAMv0B,OAAS,EACjC,CAAA,EAAMk1B,EAAclR,IADc,CAAA,EAAA,UAEhD,OADM7Z,EAAQpG,EAAyB7B,OACvC,CAAA,EAAO,CAAE8hB,KAAIA,EAAE7Z,MAAKA,WAEtB,MAAO,CAAA,EAAA,CAAE6Z,KAAIA,EAAE7Z,WAAOiM,MACvB,EAAA,YAcH,OAvB0BrS,EAUzB7B,OAGiBuK,QAAQ,SAAC1I,OAAEigB,EAAIjgB,EAAAigB,KAAE7Z,EAAKpG,EAAAoG,MAClCA,GACFisB,EAAOrzB,KAAK,CACVihB,KAAIA,EACJoS,OAAQ,CAACjsB,IAGf,GAGM,CAAA,EAAA,IAAIlJ,QAAQ,SAACC,GAAY,OAAAylB,sBAAsB,WACnDjY,WAAWxN,EAAS,EACtB,EAAE,WAEF,GAJA6C,EAAA7B,OAIIk0B,EAAOp2B,OAAS,EAMlB,MALMs2B,EAAY,CAChBjG,OAAQ0F,IACRQ,YAAaH,GAEfnD,SAAAA,EAAiBqD,GACXA,EAGR,MAAO,CAAA,EAAAP,SACR,EAAE,CAACb,EAAea,EAAgB9C,IAG7BuD,EAAc1nB,EAAY,SAACknB,GAC/BxC,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAevB,OAdsBsO,GAAYv2B,OAAOwd,KAAK2W,IAEhCnnB,QAAQ,SAACuX,GACjB4P,EAAU5P,KACZ4P,EAAU5P,GAAKxkB,EAAAA,EAAA,CAAA,EACVo0B,EAAU5P,IACb,CAAA3iB,MAAOyxB,EAAc9O,GACrB7Z,WAAOiM,EACPid,SAAS,EACTC,YAAY,IAGlB,GAEOM,CACT,EACF,EAAG,CAACd,IAGE2D,EAAiB3nB,EAAY,SAACuhB,GAClCmD,EAAU,SAAC9L,GACT,IAAMkM,EAASp0B,EAAA,CAAA,EAAQkoB,GAiBvB,GAhBAjoB,OAAOwd,KAAKoT,GAAQ5jB,QAAQ,SAACuX,GACtB4P,EAAU5P,GAQb4P,EAAU5P,GACLxkB,EAAAA,EAAA,CAAA,EAAAo0B,EAAU5P,IACb,CAAA3iB,MAAOgvB,EAAOrM,KAThB4P,EAAU5P,GAAQ,CAChB3iB,MAAOgvB,EAAOrM,GACd7Z,WAAOiM,EACPid,SAAS,EACTC,YAAY,EAQlB,GAEIP,EAAgB,CAClB,IAAM2D,EAAiC,CAAA,EACvCj3B,OAAOwd,KAAK2W,GAAWnnB,QAAQ,SAACoL,GAC9B6e,EAAU7e,GAAO+b,EAAU/b,GAAKxW,KAClC,GACA0xB,EAAe1C,EAAQqG,EACxB,CAED,OAAO9C,CACT,EACF,EAAG,CAACb,IAGE4D,EAAS7nB,EAAY,WAAA,OAAAlO,OAAA,OAAA,OAAA,EAAA,kEAER,6BAAM,CAAA,EAAAs1B,YAErB,OAFM7F,EAAStsB,EAAsB7B,OACrC8wB,SAAAA,EAAW3C,GACX,CAAA,EAAOA,UAEP,kCAEH,EAAA,EAAE,CAAC6F,EAAgBlD,IAGpB4D,EAAoBre,EAAK,WAAM,MAAC,CAC9Bmb,cAAaA,EACbqC,eAAcA,EACdpC,cAAaA,EACb8C,eAAcA,EACd1C,cAAaA,EACbmB,cAAaA,EACbgB,eAAcA,EACdM,YAAWA,EACXG,OAAMA,EACN,GAGF,IAAME,EAAiC1yB,EAAQ,WAAM,MAAC,CACpDovB,OAAMA,EACNG,cAAaA,EACbC,cAAaA,EACbI,cAAaA,EACbC,cAAaA,EACbC,eAAcA,EACdC,gBAAeA,EACfC,kBAAiBA,EACjBC,mBAAkBA,EAClBY,cAAaA,EACbC,gBAAeA,EACfC,cAAaA,EACbgB,eAAcA,EACdM,YAAWA,EACXT,eAAcA,EACdU,eAAcA,EACdE,OAAMA,EACNzD,WAAUA,EACVC,WAAUA,IACR,CACFI,EACAG,EACAC,EACAI,EACAC,EACAC,EACAC,EACAC,EACAC,EACAY,EACAC,EACAC,EACAgB,EACAM,EACAT,EACAU,EACAE,EACAzD,EACAC,IAGI2D,EAASt3B,EAAA,CAAA,EACVqG,GAYL,MATe,aAAXse,GACF2S,EAAUtuB,QAAU,OACpBsuB,EAAUppB,cAAgB,UACN,WAAXyW,IACT2S,EAAUtuB,QAAU,cACpBsuB,EAAUjgB,SAAW,OACrBigB,EAAU7xB,IAAM,QAIhBb,EAACwuB,GAAYvuB,UAAShD,MAAOw1B,EAAY5yB,SACvCG,EACE,OAAA,CAAAiD,UAAW,YAAY7D,OAAA6D,GACvBxB,MAAOixB,EACPC,SAAU,SAAOv2B,GAAC,OAAAI,OAAA,OAAA,OAAA,EAAA,kEAChBJ,EAAEiJ,kCAEe,6BAAM,CAAA,EAAAysB,mBAAf7F,EAAStsB,EAAsB7B,OAErC8wB,SAAAA,EAAW3C,yDAMd,EAAA,EAAApsB,SAEAA,KAIT,GAGF4uB,GAAK/oB,YAAc,OAGb,IAAAktB,GAAenE,GAGrBmE,GAAaC,KCznB6B,SAAClzB,GACzC,IAAAigB,EAAIjgB,EAAAigB,KACJ/hB,EAAK8B,EAAA9B,MACLi1B,EAAOnzB,EAAAmzB,mBAEGnzB,EAAAozB,WACV,IAAAzwB,aAAAkuB,OAAW,IAAAluB,KACXE,EAAA7C,EAAAwwB,MAAAA,aAAQ,GAAE3tB,EACV7C,EAAAqzB,gBACAC,EAActzB,EAAAszB,eACdC,SACAC,EAAKxzB,EAAAwzB,MACLxwB,cAAAM,OAAY,IAAAN,EAAA,KACZlB,EAAK9B,EAAA8B,MACL5B,EAAQF,EAAAE,SACYF,EAAAovB,WACVpvB,EAAAmvB,WACV,IAAA9rB,EAAcrD,EAAAyzB,OAAdA,OAAS,IAAApwB,GAAKA,EACdqwB,EAAO1zB,EAAA0zB,QAEDC,EAAclzB,EAAWouB,IACzB+E,EAAU5b,EAAuB,MAIjCwX,GAASmE,aAAA,EAAAA,EAAanE,SAAU,CAAA,EACnBvP,GAAQ0T,GAAcA,EAAYhE,cAAc1P,GACnE,IAAM4T,EAAa5T,GAAQ0T,EAAcA,EAAY3D,cAAc/P,QAAQ5N,EACrEyhB,KAAe7T,IAAQ0T,IAAcA,EAAYzD,eAAejQ,GAChE8T,KAAkB9T,IAAQ0T,IAAcA,EAAYvD,kBAAkBnQ,GAIlEA,GAAOuP,EAAOvP,GAIxB,IAAM+T,EACJV,IACCO,EACG,QACAE,EACA,aACAD,IAAiBD,EACjB,eACAxhB,GAGA4hB,OAAwB5hB,IAATkhB,EAAqBA,EAAQM,QAAcxhB,EAG1D6hB,EAAelc,EAAOwY,GACtB2D,EAAkBnc,EAAO6Y,GACzBuD,EAAepc,GAAO,GAGtBqc,EAAaxD,GAAYL,EAAMvT,KAAK,SAACoU,GAAS,OAAAA,EAAKR,QAAL,GAG9CyD,EAAel0B,EAAQ,WAC3B,IAAKg0B,EAAa9jB,QAEhB,OADA8jB,EAAa9jB,SAAU,GAChB,EAGT,GAAI4jB,EAAa5jB,QAAQrU,SAAWu0B,EAAMv0B,OACxC,OAAO,EAGT,GAAIi4B,EAAa5jB,UAAYkgB,EAC3B,OAAO,EAGT,IAAK,IAAI10B,EAAI,EAAGA,EAAI00B,EAAMv0B,OAAQH,IAAK,CACrC,IAAMy4B,EAAWL,EAAa5jB,QAAQxU,GAChC04B,EAAWhE,EAAM10B,GACvB,IACEy4B,aAAQ,EAARA,EAAU1D,aAAa2D,aAAQ,EAARA,EAAU3D,YACjC0D,aAAQ,EAARA,EAAUpqB,YAAYqqB,aAAQ,EAARA,EAAUrqB,WAChCoqB,aAAQ,EAARA,EAAU3xB,SAAS4xB,aAAQ,EAARA,EAAU5xB,QAC7B2xB,aAAQ,EAARA,EAAUzD,YAAY0D,aAAQ,EAARA,EAAU1D,WAChCyD,aAAQ,EAARA,EAAU1hB,QAAQ2hB,aAAQ,EAARA,EAAU3hB,OAC5B0hB,aAAQ,EAARA,EAAUlhB,QAAQmhB,aAAQ,EAARA,EAAUnhB,OAC5BkhB,aAAQ,EAARA,EAAUxD,QAAQyD,aAAQ,EAARA,EAAUzD,OAC5BwD,aAAA,EAAAA,EAAUvD,eAAewD,aAAA,EAAAA,EAAUxD,YAEnC,OAAO,CAEV,CACD,OAAO,CACT,EAAG,CAACR,IAGJznB,EAAU,WACR,GAAKkX,GAAS0T,EAkBd,QAdGO,EAAa5jB,SACdgkB,GACAH,EAAgB7jB,UAAYugB,KAG5BqD,EAAa5jB,QAAUkgB,EACvB2D,EAAgB7jB,QAAUugB,EAE1B8C,EAAY1C,cAAchR,EAAM,CAC9BuQ,MAAKA,EACLK,SAAUwD,KAIP,WACDpU,GAAQ0T,GACVA,EAAYzC,gBAAgBjR,EAEhC,CAGF,EAAG,CAACA,IAwJJ,GAAIwT,EAAQ,OAAO,KAgFnB,OACEhyB,EACE,MAAA,CAAA+S,IAAKof,EACLtwB,UAAW,iBAAiB7D,OAAA6D,GAC5BxB,MACErG,EAAA,CAAAgJ,QAAS,OACTkF,cAAe,SACf+V,aAAc,QACX5d,GAAK5B,SAAA,CAGThC,GACCuD,EACE,QAAA,CAAA0xB,QAASA,EACTrxB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZgb,aAAc,MACd3e,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZD,WAAY,KACb7E,SAAA,CAEAhC,EACAm2B,GACCh0B,EAAA,OAAA,CACEyB,MAAO,CACLN,MAAO,UACPkR,WAAY,OACbxS,SAAA,MAKJwzB,GAAWrzB,EAjHG,SAACL,GAAE,IAAAy0B,EAAOz0B,EAAAy0B,QACzB9xB,EAAgC6M,EAAM3L,UAAS,GAA9C6wB,EAAW/xB,EAAA,GAAEgyB,OACdC,EAAaplB,EAAMwI,OAAuB,MAiBhD,OAfAxI,EAAMzG,UAAU,WACd,IAAMgkB,EAAqB,SAACC,GACtB4H,EAAWtkB,UAAYskB,EAAWtkB,QAAQ2c,SAASD,EAAMvZ,SAC3DkhB,GAAe,EAEnB,EAEA,GAAID,EAEF,OADAxoB,SAASkM,iBAAiB,YAAa2U,GAChC,WACL7gB,SAASmM,oBAAoB,YAAa0U,EAC5C,CAEJ,EAAG,CAAC2H,IAGFjzB,SAAKK,MAAO,CAAEgD,SAAU,WAAYL,QAAS,eAAgBiO,WAAY,iBACvErS,EACE,MAAA,CAAA6C,QAAS,SAACzG,GACRA,EAAEiP,kBACFipB,GAAgBD,EACjB,EACD5yB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBQ,OAAQ,UACR3D,MAAO,WACRtB,SAEDG,EAAC6P,GAAc,CAAA,KAEhBwkB,GACCjzB,EAAA,MAAA,CACE+S,IAAKogB,EACL9yB,MAAO,CACLgD,SAAU,WACVyE,IAAK,OACLC,KAAM,MACN4B,UAAW,mBACXK,UAAW,MACXJ,QAAS,WACT7F,gBAAiB,UACjBhE,MAAO,UACPT,SAAU,OACVC,WAAY,OACZgE,WAAY,sBACZC,aAAc,MACdwf,WAAY,SACZhb,OAAQ,IACRhE,UAAW,kCACZvF,SAAA,CAEAu0B,EACDp0B,EACE,MAAA,CAAAyB,MAAO,CACLgD,SAAU,WACVyE,IAAK,OACLC,KAAM,MACN4B,UAAW,mBACXzJ,MAAO,EACPf,OAAQ,EACRi0B,WAAY,wBACZC,YAAa,wBACbpY,aAAc,4BAO5B,EAsCmC,CAAC+X,QAASf,OAGzCjyB,EAAK,MAAA,CAAAK,MAAO,CAAEH,MAAO,kBACnBtB,EACG,MAAA,CAAAH,SAAAsP,EAAMulB,SAAS7rB,IAAIhJ,EAAU,SAAC80B,GAC7B,OAAIxlB,EAAMoV,eAAeoQ,GA/QhB,SAACA,yBAClB,IAAKxlB,EAAMoV,eAAeoQ,GAAQ,OAAOA,EAEzC,IAAMC,EACAx5B,EAAA,CAAA,EAAAu5B,EAAMxtB,OAIZ,GAAIyY,GAAQ0T,EAAa,CACvB,IAAMuB,EAAavB,EAAYhE,cAAc1P,GACvCkV,EAAgBxB,EAAY/D,cAElC,IAAKuF,EAEH,OAAOH,EAIT,GAAIA,EAAMpyB,MAA8B,iBAAfoyB,EAAMpyB,MAAqB,gBAAiBoyB,EAAMpyB,KAAM,CAC/E,IAAMmD,EAAeivB,EAAMpyB,KAAamD,YAGxC,GAAoB,UAAhBA,GAA2C,aAAhBA,EAA4B,CACzDkvB,EAAW33B,MAAQ43B,GAAc,GACjC,IAAME,EAAuC,QAAnBp1B,EAAAg1B,EAAMxtB,aAAa,IAAAxH,OAAA,EAAAA,EAAEgR,SACzCqkB,EAAqC,QAAnB1yB,EAAAqyB,EAAMxtB,aAAa,IAAA7E,OAAA,EAAAA,EAAEqR,OAC7CihB,EAAWjkB,SAAW,SAACvU,GACrB04B,EAAclV,EAAMxjB,EAAEgX,OAAOnW,OAC7B83B,SAAAA,EAAmB34B,GAEfwjB,GAAQ0T,GAEVhpB,WAAW,WACTgpB,EAAYxC,cAAclR,EAC3B,EAAE,EAEP,EACAgV,EAAWjhB,OAAS,SAACvX,GACfwjB,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAClC0T,EAAYxC,cAAclR,IAE5BoV,SAAAA,EAAiB54B,EACnB,EACAw4B,EAAW7uB,MAAmC,UAA3B4tB,CACpB,MAEI,GAAoB,WAAhBjuB,EAA0B,CACjCkvB,EAAW33B,MAAQ43B,EACnB,IAAMI,EAAuC,QAAnBzyB,EAAAmyB,EAAMxtB,aAAa,IAAA3E,OAAA,EAAAA,EAAEmO,SACzCukB,EAAqC,QAAnBzyB,EAAAkyB,EAAMxtB,aAAa,IAAA1E,OAAA,EAAAA,EAAEkR,OAC7CihB,EAAWjkB,SAAW,SAAC1T,EAAY6vB,GACjCgI,EAAclV,EAAM3iB,GACpBg4B,SAAAA,EAAmBh4B,EAAO6vB,GAEtBlN,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAElCtV,WAAW,WACTgpB,EAAYxC,cAAclR,EAC3B,EAAE,GAEP,EACAgV,EAAWjhB,OAAS,SAACvX,GACfwjB,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAClC0T,EAAYxC,cAAclR,IAE5BsV,SAAAA,EAAiB94B,EACnB,EACAw4B,EAAW7uB,MAAmC,UAA3B4tB,CACpB,MAEI,GAAoB,WAAhBjuB,EAA0B,CACjCkvB,EAAW9gB,QAAU+gB,IAAc,EACnC,IAAMM,EAAuC,QAAnBxyB,EAAAgyB,EAAMxtB,aAAa,IAAAxE,OAAA,EAAAA,EAAEgO,SAC/CikB,EAAWjkB,SAAW,SAACmD,EAAkB6Y,GACvCmI,EAAclV,EAAM9L,GACpBqhB,SAAAA,EAAmBrhB,EAAS6Y,GAExB/M,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAElCtV,WAAW,WACTgpB,EAAYxC,cAAclR,EAC3B,EAAE,GAEP,CACD,MAEI,GAAoB,aAAhBla,EAA4B,CACnCkvB,EAAW9gB,QAAU+gB,IAAc,EACnC,IAAMO,EAAuC,QAAnBtyB,EAAA6xB,EAAMxtB,aAAa,IAAArE,OAAA,EAAAA,EAAE6N,SAC/CikB,EAAWjkB,SAAW,SAACvU,GACrB04B,EAAclV,EAAMxjB,EAAEgX,OAAOU,SAC7BshB,SAAAA,EAAmBh5B,GAEfwjB,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAElCtV,WAAW,WACTgpB,EAAYxC,cAAclR,EAC3B,EAAE,GAEP,CACD,MAEI,GAAoB,UAAhBla,EAAyB,CAEhC,IAAM2vB,EAAiC,QAAnBryB,EAAA2xB,EAAMxtB,aAAa,IAAAnE,OAAA,EAAAA,EAAE/F,MACzC,QAAmB+U,IAAfqjB,EAA0B,CAC5BT,EAAW9gB,QAAU+gB,IAAeQ,EACpC,IAAMC,EAAuC,QAAnBnyB,EAAAwxB,EAAMxtB,aAAa,IAAAhE,OAAA,EAAAA,EAAEwN,SAC/CikB,EAAWjkB,SAAW,SAACvU,GACrB04B,EAAclV,EAAMyV,GACpBC,SAAAA,EAAmBl5B,GAEfwjB,GAAQ0T,IACVA,EAAYxD,gBAAgBlQ,GAAM,GAElCtV,WAAW,WACTgpB,EAAYxC,cAAclR,EAC3B,EAAE,GAEP,CACD,CACF,CACF,KAAM,MAEc5N,IAAf6iB,IACFD,EAAW33B,MAAQ43B,GAErB,IAAMU,EAAuC,QAAnBjyB,EAAAqxB,EAAMxtB,aAAa,IAAA7D,OAAA,EAAAA,EAAEqN,SAC/CikB,EAAWjkB,SAAW,SAACvU,WACfa,EAAwB,QAAhBqF,EAAS,QAAT3C,EAAAvD,aAAA,EAAAA,EAAGgX,cAAM,IAAAzT,OAAA,EAAAA,EAAE1C,aAAK,IAAAqF,EAAAA,EAAIlG,EAClC04B,EAAclV,EAAM3iB,GACpBs4B,SAAAA,EAAmBn5B,EACrB,CACD,CACF,CAOD,MAJ+B,UAA3Bu3B,GAAsC,UAAWiB,IACnDA,EAAW7uB,OAAQ,GAGdoJ,EAAMC,aAAaulB,EAAOC,EACnC,CA6HmBY,CAAWb,GAEbA,MAGVf,GACC5zB,EAAA,MAAA,CACEyB,MAAO,CACL2J,UAAW,MACX1K,SAAU,OACVC,WAAY,OACZ+D,WAAY,IACZvD,MAC6B,UAA3BwyB,EACI,UAC2B,YAA3BA,EACA,UACA,UACNhvB,WAAY,uBACb9E,SAEA+zB,IAGJT,IAAUS,GACT5zB,EACE,MAAA,CAAAyB,MAAO,CACL2J,UAAW,MACX1K,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,uBACb9E,SAEAszB,SAMb,EC/ZM,IAAAsC,GAAoC,SAAC91B,GACzC,IAAA2C,EAAA3C,EAAAmgB,MAAAA,OAAK,IAAAxd,EAAG,GAAEA,EACVozB,EAAW/1B,EAAA+1B,YACGC,EAAsBh2B,EAAAi2B,aACpCpzB,wBAAAqzB,aAAsB,GAAErzB,EACxBiW,EAAQ9Y,EAAA8Y,SACR+R,EAAU7qB,EAAA6qB,WACV3nB,EAAOlD,EAAAkD,QACPJ,EAAc9C,EAAAsD,UAAdA,OAAY,IAAAR,EAAA,KACZhB,UACAkB,EAAAhD,EAAA2B,MAAAA,OAAK,IAAAqB,EAAG,IAAGA,EAE0BzC,IAAUX,aAC/C,IAAMu2B,EAAUne,EAAuB,MACjCoe,EAAWpe,EAAiD,CAAA,GAG5Dqe,OAAsDhkB,IAA3B2jB,EAC3B3yB,EAAkDQ,EAAmBqyB,GAApEI,EAAoBjzB,EAAA,GAAEkzB,EAAuBlzB,EAAA,GAE9C4yB,EAAeI,EAA2BL,EAAyBM,EAGnEE,EAAU,SAACvjB,GACf,MAAO,aAAcA,GAAQ1T,MAAMia,QAAQvG,EAAK/S,SAClD,EAGMu2B,EAAa1rB,EACjB,SAAC+I,EAAaqM,EAAyCvL,QAAA,IAAAA,IAAAA,EAAmB,IACxE,IAAmB,IAAAsG,EAAA,EAAAwb,EAAKvW,EAALjF,WAAAA,IAAO,CAArB,IAAMjI,EAAIyjB,EAAAxb,GACb,GAAIsb,EAAQvjB,GAAO,CAEjB,IAAM0jB,EAAQF,EAAW3iB,EAAKb,EAAK/S,SAAU0U,GAC7C,GAAI+hB,EAAO,OAAOA,CACnB,KAAM,CACL,IAAMC,EAAW3jB,EACX4jB,SAAkBjiB,GAAI,GAAA,CAAEgiB,EAAS9iB,SACvC,GAAI8iB,EAAS9iB,MAAQA,EACnB,OAAO+iB,CAEV,CACF,CACD,OAAO,IACR,EACD,IAIIC,EAAkB/rB,EACtB,SAACkI,SACC,IAAIA,EAAKlQ,SAAT,CAEA,IAEIg0B,EAFEC,EAAUP,EAAWxjB,EAAKa,IAAKqM,IAAU,CAAClN,EAAKa,KAClCmiB,EAAapd,SAAS5F,EAAKa,MAI5CijB,EAAkBd,EAAa/tB,OAAO,SAACyQ,GAAM,OAAAA,IAAM1F,EAAKa,GAAX,GAC7C+W,SAAAA,EAAa,CAAE/W,IAAKb,EAAKa,IAAKkjB,UAASf,aAAcc,MAErDA,EAAkB,CAAC9jB,EAAKa,KACxBgF,SAAAA,EAAW,CAAEhF,IAAKb,EAAKa,IAAKkjB,UAASf,aAAcc,KAGhDV,GACHE,EAAwBQ,GAId,QAAZ/2B,EAAAiT,EAAK/P,eAAO,IAAAlD,GAAAA,EAAA3D,KAAA4W,EAAG,CAAEa,IAAKb,EAAKa,IAAKkjB,QAAOA,IAGlC/jB,EAAKgkB,iBACR/zB,SAAAA,EAAU,CAAE4Q,IAAKb,EAAKa,IAAKkjB,QAAOA,GAvBV,CAyB5B,EACA,CAACf,EAAcI,EAA0Bvd,EAAU+R,EAAY3nB,EAASid,EAAOsW,IAgG3ES,EAAiB,SAACjkB,GACtB,IAAM6K,EAAamY,EAAapd,SAAS5F,EAAKa,KAG9C,GAAIb,EAAKhG,OACP,OACE5M,EAAA,MAAA,CAAoBiD,UAAW2P,EAAK3P,UAAWxB,MAAOmR,EAAKnR,MAAK5B,SAC7D+S,EAAKhG,OAAOgG,EAAM6K,IADX7K,EAAKa,KAMnB,IAAMkR,KACJvgB,QAAS,OACTC,WAAY,SACZ2G,QAAS,YACTlG,OAAQ8N,EAAKlQ,SAAW,cAAgB,UACxChC,SAAU,OACVC,WAAY,OACZgE,WAAY,sBACZxD,MAAOyR,EAAKlQ,SACR,UACAkQ,EAAKkkB,OACL,UACA,UACJ3xB,gBAAiB,cACjBH,WAAY,yBACZ7C,QAASyQ,EAAKlQ,SAAW,GAAM,GAC5BkQ,EAAKnR,OAGV,OACEL,EAAA,MAAA,CAEE+S,IAAK,SAACC,GACJ2hB,EAAS9lB,QAAQ2C,EAAKa,KAAOW,CAC/B,EACAnR,UAAW,iBAAA7D,OAAiBwT,EAAK3P,WAAa,IAC9CxB,MAAOkjB,EACP9hB,QAAS,WAAM,OAAA4zB,EAAgB7jB,IAC/BtN,aAAc,SAAClJ,GACRwW,EAAKlQ,WACRtG,EAAEkP,cAAc7J,MAAM0D,gBAAkB,UAE5C,EACAI,aAAc,SAACnJ,GACbA,EAAEkP,cAAc7J,MAAM0D,gBAAkB,eACzCtF,SAAA,CAGA+S,EAAK1P,MACJlD,EAAA,MAAA,CACEyB,MAAO,CACL2C,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBhD,MAAO,OACPf,OAAQ,OACR0K,YAAa,OACb1G,WAAY,EACZpD,MAAOyR,EAAKlQ,SACR,UACAkQ,EAAKkkB,OACL,UACA,WAGLj3B,SAAA+S,EAAK1P,OAIVlD,EAAM,OAAA,CAAAyB,MAAO,CAAEyJ,KAAM,GAAGrL,SAAG+S,EAAK/U,UAtC3B+U,EAAKa,IAyChB,EAYMoQ,EACJzoB,EAAA,CAAAkG,MAAwB,iBAAVA,EAAqB,UAAGA,EAAK,MAAOA,EAClD6D,gBAAiB,UACjBP,aAAc,OACdQ,UAAW,4EACX0F,SAAU,SACVnG,WAAY,uBACTlD,GAICs1B,EAAoB,SAAClkB,EAAeiN,GACxC,GAAc,IAAVjN,EAAa,OAAO,EACxB,IAAMmkB,EAAclX,EAAMjN,GACpBokB,EAAWnX,EAAMjN,EAAQ,GAG/B,QAAIsjB,EAAQc,OAIRd,EAAQa,IAAiBb,EAAQc,GAIvC,EAEA,OACE71B,SAAK+S,IAAK2hB,EAAS7yB,UAAW,iBAAA7D,OAAiB6D,GAAaxB,MAAOoiB,EAEhEhkB,SAAA,CAAA61B,IA/MEA,EAGDA,EAAY9oB,OACP8oB,EAAY9oB,OAAO8oB,GAI1B11B,SACE6C,QAAS6yB,EAAY7yB,QACrBpB,MAAO,CACLuJ,QAAS,OACTlG,OAAQ4wB,EAAY7yB,QAAU,UAAY,UAC1CwZ,aAAc,qBACfxc,SAEDuB,SAAKK,MAAO,CAAE2C,QAAS,OAAQC,WAAY,SAAUxD,IAAK,QAExDhB,SAAA,CAAAuB,EAAA,MAAA,CAAKK,MAAO,CAAEgD,SAAU,WAAYF,WAAY,GAAG1E,SAAA,CAChD61B,EAAYwB,QACXl3B,EAAA,MAAA,CACEyB,MAAO,CACLH,MAAO,OACPf,OAAQ,OACRqE,aAAc,MACdO,gBAAiB,UACjBf,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB5D,SAAU,OACVS,MAAO,WACRtB,SAE4B,iBAArB61B,EAAY9V,KAAoB8V,EAAY9V,KAAKuX,OAAO,GAAGC,cAAgB,WAI/DplB,IAAvB0jB,EAAY2B,QACXr3B,EAAA,MAAA,CACEyB,MAAO,CACLgD,SAAU,WACVgF,OAAQ,IACRD,MAAO,IACPlI,MAAO,OACPf,OAAQ,OACRqE,aAAc,MACdO,gBAAiBuwB,EAAY2B,OAAS,UAAY,UAClDxyB,OAAQ,0BAMhBzD,SAAKK,MAAO,CAAEyJ,KAAM,EAAGC,SAAU,GAC/BtL,SAAA,CAAAG,EAAA,MAAA,CACEyB,MAAO,CACLf,SAAU,OACVgE,WAAY,IACZ/D,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZ0a,aAAc,MACdvU,SAAU,SACVgjB,aAAc,WACd1J,WAAY,UACbvkB,SAEA61B,EAAY9V,OAEd8V,EAAYrE,OACXrxB,EACE,MAAA,CAAAyB,MAAO,CACLf,SAAU,OACVC,WAAY,OACZQ,MAAO,UACPwD,WAAY,sBACZmG,SAAU,SACVgjB,aAAc,WACd1J,WAAY,UAGbvkB,SAAA61B,EAAYrE,gBAjFA,MAkNvBrxB,EAAA,MAAA,CAAAH,SACGigB,EAAMjX,IAAI,SAAC+J,EAAMC,GAAU,OAC1BzR,EAAC+N,EAAM0O,oBAEJkZ,EAAkBlkB,EAAOiN,IACxB9f,EACE,MAAA,CAAAyB,MAAO,CACLlB,OAAQ,MACR4E,gBAAiB,UACjBiN,OAAQ,WAKb+jB,EAAQvjB,IAxDE0kB,EAyDK1kB,EAvDtB5S,EAAkC,MAAA,CAAAiD,UAAW,kBAAA7D,OAAkBk4B,EAAMr0B,WAAa,IAC/EpD,SAAAy3B,EAAMz3B,SAASgJ,IAAI,SAAC+J,GAAS,OAAAikB,EAAejkB,EAAf,IADtB,gBAAS0kB,EAAMlxB,SAwDfywB,EAAejkB,KAdAC,GA5CT,IAACykB,QAgEvB,EAEA7B,GAAS/vB,YAAc,WCtVvB,IAqEM6xB,GAAoB,SACxBC,EACAC,EACAhzB,EACA5D,QAAA,IAAAA,IAAAA,EAvEkB,GAyElB,IAAM4rB,EAAU7gB,OAAO6gB,SAAW7gB,OAAO8rB,YACnClL,EAAU5gB,OAAO4gB,SAAW5gB,OAAO+rB,YAEnCC,EAAiBJ,EAAYruB,KAAOquB,EAAYl2B,MAAQ,EACxDu2B,EAAiBL,EAAYtuB,IAAMsuB,EAAYj3B,OAAS,EAIxDu3B,EAAWj3B,EAnFA,EAqFbqI,EAAM,EACNC,EAAO,EAEX,OAAQ1E,GACN,IAAK,MACHyE,EAAMsuB,EAAYtuB,IAAMuuB,EAAYl3B,OAASu3B,EAAWtL,EACxDrjB,EAAOyuB,EAAiBH,EAAYn2B,MAAQ,EAAImrB,EAChD,MACF,IAAK,SA4BL,QACEvjB,EAAMsuB,EAAY/tB,OAASquB,EAAWtL,EACtCrjB,EAAOyuB,EAAiBH,EAAYn2B,MAAQ,EAAImrB,QA1BlD,IAAK,OACHvjB,EAAM2uB,EAAiBJ,EAAYl3B,OAAS,EAAIisB,EAChDrjB,EAAOquB,EAAYruB,KAAOsuB,EAAYn2B,MAAQw2B,EAAWrL,EACzD,MACF,IAAK,QACHvjB,EAAM2uB,EAAiBJ,EAAYl3B,OAAS,EAAIisB,EAChDrjB,EAAOquB,EAAYhuB,MAAQsuB,EAAWrL,EACtC,MACF,IAAK,WACHvjB,EAAMsuB,EAAYtuB,IAAMuuB,EAAYl3B,OAASu3B,EAAWtL,EACxDrjB,EAAOquB,EAAYruB,KAAOsjB,EAC1B,MACF,IAAK,YACHvjB,EAAMsuB,EAAYtuB,IAAMuuB,EAAYl3B,OAASu3B,EAAWtL,EACxDrjB,EAAOquB,EAAYhuB,MAAQiuB,EAAYn2B,MAAQmrB,EAC/C,MACF,IAAK,cACHvjB,EAAMsuB,EAAY/tB,OAASquB,EAAWtL,EACtCrjB,EAAOquB,EAAYruB,KAAOsjB,EAC1B,MACF,IAAK,eACHvjB,EAAMsuB,EAAY/tB,OAASquB,EAAWtL,EACtCrjB,EAAOquB,EAAYhuB,MAAQiuB,EAAYn2B,MAAQmrB,EAQnD,IAAMsL,EAAgBnsB,OAAOkM,WACvBkgB,EAAiBpsB,OAAOqsB,YAc9B,OAXI9uB,EAAOsjB,EAFK,EAGdtjB,EAAOsjB,EAHO,EAILtjB,EAAOsuB,EAAYn2B,MAAQmrB,EAAUsL,EAJhC,IAKd5uB,EAAOsjB,EAAUsL,EAAgBN,EAAYn2B,MAL/B,GAQZ4H,EAAMsjB,EARM,EASdtjB,EAAMsjB,EATQ,EAULtjB,EAAMuuB,EAAYl3B,OAASisB,EAAUwL,EAVhC,IAWd9uB,EAAMsjB,EAAUwL,EAAiBP,EAAYl3B,OAX/B,GAaT,CAAE2I,IAAGA,EAAEC,KAAIA,EACpB,EAGM+uB,GAAc,SAClBV,EACAC,EACAhzB,EACA5D,QAAA,IAAAA,IAAAA,EApJkB,GAuJZ,IAAAlB,EAA+C43B,GACnDC,EACAC,EACAhzB,EACA5D,GAJWs3B,QAAqBC,SAQ5B3L,EAAU7gB,OAAO6gB,SAAW7gB,OAAO8rB,YAEnCxuB,EAAMivB,GADIvsB,OAAO4gB,SAAW5gB,OAAO+rB,aAEnCxuB,EAAOivB,EAAiB3L,EAGxB4L,EAAgBnvB,EAAMuuB,EAAYl3B,OAClC+3B,EAAenvB,EAAOsuB,EAAYn2B,MAClCi3B,EAAarvB,EACbsvB,EAAcrvB,EAGdsvB,EAAapxB,KAAK2L,IAAIulB,EAAYf,EAAYtuB,KAC9CwvB,EAAgBrxB,KAAKmL,IAAI6lB,EAAeb,EAAY/tB,QACpDkvB,EAActxB,KAAK2L,IAAIwlB,EAAahB,EAAYruB,MAChDyvB,EAAevxB,KAAKmL,IAAI8lB,EAAcd,EAAYhuB,OAGxD,OAAOkvB,EAAgBD,EAAa,GAAKG,EAAeD,EAAc,CACxE,EAmDME,GAAc,SAClBp0B,EACAq0B,GAEA,IAAMC,KACJt0B,SAAU,WACVnD,MAAO,EACPf,OAAQ,EACRy4B,YAAa,SACVF,GAGCG,EAA4D,CAChE/vB,WACK6vB,GAAc,CACjBG,YAAa,UAtPA,EAsPa,OAAA95B,OAtPb,EAsP6B,SAAAA,OAtP7B,EAsPmD,MAChEmU,YAAa,gDAEf9J,cACKsvB,GAAc,CACjBG,YAAa,YA3PA,EA2Pe,OAAA95B,OA3Pf,EA2P+B,OAAAA,OA3P/B,EA2PmD,MAChEmU,YAAa,gDAEfpK,YACK4vB,GAAc,CACjBG,YAAa,UAhQA,EAgQa,SAAA95B,OAhQb,EAgQ+B,OAAAA,OAhQ/B,EAgQmD,MAChEmU,YAAa,gDAEf/J,aACKuvB,GAAc,CACjBG,YAAa,UArQA,EAqQa,OAAA95B,OArQb,EAqQ6B,OAAAA,OArQ7B,EAqQmD,QAChEmU,YAAa,gDAEf,kBACKwlB,GAAc,CACjBG,YAAa,UA1QA,EA0Qa,OAAA95B,OA1Qb,EA0Q6B,SAAAA,OA1Q7B,EA0QmD,MAChEmU,YAAa,gDAEf,mBACKwlB,GAAc,CACjBG,YAAa,UA/QA,EA+Qa,OAAA95B,OA/Qb,EA+Q6B,SAAAA,OA/Q7B,EA+QmD,MAChEmU,YAAa,gDAEf,qBACKwlB,GAAc,CACjBG,YAAa,YApRA,EAoRe,OAAA95B,OApRf,EAoR+B,OAAAA,OApR/B,EAoRmD,MAChEmU,YAAa,gDAEf,sBACKwlB,GAAc,CACjBG,YAAa,YAzRA,EAyRe,OAAA95B,OAzRf,EAyR+B,OAAAA,OAzR/B,EAyRmD,MAChEmU,YAAa,iDAGjB,OAAOvT,EAAA,MAAA,CAAKyB,MAAOw3B,EAAYx0B,IACjC,EAEM00B,GAAkC,SAACx5B,GACvC,IAAAy0B,EAAOz0B,EAAAy0B,QACPv0B,EAAQF,EAAAE,SACRyC,EAAgB3C,EAAA8E,SAAhBA,OAAQ,IAAAnC,EAAG,MAAKA,EAChBE,EAAiB7C,EAAAy5B,QAAjBA,OAAU,IAAA52B,EAAA,QAAOA,EACjBC,UAAA42B,OAAQ,IAAA52B,EAAA,MACRE,EAAAhD,EAAA+C,SAAAA,cAAgBC,EAChBG,EAAAnD,EAAAsD,UAAAA,OAAS,IAAAH,EAAG,GAAEA,EACdE,EAAqBrD,EAAA25B,iBAArBA,OAAgB,IAAAt2B,EAAG,GAAEA,EACrBG,EAAiBxD,EAAAkB,IAAjBA,OAAM,IAAAsC,EAvSY,EAuSDA,EACjBG,cAAAi2B,OAAY,IAAAj2B,KACZhC,EAAK3B,EAAA2B,MACLiC,mBAAAi2B,OAAiB,IAAAj2B,KACjBmD,EAAO/G,EAAA+G,QACP+yB,EAAe95B,EAAA85B,gBAGTnZ,OAA2BtO,IAAZtL,EACf/C,EAAwCH,EAASg2B,GAAhDE,EAAe/1B,EAAA,GAAEg2B,EAAkBh2B,EAAA,GACpC+F,EAAY4W,EAAe5Z,EAAUgzB,EAGrC3oB,EAAgCvN,EAAS8c,EAAgB5Z,SAAAA,EAAoB8yB,GAA5EI,EAAW7oB,EAAA,GAAE8oB,EAAc9oB,EAAA,GAE5BpH,EAAee,EAAY,SAACovB,GAC3BxZ,GACHqZ,EAAmBG,GAErBL,SAAAA,EAAkBK,EACpB,EAAG,CAACxZ,EAAcmZ,IAGlB/wB,EAAU,WACJ4X,IACE5Z,EAEF6b,sBAAsB,WACpBsX,GAAe,EACjB,GAGAA,GAAe,GAGrB,EAAG,CAACvZ,EAAc5Z,IACZ,IAAAsK,EAAsCxN,EAA0BiB,GAA/Ds1B,EAAc/oB,EAAA,GAAEgpB,EAAiBhpB,EAAA,GAClC0E,EAAwClS,EAAiB,SAAxDy2B,EAAevkB,EAAA,GAAEwkB,EAAkBxkB,EAAA,GACpCtE,EAAkC5N,EAA8B,CACpEiB,SAAU,WACVyE,IAAK,EACLC,KAAM,EACNE,cAA2B,UAAZ+vB,EAAsB,OAAS,SAJzCe,EAAY/oB,EAAA,GAAEgpB,OAMf/oB,EAA8B7N,EAA8B,CAAE,GAA7Ds1B,EAAUznB,EAAA,GAAEgpB,EAAahpB,EAAA,GAE1BipB,GAAa3iB,EAAuB,MACpC4c,GAAa5c,EAAuB,MACpC4iB,GAAa5iB,EAA8B,MAC3C6iB,GAAiB7iB,EAA8B,MAE/C8iB,GAAiB/vB,EAAY,WACjC,GAAK4vB,GAAWrqB,SAAYskB,GAAWtkB,SAAYvG,GAG9CkwB,EAAL,CAEA,IAAMpC,EAAc8C,GAAWrqB,QAAQ4R,wBACjC4V,EAAclD,GAAWtkB,QAAQ4R,wBAGjC6Y,EA/Kc,SACtBlD,EACAC,EACAkD,EACA95B,GAGA,QAHA,IAAAA,IAAAA,EAzLkB,IA4Lbq3B,GAAYV,EAAaC,EAAakD,EAAmB95B,GAC5D,OAAO85B,EA6BT,IAzBA,IAyBwB9f,EAAA,EAAA+f,EAzBM,SAACC,GAC7B,OAAQA,GACN,IAAK,MACH,MAAO,CAAC,SAAU,QAAS,QAC7B,IAAK,SACH,MAAO,CAAC,MAAO,QAAS,QAC1B,IAAK,OACH,MAAO,CAAC,QAAS,MAAO,UAC1B,IAAK,QACH,MAAO,CAAC,OAAQ,MAAO,UACzB,IAAK,WACH,MAAO,CAAC,cAAe,YAAa,eAAgB,QAAS,QAC/D,IAAK,YACH,MAAO,CAAC,eAAgB,WAAY,cAAe,OAAQ,SAC7D,IAAK,cACH,MAAO,CAAC,WAAY,eAAgB,YAAa,QAAS,QAC5D,IAAK,eACH,MAAO,CAAC,YAAa,cAAe,WAAY,OAAQ,SAC1D,QACE,MAAO,GAEb,CAGmBC,CAAsBH,GACjB9f,WAAAA,IAAY,CAA/B,IAAMkgB,EAASH,EAAA/f,GAClB,IAAKqd,GAAYV,EAAaC,EAAasD,EAAWl6B,GACpD,OAAOk6B,CAEV,CAGD,OAAOJ,CACT,CAkI0BK,CAAgBxD,EAAaC,EAAahzB,EAAU5D,GAC1Em5B,EAAkBU,GAEZ,IAAA/6B,EAAgB43B,GAAkBC,EAAaC,EAAaiD,EAAe75B,GAAzEqI,QAAKC,SAab,GAZAixB,EAAgB,SAAC9W,GAAS,OACrBloB,EAAAA,EAAA,GAAAkoB,GACH,CAAA7e,SAAU,WACVyE,IAAK,UAAGA,EAAG,MACXC,KAAM,GAAG/J,OAAA+J,EAAQ,MAGjBE,cAA2B,UAAZ+vB,EAAsB,OAAS,OAC9ChwB,OAAQ,MARgB,GAYtBmwB,EAAW,CACb,IAAM0B,EAlXa,SACvBx2B,EACA+yB,EACAC,EACAe,EACAD,GAEA,IAAM9L,EAAU7gB,OAAO6gB,SAAW7gB,OAAO8rB,YACnClL,EAAU5gB,OAAO4gB,SAAW5gB,OAAO+rB,YAEnCC,EAAiBJ,EAAYruB,MAAQquB,EAAYl2B,MAftC,GAe4D,EACvEu2B,EAAiBL,EAAYtuB,KAAOsuB,EAAYj3B,OAhBrC,GAgB4D,EAGvE26B,EAAsB1C,EAAc/L,EACpC0O,EAAqB5C,EAAa/L,EAExC,OAAQ/nB,GACN,IAAK,MACH,MAAO,CACLgF,QAzBW,EA0BXN,KAAM9B,KAAKmL,IAAInL,KAAK2L,IAAI4kB,EAAiBsD,EA1B9B,GA0BgEzD,EAAYn2B,MA1B5E,IA4Bf,IAAK,SACH,MAAO,CACL4H,KA9BW,EA+BXC,KAAM9B,KAAKmL,IAAInL,KAAK2L,IAAI4kB,EAAiBsD,EA/B9B,GA+BgEzD,EAAYn2B,MA/B5E,IAiCf,IAAK,OACH,MAAO,CACLkI,OAnCW,EAoCXN,IAAK7B,KAAKmL,IAAInL,KAAK2L,IAAI6kB,EAAiBsD,EApC7B,GAoC8D1D,EAAYl3B,OApC1E,IAsCf,IAAK,QACH,MAAO,CACL4I,MAxCW,EAyCXD,IAAK7B,KAAKmL,IAAInL,KAAK2L,IAAI6kB,EAAiBsD,EAzC7B,GAyC8D1D,EAAYl3B,OAzC1E,IA2Cf,IAAK,WACH,MAAO,CACLkJ,QA7CW,EA8CXN,KAAM,IAEV,IAAK,YACH,MAAO,CACLM,QAlDW,EAmDXD,MAAO,IAEX,IAAK,cACH,MAAO,CACLN,KAvDW,EAwDXC,KAAM,IAEV,IAAK,eACH,MAAO,CACLD,KA5DW,EA6DXM,MAAO,IAEX,QACE,MAAO,GAEb,CAqTuB4xB,CACfV,EACAlD,EACAC,EACAtuB,EACAD,GAEFmxB,EAAcY,EACf,CA/BwB,CAgC3B,EAAG,CAACvxB,EAAWjF,EAAU5D,EAAK04B,EAAWK,EAAaR,IAEhD/E,GAAc3pB,EAAY,WAC1BhI,IAGA83B,GAAevqB,UACjB1F,aAAaiwB,GAAevqB,SAC5BuqB,GAAevqB,QAAU,MAGvBsqB,GAAWtqB,SACb1F,aAAagwB,GAAWtqB,SAG1BsqB,GAAWtqB,QAAU3F,WAAW,WAC9BX,GAAa,GAER2W,GAEHiC,sBAAsB,WACpBsX,GAAe,EACjB,EAGH,EAAER,GACJ,EAAE,CAAC32B,EAAU22B,EAAO1vB,EAAc2W,IAE7B+a,GAAc3wB,EAAY,WAE1B6vB,GAAWtqB,UACb1F,aAAagwB,GAAWtqB,SACxBsqB,GAAWtqB,QAAU,MAInBuqB,GAAevqB,SACjB1F,aAAaiwB,GAAevqB,SAGzBqQ,EASH3W,GAAa,IAPbkwB,GAAe,GACfW,GAAevqB,QAAU3F,WAAW,WAClCX,GAAa,GACb6wB,GAAevqB,QAAU,IAC1B,EAAE,KAKP,EAAG,CAACtG,EAAc2W,IAGZgb,GAAqB5wB,EAAY,WACrB,UAAZ0uB,IAGAoB,GAAevqB,UACjB1F,aAAaiwB,GAAevqB,SAC5BuqB,GAAevqB,QAAU,MAItBvG,IACHC,GAAa,GACb4Y,sBAAsB,WACpBsX,GAAe,EACjB,IAEJ,EAAG,CAACT,EAAS1vB,IAGPiB,GAAcD,EAAY,SAACtO,GAC3BsG,GAAwB,UAAZ02B,IAEhBh9B,EAAEiP,kBAGE3B,EACF2xB,MAGId,GAAWtqB,UACb1F,aAAagwB,GAAWtqB,SACxBsqB,GAAWtqB,QAAU,MAEvBtG,GAAa,GACb4Y,sBAAsB,WACpBsX,GAAe,EACjB,IAEH,EAAE,CAACn3B,EAAU02B,EAAS1vB,EAAW2xB,KAGlC3yB,EAAU,WACR,GAAI8wB,GAAkB9vB,GAAakwB,EAAa,CAE9C,IAAM2B,EAAoB,WACpBjB,GAAWrqB,SAAWskB,GAAWtkB,QACnCwqB,KAGAnwB,WAAW,WACTiY,sBAAsBgZ,EACvB,EAAE,GAEP,EAGAjxB,WAAW,WACTiY,sBAAsBgZ,EACvB,EAAE,EACJ,CACF,EAAE,CAAC/B,EAAgB9vB,EAAWkwB,EAAaa,KAE5C/xB,EAAU,WACR,GAAIgB,EAUF,OARA6Y,sBAAsB,WACpBkY,IACF,GAGA7uB,OAAOmM,iBAAiB,SAAU0iB,IAAgB,GAClD7uB,OAAOmM,iBAAiB,SAAU0iB,IAE3B,WACL7uB,OAAOoM,oBAAoB,SAAUyiB,IAAgB,GACrD7uB,OAAOoM,oBAAoB,SAAUyiB,GACvC,CAEJ,EAAG,CAAC/wB,EAAW+wB,KAGf/xB,EAAU,WACR,GAAKgB,GAAyB,UAAZ0vB,EAAlB,CAEA,IAAM1M,EAAqB,SAACC,GAExB2N,GAAWrqB,SACXskB,GAAWtkB,UACVqqB,GAAWrqB,QAAQ2c,SAASD,EAAMvZ,UAClCmhB,GAAWtkB,QAAQ2c,SAASD,EAAMvZ,SAEnCioB,IAEJ,EAKA,OAFAxvB,SAASkM,iBAAiB,YAAa2U,GAAoB,GAEpD,WACL7gB,SAASmM,oBAAoB,YAAa0U,GAAoB,EAChE,CAlB8C,CAmB/C,EAAE,CAAChjB,EAAW0vB,EAASiC,KAExB3yB,EAAU,WACR,OAAO,WACD6xB,GAAWtqB,SACb1F,aAAagwB,GAAWtqB,SAEtBuqB,GAAevqB,SACjB1F,aAAaiwB,GAAevqB,QAEhC,CACD,EAAE,IAGH,IAAMurB,GAA6C,CACjD/2B,SAAU,WACVyE,IAAK,EACLC,KAAM,EACNhH,QAASy3B,EAAc,EAAI,EAC3B7uB,UAAW6uB,EAAc,WAAa,cACtC50B,WAAY,mDAEZqE,cAA2B,UAAZ+vB,EAAsB,OAAS,OAC9ChwB,OAAQ,MAIJqyB,GAA2B/wB,EAAY,WAC3C,MAAsB,oBAAXkB,QACWA,OAAOkM,YAGL,IAJkB,QAIF,oBACzC,EAAE,IAGHpP,EAAU,WACR,IAAMgzB,EAAiB,WACrBxB,EAAmBuB,KACrB,EAKA,OAHAC,IACA9vB,OAAOmM,iBAAiB,SAAU2jB,GAE3B,WACL9vB,OAAOoM,oBAAoB,SAAU0jB,EACvC,CACF,EAAG,CAACD,KAGJ,IAAME,GACJvgC,EAAAA,EAAA,CAAA+J,gBAAiB,UACjBhE,MAAO,UACP6J,QAAS,WACTpG,aAAc,MACdlE,SAAU,OACVgE,WAAY,IACZC,WAAY,sBACZhE,WAAY,aAEEqR,IAAV1Q,EACA,CACEA,MAAwB,iBAAVA,EAAqB,GAAAlC,OAAGkC,EAAK,MAAOA,EAElDsJ,SAA4B,oBAAXgB,QAA0BA,OAAOkM,WAAa,IAC3D,0BACA9F,GAEN,CACEpH,SAAUqvB,EACV34B,MAAO,gBACP,CACNs6B,SAAU,aACVx2B,UAAW,wEACXgf,WAAY,WACZ3f,SAAU,WACVyP,UAAW,eAGP2nB,GACJz6B,EAAA,MAAA,CACEK,MAAOrG,EAAAA,EAAAA,EAAA,CAAA,EACFogC,IACArB,GAAY,CAEf9wB,cAA2B,UAAZ+vB,EAAsB,OAAS,SAEhDn2B,UAAW,8BAAuBq2B,GAClCh0B,aAA0B,UAAZ8zB,EAAsBkC,QAAqBtpB,EACzDzM,aAA0B,UAAZ6zB,EAAsBiC,QAAcrpB,YAElDhS,EACE,MAAA,CAAAmU,IAAKogB,GACLtxB,UAAW,sBAAeq2B,GAC1B73B,MAAOk6B,GACPxR,KAAK,UAEJtqB,SAAAu0B,IAEFmF,GAAaV,GAAYkB,EAAgBjB,MAKxCgD,GAA0BpxB,EAAY,WAC1B,UAAZ0uB,IAIJoB,GAAevqB,QAAU3F,WAAW,WAClC+wB,IACD,EAAE,KACL,EAAG,CAACjC,EAASiC,KAGPU,GAA2B,UAAZ3C,EACjB,CACEv2B,QAAS8H,IAEX,CACErF,aAAc+uB,GACd9uB,aAAcu2B,GACdpoB,QAAS2gB,GACT1gB,OAAQ0nB,IAGd,OACEj6B,EACEC,EAAA,CAAAxB,SAAA,CAAAG,EAAA,MAAA5E,EAAA,CACE+Y,IAAKmmB,GACLr3B,UAAW,uBAAuB7D,OAAA6D,GAClCxB,MAAO,CAAE2C,QAAS,eAAgBU,OAAoB,UAAZs0B,EAAsB,UAAY,YACxE2C,GAAY,CAAAl8B,SAEfA,KAEF6J,GAAiC,oBAAbmC,UAA4BsB,EAAa0uB,GAAgBhwB,SAASpO,QAG7F","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Alert/index.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/icons/index.tsx","../src/components/Pagination/index.tsx","../src/components/Checkbox/index.tsx","../src/components/Table/index.tsx","../src/components/Radio/index.tsx","../src/components/Tab/index.tsx","../src/components/Progress/index.tsx","../src/components/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/index.tsx","../src/components/Select/index.tsx","../src/components/DatePicker/index.tsx","../src/components/Form/FormContext.tsx","../src/components/Form/index.tsx","../src/components/Form/FormItem.tsx","../src/components/MenuList/index.tsx","../src/components/Tooltip/index.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\n\nexport interface ThemeConfig {\n primaryColor?: string;\n}\n\nconst defaultTheme: ThemeConfig = {\n primaryColor: '#FB6011',\n};\n\nconst ThemeContext = createContext<ThemeConfig>(defaultTheme);\n\nexport interface ThemeProviderProps {\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const themeValue = useMemo(() => {\n return {\n ...defaultTheme,\n ...theme,\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={themeValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeConfig => {\n const context = useContext(ThemeContext);\n if (!context) {\n // 如果没有 Provider,返回默认主题\n return defaultTheme;\n }\n return context;\n};\n\n// 导出默认主题色,供组件内部使用\nexport const getDefaultPrimaryColor = () => defaultTheme.primaryColor!;\n\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ButtonType = 'default' | 'primary';\nexport type ButtonSize = 'small' | 'mediumSmall' | 'medium' | 'large';\n\nexport interface ButtonProps {\n /** 按钮内容 */\n children?: React.ReactNode;\n /** 按钮类型 */\n type?: ButtonType;\n /** 按钮尺寸 */\n size?: ButtonSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否加载中 */\n loading?: boolean;\n /** 点击事件 */\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** 按钮原生type */\n htmlType?: 'button' | 'submit' | 'reset';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 图标 */\n icon?: React.ReactNode;\n /** 图标位置 */\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\n// 尺寸配置:高度分别为 32、36、40、48px\nconst SIZE_CONFIG = {\n small: {\n height: '32px',\n paddingLeft: '12px',\n paddingRight: '12px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n mediumSmall: {\n height: '36px',\n paddingLeft: '14px',\n paddingRight: '14px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n medium: {\n height: '40px',\n paddingLeft: '16px',\n paddingRight: '16px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '18px',\n gap: '8px',\n },\n large: {\n height: '48px',\n paddingLeft: '20px',\n paddingRight: '20px',\n fontSize: '16px',\n lineHeight: '24px',\n iconSize: '20px',\n gap: '8px',\n },\n};\n\n// Loading 图标组件\nconst LoadingIcon: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n // 使用 React 方式注入样式,避免在模块顶层操作 DOM\n const loadingStyles = `\n @keyframes aha-button-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n\n return (\n <>\n <style>{loadingStyles}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'aha-button-spin 1s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n );\n};\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'default',\n size = 'medium',\n disabled = false,\n loading = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const sizeConfig = SIZE_CONFIG[size];\n const isDisabled = disabled || loading;\n\n // 计算按钮样式\n const getButtonStyles = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingLeft: sizeConfig.paddingLeft,\n paddingRight: sizeConfig.paddingRight,\n fontSize: sizeConfig.fontSize,\n lineHeight: sizeConfig.lineHeight,\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n borderRadius: '8px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'all 0.2s',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n ...style,\n };\n\n if (type === 'primary') {\n // Primary 按钮:使用主题色,所有状态下文字都是白色\n baseStyle.color = '#FFFFFF';\n baseStyle.backgroundColor = primaryColor;\n if (disabled) {\n // disabled状态:保持primary样式,通过降低透明度表示禁用\n baseStyle.opacity = 0.4;\n baseStyle.cursor = 'not-allowed';\n } else if (loading) {\n // loading状态:保持primary样式(主题色背景)\n baseStyle.backgroundColor = primaryColor;\n } else if (isPressed) {\n baseStyle.backgroundColor = '#EC470A'; // 按下时的深色\n } else if (isHovered) {\n baseStyle.backgroundColor = '#FD843A'; // hover时的浅色\n }\n } else {\n // Default 按钮:白色背景,灰色边框\n if (disabled) {\n // disabled状态:灰色背景,灰色文字\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#D6D3D1';\n baseStyle.border = '1px solid #E7E5E4';\n } else if (loading) {\n // loading状态:保持default样式(白色背景+边框)\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isPressed) {\n baseStyle.backgroundColor = '#F5F5F4';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isHovered) {\n // Hover 状态:浅灰色背景,边框稍微变深,增强阴影\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 2px 4px 0px rgba(12, 10, 9, 0.08)';\n } else {\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n }\n }\n\n return baseStyle;\n };\n\n // 处理点击事件\n const handleClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // 渲染图标\n const renderIcon = () => {\n if (loading) {\n // loading时,根据按钮类型确定颜色\n // primary按钮:白色图标;default按钮:黑色图标\n const iconColor = type === 'primary' ? '#FFFFFF' : '#101828';\n const iconSize = parseInt(sizeConfig.iconSize.replace('px', ''));\n return <LoadingIcon size={iconSize} color={iconColor} />;\n }\n if (icon) {\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: sizeConfig.iconSize,\n height: sizeConfig.iconSize,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n }\n return null;\n };\n\n const buttonStyle = getButtonStyles();\n\n return (\n <button\n type={htmlType}\n className={`aha-button aha-button--${type} aha-button--${size} ${isDisabled ? 'aha-button--disabled' : ''} ${loading ? 'aha-button--loading' : ''} ${className}`}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => !isDisabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n style={buttonStyle}\n {...rest}\n >\n {/* loading时,图标总是在左侧显示,忽略iconPosition */}\n {loading && renderIcon()}\n {!loading && iconPosition === 'left' && renderIcon()}\n {children && <span style={{ display: 'inline-block' }}>{children}</span>}\n {!loading && iconPosition === 'right' && renderIcon()}\n </button>\n );\n};\n\nButton.displayName = 'Button';\n\nexport default Button;\n","export const AlertIcon = {\n success: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 1.66663C5.40002 1.66663 1.66669 5.39996 1.66669 9.99996C1.66669 14.6 5.40002 18.3333 10 18.3333C14.6 18.3333 18.3334 14.6 18.3334 9.99996C18.3334 5.39996 14.6 1.66663 10 1.66663ZM13.3584 8.49997L9.46668 12.3833C9.35001 12.5083 9.19168 12.5666 9.02501 12.5666C8.86668 12.5666 8.70834 12.5083 8.58334 12.3833L6.64169 10.4417C6.40002 10.2 6.40002 9.79994 6.64169 9.55827C6.88336 9.3166 7.28335 9.3166 7.52502 9.55827L9.02501 11.0583L12.475 7.61664C12.7167 7.36664 13.1167 7.36664 13.3584 7.61664C13.6 7.8583 13.6 8.24997 13.3584 8.49997Z\"\n fill=\"#00BC7D\"\n />\n </svg>\n ),\n error: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17.1342 6.3009L13.6999 2.86666C13.4658 2.63249 13.1474 2.50085 12.8157 2.50085H7.18504C6.85337 2.50085 6.53584 2.63249 6.30084 2.86666L2.8666 6.3009C2.63243 6.53507 2.50079 6.85343 2.50079 7.1851V12.8158C2.50079 13.1475 2.63243 13.465 2.8666 13.7L6.30084 17.1342C6.53501 17.3684 6.85337 17.5 7.18504 17.5H12.8157C13.1474 17.5 13.4649 17.3684 13.6999 17.1342L17.1342 13.7C17.3683 13.4658 17.5 13.1475 17.5 12.8158V7.1851C17.5 6.85343 17.3683 6.53507 17.1342 6.3009ZM12.525 11.6417C12.7692 11.8858 12.7692 12.2817 12.525 12.5259C12.4033 12.6475 12.2433 12.7092 12.0833 12.7092C11.9233 12.7092 11.7633 12.6484 11.6416 12.5259L9.99998 10.8842L8.35834 12.5259C8.23667 12.6475 8.07665 12.7092 7.91665 12.7092C7.75665 12.7092 7.59662 12.6484 7.47496 12.5259C7.23079 12.2817 7.23079 11.8858 7.47496 11.6417L9.1166 10L7.47496 8.3584C7.23079 8.11423 7.23079 7.71837 7.47496 7.4742C7.71912 7.23004 8.11498 7.23004 8.35915 7.4742L10.0008 9.11585L11.6424 7.4742C11.8866 7.23004 12.2825 7.23004 12.5266 7.4742C12.7708 7.71837 12.7708 8.11423 12.5266 8.3584L10.885 10L12.525 11.6417Z\"\n fill=\"#FB2C36\"\n />\n </svg>\n ),\n warning: (\n <svg \n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.0057 14.2935L12.4999 3.99662C11.4333 2.00162 8.56744 2.00162 7.49995 3.99662L1.99417 14.2935C1.01583 16.1235 2.3442 18.3334 4.42337 18.3334H15.5765C17.6549 18.3334 18.9841 16.1226 18.0057 14.2935ZM9.37495 8.33337C9.37495 7.98837 9.65494 7.70837 9.99994 7.70837C10.3449 7.70837 10.6249 7.98837 10.6249 8.33337V11.6667C10.6249 12.0117 10.3449 12.2917 9.99994 12.2917C9.65494 12.2917 9.37495 12.0117 9.37495 11.6667V8.33337ZM10.0166 15C9.55663 15 9.17902 14.6267 9.17902 14.1667C9.17902 13.7067 9.54829 13.3334 10.0083 13.3334H10.0166C10.4775 13.3334 10.85 13.7067 10.85 14.1667C10.85 14.6267 10.4766 15 10.0166 15Z\"\n fill=\"#FE9A00\"\n />\n </svg>\n ),\n info: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6875 2.5H5.3125C3.4375 2.5 2.5 3.4375 2.5 5.3125V14.6875C2.5 16.5625 3.4375 17.5 5.3125 17.5H14.6875C16.5625 17.5 17.5 16.5625 17.5 14.6875V5.3125C17.5 3.4375 16.5625 2.5 14.6875 2.5ZM10.625 13.75C10.625 14.095 10.345 14.375 10 14.375C9.655 14.375 9.375 14.095 9.375 13.75V9.9408C9.375 9.5958 9.655 9.3158 10 9.3158C10.345 9.3158 10.625 9.5958 10.625 9.9408V13.75ZM10.0167 7.91667C9.55668 7.91667 9.17908 7.54333 9.17908 7.08333C9.17908 6.62333 9.54834 6.25 10.0083 6.25H10.0167C10.4775 6.25 10.85 6.62333 10.85 7.08333C10.85 7.54333 10.4767 7.91667 10.0167 7.91667Z\"\n fill=\"#2B7FFF\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"#57534D\"\n />\n </svg>\n);\n","import React, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2 relative\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div \n className=\"flex flex-col gap-1\"\n style={closeable ? { paddingRight: '2rem' } : {}}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && <div className=\"mt-3\">{action}</div>}\n </div>\n {action && !closeable && <div className=\"ml-3\">{action}</div>}\n {closeable && (\n <div\n className=\"absolute right-4 top-3 cursor-pointer\"\n onClick={handleClose}\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TagColor = 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet' | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\nexport type TagVariant = 'light' | 'fill';\nexport type TagSize = 'large' | 'small';\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color: TagColor; // 必需属性,支持预定义颜色或自定义十六进制颜色\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean; // 仅对 light 变体有效\n icon?: React.ReactElement; // 只允许 React 元素,不接受字符串\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// 颜色配置\nconst COLOR_CONFIG = {\n Green: {\n light: {\n bg: '#ECFDF5',\n text: '#006045',\n border: '#A4F4CF',\n },\n fill: {\n bg: '#00BC7D',\n text: '#FFFFFF',\n }\n },\n Red: {\n light: {\n bg: '#FEF2F2',\n text: '#9F0712',\n border: '#FFC9C9',\n },\n fill: {\n bg: '#FB2C36',\n text: '#FFFFFF',\n }\n },\n Orange: {\n light: {\n bg: '#FFF6ED',\n text: '#9B2911',\n border: '#FFD1A9',\n },\n fill: {\n bg: '#FB6011',\n text: '#FFFFFF',\n }\n },\n Cyan: {\n light: {\n bg: '#ECFEFF',\n text: '#005F78',\n border: '#A2F4FD',\n },\n fill: {\n bg: '#00B8DB',\n text: '#FFFFFF',\n }\n },\n Violet: {\n light: {\n bg: '#F5F3FF',\n text: '#5D0EC0',\n border: '#DDD6FF',\n },\n fill: {\n bg: '#8E51FF',\n text: '#FFFFFF',\n }\n },\n Pink: {\n light: {\n bg: '#FDF2F8',\n text: '#A3004C',\n border: '#FCCEE8',\n },\n fill: {\n bg: '#F6339A',\n text: '#FFFFFF',\n }\n },\n Gray: {\n light: {\n bg: '#F5F5F4',\n text: '#292524',\n border: '#E7E5E4',\n },\n fill: {\n bg: '#292524',\n text: '#FFFFFF',\n }\n },\n Yellow: {\n light: {\n bg: '#FFFBEB',\n text: '#973C00',\n border: '#FEE685',\n },\n fill: {\n bg: '#FE9A00',\n text: '#FFFFFF',\n }\n },\n Blue: {\n light: {\n bg: '#EFF6FF',\n text: '#193CB8',\n border: '#BEDBFF',\n },\n fill: {\n bg: '#2B7FFF',\n text: '#FFFFFF',\n }\n }\n};\n\n// 尺寸配置\nconst SIZE_CONFIG = {\n large: {\n padding: 'px-2 py-0.5',\n textSize: 'text-sm',\n iconSize: 'w-4 h-4',\n gap: 'gap-1',\n },\n small: {\n padding: 'px-2 py-0.5', // 与 large 相同的外层 padding\n textSize: 'text-xs',\n iconSize: 'w-3 h-3',\n gap: 'gap-0.5',\n }\n};\n\n// 获取颜色配置的函数\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的配置\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n // 如果是 Orange 颜色,使用主题色\n if (color === 'Orange' && primaryColor) {\n return {\n ...config,\n fill: {\n ...config.fill,\n bg: primaryColor,\n },\n };\n }\n return config;\n }\n \n // 如果是自定义颜色(十六进制),生成配置\n if (typeof color === 'string' && color.startsWith('#')) {\n // 将十六进制转换为 RGB 值\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n return {\n light: {\n bg: `rgba(${r}, ${g}, ${b}, 0.1)`, // 10% 透明度\n text: color,\n border: `rgba(${r}, ${g}, ${b}, 0.3)`, // 30% 透明度\n },\n fill: {\n bg: color,\n text: '#FFFFFF',\n }\n };\n }\n \n // 默认返回绿色配置\n return COLOR_CONFIG.Green;\n};\n\n// 获取图标颜色的函数\nconst getIconColor = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的图标颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#009966';\n case 'Red': return '#E7000B';\n case 'Orange': return primaryColor || '#E17100'; // 使用主题色\n case 'Blue': return '#155DFC';\n case 'Yellow': return '#EC470A';\n case 'Cyan': return '#0092B8';\n case 'Violet': return '#7F22FE';\n case 'Pink': return '#E60076';\n case 'Gray': return '#57534D';\n default: return '#009966';\n }\n }\n \n // 如果是自定义颜色,返回原色\n if (typeof color === 'string' && color.startsWith('#')) {\n return color;\n }\n \n return '#009966';\n};\n\n// 获取边框颜色的函数\nconst getOutlineColor = (color: TagColor) => {\n // 如果是预定义颜色,返回对应的边框颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#A4F4CF';\n case 'Red': return '#FFC9C9';\n case 'Orange': return '#FFD1A9';\n case 'Blue': return '#BEDBFF';\n case 'Yellow': return '#FFD1A9';\n case 'Cyan': return '#A2F4FD';\n case 'Violet': return '#DDD6FF';\n case 'Pink': return '#FCCEE8';\n case 'Gray': return '#E7E5E4';\n default: return '#A4F4CF';\n }\n }\n \n // 如果是自定义颜色,返回带透明度的颜色\n if (typeof color === 'string' && color.startsWith('#')) {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n return `rgba(${r}, ${g}, ${b}, 0.3)`; // 30% 透明度\n }\n \n return '#A4F4CF';\n};\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'large',\n stroke = false,\n icon,\n iconPosition = 'none',\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const colorConfig = getColorConfig(color, primaryColor);\n const sizeConfig = SIZE_CONFIG[size];\n \n // 构建基础样式对象\n const baseStyle: React.CSSProperties = {\n borderRadius: '0.375rem', // rounded-md\n display: 'inline-flex',\n justifyContent: 'start',\n alignItems: 'center',\n padding: '2px 8px', // px-2 py-0.5 (所有尺寸都相同)\n gap: size === 'large' ? '4px' : '2px', // gap-1 or gap-0.5\n fontWeight: 500, // font-medium\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: size === 'large' ? '1.375' : '1', // leading-snug or leading-none\n transition: 'all 0.2s',\n fontSize: size === 'large' ? '14px' : '12px', // text-sm or text-xs\n height: size === 'small' ? '20px' : '24px', // Small 尺寸 20px,Large 尺寸 24px\n };\n\n // 根据变体和颜色添加样式\n if (variant === 'light') {\n baseStyle.backgroundColor = colorConfig.light.bg;\n baseStyle.color = colorConfig.light.text;\n if (stroke) {\n // 使用 outline 样式而不是 border\n baseStyle.outline = '1px solid';\n baseStyle.outlineOffset = '-1px';\n // 根据颜色设置 outline 颜色\n baseStyle.outlineColor = getOutlineColor(color);\n }\n }\n\n // 添加点击样式\n if (onClick) {\n baseStyle.cursor = 'pointer';\n baseStyle.opacity = '1';\n }\n\n // 构建类名\n const baseClasses = [\n 'rounded-md',\n 'inline-flex',\n 'justify-start',\n 'items-center',\n sizeConfig.padding,\n sizeConfig.gap,\n 'font-medium',\n 'font-dm-sans',\n size === 'large' ? 'leading-snug' : 'leading-none',\n 'transition-colors',\n 'duration-200',\n size === 'small' ? 'h-5' : 'h-6' // Small 尺寸 20px,Large 尺寸 24px\n ].filter(Boolean); // 过滤掉空字符串\n\n // 为 fill 变体添加样式\n if (variant === 'fill') {\n baseStyle.backgroundColor = colorConfig.fill.bg;\n baseStyle.color = colorConfig.fill.text;\n }\n\n if (onClick) {\n baseClasses.push('cursor-pointer', 'hover:opacity-80');\n }\n\n if (className) {\n baseClasses.push(className);\n }\n\n const containerClasses = baseClasses.join(' ');\n\n // 渲染图标\n const renderIcon = () => {\n if (!icon) return null;\n \n // 根据颜色设置图标颜色\n const iconColor = getIconColor(color, primaryColor);\n \n // 根据尺寸设置图标大小\n const iconSize = size === 'small' ? '14px' : '16px';\n \n return (\n <div className=\"flex items-center justify-center\" style={{ width: iconSize, height: iconSize }}>\n {icon.type === 'svg' ? (\n React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: iconSize,\n height: iconSize,\n style: { fill: iconColor }\n })\n ) : (\n icon\n )}\n </div>\n );\n };\n\n // 渲染文本内容\n const renderContent = () => {\n return (\n <div className=\"px-1 flex justify-center items-center\">\n <div className={`justify-center ${sizeConfig.textSize} font-medium font-dm-sans ${size === 'large' ? 'leading-snug' : 'leading-none'}`}>\n {children}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={containerClasses}\n style={baseStyle}\n onClick={onClick}\n {...rest}\n >\n {iconPosition === 'leading' && renderIcon()}\n {renderContent()}\n {iconPosition === 'after' && renderIcon()}\n </div>\n );\n};\n\nexport default Tag;\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (\n item: number | string,\n index: number\n ): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: \"none\",\n background: isActive ? \"#FAFAF9\" : \"white\",\n backgroundColor: isActive ? \"#FAFAF9\" : \"white\",\n color: isActive ? primaryColor : \"#79716B\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 上一页\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 下一页\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n {getPageNumbers().map((item, index) => renderItem(item, index))}\n </div>\n\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )}\n\n {showSizeChanger && (\n <select\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n style={{\n padding: size === \"small\" ? \"6px 12px\" : \"8px 12px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: size === \"small\" ? \"12px\" : \"14px\",\n lineHeight: size === \"small\" ? \"18px\" : \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: \"white\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} 条/页\n </option>\n ))}\n </select>\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 跳至\n </span>\n <input\n type=\"number\"\n min=\"1\"\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onKeyPress={(e) => e.key === \"Enter\" && handleJumpTo()}\n disabled={disabled}\n style={{\n width: \"56px\",\n height: size === \"small\" ? \"28px\" : \"36px\",\n padding: \"0 8px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = primaryColor;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 页\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 确定\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n}) => {\n const { primaryColor } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const isChecked = checked || indeterminate;\n const backgroundColor = disabled\n ? '#FAFAF9'\n : isChecked\n ? primaryColor\n : 'white';\n const borderColor = disabled ? '#FAFAF9' : isChecked ? primaryColor : '#D7D3D0';\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '4px', // spacing-sm 通常是 4px\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n opacity: isChecked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n }}\n >\n {indeterminate ? (\n <MinusIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n ) : (\n <CheckIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n )}\n </div>\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"checkbox\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate;\n }}\n onChange={onChange}\n disabled={disabled}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n \n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n borderRadius: '8px',\n border: '1px solid #EAECF0',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div ref={tableRef} className={`aha-table aha-table-mobile-wrapper ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div ref={tableRef} className={`aha-table ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={bordered ? 'bordered' : ''}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n};\n\nexport default Table;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked, value },\n currentTarget: { checked: !checked, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const backgroundColor = disabled\n ? '#FAFAF9'\n : checked\n ? primaryColor\n : 'white';\n const borderColor = disabled \n ? '#FAFAF9' \n : checked \n ? primaryColor \n : '#D7D3D0';\n\n return (\n <div\n className={`aha-radio ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '50%',\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: '8px',\n height: '8px',\n minWidth: '8px',\n minHeight: '8px',\n borderRadius: '50%',\n backgroundColor: 'white',\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"radio\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n value={value}\n name={name}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '-1px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n textareaRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize]);\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n };\n\n updatePosition();\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 是否显示预设日期范围(仅在范围模式下有效) */\n presetRanges?: boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n if (currentMonth.year !== dateYear || currentMonth.month !== dateMonth) {\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n }\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n if (currentMonth.year !== dateYear || currentMonth.month !== dateMonth) {\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n }\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode, currentMonth]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n };\n\n updatePosition();\n\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen]);\n\n // 点击外部关闭\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen && isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 预设日期范围\n const presetRangesList = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n // { label: 'Today', range: { startDate: today, endDate: today } },\n // { label: 'Yesterday', range: { startDate: yesterday, endDate: yesterday } },\n // { label: 'This week', range: { startDate: thisWeekStart, endDate: thisWeekEnd } },\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n // { label: 'This month', range: { startDate: thisMonthStart, endDate: thisMonthEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n // { label: 'This year', range: { startDate: thisYearStart, endDate: thisYearEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n // { label: 'All time', range: { startDate: null, endDate: null } },\n ];\n }, []);\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: '36px', // 为箭头和清除按钮留出空间\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && presetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && presetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && presetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 9px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n \n // 判断前一个和后一个日期是否在范围内(同一行内)\n const prevDate = index > 0 ? calendarDays[index - 1] : null;\n const nextDate = index < calendarDays.length - 1 ? calendarDays[index + 1] : null;\n const prevInRange = prevDate ? isDateInSelectedRange(prevDate, workingRange.startDate, workingRange.endDate) : false;\n const nextInRange = nextDate ? isDateInSelectedRange(nextDate, workingRange.startDate, workingRange.endDate) : false;\n \n // 判断上一行和下一行的对应日期是否在范围内(跨行判断)\n const prevRowIndex = index - 7;\n const nextRowIndex = index + 7;\n const prevRowDate = prevRowIndex >= 0 ? calendarDays[prevRowIndex] : null;\n const nextRowDate = nextRowIndex < calendarDays.length ? calendarDays[nextRowIndex] : null;\n const prevRowInRange = prevRowDate ? isDateInSelectedRange(prevRowDate, workingRange.startDate, workingRange.endDate) : false;\n const nextRowInRange = nextRowDate ? isDateInSelectedRange(nextRowDate, workingRange.startDate, workingRange.endDate) : false;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && !isRangeStart && !isRangeEnd && !isInRange && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单 */\n submit: () => Promise<any>;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFields] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFields((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n setFields((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFields((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const errorInfo = {\n values: getFieldsValue(),\n errorFields: errors,\n };\n onFinishFailed?.(errorInfo);\n throw errorInfo;\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFields((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFields((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n }), [\n fields, // fields 必须在依赖中,这样 FormItem 才能重新渲染显示错误\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n// 导出 FormItem 作为 Form.Item\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n};\nFormWithItem.Item = FormItem;\n\nexport default FormWithItem;\n\n","import React, { useContext, useEffect, useRef, useMemo } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件\n if (child.type && typeof child.type === 'object' && 'displayName' in child.type) {\n const displayName = (child.type as any).displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={itemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__spreadArray","to","from","pack","ar","l","Array","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","ThemeProvider","_a","theme","children","themeValue","useMemo","_jsx","Provider","useTheme","context","useContext","SIZE_CONFIG","small","height","paddingLeft","paddingRight","fontSize","lineHeight","iconSize","gap","mediumSmall","medium","large","LoadingIcon","size","color","_jsxs","_Fragment","width","viewBox","fill","style","animation","cx","cy","r","stroke","strokeWidth","strokeLinecap","strokeDasharray","strokeDashoffset","opacity","Button","baseStyle","_b","type","_c","_d","disabled","_e","loading","onClick","_f","htmlType","_g","className","icon","_h","iconPosition","rest","_j","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","sizeConfig","isDisabled","renderIcon","iconColor","parseInt","replace","display","alignItems","justifyContent","flexShrink","buttonStyle","position","fontWeight","fontFamily","borderRadius","border","cursor","outline","transition","userSelect","WebkitTapHighlightColor","backgroundColor","boxShadow","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","d","error","warning","info","CloseIcon","Alert","title","description","showIcon","closeable","action","onClose","visible","setVisible","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","filter","toast","getToasts","subscribe","listener","_this","add","delete","forEach","clearAll","toastManager","ToastContainer","setToasts","useEffect","currentToasts","unsubscribe","map","topLeftToasts","topRightToasts","bottomLeftToasts","bottomRightToasts","top","left","zIndex","pointerEvents","flexDirection","ToastItem","right","bottom","isVisible","setIsVisible","isExiting","setIsExiting","message","duration","showClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","overflow","transform","padding","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","Toast","ensureToastContainer","closeToast","clearAllToasts","debugToast","window","document","getElementById","toastContainerRoot","isInitializing","toastSuccess","options","toastError","toastInfo","toastQuestion","toastContainerElement","existingContainer","createElement","appendChild","createRoot","require","render","import","catch","warn","ToastProvider","mounted","setMounted","createPortal","COLOR_CONFIG","Green","light","bg","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","textSize","Tag","variant","colorConfig","config","startsWith","hex","substr","b","getColorConfig","outlineOffset","outlineColor","getOutlineColor","baseClasses","Boolean","containerClasses","join","getIconColor","React","cloneElement","CheckIcon","strokeLinejoin","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","current","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onChange","onShowSizeChange","simple","hideOnSinglePage","_m","_o","responsive","showLessItems","itemRender","_q","_r","internalCurrent","setInternalCurrent","_s","internalPageSize","setInternalPageSize","_t","jumpToPage","setJumpToPage","totalPages","ceil","undefined","handlePageChange","page","handleJumpTo","margin","marginLeft","start","end","min","flexWrap","pages","getPageNumbers","item","index","isActive","element","max","renderItem","newPageSize","Number","target","newTotalPages","newCurrent","borderColor","onKeyPress","key","onFocus","onBlur","goButton","Checkbox","checked","indeterminate","isChecked","minHeight","boxSizing","ref","el","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Table","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","_p","tableLayout","onSorterChange","onPaginationChange","onRow","expandable","rowClassName","onHeaderRow","sticky","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","_u","currentPage","setCurrentPage","_v","setPageSize","_w","draggedRowIndex","setDraggedRowIndex","_x","dragOverRowIndex","setDragOverRowIndex","_y","isMobile","setIsMobile","tableRef","useRef","headerRef","checkMobile","innerWidth","addEventListener","removeEventListener","handleSelect","selected","checkboxProps","getCheckboxProps","newSelectedRowKeys","k","selectedRows","includes","onSelect","Event","handleSelectAll","currentPageData","keys","changeRows","onSelectAll","handleSort","column","columnKey","isArray","dataIndex","newSorters","set","sorterArray","entries","find","c","field","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","_i","state_1","processedData","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","offset","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","textAlign","borderBottom","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","some","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderRows","isSelected","isExpanded","rowProps","isLastRow","Fragment","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","colSpan","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","x","sum","String","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","maxHeight","marginBottom","displayValue","paddingBottom","scrollContainerStyle","overflowX","overflowY","Radio","name","Tab","items","layout","defaultValue","controlledValue","mode","scrollable","normalizedItems","firstItem","isControlled","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","isNaN","initialValue","internalValue","setInternalValue","currentValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","updatePosition_1","underlineRef","containerRect","getBoundingClientRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","scrollIntoView","behavior","block","inline","requestAnimationFrame","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","prev","updateBackgroundSliderPosition","firstKey_2","container","scrollTimeout_2","updatePosition_2","handleScroll_2","containerStyle","scrollBehavior","scrollbarWidth","WebkitOverflowScrolling","itemKey","itemKeyType","currentValueType","whiteSpace","iconType","isReactElement","isValidElement","iconValue","badge","customElement","itemStyle","renderBackgroundStyle","Progress","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","round","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","Input","forwardRef","readOnly","prefix","suffix","allowClear","onClear","placeholder","onPressEnter","restProps","inputRef","focused","setFocused","handleClear","focus","showClear","sizeStyles","paddingTop","baseStyles","WebkitAppearance","MozAppearance","appearance","onKeyDown","autoComplete","autoCorrect","autoCapitalize","spellCheck","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","thumbSize","thumbOffset","default","thumbLeft","role","newChecked","Select","showSearch","filterOption","onDeselect","onSearch","onDropdownVisibleChange","dropdownClassName","dropdownStyle","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","internalOpen","setInternalOpen","searchValue","setSearchValue","focusedIndex","setFocusedIndex","selectRef","dropdownRef","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","opt","getFilteredOptions","toLowerCase","search","filteredOptions","rect","scrollY","scrollX","handleClickOutside","event","contains","handleKeyDown","option","focusedItem","querySelectorAll","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","val","overscrollBehavior","isFocused","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","RegExp","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","isDateInSelectedRange","startDate","endDate","dateTime","getTime","startTime","endTime","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","isRangeMode","internalSingleValue","setInternalSingleValue","internalRangeValue","setInternalRangeValue","selectingStart","setSelectingStart","_z","tempRangeValue","setTempRangeValue","_0","range","now","currentMonth","setCurrentMonth","_1","nextMonth","secondMonth","setSecondMonth","pickerRef","startInputRef","endInputRef","_2","hasOpenedRef","currentSingleValue","currentRangeValue","dateYear","dateMonth","renderCalendar","handleSelectSingleDate","handleSelectRangeDate","newRange","workingRange","handleToggle","presetRangesList","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","handlePresetRangeSelect","handlePrevMonth","handleNextMonth","generateCalendarData","daysInMonth","days","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","singleDisplayValue","startDisplayValue","endDisplayValue","weekDays","borderRight","borderTopLeftRadius","borderBottomLeftRadius","preset","idx","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","gridTemplateColumns","rowGap","columnGap","firstDay","getDay","cells","actualIndex","isCurrentMonth","isToday","isStartDate","isEndDate","isInRange_1","isFirstInRow","isLastInRow","isRangeStart_1","isRangeEnd_1","prevDate","nextDate","prevRowIndex","nextRowIndex","prevRowDate","nextRowDate","isFirstDayOfMonth","isLastDayOfMonth","needsLeftRadius","needsRightRadius","borderTopRightRadius","borderBottomRightRadius","isSelected_1","borderTop","FormContext","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","initialFields","touched","validating","fields","setFields","fieldsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","rules_1","rule","validator","string","number","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","errorFields","resetFields","setFieldsValue","allValues_2","submit","useImperativeHandle","contextValue","formStyle","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","content","showTooltip","setShowTooltip","tooltipRef","borderLeft","Children","child","childProps","fieldValue_1","setFieldValue_1","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneChild","MenuList","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","skipGlobalClick","renderMenuItem","danger","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","viewportHeight","innerHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","Tooltip","trigger","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","internalVisible","setInternalVisible","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","triggerRef","timeoutRef","hideTimeoutRef","updatePosition","finalPosition","preferredPosition","candidates_1","pos","getPositionCandidates","candidate","getAutoPosition","arrowPos","tooltipAbsoluteLeft","tooltipAbsoluteTop","getArrowPosition","hideTooltip","keepTooltipVisible","tryUpdatePosition_1","tooltipContainerStyle","calculateTooltipMaxWidth","updateMaxWidth","tooltipContentStyle","wordWrap","tooltipContent","handleTriggerMouseLeave","triggerProps"],"mappings":"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","x_google_ignoreList":[0]}