aha-components 1.7.11 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +10 -0
  2. package/dist/Avatar.esm.js +2 -0
  3. package/dist/Avatar.esm.js.map +1 -0
  4. package/dist/Avatar.js +2 -0
  5. package/dist/Avatar.js.map +1 -0
  6. package/dist/Badge.esm.js +2 -0
  7. package/dist/Badge.esm.js.map +1 -0
  8. package/dist/Badge.js +2 -0
  9. package/dist/Badge.js.map +1 -0
  10. package/dist/Checkbox.esm.js +1 -1
  11. package/dist/Checkbox.esm.js.map +1 -1
  12. package/dist/Checkbox.js +1 -1
  13. package/dist/Checkbox.js.map +1 -1
  14. package/dist/Radio.esm.js +1 -1
  15. package/dist/Radio.esm.js.map +1 -1
  16. package/dist/Radio.js +1 -1
  17. package/dist/Radio.js.map +1 -1
  18. package/dist/Table.esm.js +1 -1
  19. package/dist/Table.esm.js.map +1 -1
  20. package/dist/Table.js +1 -1
  21. package/dist/Table.js.map +1 -1
  22. package/dist/Tag.esm.js +1 -1
  23. package/dist/Tag.esm.js.map +1 -1
  24. package/dist/Tag.js +1 -1
  25. package/dist/Tag.js.map +1 -1
  26. package/dist/Textarea.esm.js +1 -1
  27. package/dist/Textarea.esm.js.map +1 -1
  28. package/dist/Textarea.js +1 -1
  29. package/dist/Textarea.js.map +1 -1
  30. package/dist/components/Avatar/Avatar.stories.d.ts +12 -0
  31. package/dist/components/Avatar/index.d.ts +42 -0
  32. package/dist/components/Badge/Badge.stories.d.ts +15 -0
  33. package/dist/components/Badge/index.d.ts +71 -0
  34. package/dist/components/Checkbox/Checkbox.stories.d.ts +5 -4
  35. package/dist/components/Checkbox/index.d.ts +6 -0
  36. package/dist/components/Radio/Radio.stories.d.ts +6 -4
  37. package/dist/components/Radio/index.d.ts +6 -0
  38. package/dist/components/Tag/Tag.stories.d.ts +5 -8
  39. package/dist/components/Tag/index.d.ts +24 -2
  40. package/dist/components/Textarea/Textarea.stories.d.ts +2 -0
  41. package/dist/components/Textarea/Textarea.test.d.ts +1 -0
  42. package/dist/components/Textarea/index.d.ts +12 -0
  43. package/dist/design-tokens/theme.css +26 -0
  44. package/dist/design-tokens/theme.tailwind4.css +26 -0
  45. package/dist/index.css +3848 -0
  46. package/dist/index.d.ts +153 -4
  47. package/dist/index.esm.css +3848 -0
  48. package/dist/index.esm.js +1 -1
  49. package/dist/index.esm.js.map +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/theme.css +26 -0
  53. package/dist/tokens.d.ts +28 -0
  54. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/components/Input/index.tsx","../src/components/Select/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/Textarea/index.tsx","../src/components/Switch/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","../src/components/Popover/index.tsx","../src/components/Drawer/index.tsx","../src/components/Loading/index.tsx","../src/components/Alert/index.tsx","../src/components/Progress/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\n/**\n * 对齐 Figma: Untitled UI v7 — Buttons\n * 维度:Size × Hierarchy × State × Icon only\n * Size: sm(36) / md(40) / lg(44) / xl(48)\n * Hierarchy: primary / secondary / tertiary / link-color / link-gray\n * State: default / hover / focused / disabled / loading\n * Icon only: boolean\n */\n\nexport type ButtonHierarchy =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'link-color'\n | 'link-gray'\n | 'destructive-primary'\n | 'destructive-secondary'\n | 'destructive-tertiary'\n | 'destructive-link'\n // legacy alias\n | 'default';\n\nexport type ButtonSize =\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n // legacy aliases\n | 'small'\n | 'mediumSmall'\n | 'medium'\n | 'large';\n\nexport type ButtonType = ButtonHierarchy;\n\nexport interface ButtonProps {\n children?: React.ReactNode;\n /** 按钮层级(对应 Figma Hierarchy)。`default` 为 `secondary` 的旧名 */\n type?: ButtonHierarchy;\n /** 按钮尺寸(对应 Figma Size)。旧名会映射到新尺寸 */\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n /** 仅图标按钮。不传 `children`、仅传 `icon` 时自动开启 */\n iconOnly?: boolean;\n /** 受控的 Focused 视觉态,用于 Storybook 预览设计稿;真实键盘焦点由 :focus-visible 处理 */\n focused?: boolean;\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n htmlType?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: React.CSSProperties;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\ntype NormalizedSize = 'sm' | 'md' | 'lg' | 'xl';\ntype NormalizedHierarchy = 'primary' | 'secondary' | 'tertiary' | 'link-color' | 'link-gray' | 'destructive-primary' | 'destructive-secondary' | 'destructive-tertiary' | 'destructive-link';\n\nconst SIZE_ALIAS: Record<ButtonSize, NormalizedSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'xl',\n};\n\nconst HIERARCHY_ALIAS: Record<ButtonHierarchy, NormalizedHierarchy> = {\n primary: 'primary',\n secondary: 'secondary',\n tertiary: 'tertiary',\n 'link-color': 'link-color',\n 'link-gray': 'link-gray',\n 'destructive-primary': 'destructive-primary',\n 'destructive-secondary': 'destructive-secondary',\n 'destructive-tertiary': 'destructive-tertiary',\n 'destructive-link': 'destructive-link',\n default: 'secondary',\n};\n\n/** Figma 标注的尺寸参数:高度、内边距、字号/行高、图标尺寸、间距 */\nconst SIZE_TOKENS: Record<\n NormalizedSize,\n {\n height: number;\n paddingX: number;\n paddingXLg: number; // lg/xl 大号内边距(与图标拼接时稍大)\n fontSize: number;\n lineHeight: number;\n iconSize: number;\n gap: number;\n iconOnlyPad: number;\n }\n> = {\n sm: { height: 36, paddingX: 12, paddingXLg: 12, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 8 },\n md: { height: 40, paddingX: 14, paddingXLg: 14, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 10 },\n lg: { height: 44, paddingX: 16, paddingXLg: 16, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 12 },\n xl: { height: 48, paddingX: 18, paddingXLg: 18, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 14 },\n};\n\nconst LoadingSpinner: React.FC<{ size: number; color: string }> = ({ size, color }) => (\n <>\n <style>{`@keyframes aha-button-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}`}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-button-spin 1s linear infinite', flexShrink: 0 }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"2\" opacity=\"0.25\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n </>\n);\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'secondary',\n size = 'md',\n disabled = false,\n loading = false,\n iconOnly,\n focused = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const hierarchy = HIERARCHY_ALIAS[type] || 'secondary';\n const s = SIZE_TOKENS[SIZE_ALIAS[size] || 'md'];\n\n const isIconOnly = iconOnly ?? (!!icon && children == null);\n const isLink = hierarchy === 'link-color' || hierarchy === 'link-gray' || hierarchy === 'destructive-link';\n const isDisabled = disabled || loading;\n const showFocusRing = focused;\n\n const themeBrand = primaryColor; // 允许 ThemeProvider 覆盖主色\n\n /** 根据 hierarchy+state 计算视觉 token */\n const getVisuals = (): {\n bg: string;\n color: string;\n iconColor: string;\n border: string;\n boxShadow: string;\n textDecoration?: string;\n } => {\n // Disabled — 所有层级共享一套「灰态」,但 link/tertiary 无边框/阴影\n if (disabled) {\n if (hierarchy === 'primary' || hierarchy === 'secondary' || hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return {\n bg: 'var(--color-bg-disabled, #f5f5f4)',\n color: 'var(--color-fg-disabled, #a9a29d)',\n iconColor: 'var(--color-fg-disabled, #a9a29d)',\n border: '1px solid var(--color-border-disabled_subtle, #e7e5e4)',\n boxShadow: 'none',\n };\n }\n return {\n bg: 'transparent',\n color: 'var(--color-fg-disabled, #a9a29d)',\n iconColor: 'var(--color-fg-disabled, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n const interactive = isHovered || isPressed;\n\n if (hierarchy === 'primary') {\n const bg = interactive\n ? 'var(--color-bg-brand-solid_hover, #ec470a)'\n : themeBrand || 'var(--color-bg-brand-solid, #fb6011)';\n return {\n bg,\n color: 'var(--color-text-white, #ffffff)',\n iconColor: 'var(--color-brand-300, #feb073)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic, 0 1px 2px 0 rgba(10,13,18,.05))',\n };\n }\n\n if (hierarchy === 'secondary') {\n return {\n bg: interactive\n ? 'var(--color-bg-primary_hover, #fafaf9)'\n : 'var(--color-bg-primary, #ffffff)',\n color: interactive\n ? 'var(--color-text-secondary_hover, #292524)'\n : 'var(--color-text-secondary, #44403c)',\n iconColor: interactive\n ? 'var(--color-fg-quaternary_hover, #79716b)'\n : 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic)',\n };\n }\n\n if (hierarchy === 'tertiary') {\n return {\n bg: interactive ? 'var(--color-bg-primary_hover, #fafaf9)' : 'transparent',\n color: interactive\n ? 'var(--color-text-tertiary_hover, #44403c)'\n : 'var(--color-text-tertiary, #57534e)',\n iconColor: interactive\n ? 'var(--color-fg-quaternary_hover, #79716b)'\n : 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'link-color') {\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-brand-secondary_hover, #c4330a)'\n : 'var(--color-text-brand-secondary, #ec470a)',\n iconColor: 'var(--color-fg-brand-secondary_alt, #fb6011)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'link-gray') {\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-tertiary_hover, #44403c)'\n : 'var(--color-text-tertiary, #57534e)',\n iconColor: 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'destructive-primary') {\n return {\n bg: interactive\n ? 'var(--color-error-600)'\n : 'var(--color-error-500)',\n color: 'var(--color-text-white)',\n iconColor: interactive\n ? 'var(--color-error-200)'\n : 'var(--color-error-300)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic)',\n };\n }\n\n if (hierarchy === 'destructive-secondary') {\n return {\n bg: interactive\n ? 'var(--color-bg-error-primary)'\n : 'var(--color-bg-primary)',\n color: 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n // 用 error border 色替换 skeuomorphic 中的暗色 inset,保持与 secondary 一致的 shadow 结构\n boxShadow: 'inset 0 0 0 1px var(--color-border-error_subtle), inset 0 -2px 0 0 rgba(10,13,18,0.05), 0 1px 2px 0 rgba(10,13,18,0.05)',\n };\n }\n\n if (hierarchy === 'destructive-tertiary') {\n return {\n bg: interactive ? 'var(--color-bg-error-primary)' : 'transparent',\n color: 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n // destructive-link\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-error-primary_hover)'\n : 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n };\n\n const visuals = getVisuals();\n\n /** focus ring: primary/secondary 使用 skeuomorphic 版本叠加基础阴影;其余使用纯环 */\n const focusShadow = (() => {\n if (!showFocusRing) return undefined;\n const isDestructive = hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary' || hierarchy === 'destructive-tertiary' || hierarchy === 'destructive-link';\n if (isDestructive) {\n if (hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return 'var(--focus-ring-error-shadow-xs-skeuomorphic)';\n }\n return 'var(--focus-ring-error)';\n }\n if (hierarchy === 'primary' || hierarchy === 'secondary') {\n return 'var(--focus-ring-shadow-xs-skeuomorphic, 0 0 0 2px #fff, 0 0 0 4px #fb6011)';\n }\n return 'var(--focus-ring, 0 0 0 2px #fff, 0 0 0 4px #fb6011)';\n })();\n\n const buttonStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: s.gap,\n fontFamily: 'var(--font-family-body, \"DM Sans\", system-ui, sans-serif)',\n fontWeight: 600,\n fontSize: s.fontSize,\n lineHeight: `${s.lineHeight}px`,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'background-color .15s ease, color .15s ease, box-shadow .15s ease',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n whiteSpace: 'nowrap',\n backgroundColor: visuals.bg,\n color: visuals.color,\n border: visuals.border,\n boxShadow: focusShadow ?? visuals.boxShadow,\n textDecoration: visuals.textDecoration,\n ...style,\n };\n\n if (isLink) {\n // Link 类:保留与同尺寸按钮一致的高度和横向内边距,无背景、无边框\n buttonStyle.borderRadius = '4px';\n buttonStyle.overflow = 'hidden';\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n } else {\n buttonStyle.borderRadius = 'var(--radius-md, 8px)';\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n }\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n const renderIcon = () => {\n if (loading) {\n return <LoadingSpinner size={s.iconSize} color={visuals.iconColor} />;\n }\n if (!icon) return null;\n return (\n <span\n aria-hidden\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: s.iconSize,\n height: s.iconSize,\n color: visuals.iconColor,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n };\n\n const showLeftIcon = loading || (icon && iconPosition === 'left');\n const showRightIcon = !loading && icon && iconPosition === 'right';\n\n return (\n <button\n type={htmlType}\n className={[\n 'aha-button',\n `aha-button--${hierarchy}`,\n `aha-button--${SIZE_ALIAS[size] || 'md'}`,\n isIconOnly && 'aha-button--icon-only',\n isDisabled && 'aha-button--disabled',\n loading && 'aha-button--loading',\n showFocusRing && 'aha-button--focused',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\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 {showLeftIcon && renderIcon()}\n {!isIconOnly && children}\n {showRightIcon && renderIcon()}\n {/* icon-only 且没传 icon 时,允许 children 作为图标 */}\n {isIconOnly && !icon && !loading && children}\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","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, { 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, { 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<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | 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 const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(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, filteredOptions.length]);\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:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\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 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 Input from \"../Input\";\nimport Select from \"../Select\";\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 = (item: number | string): 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={isActive ? \"primary\" : \"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: isActive ? `1px solid ${primaryColor}` : undefined,\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 <LeftArrowIcon />\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 <RightArrowIcon />\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 {total > 0 && (\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 <LeftArrowIcon />\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 <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\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 <RightArrowIcon />\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 <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\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 Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\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 OK\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// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\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\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\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 innerClassName?: 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 innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\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 // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\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 renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\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, renderEmpty]);\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 const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\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 ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\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\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\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 <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\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\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\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={innerClassName}>\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 <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\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: '0px',\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: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#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: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#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, { 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\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\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?: PresetRange[] | 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 /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\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 showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\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; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\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 setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\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 placementDeterminedRef.current = false;\n determinedPlacementRef.current = 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 // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else 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 if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\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) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 defaultPresetRanges = 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: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \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 } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\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 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 @keyframes dropdownFadeInTop {\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: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\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 rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\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' : (currentRangeValue.startDate || 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 ) : (\n // 范围模式:显示两个输入框\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 ) : (\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 {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\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: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : '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 && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && 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 && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && 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 8px',\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 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 && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : 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 {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\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 flex: 1,\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 </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 // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\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\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\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 /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => 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 /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\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, setFieldsState] = 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 // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\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 setFieldsState((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 setFieldsState((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 setFieldsState((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 setFieldsState((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 registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((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 registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\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 setFieldsState((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 values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((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 fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((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 fieldsRef.current[name] = { ...newFields[name] };\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 // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\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 setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\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 setFields,\n submit,\n scrollToField,\n registerFieldRef,\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/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } 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 // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\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 // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.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={setItemRef}\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 suffixIcon?: 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 fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\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 {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\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;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\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 }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow:\n \"0px 2px 2px -1px var(--ColorsEffectsShadowsshadow-lg03), 0px 4px 6px -2px var(--ColorsEffectsShadowsshadow-lg02), 0px 12px 16px -4px var(--ColorsEffectsShadowsshadow-lg01)\",\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\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 </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = 'var(--theme-color, #5A31F0)',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\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\";\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 const hasRightSlot = action || closeable;\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 ${hasRightSlot ? \"flex-1 min-w-0\" : \"\"}`}\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 </div>\n {hasRightSlot && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n {closeable && (\n <div\n className=\"cursor-pointer relative top-[-12px]\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\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"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__assign","assign","t","s","i","n","arguments","length","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","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","useTheme","context","useContext","SIZE_ALIAS","sm","md","lg","xl","small","mediumSmall","medium","large","HIERARCHY_ALIAS","primary","secondary","tertiary","default","SIZE_TOKENS","height","paddingX","paddingXLg","fontSize","lineHeight","iconSize","gap","iconOnlyPad","LoadingSpinner","_a","size","color","_jsxs","jsxs","_Fragment","Fragment","children","_jsx","jsx","width","viewBox","fill","style","animation","flexShrink","cx","cy","r","stroke","strokeWidth","opacity","strokeLinecap","Button","_b","type","_c","_d","disabled","_e","loading","iconOnly","_f","focused","onClick","_g","htmlType","_h","className","icon","_j","iconPosition","rest","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","hierarchy","isIconOnly","isLink","isDisabled","showFocusRing","themeBrand","visuals","bg","iconColor","border","boxShadow","interactive","textDecoration","getVisuals","focusShadow","buttonStyle","position","display","alignItems","justifyContent","fontFamily","fontWeight","cursor","outline","transition","userSelect","WebkitTapHighlightColor","whiteSpace","backgroundColor","borderRadius","overflow","padding","paddingLeft","paddingRight","renderIcon","showLeftIcon","showRightIcon","filter","Boolean","join","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","error","warning","info","CloseIcon","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","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","action","showClose","onClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","transform","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","ensureToastContainer","toastContainerElement","toastContainerRoot","isInitializing","window","document","existingContainer","getElementById","createElement","appendChild","createRoot","require","render","import","catch","warn","COLOR_CONFIG","Green","light","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","SIZE_CONFIG","textSize","Input","forwardRef","ref","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onChange","onFocus","onBlur","onPressEnter","restProps","inputRef","useRef","React","internalValue","setInternalValue","setFocused","current","isControlled","undefined","currentValue","handleClear","target","focus","showClear","sizeStyles","paddingTop","paddingBottom","baseStyles","boxSizing","WebkitAppearance","MozAppearance","appearance","onKeyDown","key","autoComplete","autoCorrect","autoCapitalize","spellCheck","strokeLinejoin","Select","controlledValue","options","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","_m","dropdownClassName","dropdownStyle","_o","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","_q","_r","internalOpen","setInternalOpen","_s","searchValue","setSearchValue","_t","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","includes","getFilteredOptions","String","toLowerCase","search","filteredOptions","useMemo","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","flexWrap","tagProps","closable","textOverflow","marginLeft","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","minHeight","val","createPortal","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","index","isSelected","isFocused","selected","CheckIcon","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onShowSizeChange","simple","hideOnSinglePage","responsive","showLessItems","itemRender","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpToPage","setJumpToPage","totalPages","ceil","handlePageChange","page","handleJumpTo","parseInt","margin","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","Checkbox","checked","indeterminate","isChecked","borderColor","el","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","role","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","config","thumbSize","thumbOffset","thumbLeft","newChecked","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","replace","RegExp","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","showSelectedRange","_v","startSelectedRangeText","_w","endSelectedRangeText","_x","rangeDisplayMode","_y","isRangeMode","_z","internalSingleValue","setInternalSingleValue","_0","startDate","endDate","internalRangeValue","setInternalRangeValue","_1","_2","selectingStart","setSelectingStart","_3","tempRangeValue","setTempRangeValue","_4","range","now","currentMonth","setCurrentMonth","_5","nextMonth","secondMonth","setSecondMonth","pickerRef","startInputRef","endInputRef","_6","hasOpenedRef","placementDeterminedRef","determinedPlacementRef","currentSingleValue","currentRangeValue","dateYear","dateMonth","rect_1","placement_1","dropdownHeight","top_2","placement_2","calculatePosition_1","workingRange","startText","endText","renderCalendar","handleSelectSingleDate","handleSelectRangeDate","newRange","handleToggle","defaultPresetRanges","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","presetRangesList","hasPresetRanges","handlePresetRangeSelect","startYear","startMonth","handlePrevMonth","handleNextMonth","generateCalendarData","daysInMonth","days","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","singleDisplayValue","startDisplayValue","endDisplayValue","rangeTextValue","weekDays","borderRight","borderTopLeftRadius","borderBottomLeftRadius","preset","idx","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","marginBottom","gridTemplateColumns","rowGap","columnGap","firstDay","getDay","offset","cells","actualIndex","isCurrentMonth","isToday","isStartDate","isEndDate","isInRange_1","dateTime","getTime","startTime","endTime","isDateInSelectedRange","isFirstInRow","isLastInRow","isRangeStart_1","isRangeEnd_1","isFirstDayOfMonth","isLastDayOfMonth","needsLeftRadius","needsRightRadius","borderTopRightRadius","borderBottomRightRadius","isSelected_1","borderTop","FormContext","FormValidationError","_super","errorFields","__","constructor","__extends","Error","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","layout","initialFields","keys","touched","validating","fields","setFieldsState","fieldsRef","fieldElementsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldFnRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","field","_i","rules_1","rule","validator","string","number","isNaN","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","resetFields","setFieldsValue","allValues_2","submit","setFields","fieldsToSet","some","changedValues_1","registerFieldRef","scrollToField","useImperativeHandle","contextValue","formStyle","Provider","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","setItemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","showTooltip","setShowTooltip","tooltipRef","borderLeft","borderBottom","Children","child","isValidElement","childProps","fieldValue_1","setFieldValue_1","childType","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneElement","cloneChild","useForm","MenuList","items","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","k","skipGlobalClick","renderMenuItem","itemStyle","danger","suffixIcon","containerStyle","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","title","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","innerWidth","viewportHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","hasEnoughSpace","popoverRect","getAvailableSpace","Popover","trigger","popoverClassName","destroyOnHide","destroyTooltipOnHide","shouldDestroyOnHide","internalVisible","setInternalVisible","visible","popoverStyle","setPopoverStyle","triggerRef","popoverRef","setVisible","nextVisible","updatePosition","nextPlacement","oppositePlacement","getOppositePlacement","getPlacementPosition","clamped","nextTop","nextLeft","clampToViewport","openPopover","closePopover","togglePopover","triggerEvents","popoverNode","visibility","VIEWPORT_PADDING","ANIMATION_DURATION","Drawer","afterOpenChange","footer","mask","maskClosable","closeIcon","keyboard","destroyOnClose","mobileBreakpoint","drawerStyle","headerStyle","bodyStyle","footerStyle","maskStyle","mergedOpen","shouldRender","setShouldRender","animatedOpen","setAnimatedOpen","mounted","setMounted","isMobile","setIsMobile","updateMobile","raf_1","cancelAnimationFrame","previousOverflow","closeDrawer","resolvedWidth","resolvedHeight","effectivePlacement","drawerPositionStyle","base","node","overflowY","curve","tag","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","PI","petals","round","x","cos","sin","getParticle","tailOffset","normalizeProgress","fade","pow","radius","description","showIcon","closeable","hasRightSlot","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","pt","preserveAspectRatio","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","variant","scrollable","normalizedItems","firstItem","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","initialValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","underlineRef","containerRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","inline","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","updateBackgroundSliderPosition","firstKey_2","container","scrollTimeout_2","updatePosition_2","handleScroll_2","overflowX","scrollBehavior","scrollbarWidth","itemKey","itemKeyType","currentValueType","iconType","isReactElement","iconValue","badge","customElement","renderBackgroundStyle","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","innerClassName","expandable","rowClassName","onHeaderRow","sticky","loadingSpinColor","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","currentPage","setCurrentPage","setPageSize","draggedRowIndex","setDraggedRowIndex","dragOverRowIndex","setDragOverRowIndex","tableRef","headerRef","checkMobile","checkboxProps","getCheckboxProps","newSelectedRowKeys","selectedRows","Event","handleSelectAll","currentPageData","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","newSorters","set","sorterArray","entries","c","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","emptyContent","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","state_1","processedData","isServerPagination","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderEmpty","emptyText","colSpan","renderRows","isExpanded","rowProps","isLastRow","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","sum","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","startsWith","displayValue","scrollContainerStyle","colorConfig","hex","substr","getColorConfig","sizeConfig","baseStyle","outlineOffset","outlineColor","getOutlineColor","baseClasses","containerClasses","getIconColor","theme","themeValue","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","timeoutRef","hideTimeoutRef","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]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/components/Input/index.tsx","../src/components/Select/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/Textarea/index.tsx","../src/components/Switch/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","../src/components/Popover/index.tsx","../src/components/Drawer/index.tsx","../src/components/Loading/index.tsx","../src/components/Badge/index.tsx","../src/components/Avatar/index.tsx","../src/components/Alert/index.tsx","../src/components/Progress/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\n/**\n * 对齐 Figma: Untitled UI v7 — Buttons\n * 维度:Size × Hierarchy × State × Icon only\n * Size: sm(36) / md(40) / lg(44) / xl(48)\n * Hierarchy: primary / secondary / tertiary / link-color / link-gray\n * State: default / hover / focused / disabled / loading\n * Icon only: boolean\n */\n\nexport type ButtonHierarchy =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'link-color'\n | 'link-gray'\n | 'destructive-primary'\n | 'destructive-secondary'\n | 'destructive-tertiary'\n | 'destructive-link'\n // legacy alias\n | 'default';\n\nexport type ButtonSize =\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n // legacy aliases\n | 'small'\n | 'mediumSmall'\n | 'medium'\n | 'large';\n\nexport type ButtonType = ButtonHierarchy;\n\nexport interface ButtonProps {\n children?: React.ReactNode;\n /** 按钮层级(对应 Figma Hierarchy)。`default` 为 `secondary` 的旧名 */\n type?: ButtonHierarchy;\n /** 按钮尺寸(对应 Figma Size)。旧名会映射到新尺寸 */\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n /** 仅图标按钮。不传 `children`、仅传 `icon` 时自动开启 */\n iconOnly?: boolean;\n /** 受控的 Focused 视觉态,用于 Storybook 预览设计稿;真实键盘焦点由 :focus-visible 处理 */\n focused?: boolean;\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n htmlType?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: React.CSSProperties;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\ntype NormalizedSize = 'sm' | 'md' | 'lg' | 'xl';\ntype NormalizedHierarchy = 'primary' | 'secondary' | 'tertiary' | 'link-color' | 'link-gray' | 'destructive-primary' | 'destructive-secondary' | 'destructive-tertiary' | 'destructive-link';\n\nconst SIZE_ALIAS: Record<ButtonSize, NormalizedSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'xl',\n};\n\nconst HIERARCHY_ALIAS: Record<ButtonHierarchy, NormalizedHierarchy> = {\n primary: 'primary',\n secondary: 'secondary',\n tertiary: 'tertiary',\n 'link-color': 'link-color',\n 'link-gray': 'link-gray',\n 'destructive-primary': 'destructive-primary',\n 'destructive-secondary': 'destructive-secondary',\n 'destructive-tertiary': 'destructive-tertiary',\n 'destructive-link': 'destructive-link',\n default: 'secondary',\n};\n\n/** Figma 标注的尺寸参数:高度、内边距、字号/行高、图标尺寸、间距 */\nconst SIZE_TOKENS: Record<\n NormalizedSize,\n {\n height: number;\n paddingX: number;\n paddingXLg: number; // lg/xl 大号内边距(与图标拼接时稍大)\n fontSize: number;\n lineHeight: number;\n iconSize: number;\n gap: number;\n iconOnlyPad: number;\n }\n> = {\n sm: { height: 36, paddingX: 12, paddingXLg: 12, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 8 },\n md: { height: 40, paddingX: 14, paddingXLg: 14, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 10 },\n lg: { height: 44, paddingX: 16, paddingXLg: 16, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 12 },\n xl: { height: 48, paddingX: 18, paddingXLg: 18, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 14 },\n};\n\nconst LoadingSpinner: React.FC<{ size: number; color: string }> = ({ size, color }) => (\n <>\n <style>{`@keyframes aha-button-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}`}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-button-spin 1s linear infinite', flexShrink: 0 }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"2\" opacity=\"0.25\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n </>\n);\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'secondary',\n size = 'md',\n disabled = false,\n loading = false,\n iconOnly,\n focused = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const hierarchy = HIERARCHY_ALIAS[type] || 'secondary';\n const s = SIZE_TOKENS[SIZE_ALIAS[size] || 'md'];\n\n const isIconOnly = iconOnly ?? (!!icon && children == null);\n const isLink = hierarchy === 'link-color' || hierarchy === 'link-gray' || hierarchy === 'destructive-link';\n const isDisabled = disabled || loading;\n const showFocusRing = focused;\n\n const themeBrand = primaryColor; // 允许 ThemeProvider 覆盖主色\n\n /** 根据 hierarchy+state 计算视觉 token */\n const getVisuals = (): {\n bg: string;\n color: string;\n iconColor: string;\n border: string;\n boxShadow: string;\n textDecoration?: string;\n } => {\n // Disabled — 所有层级共享一套「灰态」,但 link/tertiary 无边框/阴影\n if (disabled) {\n if (hierarchy === 'primary' || hierarchy === 'secondary' || hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return {\n bg: 'var(--color-bg-disabled, #f5f5f4)',\n color: 'var(--color-fg-disabled, #a9a29d)',\n iconColor: 'var(--color-fg-disabled, #a9a29d)',\n border: '1px solid var(--color-border-disabled_subtle, #e7e5e4)',\n boxShadow: 'none',\n };\n }\n return {\n bg: 'transparent',\n color: 'var(--color-fg-disabled, #a9a29d)',\n iconColor: 'var(--color-fg-disabled, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n const interactive = isHovered || isPressed;\n\n if (hierarchy === 'primary') {\n const bg = interactive\n ? 'var(--color-bg-brand-solid_hover, #ec470a)'\n : themeBrand || 'var(--color-bg-brand-solid, #fb6011)';\n return {\n bg,\n color: 'var(--color-text-white, #ffffff)',\n iconColor: 'var(--color-brand-300, #feb073)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic, 0 1px 2px 0 rgba(10,13,18,.05))',\n };\n }\n\n if (hierarchy === 'secondary') {\n return {\n bg: interactive\n ? 'var(--color-bg-primary_hover, #fafaf9)'\n : 'var(--color-bg-primary, #ffffff)',\n color: interactive\n ? 'var(--color-text-secondary_hover, #292524)'\n : 'var(--color-text-secondary, #44403c)',\n iconColor: interactive\n ? 'var(--color-fg-quaternary_hover, #79716b)'\n : 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic)',\n };\n }\n\n if (hierarchy === 'tertiary') {\n return {\n bg: interactive ? 'var(--color-bg-primary_hover, #fafaf9)' : 'transparent',\n color: interactive\n ? 'var(--color-text-tertiary_hover, #44403c)'\n : 'var(--color-text-tertiary, #57534e)',\n iconColor: interactive\n ? 'var(--color-fg-quaternary_hover, #79716b)'\n : 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'link-color') {\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-brand-secondary_hover, #c4330a)'\n : 'var(--color-text-brand-secondary, #ec470a)',\n iconColor: 'var(--color-fg-brand-secondary_alt, #fb6011)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'link-gray') {\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-tertiary_hover, #44403c)'\n : 'var(--color-text-tertiary, #57534e)',\n iconColor: 'var(--color-fg-quaternary, #a9a29d)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'destructive-primary') {\n return {\n bg: interactive\n ? 'var(--color-error-600)'\n : 'var(--color-error-500)',\n color: 'var(--color-text-white)',\n iconColor: interactive\n ? 'var(--color-error-200)'\n : 'var(--color-error-300)',\n border: 'none',\n boxShadow: 'var(--shadow-xs-skeuomorphic)',\n };\n }\n\n if (hierarchy === 'destructive-secondary') {\n return {\n bg: interactive\n ? 'var(--color-bg-error-primary)'\n : 'var(--color-bg-primary)',\n color: 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n // 用 error border 色替换 skeuomorphic 中的暗色 inset,保持与 secondary 一致的 shadow 结构\n boxShadow: 'inset 0 0 0 1px var(--color-border-error_subtle), inset 0 -2px 0 0 rgba(10,13,18,0.05), 0 1px 2px 0 rgba(10,13,18,0.05)',\n };\n }\n\n if (hierarchy === 'destructive-tertiary') {\n return {\n bg: interactive ? 'var(--color-bg-error-primary)' : 'transparent',\n color: 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n // destructive-link\n return {\n bg: 'transparent',\n color: interactive\n ? 'var(--color-text-error-primary_hover)'\n : 'var(--color-text-error-primary)',\n iconColor: 'var(--color-fg-error-secondary)',\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n };\n\n const visuals = getVisuals();\n\n /** focus ring: primary/secondary 使用 skeuomorphic 版本叠加基础阴影;其余使用纯环 */\n const focusShadow = (() => {\n if (!showFocusRing) return undefined;\n const isDestructive = hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary' || hierarchy === 'destructive-tertiary' || hierarchy === 'destructive-link';\n if (isDestructive) {\n if (hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return 'var(--focus-ring-error-shadow-xs-skeuomorphic)';\n }\n return 'var(--focus-ring-error)';\n }\n if (hierarchy === 'primary' || hierarchy === 'secondary') {\n return 'var(--focus-ring-shadow-xs-skeuomorphic, 0 0 0 2px #fff, 0 0 0 4px #fb6011)';\n }\n return 'var(--focus-ring, 0 0 0 2px #fff, 0 0 0 4px #fb6011)';\n })();\n\n const buttonStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: s.gap,\n fontFamily: 'var(--font-family-body, \"DM Sans\", system-ui, sans-serif)',\n fontWeight: 600,\n fontSize: s.fontSize,\n lineHeight: `${s.lineHeight}px`,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'background-color .15s ease, color .15s ease, box-shadow .15s ease',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n whiteSpace: 'nowrap',\n backgroundColor: visuals.bg,\n color: visuals.color,\n border: visuals.border,\n boxShadow: focusShadow ?? visuals.boxShadow,\n textDecoration: visuals.textDecoration,\n ...style,\n };\n\n if (isLink) {\n // Link 类:保留与同尺寸按钮一致的高度和横向内边距,无背景、无边框\n buttonStyle.borderRadius = '4px';\n buttonStyle.overflow = 'hidden';\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n } else {\n buttonStyle.borderRadius = 'var(--radius-md, 8px)';\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n }\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n const renderIcon = () => {\n if (loading) {\n return <LoadingSpinner size={s.iconSize} color={visuals.iconColor} />;\n }\n if (!icon) return null;\n return (\n <span\n aria-hidden\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: s.iconSize,\n height: s.iconSize,\n color: visuals.iconColor,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n };\n\n const showLeftIcon = loading || (icon && iconPosition === 'left');\n const showRightIcon = !loading && icon && iconPosition === 'right';\n\n return (\n <button\n type={htmlType}\n className={[\n 'aha-button',\n `aha-button--${hierarchy}`,\n `aha-button--${SIZE_ALIAS[size] || 'md'}`,\n isIconOnly && 'aha-button--icon-only',\n isDisabled && 'aha-button--disabled',\n loading && 'aha-button--loading',\n showFocusRing && 'aha-button--focused',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\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 {showLeftIcon && renderIcon()}\n {!isIconOnly && children}\n {showRightIcon && renderIcon()}\n {/* icon-only 且没传 icon 时,允许 children 作为图标 */}\n {isIconOnly && !icon && !loading && children}\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","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, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TagColor =\n | 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet'\n | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\n\nexport type TagVariant = 'light' | 'fill';\n\n/** sm/md/lg are the canonical sizes; large/small are legacy aliases */\nexport type TagSize = 'sm' | 'md' | 'lg' | 'large' | 'small';\n\n/** Leading icon variant */\nexport type TagIconType = 'none' | 'dot' | 'avatar' | 'icon';\n\n/** Right-side action */\nexport type TagAction = 'none' | 'x-close' | 'count';\n\n/** @deprecated Use iconType instead */\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;\n // Icon variants (mutually exclusive; avatar takes precedence over icon)\n iconType?: TagIconType;\n icon?: React.ReactElement;\n avatarSrc?: string;\n dotColor?: string;\n // Action variants\n action?: TagAction;\n count?: number;\n onClose?: () => void;\n // Checkbox variant\n checkbox?: boolean;\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated use iconType='icon' */\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// ─── Color Configs ────────────────────────────────────────────────────────────\n\nconst COLOR_CONFIG = {\n Green: { light: { bg: '#ECFDF5', text: '#006045', border: '#A4F4CF' }, fill: { bg: '#00BC7D', text: '#FFFFFF' } },\n Red: { light: { bg: '#FEF2F2', text: '#9F0712', border: '#FFC9C9' }, fill: { bg: '#FB2C36', text: '#FFFFFF' } },\n Orange: { light: { bg: '#FFF6ED', text: '#9B2911', border: '#FFD1A9' }, fill: { bg: '#FB6011', text: '#FFFFFF' } },\n Cyan: { light: { bg: '#ECFEFF', text: '#005F78', border: '#A2F4FD' }, fill: { bg: '#00B8DB', text: '#FFFFFF' } },\n Violet: { light: { bg: '#F5F3FF', text: '#5D0EC0', border: '#DDD6FF' }, fill: { bg: '#8E51FF', text: '#FFFFFF' } },\n Pink: { light: { bg: '#FDF2F8', text: '#A3004C', border: '#FCCEE8' }, fill: { bg: '#F6339A', text: '#FFFFFF' } },\n Gray: { light: { bg: '#F5F5F4', text: '#292524', border: '#E7E5E4' }, fill: { bg: '#292524', text: '#FFFFFF' } },\n Yellow: { light: { bg: '#FFFBEB', text: '#973C00', border: '#FEE685' }, fill: { bg: '#FE9A00', text: '#FFFFFF' } },\n Blue: { light: { bg: '#EFF6FF', text: '#193CB8', border: '#BEDBFF' }, fill: { bg: '#2B7FFF', text: '#FFFFFF' } },\n};\n\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n if (color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n if (color === 'Orange' && primaryColor) {\n return { ...config, fill: { ...config.fill, bg: primaryColor } };\n }\n return config;\n }\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return {\n light: { bg: `rgba(${r},${g},${b},0.1)`, text: color, border: `rgba(${r},${g},${b},0.3)` },\n fill: { bg: color, text: '#FFFFFF' },\n };\n }\n return COLOR_CONFIG.Gray;\n};\n\nconst getIconColor = (color: TagColor, primaryColor?: string): string => {\n const map: Record<string, string> = {\n Green: '#009966', Red: '#E7000B', Orange: primaryColor || '#E17100',\n Blue: '#155DFC', Yellow: '#EC470A', Cyan: '#0092B8',\n Violet: '#7F22FE', Pink: '#E60076', Gray: '#57534D',\n };\n return map[color] ?? (color.startsWith('#') ? color : '#57534D');\n};\n\nconst getOutlineColor = (color: TagColor): string => {\n const map: Record<string, string> = {\n Green: '#A4F4CF', Red: '#FFC9C9', Orange: '#FFD1A9',\n Blue: '#BEDBFF', Yellow: '#FFD1A9', Cyan: '#A2F4FD',\n Violet: '#DDD6FF', Pink: '#FCCEE8', Gray: '#E7E5E4',\n };\n if (color in map) return map[color];\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return `rgba(${r},${g},${b},0.3)`;\n }\n return '#E7E5E4';\n};\n\n// ─── Size Config ──────────────────────────────────────────────────────────────\n// Values derived from Figma design (node 3307:417515)\n\ntype NSize = 'sm' | 'md' | 'lg';\n\nconst normalizeSize = (size: TagSize): NSize => {\n if (size === 'large') return 'lg';\n if (size === 'small') return 'sm';\n return size as NSize;\n};\n\nconst SIZE = {\n sm: {\n // Base padding: px-8px py-3px (h=24px with lh-18px)\n basePx: 8, basePy: 3,\n // Left padding adjustments per leading element (checkbox wins over icon)\n plCheckbox: 5, plAvatar: 4, plDot: 6, plIcon: 4,\n // Right padding adjustments per action\n prClose: 4, prCount: 4,\n fontSize: 12, lineHeight: '18px', height: 24,\n avatarSize: 16, checkboxSize: 14,\n contentGap: 4, rootGap: 3,\n countPx: 4, countFontSize: 12,\n closeSize: 10, closePad: 2,\n },\n md: {\n // Base padding: px-9px py-2px (h=24px with lh-20px)\n basePx: 9, basePy: 2,\n plCheckbox: 4, plAvatar: 5, plDot: 7, plIcon: 5,\n prClose: 4, prCount: 3,\n fontSize: 14, lineHeight: '20px', height: 24,\n avatarSize: 16, checkboxSize: 16,\n contentGap: 5, rootGap: 4,\n countPx: 5, countFontSize: 12,\n closeSize: 12, closePad: 2,\n },\n lg: {\n // Base padding: px-10px py-4px (h=28px with lh-20px)\n basePx: 10, basePy: 4,\n plCheckbox: 5, plAvatar: 7, plDot: 9, plIcon: 7,\n prClose: 4, prCount: 4,\n fontSize: 14, lineHeight: '20px', height: 28,\n avatarSize: 18, checkboxSize: 18,\n contentGap: 6, rootGap: 4,\n countPx: 6, countFontSize: 14,\n closeSize: 14, closePad: 3,\n },\n} as const;\n\n// ─── TagAvatar ────────────────────────────────────────────────────────────────\n\nexport interface TagAvatarProps {\n src?: string;\n alt?: string;\n size?: number;\n}\n\nexport const TagAvatar: React.FC<TagAvatarProps> = ({ src, alt = 'Avatar', size = 16 }) => {\n const [failed, setFailed] = useState(false);\n return (\n <div\n style={{\n width: size, height: size, borderRadius: '50%',\n overflow: 'hidden', flexShrink: 0,\n border: '0.667px solid rgba(0,0,0,0.08)',\n background: '#e5e5e4',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n >\n {src && !failed ? (\n <img\n src={src} alt={alt}\n onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <svg\n width={size * 0.625} height={size * 0.625}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <circle cx=\"5\" cy=\"3.5\" r=\"2\" stroke=\"#999\" strokeWidth=\"1.2\" />\n <path d=\"M1 9.5c0-2.2 1.8-4 4-4s4 1.8 4 4\" stroke=\"#999\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </div>\n );\n};\n\n// ─── Tag ──────────────────────────────────────────────────────────────────────\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'md',\n stroke = false,\n iconType: iconTypeProp,\n icon,\n avatarSrc,\n dotColor,\n action = 'none',\n count,\n onClose,\n checkbox = false,\n checked: checkedProp,\n onCheckedChange,\n iconPosition,\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [internalChecked, setInternalChecked] = useState(false);\n\n const nSize = normalizeSize(size);\n const s = SIZE[nSize];\n\n // Controlled/uncontrolled checkbox\n const isChecked = checkedProp !== undefined ? checkedProp : internalChecked;\n const handleCheckboxToggle = (e: React.MouseEvent) => {\n e.stopPropagation();\n const next = !isChecked;\n if (checkedProp === undefined) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n // Resolve icon type; backward-compat: legacy iconPosition='leading' → iconType='icon'\n const iconType: TagIconType =\n iconTypeProp ??\n (icon && iconPosition === 'leading' ? 'icon' : 'none');\n\n const hasLeading = iconType !== 'none';\n const effectiveAction = action !== 'none' ? action : undefined;\n\n // Compute left padding (checkbox wins > dot > avatar/icon > base)\n const pl = checkbox ? s.plCheckbox\n : iconType === 'dot' ? s.plDot\n : iconType === 'avatar' || iconType === 'icon' ? s.plAvatar\n : s.basePx;\n\n // Compute right padding\n const pr = effectiveAction === 'x-close' ? s.prClose\n : effectiveAction === 'count' ? s.prCount\n : s.basePx;\n\n // Base neutral style matching Figma (white bg + gray border)\n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: effectiveAction === 'x-close' ? s.rootGap : 0,\n paddingLeft: pl,\n paddingRight: pr,\n paddingTop: s.basePy,\n paddingBottom: s.basePy,\n height: s.height,\n borderRadius: 6,\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 500,\n fontSize: s.fontSize,\n lineHeight: s.lineHeight,\n transition: 'all 0.2s',\n cursor: onClick ? 'pointer' : 'default',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n color: '#44403c',\n // Inset outline matches Figma: outline-1 outline-offset-[-1px]\n outline: '1px solid #d7d3d0',\n outlineOffset: '-1px',\n };\n\n // Optional color override (keeps backward compat with color prop)\n if (color) {\n const colorConfig = getColorConfig(color, primaryColor);\n if (variant === 'light') {\n containerStyle.backgroundColor = colorConfig.light.bg;\n containerStyle.color = colorConfig.light.text;\n containerStyle.outline = stroke ? `1px solid ${getOutlineColor(color)}` : 'none';\n containerStyle.outlineOffset = stroke ? '-1px' : undefined;\n } else {\n containerStyle.backgroundColor = colorConfig.fill.bg;\n containerStyle.color = colorConfig.fill.text;\n containerStyle.outline = 'none';\n }\n }\n\n if (onClick) {\n containerStyle.cursor = 'pointer';\n }\n\n // Leading icon element\n const renderLeadingIcon = () => {\n if (iconType === 'avatar') {\n return <TagAvatar src={avatarSrc} size={s.avatarSize} />;\n }\n if (iconType === 'dot') {\n return (\n <svg width={8} height={8} viewBox=\"0 0 8 8\" fill=\"none\" style={{ flexShrink: 0 }}>\n <circle cx={4} cy={4} r={3.5} fill={dotColor || 'currentColor'} />\n </svg>\n );\n }\n if (iconType === 'icon' && icon) {\n return (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: s.avatarSize,\n height: s.avatarSize,\n })}\n </span>\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={containerStyle}\n onClick={onClick}\n {...rest}\n >\n {/* Content row: checkbox + icon + text + count */}\n <div style={{ display: 'flex', alignItems: 'center', gap: s.contentGap, flexShrink: 0 }}>\n {/* Checkbox */}\n {checkbox && (\n <div\n role=\"checkbox\"\n aria-checked={isChecked}\n onClick={handleCheckboxToggle}\n style={{\n width: s.checkboxSize, height: s.checkboxSize,\n borderRadius: 4, flexShrink: 0,\n border: isChecked ? 'none' : '1px solid #d7d3d0',\n background: isChecked ? (primaryColor || '#7F56D9') : '#ffffff',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n cursor: 'pointer',\n }}\n >\n {isChecked && (\n <svg\n width={Math.round(s.checkboxSize * 0.65)}\n height={Math.round(s.checkboxSize * 0.65)}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M8.5 2L4 7.5 1.5 5\" stroke=\"#fff\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )}\n\n {/* Leading icon (avatar / dot / generic icon) */}\n {renderLeadingIcon()}\n\n {/* Text label */}\n <span style={{ whiteSpace: 'nowrap' }}>{children}</span>\n\n {/* Count badge */}\n {effectiveAction === 'count' && typeof count === 'number' && (\n <span style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n paddingLeft: s.countPx, paddingRight: s.countPx,\n paddingTop: 1, paddingBottom: 1,\n background: 'rgba(0,0,0,0.07)',\n borderRadius: 3,\n fontSize: s.countFontSize,\n fontWeight: 500,\n lineHeight: '16px',\n flexShrink: 0,\n }}>\n {count}\n </span>\n )}\n </div>\n\n {/* Close X (outside content row, right side) */}\n {effectiveAction === 'x-close' && (\n <button\n aria-label=\"Remove\"\n onClick={(e) => { e.stopPropagation(); onClose?.(); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: s.closePad, borderRadius: 3,\n border: 'none', background: 'transparent',\n cursor: 'pointer', flexShrink: 0,\n color: 'inherit', opacity: 0.55,\n lineHeight: 0,\n }}\n >\n <svg width={s.closeSize} height={s.closeSize} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.5 2.5l-5 5M2.5 2.5l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n\n {/* Legacy: icon rendered after text when iconPosition='after' */}\n {iconPosition === 'after' && icon && !iconTypeProp && (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0, marginLeft: s.contentGap }}>\n {icon}\n </span>\n )}\n </div>\n );\n};\n\nexport default Tag;\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, { 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<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | 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 const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(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, filteredOptions.length]);\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:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\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 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 Input from \"../Input\";\nimport Select from \"../Select\";\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 = (item: number | string): 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={isActive ? \"primary\" : \"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: isActive ? `1px solid ${primaryColor}` : undefined,\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 <LeftArrowIcon />\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 <RightArrowIcon />\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 {total > 0 && (\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 <LeftArrowIcon />\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 <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\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 <RightArrowIcon />\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 <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\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 Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\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 OK\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React, { useState } from 'react';\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 /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\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 size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const isActive = checked || indeterminate;\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled) return;\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const iconSize = size === 'sm' ? '12px' : '14px';\n const borderRadius = size === 'sm' ? 'var(--radius-xs, 4px)' : 'var(--radius-sm, 6px)';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (isActive) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (isActive) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n // Disabled active: use muted icon so it's visible on the light bg\n const iconColor = disabled && isActive\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n const hasLabel = children || hint;\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Checkbox box */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius,\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Indeterminate dash */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n\n {/* Check mark */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: checked && !indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\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// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\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\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\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 innerClassName?: 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 innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\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 // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\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 renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\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, renderEmpty]);\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 const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\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 ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\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\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\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 <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\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\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\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={innerClassName}>\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 <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n};\n\nexport default Table;\n\n","import React, { useState } from 'react';\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 /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\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 size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled || checked) return;\n const syntheticEvent = {\n target: { checked: true, value },\n currentTarget: { checked: true, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const dotSize = size === 'sm' ? '6px' : '8px';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (checked) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (checked) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n const hasLabel = children || hint;\n\n // Disabled checked: use muted dot color so it's visible on the light bg\n const dotColor = disabled && checked\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n return (\n <div\n className={`aha-radio ${className}`}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Radio circle */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius: '50%',\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Inner dot */}\n <div\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: '50%',\n backgroundColor: dotColor,\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n flexShrink: 0,\n }}\n />\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\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: '0px',\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: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#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: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#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, { forwardRef, useRef, useEffect, useMemo, useLayoutEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\ninterface LinkifyOptions {\n validate?: (url: string) => boolean;\n className?: string;\n needProtocol?: boolean;\n needHost?: boolean;\n allowedTlds?: string[];\n}\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 linkify?: boolean;\n /** 链接识别配置 */\n linkifyOptions?: LinkifyOptions;\n}\n\ntype TextToken =\n | { type: 'text'; text: string }\n | { type: 'url'; text: string; href: string };\n\nconst DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$/;\nconst URL_CANDIDATE_REGEX =\n /(https?:\\/\\/[^\\s<]+|www\\.[^\\s<]+|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/[^\\s<]*)?)/gi;\nconst DEFAULT_ALLOWED_TLDS = new Set([\n 'com',\n 'cn',\n 'net',\n 'org',\n 'io',\n 'co',\n 'edu',\n 'gov',\n 'ai',\n 'app',\n 'dev',\n 'me',\n 'info',\n 'biz',\n 'tech',\n 'cc',\n 'tv',\n 'xyz',\n 'top',\n 'vip',\n 'pro',\n 'store',\n 'site',\n 'online',\n 'cloud',\n]);\n\nexport const websiteValidator = (\n url: string,\n needProtocol: boolean = true,\n needHost: boolean = true,\n allowedTlds?: string[]\n): boolean => {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (!trimmed) return false;\n\n const hasProtocol = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(trimmed);\n if (needProtocol && !hasProtocol) return false;\n\n const normalized = hasProtocol ? trimmed : `https://${trimmed}`;\n\n try {\n const parsed = new URL(normalized);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'http:' && protocol !== 'https:') return false;\n\n if (needHost) {\n const host = parsed.hostname.toLowerCase();\n if (!host) return false;\n if (host === 'localhost') return true;\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host)) {\n return host.split('.').every((segment) => {\n const num = Number(segment);\n return Number.isInteger(num) && num >= 0 && num <= 255;\n });\n }\n if (!DOMAIN_REGEX.test(host)) return false;\n const tld = host.split('.').pop() || '';\n const tldSet = allowedTlds\n ? new Set(allowedTlds.map((item) => item.toLowerCase()))\n : DEFAULT_ALLOWED_TLDS;\n if (!tldSet.has(tld)) return false;\n }\n return true;\n } catch {\n return false;\n }\n};\n\nconst trimTrailingPunctuation = (value: string): { core: string; suffix: string } => {\n const match = value.match(/^(.*?)([),.;!?]+)?$/);\n return {\n core: match?.[1] || value,\n suffix: match?.[2] || '',\n };\n};\n\nconst tokenizeText = (\n text: string,\n options?: LinkifyOptions\n): TextToken[] => {\n if (!text) return [];\n\n const tokens: TextToken[] = [];\n let lastIndex = 0;\n const regex = new RegExp(URL_CANDIDATE_REGEX);\n let match = regex.exec(text);\n\n while (match) {\n const matchedText = match[0];\n const start = match.index;\n const end = start + matchedText.length;\n\n if (start > lastIndex) {\n tokens.push({ type: 'text', text: text.slice(lastIndex, start) });\n }\n\n const { core, suffix } = trimTrailingPunctuation(matchedText);\n const href = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(core)\n ? core\n : `https://${core}`;\n const defaultIsValid = websiteValidator(\n core,\n options?.needProtocol ?? false,\n options?.needHost ?? true,\n options?.allowedTlds\n );\n const isValid = options?.validate ? options.validate(href) : defaultIsValid;\n\n if (isValid && core) {\n tokens.push({ type: 'url', text: core, href });\n if (suffix) {\n tokens.push({ type: 'text', text: suffix });\n }\n } else {\n tokens.push({ type: 'text', text: matchedText });\n }\n\n lastIndex = end;\n match = regex.exec(text);\n }\n\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', text: text.slice(lastIndex) });\n }\n\n return tokens;\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n\nconst ZWSP = '\\u200B';\nconst stripEditorArtifacts = (value: string): string =>\n value.replace(new RegExp(ZWSP, 'g'), '');\n\nconst renderTokensAsHtml = (\n text: string,\n options?: LinkifyOptions,\n disabled?: boolean\n): string => {\n const tokens = tokenizeText(text, options);\n if (tokens.length === 0) return '';\n\n const html = tokens\n .map((token) => {\n if (token.type === 'text') {\n return escapeHtml(token.text);\n }\n\n const classAttr = options?.className ? ` class=\"${options.className}\"` : '';\n const pointerEvents = disabled ? 'pointer-events: none;' : '';\n return `<a href=\"${escapeHtml(token.href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${classAttr} style=\"color: #2563EB; text-decoration: underline; ${pointerEvents}\">${escapeHtml(token.text)}</a>`;\n })\n .join('');\n\n // contentEditable 在末尾是换行时可能吞掉视觉换行,补一个零宽字符占位\n if (text.endsWith('\\n')) {\n return `${html}<span data-aha-zwsp=\"true\">${ZWSP}</span>`;\n }\n return html;\n};\n\nconst getCaretOffset = (container: HTMLElement): number => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return 0;\n\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer)) return 0;\n\n const preRange = range.cloneRange();\n preRange.selectNodeContents(container);\n preRange.setEnd(range.startContainer, range.startOffset);\n return stripEditorArtifacts(preRange.toString()).length;\n};\n\nconst setCaretOffset = (container: HTMLElement, offset: number): void => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (!selection) return;\n\n let remaining = Math.max(0, offset);\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let currentNode = walker.nextNode();\n\n while (currentNode) {\n const rawText = currentNode.textContent || '';\n let visibleCount = 0;\n let targetOffsetInNode = -1;\n for (let i = 0; i < rawText.length; i += 1) {\n if (rawText[i] !== ZWSP) {\n visibleCount += 1;\n }\n if (visibleCount === remaining) {\n targetOffsetInNode = i + 1;\n break;\n }\n }\n\n if (remaining === 0) {\n range.setStart(currentNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n if (targetOffsetInNode !== -1) {\n range.setStart(currentNode, targetOffsetInNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n remaining -= visibleCount;\n currentNode = walker.nextNode();\n }\n\n range.selectNodeContents(container);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n};\n\nconst getSelectionOffsets = (\n container: HTMLElement\n): { start: number; end: number } | null => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer) || !container.contains(range.endContainer)) {\n return null;\n }\n\n const startRange = range.cloneRange();\n startRange.selectNodeContents(container);\n startRange.setEnd(range.startContainer, range.startOffset);\n\n const endRange = range.cloneRange();\n endRange.selectNodeContents(container);\n endRange.setEnd(range.endContainer, range.endOffset);\n\n return {\n start: stripEditorArtifacts(startRange.toString()).length,\n end: stripEditorArtifacts(endRange.toString()).length,\n };\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 linkify = false,\n linkifyOptions,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const isComposingRef = useRef(false);\n const caretOffsetRef = useRef<number | null>(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(仅原生 textarea 模式)\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(linkify ? null : textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n linkify ? null : textareaRef.current;\n }\n }, [ref, linkify]);\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 const getMaxLengthValue = useMemo(\n () => (typeof maxLength === 'number' ? maxLength : undefined),\n [maxLength]\n );\n\n // 自动调整高度(原生 textarea)\n useEffect(() => {\n if (!linkify && 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, linkify]);\n\n // 自动调整高度(linkify + contentEditable)\n useEffect(() => {\n if (!linkify || !autoSize || !editableRef.current) return;\n const editable = editableRef.current;\n const minRows = typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows = typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n const lineHeight = parseInt(\n window.getComputedStyle(editable).lineHeight || '24',\n 10\n );\n const minHeight = minRows * lineHeight + 24;\n const maxHeight = maxRows ? maxRows * lineHeight + 24 : undefined;\n\n editable.style.height = 'auto';\n let newHeight = Math.max(editable.scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n editable.style.height = `${newHeight}px`;\n editable.style.overflowY = maxHeight && editable.scrollHeight > maxHeight ? 'auto' : 'hidden';\n setHeight(newHeight);\n }, [autoSize, currentValue, linkify]);\n\n useLayoutEffect(() => {\n if (!linkify || !editableRef.current || isComposingRef.current) return;\n const editable = editableRef.current;\n const isActive = document.activeElement === editable;\n const fallbackOffset = isActive ? getCaretOffset(editable) : 0;\n const caretOffset = caretOffsetRef.current ?? fallbackOffset;\n const nextHtml = renderTokensAsHtml(\n String(currentValue || ''),\n linkifyOptions,\n disabled\n );\n\n if (editable.innerHTML !== nextHtml) {\n editable.innerHTML = nextHtml;\n }\n\n if (isActive) {\n const maxOffset = String(currentValue || '').length;\n setCaretOffset(editable, Math.min(caretOffset, maxOffset));\n }\n caretOffsetRef.current = null;\n }, [currentValue, disabled, linkify, linkifyOptions]);\n\n const notifyChange = (nextValue: string) => {\n const syntheticEvent = {\n target: { value: nextValue },\n currentTarget: { value: nextValue },\n } as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleEditableInput = () => {\n if (!editableRef.current || isComposingRef.current) return;\n caretOffsetRef.current = getCaretOffset(editableRef.current);\n const rawValue = stripEditorArtifacts(editableRef.current.textContent || '');\n const nextValue = getMaxLengthValue ? rawValue.slice(0, getMaxLengthValue) : rawValue;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n notifyChange(nextValue);\n };\n\n const handleEditablePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (readOnly || disabled) return;\n\n const pastedText = e.clipboardData.getData('text/plain');\n const currentText = String(currentValue || '');\n const selection = window.getSelection();\n let nextText = `${currentText}${pastedText}`;\n let caretOffset = currentText.length + pastedText.length;\n\n if (\n selection &&\n selection.rangeCount > 0 &&\n editableRef.current?.contains(selection.anchorNode)\n ) {\n const startOffset = getCaretOffset(editableRef.current);\n const endOffset = (() => {\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(editableRef.current);\n preRange.setEnd(range.endContainer, range.endOffset);\n return preRange.toString().length;\n })();\n nextText =\n currentText.slice(0, startOffset) +\n pastedText +\n currentText.slice(endOffset);\n caretOffset = startOffset + pastedText.length;\n }\n\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n caretOffset = Math.min(caretOffset, nextText.length);\n }\n caretOffsetRef.current = caretOffset;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const handleEditableKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (disabled || readOnly) return;\n if (!editableRef.current) return;\n\n e.preventDefault();\n const currentText = String(currentValue || '');\n const offsets = getSelectionOffsets(editableRef.current);\n const start = offsets?.start ?? currentText.length;\n const end = offsets?.end ?? start;\n\n let nextText = `${currentText.slice(0, start)}\\n${currentText.slice(end)}`;\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n }\n\n const nextCaret = Math.min(start + 1, nextText.length);\n caretOffsetRef.current = nextCaret;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\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 || linkify ? '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 .aha-textarea-wrapper .aha-textarea-editable {\n white-space: pre-wrap;\n word-break: break-word;\n }\n .aha-textarea-wrapper .aha-textarea-editable:empty::before {\n content: attr(data-placeholder);\n color: #79716B;\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\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 {linkify ? (\n <div\n ref={editableRef}\n className=\"aha-textarea-editable\"\n contentEditable={!disabled && !readOnly}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-disabled={disabled}\n data-placeholder={placeholder || ''}\n onInput={handleEditableInput}\n onPaste={handleEditablePaste}\n onKeyDown={handleEditableKeyDown}\n onFocus={(e) => handleFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onBlur={(e) => handleBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n handleEditableInput();\n }}\n style={{\n ...baseStyles,\n minHeight: autoSize ? undefined : `${rows * 24 + 24}px`,\n overflowY: autoSize ? 'hidden' : 'auto',\n }}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\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 )}\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\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\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?: PresetRange[] | 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 /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\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 showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\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; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\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 setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\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 placementDeterminedRef.current = false;\n determinedPlacementRef.current = 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 // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else 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 if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\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) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 defaultPresetRanges = 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: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \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 } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\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 // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\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 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 @keyframes dropdownFadeInTop {\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: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\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 rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\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' : (currentRangeValue.startDate || 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 ) : (\n // 范围模式:显示两个输入框\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 ) : (\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 {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\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: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : '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 && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && 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 && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && 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 8px',\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 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 && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : 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 {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\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 flex: 1,\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 </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 // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\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\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\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 /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => 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 /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\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, setFieldsState] = 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 // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\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 setFieldsState((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 setFieldsState((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 setFieldsState((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 setFieldsState((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 registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((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 registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\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 setFieldsState((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 values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((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 fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((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 fieldsRef.current[name] = { ...newFields[name] };\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 // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\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 setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\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 setFields,\n submit,\n scrollToField,\n registerFieldRef,\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/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } 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 // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\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 // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.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={setItemRef}\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 suffixIcon?: 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 fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\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 {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\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;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\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 }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow:\n \"0px 2px 2px -1px var(--ColorsEffectsShadowsshadow-lg03), 0px 4px 6px -2px var(--ColorsEffectsShadowsshadow-lg02), 0px 12px 16px -4px var(--ColorsEffectsShadowsshadow-lg01)\",\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\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 </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = 'var(--theme-color, #5A31F0)',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\n","import React, { useState } from 'react';\nimport type { MouseEventHandler, ReactNode } from 'react';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BadgeColor =\n | 'gray'\n | 'brand'\n | 'error'\n | 'warning'\n | 'success'\n | 'grayBlue'\n | 'blueLight'\n | 'blue'\n | 'indigo'\n | 'purple'\n | 'pink'\n | 'orange';\n\nexport type BadgeVariant = 'pill' | 'badge' | 'modern';\n\nexport type BadgeSize = 'sm' | 'md' | 'lg';\n\nexport type BadgeIconComponent = React.FC<{\n style?: React.CSSProperties;\n className?: string;\n}>;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\ninterface ColorTokens {\n bg: string;\n text: string;\n ring: string;\n dot: string;\n btnText: string;\n btnHoverBg: string;\n btnHoverText: string;\n}\n\nconst colorTokens: Record<BadgeColor, ColorTokens> = {\n gray: {\n bg: 'var(--color-gray-50)',\n text: 'var(--color-gray-700)',\n ring: 'var(--color-gray-200)',\n dot: 'var(--color-gray-500)',\n btnText: 'var(--color-gray-400)',\n btnHoverBg: 'var(--color-gray-100)',\n btnHoverText: 'var(--color-gray-500)',\n },\n brand: {\n bg: 'var(--color-brand-50)',\n text: 'var(--color-brand-700)',\n ring: 'var(--color-brand-200)',\n dot: 'var(--color-brand-500)',\n btnText: 'var(--color-brand-400)',\n btnHoverBg: 'var(--color-brand-100)',\n btnHoverText: 'var(--color-brand-500)',\n },\n error: {\n bg: 'var(--color-error-50)',\n text: 'var(--color-error-700)',\n ring: 'var(--color-error-200)',\n dot: 'var(--color-error-500)',\n btnText: 'var(--color-error-400)',\n btnHoverBg: 'var(--color-error-100)',\n btnHoverText: 'var(--color-error-500)',\n },\n warning: {\n bg: 'var(--color-warning-50)',\n text: 'var(--color-warning-700)',\n ring: 'var(--color-warning-200)',\n dot: 'var(--color-warning-500)',\n btnText: 'var(--color-warning-400)',\n btnHoverBg: 'var(--color-warning-100)',\n btnHoverText: 'var(--color-warning-500)',\n },\n success: {\n bg: 'var(--color-success-50)',\n text: 'var(--color-success-700)',\n ring: 'var(--color-success-200)',\n dot: 'var(--color-success-500)',\n btnText: 'var(--color-success-400)',\n btnHoverBg: 'var(--color-success-100)',\n btnHoverText: 'var(--color-success-500)',\n },\n grayBlue: {\n bg: 'var(--color-gray-blue-50)',\n text: 'var(--color-gray-blue-700)',\n ring: 'var(--color-gray-blue-200)',\n dot: 'var(--color-gray-blue-500)',\n btnText: 'var(--color-gray-blue-400)',\n btnHoverBg: 'var(--color-gray-blue-100)',\n btnHoverText: 'var(--color-gray-blue-500)',\n },\n blueLight: {\n bg: 'var(--color-blue-light-50)',\n text: 'var(--color-blue-light-700)',\n ring: 'var(--color-blue-light-200)',\n dot: 'var(--color-blue-light-500)',\n btnText: 'var(--color-blue-light-400)',\n btnHoverBg: 'var(--color-blue-light-100)',\n btnHoverText: 'var(--color-blue-light-500)',\n },\n blue: {\n bg: 'var(--color-blue-50)',\n text: 'var(--color-blue-700)',\n ring: 'var(--color-blue-200)',\n dot: 'var(--color-blue-500)',\n btnText: 'var(--color-blue-400)',\n btnHoverBg: 'var(--color-blue-100)',\n btnHoverText: 'var(--color-blue-500)',\n },\n indigo: {\n bg: 'var(--color-indigo-50)',\n text: 'var(--color-indigo-700)',\n ring: 'var(--color-indigo-200)',\n dot: 'var(--color-indigo-500)',\n btnText: 'var(--color-indigo-400)',\n btnHoverBg: 'var(--color-indigo-100)',\n btnHoverText: 'var(--color-indigo-500)',\n },\n purple: {\n bg: 'var(--color-purple-50)',\n text: 'var(--color-purple-700)',\n ring: 'var(--color-purple-200)',\n dot: 'var(--color-purple-500)',\n btnText: 'var(--color-purple-400)',\n btnHoverBg: 'var(--color-purple-100)',\n btnHoverText: 'var(--color-purple-500)',\n },\n pink: {\n bg: 'var(--color-pink-50)',\n text: 'var(--color-pink-700)',\n ring: 'var(--color-pink-200)',\n dot: 'var(--color-pink-500)',\n btnText: 'var(--color-pink-400)',\n btnHoverBg: 'var(--color-pink-100)',\n btnHoverText: 'var(--color-pink-500)',\n },\n orange: {\n bg: 'var(--color-orange-50)',\n text: 'var(--color-orange-700)',\n ring: 'var(--color-orange-200)',\n dot: 'var(--color-orange-500)',\n btnText: 'var(--color-orange-400)',\n btnHoverBg: 'var(--color-orange-100)',\n btnHoverText: 'var(--color-orange-500)',\n },\n};\n\n// ─── Size Configs ─────────────────────────────────────────────────────────────\n\nconst pillPadding: Record<BadgeSize, string> = {\n sm: '2px 8px',\n md: '2px 10px',\n lg: '4px 12px',\n};\nconst badgePadding: Record<BadgeSize, string> = {\n sm: '2px 6px',\n md: '2px 8px',\n lg: '4px 10px',\n};\nconst fontSize: Record<BadgeSize, string> = {\n sm: '12px',\n md: '14px',\n lg: '14px',\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getTokens(variant: BadgeVariant, color: BadgeColor) {\n if (variant === 'modern') {\n return {\n ...colorTokens[color],\n bg: 'var(--color-bg-primary)',\n text: 'var(--color-text-secondary)',\n ring: 'var(--color-border-secondary)',\n };\n }\n return colorTokens[color];\n}\n\nfunction getRootStyle(\n variant: BadgeVariant,\n color: BadgeColor,\n size: BadgeSize,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n const t = getTokens(variant, color);\n const isPill = variant === 'pill';\n const isLg = size === 'lg' && !isPill;\n const ring = `inset 0 0 0 1px ${t.ring}`;\n const shadow =\n variant === 'modern'\n ? `${ring}, 0px 1px 2px 0px rgba(10, 13, 18, 0.05)`\n : ring;\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n width: 'max-content',\n borderRadius: isPill ? '9999px' : isLg ? '8px' : '6px',\n backgroundColor: t.bg,\n color: t.text,\n boxShadow: shadow,\n fontFamily: 'DM Sans, system-ui, sans-serif',\n fontWeight: 500,\n fontSize: fontSize[size],\n lineHeight: size === 'sm' ? '18px' : '20px',\n padding: isPill ? pillPadding[size] : badgePadding[size],\n ...extra,\n };\n}\n\n// ─── Dot ──────────────────────────────────────────────────────────────────────\n\nconst BadgeDot: React.FC<{ color: string }> = ({ color }) => (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill={color} />\n </svg>\n);\n\n// ─── X Icon ───────────────────────────────────────────────────────────────────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={style}\n >\n <path d=\"M9 3L3 9M3 3l6 6\" />\n </svg>\n);\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => (\n <span\n style={{ ...getRootStyle(variant, color, size), ...style }}\n className={className}\n >\n {children}\n </span>\n);\n\n// ─── BadgeWithDot ─────────────────────────────────────────────────────────────\n\nexport interface BadgeWithDotProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithDot: React.FC<BadgeWithDotProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const dotColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const isPill = variant === 'pill';\n const dotPaddingLeft: Record<BadgeSize, string> = { sm: isPill ? '6px' : '6px', md: isPill ? '8px' : '8px', lg: isPill ? '10px' : '10px' };\n const dotPaddingRight: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: dotPaddingLeft[size],\n paddingRight: dotPaddingRight[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <BadgeDot color={dotColor} />\n {children}\n </span>\n );\n};\n\n// ─── BadgeWithIcon ────────────────────────────────────────────────────────────\n\nexport interface BadgeWithIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n iconLeading?: BadgeIconComponent;\n iconTrailing?: BadgeIconComponent;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithIcon: React.FC<BadgeWithIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n iconLeading: IconLeading,\n iconTrailing: IconTrailing,\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '4px', lg: '4px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n const isPill = variant === 'pill';\n const hasLeading = !!IconLeading;\n\n const smPad = { pl: isPill ? (hasLeading ? '6px' : '8px') : (hasLeading ? '6px' : '8px'), pr: isPill ? (hasLeading ? '8px' : '6px') : (hasLeading ? '8px' : '6px') };\n const mdPad = { pl: isPill ? (hasLeading ? '8px' : '10px') : (hasLeading ? '8px' : '8px'), pr: isPill ? (hasLeading ? '10px' : '8px') : (hasLeading ? '8px' : '8px') };\n const lgPad = { pl: isPill ? (hasLeading ? '10px' : '12px') : (hasLeading ? '10px' : '10px'), pr: isPill ? (hasLeading ? '12px' : '10px') : (hasLeading ? '10px' : '10px') };\n const padMap: Record<BadgeSize, { pl: string; pr: string }> = { sm: smPad, md: mdPad, lg: lgPad };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: padMap[size].pl,\n paddingRight: padMap[size].pr,\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {IconLeading && (\n <IconLeading style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n {children}\n {IconTrailing && (\n <IconTrailing style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n </span>\n );\n};\n\n// ─── BadgeWithButton ──────────────────────────────────────────────────────────\n\nexport interface BadgeWithButtonProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon?: BadgeIconComponent;\n children: ReactNode;\n buttonLabel?: string;\n onButtonClick?: MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithButton: React.FC<BadgeWithButtonProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n buttonLabel,\n onButtonClick,\n children,\n style,\n className,\n}) => {\n const [hovered, setHovered] = useState(false);\n const t = getTokens(variant, color);\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '2px', lg: '2px' };\n const isPill = variant === 'pill';\n const plMap: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n const prMap: Record<BadgeSize, string> = { sm: isPill ? '3px' : '3px', md: isPill ? '4px' : '4px', lg: isPill ? '6px' : '6px' };\n const btnBorderRadius = isPill ? '9999px' : '3px';\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {children}\n <button\n type=\"button\"\n aria-label={buttonLabel}\n onClick={onButtonClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2px',\n border: 'none',\n cursor: 'pointer',\n borderRadius: btnBorderRadius,\n backgroundColor: hovered ? t.btnHoverBg : 'transparent',\n color: hovered ? t.btnHoverText : t.btnText,\n transition: 'background-color 100ms linear, color 100ms linear',\n outline: 'none',\n flexShrink: 0,\n }}\n >\n {Icon ? (\n <Icon style={{ width: '12px', height: '12px' }} />\n ) : (\n <XIcon />\n )}\n </button>\n </span>\n );\n};\n\n// ─── BadgeIcon ────────────────────────────────────────────────────────────────\n\nexport interface BadgeIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon: BadgeIconComponent;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeIcon: React.FC<BadgeIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const padMap: Record<BadgeSize, string> = { sm: '5px', md: '6px', lg: '8px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n padding: padMap[size],\n ...style,\n }}\n className={className}\n >\n <Icon style={{ width: iconSize[size], height: iconSize[size], color: iconColor }} />\n </span>\n );\n};\n\n// ─── BadgeWithImage ───────────────────────────────────────────────────────────\n\nexport interface BadgeWithImageProps {\n variant?: Exclude<BadgeVariant, 'modern'>;\n size?: BadgeSize;\n color?: BadgeColor;\n imgSrc: string;\n imgAlt?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithImage: React.FC<BadgeWithImageProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n imgSrc,\n imgAlt = 'avatar',\n children,\n style,\n className,\n}) => {\n const isPill = variant === 'pill';\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const plMap: Record<BadgeSize, string> = {\n sm: isPill ? '3px' : '4px',\n md: isPill ? '4px' : '6px',\n lg: isPill ? '6px' : '8px',\n };\n const prMap: Record<BadgeSize, string> = {\n sm: isPill ? '8px' : '6px',\n md: isPill ? '10px' : '8px',\n lg: isPill ? '12px' : '10px',\n };\n const imgSize: Record<BadgeSize, string> = { sm: '16px', md: '16px', lg: '18px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <img\n src={imgSrc}\n alt={imgAlt}\n style={{\n width: imgSize[size],\n height: imgSize[size],\n borderRadius: '9999px',\n objectFit: 'cover',\n flexShrink: 0,\n }}\n />\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import React, { type FC, useState } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface AvatarProps {\n size?: AvatarSize;\n src?: string | null;\n alt?: string;\n /** Two-letter initials displayed when no image is provided */\n initials?: string;\n /** Custom icon component displayed as placeholder */\n placeholderIcon?: FC<{ style?: React.CSSProperties }>;\n /** Online/offline status indicator dot */\n status?: 'online' | 'offline';\n /** Company logo badge displayed bottom-right */\n companyIcon?: { src: string; alt?: string };\n /** Blue verified checkmark badge */\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport interface AvatarLabelGroupProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n name: string;\n supportingText?: string;\n avatarSrc?: string | null;\n avatarInitials?: string;\n status?: 'online' | 'offline';\n companyIcon?: { src: string; alt?: string };\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ─── Size Config ────────────────────────────────────────────────────────────────\n\ninterface SizeConfig {\n size: number;\n border: number;\n fontSize: string;\n lineHeight: string;\n iconSize: number;\n onlineIndicator: { size: number; offset: number };\n companyIcon: { size: number; offset: number; border: number };\n verifiedTick: { size: number; offset: number };\n}\n\nconst SIZE_CONFIG: Record<AvatarSize, SizeConfig> = {\n xs: {\n size: 24, border: 0.5, fontSize: 'var(--font-size-text-xs)', lineHeight: 'var(--line-height-text-xs)', iconSize: 16,\n onlineIndicator: { size: 6, offset: -0.5 },\n companyIcon: { size: 10, offset: -2.5, border: 1.5 },\n verifiedTick: { size: 10, offset: -1.5 },\n },\n sm: {\n size: 32, border: 0.75, fontSize: 'var(--font-size-text-sm)', lineHeight: 'var(--line-height-text-sm)', iconSize: 20,\n onlineIndicator: { size: 8, offset: -0.75 },\n companyIcon: { size: 12, offset: -2.75, border: 1.5 },\n verifiedTick: { size: 12, offset: -0.75 },\n },\n md: {\n size: 40, border: 1, fontSize: 'var(--font-size-text-md)', lineHeight: 'var(--line-height-text-md)', iconSize: 24,\n onlineIndicator: { size: 10, offset: -1 },\n companyIcon: { size: 14, offset: -3, border: 1.5 },\n verifiedTick: { size: 14, offset: -1 },\n },\n lg: {\n size: 48, border: 1, fontSize: 'var(--font-size-text-lg)', lineHeight: 'var(--line-height-text-lg)', iconSize: 28,\n onlineIndicator: { size: 12, offset: -1 },\n companyIcon: { size: 16, offset: -3, border: 1.5 },\n verifiedTick: { size: 16, offset: -1 },\n },\n xl: {\n size: 56, border: 1, fontSize: 'var(--font-size-text-xl)', lineHeight: 'var(--line-height-text-xl)', iconSize: 32,\n onlineIndicator: { size: 14, offset: -1 },\n companyIcon: { size: 18, offset: -3, border: 1.5 },\n verifiedTick: { size: 18, offset: -1 },\n },\n '2xl': {\n size: 64, border: 1, fontSize: 'var(--font-size-display-xs)', lineHeight: 'var(--line-height-display-xs)', iconSize: 32,\n onlineIndicator: { size: 16, offset: -1 },\n companyIcon: { size: 20, offset: -3, border: 1.667 },\n verifiedTick: { size: 20, offset: -1 },\n },\n};\n\n// ─── AvatarLabelGroup Size Config ───────────────────────────────────────────────\n\ninterface LabelGroupSizeConfig {\n gap: string;\n nameFontSize: string;\n nameLineHeight: string;\n subFontSize: string;\n subLineHeight: string;\n}\n\nconst LABEL_GROUP_SIZE_CONFIG: Record<'sm' | 'md' | 'lg' | 'xl', LabelGroupSizeConfig> = {\n sm: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-xs)', subLineHeight: 'var(--line-height-text-xs)' },\n md: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-sm)', subLineHeight: 'var(--line-height-text-sm)' },\n lg: { gap: 'var(--spacing-lg)', nameFontSize: 'var(--font-size-text-md)', nameLineHeight: 'var(--line-height-text-md)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n xl: { gap: 'var(--spacing-xl)', nameFontSize: 'var(--font-size-text-lg)', nameLineHeight: 'var(--line-height-text-lg)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n};\n\n// ─── Default User Icon ──────────────────────────────────────────────────────────\n\nconst UserIcon: FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <path\n d=\"M20 21C20 19.6044 20 18.9067 19.8278 18.3389C19.44 17.0605 18.4395 16.06 17.1611 15.6722C16.5933 15.5 15.8956 15.5 14.5 15.5H9.5C8.10444 15.5 7.40665 15.5 6.83886 15.6722C5.56045 16.06 4.56004 17.0605 4.17224 18.3389C4 18.9067 4 19.6044 4 21M16.5 7.5C16.5 9.98528 14.4853 12 12 12C9.51472 12 7.5 9.98528 7.5 7.5C7.5 5.01472 9.51472 3 12 3C14.4853 3 16.5 5.01472 16.5 7.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── Verified Tick ─────────────────────────────────────────────────────────────\n\nconst VerifiedTickBadge: FC<{ size: number; offset: number }> = ({ size, offset }) => (\n <svg\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: size,\n height: size,\n flexShrink: 0,\n color: 'var(--color-blue-500)',\n overflow: 'hidden',\n zIndex: 1,\n }}\n >\n <path\n d=\"M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// ─── Avatar ─────────────────────────────────────────────────────────────────────\n\nconst Avatar: React.FC<AvatarProps> = ({\n size = 'md',\n src,\n alt,\n initials,\n placeholderIcon: PlaceholderIcon,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const [imgFailed, setImgFailed] = useState(false);\n const cfg = SIZE_CONFIG[size];\n const canShowImage = Boolean(src && !imgFailed);\n const isPlaceholder = !canShowImage;\n const hasBadge = Boolean(status || companyIcon || verified);\n\n const renderContent = () => {\n if (canShowImage) {\n return (\n <img\n src={src!}\n alt={alt}\n onError={() => setImgFailed(true)}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (initials) {\n return (\n <span\n style={{\n fontSize: cfg.fontSize,\n lineHeight: cfg.lineHeight,\n fontWeight: 600,\n color: 'var(--color-text-quaternary)',\n fontFamily: 'var(--font-family-body)',\n userSelect: 'none',\n }}\n >\n {initials}\n </span>\n );\n }\n if (PlaceholderIcon) {\n return (\n <PlaceholderIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <UserIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n };\n\n const renderBadge = () => {\n if (status === 'online' || status === 'offline') {\n const { size: iSize, offset } = cfg.onlineIndicator;\n return (\n <span\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: iSize,\n height: iSize,\n borderRadius: '50%',\n backgroundColor:\n status === 'online'\n ? 'var(--color-fg-success-secondary)'\n : 'var(--color-fg-quaternary)',\n border: '1.5px solid var(--color-bg-primary)',\n flexShrink: 0,\n }}\n />\n );\n }\n if (companyIcon) {\n const { size: cSize, offset, border } = cfg.companyIcon;\n return (\n <img\n src={companyIcon.src}\n alt={companyIcon.alt}\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: cSize,\n height: cSize,\n borderRadius: '50%',\n border: `${border}px solid var(--color-bg-primary)`,\n objectFit: 'cover',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (verified) {\n return (\n <VerifiedTickBadge\n size={cfg.verifiedTick.size}\n offset={cfg.verifiedTick.offset}\n />\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: cfg.size,\n height: cfg.size,\n borderRadius: '50%',\n border: `${cfg.border}px solid ${isPlaceholder ? 'var(--color-border-secondary)' : 'rgba(0, 0, 0, 0.08)'}`,\n backgroundColor: isPlaceholder ? 'var(--color-bg-tertiary)' : undefined,\n overflow: hasBadge ? undefined : 'hidden',\n flexShrink: 0,\n ...style,\n }}\n >\n {renderContent()}\n {renderBadge()}\n </div>\n );\n};\n\n// ─── AvatarLabelGroup ────────────────────────────────────────────────────────────\n\nexport const AvatarLabelGroup: React.FC<AvatarLabelGroupProps> = ({\n size = 'sm',\n name,\n supportingText,\n avatarSrc,\n avatarInitials,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const cfg = LABEL_GROUP_SIZE_CONFIG[size];\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: cfg.gap,\n position: 'relative',\n ...style,\n }}\n >\n <Avatar\n size={size}\n src={avatarSrc}\n initials={avatarInitials}\n status={status}\n companyIcon={companyIcon}\n verified={verified}\n />\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n fontSize: cfg.nameFontSize,\n lineHeight: cfg.nameLineHeight,\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {name}\n </span>\n {supportingText && (\n <span\n style={{\n fontSize: cfg.subFontSize,\n lineHeight: cfg.subLineHeight,\n fontWeight: 400,\n color: 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {supportingText}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Avatar;\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\";\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 const hasRightSlot = action || closeable;\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 ${hasRightSlot ? \"flex-1 min-w-0\" : \"\"}`}\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 </div>\n {hasRightSlot && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n {closeable && (\n <div\n className=\"cursor-pointer relative top-[-12px]\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\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"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__assign","assign","t","s","i","n","arguments","length","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","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","useTheme","context","useContext","SIZE_ALIAS","sm","md","lg","xl","small","mediumSmall","medium","large","HIERARCHY_ALIAS","primary","secondary","tertiary","default","SIZE_TOKENS","height","paddingX","paddingXLg","fontSize","lineHeight","iconSize","gap","iconOnlyPad","LoadingSpinner","_a","size","color","_jsxs","jsxs","_Fragment","Fragment","children","_jsx","jsx","width","viewBox","fill","style","animation","flexShrink","cx","cy","r","stroke","strokeWidth","opacity","strokeLinecap","Button","_b","type","_c","_d","disabled","_e","loading","iconOnly","_f","focused","onClick","_g","htmlType","_h","className","icon","_j","iconPosition","rest","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","hierarchy","isIconOnly","isLink","isDisabled","showFocusRing","themeBrand","visuals","bg","iconColor","border","boxShadow","interactive","textDecoration","getVisuals","focusShadow","buttonStyle","position","display","alignItems","justifyContent","fontFamily","fontWeight","cursor","outline","transition","userSelect","WebkitTapHighlightColor","whiteSpace","backgroundColor","borderRadius","overflow","padding","paddingLeft","paddingRight","renderIcon","showLeftIcon","showRightIcon","filter","Boolean","join","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","error","warning","info","CloseIcon","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","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","action","showClose","onClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","transform","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","ensureToastContainer","toastContainerElement","toastContainerRoot","isInitializing","window","document","existingContainer","getElementById","createElement","appendChild","createRoot","require","render","import","catch","warn","COLOR_CONFIG","Green","light","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","SIZE","basePx","basePy","plCheckbox","plAvatar","plDot","plIcon","prClose","prCount","avatarSize","checkboxSize","contentGap","rootGap","countPx","countFontSize","closeSize","closePad","TagAvatar","src","alt","failed","setFailed","onError","objectFit","Input","forwardRef","ref","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onChange","onFocus","onBlur","onPressEnter","restProps","inputRef","useRef","React","internalValue","setInternalValue","setFocused","current","isControlled","undefined","currentValue","handleClear","target","focus","showClear","sizeStyles","paddingTop","paddingBottom","baseStyles","boxSizing","WebkitAppearance","MozAppearance","appearance","onKeyDown","key","autoComplete","autoCorrect","autoCapitalize","spellCheck","strokeLinejoin","Select","controlledValue","options","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","_m","dropdownClassName","dropdownStyle","_o","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","_q","_r","internalOpen","setInternalOpen","_s","searchValue","setSearchValue","_t","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","includes","getFilteredOptions","String","toLowerCase","search","filteredOptions","useMemo","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","flexWrap","tagProps","closable","textOverflow","marginLeft","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","minHeight","val","createPortal","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","index","isSelected","isFocused","selected","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onShowSizeChange","simple","hideOnSinglePage","responsive","showLessItems","itemRender","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpToPage","setJumpToPage","totalPages","ceil","handlePageChange","page","handleJumpTo","parseInt","margin","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","Checkbox","checked","indeterminate","hint","isFocusedProp","hovered","setHovered","showFocus","boxSize","hasLabel","role","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","dotSize","dotColor","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","trimmed","trim","hasProtocol","test","normalized","parsed","URL","protocol","host","hostname","split","every","segment","num","isInteger","tld","has","trimTrailingPunctuation","match","core","escapeHtml","replace","stripEditorArtifacts","RegExp","renderTokensAsHtml","tokens","lastIndex","regex","exec","matchedText","href","defaultIsValid","validate","tokenizeText","html","token","classAttr","endsWith","getCaretOffset","container","selection","getSelection","rangeCount","range","getRangeAt","startContainer","preRange","cloneRange","selectNodeContents","setEnd","startOffset","Textarea","showCount","maxLength","rows","autoSize","linkify","linkifyOptions","textareaRef","editableRef","isComposingRef","caretOffsetRef","setHeight","currentLength","handleFocus","handleBlur","getMaxLengthValue","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","editable","overflowY","useLayoutEffect","activeElement","fallbackOffset","caretOffset","nextHtml","innerHTML","maxOffset","offset","createRange","remaining","walker","createTreeWalker","NodeFilter","SHOW_TEXT","currentNode","nextNode","rawText","textContent","visibleCount","targetOffsetInNode","setStart","collapse","removeAllRanges","addRange","setCaretOffset","notifyChange","nextValue","handleEditableInput","rawValue","resize","contentEditable","suppressContentEditableWarning","onInput","onPaste","pastedText","clipboardData","getData","currentText","nextText","anchorNode","endOffset","endContainer","nativeEvent","isComposing","offsets","startRange","endRange","getSelectionOffsets","nextCaret","onCompositionStart","onCompositionEnd","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","config","thumbSize","thumbOffset","isChecked","thumbLeft","newChecked","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","showSelectedRange","_v","startSelectedRangeText","_w","endSelectedRangeText","_x","rangeDisplayMode","_y","isRangeMode","_z","internalSingleValue","setInternalSingleValue","_0","startDate","endDate","internalRangeValue","setInternalRangeValue","_1","_2","selectingStart","setSelectingStart","_3","tempRangeValue","setTempRangeValue","_4","now","currentMonth","setCurrentMonth","_5","nextMonth","secondMonth","setSecondMonth","pickerRef","startInputRef","endInputRef","_6","hasOpenedRef","placementDeterminedRef","determinedPlacementRef","currentSingleValue","currentRangeValue","dateYear","dateMonth","rect_1","placement_1","dropdownHeight","top_2","placement_2","calculatePosition_1","workingRange","startText","endText","renderCalendar","handleSelectSingleDate","handleSelectRangeDate","newRange","handleToggle","defaultPresetRanges","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","presetRangesList","hasPresetRanges","handlePresetRangeSelect","startYear","startMonth","handlePrevMonth","handleNextMonth","generateCalendarData","daysInMonth","days","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","singleDisplayValue","startDisplayValue","endDisplayValue","rangeTextValue","weekDays","borderRight","borderTopLeftRadius","borderBottomLeftRadius","preset","idx","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","marginBottom","gridTemplateColumns","rowGap","columnGap","firstDay","getDay","cells","actualIndex","isCurrentMonth","isToday","isStartDate","isEndDate","isInRange_1","dateTime","getTime","startTime","endTime","isDateInSelectedRange","isFirstInRow","isLastInRow","isRangeStart_1","isRangeEnd_1","isFirstDayOfMonth","isLastDayOfMonth","needsLeftRadius","needsRightRadius","borderTopRightRadius","borderBottomRightRadius","isSelected_1","borderTop","FormContext","FormValidationError","_super","errorFields","__","constructor","__extends","Error","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","layout","initialFields","keys","touched","validating","fields","setFieldsState","fieldsRef","fieldElementsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldFnRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","field","_i","rules_1","rule","validator","string","number","isNaN","boolean","email","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","resetFields","setFieldsValue","allValues_2","submit","setFields","fieldsToSet","some","changedValues_1","registerFieldRef","scrollToField","el","useImperativeHandle","contextValue","formStyle","Provider","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","setItemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","showTooltip","setShowTooltip","tooltipRef","borderLeft","borderBottom","Children","child","isValidElement","childProps","fieldValue_1","setFieldValue_1","childType","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneElement","cloneChild","useForm","MenuList","items","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","k","skipGlobalClick","renderMenuItem","itemStyle","danger","suffixIcon","containerStyle","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","title","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","innerWidth","viewportHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","borderColor","hasEnoughSpace","popoverRect","getAvailableSpace","Popover","trigger","popoverClassName","destroyOnHide","destroyTooltipOnHide","shouldDestroyOnHide","internalVisible","setInternalVisible","visible","popoverStyle","setPopoverStyle","triggerRef","popoverRef","setVisible","nextVisible","updatePosition","nextPlacement","oppositePlacement","getOppositePlacement","getPlacementPosition","clamped","nextTop","nextLeft","clampToViewport","openPopover","closePopover","togglePopover","triggerEvents","popoverNode","visibility","VIEWPORT_PADDING","ANIMATION_DURATION","Drawer","afterOpenChange","footer","mask","maskClosable","closeIcon","keyboard","destroyOnClose","mobileBreakpoint","drawerStyle","headerStyle","bodyStyle","footerStyle","maskStyle","mergedOpen","shouldRender","setShouldRender","animatedOpen","setAnimatedOpen","mounted","setMounted","isMobile","setIsMobile","updateMobile","raf_1","cancelAnimationFrame","previousOverflow","closeDrawer","resolvedWidth","resolvedHeight","effectivePlacement","drawerPositionStyle","base","node","curve","tag","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","PI","petals","round","x","cos","sin","getParticle","tailOffset","normalizeProgress","fade","pow","radius","colorTokens","gray","ring","dot","btnText","btnHoverBg","btnHoverText","brand","grayBlue","blueLight","blue","indigo","purple","pink","orange","pillPadding","badgePadding","getTokens","variant","getRootStyle","isPill","isLg","shadow","BadgeDot","XIcon","SIZE_CONFIG","xs","onlineIndicator","companyIcon","verifiedTick","LABEL_GROUP_SIZE_CONFIG","nameFontSize","nameLineHeight","subFontSize","subLineHeight","UserIcon","VerifiedTickBadge","fillRule","clipRule","Avatar","initials","PlaceholderIcon","placeholderIcon","status","verified","imgFailed","setImgFailed","cfg","canShowImage","isPlaceholder","hasBadge","iSize","cSize","renderBadge","description","showIcon","closeable","hasRightSlot","supportingText","avatarSrc","avatarInitials","Icon","buttonLabel","onButtonClick","plMap","prMap","btnBorderRadius","dotPaddingLeft","dotPaddingRight","IconLeading","iconLeading","IconTrailing","iconTrailing","hasLeading","padMap","pl","pr","imgSrc","imgAlt","imgSize","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","pt","preserveAspectRatio","percent","userTitlePosition","titlePosition","showPercent","animated","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","scrollable","normalizedItems","firstItem","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","initialValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","underlineRef","containerRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","inline","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","updateBackgroundSliderPosition","firstKey_2","scrollTimeout_2","updatePosition_2","handleScroll_2","overflowX","scrollBehavior","scrollbarWidth","itemKey","itemKeyType","currentValueType","iconType","isReactElement","iconValue","badge","customElement","renderBackgroundStyle","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","innerClassName","expandable","rowClassName","onHeaderRow","sticky","loadingSpinColor","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","currentPage","setCurrentPage","setPageSize","draggedRowIndex","setDraggedRowIndex","dragOverRowIndex","setDragOverRowIndex","tableRef","headerRef","checkMobile","checkboxProps","getCheckboxProps","newSelectedRowKeys","selectedRows","Event","handleSelectAll","currentPageData","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","newSorters","set","sorterArray","entries","c","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","emptyContent","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","state_1","processedData","isServerPagination","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderEmpty","emptyText","colSpan","renderRows","isExpanded","rowProps","isLastRow","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","sum","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","startsWith","displayValue","scrollContainerStyle","iconTypeProp","count","checkbox","checkedProp","onCheckedChange","nSize","normalizeSize","effectiveAction","outlineOffset","colorConfig","getColorConfig","getOutlineColor","theme","themeValue","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","timeoutRef","hideTimeoutRef","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":"0FAgBIA,EAAgB,SAASC,EAAGC,GAI5B,OAHAF,EAAgBG,OAAOC,gBAClB,CAAEC,UAAW,cAAgBC,OAAS,SAAUL,EAAGC,GAAKD,EAAEI,UAAYH,CAAE,GACzE,SAAUD,EAAGC,GAAK,IAAK,IAAIK,KAAKL,EAAOC,OAAOK,UAAUC,eAAeC,KAAKR,EAAGK,KAAIN,EAAEM,GAAKL,EAAEK,KACzFP,EAAcC,EAAGC,EAC5B,EAUO,IAAIS,EAAW,WAQlB,OAPAA,EAAWR,OAAOS,QAAU,SAAkBC,GAC1C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAIC,UAAUC,OAAQH,EAAIC,EAAGD,IAE5C,IAAK,IAAIR,KADTO,EAAIG,UAAUF,GACOZ,OAAOK,UAAUC,eAAeC,KAAKI,EAAGP,KAAIM,EAAEN,GAAKO,EAAEP,IAE9E,OAAOM,CACV,EACMF,EAASQ,MAAMC,KAAMH,UAChC,EAEO,SAASI,EAAOP,EAAGQ,GACtB,IAAIT,EAAI,CAAA,EACR,IAAK,IAAIN,KAAKO,EAAOX,OAAOK,UAAUC,eAAeC,KAAKI,EAAGP,IAAMe,EAAEC,QAAQhB,GAAK,IAC9EM,EAAEN,GAAKO,EAAEP,IACb,GAAS,MAALO,GAAqD,mBAAjCX,OAAOqB,sBACtB,KAAIT,EAAI,EAAb,IAAgBR,EAAIJ,OAAOqB,sBAAsBV,GAAIC,EAAIR,EAAEW,OAAQH,IAC3DO,EAAEC,QAAQhB,EAAEQ,IAAM,GAAKZ,OAAOK,UAAUiB,qBAAqBf,KAAKI,EAAGP,EAAEQ,MACvEF,EAAEN,EAAEQ,IAAMD,EAAEP,EAAEQ,IAF4B,CAItD,OAAOF,CACX,CA8DO,SAASa,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,EAAGhC,EAAxGiC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPnC,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,EAAG,EAAIoC,KAAM,GAAIC,IAAK,IAAeC,EAAIhD,OAAOiD,QAA4B,mBAAbC,SAA0BA,SAAWlD,QAAQK,WACtL,OAAO2C,EAAEd,KAAOiB,EAAK,GAAIH,EAAS,MAAIG,EAAK,GAAIH,EAAU,OAAIG,EAAK,GAAsB,mBAAXC,SAA0BJ,EAAEI,OAAOC,UAAY,WAAa,OAAOpC,IAAO,GAAG+B,EAC1J,SAASG,EAAKtC,GAAK,OAAO,SAAUyC,GAAK,OACzC,SAAcC,GACV,GAAId,EAAG,MAAM,IAAIe,UAAU,mCAC3B,KAAOR,IAAMA,EAAI,EAAGO,EAAG,KAAOZ,EAAI,IAAKA,OACnC,GAAIF,EAAI,EAAGC,IAAMhC,EAAY,EAAR6C,EAAG,GAASb,EAAU,OAAIa,EAAG,GAAKb,EAAS,SAAOhC,EAAIgC,EAAU,SAAMhC,EAAEH,KAAKmC,GAAI,GAAKA,EAAER,SAAWxB,EAAIA,EAAEH,KAAKmC,EAAGa,EAAG,KAAKlB,KAAM,OAAO3B,EAE3J,OADIgC,EAAI,EAAGhC,IAAG6C,EAAK,CAAS,EAARA,EAAG,GAAQ7C,EAAEsB,QACzBuB,EAAG,IACP,KAAK,EAAG,KAAK,EAAG7C,EAAI6C,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,KAAM/C,EAAIiC,EAAEG,MAAMpC,EAAIA,EAAEK,OAAS,GAAKL,EAAEA,EAAEK,OAAS,KAAkB,IAAVwC,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEZ,EAAI,EAAG,QAAW,CAC5G,GAAc,IAAVY,EAAG,MAAc7C,GAAM6C,EAAG,GAAK7C,EAAE,IAAM6C,EAAG,GAAK7C,EAAE,IAAM,CAAEiC,EAAEC,MAAQW,EAAG,GAAI,KAAQ,CACtF,GAAc,IAAVA,EAAG,IAAYZ,EAAEC,MAAQlC,EAAE,GAAI,CAAEiC,EAAEC,MAAQlC,EAAE,GAAIA,EAAI6C,EAAI,KAAQ,CACrE,GAAI7C,GAAKiC,EAAEC,MAAQlC,EAAE,GAAI,CAAEiC,EAAEC,MAAQlC,EAAE,GAAIiC,EAAEI,IAAIW,KAAKH,GAAK,KAAQ,CAC/D7C,EAAE,IAAIiC,EAAEI,IAAIU,MAChBd,EAAEG,KAAKW,MAAO,SAEtBF,EAAKf,EAAKjC,KAAKiB,EAASmB,EAC3B,CAAC,MAAOxB,GAAKoC,EAAK,CAAC,EAAGpC,GAAIuB,EAAI,CAAE,CAAW,QAAED,EAAI/B,EAAI,CAAI,CAC1D,GAAY,EAAR6C,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAEvB,MAAOuB,EAAG,GAAKA,EAAG,QAAK,EAAQlB,MAAM,EAC7E,CAtB+CJ,CAAK,CAACpB,EAAGyC,GAAM,CAAG,CAuBtE,CA+DO,SAASK,EAAcC,EAAIC,EAAMC,GACpC,GAAIA,GAA6B,IAArBhD,UAAUC,OAAc,IAAK,IAA4BgD,EAAxBnD,EAAI,EAAGoD,EAAIH,EAAK9C,OAAYH,EAAIoD,EAAGpD,KACxEmD,GAAQnD,KAAKiD,IACRE,IAAIA,EAAK5D,MAAME,UAAU4D,MAAM1D,KAAKsD,EAAM,EAAGjD,IAClDmD,EAAGnD,GAAKiD,EAAKjD,IAGrB,OAAOgD,EAAGM,OAAOH,GAAM5D,MAAME,UAAU4D,MAAM1D,KAAKsD,GACtD,CA2GkD,mBAApBM,iBAAiCA,gBClU/D,IAAMC,EAA4B,CAChCC,aAAc,WAGVC,EAAeC,EAAAA,cAA2BH,GAsBnCI,EAAW,WACtB,IAAMC,EAAUC,aAAWJ,GAC3B,OAAKG,GAEIL,CAGX,ECuBMO,EAAiD,CACrDC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,MAAO,KACPC,YAAa,KACbC,OAAQ,KACRC,MAAO,MAGHC,EAAgE,CACpEC,QAAS,UACTC,UAAW,YACXC,SAAU,WACV,aAAc,aACd,YAAa,YACb,sBAAuB,sBACvB,wBAAyB,wBACzB,uBAAwB,uBACxB,mBAAoB,mBACpBC,QAAS,aAILC,EAYF,CACFb,GAAI,CAAEc,OAAQ,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,IAAK,EAAGC,YAAa,GACjHpB,GAAI,CAAEa,OAAQ,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,IAAK,EAAGC,YAAa,IACjHnB,GAAI,CAAEY,OAAQ,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,IAAK,EAAGC,YAAa,IACjHlB,GAAI,CAAEW,OAAQ,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,WAAY,GAAIC,SAAU,GAAIC,IAAK,EAAGC,YAAa,KAG7GC,EAA4D,SAACC,OAAEC,EAAID,EAAAC,KAAEC,EAAKF,EAAAE,MAAO,OACrFC,EACEC,KAAAC,EAAAC,SAAA,CAAAC,SAAA,CAAAC,EAAAC,IAAA,QAAA,CAAAF,SAAQ,sFACRJ,EAAAA,YACEO,MAAOT,EACPV,OAAQU,EACRU,QAAQ,YACRC,KAAK,wBAELC,MAAO,CAAEC,UAAW,qCAAsCC,WAAY,GAEtER,SAAA,CAAAC,EAAAA,IAAA,SAAA,CAAQQ,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKC,OAAQjB,EAAOkB,YAAY,IAAIC,QAAQ,SACtEb,cACE7G,EAAE,2BACFwH,OAAQjB,EACRkB,YAAY,IACZE,cAAc,QACdV,KAAK,cAjB0E,EAuBjFW,EAAgC,SAACvB,GACrC,IAAAO,EAAQP,EAAAO,SACRiB,EAAAxB,EAAAyB,KAAAA,OAAI,IAAAD,EAAG,YAAWA,EAClBE,EAAW1B,EAAAC,KAAXA,OAAI,IAAAyB,EAAG,KAAIA,EACXC,EAAgB3B,EAAA4B,SAAhBA,OAAW,IAAAD,GAAKA,EAChBE,YAAAC,OAAU,IAAAD,KACVE,EAAQ/B,EAAA+B,SACRC,YAAAC,OAAU,IAAAD,GAAKA,EACfE,EAAOlC,EAAAkC,QACPC,EAAmBnC,EAAAoC,SAAnBA,OAAQ,IAAAD,EAAG,SAAQA,EACnBE,EAAcrC,EAAAsC,UAAdA,OAAY,IAAAD,EAAA,GAAEA,EACdxB,EAAKb,EAAAa,MACL0B,EAAIvC,EAAAuC,KACJC,EAAqBxC,EAAAyC,aAArBA,OAAY,IAAAD,EAAG,OAAMA,EAClBE,EAAI3H,EAAAiF,EAd8B,qIAgB7B9B,EAAiBG,iBACnBsE,EAA4BC,EAAAA,UAAS,GAApCC,EAASF,EAAA,GAAEG,EAAYH,EAAA,GACxBI,EAA4BH,EAAAA,UAAS,GAApCI,EAASD,EAAA,GAAEE,EAAYF,EAAA,GAExBG,EAAYjE,EAAgBwC,IAAS,YACrCjH,EAAI8E,EAAYd,EAAWyB,IAAS,MAEpCkD,EAAapB,QAAAA,IAAeQ,GAAoB,MAAZhC,EACpC6C,EAAuB,eAAdF,GAA4C,cAAdA,GAA2C,qBAAdA,EACpEG,EAAazB,GAAYE,EACzBwB,EAAgBrB,EAEhBsB,EAAarF,EAwJbsF,EArJa,WASjB,GAAI5B,EACF,MAAkB,YAAdsB,GAAyC,cAAdA,GAA2C,wBAAdA,GAAqD,0BAAdA,EAC1F,CACLO,GAAI,oCACJvD,MAAO,oCACPwD,UAAW,oCACXC,OAAQ,yDACRC,UAAW,QAGR,CACLH,GAAI,cACJvD,MAAO,oCACPwD,UAAW,oCACXC,OAAQ,OACRC,UAAW,QAIf,IAAMC,EAAchB,GAAaG,EAEjC,MAAkB,YAAdE,EAIK,CACLO,GAJSI,EACP,6CACAN,GAAc,uCAGhBrD,MAAO,mCACPwD,UAAW,kCACXC,OAAQ,OACRC,UAAW,iEAIG,cAAdV,EACK,CACLO,GAAII,EACA,yCACA,mCACJ3D,MAAO2D,EACH,6CACA,uCACJH,UAAWG,EACP,4CACA,sCACJF,OAAQ,OACRC,UAAW,iCAIG,aAAdV,EACK,CACLO,GAAII,EAAc,yCAA2C,cAC7D3D,MAAO2D,EACH,4CACA,sCACJH,UAAWG,EACP,4CACA,sCACJF,OAAQ,OACRC,UAAW,QAIG,eAAdV,EACK,CACLO,GAAI,cACJvD,MAAO2D,EACH,mDACA,6CACJH,UAAW,+CACXC,OAAQ,OACRC,UAAW,OACXE,eAAgBD,EAAc,YAAc,QAI9B,cAAdX,EACK,CACLO,GAAI,cACJvD,MAAO2D,EACH,4CACA,sCACJH,UAAW,sCACXC,OAAQ,OACRC,UAAW,OACXE,eAAgBD,EAAc,YAAc,QAI9B,wBAAdX,EACK,CACLO,GAAII,EACA,yBACA,yBACJ3D,MAAO,0BACPwD,UAAWG,EACP,yBACA,yBACJF,OAAQ,OACRC,UAAW,iCAIG,0BAAdV,EACK,CACLO,GAAII,EACA,gCACA,0BACJ3D,MAAO,kCACPwD,UAAW,kCACXC,OAAQ,OAERC,UAAW,2HAIG,yBAAdV,EACK,CACLO,GAAII,EAAc,gCAAkC,cACpD3D,MAAO,kCACPwD,UAAW,kCACXC,OAAQ,OACRC,UAAW,QAKR,CACLH,GAAI,cACJvD,MAAO2D,EACH,wCACA,kCACJH,UAAW,kCACXC,OAAQ,OACRC,UAAW,OACXE,eAAgBD,EAAc,YAAc,OAEhD,CAEgBE,GAGVC,EAAc,WAClB,GAAKV,EAEL,MADoC,wBAAdJ,GAAqD,0BAAdA,GAAuD,yBAAdA,GAAsD,qBAAdA,EAE1H,wBAAdA,GAAqD,0BAAdA,EAClC,iDAEF,0BAES,YAAdA,GAAyC,cAAdA,EACtB,8EAEF,sDACR,CAbmB,GAede,EACJ5J,EAAA,CAAA6J,SAAU,WACVC,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBxE,IAAKrF,EAAEqF,IACPyE,WAAY,4DACZC,WAAY,IACZ7E,SAAUlF,EAAEkF,SACZC,WAAY,GAAA5B,OAAGvD,EAAEmF,WAAc,MAC/B6E,OAAQnB,EAAa,cAAgB,UACrCoB,QAAS,OACTC,WAAY,oEACZC,WAAY,OACZC,wBAAyB,cACzBC,WAAY,SACZC,gBAAiBtB,EAAQC,GACzBvD,MAAOsD,EAAQtD,MACfyD,OAAQH,EAAQG,OAChBC,UAAWI,QAAAA,EAAeR,EAAQI,UAClCE,eAAgBN,EAAQM,gBACrBjD,GAGDuC,GAEFa,EAAYc,aAAe,MAC3Bd,EAAYe,SAAW,SACnB7B,GACFc,EAAYvD,MAAQlG,EAAE+E,OACtB0E,EAAY1E,OAAS/E,EAAE+E,OACvB0E,EAAYgB,QAAU,IAEtBhB,EAAY1E,OAAS/E,EAAE+E,OACvB0E,EAAYiB,YAAc1K,EAAEgF,SAC5ByE,EAAYkB,aAAe3K,EAAEgF,YAG/ByE,EAAYc,aAAe,wBACvB5B,GACFc,EAAYvD,MAAQlG,EAAE+E,OACtB0E,EAAY1E,OAAS/E,EAAE+E,OACvB0E,EAAYgB,QAAU,IAEtBhB,EAAY1E,OAAS/E,EAAE+E,OACvB0E,EAAYiB,YAAc1K,EAAEgF,SAC5ByE,EAAYkB,aAAe3K,EAAEgF,WAIjC,IAQM4F,EAAa,WACjB,OAAItD,EACKtB,EAACC,IAAAV,EAAe,CAAAE,KAAMzF,EAAEoF,SAAUM,MAAOsD,EAAQE,YAErDnB,EAEH/B,EAEEC,IAAA,OAAA,CAAA,eAAA,EAAAI,MAAO,CACLsD,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAOlG,EAAEoF,SACTL,OAAQ/E,EAAEoF,SACVM,MAAOsD,EAAQE,UACf3C,WAAY,GAGbR,SAAAgC,IAda,IAiBpB,EAEM8C,EAAevD,GAAYS,GAAyB,SAAjBE,EACnC6C,GAAiBxD,GAAWS,GAAyB,UAAjBE,EAE1C,OACEtC,EAAAA,KACE,SAAA9F,EAAA,CAAAoH,KAAMW,EACNE,UAAW,CACT,aACA,eAAAvE,OAAemF,GACf,eAAAnF,OAAeS,EAAWyB,IAAS,MACnCkD,GAAc,wBACdE,GAAc,uBACdvB,GAAW,sBACXwB,GAAiB,sBACjBhB,GAECiD,OAAOC,SACPC,KAAK,KACR7D,SAAUyB,EACVnB,QAlDgB,SAAClH,GACfqI,EACFrI,EAAE0K,iBAGJxD,SAAAA,EAAUlH,EACZ,EA6CI2K,aAAc,WAAM,OAACtC,GAAcP,GAAa,EAA5B,EACpB8C,aAAc,WACZ9C,GAAa,GACbG,GAAa,IAEf4C,YAAa,WAAM,OAACxC,GAAcJ,GAAa,EAAK,EACpD6C,UAAW,WAAM,OAAA7C,GAAa,EAAM,EACpCpC,MAAOoD,GACHvB,EAAI,CAAAnC,SAAA,CAEP8E,GAAgBD,KACfjC,GAAc5C,EACf+E,GAAiBF,IAEjBjC,IAAeZ,IAAST,GAAWvB,KAG1C,EAEAgB,EAAOwE,YAAc,SC/bd,IAAMC,EAAY,CACvBC,QACEzF,EAAAC,IAAA,MAAA,CACE6B,UAAU,gBACV5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,6hBACFiH,KAAK,cAIXuF,MACE3F,EAAAC,IAAA,MAAA,CACE6B,UAAU,gBACV5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,gjCACFiH,KAAK,cAIXwF,QACE5F,EAAAC,IAAA,MAAA,CACE6B,UAAU,gBACV5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,2mBACFiH,KAAK,cAIXyF,KACE7F,EAAAC,IAAA,MAAA,CACE6B,UAAU,gBACV5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,6jBACFiH,KAAK,eAMA0F,EACX9F,EAAAC,IAAA,MAAA,CACE6B,UAAU,gBACV5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,0lBACFiH,KAAK,cC1EE2F,EAAY,CACvBN,QACEzF,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,sCAEN1F,EACEC,IAAA,OAAA,CAAA9G,EAAE,sXACFiH,KAAK,cAIXuF,MACE3F,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,sCAEN1F,EACEC,IAAA,OAAA,CAAA9G,EAAE,0iCACFiH,KAAK,cAIX4F,SACEhG,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,sCAEN1F,EACEC,IAAA,OAAA,CAAA9G,EAAE,yjCACFiH,KAAK,cAIXyF,KACE7F,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,sCAEN1F,EACEC,IAAA,OAAA,CAAA9G,EAAE,yjCACFiH,KAAK,eAMA0F,EAAY,SAACtG,GAAE,IAAAsC,EAAStC,EAAAsC,UACnC,OACE9B,EACEC,IAAA,MAAA,CAAA6B,UAAW,iBAAAvE,OAAiBuE,GAC5B5B,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,eACLsF,MAAM,sCAEN1F,EAAAA,IACE,OAAA,CAAA7G,EAAE,0lBACFiH,KAAK,kBAIb,ECvCA6F,EAAA,WAAA,SAAAA,IACU3L,KAAM4L,OAAoB,GAC1B5L,KAAA6L,UAA6B,IAAIC,GAmC1C,CAAD,OAjCEH,EAAQvM,UAAA2M,SAAR,SAASC,GACP,IAAMC,EAAKC,KAAKC,SAASC,SAAS,IAAIpJ,OAAO,GACvCqJ,EAAgB,CAAEJ,KAAID,MAAKA,GAIjC,OAHAhM,KAAK4L,OAAOnJ,KAAK4J,GACjBC,QAAQC,IAAI,2BAA4BN,EAAI,QAASjM,KAAK4L,OAAO9L,QACjEE,KAAKwM,kBACEP,GAGTN,EAAWvM,UAAAqN,YAAX,SAAYR,GACVjM,KAAK4L,OAAS5L,KAAK4L,OAAOnB,OAAO,SAACiC,GAAU,OAAAA,EAAMT,KAAOA,CAAE,GAC3DjM,KAAKwM,mBAGPb,EAAAvM,UAAAuN,UAAA,WACE,OAAAjK,EAAA,GAAW1C,KAAK4L,QAAM,IAGxBD,EAASvM,UAAAwN,UAAT,SAAUC,GAAV,IAGCC,EAAA9M,KADC,OADAA,KAAK6L,UAAUkB,IAAIF,GACZ,WAAM,OAAAC,EAAKjB,UAAUmB,OAAOH,KAG7BlB,EAAAvM,UAAAoN,gBAAR,WACEF,QAAQC,IAAI,sBAAuBvM,KAAK6L,UAAU1G,MAClDnF,KAAK6L,UAAUoB,QAAQ,SAACJ,GAAa,OAAAA,GAAA,IAIvClB,EAAAvM,UAAA8N,SAAA,WACElN,KAAK4L,OAAS,GACd5L,KAAKwM,mBAERb,CAAD,IAGMwB,EAAe,IAAIxB,EAGnByB,EAA2B,WACzB,IAAAlI,EAAsB4C,EAAAA,SAA0B,IAA/C8D,EAAM1G,EAAA,GAAEmI,EAASnI,EAAA,GAExBoI,EAAAA,UAAU,WACRhB,QAAQC,IAAI,+BAGZ,IAAMgB,EAAgBJ,EAAaR,YACnCL,QAAQC,IAAI,sBAAuBgB,EAAczN,QACjDuN,EAAUE,GAEV,IAAMC,EAAcL,EAAaP,UAAU,WACzC,IAAMW,EAAgBJ,EAAaR,YACnCL,QAAQC,IAAI,2BAA4BgB,EAAczN,OAAQ,aAAcyN,EAAcE,IAAI,SAAAhO,GAAK,OAAAA,EAAEwM,EAAF,IACnGoB,EAAUE,EACZ,GACA,OAAOC,CACR,EAAE,IAGH,IAAME,EAAgB9B,EAAOnB,OAC3B,SAACiC,GAAU,MAAyB,aAAzBA,EAAMV,MAAM5C,QAAuB,GAE1CuE,EAAiB/B,EAAOnB,OAC5B,SAACiC,GAAU,MAAyB,cAAzBA,EAAMV,MAAM5C,QAAwB,GAE3CwE,EAAmBhC,EAAOnB,OAC9B,SAACiC,GAAU,MAAyB,gBAAzBA,EAAMV,MAAM5C,QAA0B,GAE7CyE,EAAoBjC,EAAOnB,OAC/B,SAACiC,GAAU,MAAyB,iBAAzBA,EAAMV,MAAM5C,QAA2B,GAGpD,OACE/D,EAAAA,KAAAE,EAAAA,SAAA,CAAAE,SAAA,CAEEC,MAAK,MAAA,CAAAK,MAAO,CACVqD,SAAU,QACV0E,IAAK,OACLC,KAAM,OACNC,OAAQ,KACRC,cAAe,OACf5E,QAAS,OACT6E,cAAe,SACfnJ,IAAK,OAEJU,SAAAiI,EAAcD,IAAI,SAACf,GAAU,OAC5BhH,EAAAA,IAACyI,EAA6B5O,EAAA,CAAA,EAAAmN,GAAdA,EAAMT,GACvB,KAIHvG,EAAKC,IAAA,MAAA,CAAAI,MAAO,CACVqD,SAAU,QACV0E,IAAK,OACLM,MAAO,OACPJ,OAAQ,KACRC,cAAe,OACf5E,QAAS,OACT6E,cAAe,SACfnJ,IAAK,OAEJU,SAAAkI,EAAeF,IAAI,SAACf,GAAU,OAC7BhH,EAAAA,IAACyI,EAA6B5O,EAAA,CAAA,EAAAmN,GAAdA,EAAMT,GACvB,KAIHvG,EAAKC,IAAA,MAAA,CAAAI,MAAO,CACVqD,SAAU,QACViF,OAAQ,OACRN,KAAM,OACNC,OAAQ,KACRC,cAAe,OACf5E,QAAS,OACT6E,cAAe,SACfnJ,IAAK,OAEJU,SAAAmI,EAAiBH,IAAI,SAACf,GAAU,OAC/BhH,EAAAA,IAACyI,EAA6B5O,EAAA,CAAA,EAAAmN,GAAdA,EAAMT,GACvB,KAIHvG,EAAKC,IAAA,MAAA,CAAAI,MAAO,CACVqD,SAAU,QACViF,OAAQ,OACRD,MAAO,OACPJ,OAAQ,KACRC,cAAe,OACf5E,QAAS,OACT6E,cAAe,SACfnJ,IAAK,OAEJU,SAAAoI,EAAkBJ,IAAI,SAACf,GAAU,OAChChH,EAAAC,IAACwI,EAAS5O,EAAA,CAAA,EAAoBmN,GAAdA,EAAMT,GADU,OAM1C,EAGMkC,EAAqC,SAACjJ,OAAE+G,EAAE/G,EAAA+G,GAAED,EAAK9G,EAAA8G,MAC/CtF,EAA4BoB,EAAAA,UAAS,GAApCwG,EAAS5H,EAAA,GAAE6H,EAAY7H,EAAA,GACxBE,EAA4BkB,EAAAA,UAAS,GAApC0G,EAAS5H,EAAA,GAAE6H,EAAY7H,EAAA,GAG5B8H,EASE1C,EAAK0C,QARP7H,EAQEmF,EAAKrF,KARPA,OAAO,IAAAE,EAAA,OAAMA,EACbE,EAOEiF,EAPa2C,SAAfA,OAAQ,IAAA5H,EAAG,IAAIA,EACfU,EAMEuE,EANEvE,KACJmH,EAKE5C,EAAK4C,OAJP1H,EAIE8E,EAAK6C,UAJPA,OAAY,IAAA3H,GAAIA,EAChB4H,EAGE9C,EAAK8C,QAFP1H,EAEE4E,EAFK5E,QAEL4E,EADYxE,UAIhB,IA0BMuH,EA1BgB,SAACpI,GACrB,OAAQA,GACN,IAAK,UACH,MAAO,CACLqI,QAAS,UACTC,YAAaxD,EAAUN,SAE3B,IAAK,QACH,MAAO,CACL6D,QAAS,UACTC,YAAaxD,EAAUJ,OAE3B,IAAK,WACH,MAAO,CACL2D,QAAS,UACTC,YAAaxD,EAAUC,UAG3B,QACE,MAAO,CACLsD,QAAS,UACTC,YAAaxD,EAAUF,MAG/B,CAEmB2D,CAAcvI,GAGjC2G,EAAAA,UAAU,WACR,IAAM6B,EAAQC,WAAW,WACvBb,GAAa,EACd,EAAE,IACH,OAAO,WAAM,OAAAc,aAAaF,EAAM,CACjC,EAAE,IAGH7B,EAAAA,UAAU,WACR,GAAIqB,EAAW,EAAG,CAChB,IAAMW,EAAQF,WAAW,WACvBG,GACD,EAAEZ,GACH,OAAO,WAAM,OAAAU,aAAaC,EAAM,CACjC,GACA,CAACX,EAAU1C,IAEd,IAAMsD,EAAcC,EAAAA,YAAY,WAC9Bf,GAAa,GACbW,WAAW,WACTjC,EAAaV,YAAYR,GACzB6C,SAAAA,GACD,EAAE,IACL,EAAG,CAAC7C,EAAI6C,IAEFW,EAAcD,EAAAA,YAAY,WAC9BpI,SAAAA,GACF,EAAG,CAACA,IAEJ,OACE1B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLkI,cAAe,OACfyB,SAAU,QACVC,WAAY,QACZ1F,aAAc,MACdnB,UAAW,0EACXoB,SAAU,SACV0F,UAAWtB,IAAcE,EAAY,yBAA2B,8BAChEjI,QAAS+H,IAAcE,EAAY,EAAI,EACvC5E,WAAY,qBACZR,SAAU,WACVM,OAAQtC,EAAU,UAAY,WAEhCA,QAASqI,EAEThK,SAAAJ,EAAAA,KAAA,MAAA,CAAKU,MAAO,CACVsD,QAAS,OACTC,WAAY,aACZa,QAAS,OACTH,gBAAiB+E,EAAWC,QAC5B5J,MAAO,SAGPK,SAAA,CAAAC,EAAAA,IAAA,MAAA,CAAKK,MAAO,CACVE,WAAY,EACZL,MAAO,OACPnB,OAAQ,OACRwF,aAAc,MACdZ,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBsG,YAAa,OAEZpK,SAAAgC,GAAQsH,EAAWE,cAItB5J,EAAKC,KAAA,MAAA,CAAAS,MAAO,CACV+J,KAAM,EACNC,SAAU,EACV1F,aAAc,QAEd5E,SAAA,CAAAC,EAAAA,IAAA,MAAA,CAAKK,MAAO,CACVH,MAAO,OACP2D,eAAgB,aAChBnE,MAAO,UACPR,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZ3E,WAAY,QAEXY,SAAAiJ,IAIFE,GAAUlJ,aAAKK,MAAO,CAAEiK,UAAW,QAAWvK,SAAAmJ,OAIhDC,GACCnJ,EACEC,IAAA,SAAA,CAAAyB,QAAS,SAAClH,GACRA,EAAE+P,kBACFV,GACD,EACDxJ,MAAO,CACLE,WAAY,EACZL,MAAO,OACPnB,OAAQ,OACRwF,aAAc,MACdZ,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBK,WAAY,YACZR,SAAU,WACV0E,IAAK,OACLM,MAAO,OACPuB,WAAY,cACZ9G,OAAQ,OACRa,OAAQ,UACRtE,MAAO,SAETyF,aAAc,SAAC3K,GACbA,EAAEgQ,cAAcnK,MAAM4J,WAAa,0BACrC,EACA7E,aAAc,SAAC5K,GACbA,EAAEgQ,cAAcnK,MAAM4J,WAAa,eACpClK,SAEDC,MAAC8F,EAAS,CAAA,SAMtB,EAUakB,EAAQ,SAACV,GAapB,OAZAM,QAAQC,IAAI,qBAAsBP,GAGlCmE,IAGAf,WAAW,WACT,IAAMnD,EAAKkB,EAAapB,SAASC,GACjCM,QAAQC,IAAI,yBAA0BN,EACvC,EAAE,KAGIC,KAAKC,SAASC,SAAS,IAAIpJ,OAAO,EAC3C,EAoDIoN,EAA4C,KAC5CC,EAA0B,KAC1BC,GAAiB,EAEfH,EAAuB,WAI3B,GAHA7D,QAAQC,IAAI,mBAGU,oBAAXgE,QAA8C,oBAAbC,SAM5C,GAAIF,EACFhE,QAAQC,IAAI,2BAId,GAAK6D,EAwDH9D,QAAQC,IAAI,yBAxDc,CAC1BD,QAAQC,IAAI,wBACZ+D,GAAiB,EAEjB,IAEE,IAAMG,EAAoBD,SAASE,eAAe,uBAClD,GAAID,EAIF,OAHAnE,QAAQC,IAAI,mBACZ6D,EAAwBK,OACxBH,GAAiB,GAKnBhE,QAAQC,IAAI,kBACZ6D,EAAwBI,SAASG,cAAc,QACzB1E,GAAK,sBAC3BuE,SAASjP,KAAKqP,YAAYR,GAC1B9D,QAAQC,IAAI,+BAGZD,QAAQC,IAAI,wBACZ,IAEU,IAAAsE,EAAeC,QAAQ,+BAC/BxE,QAAQC,IAAI,gCACZ8D,EAAqBQ,EAAWT,GAChC9D,QAAQC,IAAI,+BACZ8D,EAAmBU,OAAOrL,EAAAA,IAAC0H,EAAc,CAAA,IACzCd,QAAQC,IAAI,iBACZ+D,GAAiB,CAClB,CAAC,MAAOjF,GACPiB,QAAQC,IAAI,uBAAwBlB,GAEpC2F,OAAO,oBAAoB3P,KAAK,SAAC6D,GAAE,IAAA2L,EAAU3L,EAAA2L,WAC3C,IACEvE,QAAQC,IAAI,gCACZ8D,EAAqBQ,EAAWT,GAChC9D,QAAQC,IAAI,+BACZ8D,EAAmBU,OAAOrL,EAAAA,IAAC0H,EAAc,CAAA,IACzCd,QAAQC,IAAI,gBACb,CAAC,MAAOlB,GACPiB,QAAQjB,MAAM,gBAAiBA,EAChC,CACDiF,GAAiB,CACnB,GAAGW,MAAM,SAAC5F,GACRiB,QAAQjB,MAAM,wBAAyBA,GACvCiF,GAAiB,CACnB,EACD,CACF,CAAC,MAAOjF,GACPiB,QAAQjB,MAAM,gBAAiBA,GAC/BiF,GAAiB,CAClB,CACF,MAjEChE,QAAQ4E,KAAK,0BAoEjB,ECxcMC,EAAe,CACnBC,MAAQ,CAAEC,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGC,IAAQ,CAAEF,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGE,OAAQ,CAAEH,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGG,KAAQ,CAAEJ,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGI,OAAQ,CAAEL,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGK,KAAQ,CAAEN,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGM,KAAQ,CAAEP,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGO,OAAQ,CAAER,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,YACrGQ,KAAQ,CAAET,MAAO,CAAE1I,GAAI,UAAW2I,KAAM,UAAWzI,OAAQ,WAAa/C,KAAM,CAAE6C,GAAI,UAAW2I,KAAM,aA2DjGS,EAAO,CACXpO,GAAI,CAEFqO,OAAQ,EAAGC,OAAQ,EAEnBC,WAAY,EAAGC,SAAU,EAAGC,MAAO,EAAGC,OAAQ,EAE9CC,QAAS,EAAGC,QAAS,EACrB3N,SAAU,GAAIC,WAAY,OAAQJ,OAAQ,GAC1C+N,WAAY,GAAIC,aAAc,GAC9BC,WAAY,EAAGC,QAAS,EACxBC,QAAS,EAAGC,cAAe,GAC3BC,UAAW,GAAIC,SAAU,GAE3BnP,GAAI,CAEFoO,OAAQ,EAAGC,OAAQ,EACnBC,WAAY,EAAGC,SAAU,EAAGC,MAAO,EAAGC,OAAQ,EAC9CC,QAAS,EAAGC,QAAS,EACrB3N,SAAU,GAAIC,WAAY,OAAQJ,OAAQ,GAC1C+N,WAAY,GAAIC,aAAc,GAC9BC,WAAY,EAAGC,QAAS,EACxBC,QAAS,EAAGC,cAAe,GAC3BC,UAAW,GAAIC,SAAU,GAE3BlP,GAAI,CAEFmO,OAAQ,GAAIC,OAAQ,EACpBC,WAAY,EAAGC,SAAU,EAAGC,MAAO,EAAGC,OAAQ,EAC9CC,QAAS,EAAGC,QAAS,EACrB3N,SAAU,GAAIC,WAAY,OAAQJ,OAAQ,GAC1C+N,WAAY,GAAIC,aAAc,GAC9BC,WAAY,EAAGC,QAAS,EACxBC,QAAS,EAAGC,cAAe,GAC3BC,UAAW,GAAIC,SAAU,IAYhBC,EAAsC,SAAC9N,GAAE,IAAA+N,EAAG/N,EAAA+N,IAAEvM,EAAcxB,EAAAgO,IAAdA,OAAM,IAAAxM,EAAA,SAAQA,EAAEE,EAAS1B,EAAAC,KAATA,OAAI,IAAAyB,EAAG,GAAEA,EAC5EC,EAAsBiB,EAAAA,UAAS,GAA9BqL,EAAMtM,EAAA,GAAEuM,EAASvM,EAAA,GACxB,OACEnB,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLH,MAAOT,EAAMV,OAAQU,EAAM8E,aAAc,MACzCC,SAAU,SAAUjE,WAAY,EAChC4C,OAAQ,iCACR8G,WAAY,UACZtG,QAAS,OAAQC,WAAY,SAAUC,eAAgB,UAGxD9D,SAAAwN,IAAQE,EACPzN,EAAAC,IAAA,MAAA,CACEsN,IAAKA,EAAKC,IAAKA,EACfG,QAAS,WAAM,OAAAD,GAAU,EAAK,EAC9BrN,MAAO,CAAEH,MAAO,OAAQnB,OAAQ,OAAQ6O,UAAW,QAASjK,QAAS,WAGvEhE,EAAAC,KAAA,MAAA,CACEM,MAAc,KAAPT,EAAcV,OAAe,KAAPU,EAC7BU,QAAQ,YAAYC,KAAK,iBAEzBJ,MAAQ,SAAA,CAAAQ,GAAG,IAAIC,GAAG,MAAMC,EAAE,IAAIC,OAAO,OAAOC,YAAY,QACxDZ,MAAA,OAAA,CAAM7G,EAAE,mCAAmCwH,OAAO,OAAOC,YAAY,MAAME,cAAc,cAKnG,ECvJM+M,EAAQC,EAAUA,WACtB,SACEtO,EAqBAuO,GApBE,IAAA/M,SAAAvB,aAAO,SAAQuB,EACfE,EAAgB1B,EAAA4B,SAAhBA,OAAQ,IAAAF,GAAQA,EAChBC,UAAAwE,cAAaxE,EACbE,EAAA7B,EAAAwO,SAAAA,OAAQ,IAAA3M,GAAQA,EAChB4M,EAAMzO,EAAAyO,OACNC,EAAM1O,EAAA0O,OACN1M,EAAkBhC,EAAA2O,WAAlBA,OAAa,IAAA3M,KACb4M,EAAO5O,EAAA4O,QACPzM,cAAAG,aAAY,GAAEH,EACdtB,EAAKb,EAAAa,MACLwB,EAAArC,EAAAyB,KAAAA,OAAI,IAAAY,EAAG,OAAMA,EACbwM,EAAW7O,EAAA6O,YACXhT,EAAKmE,EAAAnE,MACLiT,EAAY9O,EAAA8O,aACZC,EAAQ/O,EAAA+O,SACRC,EAAOhP,EAAAgP,QACPC,EAAMjP,EAAAiP,OACNC,EAAYlP,EAAAkP,aACTC,EAASpU,EAAAiF,EAnBd,8LAuBQwC,EAA6BnE,IAAUH,aAAvCA,OAAY,IAAAsE,EAAG,UAASA,EAC1B4M,EAAWC,SAAyB,MACpC1M,EAAoC2M,EAAM1M,SAC9CkM,GAAgBjT,GAAS,IADpB0T,OAAeC,OAGhBzM,EAAwBuM,EAAM1M,UAAS,GAAtCX,EAAOc,EAAA,GAAE0M,OAGhBrH,EAAAA,UAAU,WACW,mBAARmG,EACTA,EAAIa,EAASM,SACJnB,IACRA,EAAwDmB,QACvDN,EAASM,QAEf,EAAG,CAACnB,IAGJ,IAAMoB,OAAyBC,IAAV/T,EACfgU,EAAeF,EAAe9T,EAAQ0T,EA0BtCO,EAAc,SAAC9U,SACnBA,EAAE+P,kBACG4E,GACHH,EAAiB,IAOnBT,SAAAA,EAJuB,CACrBgB,OAAQ,CAAElU,MAAO,IACjBmP,cAAe,CAAEnP,MAAO,MAG1B+S,SAAAA,IACkB,QAAlB5O,EAAAoP,EAASM,eAAS,IAAA1P,GAAAA,EAAAgQ,OACpB,EAEMC,EAAYtB,GAAckB,IAAiBjO,EAI3CsO,EAAa,CACjBrR,MAAO,CACLU,OAAQ,OACR4Q,WAAY,MACZC,cAAe,OAEjBtR,YAAa,CACXS,OAAQ,OACR4Q,WAAY,MACZC,cAAe,OAEjBrR,OAAQ,CACNQ,OAAQ,OACR4Q,WAAY,MACZC,cAAe,OAEjBpR,MAAO,CACLO,OAAQ,OACR4Q,WAAY,OACZC,cAAe,SAMbjL,EADkBuJ,GAAUuB,EACK,OAAS,OAE1CI,KACJ3P,MAAO,OACP4P,UAAW,aACXhM,WAAY,sBACZS,aAAc,MACdpB,OAAQ,aAAA5F,OAAaoI,EAAQ,UAAYlE,EAAU/D,EAAe,WAClE4G,gBAAiBlD,GAAuB4M,EAAZ,UAAmC,UAC/DtO,MAAO0B,EAAW,UAAY,UAC9BlC,SAAU,OACV6E,WAAY,IACZ5E,WAAY,OACZuF,YAAauJ,EAAS,OAAS,OAC/BtJ,eACAgL,WAAYD,EAAWjQ,GAAMkQ,WAC7BC,cAAeF,EAAWjQ,GAAMmQ,cAChC1L,WAAY,WACZD,QAAS,OACT8L,iBAAkB,OAClBC,cAAe,YACfC,WAAY,QACT5P,GAuEL,OACEV,EAAAA,KAAAE,EAAAA,SAAA,CAAAE,SAAA,CACEC,MAAQ,QAAA,CAAAD,SArEc,+pCAsEtBJ,EAAAC,KAAA,MAAA,CACEkC,UAAW,qBAAqBvE,OAAAuE,GAChCzB,MAAO,CACLqD,SAAU,WACVC,QAAS,cACTC,WAAY,SACZ1D,MAAO,QACRH,SAAA,CAEAkO,GACCjO,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLqD,SAAU,WACV2E,KAAM,OACN1E,QAAS,OACTC,WAAY,SACZlE,MAAO0B,EAAW,UAAY,UAC9BkH,OAAQ,EACRC,cAAe,QAGhBxI,SAAAkO,IAGLjO,EAAAA,eACE+N,IAAKa,EACL3N,KAAMA,EACN5F,MAAOgU,EACPhB,YAAaA,EACbjN,SAAUA,EACV4M,SAAUA,EACVO,SAnMa,SAAC/T,GACf2U,GACHH,EAAiBxU,EAAE+U,OAAOlU,OAE5BkT,SAAAA,EAAW/T,EACb,EA+LQgU,QA7LY,SAAChU,GACnByU,GAAW,GACXT,SAAAA,EAAUhU,EACZ,EA2LQiU,OAzLW,SAACjU,GAClByU,GAAW,GACXR,SAAAA,EAASjU,EACX,EAuLQ0V,UArLc,SAAC1V,SACP,UAAVA,EAAE2V,KAAmBzB,GACvBA,EAAalU,GAEO,QAAtBgF,EAAAmP,EAAUuB,iBAAY,IAAA1Q,GAAAA,EAAA5F,KAAA+U,EAAAnU,EACxB,EAiLQ6F,MAAOwP,EACPO,aAAczB,EAAUyB,cAAgB,MACxCC,YAAa1B,EAAU0B,aAAe,MACtCC,eAAgB3B,EAAU2B,gBAAkB,MAC5CC,WAAY5B,EAAU4B,aAAc,GAChC5B,KAEJT,GAAUuB,IACV9P,EAAAA,KACE,OAAA,CAAAU,MAAO,CACLqD,SAAU,WACVgF,MAAO,OACP/E,QAAS,OACTC,WAAY,SACZvE,IAAK,MACLK,MAAO0B,EAAW,UAAY,UAC9BkH,OAAQ,GAGTvI,SAAA,CAAA0P,GAAazP,MAjFN,WAAM,OACtBA,EAAAC,IAAA,MAAA,CACEC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNhE,QAAS4N,EACTjP,MAAO,CACL2D,OAAQ,UACRzD,WAAY,EACZb,MAAO,WAGTK,SAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAE,uBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,aA8Da,CAAA,GACvBtC,GAAUlO,MAAM,OAAA,CAAAK,MAAO,CAAEkI,cAAe,QAAQxI,SAAGmO,YAMhE,GAGFL,EAAMtI,YAAc,QC7Od,IAAAkL,EAAgC,SAACjR,SAC9BkR,EAAelR,EAAAnE,MACtBiT,EAAY9O,EAAA8O,aACZpN,EAAY1B,EAAAmR,QAAZA,OAAO,IAAAzP,EAAG,GAAEA,EACZ0P,EAAIpR,EAAAoR,KACJzP,EAAgB3B,EAAA4B,SAAhBA,OAAQ,IAAAD,GAAQA,EAChBE,EAAA7B,EAAAmG,MAAAA,OAAQ,IAAAtE,GAAKA,EACbG,EAA6BhC,EAAA6O,YAA7BA,OAAW,IAAA7M,EAAG,gBAAeA,EAC7BG,EAAAnC,EAAAC,KAAAA,OAAO,IAAAkC,EAAA,SAAQA,EACfE,EAAkBrC,EAAAqR,WAAlBA,OAAU,IAAAhP,GAAQA,EAClBG,EAAAxC,EAAAsR,aAAAA,OAAe,IAAA9O,GAAIA,EACnBG,EAAkB3C,EAAA2O,WAAlBA,OAAU,IAAAhM,GAAQA,EAClBoM,EAAQ/O,EAAA+O,SACRwC,EAAQvR,EAAAuR,SACRC,EAAUxR,EAAAwR,WACVC,EAAQzR,EAAAyR,SACRzC,EAAOhP,EAAAgP,QACPC,EAAMjP,EAAAiP,OACNyC,EAAuB1R,EAAA0R,wBACvB3O,EAAA/C,EAAAsC,UAAAA,OAAY,IAAAS,EAAA,GAAEA,EACdlC,EAAKb,EAAAa,MACL8Q,EAAA3R,EAAA4R,kBAAAA,OAAoB,IAAAD,EAAA,GAAEA,EACtBE,EAAa7R,EAAA6R,cACbC,EAAA9R,EAAA+R,YAAAA,OAAc,IAAAD,GAAKA,EACbE,EAAchS,EAAAiS,KACpBC,EAAWlS,EAAAkS,YACXC,EAASnS,EAAAmS,UACTC,EAAYpS,EAAAoS,aAEJC,EAA6BhU,IAAUH,aAAvCA,OAAY,IAAAmU,EAAG,UAASA,EAC1BC,EAAoC1P,EAAAA,cAEvBgN,IAAjBd,EAA6BA,EAAgBsC,EAAO,QAAKxB,GAFpDL,EAAa+C,EAAA,GAAE9C,OAGhB+C,EAAkC3P,EAAAA,SAASmP,GAA1CS,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GAC9BG,GAAgC9P,EAAAA,SAAS,IAAxC+P,GAAWD,GAAA,GAAEE,GAAcF,GAAA,GAC5BG,GAAkCjQ,EAAAA,UAAU,GAA3CkQ,GAAYD,GAAA,GAAEE,GAAeF,GAAA,GAE9BG,GAAY3D,SAAuB,MACnCD,GAAWC,SAAyB,MACpC4D,GAAc5D,SAAuB,MACrC6D,GAA0CtQ,EAAAA,SAKtC,MALHuQ,GAAgBD,GAAA,GAAEE,GAAmBF,GAAA,GAOtCvD,QAAmCC,IAApBsB,EACfmC,QAAsCzD,IAAnBoC,EACnBnC,GAAeF,GAAeuB,EAAkB3B,EAChD+D,GAASD,GAAmBrB,EAAiBQ,EAC7Ce,GAAsB,aAATnC,GAAgC,SAATA,EAGpCoC,GAAqBlJ,EAAAA,YAAY,WACrC,IAAKuF,GAAc,MAAO,GAC1B,IAAM4D,EAASzZ,MAAM0Z,QAAQ7D,IAAgBA,GAAe,CAACA,IAC7D,OAAOsB,EAAQ5L,OAAO,SAACoO,GAAQ,OAAAF,EAAOG,SAASD,EAAI9X,MAAM,EAC3D,EAAG,CAACgU,GAAcsB,IAGZ0C,GAAqBvJ,EAAAA,YAAY,WACrC,OAAK+G,GAAesB,IAEC,IAAjBrB,EAA+BH,EAEP,mBAAjBG,EACFH,EAAQ5L,OAAO,SAACoO,GAAQ,OAAArC,EAAaqB,GAAagB,EAA1B,GAI1BxC,EAAQ5L,OAAO,SAACoO,GACrB,IAAMlX,EAAQqX,OAAOH,EAAIlX,OAAS,IAAIsX,cAChCC,EAASrB,GAAYoB,cAC3B,OAAOtX,EAAMmX,SAASI,EACxB,GAbwC7C,CAczC,EAAE,CAACA,EAASwB,GAAatB,EAAYC,IAEhC2C,GAAkBC,EAAOA,QAAC,WAAM,OAAAL,IAAoB,EAAE,CAACA,KAG7DzL,EAAAA,UAAU,WACR,GAAIkL,IAAUN,GAAUtD,QAAS,CAC/B,IAAMyE,EAAiB,mBACrB,GAAInB,GAAUtD,QAAS,CACrB,IAAM0E,EAAOpB,GAAUtD,QAAQ2E,wBACzBC,EAC6B,QAAjC9S,EAAmB,QAAnBxB,EAAAiT,GAAYvD,eAAO,IAAA1P,OAAA,EAAAA,EAAEuU,oBAAY,IAAA/S,EAAAA,EACjCwF,KAAKwN,IAAI,IAAKxN,KAAKyN,IAAI,GAA6B,GAAzBR,GAAgBrZ,SAEvC8Z,EAAarJ,OAAOsJ,YAAcP,EAAKjL,OACvCyL,EAAaR,EAAKxL,IAClBiM,EACJH,EAAaJ,EAJH,GAIoCM,EAAaF,EACvDI,EAAMD,EACRT,EAAKxL,IAAMyC,OAAO0J,QAAUT,EANpB,EAORF,EAAKjL,OAASkC,OAAO0J,QAPb,EASZ3B,GAAoB,CAClBxK,IAAGkM,EACHjM,KAAMuL,EAAKvL,KAAOwC,OAAO2J,QACzBtU,MAAO0T,EAAK1T,MACZuU,UAAWJ,EAAe,MAAQ,UAErC,CACH,EASA,OAPAV,IACAe,sBAAsBf,GAGtB9I,OAAO8J,iBAAiB,SAAUhB,GAClC9I,OAAO8J,iBAAiB,SAAUhB,GAAgB,GAE3C,WACL9I,OAAO+J,oBAAoB,SAAUjB,GACrC9I,OAAO+J,oBAAoB,SAAUjB,GAAgB,EACvD,CACD,CACCf,GAAoB,KAEvB,EAAE,CAACE,GAAQW,GAAgBrZ,SAG5BwN,EAAAA,UAAU,WACR,IAAMiN,EAAqB,SAACC,GAC1B,IAAMvF,EAASuF,EAAMvF,OAEnBiD,GAAUtD,UACTsD,GAAUtD,QAAQ6F,SAASxF,IAC5BkD,GAAYvD,UACXuD,GAAYvD,QAAQ6F,SAASxF,KAEzBsD,IACHZ,GAAgB,GAElBf,SAAAA,GAA0B,GAC1BkB,GAAe,IAEnB,EAEA,GAAIU,GAIF,OAFAhI,SAAS6J,iBAAiB,YAAaE,GAAoB,GAC3D/J,SAAS6J,iBAAiB,aAAcE,GAAoB,GACrD,WACL/J,SAAS8J,oBAAoB,YAAaC,GAAoB,GAC9D/J,SAAS8J,oBAAoB,aAAcC,GAAoB,EACjE,CAEH,EAAE,CAAC/B,GAAQD,GAAkB3B,IAG9BtJ,EAAAA,UAAU,WACR,GAAKkL,GAAL,CAEA,IAAMkC,EAAgB,SAACxa,SACrB,GAAc,cAAVA,EAAE2V,IACJ3V,EAAE0K,iBACFqN,GAAgB,SAAC0C,GACf,OAAAA,EAAOxB,GAAgBrZ,OAAS,EAAI6a,EAAO,EAAIA,CAA/C,QAEG,GAAc,YAAVza,EAAE2V,IACX3V,EAAE0K,iBACFqN,GAAgB,SAAC0C,GAAS,OAACA,EAAO,EAAIA,EAAO,EAAI,CAAE,QAC9C,GAAc,UAAVza,EAAE2V,KAAmBmC,IAAgB,EAAG,CACjD9X,EAAE0K,iBACF,IAAMgQ,EAASzB,GAAgBnB,IAC3B4C,IAAWA,EAAO9T,UACpB+T,GAAaD,EAEhB,KAAoB,WAAV1a,EAAE2V,MACX3V,EAAE0K,iBACG2N,IACHZ,GAAgB,GAElBf,SAAAA,GAA0B,GACP,QAAnB1R,EAAAgT,GAAUtD,eAAS,IAAA1P,GAAAA,EAAAgQ,QAEvB,EAGA,OADA3E,OAAO8J,iBAAiB,UAAWK,GAC5B,WACLnK,OAAO+J,oBAAoB,UAAWI,EACxC,CA9BoB,CA+BtB,EAAG,CAAClC,GAAQW,GAAiBnB,GAAcO,GAAkB3B,IAG7DtJ,EAAAA,UAAU,WACR,GAAI0K,IAAgB,GAAKG,GAAYvD,QAAS,CAC5C,IACMkG,EADQ3C,GAAYvD,QAAQmG,iBAAiB,sBACzB/C,IACtB8C,GACFA,EAAYE,eAAe,CAAEC,MAAO,UAAWC,SAAU,UAE5D,CACH,EAAG,CAAClD,KAEJ,IAAM6C,GAAerL,cAAY,SAACoL,SAChC,IAAIA,EAAO9T,SAEX,GAAI2R,GAAY,CACd,IAGI0C,EAHEC,EAAgBlc,MAAM0Z,QAAQ7D,IAAgBA,GAAe,GAChDqG,EAActC,SAAS8B,EAAO7Z,QAI/Coa,EAAYC,EAAc3Q,OAAO,SAACpI,GAAM,OAAAA,IAAMuY,EAAO7Z,KAAb,GACxC2V,SAAAA,EAAakE,EAAO7Z,MAAO6Z,KAE3BO,SAAgBC,GAAa,GAAA,CAAER,EAAO7Z,WACtC0V,SAAAA,EAAWmE,EAAO7Z,MAAO6Z,IAGtB/F,IACHH,EAAiByG,GAGnB,IAAME,EAAkBhF,EAAQ5L,OAAO,SAACoO,GAAQ,OAAAsC,EAAUrC,SAASD,EAAI9X,MAAM,GAC7EkT,SAAAA,EAAWkH,EAAWE,EACvB,MACMxG,IACHH,EAAiBkG,EAAO7Z,OAE1BkT,SAAAA,EAAW2G,EAAO7Z,MAAO6Z,GACzBnE,SAAAA,EAAWmE,EAAO7Z,MAAO6Z,GAEpBrC,IACHZ,GAAgB,GAElBf,SAAAA,GAA0B,GAC1BkB,GAAe,IACI,QAAnB5S,EAAAgT,GAAUtD,eAAS,IAAA1P,GAAAA,EAAAgQ,OAEtB,EAAE,CAACuD,GAAY1D,GAAcF,GAAc0D,GAAkBlC,EAASpC,EAAUwC,EAAUC,EAAYE,IAEjG0E,GAAkB9L,EAAAA,YAAY,SAACtP,EAAqBa,GAExD,GADAb,EAAE+P,kBACEwI,IAAcvZ,MAAM0Z,QAAQ7D,IAAe,CAC7C,IAAMwG,EAAYxG,GAAatK,OAAO,SAACpI,GAAM,OAAAA,IAAMtB,CAAN,GACvC6Z,EAASvE,EAAQmF,KAAK,SAAC3C,GAAQ,OAAAA,EAAI9X,QAAUA,CAAd,GAChC8T,IACHH,EAAiB6G,GAEnBtH,SAAAA,EAAWsH,EAAW7C,MACtBhC,SAAAA,EAAa3V,EAAO6Z,EACrB,CACH,EAAG,CAACnC,GAAY1D,GAAcF,GAAcwB,EAASpC,EAAUyC,EAAYgC,KAErE1D,GAAc,SAAC9U,GACnBA,EAAE+P,kBACF,IAAMwL,EAA8DhD,GAAa,QAAK3D,EACjFD,IACHH,EAAiB+G,GAEnBxH,SAAAA,EAAWwH,EAAiB,IAC5B3D,GAAe,GACjB,EAkCM1C,GAAa,CACjBrR,MAAO,CACLU,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdb,YAAa,CACXS,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdZ,OAAQ,CACNQ,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdX,MAAO,CACLO,OAAQ,OACR4Q,WAAY,OACZC,cAAe,OACf1Q,SAAU,OACVC,WAAY,SAIV6W,GAAkBtC,EAAOA,QAAC,WAAM,OAAAV,IAAoB,EAAE,CAACA,KACvDvD,GAAYiE,EAAOA,QAAC,WAAM,OAAAvF,GAAckB,KAAiBjO,CAAQ,EAAE,CAAC+M,EAAYkB,GAAcjO,IAC9F6U,GAAWvC,EAAAA,QAAQ,WACvB,OAAAX,GACIvZ,MAAM0Z,QAAQ7D,KAAiBA,GAAajV,OAAS,EACrDiV,UAAwE,KAAjBA,EAF3D,EAGA,CAAC0D,GAAY1D,KAIT6G,GAAaxC,EAAAA,QAAQ,WACzB,IAAKX,KAAevZ,MAAM0Z,QAAQ7D,KAAyC,IAAxBA,GAAajV,OAC9D,OAAO,KAGT,IAAM+b,EACY,eAAhBzE,EACIsE,GAAgB1Y,MAAM,EAAG,GACzBoU,EACAsE,GAAgB1Y,MAAM,EAAGoU,GACzBsE,GAEAI,EACJ1E,GAAesE,GAAgB5b,OAAS+b,EAAW/b,OAC/C4b,GAAgB5b,OAAS+b,EAAW/b,OACpC,EAEN,OACEuF,EACEC,KAAA,MAAA,CAAAS,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZyS,SAAU,OACVhX,IAAK,MACL+K,KAAM,EACNC,SAAU,GACXtK,SAAA,CAEAoW,EAAWpO,IAAI,SAACmN,GACf,IAAMoB,EAAW,CACfra,MAAOiZ,EAAOjZ,MACdZ,MAAO6Z,EAAO7Z,MACdkb,UAAWnV,EACXgI,QAAS,WAAM,OAAAwM,GAAgB,CAAS,EAAEV,EAAO7Z,MAAM,GAGzD,OAAIsW,EACK3R,MAAC8O,EAAMhP,mBAA6B6R,EAAU2E,IAAzBpB,EAAO7Z,OAInCsE,EAEEC,KAAA,OAAA,CAAAS,MAAO,CACLsD,QAAS,cACTC,WAAY,SACZvE,IAAK,MACLoF,QAAS,UACTH,gBAAiB,UACjBC,aAAc,MACdrF,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZkG,SAAU,QAGZjK,SAAA,CAAAC,EAAAA,IAAA,OAAA,CACEK,MAAO,CACLmE,SAAU,SACVgS,aAAc,WACdnS,WAAY,UACbtE,SAEAmV,EAAOjZ,SAERmF,GACApB,EAAAA,IAAA,OAAA,CACE0B,QAAS,SAAClH,GAAM,OAAAob,GAAgBpb,EAAG0a,EAAO7Z,MAAM,EAChDgF,MAAO,CACL2D,OAAQ,UACRL,QAAS,OACTC,WAAY,SACZlE,MAAO,UACP+W,WAAY,OAGd1W,SAAAC,EAAAA,IAAA,MAAA,CACEE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAA4B3F,SAElCC,EAAAA,IACE,OAAA,CAAA7G,EAAE,mBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,gBA/ClB0E,EAAO7Z,SAuDjB+a,EAAiB,GAChBzW,EACEC,KAAA,OAAA,CAAAS,MAAO,CACLnB,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,uBACb/D,SAAA,CAAA,IAECqW,OAKZ,EAAG,CAACrD,GAAY1D,GAAc2G,GAAiBtE,EAAatQ,EAAUuQ,IAiEtE,OACEhS,OACEE,EAAAA,SAAA,CAAAE,SAAA,CAAAC,EAAAA,IAAA,QAAA,CAAAD,SAf4B,gNAgB5BJ,EAAAA,YACEoO,IAAKyE,GACL1Q,UAAW,cAAcvE,OAAAuE,GACzBzB,SACEqD,SAAU,WACVC,QAAS,cACTC,WAAY,SACZ1D,MAAO,OACPmK,SAAU,QACVyF,UAAW,aACXhM,WAAY,sBACZS,aAAc,MACdpB,OAAQ,aAAa5F,OAAAoI,EAAQ,UAAYmN,GAASpV,EAAe,WACjE4G,gBAAiBlD,EAAW,UAAY,UACxC4C,OAAQ5C,EAAW,cAAgB,UACnC8C,WAAY,WACZQ,YAAa,OACbC,aAAc,OACdgL,WAAYD,GAAWjQ,GAAMkQ,WAC7BC,cAAeF,GAAWjQ,GAAMmQ,cAChC1Q,SAAUwQ,GAAWjQ,GAAMP,SAC3BC,WAAYuQ,GAAWjQ,GAAMN,WAC7B4E,WAAY,IACZK,wBAAyB,cACzBsS,mBAAoB,OACpBC,YAAa,eACbxS,WAAY,QACT9D,GAELqB,QAzRe,WACnB,IAAIN,EAAJ,CACA,IAAMwV,GAAW9D,GACZD,IACHZ,EAAgB2E,GAElB1F,SAAAA,EAA0B0F,GACtBA,GAAW/F,EACbnH,WAAW,iBACS,QAAlBlK,EAAAoP,GAASM,eAAS,IAAA1P,GAAAA,EAAAgQ,OACnB,EAAE,GAEH4C,GAAe,GAXI,CAavB,EA4QM5D,QAnQc,SAAChU,GACnBgU,SAAAA,EAAUhU,EACZ,EAkQMiU,OAhQa,SAACjU,GAClBiU,SAAAA,EAASjU,EACX,EA+PMqc,aAAc,SAACrc,GAER4G,IACH5G,EAAEgQ,cAAcnK,MAAMQ,QAAU,MAEpC,EACAiW,WAAY,SAACtc,GACXA,EAAEgQ,cAAcnK,MAAMQ,QAAU,GAClC,EACAkW,SAAU3V,GAAY,EAAI,EAE1BrB,SAAA,CAAAC,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZwG,KAAM,EACNC,SAAU,EACVhL,IAAK,OACNU,SAEAgT,GACEmD,KAAe7H,EACdrO,MAAA,OAAA,CACEK,MAAO,CACL+J,KAAM,EACN5F,SAAU,SACVgS,aAAc,WACdnS,WAAY,SACZ3E,MAAO,UACPR,SAAU,OACVC,WAAY,OACZ4E,WAAY,KACbhE,SAEAsO,IAGHrO,EAAAA,IAAA,OAAA,CAAMK,MAAO,CAAE+J,KAAM,EAAG4M,UAAW,WAC9BnG,GAAciC,GACrB9S,MACE,QAAA,CAAA+N,IAAKa,GACL3N,KAAK,OACL5F,MAAO8W,GACP5D,SAvTS,SAAC/T,GACpB,IAAMyc,EAAMzc,EAAE+U,OAAOlU,MACrB+W,GAAe6E,GACfhG,SAAAA,EAAWgG,GACX1E,IAAiB,EACnB,EAmTY7Q,QAAS,SAAClH,GAAM,OAAAA,EAAE+P,iBAAiB,EACnCiE,QAAS,SAAChU,GAAM,OAAAA,EAAE+P,iBAAiB,EACnClK,MAAO,CACL+J,KAAM,EACNjH,OAAQ,OACRc,QAAS,OACTgG,WAAY,cACZ/K,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAAO0B,EAAW,UAAY,UAC9B0C,WAAY,sBACZuG,SAAU,EACV0F,iBAAkB,OAClBE,WAAY,QAEd5B,YAAa4H,QAAW7G,EAAYf,EACpC+B,aAAa,MACbC,YAAY,MACZC,eAAe,MACfC,YAAY,IAGdvQ,MAAA,OAAA,CACEK,MAAO,CACL+J,KAAM,EACN5F,SAAU,SACVgS,aAAc,WACdnS,WAAY,SACZ3E,MAAOuW,GACH7U,EACE,UACA,UACF,UACJlC,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZiT,UAAW,OACXrT,QAAS,gBACV5D,SAEAkW,IACqB,QAAlBjV,EAAAgV,GAAgB,UAAE,IAAAhV,OAAA,EAAAA,EAAE/E,QAASoT,GAC7BhB,GAAe,QAKzB1O,OACE,MAAA,CAAAU,MAAO,CACLqD,SAAU,WACVgF,MAAO,OACP/E,QAAS,OACTC,WAAY,SACZvE,IAAK,OAGNU,SAAA,CAAA0P,IAAazP,EAAAA,IA9KJ,WAAM,OACtBA,EAAAC,IAAA,MAAA,CACEC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNhE,QAAS4N,GACTjP,MAAO,CACL2D,OAAQ,UACRzD,WAAY,EACZb,MAAO,WAGTK,SAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAE,uBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,iBA4JbxQ,MAvMU,SAACR,GAAU,IAAAiS,EAAIjS,EAAAsT,OAA4B,OAC3D9S,aACEE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNrF,MAAO,CACL6J,UAAWuH,EAAO,iBAAmB,eACrCvN,WAAY,6BACZ3D,WAAY,GAGdR,SAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAE,iBACFwH,OAAO,UACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,WAlBwC,EAuM3C,CAACsC,OAAQA,WAItBA,IAAUH,IAAoBuE,EAAYA,aACzClX,EACEC,IAAA,MAAA,CAAA8N,IAAK0E,GACL3Q,UAAW,uBAAAvE,OAAuB6T,GAClC/Q,MAAKxG,EAAA,CACH6J,SAAU,WACV0E,IAAK,GAAG7K,OAAAoV,GAAiBvK,IAAG,MAC5BC,KAAM,GAAA9K,OAAGoV,GAAiBtK,WAC1BnI,MAAO,GAAG3C,OAAAoV,GAAiBzS,MAAS,MACpCoI,OAAQ,KACRhE,gBAAiB,UACjBC,aAAc,MACdnB,UAAW,iCACXD,OAAQ,oBACRgU,UAAW,QACX3S,SAAU,OACV3D,QAAS,EACTqJ,UACiC,QAA/ByI,GAAiB8B,UACb,kBACA,mBACNnU,UAAW,wCACX8W,gBACiC,QAA/BzE,GAAiB8B,UACb,gBACA,aACN4C,wBAAyB,QACzBC,mBAAoB,WACjBjG,YAGuB,IAA3BoC,GAAgBrZ,OACf4F,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLoE,QAAS,WACT8S,UAAW,SACX7X,MAAO,UACPR,SAAU,OACV4E,WAAY,uBACb/D,SAAA,YAKH0T,GAAgB1L,IAAI,SAACmN,EAAQsC,GAC3B,IAAMC,EAAa1E,GACfvZ,MAAM0Z,QAAQ7D,KAAiBA,GAAa+D,SAAS8B,EAAO7Z,OAC5DgU,KAAiB6F,EAAO7Z,MACtBqc,EAAYF,IAAUlF,GAG5B,OAAIV,EAEA5R,aAEE8B,UAAW,4BAAsBoT,EAAO9T,SAAkC,GAAvB,qBAA6B,KAAA7D,OAAAka,EAAa,eAAiB,IAC9G/V,QAAS,WAAM,OAACwT,EAAO9T,UAAY+T,GAAaD,EAAjC,EACf7U,MAAO,CACL2D,OAAQkR,EAAO9T,SAAW,cAAgB,UAC1C8C,WAAY,yBAGbnE,SAAA6R,EAAasD,EAAQ,CACpByC,SAAUF,EACVhW,QAASiW,EACTtW,SAAU8T,EAAO9T,WAAY,KAX1B8T,EAAO7Z,OAmBhBsE,OAEE,MAAA,CAAAmC,UAAW,qBAAqBvE,OAAC2X,EAAO9T,SAAkC,GAAvB,iCAA6BqW,EAAa,eAAiB,IAC9G/V,QAAS,WAAM,OAAAyT,GAAaD,IAC5B7U,MAAO,CACLoE,QAAS,WACTT,OAAQkR,EAAO9T,SAAW,cAAgB,UAC1C1B,MAAOwV,EAAO9T,SAAW,UAAY,UACrClC,SAAU,OACVC,WAAY,OACZ2E,WAAY,sBACZH,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBK,WAAY,yBACbnE,SAAA,CAEDC,EAAOC,IAAA,OAAA,CAAAF,SAAAmV,EAAOjZ,QAEbwb,GACCzX,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAW4V,EAAY,SAAW,YAElC1X,EACEC,IAAA,OAAA,CAAA9G,EAAE,iCACFwH,OAAQjD,EACRkD,YAAY,IACZE,cAAc,QACd0P,eAAe,cAhChB0E,EAAO7Z,WAyCtByP,SAASjP,QAIjB,EAEA4U,EAAOlL,YAAc,SC/0Bd,IAgDMqS,EAGR,SAACpY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BL,EAAAA,IACE,MAAA,CAAAE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,4CACFwH,OAAO,UACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,WAfU,EAqBlBqH,EAGR,SAACrY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BV,OAAA,MAAA,CACEO,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,YAEPL,MACE,OAAA,CAAA7G,EAAE,uBACFwH,OAAO,UACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,UAEjBxQ,MAAA,OAAA,CACE7G,EAAE,wBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,YAtBU,EA4BlBsH,EAGR,SAACtY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BV,OAAA,MAAA,CACEO,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,YAEPL,MACE,OAAA,CAAA7G,EAAE,wBACFwH,OAAO,UACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,UAEjBxQ,MAAA,OAAA,CACE7G,EAAE,uBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,YAtBU,EA2BlBuH,EAGR,SAACvY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BL,EAAAA,IACE,MAAA,CAAAE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,4EACFwH,OAAO,eACPC,YAAY,UACZE,cAAc,QACd0P,eAAe,WAfU,EAoBlBwH,EAGR,SAACxY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BL,EAAAA,IACE,MAAA,CAAAE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,4EACFwH,OAAO,eACPC,YAAY,UACZE,cAAc,QACd0P,eAAe,WAfU,EAoBlByH,EAGR,SAACzY,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BV,EACEC,KAAA,MAAA,CAAAM,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAA,CAAAC,EAAAA,IAAA,IAAA,CAAGkY,SAAS,+BACVlY,EACEC,IAAA,OAAA,CAAA9G,EAAE,kbACFwH,OAAO,eACPC,YAAY,UACZE,cAAc,QACd0P,eAAe,YAGnBxQ,uBACEA,EAAAA,IAAU,WAAA,CAAAuG,GAAG,yBACXvG,EAAAA,IAAM,OAAA,CAAAE,MAAM,KAAKnB,OAAO,KAAKqB,KAAK,uBArBX,ECvJzB+X,EAAwC,SAAC3Y,OACpC4Y,EAAiB5Y,EAAA0P,QAC1BlO,EAAAxB,EAAA6Y,eAAAA,OAAiB,IAAArX,EAAA,EAACA,EAClBE,EAAS1B,EAAA8Y,MAATA,OAAK,IAAApX,EAAG,EAACA,EACCqX,EAAkB/Y,EAAAgZ,SAC5BrX,EAAA3B,EAAAiZ,gBAAAA,OAAkB,IAAAtX,EAAA,GAAEA,EACpBE,EAAuB7B,EAAAkZ,gBAAvBA,OAAkB,IAAArX,GAAKA,EACvBG,EAA2ChC,EAAAmZ,gBAA3CA,OAAe,IAAAnX,EAAG,CAAC,KAAM,KAAM,KAAM,OAAMA,EAC3CG,EAAuBnC,EAAAoZ,gBAAvBA,OAAe,IAAAjX,GAAQA,EACvBkX,EAASrZ,EAAAqZ,UACTtK,EAAQ/O,EAAA+O,SACRuK,EAAgBtZ,EAAAsZ,iBAChBjX,EAAArC,EAAAuZ,OAAAA,OAAS,IAAAlX,GAAKA,EACdG,EAAgBxC,EAAA4B,SAAhBA,OAAW,IAAAY,GAAKA,EAChBG,EAAwB3C,EAAAwZ,iBAAxBA,OAAgB,IAAA7W,GAAQA,EACxBI,EAAA/C,EAAAsC,UAAAA,aAAY,GAAES,EACdlC,EAAKb,EAAAa,MACL8Q,EAAgB3R,EAAAC,KAAhBA,OAAI,IAAA0R,EAAG,UAASA,EAChBG,EAAA9R,EAAAyZ,WAAAA,OAAa,IAAA3H,GAAKA,EACG9R,EAAA0Z,cACrB,IAAAC,EAAU3Z,EAAA2Z,WAEFrH,EAA6BjU,IAAUH,aAAvCA,OAAY,IAAAoU,EAAG,UAASA,EAC1BC,EAAwC3P,EAAAA,SAASiW,GAAhDe,EAAerH,EAAA,GAAEsH,EAAkBtH,EAAA,GACpCG,EAA0C9P,EAAAA,SAASqW,GAAlDa,EAAgBpH,EAAA,GAAEqH,EAAmBrH,EAAA,GACtCG,EAA8BjQ,EAAAA,SAAS,IAAtCoX,EAAUnH,EAAA,GAAEoH,EAAapH,EAAA,GAE1BnD,EAAUkJ,QAAAA,EAAqBgB,EAC/BZ,EAAWD,QAAAA,EAAsBe,EAEjCI,GAAahG,EAAOA,QACxB,WAAM,OAAAlN,KAAKmT,KAAKrB,EAAQE,EAAS,EACjC,CAACF,EAAOE,IAGV5Q,EAAAA,UAAU,gBACkBwH,IAAtBgJ,GACFiB,EAAmBjB,EAEvB,EAAG,CAACA,IAEJxQ,EAAAA,UAAU,gBACmBwH,IAAvBmJ,GACFgB,EAAoBhB,EAExB,EAAG,CAACA,IAEJ,IAAMqB,GAAmB,SAACC,GACpBA,EAAO,GAAKA,EAAOH,IAAcG,IAAS3K,GAAW9N,SAE/BgO,IAAtBgJ,GACFiB,EAAmBQ,GAErBtL,SAAAA,EAAWsL,EAAMrB,GACnB,EAiBMsB,GAAe,WACnB,IAAMD,EAAOE,SAASP,EAAY,IAC9BK,GAAQ,GAAKA,GAAQH,KACvBE,GAAiBC,GACjBJ,EAAc,IAElB,EAuHA,GAAIT,GAAoBU,IAAc,EACpC,OAAO,KAGT,GAAIX,EACF,OACEpZ,EAAAA,KACE,MAAA,CAAAmC,UAAW,wCAAAvE,OAAwCuE,GACnDzB,MAAOA,EAAKN,SAAA,CAEZC,EAAAA,IAACe,EAAM,CACLW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAA3B,EACf9N,SAAUA,GAAwB,IAAZ8N,EACtBjO,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACL8J,YAAa,MACbhH,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OACfxE,SAEDC,MAAC+X,EAAa,CAAA,KAEhBpY,EAAAC,KAAA,OAAA,CACES,MAAO,CACL2Z,OAAQ,QACR9a,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,uBAGb/D,SAAA,CAAAmP,QAAYwK,MAEf1Z,EAACC,IAAAc,EACC,CAAAW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAAE,EAC5C9N,SAAUA,GAAY8N,IAAYwK,GAClCzY,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLoW,WAAY,MACZtT,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OACfxE,SAEDC,EAAAA,IAACgY,EAAc,CAAA,QAMvB,IAAMiC,IAAS/K,EAAU,GAAKsJ,EAAW,EACnC0B,GAAM1T,KAAKwN,IAAI9E,EAAUsJ,EAAUF,GAEzC,OACE3Y,EAAAC,KAAA,MAAA,CACEkC,UAAW,yBAAyBvE,OAAAuE,GACpCzB,MAAKxG,EAAA,CACH8J,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBwS,SAAU4C,EAAa,OAAS,SAChCnV,WAAY,uBACTzD,GAGJN,SAAA,CAAA8Y,GACC7Y,EAAKC,IAAA,MAAA,CAAA6B,UAAU,wFAAuF/B,SACnG8Y,EAAUP,EAAO,CAAC2B,GAAOC,OAI9Bva,EAAAC,KAAA,MAAA,CACES,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZvE,IAAK,QACNU,SAAA,CAEAuY,EAAQ,GACPtY,EAAAC,IAAAJ,EAAAC,SAAA,CAAAC,SACGoZ,EACCA,EACEjK,EAAU,EACV,OACAlP,EAAAA,IAACe,EAAM,CACLW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAAE,EAC5C9N,SAAUA,GAAwB,IAAZ8N,EACtBjO,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLtB,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTpF,IAAK,MACL8D,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OAGhBxE,SAAAC,EAAAC,IAAC8X,EAAa,CAAA,MAIlB/X,EAACC,IAAAc,GACCW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAAE,EAC5C9N,SAAUA,GAAwB,IAAZ8N,EACtBjO,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLtB,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTpF,IAAK,MACL8D,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OAGhBxE,SAAAC,EAAAC,IAAC8X,EAAgB,CAAA,OAMzB/X,EAAAA,IAAA,MAAA,CAAKK,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUvE,IAAK,OAAOU,SAlPhD,WACrB,GAAI2Z,IAAc,EAChB,OAAOlgB,MAAM0D,KAAK,CAAE9C,OAAQsf,IAAc,SAAC1d,EAAG/B,GAAM,OAAAA,EAAI,CAAC,GAG3D,IAAMkgB,EAA6B,GAEnC,GAAIjL,GAAW,EAAG,CAChB,IAAK,IAAIjV,EAAI,EAAGA,GAAK,EAAGA,IACtBkgB,EAAMpd,KAAK9C,GAEbkgB,EAAMpd,KAAK,aACXod,EAAMpd,KAAK2c,GACZ,MAAM,GAAIxK,GAAWwK,GAAa,EAAG,CACpCS,EAAMpd,KAAK,GACXod,EAAMpd,KAAK,aACX,IAAS9C,EAAIyf,GAAa,EAAGzf,GAAKyf,GAAYzf,IAC5CkgB,EAAMpd,KAAK9C,EAEd,KAAM,CACLkgB,EAAMpd,KAAK,GACXod,EAAMpd,KAAK,aACX,IAAS9C,EAAIiV,EAAU,EAAGjV,GAAKiV,EAAU,EAAGjV,IAC1CkgB,EAAMpd,KAAK9C,GAEbkgB,EAAMpd,KAAK,aACXod,EAAMpd,KAAK2c,GACZ,CAED,OAAOS,CACT,CAqNSC,GAAiBrS,IAAI,SAACsS,GAAS,OAnNrB,SAACA,GAClB,GAAoB,iBAATA,EAAmB,CAC5B,IAAMC,EAAWD,IAASnL,EACpBqL,EACJva,MAACe,EAEC,CAAAW,QAAS,WAAM,OAAAkY,GAAiBS,IAChCjZ,SAAUA,EACVH,KAAMqZ,EAAW,UAAY,UAC7B7a,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLgK,SAAmB,UAAT5K,EAAmB,OAAS,OACtCV,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTuV,OAAQ,EACRjW,WAAYuW,EAAW,IAAM,IAC7BnX,OAAQmX,EAAW,aAAa/c,OAAAG,QAAiB0R,EACjDhM,UAAW,OACXmB,aAAc,OACfxE,SAEAsa,GAhBIA,GAoBT,OAAOlB,EAAaA,EAAWkB,EAAM,OAAQE,GAAWA,CACzD,CAED,GAAa,cAATF,EAsBF,OArBME,EACJva,EAAAA,IAACe,EAEC,CAAAW,QAAS,WAAM,OAAAkY,GAAiBpT,KAAKyN,IAAI,EAAG/E,EAAU,KACtD9N,SAAUA,EACVH,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLgK,SAAmB,UAAT5K,EAAmB,OAAS,OACtCV,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTuV,OAAQ,EACR7W,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OAZZxE,SAAA,OAAA,aAmBDoZ,EACHA,EAAWjK,EAAU,EAAG,YAAaqL,GACrCA,EAGN,GAAa,cAATF,EAsBF,OArBME,EACJva,EAAAA,IAACe,EAEC,CAAAW,QAAS,WAAM,OAAAkY,GAAiBpT,KAAKwN,IAAI0F,GAAYxK,EAAU,KAC/D9N,SAAUA,EACVH,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLgK,SAAmB,UAAT5K,EAAmB,OAAS,OACtCV,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTuV,OAAQ,EACR7W,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OAZZxE,SAAA,OAAA,aAmBDoZ,EACHA,EAAWjK,EAAU,EAAG,YAAaqL,GACrCA,EAGN,OAAO,IACT,CAgIwCC,CAAWH,OAG5C/B,EAAQ,GACPtY,EAAAA,IACGH,EAAAA,SAAA,CAAAE,SAAAoZ,EACCA,EACEjK,EAAU,EACV,OACAlP,EAAAC,IAACc,EAAM,CACLW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAA3B,EACf9N,SAAUA,GAAY8N,IAAYwK,GAClCzY,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLtB,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTpF,IAAK,MACL8D,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OAGhBxE,SAAAC,EAAAC,IAAC+X,EAAc,CAAA,MAInBhY,EAACC,IAAAc,GACCW,QAAS,WAAM,OAAAkY,GAAiB1K,EAAU,EAAE,EAC5C9N,SAAUA,GAAY8N,IAAYwK,GAClCzY,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACLtB,OAAiB,UAATU,EAAmB,OAAS,OACpCgF,QAAS,SACTpF,IAAK,MACL8D,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OACfxE,SAEDC,EAACC,IAAA+X,EAAiB,CAAA,OAMzBU,GACC1Y,EAAAC,IAACwQ,EAAM,CACLpV,MAAOmd,EACP7H,QAASgI,EAAgB5Q,IAAI,SAAC/N,GAAM,MAAC,CACnCiC,MAAO,GAAGsB,OAAAvD,EAAU,WACpBqB,MAAOof,OAAOzgB,GAFoB,GAIpCuU,SAAU,SAAC0I,GAAQ,OAhUCyD,EAgUoBD,OAAOxD,GA/TjD0D,EAAgBnU,KAAKmT,KAAKrB,EAAQoC,GAClCE,EAAa1L,EAAUyL,EAAgBA,EAAgBzL,OAElCE,IAAvBmJ,GACFgB,EAAoBmB,QAEItL,IAAtBgJ,GACFiB,EAAmBuB,GAGrB9B,SAAAA,EAAmB8B,EAAYF,QAC/BnM,SAAAA,EAAWqM,EAAYF,IAZI,IAACA,EACtBC,EACAC,CA8TsD,EACpDxZ,SAAUA,EACV3B,KAAe,UAATA,EAAmB,QAAU,SACnCY,MAAO,CAAEgK,SAAmB,UAAT5K,EAAmB,GAAK,MAI9CmZ,GACCjZ,EAAAC,KAAA,MAAA,CACES,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZvE,IAAK,MACLyE,WAAY,uBAGd/D,SAAA,CAAAC,EAAAA,IAAA,OAAA,CACEK,MAAO,CACLnB,SAAU,OACVC,WAAY,OACZO,MAAO,WACRK,SAAA,UAIHC,EAAAA,IAAC6N,EAAK,CACJ5M,KAAK,SACL+S,IAAK,EACL3Y,MAAOme,EACPjL,SAAU,SAAC/T,GAAM,OAAAif,EAAcjf,EAAE+U,OAAOlU,MAAM,EAC9CqT,aAAcoL,GACd1Y,SAAUA,EACV3B,KAAe,UAATA,EAAmB,QAAU,SACnCY,MAAO,CAAEH,MAAO,GAAImK,SAAU,MAEhCrK,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLnB,SAAU,OACVC,WAAY,OACZO,MAAO,WACRK,SAAA,SAIyB,iBAApB6Y,GAAgCA,EAAgBiC,SACtD7a,MAACe,GACCW,QAASoY,GACT1Y,SAAUA,EACVH,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACL8C,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OACfxE,SAEA6Y,EAAgBiC,WAGnB7a,EAAAA,IAACe,EACC,CAAAW,QAASoY,GACT1Y,SAAUA,EACVH,KAAK,UACLxB,KAAe,YAATA,EAAqB,SAAW,QACtCY,MAAO,CACL8C,OAAQ,oBACRC,UAAW,OACXmB,aAAc,OACfxE,SAAA,eAUjB,ECtdM+a,EAAoC,SAACtb,OACzCwB,EAAexB,EAAAub,QAAfA,OAAU,IAAA/Z,KACVE,EAAA1B,EAAAwb,cAAAA,OAAa,IAAA9Z,GAAQA,EACrBC,aAAAC,cAAgBD,EAChBoN,EAAQ/O,EAAA+O,SACRlN,cAAAS,aAAY,GAAET,EACdhB,EAAKb,EAAAa,MACLN,EAAQP,EAAAO,SACRyB,SAAA/B,aAAO,KAAI+B,EACXyZ,EAAIzb,EAAAyb,KACOC,EAAa1b,EAAAkY,UAElB/V,EAAwBS,EAAAA,UAAS,GAAhC+Y,EAAOxZ,EAAA,GAAEyZ,EAAUzZ,EAAA,GACpBE,EAAwBO,EAAAA,UAAS,GAAhCX,EAAOI,EAAA,GAAEoN,EAAUpN,EAAA,GAEpByY,EAAWS,GAAWC,EACtBK,EAAYH,QAAAA,EAAiBzZ,EAE7BsI,EAAc,WACd3I,IAKJmN,SAAAA,EAJuB,CACrBgB,OAAQ,CAAEwL,SAAUA,GACpBvQ,cAAe,CAAEuQ,SAAUA,KAG/B,EASMO,EAAmB,OAAT7b,EAAgB,OAAS,OACnCL,EAAoB,OAATK,EAAgB,OAAS,OACpC8E,EAAwB,OAAT9E,EAAgB,wBAA0B,wBACzDP,EAAoB,OAATO,EAAgB,iCAAmC,iCAC9DN,EAAsB,OAATM,EAAgB,mCAAqC,mCAClEJ,EAAe,OAATI,EAAgB,yBAA2B,0BAejDyD,EAAY9B,GAAYkZ,EAC1B,2CACA,iCAEEiB,EAAWxb,GAAYkb,EAE7B,OACEtb,EAAAA,KAAA,MAAA,CACEmC,UAAW,gBAAgBvE,OAAAuE,GAC3B0Z,KAAK,WAAU,eACDR,EAAgB,QAAUD,EAAO,gBAChC3Z,EACf2V,SAAU3V,GAAY,EAAI,EAC1Bf,MAAKxG,EAAA,CACH8J,QAAS,cACTC,WAAY,aACZvE,IAAGA,EACH2E,OAAQ5C,EAAW,cAAgB,UACnC6C,QAAS,QACN5D,GAELqB,QAASqI,EACTmG,UAjDkB,SAAC1V,GACP,MAAVA,EAAE2V,KAAyB,UAAV3V,EAAE2V,MACrB3V,EAAE0K,iBACF6E,IAEJ,EA6CI5E,aAAc,WAAM,OAAC/D,GAAYga,GAAW,EAAK,EACjDhW,aAAc,WAAM,OAAAgW,GAAW,IAC/B5M,QAAS,WAAM,OAACpN,GAAY6N,GAAW,EAAK,EAC5CR,OAAQ,WAAM,OAAAQ,GAAW,IAGzBlP,SAAA,CAAAJ,OAAA,MAAA,CACEU,MAAO,CACLqD,SAAU,WACVxD,MAAOob,EACPvc,OAAQuc,EACRjR,SAAUiR,EACVtE,UAAWsE,EACX/a,WAAY,EACZgE,aAAYA,EACZpB,OA5CF/B,EAAiB,kDACjBkZ,EAAiBa,EAAU,uDAAyD,iDACjF,iDA2CD7W,gBAnDFlD,EAAiB,2CACjBkZ,EAAiBa,EAAU,6CAA+C,uCACvEA,EAAU,yCAA2C,mCAkDtDxX,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBK,WAAY,+DACZ4L,UAAW,aACX1M,UAAWiY,EAAY,sEAAwE,OAC/F/Q,UAAWiR,EAAW,MAAQ,KAC/Bxb,SAAA,CAGDC,MACc,MAAA,CAAA,cAAA,OACZG,QAAQ,YACRC,KAAK,OACLC,MAAO,CACLqD,SAAU,WACVxD,MAAOd,EACPL,OAAQK,EACRM,MAAOwD,EACPrC,QAASma,EAAgB,EAAI,EAC7B9W,WAAY,gBACZqE,cAAe,QAChBxI,SAEDC,EAAAA,IAAM,OAAA,CAAA7G,EAAE,qBAAqBwH,OAAO,eAAeC,YAAY,IAAIE,cAAc,QAAQ0P,eAAe,YAI1GxQ,EAAAC,IAAA,MAAA,CAAA,cACc,OACZE,QAAQ,YACRC,KAAK,OACLC,MAAO,CACLqD,SAAU,WACVxD,MAAOd,EACPL,OAAQK,EACRM,MAAOwD,EACPrC,QAASka,IAAYC,EAAgB,EAAI,EACzC9W,WAAY,gBACZqE,cAAe,QAGjBxI,SAAAC,EAAAA,IAAA,OAAA,CAAM7G,EAAE,yCAAyCwH,OAAO,eAAeC,YAAY,IAAIE,cAAc,QAAQ0P,eAAe,eAK/H+K,GACC5b,EAAKC,KAAA,MAAA,CAAAS,MAAO,CAAEsD,QAAS,cAAe6E,cAAe,SAAUnJ,IAAc,OAATI,EAAgB,0BAA4B,KAC7GM,SAAA,CAAAA,GACCC,MACE,OAAA,CAAAK,MAAO,CACLnB,SAAQA,EACRC,WAAUA,EACV4E,WAAY,iCACZD,WAAY,iDACZpE,MAAO0B,EAAW,sCAAwC,uCAC1D+C,WAAY,QAGbpE,SAAAA,IAGJkb,GACCjb,MACE,OAAA,CAAAK,MAAO,CACLnB,SAAQA,EACRC,WAAUA,EACV4E,WAAY,kCACZD,WAAY,iDACZpE,MAAO,uCAETgC,QAAS,SAAClH,GAAM,OAAAA,EAAE+P,mBAAiBxK,SAElCkb,SAOf,EAEAH,EAASvV,YAAc,WC3LvB,IAAMkW,EAAmD,SAACjc,GAAE,IAAAE,EAAKF,EAAAE,MAAO,OACtEC,EAAAA,2BACEK,EAAQC,IAAA,QAAA,CAAAF,SAAA,qJAMRJ,EAAAC,KAAA,MAAA,CACEM,MAAO,GACPnB,OAAQ,GACRoB,QAAQ,YACRC,KAAK,OAAM,eAAA,EAEXC,MAAO,CAAEC,UAAW,6CAA6CP,SAAA,CAEjEC,gBACEQ,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAQjB,EACRkB,YAAY,IACZE,cAAc,QACd4a,gBAAgB,KAChBC,iBAAiB,KACjB9a,QAAS,KAEXb,EAAAA,IAAA,SAAA,CACEQ,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAQjB,EACRkB,YAAY,IACZE,cAAc,QACd4a,gBAAgB,KAChBC,iBAAiB,YAnC+C,EAyClEC,EAGD,SAACpc,OAAE8B,EAAO9B,EAAA8B,QAAEua,EAASrc,EAAAqc,UACxB,IAAKva,EAAS,OAAO,KACrB,IAAMwa,GAAsB,IAAZxa,EAAmBtB,EAAAC,IAACwb,EAAoB,CAAA/b,MAAOmc,IAAgBva,EAC/E,OACEtB,MAAA,MAAA,CACEwb,KAAK,SACK,YAAA,SACC,aAAA,UACX1Z,UAAU,4BACVzB,MAAO,CACLqD,SAAU,WACVqY,MAAO,EACPzT,OAAQ,GACR3E,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBS,gBAAiB,4BACjBiE,cAAe,QAGhBxI,SAAA+b,GAGP,EA+JME,EAAW,SAACC,EAAUC,GAC1B,MAAoB,iBAATA,EACFD,aAAG,EAAHA,EAAMC,GAERA,EAAKC,OAAO,SAACC,EAAKjM,GAAQ,OAAAiM,aAAG,EAAHA,EAAMjM,IAAM8L,EAC/C,EAEMI,EAAY,SAAKC,EAAWC,WAChC,MAAsB,mBAAXA,EACFA,EAAOD,GAEM,iBAAXC,EAC0B,QAA5B/c,EAAAwc,EAASM,EAAQC,UAAW,IAAA/c,EAAAA,EAAA,GAEX,UAAlB8c,EAAenM,WAAG,IAAAnP,EAAAA,EAAI,EAChC,EAIMwb,EAAqD,SAAChd,GAAE,IAAAid,EAAKjd,EAAAid,MACzD/e,EAAiBG,iBAEzB,MAAc,WAAV4e,EAEAzc,EAAAA,IAAC8X,EAAW,CAACzX,MAAO,CAAEX,MAAOhC,KAGnB,YAAV+e,EAEAzc,EAAAA,IAAC6X,EAAY,CAACxX,MAAO,CAAEX,MAAOhC,KAIhCsC,EAAAC,IAAC2X,EAAQ,CAAA,EAEb,EC1PM8E,EAA8B,SAACld,OACnCwB,EAAexB,EAAAub,QAAfA,OAAU,IAAA/Z,KACVE,EAAA1B,EAAA4B,SAAAA,OAAQ,IAAAF,GAAQA,EAChBqN,EAAQ/O,EAAA+O,SACRpN,cAAAW,OAAY,IAAAX,EAAA,GAAEA,EACdd,EAAKb,EAAAa,MACLN,EAAQP,EAAAO,SACR1E,EAAKmE,EAAAnE,MACDmE,EAAAmd,KAAA,IACJtb,SAAA5B,aAAO,KAAI4B,EACX4Z,EAAIzb,EAAAyb,KACOC,EAAa1b,EAAAkY,UAElBlW,EAAwBY,EAAAA,UAAS,GAAhC+Y,EAAO3Z,EAAA,GAAE4Z,EAAU5Z,EAAA,GACpBG,EAAwBS,EAAAA,UAAS,GAAhCX,EAAOE,EAAA,GAAEsN,EAAUtN,EAAA,GAEpB0Z,EAAYH,QAAAA,EAAiBzZ,EAE7BsI,EAAc,WACd3I,GAAY2Z,IAKhBxM,SAAAA,EAJuB,CACrBgB,OAAQ,CAAEwL,SAAS,EAAM1f,SACzBmP,cAAe,CAAEuQ,SAAS,EAAM1f,WAGpC,EAEMigB,EAAmB,OAAT7b,EAAgB,OAAS,OACnCmd,EAAmB,OAATnd,EAAgB,MAAQ,MAClCP,EAAoB,OAATO,EAAgB,iCAAmC,iCAC9DN,EAAsB,OAATM,EAAgB,mCAAqC,mCAClEJ,EAAe,OAATI,EAAgB,yBAA2B,0BAcjD8b,EAAWxb,GAAYkb,EAGvB4B,EAAWzb,GAAY2Z,EACzB,2CACA,iCAEJ,OACEpb,EAAAC,KAAA,MAAA,CACEkC,UAAW,aAAavE,OAAAuE,GACxB0Z,KAAK,QAAO,eACET,EACC,gBAAA3Z,EACf2V,SAAU3V,GAAY,EAAI,EAC1Bf,SACEsD,QAAS,cACTC,WAAY,aACZvE,IAAGA,EACH2E,OAAQ5C,EAAW,cAAgB,UACnC6C,QAAS,QACN5D,GAELqB,QAASqI,EACTmG,UAAW,SAAC1V,GACI,MAAVA,EAAE2V,KAAyB,UAAV3V,EAAE2V,MACrB3V,EAAE0K,iBACF6E,MAGJ5E,aAAc,WAAM,OAAC/D,GAAYga,GAAW,IAC5ChW,aAAc,WAAM,OAAAgW,GAAW,EAAM,EACrC5M,QAAS,WAAM,OAACpN,GAAY6N,GAAW,EAAK,EAC5CR,OAAQ,WAAM,OAAAQ,GAAW,EAAM,EAAAlP,SAAA,CAG/BC,EAAAA,IACE,MAAA,CAAAK,MAAO,CACLqD,SAAU,WACVxD,MAAOob,EACPvc,OAAQuc,EACRjR,SAAUiR,EACVtE,UAAWsE,EACX/a,WAAY,EACZgE,aAAc,MACdpB,OAjDF/B,EAAiB,kDACjB2Z,EAAgBI,EAAU,uDAAyD,iDAChF,iDAgDD7W,gBAxDFlD,EAAiB,2CACjB2Z,EAAgBI,EAAU,6CAA+C,uCACtEA,EAAU,yCAA2C,mCAuDtDxX,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBK,WAAY,+DACZ4L,UAAW,aACX1M,UAAWiY,EAAY,sEAAwE,OAC/F/Q,UAAWiR,EAAW,MAAQ,KAIhCxb,SAAAC,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLH,MAAO0c,EACP7d,OAAQ6d,EACRrY,aAAc,MACdD,gBAAiBuY,EACjBhc,QAASka,EAAU,EAAI,EACvB7W,WAAY,gBACZqE,cAAe,OACfhI,WAAY,OAMjBgb,GACC5b,cAAKU,MAAO,CAAEsD,QAAS,cAAe6E,cAAe,SAAUnJ,IAAc,OAATI,EAAgB,0BAA4B,KAC7GM,SAAA,CAAAA,GACCC,EAAAA,IAAA,OAAA,CACEK,MAAO,CACLnB,SAAQA,EACRC,WAAUA,EACV4E,WAAY,iCACZD,WAAY,iDACZpE,MAAO0B,EAAW,sCAAwC,uCAC1D+C,WAAY,QAGbpE,SAAAA,IAGJkb,GACCjb,MACE,OAAA,CAAAK,MAAO,CACLnB,SAAQA,EACRC,WAAUA,EACV4E,WAAY,kCACZD,WAAY,iDACZpE,MAAO,uCAETgC,QAAS,SAAClH,GAAM,OAAAA,EAAE+P,mBAAiBxK,SAElCkb,SAQf,EAEAyB,EAAMnX,YAAc,QC/Id,ICwBAuX,EAAe,qCACfC,EACJ,qFACIC,EAAuB,IAAI5W,IAAI,CACnC,MACA,KACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,MACA,MACA,KACA,OACA,MACA,OACA,KACA,KACA,MACA,MACA,MACA,MACA,QACA,OACA,SACA,UAGW6W,EAAmB,SAC9BC,EACAC,EACAC,EACAC,GAEA,QAJA,IAAAF,IAAAA,GAA4B,QAC5B,IAAAC,IAAAA,GAAwB,IAGnBF,GAAsB,iBAARA,EAAkB,OAAO,EAC5C,IAAMI,EAAUJ,EAAIK,OACpB,IAAKD,EAAS,OAAO,EAErB,IAAME,EAAc,gCAAgCC,KAAKH,GACzD,GAAIH,IAAiBK,EAAa,OAAO,EAEzC,IAAME,EAAaF,EAAcF,EAAU,WAAW/f,OAAA+f,GAEtD,IACE,IAAMK,EAAS,IAAIC,IAAIF,GACjBG,EAAWF,EAAOE,SAAStK,cACjC,GAAiB,UAAbsK,GAAqC,WAAbA,EAAuB,OAAO,EAE1D,GAAIT,EAAU,CACZ,IAAMU,EAAOH,EAAOI,SAASxK,cAC7B,IAAKuK,EAAM,OAAO,EAClB,GAAa,cAATA,EAAsB,OAAO,EACjC,GAAI,0BAA0BL,KAAKK,GACjC,OAAOA,EAAKE,MAAM,KAAKC,MAAM,SAACC,GAC5B,IAAMC,EAAM1D,OAAOyD,GACnB,OAAOzD,OAAO2D,UAAUD,IAAQA,GAAO,GAAKA,GAAO,GACrD,GAEF,IAAKrB,EAAaW,KAAKK,GAAO,OAAO,EACrC,IAAMO,EAAMP,EAAKE,MAAM,KAAKlhB,OAAS,GAIrC,KAHeugB,EACX,IAAIjX,IAAIiX,EAAYtV,IAAI,SAACsS,GAAS,OAAAA,EAAK9G,aAAL,IAClCyJ,GACQsB,IAAID,GAAM,OAAO,CAC9B,CACD,OAAO,CACR,CAAC,MAAA7e,GACA,OAAO,CACR,CACH,EAEM+e,EAA0B,SAACljB,GAC/B,IAAMmjB,EAAQnjB,EAAMmjB,MAAM,uBAC1B,MAAO,CACLC,MAAMD,aAAA,EAAAA,EAAQ,KAAMnjB,EACpB6S,QAAQsQ,aAAA,EAAAA,EAAQ,KAAM,GAE1B,EAsDME,GAAa,SAACrjB,GAClB,OAAAA,EACGsjB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QALjB,EAQIC,GAAuB,SAACvjB,GAC5B,OAAAA,EAAMsjB,QAAQ,IAAIE,OAFP,IAEoB,KAAM,GAArC,EAEIC,GAAqB,SACzBlT,EACA+E,EACAvP,GAEA,IAAM2d,EArEa,SACnBnT,EACA+E,WAEA,IAAK/E,EAAM,MAAO,GAOlB,IALA,IAAMmT,EAAsB,GACxBC,EAAY,EACVC,EAAQ,IAAIJ,OAAO9B,GACrByB,EAAQS,EAAMC,KAAKtT,GAEhB4S,GAAO,CACZ,IAAMW,EAAcX,EAAM,GACpBvE,EAAQuE,EAAMhH,MACd0C,EAAMD,EAAQkF,EAAY/kB,OAE5B6f,EAAQ+E,GACVD,EAAOhiB,KAAK,CAAEkE,KAAM,OAAQ2K,KAAMA,EAAKtO,MAAM0hB,EAAW/E,KAGpD,IAAA/Y,EAAmBqd,EAAwBY,GAAzCV,EAAIvd,EAAAud,KAAEvQ,EAAMhN,EAAAgN,OACdkR,EAAO,gCAAgC3B,KAAKgB,GAC9CA,EACA,WAAAlhB,OAAWkhB,GACTY,EAAiBpC,EACrBwB,EACqB,QAArBjf,EAAAmR,eAAAA,EAASwM,oBAAY,IAAA3d,GAAAA,UACrBwB,EAAA2P,aAAA,EAAAA,EAASyM,yBACTzM,aAAA,EAAAA,EAAS0M,eAEK1M,aAAO,EAAPA,EAAS2O,UAAW3O,EAAQ2O,SAASF,GAAQC,IAE9CZ,GACbM,EAAOhiB,KAAK,CAAEkE,KAAM,MAAO2K,KAAM6S,EAAMW,KAAIA,IACvClR,GACF6Q,EAAOhiB,KAAK,CAAEkE,KAAM,OAAQ2K,KAAMsC,KAGpC6Q,EAAOhiB,KAAK,CAAEkE,KAAM,OAAQ2K,KAAMuT,IAGpCH,EAAY9E,EACZsE,EAAQS,EAAMC,KAAKtT,EACpB,CAMD,OAJIoT,EAAYpT,EAAKxR,QACnB2kB,EAAOhiB,KAAK,CAAEkE,KAAM,OAAQ2K,KAAMA,EAAKtO,MAAM0hB,KAGxCD,CACT,CAmBiBQ,CAAa3T,EAAM+E,GAClC,GAAsB,IAAlBoO,EAAO3kB,OAAc,MAAO,GAEhC,IAAMolB,EAAOT,EACVhX,IAAI,SAAC0X,GACJ,GAAmB,SAAfA,EAAMxe,KACR,OAAOyd,GAAWe,EAAM7T,MAG1B,IAAM8T,GAAY/O,aAAO,EAAPA,EAAS7O,WAAY,WAAAvE,OAAWoT,EAAQ7O,eAAe,GACnEyG,EAAgBnH,EAAW,wBAA0B,GAC3D,MAAO,mBAAYsd,GAAWe,EAAML,MAAmD,+CAAA7hB,OAAAmiB,iEAAgEnX,EAAa,MAAAhL,OAAKmhB,GAAWe,EAAM7T,aAC5L,GACC3G,KAAK,IAGR,OAAI2G,EAAK+T,SAAS,MACT,GAAGpiB,OAAAiiB,EAAkC,+BAAAjiB,OA1BnC,eA4BJiiB,CACT,EAEMI,GAAiB,SAACC,GACtB,IAAMC,EAAYjV,OAAOkV,eACzB,IAAKD,GAAsC,IAAzBA,EAAUE,WAAkB,OAAO,EAErD,IAAMC,EAAQH,EAAUI,WAAW,GACnC,IAAKL,EAAU9K,SAASkL,EAAME,gBAAiB,OAAO,EAEtD,IAAMC,EAAWH,EAAMI,aAGvB,OAFAD,EAASE,mBAAmBT,GAC5BO,EAASG,OAAON,EAAME,eAAgBF,EAAMO,aACrC5B,GAAqBwB,EAAS1Z,YAAYtM,MACnD,EA2EMqmB,GAAW3S,EAAUA,WACzB,SACEtO,EAoBAuO,GAnBE,IAAA/M,aAAAI,cAAgBJ,EAChBE,EAAa1B,EAAAmG,MAAbA,OAAK,IAAAzE,GAAQA,EACbC,aAAA6M,cAAgB7M,EAChBE,EAAA7B,EAAAkhB,UAAAA,OAAS,IAAArf,GAAQA,EACjBsf,EAASnhB,EAAAmhB,UACTnf,cAAAM,aAAY,GAAEN,EACdnB,EAAKb,EAAAa,MACLgO,EAAW7O,EAAA6O,YACXhT,UACAiT,iBACA3M,EAAAnC,EAAAohB,KAAAA,OAAI,IAAAjf,EAAG,EAACA,EACRE,EAAgBrC,EAAAqhB,SAAhBA,OAAW,IAAAhf,KACX0M,EAAQ/O,EAAA+O,SACRC,EAAOhP,EAAAgP,QACPC,EAAMjP,EAAAiP,OACNzM,YAAA8e,cAAe9e,EACf+e,EAAcvhB,EAAAuhB,eACXpS,EAASpU,EAAAiF,EAlBd,6LAsBQ2C,EAA6BtE,IAAUH,aAAvCA,OAAY,IAAAyE,EAAG,UAASA,EAC1B6e,EAAcnS,SAA4B,MAC1CoS,EAAcpS,SAAuB,MACrCqS,EAAiBrS,UAAO,GACxBsS,EAAiBtS,SAAsB,MACvCtM,EAAoCuM,EAAM1M,SAC9CkM,GAAgBjT,GAAS,IADpB0T,OAAeC,OAGhBmC,EAAwBrC,EAAM1M,UAAS,GAAtCX,EAAO0P,EAAA,GAAElC,OACVqC,EAAsBxC,EAAM1M,cAA6BgN,GAAxDrQ,EAAMuS,EAAA,GAAE8P,OAGfxZ,EAAAA,UAAU,WACW,mBAARmG,EACTA,EAAI+S,EAAU,KAAOE,EAAY9R,SACxBnB,IACRA,EAA2DmB,QAC1D4R,EAAU,KAAOE,EAAY9R,QAEnC,EAAG,CAACnB,EAAK+S,IAGT,IAAM3R,OAAyBC,IAAV/T,EACfgU,EAAeF,EAAe9T,EAAQ0T,EACtCsS,EAAgB/N,OAAOjE,GAAgB,IAAIjV,OAS3CknB,EAAc,SAAC9mB,GACnByU,GAAW,GACXT,SAAAA,EAAUhU,EACZ,EAEM+mB,EAAa,SAAC/mB,GAClByU,GAAW,GACXR,SAAAA,EAASjU,EACX,EAEMgnB,EAAoB9N,EAAAA,QACxB,WAAM,MAAsB,iBAAdiN,EAAyBA,OAAYvR,CAAU,EAC7D,CAACuR,IAIH/Y,EAAAA,UAAU,WACR,IAAKkZ,GAAWD,GAAYG,EAAY9R,QAAS,CAC/C,IAAMuS,EAAWT,EAAY9R,QACvBwS,EACgB,iBAAbb,GAAwBA,EAASa,SAAe,EACnDC,EACgB,iBAAbd,EAAwBA,EAASc,aAAUvS,EAGpDqS,EAASphB,MAAMtB,OAAS,OACxB,IAAM6iB,EAAeH,EAASG,aAGxBziB,EAAa4a,SACjBlP,OAAOgX,iBAAiBJ,GAAUtiB,YAAc,KAChD,IAEI6X,EAAY0K,EAAUviB,EACtBgY,EAAYwK,EAAUA,EAAUxiB,OAAaiQ,EAE/C0S,EAAYtb,KAAKyN,IAAI2N,EAAc5K,GACnCG,IACF2K,EAAYtb,KAAKwN,IAAI8N,EAAW3K,IAGlCsK,EAASphB,MAAMtB,OAAS,GAAGxB,OAAAukB,QAC3BV,EAAUU,EACX,CACF,EAAE,CAACzS,EAAcwR,EAAUC,IAG5BlZ,EAAAA,UAAU,WACR,GAAKkZ,GAAYD,GAAaI,EAAY/R,QAA1C,CACA,IAAM6S,EAAWd,EAAY/R,QACvBwS,EAA8B,iBAAbb,GAAwBA,EAASa,SAAe,EACjEC,EAA8B,iBAAbd,EAAwBA,EAASc,aAAUvS,EAE5DjQ,EAAa4a,SACjBlP,OAAOgX,iBAAiBE,GAAU5iB,YAAc,KAChD,IAEI6X,EAAY0K,EAAUviB,EAAa,GACnCgY,EAAYwK,EAAUA,EAAUxiB,EAAa,QAAKiQ,EAExD2S,EAAS1hB,MAAMtB,OAAS,OACxB,IAAI+iB,EAAYtb,KAAKyN,IAAI8N,EAASH,aAAc5K,GAC5CG,IACF2K,EAAYtb,KAAKwN,IAAI8N,EAAW3K,IAElC4K,EAAS1hB,MAAMtB,OAAS,GAAGxB,OAAAukB,QAC3BC,EAAS1hB,MAAM2hB,UAAY7K,GAAa4K,EAASH,aAAezK,EAAY,OAAS,SACrFiK,EAAUU,EAnBgD,CAoB3D,EAAE,CAACjB,EAAUxR,EAAcyR,IAE5BmB,EAAAA,gBAAgB,iBACd,GAAKnB,GAAYG,EAAY/R,UAAWgS,EAAehS,QAAvD,CACA,IAAM6S,EAAWd,EAAY/R,QACvBoL,EAAWxP,SAASoX,gBAAkBH,EACtCI,EAAiB7H,EAAWsF,GAAemC,GAAY,EACvDK,EAAoC,QAAtB5iB,EAAA2hB,EAAejS,eAAO,IAAA1P,EAAAA,EAAI2iB,EACxCE,EAAWvD,GACfxL,OAAOjE,GAAgB,IACvB0R,EACA3f,GAOF,GAJI2gB,EAASO,YAAcD,IACzBN,EAASO,UAAYD,GAGnB/H,EAAU,CACZ,IAAMiI,EAAYjP,OAAOjE,GAAgB,IAAIjV,QAzN9B,SAACylB,EAAwB2C,GAC9C,IAAMvC,EAAQnV,SAAS2X,cACjB3C,EAAYjV,OAAOkV,eACzB,GAAKD,EAAL,CAMA,IAJA,IAAI4C,EAAYlc,KAAKyN,IAAI,EAAGuO,GACtBG,EAAS7X,SAAS8X,iBAAiB/C,EAAWgD,WAAWC,WAC3DC,EAAcJ,EAAOK,WAElBD,GAAa,CAIlB,IAHA,IAAME,EAAUF,EAAYG,aAAe,GACvCC,EAAe,EACfC,GAAsB,EACjBnpB,EAAI,EAAGA,EAAIgpB,EAAQ7oB,OAAQH,GAAK,EAIvC,GA7DO,MA0DHgpB,EAAQhpB,KACVkpB,GAAgB,GAEdA,IAAiBT,EAAW,CAC9BU,EAAqBnpB,EAAI,EACzB,KACD,CAGH,GAAkB,IAAdyoB,EAKF,OAJAzC,EAAMoD,SAASN,EAAa,GAC5B9C,EAAMqD,UAAS,GACfxD,EAAUyD,uBACVzD,EAAU0D,SAASvD,GAIrB,IAA4B,IAAxBmD,EAKF,OAJAnD,EAAMoD,SAASN,EAAaK,GAC5BnD,EAAMqD,UAAS,GACfxD,EAAUyD,uBACVzD,EAAU0D,SAASvD,GAIrByC,GAAaS,EACbJ,EAAcJ,EAAOK,UACtB,CAED/C,EAAMK,mBAAmBT,GACzBI,EAAMqD,UAAS,GACfxD,EAAUyD,kBACVzD,EAAU0D,SAASvD,EA3CI,CA4CzB,CA2KQwD,CAAe1B,EAAUvb,KAAKwN,IAAIoO,EAAaG,GAChD,CACDpB,EAAejS,QAAU,IAnB8C,CAoBxE,EAAE,CAACG,EAAcjO,EAAU0f,EAASC,IAErC,IAAM2C,GAAe,SAACC,GAKpBpV,SAAAA,EAJuB,CACrBgB,OAAQ,CAAElU,MAAOsoB,GACjBnZ,cAAe,CAAEnP,MAAOsoB,IAG5B,EAEMC,GAAsB,WAC1B,GAAK3C,EAAY/R,UAAWgS,EAAehS,QAA3C,CACAiS,EAAejS,QAAU0Q,GAAeqB,EAAY/R,SACpD,IAAM2U,EAAWjF,GAAqBqC,EAAY/R,QAAQgU,aAAe,IACnES,EAAYnC,EAAoBqC,EAASvmB,MAAM,EAAGkkB,GAAqBqC,EAExE1U,GACHH,EAAiB2U,GAEnBD,GAAaC,EAR8C,CAS7D,EAqEM9T,GACJhW,EAAAA,EAAA,CAAAqG,MAAO,OACP4P,UAAW,aACXhM,WAAY,sBACZS,aAAc,MACdpB,OAAQ,oBAAawC,EAAQ,UAAYlE,EAAU/D,EAAe,WAClE4G,gBAAiBlD,GAAuB4M,EAAZ,UAAmC,UAC/DtO,MAAO0B,EAAW,UAAY,UAC9BlC,SAAU,OACV6E,WAAY,IACZ5E,WAAY,OACZsF,QAAS,YACTrB,UAAW,mCACXc,WAAY,WACZD,QAAS,OACT6f,OAAQjD,GAAYC,EAAU,OAAS,WACvC9c,OAAQ5C,EAAW,cAAgB,OACnC2O,iBAAkB,OAClBE,WAAY,aACGb,IAAXrQ,GAAwB8hB,EAAW,CAAE9hB,OAAQ,UAAGA,EAAM,OAAS,CAAE,GAClEsB,GAgDL,OACEV,EAAAA,KAAAE,EAAAA,SAAA,CAAAE,SAAA,CACEC,MAAQ,QAAA,CAAAD,SA9Cc,utCA+CtBJ,EAAAC,KAAA,MAAA,CACEkC,UAAW,wBAAwBvE,OAAAuE,GACnCzB,MAAO,CACLqD,SAAU,WACVC,QAAS,cACT6E,cAAe,SACftI,MAAO,QACRH,SAAA,CAEA+gB,EACC9gB,MACE,MAAA,CAAA+N,IAAKkT,EACLnf,UAAU,wBACViiB,iBAAkB3iB,IAAa4M,EAC/BgW,gCAA8B,EAC9BxI,KAAK,UACU,iBAAA,uBACApa,EAAQ,mBACLiN,GAAe,GACjC4V,QAASL,GACTM,QA9JkB,SAAC1pB,SAE3B,GADAA,EAAE0K,kBACE8I,IAAY5M,EAAhB,CAEA,IAaU6e,EACAG,EAdJ+D,EAAa3pB,EAAE4pB,cAAcC,QAAQ,cACrCC,EAAchR,OAAOjE,GAAgB,IACrCyQ,EAAYjV,OAAOkV,eACrBwE,EAAW,GAAAhnB,OAAG+mB,GAAc/mB,OAAA4mB,GAC5B/B,EAAckC,EAAYlqB,OAAS+pB,EAAW/pB,OAElD,GACE0lB,GACAA,EAAUE,WAAa,IACJ,QAAnBxgB,EAAAyhB,EAAY/R,eAAO,IAAA1P,OAAA,EAAAA,EAAEuV,SAAS+K,EAAU0E,aACxC,CACA,IAAMhE,EAAcZ,GAAeqB,EAAY/R,SACzCuV,GACExE,EAAQH,EAAUI,WAAW,IAC7BE,EAAWH,EAAMI,cACdC,mBAAmBW,EAAY/R,SACxCkR,EAASG,OAAON,EAAMyE,aAAczE,EAAMwE,WACnCrE,EAAS1Z,WAAWtM,QAE7BmqB,EACED,EAAYhnB,MAAM,EAAGkjB,GACrB2D,EACAG,EAAYhnB,MAAMmnB,GACpBrC,EAAc5B,EAAc2D,EAAW/pB,MACxC,CAEGonB,IACF+C,EAAWA,EAASjnB,MAAM,EAAGkkB,GAC7BY,EAAc5b,KAAKwN,IAAIoO,EAAamC,EAASnqB,SAE/C+mB,EAAejS,QAAUkT,EAEpBjT,GACHH,EAAiBuV,GAEnBb,GAAaa,EArCoB,CAsCnC,EAuHUrU,UArHoB,SAAC1V,WAC7B,GAAc,UAAVA,EAAE2V,MAAmB3V,EAAEmqB,YAAYC,cACnCxjB,IAAY4M,GACXiT,EAAY/R,QAAjB,CAEA1U,EAAE0K,iBACF,IAAMof,EAAchR,OAAOjE,GAAgB,IACrCwV,EAnPgB,SAC1BhF,GAEA,IAAMC,EAAYjV,OAAOkV,eACzB,IAAKD,GAAsC,IAAzBA,EAAUE,WAAkB,OAAO,KACrD,IAAMC,EAAQH,EAAUI,WAAW,GACnC,IAAKL,EAAU9K,SAASkL,EAAME,kBAAoBN,EAAU9K,SAASkL,EAAMyE,cACzE,OAAO,KAGT,IAAMI,EAAa7E,EAAMI,aACzByE,EAAWxE,mBAAmBT,GAC9BiF,EAAWvE,OAAON,EAAME,eAAgBF,EAAMO,aAE9C,IAAMuE,EAAW9E,EAAMI,aAIvB,OAHA0E,EAASzE,mBAAmBT,GAC5BkF,EAASxE,OAAON,EAAMyE,aAAczE,EAAMwE,WAEnC,CACLxK,MAAO2E,GAAqBkG,EAAWpe,YAAYtM,OACnD8f,IAAK0E,GAAqBmG,EAASre,YAAYtM,OAEnD,CA6NsB4qB,CAAoB/D,EAAY/R,SAC1C+K,EAAsB,QAAdza,EAAAqlB,aAAO,EAAPA,EAAS5K,aAAK,IAAAza,EAAAA,EAAI8kB,EAAYlqB,OACtC8f,EAAsB,QAAhBlZ,EAAA6jB,aAAA,EAAAA,EAAS3K,WAAO,IAAAlZ,EAAAA,EAAAiZ,EAExBsK,EAAW,GAAAhnB,OAAG+mB,EAAYhnB,MAAM,EAAG2c,GAAM,MAAA1c,OAAK+mB,EAAYhnB,MAAM4c,IAChEsH,IACF+C,EAAWA,EAASjnB,MAAM,EAAGkkB,IAG/B,IAAMyD,EAAYze,KAAKwN,IAAIiG,EAAQ,EAAGsK,EAASnqB,QAC/C+mB,EAAejS,QAAU+V,EAEpB9V,GACHH,EAAiBuV,GAEnBb,GAAaa,EAnBoB,CAoBnC,EA+FU/V,QAAS,SAAChU,GAAM,OAAA8mB,EAAY9mB,EAAsD,EAClFiU,OAAQ,SAACjU,GAAM,OAAA+mB,EAAW/mB,IAC1B0qB,mBAAoB,WAClBhE,EAAehS,SAAU,CAC1B,EACDiW,iBAAkB,WAChBjE,EAAehS,SAAU,EACzB0U,IACF,EACAvjB,MAAKxG,EAAAA,EAAA,CAAA,EACAgW,IAAU,CACbmH,UAAW6J,OAAWzR,EAAY,UAAU,GAAPwR,EAAY,GAAM,MACvDoB,UAAWnB,EAAW,SAAW,SAEnCxQ,YAAa1B,EAAU0B,aAAe,MACtCC,eAAgB3B,EAAU2B,gBAAkB,MAC5CC,WAAY5B,EAAU4B,aAAc,IAGtCvQ,EAAAA,IAAA,WAAAnG,EAAA,CACEkU,IAAKiT,EACL3lB,MAAOgU,EACPhB,YAAaA,EACbjN,SAAUA,EACV4M,SAAUA,EACV4S,KAAMC,OAAWzR,EAAYwR,EAC7BD,UAAWA,EACXpS,SAnTW,SAAC/T,GACf2U,GACHH,EAAiBxU,EAAE+U,OAAOlU,OAE5BkT,SAAAA,EAAW/T,EACb,EA+SUgU,QAAS8S,EACT7S,OAAQ8S,EACRlhB,MAAOwP,GACPO,aAAczB,EAAUyB,cAAgB,MACxCC,YAAa1B,EAAU0B,aAAe,MACtCC,eAAgB3B,EAAU2B,gBAAkB,MAC5CC,WAAY5B,EAAU4B,aAAc,GAChC5B,KAGR+R,GAAaC,IACb3gB,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLsD,QAAS,OACTE,eAAgB,WAChByG,UAAW,MACXpL,SAAU,OACVC,WAAY,OACZO,MAAO0B,EAAW,UAAY,UAC9B0C,WAAY,uBAGb/D,SAAA4gB,EACChhB,EAAAA,uBACG0hB,EAAa,MAAKV,KAGrB3gB,EAAAA,IAAO,OAAA,CAAAD,SAAAshB,WAOnB,GAGFZ,GAASlb,YAAc,WCvqBjB,IAAA6f,GAAgC,SAAC5lB,OAC5B6lB,EAAiB7lB,EAAAub,QAC1B/Z,EAAsBxB,EAAA8lB,eAAtBA,OAAiB,IAAAtkB,GAAKA,EACtBE,EAAgB1B,EAAA4B,SAAhBA,OAAW,IAAAF,GAAKA,EAChBqN,EAAQ/O,EAAA+O,SACR7M,EAAOlC,EAAAkC,QACP6jB,EAAe/lB,EAAA+lB,gBACfC,EAAiBhmB,EAAAgmB,kBACjBrkB,SAAA1B,aAAO,UAAS0B,EAChBE,EAAA7B,EAAA8B,QAAAA,cAAeD,EACfG,EAAAhC,EAAAsC,UAAAA,aAAY,GAAEN,EACdnB,EAAKb,EAAAa,MAEGsB,EAA6B9D,IAAUH,aAAvCA,OAAY,IAAAiE,EAAG,UAASA,EAC1BE,EAAwCiN,EAAM1M,SAASkjB,GAAtDG,EAAe5jB,EAAA,GAAE6jB,OAClBvW,OAAqCC,IAAtBiW,EACftK,EAAU5L,EAAekW,EAAoBI,EA+B7CE,EAjBa,CACjBtnB,MAAO,CACL6B,MAAO,OACPnB,OAAQ,OACR6mB,UAAW,OACXC,YAAa,MACb3mB,SAAU,QAEZL,QAAS,CACPqB,MAAO,OACPnB,OAAQ,OACR6mB,UAAW,OACXC,YAAa,MACb3mB,SAAU,SAIYO,GACpBqmB,EAAY/K,GAAWzZ,EAGvBgD,EAAkBlD,EACpB,UACA0kB,EACApoB,EACA,UAGEqoB,EAAYD,EACd,sBAAeH,EAAOC,UAAe,OAAAroB,OAAAooB,EAAOE,YAAc,KAC1DF,EAAOE,YAEX,OACElmB,iBACEsB,KAAK,SACLua,KAAK,SAAQ,eACCT,EACd3Z,SAAUA,GAAYE,EACtBI,QAlDgB,SAAClH,GACnB,IAAI4G,IAAYE,EAAhB,CAEA,IAAM0kB,GAAcjL,EACf5L,GACHuW,EAAmBM,GAErBzX,SAAAA,EAAWyX,EAAYxrB,GACvBkH,SAAAA,EAAUskB,EAAYxrB,EAPU,CAQlC,EA0CIsH,UAAW,cAAAvE,OAAcuE,GACzBzB,MACExG,EAAA,CAAA6J,SAAU,WACVC,QAAS,cACTC,WAAY,SACZC,eAAgBiiB,EAAY,WAAa,aACzC5lB,MAAOylB,EAAOzlB,MACdnB,OAAQ4mB,EAAO5mB,OACf0F,QAAS,IACTuV,OAAQ,IACR7W,OAAQ,OACRoB,aAAuB,UAAT9E,EAAmB,OAAS,OAC1C6E,kBACAN,OAAQ5C,GAAYE,EAAU,cAAgB,UAC9C4C,WAAY,WACZD,QAAS,OACT6L,UAAW,cACRzP,GAAKN,SAAA,EAIRwlB,GAAmBC,IACnBxlB,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLqD,SAAU,WACV2E,KAAMyd,EAAY,MAAQ,OAC1Bpd,MAAOod,EAAY,OAAS,MAC5B5mB,SAAUymB,EAAOzmB,SACjBC,WAAY,IACZO,MAAO,UACPoE,WAAY,sBACZC,WAAY,IACZG,WAAY,eACZrD,QAASO,EAAW,GAAM,EAC1BkH,OAAQ,EACRC,cAAe,QAChBxI,SAEA+lB,EAAYP,EAAkBC,IAKnCxlB,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLqD,SAAU,WACV2E,KAAM0d,EACN3d,IAAK,MACL8B,UAAW,mBACXhK,MAAOylB,EAAOC,UACd7mB,OAAQ4mB,EAAOC,UACfrhB,aAAc,MACdD,gBAAiB,UACjBlB,UAAW,+BACXc,WAAY,mCACZP,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChByE,OAAQ,GACTvI,SAEAuB,GACC3B,cACEO,MAAgB,UAATT,EAAmB,IAAM,KAChCV,OAAiB,UAATU,EAAmB,IAAM,KACjCU,QAAQ,YACRC,KAAK,OACLC,MAAO,CACLC,UAAW,2BACZP,SAAA,CAEDC,wBACG,qLAOHA,EAAAA,IAAA,SAAA,CACEQ,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAO,eACPC,YAAY,IACZE,cAAc,QACd4a,gBAAgB,KAChBC,iBAAiB,KACjB9a,QAAQ,QAEVb,gBACEQ,GAAG,KACHC,GAAG,KACHC,EAAE,KACFC,OAAO,eACPC,YAAY,IACZE,cAAc,QACd4a,gBAAgB,KAChBC,iBAAiB,cAO/B,EAEAyJ,GAAO7f,YAAc,SC9FrB,IAAM0gB,GAAkB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAChGC,GAAiB,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAGhIC,GAAa,SAACC,EAAmBC,GACrC,QADqC,IAAAA,IAAAA,EAA6B,eAC7DD,EAAM,MAAO,GAElB,IAAME,EAAOF,EAAKG,cACZC,EAAQJ,EAAKK,WACbC,EAAWpT,OAAOkT,EAAQ,GAAGG,SAAS,EAAG,KACzCC,EAAMtT,OAAO8S,EAAKS,WAAWF,SAAS,EAAG,KACzCG,EAASxT,OAAO8S,EAAKS,WAkC3B,OApBaR,EAEV1H,QAAQ,QAZc,KAatBA,QAAQ,MAZY,KAapBA,QAAQ,QAZc,KAatBA,QAAQ,OAZa,KAarBA,QAAQ,MAZY,KAapBA,QAAQ,MAXY,KAYpBA,QAAQ,KAXW,KAYnBA,QAAQ,KAdW,KAgBnBA,QAAQ,IAAIE,OArBU,IAqBe,KAAMvL,OAAOgT,IAClD3H,QAAQ,IAAIE,OArBQ,IAqBe,KAAMvL,OAAOgT,GAAMhpB,OAAO,IAC7DqhB,QAAQ,IAAIE,OArBU,IAqBe,KAAMqH,GAAeM,IAC1D7H,QAAQ,IAAIE,OArBS,IAqBe,KAAMoH,GAAgBO,IAC1D7H,QAAQ,IAAIE,OArBQ,IAqBe,KAAM6H,GACzC/H,QAAQ,IAAIE,OArBO,IAqBe,KAAMvL,OAAOkT,EAAQ,IACvD7H,QAAQ,IAAIE,OArBQ,IAqBe,KAAM+H,GACzCjI,QAAQ,IAAIE,OArBO,IAqBe,KAAMiI,EAG7C,EAQMC,GAAiB,SAACT,EAAcE,GACpC,OAAO,IAAIQ,KAAKV,EAAME,EAAQ,EAAG,GAAGK,SACtC,EAGMI,GAAY,SAACC,EAAoBC,GACrC,SAAKD,IAAUC,KAEbD,EAAMX,gBAAkBY,EAAMZ,eAC9BW,EAAMT,aAAeU,EAAMV,YAC3BS,EAAML,YAAcM,EAAMN,UAE9B,EAGMO,GAAgB,SAAChB,EAAYiB,EAAgBC,GACjD,QAAID,GAAWjB,EAAOiB,MAClBC,GAAWlB,EAAOkB,EAExB,EAsBMC,GAAwC,SAACjhB,GAE3C,IAAA9G,EAgCE8G,EAhCWsK,KAAbA,OAAI,IAAApR,EAAG,OAAMA,EACbwB,EA+BEsF,EAAKlF,SA/BPA,OAAW,IAAAJ,GAAKA,EAChBE,EA8BEoF,EA9BWX,MAAbA,OAAK,IAAAzE,GAAQA,EACbC,EA6BEmF,EAAK+H,YA7BPA,OAAc,IAAAlN,EAAA,cAAaA,EAC3BE,EA4BEiF,EA5B6BkhB,iBAA/BA,OAAgB,IAAAnmB,EAAG,aAAYA,EAC/BG,EA2BE8E,EAAKmhB,eA3BPA,OAAiB,IAAAjmB,EAAA,WAAUA,EAC3BG,EA0BE2E,EA1Ba7G,KAAfA,OAAI,IAAAkC,EAAG,SAAQA,EACfE,EAyBEyE,EAzBgB6H,WAAlBA,OAAU,IAAAtM,GAAQA,EAClBG,EAwBEsE,EAAK+f,OAxBPA,OAAS,IAAArkB,EAAS,UAAT4O,EAAmB,cAAgB,aAAY5O,EACxDwM,EAuBElI,EAAKkI,QAtBPC,EAsBEnI,EAtBImI,OACNiZ,EAqBEphB,EAAKohB,aApBPvlB,EAoBEmE,EAAKxE,UApBPA,OAAY,IAAAK,EAAA,GAAEA,EACd9B,EAmBEiG,EAAKjG,MAlBPkC,EAkBE+D,EAAK8K,kBAlBPA,aAAoB,GAAE7O,EACtB8O,EAiBE/K,EAjBW+K,cACbF,EAgBE7K,EAhBiBiL,YAAnBA,OAAW,IAAAJ,GAAQA,EACbK,EAeJlL,EAfkBmL,KACpB4V,EAcE/gB,EAAK+gB,QAbPC,EAaEhhB,EAbKghB,QACPhW,EAYEhL,EAZeqhB,UAAjBA,OAAS,IAAArW,EAAG,MAAKA,EACjBO,EAWEvL,EAAKshB,aAXPA,OAAe,IAAA/V,GAAKA,EACpBC,EAUExL,EAVeuhB,cAAjBA,OAAa,IAAA/V,EAAG,EAACA,EACjBC,EASEzL,EAAKwhB,gBATPA,cAAuB/V,EACvBG,EAQE5L,EAAKyhB,UARPA,OAAY,IAAA7V,EAAA,QAAOA,EACnBG,EAOE/L,EAPmB0hB,WAArBA,OAAU,IAAA3V,EAAG,SAAQA,EACrB4V,EAME3hB,EANK2hB,QACPC,EAKE5hB,EAAK4hB,SAJPxV,EAIEpM,EAJuB6hB,kBAAzBA,OAAiB,IAAAzV,GAAQA,EACzB0V,GAGE9hB,EAAK+hB,uBAHPA,QAAyB,IAAAD,GAAA,eAAcA,GACvCE,GAEEhiB,EAFmCiiB,qBAArCA,QAAoB,IAAAD,GAAG,eAAcA,GACrCE,GACEliB,EAAKmiB,iBADPA,QAAmB,IAAAD,GAAA,WAGbE,GAA6B7qB,IAAUH,aAAvCA,QAAY,IAAAgrB,GAAG,UAASA,GAC1BC,GAAuB,UAAT/X,EAGdgY,GAAgDxmB,EAAAA,SAAsB,WAC1E,MAAa,SAATwO,GAAmB,iBAAkBtK,GAC3BA,EAAMgI,cAGb,IACT,GANOua,SAAqBC,SAStBC,GAA8C3mB,EAAAA,SAAoB,WACtE,MAAa,UAATwO,GAAoB,iBAAkBtK,GAC5BA,EAAMgI,cAGb,CAAE0a,UAAW,KAAMC,QAAS,KACrC,GANOC,SAAoBC,SAQrBC,GAAkChnB,EAAAA,SAASmP,GAA1CS,GAAYoX,GAAA,GAAEnX,GAAemX,GAAA,GAC9BC,GAAsCjnB,EAAAA,UAAS,GAA9CknB,GAAcD,GAAA,GAAEE,GAAmCF,GAAA,GACpDG,GAAsCpnB,EAAAA,SAA2B,MAAhEqnB,GAAcD,GAAA,GAAEE,GAAqDF,GAAA,GACtEG,GAAkCvnB,EAAAA,SAAS,WAE7C,IAmBM6d,EACAmG,EArBR,GAAa,SAATxV,GAAmB,UAAWtK,GAASA,EAAMjL,QACzC+qB,EAAO9f,EAAMjL,OAEjB,MAAO,CAAEirB,KAAMF,EAAKG,cAAeC,MAAOJ,EAAKK,YAGnD,GAAa,UAAT7V,GAAoB,UAAWtK,GAASA,EAAMjL,QAE1C+qB,GADAnG,EAAQ3Z,EAAMjL,OACD2tB,WAAa/I,EAAMgJ,SAEpC,MAAO,CAAE3C,KAAMF,EAAKG,cAAeC,MAAOJ,EAAKK,YAGnD,GAAa,SAAT7V,GAAmB,iBAAkBtK,GAASA,EAAMgI,eAChD8X,EAAO9f,EAAMgI,cAEjB,MAAO,CAAEgY,KAAMF,EAAKG,cAAeC,MAAOJ,EAAKK,YAGnD,GAAa,UAAT7V,GAAoB,iBAAkBtK,GAASA,EAAMgI,eAEjD8X,GADAnG,EAAQ3Z,EAAMgI,cACD0a,WAAa/I,EAAMgJ,SAEpC,MAAO,CAAE3C,KAAMF,EAAKG,cAAeC,MAAOJ,EAAKK,YAGnD,IAAMmD,EAAM,IAAI5C,KAChB,MAAO,CAAEV,KAAMsD,EAAIrD,cAAeC,MAAOoD,EAAInD,WAC/C,GA7BOoD,SAAcC,SAgCfC,GAAgC3nB,EAAAA,SAAiD,WACrF,GAAsB,IAAlBylB,GAAuBc,GAAa,CACtC,IAAMqB,EAAY,IAAIhD,KAAK6C,GAAavD,KAAMuD,GAAarD,MAAQ,EAAG,GACtE,MAAO,CAAEF,KAAM0D,EAAUzD,cAAeC,MAAOwD,EAAUvD,WAC1D,CACD,OAAO,IACT,GANOwD,SAAaC,SASpBtiB,EAAAA,UAAU,WACR,GAAsB,IAAlBigB,GAAuBc,GAAa,CACtC,IAAMqB,EAAY,IAAIhD,KAAK6C,GAAavD,KAAMuD,GAAarD,MAAQ,EAAG,GACtE0D,GAAe,CAAE5D,KAAM0D,EAAUzD,cAAeC,MAAOwD,EAAUvD,YAClE,MACCyD,GAAe,KAElB,EAAE,CAACL,GAAchC,EAAec,KAEjC,IAAMwB,GAAYtb,SAAuB,MACnCD,GAAWC,SAAyB,MACpCub,GAAgBvb,SAAyB,MACzCwb,GAAcxb,SAAyB,MACvC4D,GAAc5D,SAAuB,MACrCyb,GAA0CloB,EAAAA,SAA4F,MAArIuQ,GAAgB2X,GAAA,GAAE1X,GAAmB0X,GAAA,GACtCC,GAAe1b,UAAO,GACtB2b,GAAyB3b,UAAO,GAChC4b,GAAyB5b,SAAgC,MAGzDM,GAAe,UAAW7I,QAAyB8I,IAAhB9I,EAAMjL,MACzCwX,QAAsCzD,IAAnBoC,EAGnBkZ,GAAkC/B,GACpC,KACAxZ,IAAyB,SAATyB,GAAmB,UAAWtK,EAC7CA,EAAMjL,MACPwtB,GAEE8B,GAAgChC,GAElCxZ,IAAyB,UAATyB,GAAoB,UAAWtK,EAC9CA,EAAMjL,OAAuB,CAAE2tB,UAAW,KAAMC,QAAS,MAC1DC,GAHA,CAAEF,UAAW,KAAMC,QAAS,MAK1BnW,GAASD,GAAmBrB,EAAiBQ,GAInDpK,EAAAA,UAAU,WACR,GAAIkL,KAAWyX,GAAarb,QAAS,CAEnC,GAAIyZ,GAAa,CACf,IAAMvC,EAAOuE,GAAkB3B,WAAa2B,GAAkB1B,QAC9D,GAAI7C,EAAM,CACR,IAAMwE,EAAWxE,EAAKG,cAChBsE,EAAYzE,EAAKK,WACvBqD,GAAgB,CACdxD,KAAMsE,EACNpE,MAAOqE,GAEV,KAAM,CAEL,IAAMjB,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,CACF,MACC,GAAIiE,GAAoB,CAChBE,EAAWF,GAAmBnE,cAC9BsE,EAAYH,GAAmBjE,WACrCqD,GAAgB,CACdxD,KAAMsE,EACNpE,MAAOqE,GAEV,KAAM,CAECjB,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,CAEH8D,GAAarb,SAAU,CACxB,MAAW4D,KAEVyX,GAAarb,SAAU,EAE1B,EAAE,CAAC4D,GAAQ4X,GAAoBC,GAAmBhC,KAGnD/gB,EAAAA,UAAU,WACR,GAAIkL,IAAUqX,GAAUjb,QAAS,CAE/Bsb,GAAuBtb,SAAU,EACjCub,GAAuBvb,QAAU,KAEjC,IAAMyE,EAAiB,WACrB,GAAIwW,GAAUjb,QAAS,CACrB,IAAM4b,EAAOX,GAAUjb,QAAQ2E,wBAI/B,GAAI2W,GAAuBtb,SAA8C,OAAnCub,GAAuBvb,QAAkB,CAC7E,IACIoF,EADEyW,EAAYN,GAAuBvb,QAGzC,GAAIuD,GAAYvD,QAAS,CACvB,IAAM8b,EAAiBvY,GAAYvD,QAAQ6E,aAEzCO,EADgB,QAAdyW,EACID,EAAK1iB,IAAMyC,OAAO0J,QAAUyW,EAV5B,EAYAF,EAAKniB,OAASkC,OAAO0J,QAZrB,CAcT,MAECD,EAAoB,QAAdyW,EACFD,EAAK1iB,IAAMyC,OAAO0J,QAAU,IAjBxB,EAkBJuW,EAAKniB,OAASkC,OAAO0J,QAlBjB,EA2BV,YANA3B,GAAoB,CAClBxK,IAAGkM,EACHjM,KAAMyiB,EAAKziB,KAAOwC,OAAO2J,QACzBtU,MAAO4qB,EAAK5qB,MACZuU,UAASsW,GAGZ,CAID,IAAIE,EAAMH,EAAKniB,OAASkC,OAAO0J,QAhCnB,EAiCR2W,EAA8B,SAqClCtY,GAAoB,CAClBxK,IAAG6iB,EACH5iB,KAAMyiB,EAAKziB,KAAOwC,OAAO2J,QACzBtU,MAAO4qB,EAAK5qB,MACZuU,UAASyW,IAKXxW,sBAAsB,WACpBA,sBAAsB,YA5CE,WACxB,GAAIjC,GAAYvD,QAAS,CACvB,IAAM8b,EAAiBvY,GAAYvD,QAAQ6E,aAErCG,EADiBrJ,OAAOsJ,YACM2W,EAAKniB,OAxCjC,EAyCFyL,EAAa0W,EAAK1iB,IAzChB,GA4CJ8L,EAAa8W,GAAkB5W,GAAc4W,GAGtC9W,EAAa8W,GAAkB5W,EAAa4W,GAEjD5W,EAAaF,KAJjB+W,EAAMH,EAAK1iB,IAAMyC,OAAO0J,QAAUyW,EA7C5B,EA8CNE,EAAY,OAWdV,GAAuBtb,SAAU,EACjCub,GAAuBvb,QAAUgc,CAClC,CAEDtY,GAAoB,CAClBxK,IAAG6iB,EACH5iB,KAAMyiB,EAAKziB,KAAOwC,OAAO2J,QACzBtU,MAAO4qB,EAAK5qB,MACZuU,UAASyW,GAEb,CAcIC,EACF,EACF,EACD,CACH,EAOA,OALAxX,IAEA9I,OAAO8J,iBAAiB,SAAUhB,GAClC9I,OAAO8J,iBAAiB,SAAUhB,GAAgB,GAE3C,WACL9I,OAAO+J,oBAAoB,SAAUjB,GACrC9I,OAAO+J,oBAAoB,SAAUjB,GAAgB,EACvD,CACD,CACCf,GAAoB,MAEpB4X,GAAuBtb,SAAU,EACjCub,GAAuBvb,QAAU,IAErC,EAAG,CAAC4D,KAGJlL,EAAAA,UAAU,WACR,IAAMiN,EAAqB,SAACC,GAC1B,IAAMvF,EAASuF,EAAMvF,OAEnB4a,GAAUjb,UACTib,GAAUjb,QAAQ6F,SAASxF,IAC5BkD,GAAYvD,UACXuD,GAAYvD,QAAQ6F,SAASxF,KAEzBsD,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,GAEnB,EAEA,GAAI5U,GAGF,OAFAhI,SAAS6J,iBAAiB,YAAaE,GAAoB,GAC3D/J,SAAS6J,iBAAiB,aAAcE,GAAoB,GACrD,WACL/J,SAAS8J,oBAAoB,YAAaC,GAAoB,GAC9D/J,SAAS8J,oBAAoB,aAAcC,GAAoB,EACjE,CAEH,EAAE,CAAC/B,GAAQD,GAAkB6U,IAG9B,IA+wCoB0D,GAGAC,GACAC,GAndEC,GAh0BhBC,GAAyB1hB,cAAY,SAACsc,SACrCgB,GAAchB,EAAMiB,EAASC,KAE7BnY,IACH2Z,GAAuB1C,GAEZ,SAATxV,GAAmB,aAActK,IACe,QAAlD9G,EAAC8G,EAAMiI,gBAA2C,IAAA/O,GAAAA,EAAA5F,KAAA0M,EAAA8f,IAG/CvT,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,GACjB,EAAG,CAACvY,GAAc0D,GAAkBjC,EAAMtK,EAAOohB,EAAcL,EAASC,IAGlEmE,GAAwB3hB,cAAY,SAACsc,SACzC,GAAKgB,GAAchB,EAAMiB,EAASC,GAAlC,CAGA,IACIoE,EADEN,EAAetD,GAAmB2B,GAAiBA,GAAiBkB,GAItES,EAAapC,WAAaoC,EAAanC,SAEzCyC,EAAW,CACT1C,UAAW5C,EACX6C,QAAS,MAEXM,IAAkB,IACTD,GAEL8B,EAAanC,SAAW7C,EAAOgF,EAAanC,SAE9CyC,EAAW,CACT1C,UAAWoC,EAAanC,QACxBA,QAAS7C,GAEXmD,IAAkB,KAElBmC,EAAW,CACT1C,UAAW5C,EACX6C,QAASmC,EAAanC,SAGpBmC,EAAanC,SACfM,IAAkB,GACbzB,IAEEjV,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,KAGjB6B,IAAkB,IAKlB6B,EAAapC,WAAa5C,EAAOgF,EAAapC,WAEhD0C,EAAW,CACT1C,UAAW5C,EACX6C,QAASmC,EAAapC,WAExBO,IAAkB,KAElBmC,EAAW,CACT1C,UAAWoC,EAAapC,UACxBC,QAAS7C,GAGXmD,IAAkB,GACbzB,IAEEjV,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,KAKjBI,EAEF4B,GAAkBgC,IAGbvc,IACHga,GAAsBuC,GAEX,UAAT9a,GAAoB,aAActK,IACa,QAAjD9G,EAAC8G,EAAMiI,gBAA0C,IAAA/O,GAAAA,EAAA5F,KAAA0M,EAAAolB,IA7EF,CAgFpD,EAAE,CAACpC,GAAgBqB,GAAmBlB,GAAgB3B,EAAiB3Y,GAAc0D,GAAkBjC,EAAMtK,EAAOohB,EAAcL,EAASC,IAGtIhY,GAAc,SAAC9U,WAEnB,GADAA,EAAE+P,kBACEoe,GAAa,CACf,IAAM+C,EAAsB,CAAE1C,UAAW,KAAMC,QAAS,MACnD9Z,IACHga,GAAsBuC,GAEX,UAAT9a,GAAoB,aAActK,IACa,QAAjD9G,EAAC8G,EAAMiI,gBAA0C,IAAA/O,GAAAA,EAAA5F,KAAA0M,EAAAolB,IAEnDnC,IAAkB,EACnB,MACMpa,IACH2Z,GAAuB,MAEZ,SAATlY,GAAmB,aAActK,IACe,QAAlDtF,EAACsF,EAAMiI,gBAA2C,IAAAvN,GAAAA,EAAApH,KAAA0M,EAAA,OAKtD,IAAKwM,GAAQ,CACX,IAAM8W,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,CACH,EAGMkF,GAAe,WACnB,IAAIvqB,EAAJ,CACA,IAAMwV,GAAW9D,GAKjB,GAJKD,IACHZ,GAAgB2E,GAElB8Q,SAAAA,EAAe9Q,GACXA,GAEF,GAAI+R,IAOF,GANAY,IAAmBoB,GAAkB3B,WAEjClB,GACF4B,GAAkBiB,KAGfA,GAAkB3B,YAAc2B,GAAkB1B,QAAS,CAC9D,IAAMW,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,OAGD,IAAKiE,GAAoB,CACjBd,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,OAEO7P,GAAWkR,GAErB4B,GAAkB,KAlCC,CAoCvB,EA+BMkC,GAAsBlY,EAAAA,QAAQ,WAClC,IAAMmY,EAAQ,IAAI7E,KAClB6E,EAAMC,SAAS,EAAG,EAAG,EAAG,GAGxB,IAAMC,EAAc,IAAI/E,KAAK6E,GACvBG,EAAgB,IAAIhF,KAAK6E,GAC/BG,EAAcC,QAAQJ,EAAMhF,UAAY,GAGxC,IAAMqF,EAAe,IAAIlF,KAAK6E,GACxBM,EAAiB,IAAInF,KAAK6E,GAC1BO,EAAeP,EAAMhF,UAC3BsF,EAAeE,SAASR,EAAMpF,WAAa,GAGvC0F,EAAetF,YAAcuF,GAE/BD,EAAeF,QAAQ,GAIzB,IAAMK,EAAc,IAAItF,KAAK6E,GACvBU,EAAgB,IAAIvF,KAAK6E,GAG/B,OAFAU,EAAcC,YAAYX,EAAMtF,cAAgB,GAEzC,CACL,CAAEtqB,MAAO,YAAagkB,MAAO,CAAE+I,UAAWgD,EAAe/C,QAAS8C,IAClE,CAAE9vB,MAAO,aAAcgkB,MAAO,CAAE+I,UAAWmD,EAAgBlD,QAASiD,IACpE,CAAEjwB,MAAO,YAAagkB,MAAO,CAAE+I,UAAWuD,EAAetD,QAASqD,IAErE,EAAE,IAGGG,GAAmB/Y,EAAAA,QAAQ,WAC/B,OAAIla,MAAM0Z,QAAQ0U,GAETA,GACmB,IAAjBA,EAEFgE,GAGA,EAEX,EAAG,CAAChE,EAAcgE,KAGZc,GAAkBD,GAAiBryB,OAAS,EAG5CuyB,GAA0B,SAAC1M,SAE/B,GAAIA,EAAM+I,UAAW,CACnB,IAAM4D,EAAY3M,EAAM+I,UAAUzC,cAC5BsG,EAAa5M,EAAM+I,UAAUvC,WACnCqD,GAAgB,CACdxD,KAAMsG,EACNpG,MAAOqG,GAEV,CAEG/E,EACF4B,GAAkBzJ,IAEb9Q,IACHga,GAAsBlJ,GAEX,UAATrP,GAAoB,aAActK,IACa,QAAjD9G,EAAC8G,EAAMiI,gBAA0C,IAAA/O,GAAAA,EAAA5F,KAAA0M,EAAA2Z,IAE9CpN,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,GAEnB,EAqDMoF,GAAkB,WACtBhD,GAAgB,SAAC7U,GACf,OAAmB,IAAfA,EAAKuR,MACA,CAAEF,KAAMrR,EAAKqR,KAAO,EAAGE,MAAO,IAEhC,CAAEF,KAAMrR,EAAKqR,KAAME,MAAOvR,EAAKuR,MAAQ,EAChD,EACF,EAGMuG,GAAkB,WACtBjD,GAAgB,SAAC7U,GACf,OAAmB,KAAfA,EAAKuR,MACA,CAAEF,KAAMrR,EAAKqR,KAAO,EAAGE,MAAO,GAEhC,CAAEF,KAAMrR,EAAKqR,KAAME,MAAOvR,EAAKuR,MAAQ,EAChD,EACF,EAGMwG,GAAuBljB,EAAAA,YAAY,SAACwc,EAAcE,GAKtD,IAJA,IAAMyG,EAAclG,GAAeT,EAAME,GACnC0G,EAAwB,GAGrBtG,EAAM,EAAGA,GAAOqG,EAAarG,IACpCsG,EAAKnwB,KAAK,IAAIiqB,KAAKV,EAAME,EAAOI,IAGlC,OAAOsG,CACR,EAAE,IAGGC,GAAezZ,EAAAA,QAAQ,WAC3B,OAAOsZ,GAAqBnD,GAAavD,KAAMuD,GAAarD,MAC9D,EAAG,CAACqD,GAAcmD,KAGZI,GAAqB1Z,EAAAA,QAAQ,WACjC,OAAsB,IAAlBmU,GAAuBc,IAAesB,GACjC+C,GAAqB/C,GAAY3D,KAAM2D,GAAYzD,OAErD,IACR,EAAE,CAACqB,EAAec,GAAasB,GAAa+C,KAGvCK,GAAwB,WACxBpD,IACFC,GAAe,SAACjV,GACd,OAAKA,EACc,IAAfA,EAAKuR,MACA,CAAEF,KAAMrR,EAAKqR,KAAO,EAAGE,MAAO,IAEhC,CAAEF,KAAMrR,EAAKqR,KAAME,MAAOvR,EAAKuR,MAAQ,GAJ5B,IAKpB,EAEJ,EAEM8G,GAAwB,WACxBrD,IACFC,GAAe,SAACjV,GACd,OAAKA,EACc,KAAfA,EAAKuR,MACA,CAAEF,KAAMrR,EAAKqR,KAAO,EAAGE,MAAO,GAEhC,CAAEF,KAAMrR,EAAKqR,KAAME,MAAOvR,EAAKuR,MAAQ,GAJ5B,IAKpB,EAEJ,EAGM9W,GAAa,CACjBrR,MAAO,CACLU,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdb,YAAa,CACXS,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdZ,OAAQ,CACNQ,OAAQ,OACR4Q,WAAY,MACZC,cAAe,MACf1Q,SAAU,OACVC,WAAY,QAEdX,MAAO,CACLO,OAAQ,OACR4Q,WAAY,OACZC,cAAe,OACf1Q,SAAU,OACVC,WAAY,SAIVsQ,GAAYtB,IAAe/M,IAC/BunB,GACKgC,GAAkB3B,WAAa2B,GAAkB1B,QAClDyB,IAGA6C,GAAqB7C,GAAqBvE,GAAWuE,GAAoBrE,GAAU,GACnFmH,GAAoB7C,GAAkB3B,UAAY7C,GAAWwE,GAAkB3B,UAAW3C,GAAU,GACpGoH,GAAkB9C,GAAkB1B,QAAU9C,GAAWwE,GAAkB1B,QAAS5C,GAAU,GAG9FqH,GAAiBha,EAAAA,QAAQ,WAC7B,IAAKiV,IAAoC,SAArBF,GAA6B,MAAO,GAKxD,GAAIkC,GAAkB3B,WAAa2B,GAAkB1B,QAAS,CAC5D,IAAMoC,EAAYlF,GAAWwE,GAAkB3B,UAAW,eACpDsC,EAAUnF,GAAWwE,GAAkB1B,QAAS,eACtD,MAAO,UAAGoC,EAAS,KAAA9tB,OAAIoqB,EAAa,KAAApqB,OAAA+tB,EACrC,CAAM,OAAIX,GAAkB3B,UACpB7C,GAAWwE,GAAkB3B,UAAW,eACtC2B,GAAkB1B,QACpB9C,GAAWwE,GAAkB1B,QAAS,eAExC,EACR,EAAE,CAACN,GAAaF,GAAkBkC,GAAmBhD,IAoEhDgG,GAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE5D,OACEhuB,6BACEK,EAAQC,IAAA,QAAA,CAAAF,SA5BoB,yZA6B5BJ,EAAAC,KAAA,MAAA,CACEmO,IAAKoc,GACLroB,UAAW,0BAAmBA,GAC9BzB,MAAKxG,EAAA,CACH6J,SAAU,WACVC,QAAS,cACTC,WAAY,SACZkM,UAAW,aACXhM,WAAY,sBACZS,aAAc,MACdpB,OAAQ,aAAa5F,OAAAoI,EAAQ,UAAYmN,GAASpV,GAAe,WACjE4G,gBAAiBlD,EAAW,UAAY,UACxC4C,OAAQ5C,EAAW,cAAgB,UACnC8C,WAAY,WACZQ,YAAa,OACbC,aAAc8K,GAAY,OAAS,OACnCE,WAAYD,GAAWjQ,GAAMkQ,WAC7BC,cAAeF,GAAWjQ,GAAMmQ,cAChC1Q,SAAUwQ,GAAWjQ,GAAMP,SAC3BC,WAAYuQ,GAAWjQ,GAAMN,WAC7B4E,WAAY,IACZK,wBAAyB,cACzBsS,mBAAoB,OACpBC,YAAa,eACbxS,WAAY,QACT9D,GAELqB,QAASiqB,GACTnd,QAxRc,SAAChU,GACnBgU,SAAAA,EAAUhU,EACZ,EAuRMiU,OApRa,SAACjU,GAClBiU,SAAAA,EAASjU,EACX,EAmRMuc,SAAU3V,GAAY,EAAI,EAACrB,SAAA,CAG3BC,EAAAA,IACE,OAAA,CAAAK,MAAO,CACLqD,SAAU,WACV2E,KAAM,OACN1E,QAAS,OACTC,WAAY,SACZlE,MAAO0B,EAAW,UAAY,UAC9BkH,OAAQ,EACRC,cAAe,QAChBxI,SAEDC,EAACC,IAlHY,WAAM,OACzBD,EAAAA,WACEE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BAEN3F,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,udACFiH,KAAK,kBAGV,EAqGuB,CAAA,KAIjBuoB,GACsB,SAArBF,GAEEzoB,EACEC,IAAA,QAAA,CAAA8N,IAAKa,GACL3N,KAAK,OACL5F,MAAOqyB,GACP1f,UACA,EAAAK,YAAaA,EACbjN,SAAUA,EACVM,QAAS,SAAClH,GACRA,EAAE+P,kBACGnJ,GACHuqB,IAEH,EACDtrB,MAAO,CACL+J,KAAM,EACNjH,OAAQ,OACRc,QAAS,OACTgG,WAAY,cACZ/K,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAAO0B,EAAW,UAAaupB,GAAkB3B,WAAa2B,GAAkB1B,QAAW,UAAY,UACvGnlB,WAAY,sBACZuG,SAAU,EACVrG,OAAQ5C,EAAW,cAAgB,UACnC2O,iBAAkB,OAClBE,WAAY,UAKhBtQ,OAAA,MAAA,CACEU,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZwG,KAAM,EACN/K,IAAK,MACLgL,SAAU,GACXtK,SAAA,CAGDC,EAAAA,IACE,QAAA,CAAA+N,IAAKqc,GACLnpB,KAAK,OACL5F,MAAOmyB,GACPxf,UACA,EAAAK,YAAamZ,EACbpmB,SAAUA,EACVM,QArVgB,SAAClH,GAE7B,GADAA,EAAE+P,mBACGnJ,EAEH,GADAmoB,IAAkB,GACbzW,IAIH,IAAK6X,GAAkB3B,YAAc2B,GAAkB1B,QAAS,CAC9D,IAAMW,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,OATDkF,IAYN,EAqUctrB,MAAO,CACL+J,KAAM,EACNjH,OAAQ,OACRc,QAAS,OACTgG,WAAY,cACZ/K,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAAO0B,EAAW,UAAYupB,GAAkB3B,UAAY,UAAY,UACxEllB,WAAY,sBACZuG,SAAU,EACVrG,OAAQ5C,EAAW,cAAgB,UACnC2O,iBAAkB,OAClBE,WAAY,UAKhBjQ,EAAAA,IACE,OAAA,CAAAK,MAAO,CACLX,MAAO0B,EAAW,UAAY,UAC9BlC,SAAU,OACVqB,WAAY,GACbR,SAEA4nB,IAIH3nB,EAAAC,IAAA,QAAA,CACE8N,IAAKsc,GACLppB,KAAK,OACL5F,MAAOoyB,GACPzf,UACA,EAAAK,YAAaoZ,EACbrmB,SAAUA,EACVM,QAtWc,SAAClH,GAE3B,GADAA,EAAE+P,mBACGnJ,EAEH,GADAmoB,IAAkB,GACbzW,IAIH,IAAK6X,GAAkB3B,YAAc2B,GAAkB1B,QAAS,CAC9D,IAAMW,EAAM,IAAI5C,KAChB8C,GAAgB,CACdxD,KAAMsD,EAAIrD,cACVC,MAAOoD,EAAInD,YAEd,OATDkF,IAYN,EAsVctrB,MAAO,CACL+J,KAAM,EACNjH,OAAQ,OACRc,QAAS,OACTgG,WAAY,cACZ/K,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAAO0B,EAAW,UAAYupB,GAAkB1B,QAAU,UAAY,UACtEnlB,WAAY,sBACZuG,SAAU,EACVrG,OAAQ5C,EAAW,cAAgB,UACnC2O,iBAAkB,OAClBE,WAAY,aAMpBjQ,EACEC,IAAA,QAAA,CAAA8N,IAAKa,GACL3N,KAAK,OACL5F,MAAOkyB,GACPvf,UAAQ,EACRK,YAAaA,EACbjN,SAAUA,EACVM,QAAS,SAAClH,GACRA,EAAE+P,kBACGnJ,GACHuqB,IAEH,EACDtrB,MAAO,CACL+J,KAAM,EACNjH,OAAQ,OACRc,QAAS,OACTgG,WAAY,cACZ/K,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAAO0B,EAAW,UAAYspB,GAAqB,UAAY,UAC/D5mB,WAAY,sBACZuG,SAAU,EACVrG,OAAQ5C,EAAW,cAAgB,UACnC2O,iBAAkB,OAClBE,WAAY,UAMjBR,IACCzP,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLqD,SAAU,WACVgF,MAAO,OACP/E,QAAS,OACTC,WAAY,SACZvE,IAAK,OAGPU,SAAAC,EAAAA,IA5PQ,WAAM,OACtBA,EAAAC,IAAA,MAAA,CACEC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNhE,QAAS4N,GACTjP,MAAO,CACL2D,OAAQ,UACRzD,WAAY,EACZb,MAAO,WAGTK,SAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAE,uBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,aAyOE,CAAA,QAMlBsC,IAAUH,IAAoBuE,EAAYA,aACzClX,EAAAC,IAAA,MAAA,CACE8N,IAAK0E,GACL3Q,UAAW,4BAAAvE,OAA4B6T,GACvC/Q,SACEqD,SAAU,WACV0E,IAAK,GAAG7K,OAAAoV,GAAiBvK,IAAO,MAChCC,KAAM,GAAA9K,OAAGoV,GAAiBtK,KAAI,MAC9BC,OAAQ,KACRhE,gBAAiB,UACjBC,aAAc,MACdnB,UAAW,iCACXD,OAAQ,oBACRsB,QAAS,IACT5D,QAAS,EACTqJ,UAAwD,SAA5CyI,GAAiB8B,WAAa,UAAsB,kBAAoB,mBACpFnU,UAAwD,SAA5CqS,GAAiB8B,WAAa,UACtC,2CACA,wCACJ9Q,QAAS,OACT6E,cAAe,UACZ6I,GAILtR,SAAAJ,EAAAA,KAAA,MAAA,CACEU,MAAO,CACLsD,QAAS,OACTyG,KAAM,EACN4M,UAAW,EACXxO,cAAemgB,IAAe+D,IAAqC,IAAlB7E,EAAsB,SAAW,OAInF9nB,SAAA,CAAA4oB,IAAe+D,IAAqC,IAAlB7E,GACjC7nB,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLH,MAAO,QACP0tB,YAAa,oBACbnpB,QAAS,SACTH,gBAAiB,UACjBupB,oBAAqB,MACrBC,uBAAwBhG,EAAkB,IAAM,OACjD/nB,SAEA0sB,GAAiB1kB,IAAI,SAACgmB,EAAQC,GAC7B,IAAMvW,EAAagS,GACfxC,GAAU8G,EAAO9N,MAAM+I,UAAWS,GAAeT,YACjD/B,GAAU8G,EAAO9N,MAAMgJ,QAASQ,GAAeR,SAC/ChC,GAAU8G,EAAO9N,MAAM+I,UAAW2B,GAAkB3B,YACpD/B,GAAU8G,EAAO9N,MAAMgJ,QAAS0B,GAAkB1B,SAEtD,OACEjpB,MAEE,MAAA,CAAA0B,QAAS,WAAM,OAAAirB,GAAwBoB,EAAO9N,MAAM,EACpD5f,MAAO,CACLoE,QAAS,WACTT,OAAQ,UACR9E,SAAU,OACV4E,WAAY,sBACZpE,MAAO+X,EAAa/Z,GAAe,UACnC4G,gBAAiBmT,EAAa,UAAY,cAC1C1T,WAAY0T,EAAa,IAAM,IAC/BvT,WAAY,YAEdiB,aAAc,SAAC3K,GACRid,IACHjd,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,UAE5C,EACAc,aAAc,SAAC5K,GACRid,IACHjd,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,cAE3C,EAAAvE,SAEAguB,EAAO9xB,OAvBH+xB,EA0BX,KAGJruB,EAAAA,KAEE,MAAA,CAAAI,SAAA,CAAAC,EAAAC,IAAA,MAAA,CACEI,MAAO,CACL+J,KAAM,EACN3F,QAAS,OACTd,QAAS,OACT6E,cAAiC,IAAlBqf,EAAsB,MAAQ,SAC7CxoB,IAAuB,IAAlBwoB,EAAsB,OAAS,KACrC9nB,UAKOwrB,GAAiB,SACrB0C,EACAC,EACAC,EACAC,EACAC,GACG,YADH,IAAAA,IAAAA,EAAsB,GAEtB1uB,EAEEC,KAAA,MAAA,CAAAS,MAAO,CACL+J,KAAM,EACNzG,QAAS,OACT6E,cAAe,UAIjBzI,SAAA,CAAAJ,EAAAA,KAAA,MAAA,CACEU,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAkC,IAAlBgkB,GAAuBc,GAAc,SAAW,gBAChE2F,aAAc,OACd5qB,SAAU,YAIX3D,SAAA,GAAoB,IAAlB8nB,GAAuBc,IAA8B,IAAf0F,IACvCruB,EAAAA,IAAA,SAAA,CACEiB,KAAK,SACLS,QAASysB,EACT9tB,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRoE,OAAQ,OACR8G,WAAY,cACZjG,OAAQ,UACRO,aAAc,MACd7E,MAAO,UACPwE,WAAY,WACZR,SAA4B,IAAlBmkB,GAAuBc,GAAc,WAAa,WAC5DtgB,KAAwB,IAAlBwf,GAAuBc,GAAc,OAAIvZ,GAEjDjK,aAAc,SAAC3K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,SAC1C,EACAc,aAAc,SAAC5K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,eACzCvE,SAEDC,EAAAA,WAAKE,MAAM,KAAKnB,OAAO,KAAKoB,QAAQ,YAAYC,KAAK,OACnDL,SAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAE,kBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,cAMvB7Q,EAAAA,KACE,MAAA,CAAAU,MAAO,CACLnB,SAAU,OACV6E,WAAY,IACZrE,MAAO,UACPoE,WAAY,uBACb/D,SAAA,CAEAmmB,GAAe+H,EAAUzH,OAAS,IAAAyH,EAAU3H,UAI1B,IAAlBuB,GAAuBc,IAA8B,IAAf0F,IACvCruB,MACE,SAAA,CAAAiB,KAAK,SACLS,QAAS0sB,EACT/tB,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRoE,OAAQ,OACR8G,WAAY,cACZjG,OAAQ,UACRO,aAAc,MACd7E,MAAO,UACPwE,WAAY,WACZR,SAA4B,IAAlBmkB,GAAuBc,GAAc,WAAa,WAC5DjgB,MAAyB,IAAlBmf,GAAuBc,GAAc,OAAIvZ,GAElDjK,aAAc,SAAC3K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,SAC1C,EACAc,aAAc,SAAC5K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,eACzCvE,SAEDC,EAAAA,IAAK,MAAA,CAAAE,MAAM,KAAKnB,OAAO,KAAKoB,QAAQ,YAAYC,KAAK,OAAML,SACzDC,EAAAA,IACE,OAAA,CAAA7G,EAAE,iBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,iBAQxBmY,IAAeR,GAAuC,IAAlBN,GAAsC,IAAfwG,IACpDjD,EAAetD,GAAmB2B,GAAiBA,GAAiBkB,GAGpEU,EAAYD,EAAapC,UAAY7C,GAAWiF,EAAapC,UAAW,eAAiBX,GACzFiD,EAAUF,EAAanC,QAAU9C,GAAWiF,EAAanC,QAAS,eAAiBV,GAGvF5oB,EACEC,KAAA,MAAA,CAAAkC,UAAU,0BACVzB,MAAO,CACLnB,SAAU,OACVovB,aAAc,QAGhBvuB,SAAA,CAAAC,MAAA,MAAA,CACE8B,UAAW,uEAAAvE,OAAuE6tB,EAAapC,UAAY,iBAAmB,2BAC5HqC,IACJrrB,EAAAA,IAAM,MAAA,CAAAD,SAAA4nB,IACN3nB,EAAAC,IAAA,MAAA,CAAK6B,UAAW,uEAAAvE,OAAuE6tB,EAAanC,QAAU,iBAAmB,2BAAqBqC,QAM3J3C,IAAe+D,IAAqC,IAAlB7E,GACjC7nB,MAAA,MAAA,CACEK,MAAO,CACLH,MAAO,QACPyD,QAAS,OACT0S,SAAU,OACVzG,cAAe,QAChB7P,SAEA0sB,GAAiB1kB,IAAI,SAACgmB,EAAQC,GAC7B,IAAMvW,EAAagS,GACfxC,GAAU8G,EAAO9N,MAAM+I,UAAWS,GAAeT,YACjD/B,GAAU8G,EAAO9N,MAAMgJ,QAASQ,GAAeR,SAC/ChC,GAAU8G,EAAO9N,MAAM+I,UAAW2B,GAAkB3B,YACpD/B,GAAU8G,EAAO9N,MAAMgJ,QAAS0B,GAAkB1B,SAEtD,OACEjpB,gBAEEiB,KAAK,SACLS,QAAS,WAAM,OAAAirB,GAAwBoB,EAAO9N,QAC9C5f,MAAO,CACLoE,QAAS,UACTT,OAAQ,UACR9E,SAAU,OACV4E,WAAY,sBACZpE,MAAO+X,EAAa/Z,GAAe,UACnC4G,gBAAiBmT,EAAa,UAAY,cAC1CtU,OAAQ,OACRY,WAAY0T,EAAa,IAAM,IAC/BvT,WAAY,WACZK,aAAc,OACfxE,SAEAguB,EAAO9xB,OAhBH+xB,EAmBV,KAKLhuB,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLH,MAAO,QACPyD,QAAS,OACT4qB,oBAAqB,iBACrBD,aAAc,OAGfvuB,SAAA4tB,GAAS5lB,IAAI,SAAC6e,GAAQ,OACrB5mB,EAEEC,IAAA,MAAA,CAAAI,MAAO,CACLH,MAAO,OACPqX,UAAW,SACXrY,SAAU,OACV6E,WAAY,IACZrE,MAAO,UACPoE,WAAY,sBACZW,QAAS,OACV1E,SAEA6mB,GAXIA,EAaR,KAIH5mB,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLH,MAAO,QACPyD,QAAS,OACT4qB,oBAAqB,iBACrBC,OAAQ,MACRC,UAAW,OACZ1uB,SAEA,WAUC,IARA,IAl5CEumB,EAAcE,EAk5CVkI,GAl5CJpI,EAk5CkC2H,EAAU3H,KAl5C9BE,EAk5CoCyH,EAAUzH,MAj5C/E,IAAIQ,KAAKV,EAAME,EAAO,GAAGmI,UAo5CFnM,GAD8B,IAAbkM,EAAiB,EAAIA,GACZ,EAE1BE,EAA2B,GAGxB30B,EAAI,EAAGA,EAAIuoB,EAAQvoB,IAC1B20B,EAAM7xB,KAAKiD,EAAAC,IAAA,MAAA,CAAA,EAAU,gBAAShG,KAsNhC,OAlNAi0B,EAAa3mB,QAAQ,SAAC6e,EAAM5O,GAC1B,GAAK4O,EAAL,CAEA,IAAMyI,EAAcrM,EAAShL,EACvBsX,EAAiB1I,EAAKK,aAAewH,EAAUzH,MAC/CuI,EAAU9H,GAAUb,EAAM,IAAIY,MAC9BnkB,GAAcukB,GAAchB,EAAMiB,EAASC,GAEjD,GAAIqB,GAAa,CAEf,IAAMyC,EAAetD,GAAmB2B,GAAiBA,GAAiBkB,GACpEqE,EAAc/H,GAAUb,EAAMgF,EAAapC,WAC3CiG,EAAYhI,GAAUb,EAAMgF,EAAanC,SACzCiG,EAj5CN,SAAC9I,EAAY4C,EAAwBC,GACjE,IAAKD,IAAcC,EAAS,OAAO,EACnC,IAAMkG,EAAW/I,EAAKgJ,UAChBC,EAAYrG,EAAUoG,UACtBE,EAAUrG,EAAQmG,UACxB,OAAOD,GAAYE,GAAaF,GAAYG,CAC9C,CA24CgDC,CAAsBnJ,EAAMgF,EAAapC,UAAWoC,EAAanC,SAG7EuG,EAAeX,EAAc,GAAM,EACnCY,EAAcZ,EAAc,GAAM,EAElCa,EAAeV,EACfW,EAAaV,EAGjBxrB,EAAmC,CACrCE,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRoE,OAAQ,OACRa,OAAQnB,EAAa,cAAgB,UACrC3D,SAAU,OACV4E,WAAY,sBACZI,WAAY,WACZrD,QAASgC,EAAa,GAAM,EAC5Ba,SAAU,WACVe,QAAS,EACTuV,OAAQ,GAIV,GAAI0V,GAAgBC,EAClBlsB,EAAYwG,WAAavM,GACzB+F,EAAYc,aAAe,MAC3Bd,EAAY/D,MAAQ,UACpB+D,EAAYM,WAAa,SAGtB,GAAImrB,EAAW,CAClBzrB,EAAYwG,WAAa,UACzBxG,EAAY/D,MAAQovB,EAChBjsB,EACE,UACA,UACF,UACJY,EAAYM,WAAa,IAGzB,IAAM6rB,EAAuC,IAAnBxJ,EAAKS,UACzBoG,EAAclG,GAAekH,EAAU3H,KAAM2H,EAAUzH,OACvDqJ,EAAmBzJ,EAAKS,YAAcoG,EAGtC6C,EAAkBN,GAAgBI,EAClCG,EAAmBN,GAAeI,EAIpCC,GAAmBC,EAErBtsB,EAAYc,aAAe,OAClBurB,GAETrsB,EAAYoqB,oBAAsB,OAClCpqB,EAAYqqB,uBAAyB,OACrCrqB,EAAYusB,qBAAuB,IACnCvsB,EAAYwsB,wBAA0B,KAC7BF,GAETtsB,EAAYusB,qBAAuB,OACnCvsB,EAAYwsB,wBAA0B,OACtCxsB,EAAYoqB,oBAAsB,IAClCpqB,EAAYqqB,uBAAyB,KAGrCrqB,EAAYc,aAAe,GAE9B,MAGCd,EAAYwG,WAAa,cACzBxG,EAAYc,aAAe,MAC3Bd,EAAY/D,MAAQovB,EAChBjsB,EACE,UACA,UACF,UACJY,EAAYM,WAAa,IAG3B6qB,EAAM7xB,KACJ4C,EAAAA,KAAA,SAAA,CAEEsB,KAAK,SACLG,SAAUyB,EACVnB,QAAS,WAAM,OAAA+pB,GAAsBrF,EAAK,EAC1C/lB,MAAOoD,EACP0B,aAAc,SAAC3K,GACRqI,GAAe6sB,GAAiBC,IAEjCn1B,EAAEgQ,cAAcnK,MAAMiE,gBADpB4qB,EACsC,UAEA,UAG9C,EACA9pB,aAAc,SAAC5K,GACRk1B,GAAiBC,IAElBn1B,EAAEgQ,cAAcnK,MAAMiE,gBADpB4qB,EACsC,UAEA,gBAG7CnvB,SAAA,CAEAqmB,EAAKS,UACLkI,GACC/uB,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLqD,SAAU,WACViF,OAAQ,MACRN,KAAM,MACN6B,UAAW,mBACXhK,MAAO,MACPnB,OAAQ,MACRwF,aAAc,MACdD,gBAAkBorB,GAAgBC,EAAc,UAAYjyB,QAnC7D,QAAAH,OAAQia,IAyClB,KAAM,CAEL,IAAM0Y,EAAajJ,GAAUb,EAAMsE,IAEnCkE,EAAM7xB,KACJ4C,EAEEC,KAAA,SAAA,CAAAqB,KAAK,SACLG,SAAUyB,EACVnB,QAAS,WAAM,OAAA8pB,GAAuBpF,EAAK,EAC3C/lB,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRoE,OAAQ,OACR8G,WAAYimB,EAAaxyB,GAAe,cACxCsG,OAAQnB,EAAa,cAAgB,UACrC0B,aAAc,MACdrF,SAAU,OACV6E,WAAYmsB,EAAa,IAAM,IAC/BxwB,MAAOwwB,EACH,UACApB,EACAjsB,EACE,UACA,UACF,UACJiB,WAAY,sBACZI,WAAY,WACZrD,QAASgC,EAAa,GAAM,EAC5Ba,SAAU,WACVe,QAAS,EACTuV,OAAQ,GAEV7U,aAAc,SAAC3K,GACRqI,GAAeqtB,IAClB11B,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,UAE5C,EACAc,aAAc,SAAC5K,GACR01B,IACH11B,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,cAE3C,EAEAvE,SAAA,CAAAqmB,EAAKS,UACLkI,IAAYmB,GACXlwB,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLqD,SAAU,WACViF,OAAQ,MACRN,KAAM,MACN6B,UAAW,mBACXhK,MAAO,MACPnB,OAAQ,MACRwF,aAAc,MACdD,gBAAiB5G,QApDlB,QAAAH,OAAQia,IA0DlB,CA9MmB,CA+MpB,GAEOoX,CACR,CAlOA,OAnNEP,GA4G2E,IACxEjD,EAGAC,EACAC,CAnHP,EA6bH3rB,OACGE,EAAAA,SAAA,CAAAE,SAAA,CAAAwrB,GAAe1B,GAAcsD,GAAcL,GAAiBC,GAAiB,GAC3D,IAAlBlF,GAAuBc,IAAesB,IAAemD,IACpD7B,GAAetB,GAAamD,GAAoBC,GAAuBC,GAAuB,SAQvG3E,IAAeR,GAAuC,IAAlBN,IAAwBC,IACrDsD,GAAeT,GAGfU,GAAYD,GAAapC,UAAY7C,GAAWiF,GAAapC,UAAW,eAAiBX,GACzFiD,GAAUF,GAAanC,QAAU9C,GAAWiF,GAAanC,QAAS,eAAiBV,GAGvFvoB,EACEC,IAAA,MAAA,CAAA6B,UAAU,0BACVzB,MAAO,CACLoE,QAAS,YACT0rB,UAAW,oBACXrC,uBAAwB,MACxBmC,wBAAyB,OAC1BlwB,SAEDJ,EAAAA,YACEmC,UAAU,oCACVzB,MAAO,CACLnB,SAAU,QAGZa,SAAA,CAAAC,MAAA,MAAA,CAAK8B,UAAW,uEAAAvE,OAAuE6tB,GAAapC,UAAY,iBAAmB,2BAAqBqC,KACxJrrB,EAAAC,IAAA,MAAA,CAAAF,SAAM4nB,IACN3nB,MAAK,MAAA,CAAA8B,UAAW,uEAAuEvE,OAAA6tB,GAAanC,QAAU,iBAAmB,kBAAkBlpB,SAAGurB,WAM7J3C,IAAeb,GACdnoB,EACEC,KAAA,MAAA,CAAAS,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBxE,IAAK,MACLoF,QAAS,YACT0rB,UAAW,oBACXrC,uBAAwB,MACxBmC,wBAAyB,OAC1BlwB,SAAA,CAGAooB,GAAuC,IAAlBN,GAAuB,WAC3C,IAAMuD,EAAe3B,IAAkBkB,GAGjCU,EAAYD,EAAapC,UAAY7C,GAAWiF,EAAapC,UAAW,eAAiBX,GACzFiD,EAAUF,EAAanC,QAAU9C,GAAWiF,EAAanC,QAAS,eAAiBV,GAEzF,OACE5oB,EACEC,KAAA,MAAA,CAAAkC,UAAU,oCACVzB,MAAO,CACLnB,SAAU,QAGZa,SAAA,CAAAC,MAAA,MAAA,CAAK8B,UAAW,uEAAAvE,OAAuE6tB,EAAapC,UAAY,iBAAmB,2BAAqBqC,IACxJrrB,EAAAA,IAAM,MAAA,CAAAD,SAAA4nB,IACN3nB,EAAAC,IAAA,MAAA,CAAK6B,UAAW,uEAAAvE,OAAuE6tB,EAAanC,QAAU,iBAAmB,2BAAqBqC,MAG3J,CAnB4C,GAoB7C3rB,EAAAA,KAAA,MAAA,CACEmC,UAAW,GAAAvE,OAAsB,IAAlBsqB,EAAsB,GAAK,UAC1CxnB,MAAO,CAAEsD,QAAS,OAAQtE,IAAK,MAAOkB,WAAY,EAAGkW,WAAY,QAEjE1W,SAAA,CAAAC,EAAAC,IAAA,SAAA,CACEgB,KAAK,SACLS,QAvpCC,WACnBgoB,GAAkB,MAClBxB,SAAAA,IACKrV,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,EACjB,EAipCoBrnB,MAAO,CACL+J,KAAM,EACN3F,QAAS,WACTtB,OAAQ,oBACRoB,aAAc,MACd0F,WAAY,UACZvK,MAAO,UACPR,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZE,OAAQ,UACRE,WAAY,YAEdiB,aAAc,SAAC3K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,SAC1C,EACAc,aAAc,SAAC5K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,SAC1C,EAECvE,SAAAioB,IAEHhoB,EAAAA,IACA,SAAA,CAAAiB,KAAK,SACLS,QAlsCE,iBACd+nB,KACGta,IACHga,GAAsBM,IAEX,UAAT7Y,GAAoB,aAActK,IACa,QAAjD9G,EAAC8G,EAAMiI,gBAA0C,IAAA/O,GAAAA,EAAA5F,KAAA0M,EAAAmjB,KAEnDxB,SAAAA,EAAUwB,IACL5W,IACHZ,IAAgB,GAElByV,SAAAA,GAAe,GACfgC,GAAkB,MAEtB,EAorCkBtoB,UAAWqoB,KAAoBA,GAAeT,YAAcS,GAAeR,QAC3E5oB,MAAO,CACL+J,KAAM,EACN3F,QAAS,WACTtB,OAAQ,OACRoB,aAAc,MACd0F,WAAcwf,IAAmBA,GAAeT,WAAcS,GAAeR,QAAuBvrB,GAAZ,UACxFgC,MAAO,UACPR,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZE,OAAUylB,IAAmBA,GAAeT,WAAcS,GAAeR,QAA2B,UAAhB,cACpF/kB,WAAY,YAEdiB,aAAc,SAAC3K,GACTivB,IAAkBA,GAAeT,WAAaS,GAAeR,UAC/DzuB,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,UAE5C,EACAc,aAAc,SAAC5K,GACTivB,IAAkBA,GAAeT,WAAaS,GAAeR,UAC/DzuB,EAAEgQ,cAAcnK,MAAMiE,gBAAkB5G,GAE5C,WAEGqqB,kBAQfjd,SAASjP,QAIjB,EAEA0rB,GAAWhiB,YAAc,aCh3DlB,IAAM6qB,GAAcxyB,EAAaA,cAA0B,MCzBlEyyB,GAAA,SAAAC,GAME,SAAAD,EAAYrnB,EAAiBiK,EAA6Bsd,GACxD,IAAAnpB,EAAAkpB,EAAK12B,KAAAU,KAAC0O,IAAS1O,YACf8M,EAAKuV,KAAO,sBACZvV,EAAK6L,OAASA,EACd7L,EAAKmpB,YAAcA,EACnBl3B,OAAOC,eAAe8N,EAAMipB,EAAoB32B,YACjD,CACH,OnBvBO,SAAmBP,EAAGC,GACzB,GAAiB,mBAANA,GAA0B,OAANA,EAC3B,MAAM,IAAIyD,UAAU,uBAAyByW,OAAOla,GAAK,iCAE7D,SAASo3B,IAAOl2B,KAAKm2B,YAAct3B,CAAI,CADvCD,EAAcC,EAAGC,GAEjBD,EAAEO,UAAkB,OAANN,EAAaC,OAAOiD,OAAOlD,IAAMo3B,EAAG92B,UAAYN,EAAEM,UAAW,IAAI82B,EACnF,CmBIyCE,CAAKL,EAAAC,GAa7CD,CAAD,CAbA,CAAyCM,OAwCnCC,GAAO9hB,EAAMhB,WACjB,SACEtO,EAaAuO,OAZE/M,EAAkBxB,EAAAqxB,cAAlBA,OAAa,IAAA7vB,EAAG,CAAE,EAAAA,EAClB8vB,EAActxB,EAAAsxB,eACdC,EAAQvxB,EAAAuxB,SACRC,EAAcxxB,EAAAwxB,eACd9vB,EAAoB1B,EAAAyxB,WAApBA,OAAU,IAAA/vB,EAAG,QAAOA,EACpBC,EAAA3B,EAAA0xB,WAAAA,OAAa,IAAA/vB,EAAA,UACbE,EAAA7B,EAAA2xB,OAAAA,OAAS,IAAA9vB,EAAA,eACT7B,EAAAC,KACA,IAAAkC,EAAAnC,EAAAsC,UAAAA,OAAY,IAAAH,EAAA,GAAEA,EACdtB,EAAKb,EAAAa,MACLN,EAAQP,EAAAO,SAIJ8B,EAA2BO,EAAAA,SAAoC,WACnE,IAAMgvB,EAA2C,CAAA,EASjD,OARA/3B,OAAOg4B,KAAKR,GAAetpB,QAAQ,SAAC4I,GAClCihB,EAAcjhB,GAAO,CACnB9U,MAAOw1B,EAAc1gB,GACrBxK,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,EAEhB,GACOH,CACT,GAXOI,OAAQC,OAcTC,EAAY7iB,SAAO2iB,GACzB5pB,EAAAA,UAAU,WACR8pB,EAAUxiB,QAAUsiB,CACtB,EAAG,CAACA,IAGJ,IAAMG,EAAmB9iB,SAAoC,CAAA,GAGvD+iB,EAAgB9nB,cAAY,SAAC6S,SACjC,OAAgC,QAAzBnd,EAAAkyB,EAAUxiB,QAAQyN,UAAO,IAAAnd,OAAA,EAAAA,EAAAnE,KACjC,EAAE,IAGGw2B,EAAgB/nB,EAAAA,YAAY,SAAC6S,EAActhB,GAC/Co2B,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GA+BvB,GA9BK6c,EAAUnV,GAQbmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAAthB,MAAKA,IATPy2B,EAAUnV,GAAQ,CAChBthB,MAAKA,EACLsK,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,GAUZG,EAAUxiB,QAAQyN,GACpB+U,EAAUxiB,QAAQyN,UACb+U,EAAUxiB,QAAQyN,IAAK,CAC1BthB,MAAKA,IAGPq2B,EAAUxiB,QAAQyN,GAAQ,CACxBthB,MAAKA,EACLsK,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,GAKZT,EAAgB,CAClB,IAAMiB,EAAqC,CAAA,EAC3CA,EAAcpV,GAAQthB,EACtB,IAAM22B,EAAiC,CAAA,EACvC34B,OAAOg4B,KAAKS,GAAWvqB,QAAQ,SAAC4I,GAC9B6hB,EAAU7hB,GAAO2hB,EAAU3hB,GAAK9U,KAClC,GACAy1B,EAAeiB,EAAeC,EAC/B,CAED,OAAOF,CACT,EACF,EAAG,CAAChB,IAGEmB,EAAgBnoB,cAAY,SAAC6S,SACjC,OAAgC,QAAzBnd,EAAAkyB,EAAUxiB,QAAQyN,UAAO,IAAAnd,OAAA,EAAAA,EAAAmG,KACjC,EAAE,IAGGusB,EAAgBpoB,EAAAA,YAAY,SAAC6S,EAAchX,GAE3C+rB,EAAUxiB,QAAQyN,KACpB+U,EAAUxiB,QAAQyN,UACb+U,EAAUxiB,QAAQyN,IAAK,CAC1BhX,MAAKA,KAKT8rB,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAcvB,OAbK6c,EAAUnV,GAQbmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAAhX,MAAKA,IATPmsB,EAAUnV,GAAQ,CAChBthB,WAAO+T,EACPzJ,MAAKA,EACL2rB,SAAS,EACTC,YAAY,GAQTO,CACT,EACD,EAAE,IAGGK,EAAiBroB,cAAY,SAAC6S,SAClC,OAAgC,QAAzBnd,EAAAkyB,EAAUxiB,QAAQyN,UAAO,IAAAnd,OAAA,EAAAA,EAAA8xB,WAAW,CAC5C,EAAE,IAGGc,EAAkBtoB,EAAAA,YAAY,SAAC6S,EAAc2U,GAE7CI,EAAUxiB,QAAQyN,KACpB+U,EAAUxiB,QAAQyN,UACb+U,EAAUxiB,QAAQyN,IAAK,CAC1B2U,QAAOA,KAKXG,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAcvB,OAbK6c,EAAUnV,GAQbmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAA2U,QAAOA,IATTQ,EAAUnV,GAAQ,CAChBthB,WAAO+T,EACPzJ,WAAOyJ,EACPkiB,QAAOA,EACPC,YAAY,GAQTO,CACT,EACD,EAAE,IAGGO,EAAoBvoB,cAAY,SAAC6S,SACrC,OAAgC,QAAzBnd,EAAAkyB,EAAUxiB,QAAQyN,UAAO,IAAAnd,OAAA,EAAAA,EAAA+xB,cAAc,CAC/C,EAAE,IAGGe,EAAqBxoB,EAAAA,YAAY,SAAC6S,EAAc4U,GAEhDG,EAAUxiB,QAAQyN,KACpB+U,EAAUxiB,QAAQyN,UACb+U,EAAUxiB,QAAQyN,IAAK,CAC1B4U,WAAUA,KAKdE,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAcvB,OAbK6c,EAAUnV,GAQbmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAA4U,WAAUA,IATZO,EAAUnV,GAAQ,CAChBthB,WAAO+T,EACPzJ,WAAOyJ,EACPkiB,SAAS,EACTC,WAAUA,GAQPO,CACT,EACD,EAAE,IAGGS,EAAqB1jB,EAAAA,SAE3B0jB,EAAmBrjB,QAAU,SAACyN,EAAchM,GAC1C8gB,EAAe,SAACxc,GAEd,GAAIA,EAAK0H,GAAO,CACd,IAAM6V,EAAgBvd,EAAK0H,GAAM8V,OAAS,GACpCC,EAAW/hB,EAAQ8hB,OAAS,GAG9BE,EAAaH,EAAcp4B,SAAWs4B,EAASt4B,OACnD,GAAIu4B,GAAcH,EAAcp4B,OAAS,EACvC,IAAK,IAAIH,EAAI,EAAGA,EAAIu4B,EAAcp4B,OAAQH,IAAK,CAC7C,IAAM24B,EAAeJ,EAAcv4B,GAC7B44B,EAAUH,EAASz4B,GACzB,IACE24B,aAAY,EAAZA,EAAcE,aAAaD,aAAO,EAAPA,EAASC,YACpCF,aAAY,EAAZA,EAAc5pB,YAAY6pB,aAAO,EAAPA,EAAS7pB,WACnC4pB,aAAY,EAAZA,EAAc3xB,SAAS4xB,aAAO,EAAPA,EAAS5xB,QAChC2xB,aAAY,EAAZA,EAAcG,YAAYF,aAAO,EAAPA,EAASE,WACnCH,aAAY,EAAZA,EAAc5e,QAAQ6e,aAAO,EAAPA,EAAS7e,OAC/B4e,aAAY,EAAZA,EAAc3e,QAAQ4e,aAAO,EAAPA,EAAS5e,OAC/B2e,aAAY,EAAZA,EAAcI,QAAQH,aAAO,EAAPA,EAASG,OAC/BJ,aAAA,EAAAA,EAAcK,eAAeJ,aAAA,EAAAA,EAASI,YACtC,CACAN,GAAa,EACb,KACD,CACF,CAGH,GAAIA,GAAc1d,EAAK0H,GAAMmW,WAAaniB,EAAQmiB,SAChD,OAAO7d,CAEV,CAED,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAiBvB,OAhBK6c,EAAUnV,GAUbmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAA8V,MAAO9hB,EAAQ8hB,MACfK,SAAUniB,EAAQmiB,WAZpBhB,EAAUnV,GAAQ,CAChBthB,MAAOw1B,EAAclU,GACrBhX,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,EACZkB,MAAO9hB,EAAQ8hB,MACfK,SAAUniB,EAAQmiB,UASfhB,CACT,EACF,EAEA,IAAMoB,EAAgBppB,EAAAA,YAAY,SAAC6S,EAAchM,SACrB,QAA1BnR,EAAA+yB,EAAmBrjB,eAAO,IAAA1P,GAAAA,EAAA5F,KAAA24B,EAAG5V,EAAMhM,EACpC,EAAE,IAGGwiB,EAAkBrpB,cAAY,SAAC6S,UAC5BgV,EAAiBziB,QAAQyN,GAChC8U,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAEvB,cADO6c,EAAUnV,GACVmV,CACT,UACOJ,EAAUxiB,QAAQyN,EAC1B,EAAE,IAGGyW,EAAgBtpB,EAAAA,YAAY,SAAO6S,GAAY,OAAA/hB,OAAA,OAAA,OAAA,EAAA,kFAGnD,KADMy4B,EAAQ3B,EAAUxiB,QAAQyN,IAE9B,MAAA,CAAA,OAAOvN,GAGTkjB,EAAmB3V,GAAM,GAEnB8V,EAAQY,EAAMZ,OAAS,GAGLa,EAAA,EAALC,EAAKd,mBAAL,KAAAa,YAAK,MAAA,CAAA,EAAA,GAItB,GAJSE,EAAID,EAAAD,GACPj4B,EAAQg4B,EAAMh4B,MAGhBm4B,EAAKV,WACHz3B,SAAmD,KAAVA,GAE3C,OADAsK,EAAQ6tB,EAAKxqB,SAAW,GAAGzL,OAAAof,kBACrB,CAAA,EAAA,GAKV,GAAI6W,EAAKvyB,MAALuyB,MAAan4B,GAAmD,KAAVA,IAgBlDo4B,EAf+C,CACnDC,OAAQ,SAAC/2B,GAAM,MAAa,iBAANA,CAAc,EACpCg3B,OAAQ,SAACh3B,GAAM,MAAa,iBAANA,IAAmBi3B,MAAMj3B,EAAE,EACjDk3B,QAAS,SAACl3B,GAAM,MAAa,kBAANA,CAAe,EACtCm3B,MAAO,SAACn3B,GAAM,MAAA,6BAA6B8gB,KAAKnK,OAAO3W,GAAG,EAC1DugB,IAAK,SAACvgB,GACJ,IAEE,OADA,IAAIihB,IAAItK,OAAO3W,KACR,CACR,CAAC,MAAA6C,GACA,OAAO,CACR,CACF,GAGuBg0B,EAAKvyB,SACbwyB,EAAUp4B,GAE1B,OADAsK,EAAQ6tB,EAAKxqB,SAAW,GAAAzL,OAAGof,EAAI,qBAAApf,OAAoBi2B,EAAKvyB,MAClD,CAAA,EAAA,GAKV,GAAIuyB,EAAKT,SAALS,MAAgBn4B,GAAmD,KAAVA,IACtDm4B,EAAKT,QAAQtV,KAAKnK,OAAOjY,IAE5B,OADAsK,EAAQ6tB,EAAKxqB,SAAW,GAAGzL,OAAAof,wBACrB,CAAA,EAAA,GAKV,QAAiBvN,IAAbokB,EAAKxf,KAALwf,MAA0Bn4B,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMjB,OAASqgB,OAAOpf,IACpDm4B,EAAKxf,IAElB,OADArO,EAAQ6tB,EAAKxqB,SAAW,GAAAzL,OAAGof,EAAI,sBAAApf,OAAqBi2B,EAAKxf,KACnD,CAAA,EAAA,GAKV,QAAiB5E,IAAbokB,EAAKvf,KAALuf,MAA0Bn4B,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMjB,OAASqgB,OAAOpf,IACpDm4B,EAAKvf,IAElB,OADAtO,EAAQ6tB,EAAKxqB,SAAW,GAAAzL,OAAGof,EAAI,qBAAApf,OAAoBi2B,EAAKvf,KAClD,CAAA,EAAA,GAKV,QAAiB7E,IAAbokB,EAAKR,KAALQ,MAA0Bn4B,GAAmD,KAAVA,IACnC,iBAAVA,EAAqBA,EAAMjB,OAASqgB,OAAOpf,MAClDm4B,EAAKR,IAEpB,OADArtB,EAAQ6tB,EAAKxqB,SAAW,GAAAzL,OAAGof,EAAI,qBAAApf,OAAoBi2B,EAAKR,KAClD,CAAA,EAAA,GAKV,GAAIQ,EAAKP,YAA+B,iBAAV53B,GAAsBA,EAAMkiB,SAAWliB,EAEnE,OADAsK,EAAQ6tB,EAAKxqB,SAAW,GAAGzL,OAAAof,2BACrB,CAAA,EAAA,OAIJ6W,EAAKC,UAAL,MAAc,CAAA,EAAA,oBAEd,6BAAM,CAAA,EAAAD,EAAKC,UAAUD,EAAMn4B,kBAA3BmE,EAAAtD,oBAGA,kBADAyJ,GAAQouB,eAAAA,EAAK/qB,UAAWwqB,EAAKxqB,SAAW,GAAGzL,OAAAof,wBACrC,CAAA,EAAA,iBAlFO2W,iBAmInB,OA3CI5B,EAAUxiB,QAAQyN,GACpB+U,EAAUxiB,QAAQyN,UACb+U,EAAUxiB,QAAQyN,KACrBhX,MAAKA,EACL4rB,YAAY,EACZD,SAAS,IAGXI,EAAUxiB,QAAQyN,GAAQ,CACxBthB,MAAOg4B,EAAMh4B,MACbsK,MAAKA,EACL2rB,SAAS,EACTC,YAAY,EACZkB,MAAOY,EAAMZ,MACbK,SAAUO,EAAMP,UAKpBrB,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAmBvB,OAlBI6c,EAAUnV,GACZmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAAhX,QACA4rB,YAAY,EACZD,SAAS,IAIXQ,EAAUnV,GAAQ,CAChBthB,MAAOg4B,EAAMh4B,MACbsK,MAAKA,EACL2rB,SAAS,EACTC,YAAY,EACZkB,MAAOY,EAAMZ,MACbK,SAAUO,EAAMP,UAGbhB,CACT,GAGA,CAAA,EAAOnsB,SACN,IAGGquB,EAAiBlqB,cAAY,SAACmqB,GAClC,IAAMC,EAAgBxC,EAAUxiB,QAC1B+D,EAA8B,CAAA,EAOpC,OANoBghB,GAAY56B,OAAOg4B,KAAK6C,IAEhC3sB,QAAQ,SAACoV,SACnB1J,EAAO0J,GAA6B,QAArBnd,EAAA00B,EAAcvX,UAAO,IAAAnd,OAAA,EAAAA,EAAAnE,KACtC,GAEO4X,CACR,EAAE,IAGGkhB,EAAiBrqB,EAAAA,YAAY,SAAOmqB,GAAmB,OAAAr5B,OAAA,OAAA,OAAA,EAAA,0EAOjC,OALpBs5B,EAAgBxC,EAAUxiB,QAC1BklB,EAAmBH,GAAY56B,OAAOg4B,KAAK6C,GAC3CG,EAAoD,GAG1B,CAAA,EAAAp5B,QAAQq5B,IACtCF,EAAiBrsB,IAAI,SAAO4U,GAAI,OAAA/hB,OAAA,OAAA,OAAA,EAAA,oEAG1B,OAFEy4B,EAAQa,EAAcvX,KAEf0W,EAAMZ,OAASY,EAAMZ,MAAMr4B,OAAS,EACjC,CAAA,EAAMg5B,EAAczW,IADc,CAAA,EAAA,UAEhD,OADMhX,EAAQnG,EAAyBtD,OACvC,CAAA,EAAO,CAAEygB,KAAIA,EAAEhX,MAAKA,WAEtB,MAAO,CAAA,EAAA,CAAEgX,KAAIA,EAAEhX,WAAOyJ,MACvB,EAAA,YAcH,OAvB0B5P,EAUzBtD,OAGiBqL,QAAQ,SAAC/H,OAAEmd,EAAInd,EAAAmd,KAAEhX,EAAKnG,EAAAmG,MAClCA,GACF0uB,EAAOt3B,KAAK,CACV4f,KAAIA,EACJ0X,OAAQ,CAAC1uB,IAGf,GAGM,CAAA,EAAA,IAAI1K,QAAQ,SAACC,GAAY,OAAAwZ,sBAAsB,WACnDhL,WAAWxO,EAAS,EACtB,EAAE,WAEF,GAJAsE,EAAAtD,OAIIm4B,EAAOj6B,OAAS,EAKlB,MAJM6Y,EAAS+gB,IACTO,EAAY,CAAEthB,OAAMA,EAAEsd,YAAa8D,GACzCrD,SAAAA,EAAiBuD,GAEX,IAAIlE,GAAoB,yBAA0Bpd,EAAQohB,GAGlE,MAAO,CAAA,EAAAL,SACR,EAAE,CAACZ,EAAeY,EAAgBhD,IAG7BwD,EAAc1qB,cAAY,SAACmqB,GAC/BxC,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAgBvB,OAfsBgf,GAAY56B,OAAOg4B,KAAKS,IAEhCvqB,QAAQ,SAACoV,GACjBmV,EAAUnV,KACZmV,EAAUnV,GAAK9iB,EAAAA,EAAA,CAAA,EACVi4B,EAAUnV,IACb,CAAAthB,MAAOw1B,EAAclU,GACrBhX,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,IAEdG,EAAUxiB,QAAQyN,GAAa9iB,EAAA,CAAA,EAAAi4B,EAAUnV,IAE7C,GAEOmV,CACT,EACF,EAAG,CAACjB,IAGE4D,EAAiB3qB,cAAY,SAACmJ,GAClCwe,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAkBvB,GAjBA5b,OAAOg4B,KAAKpe,GAAQ1L,QAAQ,SAACoV,GACtBmV,EAAUnV,GAQbmV,EAAUnV,GACL9iB,EAAAA,EAAA,CAAA,EAAAi4B,EAAUnV,IACb,CAAAthB,MAAO4X,EAAO0J,KAThBmV,EAAUnV,GAAQ,CAChBthB,MAAO4X,EAAO0J,GACdhX,WAAOyJ,EACPkiB,SAAS,EACTC,YAAY,GAQhBG,EAAUxiB,QAAQyN,GAAa9iB,EAAA,CAAA,EAAAi4B,EAAUnV,GAC3C,GAEImU,EAAgB,CAClB,IAAM4D,EAAiC,CAAA,EACvCr7B,OAAOg4B,KAAKS,GAAWvqB,QAAQ,SAAC4I,GAC9BukB,EAAUvkB,GAAO2hB,EAAU3hB,GAAK9U,KAClC,GACAy1B,EAAe7d,EAAQyhB,EACxB,CAED,OAAO5C,CACT,EACF,EAAG,CAAChB,IAGE6D,EAAS7qB,cAAY,WAAA,OAAAlP,OAAA,OAAA,OAAA,EAAA,kEAER,6BAAM,CAAA,EAAAu5B,YAErB,OAFMlhB,EAASzT,EAAsBtD,OACrC60B,SAAAA,EAAW9d,GACX,CAAA,EAAOA,UAEP,kCAEH,EAAA,EAAE,CAACkhB,EAAgBpD,IAGd6D,EAAY9qB,cAAY,SAAC+qB,GAwB7B,GAvBApD,EAAe,SAACxc,GACd,IAAM6c,EAASj4B,EAAA,CAAA,EAAQob,GAoBvB,OAnBA4f,EAAYttB,QAAQ,SAAC/H,GAAE,IAAAmd,SAAMthB,EAAKmE,EAAAnE,MAAEg5B,EAAM70B,EAAA60B,OAClC1uB,EAAQ0uB,GAAUA,EAAOj6B,OAAS,EAAIi6B,EAAO,QAAKjlB,EACnD0iB,EAAUnV,GAQbmV,EAAUnV,GACL9iB,EAAAA,EAAAA,EAAA,GAAAi4B,EAAUnV,SACCvN,IAAV/T,GAAuB,CAAEA,MAAKA,IAClC,CAAAsK,MAAKA,EACL2rB,SAAS,IAXXQ,EAAUnV,GAAQ,CAChBthB,WAAiB+T,IAAV/T,EAAsBA,OAAQ+T,EACrCzJ,MAAKA,EACL2rB,SAAS,EACTC,YAAY,GAUhBG,EAAUxiB,QAAQyN,GAAa9iB,EAAA,CAAA,EAAAi4B,EAAUnV,GAC3C,GACOmV,CACT,GACIhB,GAAkB+D,EAAYC,KAAK,SAACh5B,GAAM,YAAYsT,IAAZtT,EAAET,QAAsB,CACpE,IAAM05B,EAAqC,CAAA,EAC3CF,EAAYttB,QAAQ,SAACzL,QACHsT,IAAZtT,EAAET,QAAqB05B,EAAcj5B,EAAE6gB,MAAQ7gB,EAAET,MACvD,GACAqO,WAAW,WAAM,OAAAonB,EAAeiE,EAAef,MAAmB,EACnE,CACH,EAAG,CAAClD,EAAgBkD,IAGdgB,EAAmBlrB,EAAAA,YAAY,SAAC6S,EAAcpC,GAC9CA,EACFoX,EAAiBziB,QAAQyN,GAAQpC,SAE1BoX,EAAiBziB,QAAQyN,EAEnC,EAAE,IAGGsY,EAAgBnrB,EAAAA,YAAY,SAAC6S,EAAchM,GAC/C,IAAMukB,EAAKvD,EAAiBziB,QAAQyN,GACpCuY,SAAAA,EAAI5f,eAAiBzb,EAAA,CAAA2b,SAAU,SAAUD,MAAO,UAAa5E,GAC9D,EAAE,IAGHwkB,sBAAoBpnB,EAAK,WAAM,MAAC,CAC9B6jB,cAAaA,EACboC,eAAcA,EACdnC,cAAaA,EACb4C,eAAcA,EACdG,UAASA,EACT3C,cAAaA,EACbmB,cAAaA,EACbe,eAAcA,EACdK,YAAWA,EACXG,OAAMA,EACNM,cAAaA,EACb,GAGF,IAAMG,EAAiC1hB,UAAQ,WAAM,MAAC,CACpD8d,OAAMA,EACNI,cAAaA,EACbC,cAAaA,EACbI,cAAaA,EACbC,cAAaA,EACbC,eAAcA,EACdC,gBAAeA,EACfC,kBAAiBA,EACjBC,mBAAkBA,EAClBY,cAAaA,EACbC,gBAAeA,EACfC,cAAaA,EACbe,eAAcA,EACdK,YAAWA,EACXR,eAAcA,EACdS,eAAcA,EACdG,UAASA,EACTD,OAAMA,EACNM,cAAaA,EACbD,iBAAgBA,EAChB/D,WAAUA,EACVC,WAAUA,IACR,CACFM,EACAI,EACAC,EACAI,EACAC,EACAC,EACAC,EACAC,EACAC,EACAY,EACAC,EACAC,EACAe,EACAK,EACAR,EACAS,EACAG,EACAD,EACAM,EACAD,EACA/D,EACAC,IAGImE,EAASx7B,EAAA,CAAA,EACVwG,GAYL,MATe,aAAX8wB,GACFkE,EAAU1xB,QAAU,OACpB0xB,EAAU7sB,cAAgB,UACN,WAAX2oB,IACTkE,EAAU1xB,QAAU,cACpB0xB,EAAUhf,SAAW,OACrBgf,EAAUh2B,IAAM,QAIhBW,MAACowB,GAAYkF,UAASj6B,MAAO+5B,EAAYr1B,SACvCC,EACEC,IAAA,OAAA,CAAA6B,UAAW,YAAYvE,OAAAuE,GACvBzB,MAAOg1B,EACPE,SAAU,SAAO/6B,GAAC,OAAAI,OAAA,OAAA,OAAA,EAAA,kEAChBJ,EAAE0K,kCAEe,6BAAM,CAAA,EAAAivB,mBAAflhB,EAASzT,EAAsBtD,OAErC60B,SAAAA,EAAW9d,yDAMd,EAAA,EAAAlT,SAEAA,KAIT,GAGF6wB,GAAKrrB,YAAc,OASb,IAAAiwB,GAAe5E,GAIrB4E,GAAaC,KCttB6B,SAACj2B,GACzC,IAAAmd,EAAInd,EAAAmd,KACJ1gB,EAAKuD,EAAAvD,MACLy5B,EAAOl2B,EAAAk2B,mBAEGl2B,EAAAm2B,WACV,IAAA30B,aAAA8xB,OAAW,IAAA9xB,KACXE,EAAA1B,EAAAizB,MAAAA,aAAQ,GAAEvxB,EACV1B,EAAAo2B,gBACAC,EAAcr2B,EAAAq2B,eACdC,SACAC,EAAKv2B,EAAAu2B,MACL10B,cAAAS,OAAY,IAAAT,EAAA,KACZhB,EAAKb,EAAAa,MACLN,EAAQP,EAAAO,SACYP,EAAA0xB,WACV1xB,EAAAyxB,WACV,IAAAtvB,EAAcnC,EAAAw2B,OAAdA,OAAS,IAAAr0B,GAAKA,EACds0B,EAAOz2B,EAAAy2B,QAEDC,EAAcn4B,aAAWqyB,IACzB+F,EAAUtnB,SAAuB,MAGjCunB,EAAatsB,cACjB,SAACorB,GACEiB,EAA0DjnB,QAAUgmB,EACjEvY,IAAQuZ,aAAA,EAAAA,EAAalB,mBACvBkB,EAAYlB,iBAAiBrY,EAAMuY,EAEvC,EACA,CAACvY,EAAMuZ,IAKH1E,GAAS0E,aAAA,EAAAA,EAAa1E,SAAU,CAAA,EACnB7U,GAAQuZ,GAAcA,EAAYtE,cAAcjV,GACnE,IAAM0Z,EAAa1Z,GAAQuZ,EAAcA,EAAYjE,cAActV,QAAQvN,EACrEknB,KAAe3Z,IAAQuZ,IAAcA,EAAY/D,eAAexV,GAChE4Z,KAAkB5Z,IAAQuZ,IAAcA,EAAY7D,kBAAkB1V,GAIlEA,GAAO6U,EAAO7U,GAIxB,IAAM6Z,EACJX,IACCQ,EACG,QACAE,EACA,aACAD,IAAiBD,EACjB,eACAjnB,GAGAqnB,OAAwBrnB,IAAT0mB,EAAqBA,EAAQO,QAAcjnB,EAG1DsnB,EAAe7nB,SAAO4jB,GACtBkE,EAAkB9nB,SAAOikB,GACzB8D,EAAe/nB,UAAO,GAGtBgoB,EAAa/D,GAAYL,EAAMqC,KAAK,SAACtB,GAAS,OAAAA,EAAKV,QAAL,GAG9CgE,EAAepjB,EAAAA,QAAQ,WAC3B,IAAKkjB,EAAa1nB,QAEhB,OADA0nB,EAAa1nB,SAAU,GAChB,EAGT,GAAIwnB,EAAaxnB,QAAQ9U,SAAWq4B,EAAMr4B,OACxC,OAAO,EAGT,GAAIs8B,EAAaxnB,UAAYujB,EAC3B,OAAO,EAGT,IAAK,IAAIx4B,EAAI,EAAGA,EAAIw4B,EAAMr4B,OAAQH,IAAK,CACrC,IAAM88B,EAAWL,EAAaxnB,QAAQjV,GAChC+8B,EAAWvE,EAAMx4B,GACvB,IACE88B,aAAQ,EAARA,EAAUjE,aAAakE,aAAQ,EAARA,EAAUlE,YACjCiE,aAAQ,EAARA,EAAU/tB,YAAYguB,aAAQ,EAARA,EAAUhuB,WAChC+tB,aAAQ,EAARA,EAAU91B,SAAS+1B,aAAQ,EAARA,EAAU/1B,QAC7B81B,aAAQ,EAARA,EAAUhE,YAAYiE,aAAQ,EAARA,EAAUjE,WAChCgE,aAAQ,EAARA,EAAU/iB,QAAQgjB,aAAQ,EAARA,EAAUhjB,OAC5B+iB,aAAQ,EAARA,EAAU9iB,QAAQ+iB,aAAQ,EAARA,EAAU/iB,OAC5B8iB,aAAQ,EAARA,EAAU/D,QAAQgE,aAAQ,EAARA,EAAUhE,OAC5B+D,aAAA,EAAAA,EAAU9D,eAAe+D,aAAA,EAAAA,EAAU/D,YAEnC,OAAO,CAEV,CACD,OAAO,CACT,EAAG,CAACR,IAGJ7qB,EAAAA,UAAU,WACR,GAAK+U,GAASuZ,EAkBd,QAdGQ,EAAaxnB,SACd4nB,GACAH,EAAgBznB,UAAY4jB,KAG5B4D,EAAaxnB,QAAUujB,EACvBkE,EAAgBznB,QAAU4jB,EAE1BoD,EAAYhD,cAAcvW,EAAM,CAC9B8V,MAAKA,EACLK,SAAU+D,KAIP,WACDla,GAAQuZ,GACVA,EAAY/C,gBAAgBxW,EAEhC,CAGF,EAAG,CAACA,IAyJJ,GAAIqZ,EAAQ,OAAO,KAgFnB,OACEr2B,EACEC,KAAA,MAAA,CAAAmO,IAAKqoB,EACLt0B,UAAW,iBAAiBvE,OAAAuE,GAC5BzB,MACExG,EAAA,CAAA8J,QAAS,OACT6E,cAAe,SACf8lB,aAAc,QACXjuB,GAAKN,SAAA,CAGT9D,GACC0D,EACEC,KAAA,QAAA,CAAA81B,QAASA,EACTr1B,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZ0qB,aAAc,MACdpvB,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZC,WAAY,KACbhE,SAAA,CAEA9D,EACA46B,GACC72B,EAAAA,IAAA,OAAA,CACEK,MAAO,CACLX,MAAO,UACP+W,WAAY,OACb1W,SAAA,MAKJk2B,GAAWj2B,EAAAA,IAjHG,SAACR,GAAE,IAAAsc,EAAOtc,EAAAsc,QACzB9a,EAAgC8N,EAAM1M,UAAS,GAA9C60B,EAAWj2B,EAAA,GAAEk2B,OACdC,EAAaroB,EAAMD,OAAuB,MAiBhD,OAfAC,EAAMlH,UAAU,WACd,IAAMiN,EAAqB,SAACC,GACtBqiB,EAAWjoB,UAAYioB,EAAWjoB,QAAQ6F,SAASD,EAAMvF,SAC3D2nB,GAAe,EAEnB,EAEA,GAAID,EAEF,OADAnsB,SAAS6J,iBAAiB,YAAaE,GAChC,WACL/J,SAAS8J,oBAAoB,YAAaC,EAC5C,CAEJ,EAAG,CAACoiB,IAGFt3B,EAAAA,YAAKU,MAAO,CAAEqD,SAAU,WAAYC,QAAS,eAAgB8S,WAAY,iBACvEzW,EAAAA,IACE,MAAA,CAAA0B,QAAS,SAAClH,GACRA,EAAE+P,kBACF2sB,GAAgBD,EACjB,EACD52B,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBG,OAAQ,UACRtE,MAAO,WACRK,SAEDC,EAACC,IAAAgY,EAAc,CAAA,KAEhBgf,GACCt3B,EAAAA,KAAA,MAAA,CACEoO,IAAKopB,EACL92B,MAAO,CACLqD,SAAU,WACV0E,IAAK,OACLC,KAAM,MACN6B,UAAW,mBACXI,UAAW,MACX7F,QAAS,WACTH,gBAAiB,UACjB5E,MAAO,UACPR,SAAU,OACVC,WAAY,OACZ2E,WAAY,sBACZS,aAAc,MACdF,WAAY,SACZiE,OAAQ,IACRlF,UAAW,kCACZrD,SAAA,CAEA+b,EACD9b,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLqD,SAAU,WACV0E,IAAK,OACLC,KAAM,MACN6B,UAAW,mBACXhK,MAAO,EACPnB,OAAQ,EACRq4B,WAAY,wBACZxJ,YAAa,wBACbyJ,aAAc,4BAO5B,EAsCmC,CAACvb,QAASma,OAGzCt2B,EAAKC,KAAA,MAAA,CAAAS,MAAO,CAAEH,MAAO,kBACnBF,EAAAA,IACG,MAAA,CAAAD,SAAA+O,EAAMwoB,SAASvvB,IAAIhI,EAAU,SAACw3B,GAC7B,OAAIzoB,EAAM0oB,eAAeD,GAhRhB,SAACA,yBAClB,IAAKzoB,EAAM0oB,eAAeD,GAAQ,OAAOA,EAEzC,IAAME,EACA59B,EAAA,CAAA,EAAA09B,EAAMjxB,OAIZ,GAAIqW,GAAQuZ,EAAa,CACvB,IAAMwB,EAAaxB,EAAYtE,cAAcjV,GACvCgb,EAAgBzB,EAAYrE,cAElC,IAAK8F,EAEH,OAAOJ,EAIT,IAAMK,EAAYL,EAAMt2B,KACxB,GAAI22B,IAAmC,iBAAdA,GAA+C,mBAAdA,IAA6B,gBAAiBA,EAAW,CACjH,IAAMryB,EAAcqyB,EAAUryB,YAG9B,GAAoB,UAAhBA,GAA2C,aAAhBA,EAA4B,CACzDkyB,EAAWp8B,MAAQq8B,GAAc,GACjC,IAAMG,EAAuC,QAAnBr4B,EAAA+3B,EAAMjxB,aAAa,IAAA9G,OAAA,EAAAA,EAAE+O,SACzCupB,EAAqC,QAAnB92B,EAAAu2B,EAAMjxB,aAAa,IAAAtF,OAAA,EAAAA,EAAEyN,OAC7CgpB,EAAWlpB,SAAW,SAAC/T,GACrBm9B,EAAchb,EAAMniB,EAAE+U,OAAOlU,OAC7Bw8B,SAAAA,EAAmBr9B,GAEfmiB,GAAQuZ,GAEVxsB,WAAW,WACTwsB,EAAY9C,cAAczW,EAC3B,EAAE,EAEP,EACA8a,EAAWhpB,OAAS,SAACjU,GACfmiB,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAClCuZ,EAAY9C,cAAczW,IAE5Bmb,SAAAA,EAAiBt9B,EACnB,EACAi9B,EAAW9xB,MAAmC,UAA3B6wB,CACpB,MAEI,GAAoB,WAAhBjxB,EAA0B,CACjCkyB,EAAWp8B,MAAQq8B,EACnB,IAAMK,EAAuC,QAAnB72B,EAAAq2B,EAAMjxB,aAAa,IAAApF,OAAA,EAAAA,EAAEqN,SACzCypB,EAAqC,QAAnB72B,EAAAo2B,EAAMjxB,aAAa,IAAAnF,OAAA,EAAAA,EAAEsN,OAC7CgpB,EAAWlpB,SAAW,SAAClT,EAAY6Z,GACjCyiB,EAAchb,EAAMthB,GACpB08B,SAAAA,EAAmB18B,EAAO6Z,GAEtByH,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAElCjT,WAAW,WACTwsB,EAAY9C,cAAczW,EAC3B,EAAE,GAEP,EACA8a,EAAWhpB,OAAS,SAACjU,GACfmiB,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAClCuZ,EAAY9C,cAAczW,IAE5Bqb,SAAAA,EAAiBx9B,EACnB,EACAi9B,EAAW9xB,MAAmC,UAA3B6wB,CACpB,MAEI,GAAoB,WAAhBjxB,EAA0B,CACjCkyB,EAAW1c,QAAU2c,IAAc,EACnC,IAAMO,EAAuC,QAAnB52B,EAAAk2B,EAAMjxB,aAAa,IAAAjF,OAAA,EAAAA,EAAEkN,SAC/CkpB,EAAWlpB,SAAW,SAACwM,EAAkBjG,GACvC6iB,EAAchb,EAAM5B,GACpBkd,SAAAA,EAAmBld,EAASjG,GAExB6H,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAElCjT,WAAW,WACTwsB,EAAY9C,cAAczW,EAC3B,EAAE,GAEP,CACD,MAEI,GAAoB,aAAhBpX,EAA4B,CACnCkyB,EAAW1c,QAAU2c,IAAc,EACnC,IAAMQ,EAAuC,QAAnB12B,EAAA+1B,EAAMjxB,aAAa,IAAA9E,OAAA,EAAAA,EAAE+M,SAC/CkpB,EAAWlpB,SAAW,SAAC/T,GACrBm9B,EAAchb,EAAMniB,EAAE+U,OAAOwL,SAC7Bmd,SAAAA,EAAmB19B,GAEfmiB,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAElCjT,WAAW,WACTwsB,EAAY9C,cAAczW,EAC3B,EAAE,GAEP,CACD,MAEI,GAAoB,UAAhBpX,EAAyB,CAEhC,IAAM4yB,EAAiC,QAAnBx2B,EAAA41B,EAAMjxB,aAAa,IAAA3E,OAAA,EAAAA,EAAEtG,MACzC,QAAmB+T,IAAf+oB,EAA0B,CAC5BV,EAAW1c,QAAU2c,IAAeS,EACpC,IAAMC,EAAuC,QAAnBv2B,EAAA01B,EAAMjxB,aAAa,IAAAzE,OAAA,EAAAA,EAAE0M,SAC/CkpB,EAAWlpB,SAAW,SAAC/T,GACrBm9B,EAAchb,EAAMwb,GACpBC,SAAAA,EAAmB59B,GAEfmiB,GAAQuZ,IACVA,EAAY9D,gBAAgBzV,GAAM,GAElCjT,WAAW,WACTwsB,EAAY9C,cAAczW,EAC3B,EAAE,GAEP,CACD,CACF,CACF,KAAM,MAEcvN,IAAfsoB,IACFD,EAAWp8B,MAAQq8B,GAErB,IAAMW,EAAuC,QAAnBr2B,EAAAu1B,EAAMjxB,aAAa,IAAAtE,OAAA,EAAAA,EAAEuM,SAC/CkpB,EAAWlpB,SAAW,SAAC/T,WACfa,EAAwB,QAAhB2F,EAAS,QAATxB,EAAAhF,aAAA,EAAAA,EAAG+U,cAAM,IAAA/P,OAAA,EAAAA,EAAEnE,aAAK,IAAA2F,EAAAA,EAAIxG,EAClCm9B,EAAchb,EAAMthB,GACpBg9B,SAAAA,EAAmB79B,EACrB,CACD,CACF,CAOD,MAJ+B,UAA3Bg8B,GAAsC,UAAWiB,IACnDA,EAAW9xB,OAAQ,GAGdmJ,EAAMwpB,aAAaf,EAAOE,EACnC,CA6HmBc,CAAWhB,GAEbA,MAGVd,GACCz2B,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLiK,UAAW,MACXpL,SAAU,OACVC,WAAY,OACZ4E,WAAY,IACZrE,MAC6B,UAA3B82B,EACI,UAC2B,YAA3BA,EACA,UACA,UACN1yB,WAAY,uBACb/D,SAEA02B,IAGJV,IAAUU,GACTz2B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLiK,UAAW,MACXpL,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,uBACb/D,SAEAg2B,SAMb,EDyRAP,GAAagD,QAXb,WAEE,MAAO,CADS3pB,SAA4B,MAE9C,EE1rBM,IAAA4pB,GAAoC,SAACj5B,GACzC,IAAAwB,EAAAxB,EAAAk5B,MAAAA,OAAK,IAAA13B,EAAG,GAAEA,EACV23B,EAAWn5B,EAAAm5B,YACGC,EAAsBp5B,EAAAq5B,aACpC33B,wBAAA43B,aAAsB,GAAE53B,EACxB6P,EAAQvR,EAAAuR,SACRC,EAAUxR,EAAAwR,WACVtP,EAAOlC,EAAAkC,QACPP,EAAc3B,EAAAsC,UAAdA,OAAY,IAAAX,EAAA,KACZd,UACAgB,EAAA7B,EAAAU,MAAAA,OAAK,IAAAmB,EAAG,IAAGA,EAE0BxD,IAAUH,aAC/C,IAAMq7B,EAAUlqB,SAAuB,MACjCmqB,EAAWnqB,SAAiD,CAAA,GAG5DoqB,OAAsD7pB,IAA3BwpB,EAC3Bj3B,EAAkDS,EAAAA,SAAmB02B,GAApEI,EAAoBv3B,EAAA,GAAEw3B,EAAuBx3B,EAAA,GAE9Ck3B,EAAeI,EAA2BL,EAAyBM,EAGnEE,EAAU,SAAC/e,GACf,MAAO,aAAcA,GAAQ7gB,MAAM0Z,QAAQmH,EAAKta,SAClD,EAGMs5B,EAAavvB,EAAWA,YAC5B,SAACqG,EAAauoB,EAAyCxc,QAAA,IAAAA,IAAAA,EAAmB,IACxE,IAAmB,IAAAoX,EAAA,EAAAgG,EAAKZ,EAALpF,WAAAA,IAAO,CAArB,IAAMjZ,EAAIif,EAAAhG,GACb,GAAI8F,EAAQ/e,GAAO,CAEjB,IAAMkf,EAAQF,EAAWlpB,EAAKkK,EAAKta,SAAUmc,GAC7C,GAAIqd,EAAO,OAAOA,CACnB,KAAM,CACL,IAAMC,EAAWnf,EACXof,SAAkBvd,GAAI,GAAA,CAAEsd,EAASrpB,SACvC,GAAIqpB,EAASrpB,MAAQA,EACnB,OAAOspB,CAEV,CACF,CACD,OAAO,IACR,EACD,IAIIC,EAAkB5vB,cACtB,SAACuQ,SACC,IAAIA,EAAKjZ,SAAT,CAEA,IAEIu4B,EAFEC,EAAUP,EAAWhf,EAAKlK,IAAKuoB,IAAU,CAACre,EAAKlK,KAClC0oB,EAAazlB,SAASiH,EAAKlK,MAI5CwpB,EAAkBd,EAAa9zB,OAAO,SAAC80B,GAAM,OAAAA,IAAMxf,EAAKlK,GAAX,GAC7Ca,SAAAA,EAAa,CAAEb,IAAKkK,EAAKlK,IAAKypB,UAASf,aAAcc,MAErDA,EAAkB,CAACtf,EAAKlK,KACxBY,SAAAA,EAAW,CAAEZ,IAAKkK,EAAKlK,IAAKypB,UAASf,aAAcc,KAGhDV,GACHE,EAAwBQ,GAId,QAAZn6B,EAAA6a,EAAK3Y,eAAO,IAAAlC,GAAAA,EAAA5F,KAAAygB,EAAG,CAAElK,IAAKkK,EAAKlK,IAAKypB,QAAOA,IAGlCvf,EAAKyf,iBACRp4B,SAAAA,EAAU,CAAEyO,IAAKkK,EAAKlK,IAAKypB,QAAOA,GAvBV,CAyB5B,EACA,CAACf,EAAcI,EAA0BloB,EAAUC,EAAYtP,EAASg3B,EAAOW,IAgG3EU,EAAiB,SAAC1f,GACtB,IAAM5C,EAAaohB,EAAazlB,SAASiH,EAAKlK,KAG9C,GAAIkK,EAAKhP,OACP,OACErL,EAAAA,IAAA,MAAA,CAAoB8B,UAAWuY,EAAKvY,UAAWzB,MAAOga,EAAKha,MAAKN,SAC7Dsa,EAAKhP,OAAOgP,EAAM5C,IADX4C,EAAKlK,KAMnB,IAAM6pB,KACJr2B,QAAS,OACTC,WAAY,SACZa,QAAS,YACTT,OAAQqW,EAAKjZ,SAAW,cAAgB,UACxClC,SAAU,OACVC,WAAY,OACZ2E,WAAY,sBACZC,WAAY,IACZrE,MAAO2a,EAAKjZ,SACR,UACAiZ,EAAK4f,OACL,UACA,UACJ31B,gBAAiB,cACjBJ,WAAY,yBACZrD,QAASwZ,EAAKjZ,SAAW,GAAM,GAC5BiZ,EAAKha,OAGV,OACEV,EAAAC,KAAA,MAAA,CAEEmO,IAAK,SAACmnB,GACJ8D,EAAS9pB,QAAQmL,EAAKlK,KAAO+kB,CAC/B,EACApzB,UAAW,iBAAAvE,OAAiB8c,EAAKvY,WAAa,IAC9CzB,MAAO25B,EACPt4B,QAAS,WAAM,OAAAg4B,EAAgBrf,IAC/BlV,aAAc,SAAC3K,GACR6f,EAAKjZ,WACR5G,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,UAE5C,EACAc,aAAc,SAAC5K,GACbA,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,eACzCvE,SAAA,CAGAsa,EAAKtY,MACJ/B,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRoL,YAAa,OACb5J,WAAY,EACZb,MAAO2a,EAAKjZ,SACR,UACAiZ,EAAK4f,OACL,UACA,WAGLl6B,SAAAsa,EAAKtY,OAIV/B,EAAAA,IAAA,OAAA,CAAMK,MAAO,CAAE+J,KAAM,GAAGrK,SAAGsa,EAAKpe,QAE/Boe,EAAK6f,YACJl6B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACR0X,WAAY,OACZlW,WAAY,EACZb,MAAO2a,EAAKjZ,SACR,UACAiZ,EAAK4f,OACL,UACA,WAGLl6B,SAAAsa,EAAK6f,eAzDL7f,EAAKlK,IA8DhB,EAYMgqB,EACJtgC,EAAA,CAAAqG,MAAwB,iBAAVA,EAAqB,UAAGA,EAAK,MAAOA,EAClDoE,gBAAiB,UACjBC,aAAc,OACdnB,UAAW,4EACXoB,SAAU,SACVV,WAAY,uBACTzD,GAIC+5B,EAAoB,SAAC5iB,EAAekhB,GACxC,GAAc,IAAVlhB,EAAa,OAAO,EACxB,IAAM6iB,EAAc3B,EAAMlhB,GACpB8iB,EAAW5B,EAAMlhB,EAAQ,GAG/B,QAAI4hB,EAAQkB,OAIRlB,EAAQiB,IAAiBjB,EAAQkB,GAIvC,EAEA,OACE36B,EAAAA,YAAKoO,IAAKgrB,EAASj3B,UAAW,iBAAAvE,OAAiBuE,GAAazB,MAAO85B,EAEhEp6B,SAAA,CAAA44B,IArOEA,EAGDA,EAAYttB,OACPstB,EAAYttB,OAAOstB,GAI1B34B,EAAAA,WACE0B,QAASi3B,EAAYj3B,QACrBrB,MAAO,CACLoE,QAAS,OACTT,OAAQ20B,EAAYj3B,QAAU,UAAY,UAC1C21B,aAAc,qBACft3B,SAEDJ,cAAKU,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUvE,IAAK,QAExDU,SAAA,CAAAJ,EAAAA,KAAA,MAAA,CAAKU,MAAO,CAAEqD,SAAU,WAAYnD,WAAY,GAAGR,SAAA,CAChD44B,EAAY4B,QACXv6B,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLH,MAAO,OACPnB,OAAQ,OACRwF,aAAc,MACdD,gBAAiB,UACjBX,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3E,SAAU,OACVQ,MAAO,WACRK,SAE4B,iBAArB44B,EAAYhc,KAAoBgc,EAAYhc,KAAK6d,OAAO,GAAGC,cAAgB,WAI/DrrB,IAAvBupB,EAAY+B,QACX16B,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLqD,SAAU,WACViF,OAAQ,IACRD,MAAO,IACPxI,MAAO,OACPnB,OAAQ,OACRwF,aAAc,MACdD,gBAAiBq0B,EAAY+B,OAAS,UAAY,UAClDv3B,OAAQ,0BAMhBxD,cAAKU,MAAO,CAAE+J,KAAM,EAAGC,SAAU,GAC/BtK,SAAA,CAAAC,MAAA,MAAA,CACEK,MAAO,CACLnB,SAAU,OACV6E,WAAY,IACZ5E,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZwqB,aAAc,MACd9pB,SAAU,SACVgS,aAAc,WACdnS,WAAY,UACbtE,SAEA44B,EAAYhc,OAEdgc,EAAY7E,OACX9zB,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLnB,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZU,SAAU,SACVgS,aAAc,WACdnS,WAAY,UAGbtE,SAAA44B,EAAY7E,gBAjFA,MAwOvB9zB,EAAAC,IAAA,MAAA,CAAAF,SACG24B,EAAM3wB,IAAI,SAACsS,EAAM7C,GAAU,OAC1B7X,EAAAA,KAACmP,EAAMhP,oBAEJs6B,EAAkB5iB,EAAOkhB,IACxB14B,MACE,MAAA,CAAAK,MAAO,CACLtB,OAAQ,MACRuF,gBAAiB,UACjB0V,OAAQ,WAKbof,EAAQ/e,IAxDEsgB,EAyDKtgB,EAvDtBra,MAAkC,MAAA,CAAA8B,UAAW,kBAAAvE,OAAkBo9B,EAAM74B,WAAa,IAC/E/B,SAAA46B,EAAM56B,SAASgI,IAAI,SAACsS,GAAS,OAAA0f,EAAe1f,EAAf,IADtB,gBAASsgB,EAAMC,SAwDfb,EAAe1f,KAdA7C,GA5CT,IAACmjB,QAgEvB,EAEAlC,GAASlzB,YAAc,WC9WvB,IAqEMs1B,GAAoB,SACxBC,EACAC,EACAr3B,EACArE,QAAA,IAAAA,IAAAA,EAvEkB,GAyElB,IAAMmV,EAAU3J,OAAO2J,SAAW3J,OAAOmwB,YACnCzmB,EAAU1J,OAAO0J,SAAW1J,OAAOowB,YAEnCC,EAAiBJ,EAAYzyB,KAAOyyB,EAAY56B,MAAQ,EACxDi7B,EAAiBL,EAAY1yB,IAAM0yB,EAAY/7B,OAAS,EAIxDq8B,EAAW/7B,EAnFA,EAqFb+I,EAAM,EACNC,EAAO,EAEX,OAAQ3E,GACN,IAAK,MACH0E,EAAM0yB,EAAY1yB,IAAM2yB,EAAYh8B,OAASq8B,EAAW7mB,EACxDlM,EAAO6yB,EAAiBH,EAAY76B,MAAQ,EAAIsU,EAChD,MACF,IAAK,SA4BL,QACEpM,EAAM0yB,EAAYnyB,OAASyyB,EAAW7mB,EACtClM,EAAO6yB,EAAiBH,EAAY76B,MAAQ,EAAIsU,QA1BlD,IAAK,OACHpM,EAAM+yB,EAAiBJ,EAAYh8B,OAAS,EAAIwV,EAChDlM,EAAOyyB,EAAYzyB,KAAO0yB,EAAY76B,MAAQk7B,EAAW5mB,EACzD,MACF,IAAK,QACHpM,EAAM+yB,EAAiBJ,EAAYh8B,OAAS,EAAIwV,EAChDlM,EAAOyyB,EAAYpyB,MAAQ0yB,EAAW5mB,EACtC,MACF,IAAK,WACHpM,EAAM0yB,EAAY1yB,IAAM2yB,EAAYh8B,OAASq8B,EAAW7mB,EACxDlM,EAAOyyB,EAAYzyB,KAAOmM,EAC1B,MACF,IAAK,YACHpM,EAAM0yB,EAAY1yB,IAAM2yB,EAAYh8B,OAASq8B,EAAW7mB,EACxDlM,EAAOyyB,EAAYpyB,MAAQqyB,EAAY76B,MAAQsU,EAC/C,MACF,IAAK,cACHpM,EAAM0yB,EAAYnyB,OAASyyB,EAAW7mB,EACtClM,EAAOyyB,EAAYzyB,KAAOmM,EAC1B,MACF,IAAK,eACHpM,EAAM0yB,EAAYnyB,OAASyyB,EAAW7mB,EACtClM,EAAOyyB,EAAYpyB,MAAQqyB,EAAY76B,MAAQsU,EAQnD,IAAM6mB,EAAgBxwB,OAAOywB,WACvBC,EAAiB1wB,OAAOsJ,YAc9B,OAXI9L,EAAOmM,EAFK,EAGdnM,EAAOmM,EAHO,EAILnM,EAAO0yB,EAAY76B,MAAQsU,EAAU6mB,EAJhC,IAKdhzB,EAAOmM,EAAU6mB,EAAgBN,EAAY76B,MAL/B,GAQZkI,EAAMmM,EARM,EASdnM,EAAMmM,EATQ,EAULnM,EAAM2yB,EAAYh8B,OAASwV,EAAUgnB,EAVhC,IAWdnzB,EAAMmM,EAAUgnB,EAAiBR,EAAYh8B,OAX/B,GAaT,CAAEqJ,IAAGA,EAAEC,KAAIA,EACpB,EAGMmzB,GAAc,SAClBV,EACAC,EACAr3B,EACArE,QAAA,IAAAA,IAAAA,EApJkB,GAuJZ,IAAAG,EAA+Cq7B,GACnDC,EACAC,EACAr3B,EACArE,GAJWo8B,QAAqBC,SAQ5BlnB,EAAU3J,OAAO2J,SAAW3J,OAAOmwB,YAEnC5yB,EAAMqzB,GADI5wB,OAAO0J,SAAW1J,OAAOowB,aAEnC5yB,EAAOqzB,EAAiBlnB,EAGxBmnB,EAAgBvzB,EAAM2yB,EAAYh8B,OAClC68B,EAAevzB,EAAO0yB,EAAY76B,MAClC27B,EAAazzB,EACb0zB,EAAczzB,EAGd0zB,EAAav1B,KAAKyN,IAAI4nB,EAAYf,EAAY1yB,KAC9C4zB,EAAgBx1B,KAAKwN,IAAI2nB,EAAeb,EAAYnyB,QACpDszB,EAAcz1B,KAAKyN,IAAI6nB,EAAahB,EAAYzyB,MAChD6zB,EAAe11B,KAAKwN,IAAI4nB,EAAcd,EAAYpyB,OAGxD,OAAOszB,EAAgBD,EAAa,GAAKG,EAAeD,EAAc,CACxE,EAmDME,GAAc,SAClBz4B,EACA04B,GAEA,IAAMC,KACJ34B,SAAU,WACVxD,MAAO,EACPnB,OAAQ,EACRu9B,YAAa,SACVF,GAGCG,EAA4D,CAChEn0B,WACKi0B,GAAc,CACjBG,YAAa,UAtPA,EAsPa,OAAAj/B,OAtPb,EAsP6B,SAAAA,OAtP7B,EAsPmD,MAChEk/B,YAAa,gDAEf9zB,cACK0zB,GAAc,CACjBG,YAAa,YA3PA,EA2Pe,OAAAj/B,OA3Pf,EA2P+B,OAAAA,OA3P/B,EA2PmD,MAChEk/B,YAAa,gDAEfp0B,YACKg0B,GAAc,CACjBG,YAAa,UAhQA,EAgQa,SAAAj/B,OAhQb,EAgQ+B,OAAAA,OAhQ/B,EAgQmD,MAChEk/B,YAAa,gDAEf/zB,aACK2zB,GAAc,CACjBG,YAAa,UArQA,EAqQa,OAAAj/B,OArQb,EAqQ6B,OAAAA,OArQ7B,EAqQmD,QAChEk/B,YAAa,gDAEf,kBACKJ,GAAc,CACjBG,YAAa,UA1QA,EA0Qa,OAAAj/B,OA1Qb,EA0Q6B,SAAAA,OA1Q7B,EA0QmD,MAChEk/B,YAAa,gDAEf,mBACKJ,GAAc,CACjBG,YAAa,UA/QA,EA+Qa,OAAAj/B,OA/Qb,EA+Q6B,SAAAA,OA/Q7B,EA+QmD,MAChEk/B,YAAa,gDAEf,qBACKJ,GAAc,CACjBG,YAAa,YApRA,EAoRe,OAAAj/B,OApRf,EAoR+B,OAAAA,OApR/B,EAoRmD,MAChEk/B,YAAa,gDAEf,sBACKJ,GAAc,CACjBG,YAAa,YAzRA,EAyRe,OAAAj/B,OAzRf,EAyR+B,OAAAA,OAzR/B,EAyRmD,MAChEk/B,YAAa,iDAGjB,OAAOz8B,EAAAA,IAAA,MAAA,CAAKK,MAAOk8B,EAAY74B,IACjC,ECrRMg5B,GAAiB,SACrB5B,EACA6B,EACAloB,EACA+N,GAEA,OAAQ/N,GACN,IAAK,MACH,OAAOqmB,EAAY1yB,KAAOu0B,EAAY59B,OAASyjB,EAxB5B,EAyBrB,IAAK,SACH,OAAO3X,OAAOsJ,YAAc2mB,EAAYnyB,QAAUg0B,EAAY59B,OAASyjB,EA1BpD,EA2BrB,IAAK,OACH,OAAOsY,EAAYzyB,MAAQs0B,EAAYz8B,MAAQsiB,EA5B5B,EA8BrB,QACE,OAAO3X,OAAOywB,WAAaR,EAAYpyB,OAASi0B,EAAYz8B,MAAQsiB,EA/BjD,EAiCzB,EAEMoa,GAAoB,SAAC9B,EAAsBrmB,GAC/C,OAAQA,GACN,IAAK,MACH,OAAOqmB,EAAY1yB,IACrB,IAAK,SACH,OAAOyC,OAAOsJ,YAAc2mB,EAAYnyB,OAC1C,IAAK,OACH,OAAOmyB,EAAYzyB,KAErB,QACE,OAAOwC,OAAOywB,WAAaR,EAAYpyB,MAE7C,EAiEMm0B,GAAkC,SAACr9B,SACvCO,EAAQP,EAAAO,SACR+b,EAAOtc,EAAAsc,QACP5a,EAAA1B,EAAAs9B,QAAAA,OAAU,IAAA57B,EAAA,QAAOA,EACjBuQ,EAAIjS,EAAAiS,KACJtQ,EAAmB3B,EAAA+R,YAAnBA,OAAW,IAAApQ,GAAQA,EACnBumB,EAAYloB,EAAAkoB,aACZrmB,EAAA7B,EAAAiV,UAAAA,OAAY,IAAApT,EAAA,UACZnB,EAAKV,EAAAU,MACLsB,EAAuBhC,EAAAgjB,OAAvBA,OAAM,IAAAhhB,EA1He,EA0HEA,EACvBG,EAAcnC,EAAAsC,UAAdA,OAAS,IAAAH,EAAG,GAAEA,EACdE,EAAqBrC,EAAAu9B,iBAArBA,OAAgB,IAAAl7B,EAAG,GAAEA,EACrBG,EAAAxC,EAAA4B,SAAAA,OAAQ,IAAAY,GAAQA,EAChBg7B,EAAax9B,EAAAw9B,cACbC,EAAoBz9B,EAAAy9B,qBAEdC,EACqC,QAAzCl8B,EAAAg8B,QAAAA,EAAiBC,SAAwB,IAAAj8B,GAAAA,EACrCmO,OAAwBC,IAATqC,EACftP,EAAwCC,EAAAA,SAASmP,GAAhD4rB,EAAeh7B,EAAA,GAAEi7B,EAAkBj7B,EAAA,GACpCk7B,EAAUluB,IAAiBsC,EAAO0rB,EAClC56B,EAAkCH,EAAAA,SAA8B,CACpEgG,IAAK,EACLC,KAAM,EACNxH,QAAS,IAHJy8B,EAAY/6B,EAAA,GAAEg7B,OAMfC,EAAa3uB,SAAuB,MACpC4uB,EAAa5uB,SAAuB,MAEpC6uB,EAAa5zB,cACjB,SAAC6zB,GACMxuB,GACHiuB,EAAmBO,GAErBjW,SAAAA,EAAeiW,EACjB,EACA,CAACxuB,EAAcuY,IAGXkW,EAAiB9zB,EAAAA,YAAY,WACjC,GAAKuzB,GAAYG,EAAWtuB,SAAYuuB,EAAWvuB,QAAnD,CAIA,IAAM4rB,EAAc0C,EAAWtuB,QAAQ2E,wBACjC8oB,EAAcc,EAAWvuB,QAAQ2E,wBACjCgqB,EAAgB,WACpB,GAAInB,GAAe5B,EAAa6B,EAAaloB,EAAW+N,GACtD,OAAO/N,EAET,IAAMqpB,EAjKiB,SAACrpB,GAC5B,OAAQA,GACN,IAAK,MACH,MAAO,SACT,IAAK,SACH,MAAO,MACT,IAAK,OACH,MAAO,QAET,QACE,MAAO,OAEb,CAqJgCspB,CAAqBtpB,GAC/C,OAAIioB,GAAe5B,EAAa6B,EAAamB,EAAmBtb,IAGzDoa,GAAkB9B,EAAagD,GAAqBlB,GAAkB9B,EAAarmB,GAFjFqpB,EAILrpB,CACL,CAXqB,GAahBjV,EA3HmB,SAC3Bs7B,EACA6B,EACAloB,EACA+N,GAEA,IAAMhO,EAAU3J,OAAO2J,SAAW3J,OAAOmwB,YACnCzmB,EAAU1J,OAAO0J,SAAW1J,OAAOowB,YACnCC,EAAiBJ,EAAYzyB,KAAOyyB,EAAY56B,MAAQ,EACxDi7B,EAAiBL,EAAY1yB,IAAM0yB,EAAY/7B,OAAS,EAE9D,OAAQ0V,GACN,IAAK,MACH,MAAO,CACLrM,IAAK0yB,EAAY1yB,IAAMu0B,EAAY59B,OAASyjB,EAASjO,EACrDlM,KAAM6yB,EAAiByB,EAAYz8B,MAAQ,EAAIsU,GAEnD,IAAK,SACH,MAAO,CACLpM,IAAK0yB,EAAYnyB,OAAS6Z,EAASjO,EACnClM,KAAM6yB,EAAiByB,EAAYz8B,MAAQ,EAAIsU,GAEnD,IAAK,OACH,MAAO,CACLpM,IAAK+yB,EAAiBwB,EAAY59B,OAAS,EAAIwV,EAC/ClM,KAAMyyB,EAAYzyB,KAAOs0B,EAAYz8B,MAAQsiB,EAAShO,GAG1D,QACE,MAAO,CACLpM,IAAK+yB,EAAiBwB,EAAY59B,OAAS,EAAIwV,EAC/ClM,KAAMyyB,EAAYpyB,MAAQ8Z,EAAShO,GAG3C,CAyF0BwpB,CAAqBlD,EAAa6B,EAAakB,EAAerb,GAC9Eyb,EAxFc,SAAC71B,EAAaC,EAAcs0B,GAClD,IAAMnoB,EAAU3J,OAAO2J,SAAW3J,OAAOmwB,YACnCzmB,EAAU1J,OAAO0J,SAAW1J,OAAOowB,YACnCI,EAAgBxwB,OAAOywB,WACvBC,EAAiB1wB,OAAOsJ,YAG1B+pB,EAAU91B,EACV+1B,EAAW91B,EAgBf,OAdI81B,EAAW3pB,EA/FQ,IAgGrB2pB,EAAW3pB,EAhGU,GAkGnB2pB,EAAWxB,EAAYz8B,MAAQsU,EAAU6mB,EAlGtB,IAmGrB8C,EAAW3pB,EAAU6mB,EAAgBsB,EAAYz8B,MAnG5B,GAsGnBg+B,EAAU3pB,EAtGS,IAuGrB2pB,EAAU3pB,EAvGW,GAyGnB2pB,EAAUvB,EAAY59B,OAASwV,EAAUgnB,EAzGtB,IA0GrB2C,EAAU3pB,EAAUgnB,EAAiBoB,EAAY59B,OA1G5B,GA6GhB,CAAEqJ,IAAK81B,EAAS71B,KAAM81B,EAC/B,CA+DoBC,cAA2BzB,GAE3CY,EAAgB,CACdn1B,IAAK61B,EAAQ71B,IACbC,KAAM41B,EAAQ51B,KACdxH,QAAS,GAvBV,CAyBF,EAAE,CAACw8B,EAAS5oB,EAAW+N,IAElB6b,EAAcv0B,EAAAA,YAAY,WAC1B1I,GACJs8B,GAAW,EACb,EAAG,CAACt8B,EAAUs8B,IAERY,EAAex0B,EAAAA,YAAY,WAC/B4zB,GAAW,EACb,EAAG,CAACA,IAEEa,EAAgBz0B,EAAAA,YAAY,WAC5B1I,GACJs8B,GAAYL,EACb,EAAE,CAACj8B,EAAUi8B,EAASK,IAEvB91B,EAAAA,UAAU,WACR,GAAKy1B,EASL,OAPA3oB,sBAAsB,WACpBkpB,GACF,GAEA/yB,OAAO8J,iBAAiB,SAAUipB,GAClC/yB,OAAO8J,iBAAiB,SAAUipB,GAAgB,GAE3C,WACL/yB,OAAO+J,oBAAoB,SAAUgpB,GACrC/yB,OAAO+J,oBAAoB,SAAUgpB,GAAgB,EACvD,CACF,EAAG,CAACP,EAASO,IAEbh2B,EAAAA,UAAU,WACR,GAAKy1B,GAAuB,UAAZP,EAAhB,CAEA,IAAMjoB,EAAqB,SAACC,GAC1B,IAAMvF,EAASuF,EAAMvF,OAEnBiuB,EAAWtuB,SACXuuB,EAAWvuB,UACVsuB,EAAWtuB,QAAQ6F,SAASxF,KAC5BkuB,EAAWvuB,QAAQ6F,SAASxF,IAE7B+uB,GAEJ,EAGA,OADAxzB,SAAS6J,iBAAiB,YAAaE,GAChC,WACL/J,SAAS8J,oBAAoB,YAAaC,EAC5C,CAjB4C,CAkB7C,EAAE,CAACwoB,EAASP,EAASwB,IAEtB,IAAME,EACQ,UAAZ1B,EACI,CACE33B,aAAck5B,EACdj5B,aAAck5B,EACd9vB,QAAS6vB,EACT5vB,OAAQ6vB,GAEV,CACE58B,QAAS,SAACoT,GACRA,EAAMvK,kBACNg0B,GACD,GAKHE,EAF0BpB,IAAYH,EAG1Cl9B,MACE,MAAA,CAAA+N,IAAK0vB,EACL37B,UAAW,eAAAvE,OAAew/B,GAC1B18B,MAAO,CACLqD,SAAU,WACV4E,OAAQ,KACRF,IAAKk1B,EAAal1B,IAClBC,KAAMi1B,EAAaj1B,KACnBxH,QAASw8B,EAAUC,EAAaz8B,QAAU,EAC1C69B,WAAYrB,EAAU,UAAY,SAClC90B,cAAe80B,EAAU,OAAS,OAClCn5B,WAAY,yBACZhE,MAAwB,iBAAVA,EAAqB,GAAA3C,OAAG2C,EAAK,MAAOA,EAClD8J,SAAU,gBAAAzM,OAAgBohC,GAAyB,OACnDr6B,gBAAiB,UACjBnB,OAAQ,sBACRoB,aAAc,OACdE,QAAS,MACTqL,UAAW,aACX1M,UACE,+KAEJ+B,aAA0B,UAAZ23B,EAAsBuB,OAAcjvB,EAClDhK,aAA0B,UAAZ03B,EAAsBwB,OAAelvB,EACnD/J,YAAyB,UAAZy3B,EAAsB,SAAChoB,GAAU,OAAAA,EAAMvK,wBAAoB6E,EAEvErP,SAAA+b,IAED,KAEJ,OACEnc,EAAAA,KACEE,EAAAA,SAAA,CAAAE,SAAA,CAAAC,MAAA,MAAAnG,EAAA,CACEkU,IAAKyvB,EACL17B,UAAW,uBAAAvE,OAAuBuE,GAClCzB,MAAO,CAAEsD,QAAS,eAAgBK,OAAQ5C,EAAW,cAAgB,YACjEo9B,EAEH,CAAAz+B,SAAAA,KAEF0+B,GAAmC,oBAAb3zB,UAA4BoM,eAAaunB,EAAa3zB,SAASjP,QAG5F,EAEAghC,GAAQt3B,YAAc,UCpRtB,IAAMq5B,GAAqB,IAErBC,GAAgC,SAACr/B,OACrCiS,EAAIjS,EAAAiS,KACJzQ,EAAAxB,EAAA+R,YAAAA,OAAc,IAAAvQ,GAAKA,EACnBoI,EAAO5J,EAAA4J,QACP01B,EAAet/B,EAAAs/B,gBACflE,EAAKp7B,EAAAo7B,MACL7E,EAAKv2B,EAAAu2B,MACLgJ,EAAMv/B,EAAAu/B,OACNh/B,EAAQP,EAAAO,SACRmB,EAAmB1B,EAAAiV,UAAnBA,OAAS,IAAAvT,EAAG,QAAOA,EACnBC,EAAA3B,EAAAU,MAAAA,OAAQ,IAAAiB,EAAA,IAAGA,EACXE,EAAY7B,EAAAT,OAAZA,OAAM,IAAAsC,EAAG,IAAGA,EACZG,EAAAhC,EAAAw/B,KAAAA,OAAO,IAAAx9B,GAAIA,EACXG,EAAmBnC,EAAAy/B,aAAnBA,OAAY,IAAAt9B,GAAOA,EACnBE,EAAArC,EAAA+W,SAAAA,OAAW,IAAA1U,GAAIA,EACfq9B,EAAS1/B,EAAA0/B,UACTl9B,EAAAxC,EAAA2/B,SAAAA,OAAW,IAAAn9B,GAAIA,EACfG,EAAsB3C,EAAA4/B,eAAtBA,OAAc,IAAAj9B,GAAQA,EACtBI,EAAA/C,EAAA8I,OAAAA,OAAS,IAAA/F,EAAA,IAAIA,EACb4O,EAAsB3R,EAAA6/B,iBAAtBA,OAAgB,IAAAluB,EAAG,IAAGA,EACtBG,EAAA9R,EAAAsC,UAAAA,OAAY,IAAAwP,EAAA,GAAEA,EACdjR,EAAKb,EAAAa,MACLi/B,EAAW9/B,EAAA8/B,YACXC,EAAW//B,EAAA+/B,YACXC,EAAShgC,EAAAggC,UACTC,EAAWjgC,EAAAigC,YACXC,EAASlgC,EAAAkgC,UAEHvwB,OAAwBC,IAATqC,EACfI,EAAkCzP,EAAAA,SAASmP,GAA1CS,EAAYH,EAAA,GAAEI,EAAeJ,EAAA,GAC9B8tB,EAAaxwB,IAAiBsC,EAAOO,EACrCF,EAAkC1P,EAAAA,SAASu9B,GAA1CC,EAAY9tB,EAAA,GAAE+tB,EAAe/tB,EAAA,GAC9BC,EAAkC3P,EAAAA,SAASu9B,GAA1CG,EAAY/tB,EAAA,GAAEguB,EAAehuB,EAAA,GAC9BG,GAAwB9P,EAAAA,UAAS,GAAhC49B,GAAO9tB,GAAA,GAAE+tB,GAAU/tB,GAAA,GACpBG,GAA0BjQ,EAAAA,UAAS,GAAlC89B,GAAQ7tB,GAAA,GAAE8tB,GAAW9tB,GAAA,GAE5BzK,EAAAA,UAAU,WACRq4B,IAAW,EACZ,EAAE,IAEHr4B,EAAAA,UAAU,WACR,IAAMw4B,EAAe,WACnBD,GAAYt1B,OAAOywB,WAAa+D,EAClC,EAIA,OAFAe,IACAv1B,OAAO8J,iBAAiB,SAAUyrB,GAC3B,WACLv1B,OAAO+J,oBAAoB,SAAUwrB,EACvC,CACF,EAAG,CAACf,IAEJz3B,EAAAA,UAAU,WACR,GAAI+3B,EAAY,CACdE,GAAgB,GAEhBE,GAAgB,GAChB,IAAMM,EAAM3rB,sBAAsB,WAChCA,sBAAsB,WACpBqrB,GAAgB,EAClB,EACF,GACMn2B,EAAQiB,OAAOnB,WAAW,WAC9Bo1B,SAAAA,GAAkB,EACnB,EAAEF,IACH,OAAO,WACL0B,qBAAqBD,GACrBx1B,OAAOlB,aAAaC,EACtB,CACD,CAEDm2B,GAAgB,GAChB,IAAMt2B,EAAQoB,OAAOnB,WAAW,WAC1B01B,GACFS,GAAgB,GAElBf,SAAAA,GAAkB,EACnB,EAAEF,IAEH,OAAO,WAAM,OAAA/zB,OAAOlB,aAAaF,EAApB,CACd,EAAE,CAACk2B,EAAYP,EAAgBN,IAEhCl3B,EAAAA,UAAU,WACR,GAAK+3B,GAAeR,EAApB,CAEA,IAAMnqB,EAAgB,SAACF,GACH,WAAdA,EAAM3E,MACR/G,SAAAA,EAAU0L,GACL3F,GACH8C,GAAgB,GAGtB,EAGA,OADAnH,SAAS6J,iBAAiB,UAAWK,GAC9B,WACLlK,SAAS8J,oBAAoB,UAAWI,EAC1C,CAdqC,CAetC,EAAE,CAAC2qB,EAAYR,EAAU/1B,EAAS+F,IAEnCvH,EAAAA,UAAU,WACR,GAAKo4B,IACAL,EAAL,CAEA,IAAMY,EAAmBz1B,SAASjP,KAAKwE,MAAMmE,SAG7C,OAFAsG,SAASjP,KAAKwE,MAAMmE,SAAW,SAExB,WACLsG,SAASjP,KAAKwE,MAAMmE,SAAW+7B,CACjC,CAPwB,CAQ1B,EAAG,CAACZ,EAAYK,KAEhB,IAAMQ,GAAc12B,cAClB,SAACtP,GACC4O,SAAAA,EAAU5O,GACL2U,GACH8C,GAAgB,EAEpB,EACA,CAAC7I,EAAS+F,IAGNsxB,GAAgB/sB,EAAAA,QAAQ,WAC5B,OAAIwsB,GAAiB,QACH,SAAdzrB,GAAsC,UAAdA,EACF,iBAAVvU,EAAqB,GAAG3C,OAAA2C,EAAS,MAAGA,EAE7C,OACR,EAAE,CAACuU,EAAWyrB,GAAUhgC,IAEnBwgC,GAAiBhtB,EAAAA,QAAQ,WAC7B,MAAkB,QAAde,GAAqC,WAAdA,EACA,iBAAX1V,EAAsB,GAAGxB,OAAAwB,EAAU,MAAGA,EAE/C,OACT,EAAG,CAAC0V,EAAW1V,IAET4hC,GAAsCjtB,EAAAA,QAAQ,WAClD,OAAKwsB,KAEa,SAAdzrB,GAAsC,UAAdA,GAA8B,SAFpCA,CAIxB,EAAG,CAACyrB,GAAUzrB,IAERmsB,GAA2CltB,EAAAA,QAAQ,WACvD,IAAMmtB,EAA4B,CAChCn9B,SAAU,QACVY,gBAAiB,UACjBX,QAAS,OACT6E,cAAe,SACfsH,UAAW,aACX1M,UAAW,gEACXc,WAAY,aAAa3G,OAAAqhC,GAAiD,iCAC1Et2B,OAAQA,EAAS,GAGnB,OAAQq4B,IACN,IAAK,OACH,OAAA9mC,EAAAA,EAAA,GACKgnC,GAAI,CACPz4B,IAAK,EACLC,KAAM,EACNnI,MAAOugC,GACP1hC,OAAQ,QACRmL,UAAW41B,EAAe,gBAAkB,sBAEhD,IAAK,QACH,OAAAjmC,EAAAA,EAAA,GACKgnC,GAAI,CACPz4B,IAAK,EACLM,MAAO,EACPxI,MAAOugC,GACP1hC,OAAQ,QACRmL,UAAW41B,EAAe,gBAAkB,qBAEhD,IAAK,MACH,OAAAjmC,EAAAA,EAAA,GACKgnC,GAAI,CACPz4B,IAAK,EACLC,KAAM,EACNnI,MAAO,QACPnB,OAAQ2hC,GACRx2B,UAAW41B,EAAe,gBAAkB,sBAGhD,QACE,OAAAjmC,EAAAA,EAAA,GACKgnC,GAAI,CACPl4B,OAAQ,EACRN,KAAM,EACNnI,MAAO,QACPnB,OAAQ2hC,GACRx2B,UAAW41B,EAAe,gBAAkB,qBAGpD,EAAG,CAACa,GAAoBF,GAAeC,GAAgBZ,EAAcx3B,IAErE,IAAK03B,KAAaJ,IAAiBD,EACjC,OAAO,KAGT,IAAMmB,GACJnhC,EAAAA,KACE,MAAA,CAAAmC,UAAW,mBAAmBvE,OAAAuE,GAC9BzB,MAAKxG,EAAA,CACH6J,SAAU,QACVqY,MAAO,EACPzT,OAAMA,EACNC,cAAeo3B,GAAcG,EAAe,OAAS,QAClDz/B,GAGJN,SAAA,CAAAi/B,GACCh/B,EAAAA,IAAA,MAAA,CAAA,eAAA,EAEE0B,QAASu9B,EAAe,SAACzkC,GAAM,OAAAgmC,GAAYhmC,EAAZ,OAAiB4U,EAChD/O,MAAKxG,EAAA,CACH6J,SAAU,WACVqY,MAAO,EACP9R,WAAY,sBACZpJ,QAASi/B,EAAe,EAAI,EAC5B57B,WAAY,WAAW3G,OAAAqhC,GAAiD,kCACrEc,KAKT//B,OAAA,MAAA,CAEE6b,KAAK,SAAQ,aACF,OACXnb,MAAKxG,EAAAA,EAAA,GAAO+mC,IAAwBtB,GAEnCv/B,SAAA,OAAWqP,IAAVwrB,GAAuBrkB,GAAYwf,IACnCp2B,EAAAA,KAAA,MAAA,CACEU,MACExG,EAAA,CAAAmd,UAAW,OACXvS,QAAS,YACT4yB,aAAc,oBACd1zB,QAAS,OACTC,WAAY,SACZC,eAAgB,gBAChBxE,IAAK,QACFkgC,GAGLx/B,SAAA,CAAAC,EAAAA,IAAA,MAAA,CAAKK,MAAO,CAAEnB,SAAU,OAAQ6E,WAAY,IAAKrE,MAAO,UAAW0K,KAAM,GAAMrK,SAAA66B,IAC/Ej7B,cAAKU,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUvE,IAAK,OAAOU,SAAA,CAC9Dg2B,EACAxf,GACCvW,EACEC,IAAA,SAAA,CAAAgB,KAAK,SACLS,QAAS,SAAClH,GAAM,OAAAgmC,GAAYhmC,EAAE,EAC9B6F,MAAO,CACL8C,OAAQ,OACR8G,WAAY,cACZxF,QAAS,EACTuV,OAAQ,EACR9Z,MAAO,OACPnB,OAAQ,OACR4E,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChBG,OAAQ,UACRtE,MAAO,WAEE,aAAA,QAEVK,SAAAm/B,GACCl/B,EAAAA,WAAKE,MAAM,KAAKnB,OAAO,KAAKoB,QAAQ,YAAYC,KAAK,OACnDL,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,uBACFwH,OAAO,eACPC,YAAY,MACZE,cAAc,QACd0P,eAAe,oBAU/BxQ,EAAAA,IAAA,MAAA,CACEK,MAAKxG,EAAA,CACH4K,QAAS,OACTud,UAAW,OACX5X,KAAM,EACN0F,UAAW,cACR0vB,GAGJz/B,SAAAA,SAGSqP,IAAX2vB,GACC/+B,EAAAA,IAAA,MAAA,CACEK,MAAKxG,EAAA,CACHs2B,UAAW,oBACX1rB,QAAS,aACNg7B,GAGJ1/B,SAAAg/B,MA7EA,GAAAxhC,OAAGojC,GAAkB,KAAApjC,OAAIoiC,EAAa,OAAS,cAoF1D,OAAOzoB,eAAa4pB,GAAMh2B,SAASjP,KACrC,EAEAgjC,GAAOt5B,YAAc,SCvXrB,IAAMw7B,GAAQ,CACZpkB,KAAM,gBACNqkB,IAAK,oBACLC,QAAQ,EACRC,cAAe,GACfC,UAAW,IACXC,WAAY,KACZC,mBAAoB,KACpBC,gBAAiB,IACjB1gC,YAAa,IACb2gC,WAAY,EACZC,gBAAiB,EACjBC,WAAY,EACZC,WAAY,GAKd,SAASC,GACPC,EACAC,EACAlc,GAEA,IAAM5rB,EAAI6nC,EAAWp7B,KAAKs7B,GAAK,EACzBC,EAASv7B,KAAKw7B,MAAMrc,EAAO8b,YAC3BQ,EACJtc,EAAO4b,WAAa/6B,KAAK07B,IAAInoC,GAC7B4rB,EAAO6b,gBAAkBK,EAAmBr7B,KAAK07B,IAAIH,EAAShoC,GAC1DgC,EACJ4pB,EAAO4b,WAAa/6B,KAAK27B,IAAIpoC,GAC7B4rB,EAAO6b,gBAAkBK,EAAmBr7B,KAAK27B,IAAIJ,EAAShoC,GAChE,MAAO,CACLkoC,EAAG,GAAKA,EAAItc,EAAO+b,WACnB3lC,EAAG,GAAKA,EAAI4pB,EAAO+b,WAEvB,CAsBA,SAASU,GACP5qB,EACAoqB,EACAC,EACAlc,GAEA,IACM0c,EAAa7qB,EADLhR,KAAKyN,IAAI,EAAG0R,EAAOub,cAAgB,GAE3CznC,EAAIkoC,GArBZ,SAA2BC,GACzB,OAASA,EAAW,EAAK,GAAK,CAChC,CAoBIU,CAAkBV,EAAWS,EAAa1c,EAAOwb,WACjDU,EACAlc,GAEI4c,EAAO/7B,KAAKg8B,IAAI,EAAIH,EAAY,KACtC,MAAO,CACLJ,EAAGxoC,EAAEwoC,EACLlmC,EAAGtC,EAAEsC,EACL0mC,OAAQ,GAAa,IAAPF,EACd1hC,QAAS,IAAc,IAAP0hC,EAEpB,CAkBM,ICzDAG,GAA+C,CACnDC,KAAM,CACJ1/B,GAAI,uBACJ2I,KAAM,wBACNg3B,KAAM,wBACNC,IAAK,wBACLC,QAAS,wBACTC,WAAY,wBACZC,aAAc,yBAEhBC,MAAO,CACLhgC,GAAI,wBACJ2I,KAAM,yBACNg3B,KAAM,yBACNC,IAAK,yBACLC,QAAS,yBACTC,WAAY,yBACZC,aAAc,0BAEhBr9B,MAAO,CACL1C,GAAI,wBACJ2I,KAAM,yBACNg3B,KAAM,yBACNC,IAAK,yBACLC,QAAS,yBACTC,WAAY,yBACZC,aAAc,0BAEhBp9B,QAAS,CACP3C,GAAI,0BACJ2I,KAAM,2BACNg3B,KAAM,2BACNC,IAAK,2BACLC,QAAS,2BACTC,WAAY,2BACZC,aAAc,4BAEhBv9B,QAAS,CACPxC,GAAI,0BACJ2I,KAAM,2BACNg3B,KAAM,2BACNC,IAAK,2BACLC,QAAS,2BACTC,WAAY,2BACZC,aAAc,4BAEhBE,SAAU,CACRjgC,GAAI,4BACJ2I,KAAM,6BACNg3B,KAAM,6BACNC,IAAK,6BACLC,QAAS,6BACTC,WAAY,6BACZC,aAAc,8BAEhBG,UAAW,CACTlgC,GAAI,6BACJ2I,KAAM,8BACNg3B,KAAM,8BACNC,IAAK,8BACLC,QAAS,8BACTC,WAAY,8BACZC,aAAc,+BAEhBI,KAAM,CACJngC,GAAI,uBACJ2I,KAAM,wBACNg3B,KAAM,wBACNC,IAAK,wBACLC,QAAS,wBACTC,WAAY,wBACZC,aAAc,yBAEhBK,OAAQ,CACNpgC,GAAI,yBACJ2I,KAAM,0BACNg3B,KAAM,0BACNC,IAAK,0BACLC,QAAS,0BACTC,WAAY,0BACZC,aAAc,2BAEhBM,OAAQ,CACNrgC,GAAI,yBACJ2I,KAAM,0BACNg3B,KAAM,0BACNC,IAAK,0BACLC,QAAS,0BACTC,WAAY,0BACZC,aAAc,2BAEhBO,KAAM,CACJtgC,GAAI,uBACJ2I,KAAM,wBACNg3B,KAAM,wBACNC,IAAK,wBACLC,QAAS,wBACTC,WAAY,wBACZC,aAAc,yBAEhBQ,OAAQ,CACNvgC,GAAI,yBACJ2I,KAAM,0BACNg3B,KAAM,0BACNC,IAAK,0BACLC,QAAS,0BACTC,WAAY,0BACZC,aAAc,4BAMZS,GAAyC,CAC7CxlC,GAAI,UACJC,GAAI,WACJC,GAAI,YAEAulC,GAA0C,CAC9CzlC,GAAI,UACJC,GAAI,UACJC,GAAI,YAEAe,GAAsC,CAC1CjB,GAAI,OACJC,GAAI,OACJC,GAAI,QAKN,SAASwlC,GAAUC,EAAuBlkC,GACxC,MAAgB,WAAZkkC,EACF/pC,EAAAA,EAAA,CAAA,EACK6oC,GAAYhjC,IAAM,CACrBuD,GAAI,0BACJ2I,KAAM,8BACNg3B,KAAM,kCAGHF,GAAYhjC,EACrB,CAEA,SAASmkC,GACPD,EACAlkC,EACAD,EACAs2B,GAEA,IAAMh8B,EAAI4pC,GAAUC,EAASlkC,GACvBokC,EAAqB,SAAZF,EACTG,EAAgB,OAATtkC,IAAkBqkC,EACzBlB,EAAO,mBAAArlC,OAAmBxD,EAAE6oC,MAC5BoB,EACQ,WAAZJ,EACI,GAAGrmC,OAAAqlC,EAA8C,4CACjDA,EAEN,OACE/oC,EAAA,CAAA8J,QAAS,cACTC,WAAY,SACZS,WAAY,SACZnE,MAAO,cACPqE,aAAcu/B,EAAS,SAAWC,EAAO,MAAQ,MACjDz/B,gBAAiBvK,EAAEkJ,GACnBvD,MAAO3F,EAAE6R,KACTxI,UAAW4gC,EACXlgC,WAAY,iCACZC,WAAY,IACZ7E,SAAUA,GAASO,GACnBN,WAAqB,OAATM,EAAgB,OAAS,OACrCgF,QAASq/B,EAASL,GAAYhkC,GAAQikC,GAAajkC,IAChDs2B,EAEP,CAIA,IAAMkO,GAAwC,SAACzkC,GAAE,IAAAE,EAAKF,EAAAE,MAAO,OAC3DM,aACEE,MAAM,IACNnB,OAAO,IACPoB,QAAQ,UACRC,KAAK,OACLC,MAAO,CAAEE,WAAY,YAErBP,EAAAA,IAAQ,SAAA,CAAAQ,GAAG,IAAIC,GAAG,IAAIC,EAAE,IAAIN,KAAMV,KARuB,EAcvDwkC,GAAmD,SAAC1kC,GAAE,IAAAa,EAAKb,EAAAa,MAAO,OACtEL,EACEC,IAAA,MAAA,CAAAC,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLO,OAAO,eACPC,YAAY,MACZE,cAAc,QACdT,MAAOA,WAEPL,MAAM,OAAA,CAAA7G,EAAE,sBAX4D,ECtLlEgrC,GAA8C,CAClDC,GAAI,CACF3kC,KAAM,GAAI0D,OAAQ,GAAKjE,SAAU,2BAA4BC,WAAY,6BAA8BC,SAAU,GACjHilC,gBAAiB,CAAE5kC,KAAM,EAAG+iB,QAAS,IACrC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,IAAKrf,OAAQ,KAC/CohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,MAErCvkB,GAAI,CACFwB,KAAM,GAAI0D,OAAQ,IAAMjE,SAAU,2BAA4BC,WAAY,6BAA8BC,SAAU,GAClHilC,gBAAiB,CAAE5kC,KAAM,EAAG+iB,QAAS,KACrC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,KAAMrf,OAAQ,KAChDohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,MAErCtkB,GAAI,CACFuB,KAAM,GAAI0D,OAAQ,EAAGjE,SAAU,2BAA4BC,WAAY,6BAA8BC,SAAU,GAC/GilC,gBAAiB,CAAE5kC,KAAM,GAAI+iB,QAAS,GACtC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,EAAGrf,OAAQ,KAC7CohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,IAErCrkB,GAAI,CACFsB,KAAM,GAAI0D,OAAQ,EAAGjE,SAAU,2BAA4BC,WAAY,6BAA8BC,SAAU,GAC/GilC,gBAAiB,CAAE5kC,KAAM,GAAI+iB,QAAS,GACtC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,EAAGrf,OAAQ,KAC7CohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,IAErCpkB,GAAI,CACFqB,KAAM,GAAI0D,OAAQ,EAAGjE,SAAU,2BAA4BC,WAAY,6BAA8BC,SAAU,GAC/GilC,gBAAiB,CAAE5kC,KAAM,GAAI+iB,QAAS,GACtC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,EAAGrf,OAAQ,KAC7CohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,IAErC,MAAO,CACL/iB,KAAM,GAAI0D,OAAQ,EAAGjE,SAAU,8BAA+BC,WAAY,gCAAiCC,SAAU,GACrHilC,gBAAiB,CAAE5kC,KAAM,GAAI+iB,QAAS,GACtC8hB,YAAa,CAAE7kC,KAAM,GAAI+iB,QAAS,EAAGrf,OAAQ,OAC7CohC,aAAc,CAAE9kC,KAAM,GAAI+iB,QAAS,KAcjCgiB,GAAmF,CACvFvmC,GAAI,CAAEoB,IAAK,oBAAqBolC,aAAc,2BAA4BC,eAAgB,6BAA8BC,YAAa,2BAA4BC,cAAe,8BAChL1mC,GAAI,CAAEmB,IAAK,oBAAqBolC,aAAc,2BAA4BC,eAAgB,6BAA8BC,YAAa,2BAA4BC,cAAe,8BAChLzmC,GAAI,CAAEkB,IAAK,oBAAqBolC,aAAc,2BAA4BC,eAAgB,6BAA8BC,YAAa,2BAA4BC,cAAe,8BAChLxmC,GAAI,CAAEiB,IAAK,oBAAqBolC,aAAc,2BAA4BC,eAAgB,6BAA8BC,YAAa,2BAA4BC,cAAe,+BAK5KC,GAAgD,SAACrlC,GAAE,IAAAa,EAAKb,EAAAa,MAAO,OACnEL,EACEC,IAAA,MAAA,CAAAE,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNrF,MAAOA,WAEPL,EACEC,IAAA,OAAA,CAAA9G,EAAE,sXACFwH,OAAO,eACPC,YAAY,IACZE,cAAc,QACd0P,eAAe,WAZgD,EAmB/Ds0B,GAA0D,SAACtlC,OAAEC,EAAID,EAAAC,KAAE+iB,EAAMhjB,EAAAgjB,OAAO,OACpF7iB,EAAAC,KAAA,MAAA,CACEO,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACNrF,MAAO,CACLqD,SAAU,WACViF,OAAQ6Z,EACR9Z,MAAO8Z,EACPtiB,MAAOT,EACPV,OAAQU,EACRc,WAAY,EACZb,MAAO,wBACP8E,SAAU,SACV8D,OAAQ,GACTvI,SAAA,CAEDC,MACE,OAAA,CAAA7G,EAAE,knDACFiH,KAAK,iBAEPJ,MACE,OAAA,CAAA+kC,SAAS,UACTC,SAAS,UACT7rC,EAAE,gpBACFiH,KAAK,YAzB2E,EAgChF6kC,GAAgC,SAACzlC,GACrC,IAAAwB,EAAAxB,EAAAC,KAAAA,OAAO,IAAAuB,EAAA,KAAIA,EACXuM,EAAG/N,EAAA+N,IACHC,EAAGhO,EAAAgO,IACH03B,EAAQ1lC,EAAA0lC,SACSC,EAAe3lC,EAAA4lC,gBAChCC,EAAM7lC,EAAA6lC,OACNf,EAAW9kC,EAAA8kC,YACXgB,EAAQ9lC,EAAA8lC,SACRjlC,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEHZ,EAA4BkB,EAAAA,UAAS,GAApCmjC,EAASrkC,EAAA,GAAEskC,EAAYtkC,EAAA,GACxBukC,EAAMtB,GAAY1kC,GAClBimC,EAAe1gC,QAAQuI,IAAQg4B,GAC/BI,GAAiBD,EACjBE,EAAW5gC,QAAQqgC,GAAUf,GAAegB,GAkHlD,OACE3lC,cACEmC,UAAWA,EACXzB,SACEqD,SAAU,WACVC,QAAS,cACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAOulC,EAAIhmC,KACXV,OAAQ0mC,EAAIhmC,KACZ8E,aAAc,MACdpB,OAAQ,GAAA5F,OAAGkoC,EAAItiC,OAAM,aAAA5F,OAAYooC,EAAgB,gCAAkC,uBACnFrhC,gBAAiBqhC,EAAgB,gCAA6Bv2B,EAC9D5K,SAAUohC,OAAWx2B,EAAY,SACjC7O,WAAY,GACTF,aA9HHqlC,EAEA1lC,aACEuN,IAAKA,EACLC,IAAKA,EACLG,QAAS,WAAM,OAAA63B,GAAa,EAAb,EACfnlC,MAAO,CACLqD,SAAU,WACVqY,MAAO,EACP7b,MAAO,OACPnB,OAAQ,OACR6O,UAAW,QACXrJ,aAAc,MACdgE,cAAe,UAKnB28B,EAEAllC,EACEC,IAAA,OAAA,CAAAI,MAAO,CACLnB,SAAUumC,EAAIvmC,SACdC,WAAYsmC,EAAItmC,WAChB4E,WAAY,IACZrE,MAAO,+BACPoE,WAAY,0BACZK,WAAY,QAGbpE,SAAAmlC,IAIHC,EAEAnlC,EAAAC,IAACklC,EAAe,CACd9kC,MAAO,CACLH,MAAOulC,EAAIrmC,SACXL,OAAQ0mC,EAAIrmC,SACZM,MAAO,6BACPa,WAAY,KAMlBP,EAAAC,IAAC4kC,GAAQ,CACPxkC,MAAO,CACLH,MAAOulC,EAAIrmC,SACXL,OAAQ0mC,EAAIrmC,SACZM,MAAO,6BACPa,WAAY,KAMA,WAClB,GAAe,WAAX8kC,GAAkC,YAAXA,EAAsB,CACzC,IAAA7lC,EAA0BimC,EAAIpB,gBAAtBwB,EAAKrmC,EAAAC,KAAE+iB,EAAMhjB,EAAAgjB,OAC3B,OACExiB,EACEC,IAAA,OAAA,CAAAI,MAAO,CACLqD,SAAU,WACViF,OAAQ6Z,EACR9Z,MAAO8Z,EACPtiB,MAAO2lC,EACP9mC,OAAQ8mC,EACRthC,aAAc,MACdD,gBACa,WAAX+gC,EACI,oCACA,6BACNliC,OAAQ,sCACR5C,WAAY,IAInB,CACD,GAAI+jC,EAAa,CACT,IAAAtjC,EAAkCykC,EAAInB,YAA9BwB,EAAK9kC,EAAAvB,KAAU0D,GAARqf,EAAMxhB,EAAAwhB,iBAC3B,OACExiB,EAAAC,IAAA,MAAA,CACEsN,IAAK+2B,EAAY/2B,IACjBC,IAAK82B,EAAY92B,IACjBnN,MAAO,CACLqD,SAAU,WACViF,OAAQ6Z,EACR9Z,MAAO8Z,EACPtiB,MAAO4lC,EACP/mC,OAAQ+mC,EACRvhC,aAAc,MACdpB,OAAQ,GAAG5F,OAAA4F,EAAwC,oCACnDyK,UAAW,QACXrF,cAAe,SAItB,CACD,OAAI+8B,EAEAtlC,MAAC8kC,GAAiB,CAChBrlC,KAAMgmC,EAAIlB,aAAa9kC,KACvB+iB,OAAQijB,EAAIlB,aAAa/hB,SAIxB,IACT,CAqBKujB,KAGP,gBCtSoC,SAACvmC,OACnCwB,EAAcxB,EAAAsC,UAAdA,OAAY,IAAAd,EAAA,KACZE,EAAA1B,EAAAyB,KAAAA,OAAO,IAAAC,EAAA,SACP05B,EAAKp7B,EAAAo7B,MACLoL,EAAWxmC,EAAAwmC,YACX7kC,EAAsB3B,EAAAuC,KAAtBA,OAAI,IAAAZ,EAAGqE,EAAUvE,GAAKE,EACtBE,EAAe7B,EAAAymC,SAAfA,OAAW,IAAA5kC,GAAIA,EACfG,EAAiBhC,EAAA0mC,UAAjBA,OAAY,IAAA1kC,GAAKA,EACjB0H,EAAM1J,EAAA0J,OACNnJ,EAAQP,EAAAO,SACRqJ,EAAO5J,EAAA4J,QAYDzH,EAAwBS,EAAAA,UAAS,GAAhCi7B,EAAO17B,EAAA,GAAE+7B,EAAU/7B,EAAA,GACpBkI,EAAc,WAClB6zB,GAAW,GACXt0B,SAAAA,GACF,EAEM+8B,EAAej9B,GAAUg9B,EAE/B,OAAK7I,EAGH19B,OAAA,MAAA,CACEmC,UAAW,GAAGvE,OAtBE,4CAsBa,KAAAA,OAAAuE,GAC7BzB,MApBe,CACjBoF,QAAS,CAAEnB,gBAAiB,WAC5BqB,MAAO,CAAErB,gBAAiB,WAC1BsB,QAAS,CAAEtB,gBAAiB,WAC5BuB,KAAM,CAAEvB,gBAAiB,YAgBLrD,GAEjBlB,SAAA,CAAAkmC,GAAYlkC,EACbpC,EAAAA,KAAA,MAAA,CACEmC,UAAW,uBAAuBvE,OAAA4oC,EAAe,iBAAmB,IAEnEpmC,SAAA,CAAA66B,GACC56B,EAAKC,IAAA,MAAA,CAAA6B,UAAU,uFACZ/B,SAAA66B,IAGJoL,GACChmC,EAAKC,IAAA,MAAA,CAAA6B,UAAU,yFACZ/B,SAAAimC,IAGJjmC,GACCC,EAAAC,IAAA,MAAA,CAAK6B,UAAU,yFAAwF/B,SACpGA,OAINomC,GACCxmC,EAAKC,KAAA,MAAA,CAAAkC,UAAU,4DACZ/B,SAAA,CAAAmJ,EACAg9B,GACClmC,EAAAA,IACE,MAAA,CAAA8B,UAAU,sCACVJ,QAASmI,EACTqG,UAAW,SAAC1V,GAAM,MAAU,UAAVA,EAAE2V,KAAmBtG,GAAa,EACpD2R,KAAK,SACLzE,SAAU,EAAC,aACA,KAAIhX,SAEd+F,UAvCQ,IA8CvB,6CD8NiE,SAACtG,GAChE,IAAAwB,EAAAxB,EAAAC,KAAAA,OAAO,IAAAuB,EAAA,KAAIA,EACX2b,EAAInd,EAAAmd,KACJypB,EAAc5mC,EAAA4mC,eACdC,EAAS7mC,EAAA6mC,UACTC,EAAc9mC,EAAA8mC,eACdjB,EAAM7lC,EAAA6lC,OACNf,EAAW9kC,EAAA8kC,YACXgB,EAAQ9lC,EAAA8lC,SACRjlC,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEH2jC,EAAMjB,GAAwB/kC,GAEpC,OACEE,EACEC,KAAA,MAAA,CAAAkC,UAAWA,EACXzB,MACExG,EAAA,CAAA8J,QAAS,cACTC,WAAY,SACZvE,IAAKomC,EAAIpmC,IACTqE,SAAU,YACPrD,GAGLN,SAAA,CAAAC,MAACilC,GACC,CAAAxlC,KAAMA,EACN8N,IAAK84B,EACLnB,SAAUoB,EACVjB,OAAQA,EACRf,YAAaA,EACbgB,SAAUA,IAEZ3lC,EACEC,KAAA,MAAA,CAAAS,MAAO,CACLsD,QAAS,OACT6E,cAAe,SACf5E,WAAY,aACZrD,WAAY,EACZ8D,WAAY,UAGdtE,SAAA,CAAAC,EAAAA,IAAA,OAAA,CACEK,MAAO,CACLnB,SAAUumC,EAAIhB,aACdtlC,WAAYsmC,EAAIf,eAChB3gC,WAAY,IACZrE,MAAO,4BACPoE,WAAY,2BAGb/D,SAAA4c,IAEFypB,GACCpmC,MAAA,OAAA,CACEK,MAAO,CACLnB,SAAUumC,EAAId,YACdxlC,WAAYsmC,EAAIb,cAChB7gC,WAAY,IACZrE,MAAO,6BACPoE,WAAY,2BACb/D,SAEAqmC,SAMb,gBD9H2C,SAAC5mC,OAC1CwB,EAAgBxB,EAAAokC,QAAhBA,OAAO,IAAA5iC,EAAG,OAAMA,EAChBE,EAAA1B,EAAAC,KAAAA,OAAO,IAAAyB,EAAA,KAAIA,EACXC,EAAc3B,EAAAE,MAAdA,OAAK,IAAAyB,EAAG,OAAMA,EACdpB,EAAQP,EAAAO,SACRM,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UACL,OACJ9B,cACEK,MAAKxG,EAAAA,EAAA,CAAA,EAAOgqC,GAAaD,EAASlkC,EAAOD,IAAUY,GACnDyB,UAAWA,EAAS/B,SAEnBA,GALC,oBA2M6C,SAACP,OAClDwB,EAAgBxB,EAAAokC,QAAhBA,OAAO,IAAA5iC,EAAG,OAAMA,EAChBE,EAAA1B,EAAAC,KAAAA,OAAO,IAAAyB,EAAA,KAAIA,EACXC,EAAc3B,EAAAE,MAAdA,OAAK,IAAAyB,EAAG,OAAMA,EACRolC,EAAI/mC,EAAAuC,KACV1B,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEH/H,EAAI4pC,GAAUC,EAASlkC,GACvBwD,EAAwB,WAAZ0gC,EAAuBlB,GAAYhjC,GAAOmjC,IAAM9oC,EAAE8oC,IAE9DzjC,EAAsC,CAAEnB,GAAI,OAAQC,GAAI,OAAQC,GAAI,QAE1E,OACE6B,EAAAA,IACE,OAAA,CAAAK,MACKxG,EAAAA,EAAAA,EAAA,GAAAgqC,GAAaD,EAASlkC,EAAOD,KAChCgF,QAPoC,CAAExG,GAAI,MAAOC,GAAI,MAAOC,GAAI,OAOhDsB,KACbY,GAELyB,UAAWA,EAAS/B,SAEpBC,MAACumC,EAAI,CAAClmC,MAAO,CAAEH,MAAOd,EAASK,GAAOV,OAAQK,EAASK,GAAOC,MAAOwD,MAG3E,0BApG+D,SAAC1D,GAC9D,IAAAwB,EAAAxB,EAAAokC,QAAAA,OAAO,IAAA5iC,EAAG,OAAMA,EAChBE,EAAW1B,EAAAC,KAAXA,OAAI,IAAAyB,EAAG,KAAIA,EACXC,EAAc3B,EAAAE,MAAdA,OAAQ,IAAAyB,EAAA,OAAMA,EACRolC,EAAI/mC,EAAAuC,KACVykC,EAAWhnC,EAAAgnC,YACXC,EAAajnC,EAAAinC,cACb1mC,aACAM,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEHT,EAAwBe,EAAAA,UAAS,GAAhC+Y,EAAO9Z,EAAA,GAAE+Z,EAAU/Z,EAAA,GACpBtH,EAAI4pC,GAAUC,EAASlkC,GAEvBokC,EAAqB,SAAZF,EACT8C,EAAmC,CAAEzoC,GAAI6lC,EAAS,MAAQ,MAAO5lC,GAAI4lC,EAAS,OAAS,MAAO3lC,GAAI2lC,EAAS,OAAS,QACpH6C,EAAmC,CAAE1oC,GAAa,MAAeC,GAAa,MAAeC,GAAa,OAC1GyoC,EAAkB9C,EAAS,SAAW,MAE5C,OACEnkC,EAAAA,aACEU,MAAKxG,EAAAA,EAAAA,EAAA,CAAA,EACAgqC,GAAaD,EAASlkC,EAAOD,IAChC,CAAAJ,IAVoC,CAAEpB,GAAI,MAAOC,GAAI,MAAOC,GAAI,OAUpDsB,GACZiF,YAAagiC,EAAMjnC,GACnBkF,aAAcgiC,EAAMlnC,GACpBkQ,WAAqB,OAATlQ,EAAgB,MAAQ,MACpCmQ,cAAwB,OAATnQ,EAAgB,MAAQ,QACpCY,GAELyB,UAAWA,EAAS/B,SAAA,CAEnBA,EACDC,EACEC,IAAA,SAAA,CAAAgB,KAAK,SAAQ,aACDulC,EACZ9kC,QAAS+kC,EACTthC,aAAc,WAAM,OAAAiW,GAAW,EAAK,EACpChW,aAAc,WAAM,OAAAgW,GAAW,EAAX,EACpB/a,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBY,QAAS,MACTtB,OAAQ,OACRa,OAAQ,UACRO,aAAcqiC,EACdtiC,gBAAiB6W,EAAUphB,EAAEgpC,WAAa,cAC1CrjC,MAAOyb,EAAUphB,EAAEipC,aAAejpC,EAAE+oC,QACpC5+B,WAAY,oDACZD,QAAS,OACT1D,WAAY,GACbR,SAEAwmC,EACCvmC,MAACumC,EAAK,CAAAlmC,MAAO,CAAEH,MAAO,OAAQnB,OAAQ,UAEtCiB,EAAAA,IAACkkC,GAAQ,CAAA,OAKnB,uBA1KyD,SAAC1kC,OACxDwB,EAAgBxB,EAAAokC,QAAhBA,OAAO,IAAA5iC,EAAG,OAAMA,EAChBE,EAAA1B,EAAAC,KAAAA,OAAO,IAAAyB,EAAA,KAAIA,EACXC,EAAc3B,EAAAE,MAAdA,OAAK,IAAAyB,EAAG,OAAMA,EACdpB,EAAQP,EAAAO,SACRM,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEH/H,EAAI4pC,GAAUC,EAASlkC,GACvBmd,EAAuB,WAAZ+mB,EAAuBlB,GAAYhjC,GAAOmjC,IAAM9oC,EAAE8oC,IAE7DiB,EAAqB,SAAZF,EACTiD,EAA4C,CAAE5oC,GAAa,MAAeC,GAAa,MAAeC,GAAa,QACnH2oC,EAA6C,CAAE7oC,GAAI6lC,EAAS,MAAQ,MAAO5lC,GAAI4lC,EAAS,OAAS,MAAO3lC,GAAI2lC,EAAS,OAAS,QAEpI,OACEnkC,OACE,OAAA,CAAAU,MACKxG,EAAAA,EAAAA,EAAA,CAAA,EAAAgqC,GAAaD,EAASlkC,EAAOD,IAAK,CACrCJ,IAToC,CAAEpB,GAAI,MAAOC,GAAI,MAAOC,GAAI,OASpDsB,GACZiF,YAAamiC,EAAepnC,GAC5BkF,aAAcmiC,EAAgBrnC,GAC9BkQ,WAAqB,OAATlQ,EAAgB,MAAQ,MACpCmQ,cAAwB,OAATnQ,EAAgB,MAAQ,QACpCY,GAELyB,UAAWA,YAEX9B,EAAAA,IAACikC,GAAS,CAAAvkC,MAAOmd,IAChB9c,IAGP,wBAe2D,SAACP,GAC1D,IAAAwB,EAAAxB,EAAAokC,QAAAA,OAAU,IAAA5iC,EAAA,SACVE,EAAA1B,EAAAC,KAAAA,OAAO,IAAAyB,EAAA,KAAIA,EACXC,UAAAzB,OAAQ,IAAAyB,EAAA,OAAMA,EACD4lC,EAAWvnC,EAAAwnC,YACVC,EAAYznC,EAAA0nC,aAC1BnnC,aACAM,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEH/H,EAAI4pC,GAAUC,EAASlkC,GACvBwD,EAAwB,WAAZ0gC,EAAuBlB,GAAYhjC,GAAOmjC,IAAM9oC,EAAE8oC,IAE9DzjC,EAAsC,CAAEnB,GAAI,OAAQC,GAAI,OAAQC,GAAI,QAEpE2lC,EAAqB,SAAZF,EACTuD,IAAeJ,EAKfK,EAAwD,CAAEnpC,GAHlD,CAAEopC,GAAcF,EAAa,MAAQ,MAAuCG,GAAcH,EAAa,MAAQ,OAGlDjpC,GAF7D,CAAEmpC,GAAIvD,EAAUqD,EAAa,MAAQ,OAAwB,MAAgBG,GAAIxD,GAAUqD,EAAa,OAAgC,OAEhEhpC,GADxE,CAAEkpC,GAAIvD,EAAUqD,EAAa,OAAS,OAAwB,OAAkBG,GAAIxD,GAAUqD,EAAa,OAAiC,SAG1J,OACExnC,EAAAC,KAAA,OAAA,CACES,MAAKxG,EAAAA,EAAAA,EAAA,CAAA,EACAgqC,GAAaD,EAASlkC,EAAOD,IAAK,CACrCJ,IAfoC,CAAEpB,GAAI,MAAOC,GAAI,MAAOC,GAAI,OAepDsB,GACZiF,YAAa0iC,EAAO3nC,GAAM4nC,GAC1B1iC,aAAcyiC,EAAO3nC,GAAM6nC,GAC3B33B,WAAqB,OAATlQ,EAAgB,MAAQ,MACpCmQ,cAAwB,OAATnQ,EAAgB,MAAQ,QACpCY,GAELyB,UAAWA,EAEV/B,SAAA,CAAAgnC,GACC/mC,EAAAA,IAAC+mC,GAAY1mC,MAAO,CAAEH,MAAOd,EAASK,GAAOV,OAAQK,EAASK,GAAOC,MAAOwD,EAAW3C,WAAY,KAEpGR,EACAknC,GACCjnC,EAAAC,IAACgnC,EAAY,CAAC5mC,MAAO,CAAEH,MAAOd,EAASK,GAAOV,OAAQK,EAASK,GAAOC,MAAOwD,EAAW3C,WAAY,OAI5G,yBAmI6D,SAACf,GAC5D,IAAAwB,EAAAxB,EAAAokC,QAAAA,OAAO,IAAA5iC,EAAG,OAAMA,EAChBE,EAAW1B,EAAAC,KAAXA,OAAI,IAAAyB,EAAG,KAAIA,EACXC,EAAc3B,EAAAE,MAAdA,OAAQ,IAAAyB,EAAA,OAAMA,EACdomC,EAAM/nC,EAAA+nC,OACNlmC,EAAiB7B,EAAAgoC,OAAjBA,OAAS,IAAAnmC,EAAA,SAAQA,EACjBtB,EAAQP,EAAAO,SACRM,EAAKb,EAAAa,MACLyB,EAAStC,EAAAsC,UAEHgiC,EAAqB,SAAZF,EAET8C,EAAmC,CACvCzoC,GAAI6lC,EAAS,MAAQ,MACrB5lC,GAAI4lC,EAAS,MAAQ,MACrB3lC,GAAI2lC,EAAS,MAAQ,OAEjB6C,EAAmC,CACvC1oC,GAAI6lC,EAAS,MAAQ,MACrB5lC,GAAI4lC,EAAS,OAAS,MACtB3lC,GAAI2lC,EAAS,OAAS,QAElB2D,EAAqC,CAAExpC,GAAI,OAAQC,GAAI,OAAQC,GAAI,QAEzE,OACEwB,OACE,OAAA,CAAAU,MACKxG,EAAAA,EAAAA,EAAA,CAAA,EAAAgqC,GAAaD,EAASlkC,EAAOD,IAAK,CACrCJ,IAjBoC,CAAEpB,GAAI,MAAOC,GAAI,MAAOC,GAAI,OAiBpDsB,GACZiF,YAAagiC,EAAMjnC,GACnBkF,aAAcgiC,EAAMlnC,GACpBkQ,WAAqB,OAATlQ,EAAgB,MAAQ,MACpCmQ,cAAwB,OAATnQ,EAAgB,MAAQ,QACpCY,GAELyB,UAAWA,EAEX/B,SAAA,CAAAC,MAAA,MAAA,CACEuN,IAAKg6B,EACL/5B,IAAKg6B,EACLnnC,MAAO,CACLH,MAAOunC,EAAQhoC,GACfV,OAAQ0oC,EAAQhoC,GAChB8E,aAAc,SACdqJ,UAAW,QACXrN,WAAY,KAGfR,IAGP,qCjBziBK,SAACP,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BL,EAAAA,IACE,MAAA,CAAAE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,yCACFwH,OAAO,QACPC,YAAY,IACZE,cAAc,QACd0P,eAAe,WAfU,6GgB2FS,SAAChR,OACvCwB,EAAUxB,EAAAU,MAAVA,OAAK,IAAAc,EAAG,GAAEA,EACVE,EAAW1B,EAAAT,OAAXA,OAAM,IAAAmC,EAAG,GAAEA,EACEwmC,EAAeloC,EAAAoB,YAC5BO,EAAA3B,EAAAE,MAAAA,aAAQ,8BAA6ByB,EACrCW,EAAStC,EAAAsC,UAEHT,EAAoBe,EAAAA,SAAS,GAA5BulC,EAAKtmC,EAAA,GAAEumC,EAAQvmC,EAAA,GAChBwmC,EAAWh5B,SAAsB,MAEvCjH,EAAAA,UAAU,WACR,IAAIrB,EACEuhC,EAAO,SAACle,GACa,OAArBie,EAAS34B,UACX24B,EAAS34B,QAAU0a,GAErBge,EAAShe,EAAMie,EAAS34B,SACxB3I,EAAKmO,sBAAsBozB,EAC7B,EAEA,OADAvhC,EAAKmO,sBAAsBozB,GACpB,WAAM,OAAAxH,qBAAqB/5B,EAAG,CACtC,EAAE,IAaH,IAXA,IAjFyCof,EAGnCoiB,EA8EAC,EAAUL,EACV3tC,GA/EA+tC,EA+EmBC,GAlFgBriB,EAkFPob,IAhFZO,gBAAmB3b,EAAO2b,gBACb96B,KAAKs7B,GAAK,EACtC,KAASt7B,KAAK27B,IAAI4F,EAAa,KAAQ,GAAK,EAAK,KA+ElDnG,EAAYoG,EAAUjH,GAAMK,WAAcL,GAAMK,WAChD6G,EA1CR,SAAwBC,EAAmBviB,GACzC,OAAKA,EAAOsb,QAERiH,EAAYviB,EAAO0b,mBAAsB1b,EAAO0b,mBAClD,IAHyB,CAK7B,CAoCsB8G,CAAeH,EAASjH,IACtCqH,EAAaV,QAAAA,EAAmB3G,GAAMngC,YACtCynC,EAAcD,EAAarH,GAAMngC,YAEjC0nC,EA7ER,SAAmBzG,EAA0Blc,EAAqB4iB,QAAA,IAAAA,IAAAA,EAAW,KAE3E,IADA,IAAMC,EAAkB,GACfhxB,EAAQ,EAAGA,GAAS+wB,EAAO/wB,GAAS,EAAG,CAC9C,IAAM/d,EAAIkoC,GAAMnqB,EAAQ+wB,EAAO1G,EAAkBlc,GACjD6iB,EAAMzrC,KAAK,GAAAQ,OAAa,IAAVia,EAAc,IAAM,IAAO,KAAAja,OAAA9D,EAAEwoC,EAAEwG,QAAQ,eAAMhvC,EAAEsC,EAAE0sC,QAAQ,IACxE,CACD,OAAOD,EAAMvjC,KAAK,IACpB,CAsEgByjC,CAAU1uC,EAAG+mC,IAErB4H,EACJ,GACO1uC,EAAI,EAAGA,EAAI8mC,GAAMG,cAAejnC,GAAK,EAAG,CAC/C,IAAM2uC,EAAKxG,GAAYnoC,EAAG2nC,EAAU5nC,EAAG+mC,IACvC4H,EAAU5rC,KAAK,CACbyD,GAAIooC,EAAG3G,EACPxhC,GAAImoC,EAAG7sC,EACP8E,QAAS+nC,EAAG/nC,QACZH,EAAGkoC,EAAGnG,OAAS4F,GAElB,CAED,OACEroC,EACEC,IAAA,MAAA,CAAA6B,UAAWA,EACXzB,MAAO,CACLH,MAAKA,EACLnB,OAAMA,EACN4E,QAAS,eACTjE,MAAKA,GAEP8b,KAAK,SAAQ,aACF,UAASzb,SAEpBJ,EACEC,KAAA,MAAA,CAAAM,MAAM,OACNnB,OAAO,OACPoB,QAAQ,cACRC,KAAK,OACLyoC,oBAAoB,gBACpBxoC,MAAO,CAAEmE,SAAU,WAEnBzE,SAAA,CAAAC,EAAAC,IAAA,QAAA,CAAAF,SAAA,kBACAJ,EAAAC,KAAA,IAAA,CAAGsK,UAA0B,iBAAU+9B,EAAW,WAChDloC,SAAA,CAAAC,EAAAA,IAAA,OAAA,CACE7G,EAAGmvC,EACH3nC,OAAO,eACPC,YAAawnC,EACbtnC,cAAc,QACd0P,eAAe,QACfpQ,KAAK,OACLS,QAAS,KAEV8nC,EAAU5gC,IAAI,SAAC6gC,EAAI3uC,GAAM,OACxB+F,EAAAC,IAAA,SAAA,CAEEO,GAAIooC,EAAGpoC,GACPC,GAAImoC,EAAGnoC,GACPC,EAAGkoC,EAAGloC,EACNN,KAAK,eACLS,QAAS+nC,EAAG/nC,SALP5G,EAFiB,UAcpC,wChB5JK,SAACuF,OAAEsC,EAAStC,EAAAsC,UAAEzB,EAAKb,EAAAa,MAAO,OAC7BL,EAAAA,IACE,MAAA,CAAAE,MAAM,KACNnB,OAAO,KACPoB,QAAQ,YACRC,KAAK,OACLsF,MAAM,6BACN5D,UAAWA,EACXzB,MAAOA,EAEPN,SAAAC,EAAAC,IAAA,OAAA,CACE9G,EAAE,cACFwH,OAAO,QACPC,YAAY,IACZE,cAAc,QACd0P,eAAe,WAfU,2DoBoBW,SAAChR,GACzC,IAAAwB,EAAWxB,EAAAspC,QAAXA,OAAO,IAAA9nC,EAAG,EAACA,EACXE,EAAe1B,EAAAyB,KAAfA,OAAI,IAAAC,EAAG,SAAQA,EACfC,EAAW3B,EAAAU,MAAXA,OAAK,IAAAiB,EAAG,IAAGA,EACXy5B,UACemO,EAAiBvpC,EAAAwpC,cAChC3nC,gBAAA4nC,OAAc,IAAA5nC,KACdG,EAAAhC,EAAA0pC,SAAAA,OAAW,IAAA1nC,GAAKA,EAChBG,WAAA0jC,OAAS,IAAA1jC,EAAA,WACTE,EAAArC,EAAAsC,UAAAA,aAAY,GAAED,EACdxB,EAAKb,EAAAa,MACL8oC,EAAW3pC,EAAA2pC,YACXnnC,EAAsBxC,EAAA4pC,WAAtBA,OAAU,IAAApnC,EAAG,UAASA,EACnBE,EAAI3H,EAAAiF,EAbkC,qIAejC9B,EAAiBG,iBAGnBwrC,EAAoB7iC,KAAKwN,IAAI,IAAKxN,KAAKyN,IAAI,EAAG60B,IAG9CQ,EAAgBz6B,UAAO,GACvB1M,EAAoCC,EAAAA,UAAS,GAA5CmnC,EAAapnC,EAAA,GAAEqnC,EAAgBrnC,EAAA,GAChCI,EAA0CH,EAAAA,SAAS,GAAlDqnC,EAAgBlnC,EAAA,GAAEmnC,EAAkCnnC,EAAA,GAE3DqF,EAAAA,UAAU,WACR,GAAIshC,GAAYI,EAAcp6B,SAAWm6B,EAAoB,EAAG,CAE9DC,EAAcp6B,SAAU,EAExBw6B,EAAoB,GACpBF,GAAiB,GAEjB90B,sBAAsB,WACpBA,sBAAsB,WACpBg1B,EAAoBL,EACtB,EACF,GAEA,IAAMz/B,EAAQF,WAAW,WACvB8/B,GAAiB,GACjBE,EAAoBL,EACrB,EAAE,KACH,OAAO,WAAM,OAAA1/B,aAAaC,EAAM,CACjC,CAAU0/B,EAAcp6B,SAEvBo6B,EAAcp6B,SAAU,EACxBs6B,GAAiB,GACjBE,EAAoBL,IAGpBK,EAAoBL,EAExB,EAAG,CAACH,EAAUG,IAGd,IAAIM,EAAmBR,GAAezrC,GAAgB,UAGvC,YAAX2nC,EACFsE,EAAmB,UACC,cAAXtE,IACTsE,EAAmB,WAIrB,IAAMX,EAAiCD,GA/EhB,SAkFjBnoC,EAAc4F,KAAKyN,IAAI,EAAGzN,KAAKw7B,MAAc,IAAR9hC,IAGrCuiC,GAAUviC,EAAQU,GAAe,EAGjCgpC,EAA4B,eAAT3oC,EAAwBf,EAAQ,EAAIA,EAGvD2pC,EAtFC,OAwFDC,EAnFC,OAsFDC,EAAuB,WAE3B,IAAMC,EAAkBpP,GAA2B,YAAlBoO,EAC7B9oC,EAAQ,EAAI,GAAK,EACjBA,EAGE+pC,EAAgB,EAAIzjC,KAAKs7B,GAAKW,EAG9BjgB,EAASynB,GADQV,EAAgBE,EAAmBJ,GACT,IAAOY,EAExD,OACEtqC,EACEC,KAAA,MAAA,CAAAS,MAAO,CACLqD,SAAU,WACVxD,MAAOA,EACPnB,OAAQirC,EACRrmC,QAAS,OACTC,WAAY,SACZC,eAAgB,UAIlB9D,SAAA,CAAAJ,EAAAC,KAAA,MAAA,CACEM,MAAOA,EACPnB,OAAQmB,EACRG,MAAO,CACLqD,SAAU,WACV0E,IAAK,EACLC,KAAM,GACPtI,SAAA,CAGDC,EAAAA,cACEQ,GAAIN,EAAQ,EACZO,GAAIP,EAAQ,EACZQ,EAAG+hC,EACHriC,KAAK,OACLO,OAAQyoC,EACRxoC,YAAaA,EACbE,cAAc,UAGhBd,EAAAC,IAAA,SAAA,CACEO,GAAIN,EAAQ,EACZO,GAAIP,EAAQ,EACZQ,EAAG+hC,EACHriC,KAAK,OACLO,OAAQgpC,EACR/oC,YAAaA,EACbE,cAAc,QACd4a,gBAAiBuuB,EACjBtuB,iBAAkB6G,EAClBtY,UAAW,cAAA3M,OAAc2C,EAAQ,cAAKA,EAAQ,EAAI,KAClDG,MAAO,CACL6D,WAAYqlC,EAAgB,8BAAgC,aAMjE3O,GAA2B,WAAlBoO,EACRrpC,EAAAC,KAAA,MAAA,CACES,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,MACL8B,UAAW,wBACXqN,UAAW,SACX5T,QAAS,OACT6E,cAAe,SACf5E,WAAY,SACZC,eAAgB,SAChBxE,IAAK,GAGPU,SAAA,CAAAC,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLnB,SAAU2qC,EACVnqC,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA66B,IAEFqO,GACCjpC,MAAA,MAAA,CACEK,MAAO,CACLnB,SAAU4qC,EACV/lC,WAAY,IACZrE,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA,GAAAxC,OAAGiJ,KAAKw7B,MAAMqH,GAAqB,UAK1C1pC,EAAAA,KAAAE,EAAAC,SAAA,CAAAC,SAAA,CACGkpC,GACCjpC,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,GAAG7K,OAAA2C,EAAQ,EAAC,MACjBgK,UAAW,wBACXqN,UAAW,SACXrY,SAAU4qC,EACV/lC,WAAY,IACZrE,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA,GAAAxC,OAAGiJ,KAAKw7B,MAAMqH,UAGlBzO,GAA2B,YAAlBoO,GACRhpC,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,GAAG7K,OAAA2C,EAAS,MACjBgK,UAAW,mBACXI,UAAW,MACXiN,UAAW,SACXrY,SAAU2qC,EACVnqC,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,QACbY,SAEA66B,SAOf,EAgKMT,KACJx2B,QAAS,cACT6E,cAAe,SACf5E,WAAY,SACZ1D,MAAOA,GACJG,GAgBL,OACEL,eACE8B,UAAW,qCAA8Bb,EAAI,KAAA1D,OAAIuE,GACjDzB,MAAO85B,GACHj4B,EAAI,CAAAnC,SAhBW,WACrB,OAAQkB,GACN,IAAK,SACH,OAAO8oC,IACT,IAAK,aACH,OAnKEG,EAAStpC,EAAc,EACvBupC,EAAOjqC,EAAQU,EAAc,EAE7BwpC,GALAC,EAAYT,EADChpC,GAMSA,EAAc,EAIpC0pC,EAAeV,EAAmB,EAVrBhpC,EAUuC,EAAIA,EAAc,EAKtEopC,EAAkBpP,GAA2B,YAAlBoO,EADLqB,EAEF,EAAI,GAAK,EAFPA,EAMtBE,EAA0B/jC,KAAKs7B,GAAKW,EAGpC+H,EAAmBD,GADFhB,EAAgBE,EAAmBJ,GACW,IAAOkB,EAG1E5qC,EACEC,KAAA,MAAA,CAAAS,MAAO,CACLqD,SAAU,WACVxD,MAAOA,EACPnB,OAAQirC,EACRxlC,SAAU,UACXzE,SAAA,CAGDJ,cACEO,MAAOA,EACPnB,OAAQsrC,EACRlqC,QAAS,cAAOD,EAAK,KAAA3C,OAAI8sC,GACzBhqC,MAAO,CACLqD,SAAU,WACV0E,IAAK,EACLC,KAAM,GACPtI,SAAA,CAGDC,cACE7G,EAAG,KAAKoE,OAAA2sC,cAAUE,EAAO,OAAA7sC,OAAMklC,EAAM,KAAAllC,OAAIklC,EAAgB,WAAAllC,OAAA4sC,EAAQ,KAAA5sC,OAAA6sC,GACjEhqC,KAAK,OACLO,OAAQyoC,EACRxoC,YAAaA,EACbE,cAAc,UAGhBd,EAAAA,IAAA,OAAA,CACE7G,EAAG,KAAAoE,OAAK2sC,EAAM,KAAA3sC,OAAI6sC,EAAa,OAAA7sC,OAAAklC,EAAU,KAAAllC,OAAAklC,oBAAgB0H,EAAI,KAAA5sC,OAAI6sC,GACjEhqC,KAAK,OACLO,OAAQgpC,EACR/oC,YAAaA,EACbE,cAAc,QACd4a,gBAAiB6uB,EACjB5uB,iBAAkB6uB,EAClBnqC,MAAO,CACL6D,WAAYqlC,EAAgB,8BAAgC,aAMjE3O,GAA2B,WAAlBoO,EACRrpC,EAAAC,KAAA,MAAA,CACES,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,GAAG7K,OAAA+sC,EAAe,MACvBpgC,UAAW,wBACXqN,UAAW,SACX5T,QAAS,OACT6E,cAAe,SACf5E,WAAY,SACZC,eAAgB,SAChBxE,IAAK,GAGPU,SAAA,CAAAC,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLnB,SAAU2qC,EACVnqC,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA66B,IAEFqO,GACCjpC,MAAA,MAAA,CACEK,MAAO,CACLnB,SAAU4qC,EACV/lC,WAAY,IACZrE,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA,GAAAxC,OAAGiJ,KAAKw7B,MAAMqH,GAAqB,UAK1C1pC,EAAAA,KAAAE,EAAAC,SAAA,CAAAC,SAAA,CACGkpC,GACCjpC,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,GAAA7K,OAAG+sC,EAAW,MACnBpgC,UAAW,wBACXqN,UAAW,SACXrY,SAAU4qC,EACV/lC,WAAY,IACZrE,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,GAGbY,SAAA,GAAAxC,OAAGiJ,KAAKw7B,MAAMqH,UAGlBzO,GAA2B,YAAlBoO,GACRhpC,EAAAA,IAAA,MAAA,CACEK,MAAO,CACLqD,SAAU,WACV2E,KAAM,MACND,IAAK,GAAA7K,OAAG8sC,EAAS,MACjBngC,UAAW,mBACXI,UAAW,MACXiN,UAAW,SACXrY,SAAU2qC,EACVnqC,MAAO,UACPoE,WAAY,sBACZ3E,WAAY,QACbY,SAEA66B,UAwBX,QAEE,OADAh0B,QAAQ4E,KAAK,yBAAkBvK,EAAI,uDAC5B8oC,IA9KoB,IAMzBM,EAEAH,EACAC,EAEAC,EAIAE,EAKAN,EAKAO,EAGAC,CAoJR,CAQKC,KAGP,iEfrbgC,SAACjrC,GAC/B,IAAAwB,EAAAxB,EAAAk5B,MAAAA,OAAQ,IAAA13B,EAAA,KACRE,EAAA1B,EAAAokC,QAAAA,OAAU,IAAA1iC,EAAA,cACVC,EAAA3B,EAAA2xB,OAAAA,OAAS,IAAAhwB,EAAA,QAAOA,EAChBmN,EAAY9O,EAAA8O,aACLoC,EAAelR,EAAAnE,MACtBkT,EAAQ/O,EAAA+O,SACRlN,EAAc7B,EAAAsC,UAAdA,OAAS,IAAAT,EAAG,GAAEA,EACdG,EAAiBhC,EAAAoR,KAAjBA,OAAI,IAAApP,EAAG,WAAUA,EACjBG,EAAkBnC,EAAAkrC,WAAlBA,OAAU,IAAA/oC,GAAQA,EACfO,EAV4B3H,EAAAiF,EAAA,CAAA,QAAA,UAAA,SAAA,eAAA,QAAA,WAAA,YAAA,OAAA,eAYvB9B,EAAiBG,iBAGzB,IAAK66B,GAA0B,IAAjBA,EAAMt+B,OAClB,OAAO,KAKT,IAAMuwC,EAA6Bj3B,EAAAA,QAAQ,WACzC,GAAqB,IAAjBglB,EAAMt+B,OAAc,MAAO,GAG/B,IAAMwwC,EAAYlS,EAAM,GACxB,MAAyB,iBAAdkS,GAA+C,iBAAdA,EAClClS,EAA8B3wB,IAAI,SAACsS,EAAM7C,GAAU,MAAC,CAC1DrH,IAAKmD,OAAO+G,GACZpe,MAAOqX,OAAO+G,GACd,GAGGqe,CACT,EAAG,CAACA,IAGEvpB,OAAmCC,IAApBsB,EACfm6B,EAA4BF,EAAgBvwC,OAAS,EAAIuwC,EAAgB,GAAGx6B,IAAM,GAGlF26B,EAAkB,SAACzvC,GACvB,QAAc+T,IAAV/T,EAAqB,OAAOwvC,EAGhC,IAAME,EAAaJ,EAAgB70B,KAAK,SAAAuE,GAEtC,GAAIA,EAAKlK,MAAQ9U,EAAO,OAAO,EAG/B,GAAIiY,OAAO+G,EAAKlK,OAASmD,OAAOjY,GAAQ,OAAO,EAG/C,IAAM2vC,EAAUvwB,OAAOJ,EAAKlK,KACtB86B,EAAWxwB,OAAOpf,GACxB,OAAKu4B,MAAMoX,KAAapX,MAAMqX,IAAaD,IAAYC,CAKzD,GAEA,OAAIF,EAEKA,EAAW56B,IAIb06B,CACT,EAEMhpC,EAAoCO,EAAAA,SAA0B,iBAE5D8oC,EAAkD,QAAnC1rC,EAAAkR,QAAAA,EAAmBpC,SAAgB,IAAA9O,EAAAA,EAAAqrC,EAExD,OADmBC,EAAgBI,EAErC,GALOn8B,OAAeC,OAQhBK,EAAeF,OACIC,IAApBsB,EAAgCo6B,EAAgBp6B,GAAmBm6B,EACpE97B,EAGJnH,EAAAA,UAAU,WACRhB,QAAQC,IAAI,4BAA6BwI,EAAc,eAAgBA,GACvEzI,QAAQC,IAAI,+BAAgC8jC,EAAgB5iC,IAAI,SAAAsS,GAAQ,MAAC,CAAElK,IAAKkK,EAAKlK,IAAKlP,YAAaoZ,EAAKlK,IAAM,IAClHvJ,QAAQC,IAAI,+BAAgC6J,EAAiB,gBAAiBvB,EAC/E,EAAE,CAACE,EAAcs7B,EAAiBj6B,EAAiBvB,IAEpD,IAAMg8B,EAAiBrhC,EAAAA,YACrB,SAACqG,EAAsB/O,GACrB,IAAIA,EAAJ,CACK+N,GACHH,EAAiBmB,GAGnB,IACMi7B,EAAsC,iBADvB1S,EAAM,IAC4C,iBAARvoB,EAAmBA,EAAsB,iBAARA,EAAmBmD,OAAOnD,GAAOA,EAIjI,GAHA5B,SAAAA,EAAW68B,GAGPV,GAA0B,cAAZ9G,EAAyB,CACzC,IAAMyH,EAAmBC,EAAQp8B,QAAQq8B,EAAap7B,IAChDq7B,EAAYC,EAAav8B,QAC/B,GAAIm8B,GAAoBG,EAAW,CAEjCE,EAAex8B,SAAU,EAGzB,IAoBIy8B,EApBEh4B,EAAiB,WACrB,GAAK63B,GAAcI,EAAa18B,SAAYm8B,EAA5C,CACA,IAAMQ,EAAgBL,EAAU33B,wBAC1Bi4B,EAAUT,EAAiBx3B,wBAEjC,GAAIg4B,EAAc3rC,MAAQ,GAAK4rC,EAAQ5rC,MAAQ,EAAG,CAGhD,IAAM6rC,EAAaP,EAAUO,YAAc,EACrC1jC,EAAOyjC,EAAQzjC,KAAOwjC,EAAcxjC,KAAO0jC,EAC3C7rC,EAAQ4rC,EAAQ5rC,MACtB8rC,EAAkB,CAChB9rC,MAAO,GAAG3C,OAAA2C,EAAS,MACnBmI,KAAM,GAAG9K,OAAA8K,EAAQ,MACjBxH,QAAS,GAEZ,CAfoE,CAgBvE,EAIMorC,EAAe,WACnBt4B,IACAhK,aAAagiC,GACbA,EAAgBjiC,WAAW,WAEzBiK,IACA+3B,EAAex8B,SAAU,EACzBs8B,EAAU52B,oBAAoB,SAAUq3B,EACzC,EAAE,IACL,EAEAT,EAAU72B,iBAAiB,SAAUs3B,EAAc,CAAEC,SAAS,IAG9Db,EAAiB/1B,eAAe,CAC9BE,SAAU,SACVD,MAAO,UACP42B,OAAQ,WAIVz3B,sBAAsB,WACpBA,sBAAsB,WACpBf,GACF,EACF,EACD,CACF,CAlEoB,CAmEvB,EACA,CAACxE,EAAcZ,EAAUmqB,EAAOgS,EAAY9G,IAGxCwI,EAAazB,EAAgB70B,KAAK,SAACuE,GAEvC,GAAIA,EAAKlK,MAAQd,EAAc,OAAO,EACtC,GAAIiE,OAAO+G,EAAKlK,OAASmD,OAAOjE,GAAe,OAAO,EAEtD,IAAM27B,EAAUvwB,OAAOJ,EAAKlK,KACtBk8B,EAAa5xB,OAAOpL,GAC1B,OAAKukB,MAAMoX,KAAapX,MAAMyY,IAAerB,IAAYqB,CAE3D,GACMC,EAAc5uC,GAAgB,UAG9B4tC,EAAUz8B,SAAiD,CAAA,GAG3D08B,EAAe,SAACp7B,GAAiC,OAAAmD,OAAOnD,IACxDy7B,EAAe/8B,SAAuB,MACtC09B,EAAsB19B,SAAuB,MAC7C48B,EAAe58B,SAAuB,MACtC29B,EAAyB39B,SAAuB,MAChD49B,EAAsB59B,SAAwB,IACzBA,EAAMA,OAAc,IAAIzI,KACnD,IAAMslC,EAAiB78B,UAAgB,GACjC7M,EAAsCI,EAAAA,SAA8B,CACxElC,MAAO,EACPmI,KAAM,EACNxH,QAAS,IAHJ6rC,EAAc1qC,EAAA,GAAEgqC,OAKjB7pC,EAAoDC,EAAAA,SAA8B,CACtFlC,MAAO,EACPmI,KAAM,EACNxH,QAAS,IAHJ8rC,EAAqBxqC,EAAA,GAAEyqC,OAOxBC,EAA0B/iC,EAAAA,YAAY,WAC1B,cAAZ85B,GAA4B6H,EAAav8B,SAAYG,GAKzDqF,sBAAsB,WACpBA,sBAAsB,WAEpB,GAAKk3B,EAAa18B,SAAYu8B,EAAav8B,QAA3C,CAIA,IAAI49B,EAAYxB,EAAQp8B,QAAQq8B,EAAal8B,IAG7C,IAAKy9B,GAAanC,EAAgBvwC,OAAS,EAAG,CAC5C,IAAM2yC,EAAWpC,EAAgB,GAAGx6B,IACpC28B,EAAYxB,EAAQp8B,QAAQq8B,EAAawB,GAC1C,CAED,GAAKD,EAAL,CAIA,IAAMjB,EAAgBJ,EAAav8B,QAAQ2E,wBACrCi4B,EAAUgB,EAAUj5B,wBAG1B,GAA4B,IAAxBg4B,EAAc3rC,OAAiC,IAAlB4rC,EAAQ5rC,MAAzC,CASA,IAAM6rC,EAAaN,EAAav8B,QAAQ68B,YAAc,EAChD1jC,EAAOyjC,EAAQzjC,KAAOwjC,EAAcxjC,KAAO0jC,EAC3C7rC,EAAQ4rC,EAAQ5rC,MAChB8sC,EAAU,GAAGzvC,OAAA8K,QACb4kC,EAAW,GAAG1vC,OAAA2C,QAGpB8rC,EAAkB,SAAC/2B,GACjB,OAAIA,EAAK5M,OAAS2kC,GAAW/3B,EAAK/U,QAAU+sC,GAA6B,IAAjBh4B,EAAKpU,QACpDoU,EAEF,CACL/U,MAAO+sC,EACP5kC,KAAM2kC,EACNnsC,QAAS,EAEb,EAvBC,CARA,CAZA,CA4CH,EACF,EACD,EAAE,CAAC+iC,EAASv0B,EAAcs7B,IAGrBuC,EAAiCpjC,EAAAA,YAAY,WACjC,eAAZ85B,GAA6B4I,EAAuBt9B,SAAYq9B,EAAoBr9B,SAAYG,GAKpGqF,sBAAsB,WACpBA,sBAAsB,WAEpB,GAAK63B,EAAoBr9B,SAAYs9B,EAAuBt9B,QAA5D,CAIA,IAAI49B,EAAYxB,EAAQp8B,QAAQq8B,EAAal8B,IAG7C,IAAKy9B,GAAanC,EAAgBvwC,OAAS,EAAG,CAC5C,IAAM+yC,EAAWxC,EAAgB,GAAGx6B,IACpC28B,EAAYxB,EAAQp8B,QAAQq8B,EAAa4B,GAC1C,CAED,GAAKL,EAAL,CAIA,IAAMjB,EAAgBW,EAAuBt9B,QAAQ2E,wBAC/Ci4B,EAAUgB,EAAUj5B,wBAG1B,GAA4B,IAAxBg4B,EAAc3rC,OAAiC,IAAlB4rC,EAAQ5rC,MAAzC,CAIA,IAAMmI,EAAOyjC,EAAQzjC,KAAOwjC,EAAcxjC,KACpCnI,EAAQ4rC,EAAQ5rC,MAChB8sC,EAAU,GAAGzvC,OAAA8K,QACb4kC,EAAW,GAAG1vC,OAAA2C,QAGpB0sC,EAAyB,SAAC33B,GACxB,OAAIA,EAAK5M,OAAS2kC,GAAW/3B,EAAK/U,QAAU+sC,GAA6B,IAAjBh4B,EAAKpU,QACpDoU,EAEF,CACL/U,MAAO+sC,EACP5kC,KAAM2kC,EACNnsC,QAAS,EAEb,EAjBC,CARA,CAZA,CAsCH,EACF,EACD,EAAE,CAAC+iC,EAASv0B,EAAcs7B,IAG3B/iC,EAAAA,UAAU,WAEHyH,EAMDo9B,EAAoBv9B,UAAYG,IAKpCo9B,EAAoBv9B,QAAUG,EAId,cAAZu0B,GAA2B6H,EAAav8B,UAAYw8B,EAAex8B,SACrE29B,IAIc,eAAZjJ,GAA4B4I,EAAuBt9B,SAAWq9B,EAAoBr9B,SACpFg+B,KApBAT,EAAoBv9B,QAAU,EAsBlC,EAAG,CAACG,EAAcu0B,EAAS+G,EAAgBvwC,OAAQ+U,EAAc09B,EAAyBK,IAI1FtlC,EAAAA,UAAU,WACR,GAAKyH,EAAL,CAGA,IAAM5F,EAAQC,WAAW,WACvB,GAAgB,cAAZk6B,GAEIkJ,EAAYxB,EAAQp8B,QAAQq8B,EAAal8B,MAC9Bo8B,EAAav8B,SAAW08B,EAAa18B,UACpD29B,IAGInC,GACFoC,EAAUx3B,eAAe,CACvBE,SAAU,SACVD,MAAO,UACP42B,OAAQ,iBAIT,GAAgB,eAAZvI,EAA0B,CAEnC,IAAMkJ,EACN,IADMA,EAAYxB,EAAQp8B,QAAQq8B,EAAal8B,MAC9Bm9B,EAAuBt9B,SAAWq9B,EAAoBr9B,QAAS,CAC9E,IAAM28B,EAAgBW,EAAuBt9B,QAAQ2E,wBAC/Ci4B,EAAUgB,EAAUj5B,wBAE1B,GAAIg4B,EAAc3rC,MAAQ,GAAK4rC,EAAQ5rC,MAAQ,EAAG,CAChD,IAAMmI,EAAOyjC,EAAQzjC,KAAOwjC,EAAcxjC,KACpCnI,EAAQ4rC,EAAQ5rC,MAChB8sC,EAAU,GAAGzvC,OAAA8K,QACb4kC,EAAW,GAAG1vC,OAAA2C,QAEpB0sC,EAAyB,CACvB1sC,MAAO+sC,EACP5kC,KAAM2kC,EACNnsC,QAAS,GAEZ,CACF,CACF,CACF,EAAE,KAEH,OAAO,WAAM,OAAA8I,aAAaF,EAAM,CA1CN,CA4C3B,EAAE,IAIH7B,EAAAA,UAAU,WACR,GAAK8iC,GAA0B,cAAZ9G,GAA4Bv0B,IAG3Cq8B,EAAex8B,QAAnB,CAEA,IAAMzF,EAAQC,WAAW,WACvB,IAAMojC,EAAYxB,EAAQp8B,QAAQq8B,EAAal8B,IACzCwQ,EAAY4rB,EAAav8B,QAC/B,GAAI49B,GAAajtB,EAAW,CAC1B6rB,EAAex8B,SAAU,EAGzB,IAoBIk+B,EApBEC,EAAiB,WACrB,GAAKxtB,GAAc+rB,EAAa18B,SAAY49B,EAA5C,CACA,IAAMjB,EAAgBhsB,EAAUhM,wBAC1Bi4B,EAAUgB,EAAUj5B,wBAE1B,GAAIg4B,EAAc3rC,MAAQ,GAAK4rC,EAAQ5rC,MAAQ,EAAG,CAGhD,IAAM6rC,EAAalsB,EAAUksB,YAAc,EACrC1jC,EAAOyjC,EAAQzjC,KAAOwjC,EAAcxjC,KAAO0jC,EAC3C7rC,EAAQ4rC,EAAQ5rC,MACtB8rC,EAAkB,CAChB9rC,MAAO,GAAG3C,OAAA2C,EAAS,MACnBmI,KAAM,GAAG9K,OAAA8K,EAAQ,MACjBxH,QAAS,GAEZ,CAf6D,CAgBhE,EAIMysC,EAAe,WACnBD,IACA1jC,aAAayjC,GACbA,EAAgB1jC,WAAW,WACzB2jC,IACA3B,EAAex8B,SAAU,EACzB2Q,EAAUjL,oBAAoB,SAAU04B,EACzC,EAAE,IACL,EAEAztB,EAAUlL,iBAAiB,SAAU24B,EAAc,CAAEpB,SAAS,IAE9DY,EAAUx3B,eAAe,CACvBE,SAAU,SACVD,MAAO,UACP42B,OAAQ,WAIVz3B,sBAAsB,WACpBA,sBAAsB,WACpB24B,GACF,EACF,EACD,CACF,EAAE,IAEH,OAAO,WAAM,OAAA1jC,aAAaF,EAAM,CAzDG,CA0DpC,EAAE,CAAC4F,EAAcq7B,EAAY9G,IAG9B,IACQzJ,EA8bR,OACEx6B,EAAAC,KAAA,MAAA,CAAKkC,UAAU,oBAAmB/B,SAAA,CACnB,cAAZ6jC,GAhcGzJ,EAAsC,CAC1Cx2B,QAAS,OACTC,WAAY,SACZvE,IAAK,OACLg4B,aAAc,oBACdznB,cAAe,IACflM,SAAU,YAIRgnC,IACFvQ,EAAeoT,UAAY,OAC3BpT,EAAenY,UAAY,SAC3BmY,EAAeqT,eAAiB,SAEhCrT,EAAesT,eAAiB,OAEhCtT,EAAe9iB,wBAA0B,SAIzC1X,OAAA,MAAA9F,EAAA,CACEkU,IAAK09B,EACL3pC,UAAW,8BAA8BvE,OAAAmtC,EAAa,sBAAwB,GAAE,KAAAntC,OAAIuE,GACpFzB,MAAO85B,GACHj4B,EAAI,CAAAnC,SAAA,CAGRC,MACE,MAAA,CAAA+N,IAAK69B,EACLvrC,MAAKxG,EAAA,CACH6J,SAAU,WACViF,OAAQ,MACR5J,OAAQ,MACRuF,gBAAiBgoC,EACjB/nC,aAAc,cACdL,WAAY,6GACTwoC,KAIN/B,EAAgB5iC,IAAI,SAACsS,GAEpB,IAAMC,EAAW,WAEf,GAAID,EAAKlK,MAAQd,EACf,OAAO,EAGT,GAAIiE,OAAO+G,EAAKlK,OAASmD,OAAOjE,GAC9B,OAAO,EAGT,IAAM27B,EAAUvwB,OAAOJ,EAAKlK,KACtBk8B,EAAa5xB,OAAOpL,GAC1B,OAAKukB,MAAMoX,KAAapX,MAAMyY,IAAerB,IAAYqB,CAI1D,CAhBgB,GA8BjB,OAXIhyB,EAAKlK,MAAQw6B,EAAgB,GAAGx6B,KAClCvJ,QAAQC,IAAI,8BAA+B,CACzC6mC,QAASrzB,EAAKlK,IACdw9B,mBAAoBtzB,EAAKlK,IACzBd,aAAYA,EACZu+B,wBAAyBv+B,EACzBiL,SAAQA,EACRspB,QAAOA,IAKTjkC,EAAAC,KAAA,MAAA,CAEEmO,IAAK,SAACmnB,GACJoW,EAAQp8B,QAAQq8B,EAAalxB,EAAKlK,MAAQ+kB,CAC3C,EACDxzB,QAAS,WAAM,OAAAypC,EAAe9wB,EAAKlK,IAAKkK,EAAKjZ,SAAS,EACtDf,MAAO,CACLqD,SAAU,WACVe,QAAS,SACTT,OAAQqW,EAAKjZ,SAAW,cAAgB,UACxCuC,QAAS,OACTC,WAAY,SACZvE,IAAK,MACLwB,QAASwZ,EAAKjZ,SAAW,GAAM,EAC/B8C,WAAY,yBAEZ3D,WAAYmqC,EAAa,OAAIt7B,EAC7B/K,WAAYqmC,EAAa,cAAWt7B,GACrCrP,SAAA,CAGAsa,EAAKtY,MAAQ,iBAEN8rC,SAAkBxzB,EAAKtY,KACvB+rC,EAAiBh/B,EAAM0oB,eAAend,EAAKtY,MASjD,OARA6E,QAAQC,IAAI,2BAA4B,CACtC6mC,QAASrzB,EAAKlK,IACd09B,SAAQA,EACRC,eAAcA,EACdC,UAAW1zB,EAAKtY,OAId+M,EAAM0oB,eAAend,EAAKtY,MAE1B/B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAWgyB,EAAc,UAChCpoC,WAAY,0BACbnE,SAEA+O,EAAMwpB,aAAaje,EAAKtY,KAAiC,CACxD7B,MAAO,GACPnB,OAAQ,GACRsB,MAAKxG,EAAAA,EAAA,CAAA,EACwB,QAAvB2F,EAAA6a,EAAKtY,KAAKuE,aAAa,IAAA9G,OAAA,EAAAA,EAAEa,OAAK,CAClCX,MAAO4a,EAAWgyB,EAAc,UAChCpoC,WAAY,+BAQG,mBAAdmW,EAAKtY,KAEZ/B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAWgyB,EAAc,UAChCpoC,WAAY,0BACbnE,SAEA+O,EAAM7D,cAAcoP,EAAKtY,KAAkC,CAC1D7B,MAAO,GACPnB,OAAQ,GACRsB,MAAO,CACLX,MAAO4a,EAAWgyB,EAAc,eASxCtsC,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAWgyB,EAAc,UAChCpoC,WAAY,0BACbnE,SAEAsa,EAAKtY,MAGX,CA/Ea,GAkFd/B,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLnB,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZpE,MAAO4a,EAAWgyB,EAAc,UAChCntC,WAAY,QACZ+E,WAAY,0BAGbnE,SAAAsa,EAAKpe,aAIQmT,IAAfiL,EAAK2zB,OAAsC,OAAf3zB,EAAK2zB,OAChChuC,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBwG,SAAU,OACVtL,OAAQ,OACR0F,QAAS,QACTF,aAAc,OACdD,gBAAiBgW,EAAW,UAAY,UACxCnX,OAAQmX,EAAW,oBAAsB,oBACzC5a,MAAO4a,EAAW,UAAY,UAC9Bpb,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZ3E,WAAY,IACZ+E,WAAY,wBACbnE,SAEAsa,EAAK2zB,QAKT3zB,EAAK4zB,gBA7ID5zB,EAAKlK,YAsJQ,WAC5B,IAAMgqB,EAAsC,CAC1Cx2B,QAAS,OACTC,WAAY,SACZU,gBAAiB,UACjBC,aAAc,MACdE,QAAS,MACTtB,OAAQ,oBACR9D,IAAK,MACLqE,SAAU,YAUZ,OANEy2B,EAAej6B,MADF,UAAXixB,EACqB,OAGA,cAIvBxxB,OAAA,MAAA9F,EAAA,CACEkU,IAAKy+B,EACL1qC,UAAW,wCAAAvE,OAAwC4zB,EAAM,KAAA5zB,OAAIuE,GAC7DzB,MAAO85B,GACHj4B,EAAI,CAAAnC,SAAA,CAGRC,EAAAA,IACE,MAAA,CAAA+N,IAAKw+B,EACLlsC,MAAKxG,EAAA,CACH6J,SAAU,WACV0E,IAAK,MACLO,OAAQ,MACRpE,aAAc,MACdD,gBAAiB,UACjBnB,OAAQ,OACRC,UAAW,wCACXc,WAAY,4GACZqE,cAAe,QACZokC,KAINhC,EAAgB5iC,IAAI,SAACsS,GAEpB,IAAMC,EAAW,WAEf,GAAID,EAAKlK,MAAQd,EACf,OAAO,EAGT,GAAIiE,OAAO+G,EAAKlK,OAASmD,OAAOjE,GAC9B,OAAO,EAGT,IAAM27B,EAAUvwB,OAAOJ,EAAKlK,KACtBk8B,EAAa5xB,OAAOpL,GAC1B,OAAKukB,MAAMoX,KAAapX,MAAMyY,IAAerB,IAAYqB,CAI1D,CAhBgB,GAmBbhyB,EAAKlK,MAAQw6B,EAAgB,GAAGx6B,KAClCvJ,QAAQC,IAAI,8BAA+B,CACzC6mC,QAASrzB,EAAKlK,IACdw9B,mBAAoBtzB,EAAKlK,IACzBd,aAAYA,EACZu+B,wBAAyBv+B,EACzBiL,SAAQA,EACRspB,QAAOA,IAIX,IAAM5J,EAAiC,CACrCt2B,SAAU,WACVe,QAAS,WACTT,OAAQqW,EAAKjZ,SAAW,cAAgB,UACxCuC,QAAS,OACTC,WAAY,SACZvE,IAAK,MACLkF,aAAc,MACd1D,QAASwZ,EAAKjZ,SAAW,GAAM,EAC/BgJ,KAAiB,UAAX+mB,EAAqB,EAAI,OAC/BttB,eAAgB,SAChBS,gBAAiB,cACjBnB,OAAQ,wBACRe,WAAY,yBACZoE,OAAQ,GAGV,OACE3I,EAAAC,KAAA,MAAA,CAEEmO,IAAK,SAACmnB,GACJoW,EAAQp8B,QAAQq8B,EAAalxB,EAAKlK,MAAQ+kB,GAE5CxzB,QAAS,WAAM,OAAAypC,EAAe9wB,EAAKlK,IAAKkK,EAAKjZ,SAAS,EACtDf,MAAO25B,EAASj6B,SAAA,CAGfsa,EAAKtY,MAAQ,iBAEZ,OAAI+M,EAAM0oB,eAAend,EAAKtY,MAE1B/B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAW,UAAY,UAC9BpW,WAAY,0BACbnE,SAEA+O,EAAMwpB,aAAaje,EAAKtY,KAAiC,CACxD7B,MAAO,GACPnB,OAAQ,GACRsB,MAAKxG,EAAAA,EAAA,CAAA,EACwB,QAAvB2F,EAAA6a,EAAKtY,KAAKuE,aAAa,IAAA9G,OAAA,EAAAA,EAAEa,OAAK,CAClCX,MAAO4a,EAAW,UAAY,UAC9BpW,WAAY,+BAQG,mBAAdmW,EAAKtY,KAEZ/B,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAW,UAAY,UAC9BpW,WAAY,0BACbnE,SAEA+O,EAAM7D,cAAcoP,EAAKtY,KAAkC,CAC1D7B,MAAO,GACPnB,OAAQ,GACRsB,MAAO,CACLX,MAAO4a,EAAW,UAAY,eAStCta,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChB3D,MAAO,OACPnB,OAAQ,OACRW,MAAO4a,EAAW,UAAY,UAC9BpW,WAAY,0BACbnE,SAEAsa,EAAKtY,MAGX,CArEa,GAwEd/B,EAAAC,IAAA,OAAA,CACEI,MAAO,CACLnB,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZpE,MAAO4a,EAAW,UAAY,UAC9Bnb,WAAY,QACZ+E,WAAY,0BAGbnE,SAAAsa,EAAKpe,aAIQmT,IAAfiL,EAAK2zB,OAAsC,OAAf3zB,EAAK2zB,OAChChuC,EAAAC,IAAA,MAAA,CACEI,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBwG,SAAU,OACVtL,OAAQ,OACR0F,QAAS,QACTF,aAAc,OAClBD,gBAAiBgW,EAAW,UAAY,UACxCnX,OAAQmX,EAAW,oBAAsB,oBACzC5a,MAAO4a,EAAW,UAAY,UAC1Bpb,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZ3E,WAAY,IACZ+E,WAAY,wBACbnE,SAEAsa,EAAK2zB,QAKT3zB,EAAK4zB,gBAvHD5zB,EAAKlK,UA6HtB,CAIwD+9B,GAGnDxD,GAA0B,cAAZ9G,GACb5jC,EAAAA,IAAA,QAAA,CAAAD,SACG,iNAUK,aAAT6Q,IAAuBw7B,aAAA,EAAAA,EAAYrsC,WAClCC,MAAA,MAAA,CAAK8B,UAAU,kBAAkBzB,MAAO,CAAEiK,UAAW,QAAQvK,SAC1DqsC,EAAWrsC,aAKtB,gBFzqBc,SAAsCP,eAClDgC,EAAYhC,EAAA2uC,QAAZA,OAAO,IAAA3sC,EAAG,GAAEA,EACZG,EAAAnC,EAAA4uC,WAAAA,OAAa,IAAAzsC,EAAA,GAAEA,EACfE,EAAcrC,EAAA+c,OAAdA,OAAM,IAAA1a,EAAG,MAAKA,EACdwsC,EAAY7uC,EAAA6uC,aACZrsC,EAAkBxC,EAAA8uC,WAAlBA,OAAU,IAAAtsC,GAAQA,EAClBG,EAAA3C,EAAAC,KAAAA,OAAO,IAAA0C,EAAA,SAAQA,EACfI,EAAgB/C,EAAA+uC,SAAhBA,OAAQ,IAAAhsC,GAAQA,EAChB4O,EAAA3R,EAAA8B,QAAAA,OAAU,IAAA6P,GAAKA,EACfq9B,EAAMhvC,EAAAgvC,OACNl9B,EAAA9R,EAAAivC,WAAAA,OAAa,IAAAn9B,GAAIA,EACjBspB,EAAKp7B,EAAAo7B,MACLmE,EAAMv/B,EAAAu/B,OACN2P,EAAOlvC,EAAAkvC,QACPC,EAAMnvC,EAAAmvC,OACN98B,EAAoBrS,EAAAovC,YAApBA,OAAW,IAAA/8B,EAAG,OAAMA,EACpBtD,EAAQ/O,EAAA+O,SACRsgC,EAAcrvC,EAAAqvC,eACdC,EAAkBtvC,EAAAsvC,mBAClBC,EAAKvvC,EAAAuvC,MACLj9B,EAAAtS,EAAAsC,UAAAA,OAAY,IAAAgQ,EAAA,GAAEA,EACdC,EAAmBvS,EAAAwvC,eAAnBA,OAAc,IAAAj9B,EAAG,GAAEA,EACnB1R,EAAKb,EAAAa,MACL4uC,EAAUzvC,EAAAyvC,WACVC,EAAY1vC,EAAA0vC,aACZC,EAAW3vC,EAAA2vC,YACL3vC,EAAA4vC,WACHltC,EAAI3H,EAAAiF,EA3B2C,oTA8B5C6vC,GADmBxxC,kBACgB,UAGnCqU,GAAwC9P,EAAQA,UACpDisC,aAAY,EAAZA,EAAciB,mBAAmBjB,aAAY,EAAZA,EAAckB,yBAA0B,IADpED,GAAep9B,GAAA,GAAEs9B,SAKxB5nC,EAAAA,UAAU,gBAC8BwH,KAAlCi/B,aAAY,EAAZA,EAAciB,kBAChBE,GAAmBnB,EAAaiB,kBAEjC,CAACjB,aAAA,EAAAA,EAAciB,kBACZ,IAAAj9B,GAAwBjQ,EAAAA,SAAiC,IAAIqtC,KAA5DC,GAAOr9B,GAAA,GAAEs9B,SACVj9B,GAAwCtQ,EAAQA,UACpD6sC,eAAAA,EAAYW,yBAA0B,IADjCC,SAAiBC,SAGlB1nB,GAAgChmB,EAAQA,SAC5CksC,GAAoC,iBAAfA,IAChBA,EAAWp/B,SAAWo/B,EAAWj2B,iBAClC,GAHC03B,GAAW3nB,GAAA,GAAE4nB,GAAc5nB,GAAA,GAK5BE,GAA0BlmB,EAAQA,SACtCksC,GAAoC,iBAAfA,IAChBA,EAAW91B,UAAY81B,EAAW71B,kBACnC,IAHCD,GAAQ8P,GAAA,GAAE2nB,GAAW3nB,GAAA,GAO5B1gB,EAAAA,UAAU,WACJ0mC,GAAoC,iBAAfA,SACIl/B,IAAvBk/B,EAAWp/B,SACb8gC,GAAe1B,EAAWp/B,cAEAE,IAAxBk/B,EAAW91B,UACby3B,GAAY3B,EAAW91B,UAG7B,EAAG,CAAC81B,IACE,IAAA9lB,GAAwCpmB,EAAAA,SAAwB,MAA/D8tC,GAAe1nB,GAAA,GAAE2nB,GAAkB3nB,GAAA,GACpCE,GAA0CtmB,EAAAA,SAAwB,MAAjEguC,GAAgB1nB,GAAA,GAAE2nB,GAAmB3nB,GAAA,GACtCE,GAA0BxmB,EAAAA,UAAS,GAAlC89B,GAAQtX,GAAA,GAAEuX,GAAWvX,GAAA,GACtB0nB,GAAWzhC,SAAuB,MAClC0hC,GAAY1hC,SAAgC,MAGlDjH,EAAAA,UAAU,WACR,IAAM4oC,EAAc,WAClBrQ,GAAYt1B,OAAOywB,WAAa,IAClC,EAGA,OAFAkV,IACA3lC,OAAO8J,iBAAiB,SAAU67B,GAC3B,WAAM,OAAA3lC,OAAO+J,oBAAoB,SAAU47B,GACnD,EAAE,IAGH,IAAMr7B,GAAerL,EAAAA,YAAY,SAACwS,EAAW3E,aAErC84B,EAAiD,QAAjCjxC,EAAA6uC,aAAA,EAAAA,EAAcqC,wBAAmB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAA/xB,GACvD,KAAIm0B,aAAa,EAAbA,EAAervC,UAAnB,CAIA,IACIuvC,EADExgC,EAAMkM,EAAUC,EAAQC,GAI5Bo0B,EADyB,WAAvBtC,aAAY,EAAZA,EAAcptC,MACK0W,EAAW,CAACxH,GAAO,GAEpCwH,EACuB3a,EAAAA,EAAA,GAAAsyC,IAAiB,GAAA,CAAAn/B,OAErBm/B,GAAgBvqC,OAAO,SAAA80B,GAAK,OAAAA,IAAM1pB,CAAN,GAIrDq/B,GAAmBmB,GAEnB,IAAMC,EAAexC,EAAWrpC,OAAO,SAAA5L,GAAK,OAAAw3C,EAAmBv9B,SAASiJ,EAAUljB,EAAGojB,GAAQ,GAEvE,QAAtBvb,EAAAqtC,aAAY,EAAZA,EAAc9/B,gBAAQ,IAAAvN,GAAAA,EAAApH,KAAAy0C,EAAGsC,EAAoBC,WAC7C1vC,EAAAmtC,aAAY,EAAZA,EAAct9B,gCAAWuL,EAAQ3E,EAAUi5B,EAAc,IAAIC,MAAM,UApBlE,CAqBF,EAAE,CAACvB,GAAiB/yB,EAAQ8xB,EAAcD,IAErC0C,GAAkBhnC,EAAAA,YAAY,SAAC6N,EAAmBo5B,WAEhD1f,EAAO0f,EACVhsC,OAAO,SAAA5L,GAAC,IAAAqG,EAAI,QAAkC,QAAjCA,EAAA6uC,eAAAA,EAAcqC,wBAAmB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAAl1C,GAAGiI,SAAQ,GACzD2G,IAAI,SAAA5O,GAAK,OAAAkjB,EAAUljB,EAAGojB,EAAb,GACNo0B,EAAqBh5B,EAAW0Z,EAAO,GAE7Cme,GAAmBmB,GAEnB,IAAMC,EAAexC,EAAWrpC,OAAO,SAAA5L,GAAK,OAAAw3C,EAAmBv9B,SAASiJ,EAAUljB,EAAGojB,GAAQ,GACvFy0B,EAAar5B,EAAWo5B,EAAgBhsC,OAAO,SAAA5L,GAAC,IAAAqG,EAAI,QAA+B,QAA9BA,EAAA6uC,eAAAA,EAAcqC,wBAAgB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAGl1C,GAAGiI,SAAQ,GAAI,GAErF,QAAtB5B,EAAA6uC,aAAY,EAAZA,EAAc9/B,gBAAQ,IAAA/O,GAAAA,EAAA5F,KAAAy0C,EAAGsC,EAAoBC,GACjB,QAA5B5vC,EAAAqtC,aAAY,EAAZA,EAAc4C,mBAAc,IAAAjwC,GAAAA,EAAApH,KAAAy0C,EAAA12B,EAAUi5B,EAAcI,EACrD,EAAE,CAACz0B,EAAQ8xB,EAAcD,IAGpB8C,GAAapnC,EAAAA,YAAY,SAACqnC,EAAuB10B,GACrD,IAAM20B,EAAYD,EAAOhhC,MAAQ3W,MAAM0Z,QAAQi+B,EAAOE,WAAaF,EAAOE,UAAUpsC,KAAK,KAAOksC,EAAOE,WACvG,GAAKD,EAAL,CAEA,IAAME,EAAa,IAAI7B,IAAIC,IAEb,OAAVjzB,EACF60B,EAAWhqC,OAAO8pC,GAElBE,EAAWC,IAAIH,EAAqB30B,GAGtCkzB,GAAW2B,GAGX,IAAME,EAAiCh4C,MAAM0D,KAAKo0C,EAAWG,WAAW1pC,IAAI,SAACvI,OAAC2Q,EAAG3Q,EAAA,GAAEid,EAAKjd,EAAA,GAKtF,MAAO,CACL2xC,OALUhD,EAAQr4B,KAAK,SAAA47B,GAEvB,OADaA,EAAEvhC,MAAQ3W,MAAM0Z,QAAQw+B,EAAEL,WAAaK,EAAEL,UAAUpsC,KAAK,KAAOysC,EAAEL,cAC9DlhC,CAClB,IAEiBghC,EACf10B,MAAOA,EACP4W,MAAOljB,EACPihC,UAAWjhC,EAEf,GAGMwhC,EAAiC,CACrCR,OAAMA,EACN10B,MAAOA,EACP4W,MAAO+d,EACPA,UAAWA,GAITD,EAAOtC,gBACTsC,EAAOtC,eAAe8C,GAIpB9C,GACFA,EAAsC,IAAvB2C,EAAYp3C,OAAeo3C,EAAY,GAAKA,GAIzDjjC,GACFA,EACE,CAAEW,QAAS6gC,GAAav3B,SAAQA,IAChC,CAAA,EACuB,IAAvBg5B,EAAYp3C,OAAeo3C,EAAY,GAAKA,EAC5C,CAAEI,kBAAmBxD,EAAYllC,OAAQ,QAlDtB,CAqDzB,EAAG,CAACwmC,GAASnhC,EAAUsgC,EAAgBkB,GAAav3B,GAAU41B,EAAYD,IAGrDrkC,cAAY,SAACwS,EAAWu1B,WAEvCC,EADE3hC,EAAMkM,EAAUC,EAAQC,GAI5Bu1B,EADED,EACuB70C,EAAAA,EAAA,GAAA6yC,IAAiB,GAAA,CAAA1/B,OAErB0/B,GAAgB9qC,OAAO,SAAA80B,GAAK,OAAAA,IAAM1pB,CAAN,GAGnD2/B,GAAmBgC,GACC,QAApBtyC,EAAAyvC,aAAU,EAAVA,EAAY8C,gBAAQ,IAAAvyC,GAAAA,EAAA5F,KAAAq1C,EAAG4C,EAAUv1B,GACD,QAAhCtb,EAAAiuC,aAAA,EAAAA,EAAY+C,4BAAoB,IAAAhxC,GAAAA,EAAApH,KAAAq1C,EAAG6C,EACpC,EAAE,CAACjC,GAAiBtzB,EAAQ0yB,IAG7B,IAqfQgD,GArfFC,GAAmBpoC,EAAAA,YAAY,WACnC,IAAIqoC,EAASn1C,EAAA,GAAOoxC,GAAU,GAiC9B,OA9BIsB,GAAQjwC,KAAO,GACjB0yC,EAAUC,KAAK,SAACC,EAAGj5C,GAEjB,IADA,IACYk5C,EAAA,SAAAlB,EAAW30B,GACrB,IAAM00B,EAAShD,EAAQr4B,KAAK,SAAAy8B,GAE1B,OADeA,EAAIpiC,MAAQ3W,MAAM0Z,QAAQq/B,EAAIlB,WAAakB,EAAIlB,UAAUpsC,KAAK,KAAOstC,EAAIlB,cACtED,CACpB,GAEA,IAAKD,EAAiB,MAAA,WAEtB,IAAIqB,EAAgB,EAEpB,GAA6B,mBAAlBrB,EAAOsB,OAChBD,EAAgBrB,EAAOsB,OAAOJ,EAAGj5C,QAC5B,IAAsB,IAAlB+3C,EAAOsB,OAAiB,CACjC,IAAMC,EAAO12B,EAASq2B,EAAGlB,EAAOE,WAAaD,GACvCuB,EAAO32B,EAAS5iB,EAAG+3C,EAAOE,WAAaD,GACzCsB,EAAOC,EAAMH,GAAiB,EACzBE,EAAOC,IAAMH,EAAgB,EACvC,CAED,OAAsB,IAAlBA,SACe,WAAV/1B,EAAqB+1B,GAAiBA,QAD/C,OAnB+BI,EADXp5C,MAAM0D,KAAKwyC,GAAQ+B,WACRne,EAAAsf,EAAAx4C,OAAAk5B,IAAa,CAAnC,IAAA9zB,OAACqzC,EAAAP,EAAS9yC,EAAA,GAAOA,EAAA,wCAsB3B,CACD,OAAO,CACT,GAGK2yC,CACR,EAAE,CAAC/D,EAAYsB,GAASvB,IAEnB2E,GAAgBZ,KAIhBa,GAAqB/tC,QAAQspC,GAAoC,iBAAfA,QAAgDl/B,IAArBk/B,EAAWh2B,OACxF06B,GAAgBt/B,EAAAA,QAAQ,WAC5B,IAAmB,IAAf46B,IAAyBA,EAAY,OAAOwE,GAChD,GAAIC,GAAoB,OAAOD,GAC/B,IAAM74B,GAAS81B,GAAc,GAAKv3B,GAC5B0B,EAAMD,EAAQzB,GACpB,OAAOs6B,GAAcx1C,MAAM2c,EAAOC,EACpC,EAAG,CAAC44B,GAAe/C,GAAav3B,GAAU81B,EAAYyE,KAEhDn5B,GAAmB9P,EAAAA,YAAY,SAAC+P,EAAcpa,WAC5Cib,EAAcjb,QAAAA,EAAQ+Y,GAgB5B,GAfAw3B,GAAen2B,GACXpa,GAAMwwC,GAAYxwC,GAGlBqvC,GACFA,EAAmBj1B,EAAMa,GAIvB4zB,GAAoC,iBAAfA,IACJ,QAAnB9uC,EAAA8uC,EAAW//B,gBAAQ,IAAA/O,GAAAA,EAAA5F,KAAA00C,EAAGz0B,EAAMpa,GACxBA,IAAiC,QAA3BuB,EAAAstC,EAAWx1B,wBAAgB,IAAA9X,GAAAA,EAAApH,KAAA00C,EAAGz0B,EAAMpa,KAI5C8O,EAAU,CACZ,IAAMijC,EAAiCh4C,MAAM0D,KAAKwyC,GAAQ+B,WAAW1pC,IAAI,SAACvI,OAAC2Q,EAAG3Q,EAAA,GAAEid,EAAKjd,EAAA,GAKnF,MAAO,CACL2xC,OALUhD,EAAQr4B,KAAK,SAAA47B,GAEvB,OADaA,EAAEvhC,MAAQ3W,MAAM0Z,QAAQw+B,EAAEL,WAAaK,EAAEL,UAAUpsC,KAAK,KAAOysC,EAAEL,cAC9DlhC,CAClB,GAGEsM,MAAOA,EACP4W,MAAOljB,EACPihC,UAAWjhC,EAEf,GAEA5B,EACE,CAAEW,QAAS2K,EAAMrB,SAAUkC,GAC3B,CAAA,EACuB,IAAvB82B,EAAYp3C,OAAeo3C,EAAY,GAAKA,EAC5C,CAAEI,kBAAmBkB,GAAe5pC,OAAQ,YAE/C,CACH,EAAG,CAAColC,EAAYQ,EAAoBvgC,EAAUiK,GAAUk3B,GAASvB,EAAS2E,KAGpEG,GAAanpC,EAAWA,YAAC,SAACqnC,EAAuB70B,EAAW9E,GAChE,IAAMnc,EAAQ2gB,EAASM,EAAQ60B,EAAOE,WAAa,IAEnD,OAAIF,EAAO9lC,OACF8lC,EAAO9lC,OAAOhQ,EAAOihB,EAAQ9E,GAG/Bnc,CACR,EAAE,IAGG63C,GAAiBppC,EAAWA,YAAC,SAACqpC,EAAqBC,EAA+CC,GACtG,GAAKD,EAAL,CAEA,IAAME,GAA2B,IAAVF,EAAiB,OAASA,EAC7C5wB,EAAS,EAEb,GAAuB,SAAnB8wB,EAA2B,CAG7B,GAAIjF,IAAwC,SAAvBA,EAAa+E,QAA2C,IAAvB/E,EAAa+E,OAIjE5wB,GAHwD,iBAA7B6rB,EAAakF,YACpClF,EAAakF,YACwB,iBAA7BlF,EAAakF,YAA2Bx5B,SAASs0B,EAAakF,aAAe,GAI3F,IAAK,IAAIt5C,EAAI,EAAGA,EAAIk5C,EAAal5C,IAAK,CAEpC,GAAkB,UADZs4C,EAAMpE,EAAQl0C,IACZm5C,QAAkC,IAAdb,EAAIa,MAI9B5wB,GAHiB+vB,EAAIryC,MACK,iBAAdqyC,EAAIryC,MAAqBqyC,EAAIryC,MAAQ6Z,SAASw4B,EAAIryC,QAAoB,EAC9E,GAGP,CACD,OAAOsiB,CACR,CAAM,GAAuB,UAAnB8wB,EAA4B,CAErC,IAASr5C,EAAIk5C,EAAc,EAAGl5C,EAAIk0C,EAAQ/zC,OAAQH,IAAK,CACrD,IAAMs4C,EACN,GAAkB,WADZA,EAAMpE,EAAQl0C,IACZm5C,MAIN5wB,GAHiB+vB,EAAIryC,MACK,iBAAdqyC,EAAIryC,MAAqBqyC,EAAIryC,MAAQ6Z,SAASw4B,EAAIryC,QAAoB,EAC9E,GAGP,CAED,GAAImuC,GAAuC,UAAvBA,EAAa+E,MAI/B5wB,GAHwD,iBAA7B6rB,EAAakF,YACpClF,EAAakF,YACwB,iBAA7BlF,EAAakF,YAA2Bx5B,SAASs0B,EAAakF,aAAe,GAG3F,OAAO/wB,CACR,CA5C2B,CA+C9B,EAAG,CAAC2rB,EAASE,IAGPmF,GAAe1pC,EAAAA,YAAY,WAC/B,IAAK2kC,EAAY,OAAO,KAExB,IAmGgBgF,EACAC,EACAC,EACAC,EAtGVC,EAAgB1F,EAAQpmC,IAAI,SAACopC,EAAQ2C,SACnC1C,EAAYD,EAAOhhC,MAAQ3W,MAAM0Z,QAAQi+B,EAAOE,WAAaF,EAAOE,UAAUpsC,KAAK,KAAOksC,EAAOE,YAAcyC,EAC/GC,EAAYrE,GAAQsE,IAAI5C,IAAwB,KAChD6C,EAAcf,GAAeY,EAAU3C,EAAOiC,OAAO,GACrDG,EAAcpC,EAAOjxC,MACE,iBAAjBixC,EAAOjxC,MAAqB,UAAGixC,EAAOjxC,MAAS,MAAGixC,EAAOjxC,WACjEkP,EAEJ,OACEpP,EAAAC,IAAA,KAAApG,EAAA,CAEEiI,UAAW,GAAGvE,OAAA4zC,EAAOrvC,WAAa,GAAM,KAAAvE,OAAA4zC,EAAO+C,MAAQ,QAAA32C,OAAQ4zC,EAAO+C,OAAU,IAChF7zC,MAAO,CACLH,MAAOqzC,EACPlpC,SAAU8mC,EAAO9mC,SAAuC,iBAApB8mC,EAAO9mC,SAAwB,GAAA9M,OAAG4zC,EAAO9mC,SAAY,MAAG8mC,EAAO9mC,SAAakpC,QAAenkC,EAC/HpF,SAAUupC,EACV7vC,SAAUytC,EAAOiC,MAAQ,SAAW,WACpC/qC,KAAuB,SAAjB8oC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,WAAkChkC,IAAhB6kC,EAA4B,UAAGA,EAAW,MAAO,SAAO7kC,EAClH1G,MAAwB,UAAjByoC,EAAOiC,WAAqChkC,IAAhB6kC,EAA4B,GAAA12C,OAAG02C,EAAW,MAAO,SAAO7kC,EAC3F9G,OAAQ6oC,EAAOiC,MAA0B,SAAjBjC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,MAAiB,GAAK,EAAK,EACrF9uC,iBAAiB6sC,EAAOiC,MAAQ,WAChChwC,UAA4B,SAAjB+tC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,MACzC,gCACiB,UAAjBjC,EAAOiC,MACP,sCACAhkC,EACJ3K,QAAS,YACT8S,UAAW45B,EAAO+C,OAAS,OAC3B7c,aAAc,oBACdtzB,WAAY,IACZ7E,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,yBAEU,QAAnBtE,EAAA2xC,EAAOgD,oBAAY,IAAA30C,OAAA,EAAAA,EAAA5F,KAAAu3C,EAAGA,KAAW,CAAE,EAExC,CAAApxC,SAAAJ,EAAAC,KAAA,MAAA,CACES,MAAO,CACLsD,QAAS,OACTC,WAAY,SACZvE,IAAK,MACLwE,eAAiC,UAAjBstC,EAAO+C,MAAoB,WAA8B,WAAjB/C,EAAO+C,MAAqB,SAAW,cAGjGn0C,SAAA,CAAAC,MAAA,OAAA,CAAMK,MAAO,CAAE0D,WAAY,IAAK7E,SAAU,OAAQC,WAAY,OAAQO,MAAO,WAAWK,SAC7D,mBAAjBoxC,EAAOvW,MAAuBuW,EAAOvW,MAAM,CAAEmZ,UAASA,EAAEK,WAAYjD,IAAYA,EAAOvW,QAEhGuW,EAAOsB,QACNzyC,EAAAA,IACE,SAAA,CAAA0B,QAAS,WAEPwvC,GAAWC,EADqB,OAAd4C,EAAqB,SAAyB,WAAdA,EAAyB,UAAY,KAExF,EACD1zC,MAAO,CACL8C,OAAQ,OACR8G,WAAY,OACZjG,OAAQ,UACRL,QAAS,OACTC,WAAY,SACZa,QAAS,MACT/E,MAAOq0C,EAAY,UAAY,WAChCh0C,SAEDC,MAACwc,EAAiB,CAACC,MAAOs3B,QAAa3kC,WAtDxCgiC,EA4DX,GAGA,GAAI/C,EAAc,CAChB,IAAMgG,EAAkD,iBAA7BhG,EAAakF,YACpC,GAAAh2C,OAAG8wC,EAAakF,YAAe,MACM,iBAA7BlF,EAAakF,YAA2BlF,EAAakF,YAAc,OACzEe,EACJt0C,EAAAA,IAAA,KAAA,CAEEK,MAAO,CACLH,MAAOm0C,EACP3wC,SAAU2qC,EAAa+E,MAAQ,SAAW,WAC1C/qC,KAA6B,SAAvBgmC,EAAa+E,QAA2C,IAAvB/E,EAAa+E,MAAiB,WAAQhkC,EAC7E1G,MAA8B,UAAvB2lC,EAAa+E,MAAoB,WAAQhkC,EAChD9G,OAAQ+lC,EAAa+E,MAAgC,SAAvB/E,EAAa+E,QAA2C,IAAvB/E,EAAa+E,MAAiB,GAAK,GAAM,EACxG9uC,gBAAiB,UACjBG,QAAS,YACT4yB,aAAc,oBACdtzB,WAAY,IACZ7E,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZyT,UAAW,UACZxX,SAEDJ,EAAKC,KAAA,MAAA,CAAAS,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUC,eAAgB,UAClE9D,SAAA,EAACsuC,EAAakG,eAAuC,UAAtBlG,EAAaptC,OACrCwyC,EAAcT,GAAcjuC,OAAO,SAAA5L,GAAK,IAAAqG,EAAA,QAA8B,UAA7B6uC,EAAaqC,wBAAgB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAGl1C,GAAGiI,SAAQ,GACpFsyC,EAAcD,EAAY1rC,IAAI,SAAA5O,GAAK,OAAAkjB,EAAUljB,EAAGojB,EAAO,GACvDo3B,EAAcF,EAAYr5C,OAAS,GAAKs5C,EAAYz1B,MAAM,SAAA9N,GAAO,OAAAm/B,GAAgBl8B,SAASjD,EAAI,GAC9FyjC,EAAeF,EAAY5e,KAAK,SAAA3kB,GAAO,OAAAm/B,GAAgBl8B,SAASjD,EAAI,GAGxEnQ,EAAAC,IAAC6a,EAAQ,CACPC,QAAS44B,EACT34B,cAAe44B,IAAiBD,EAChCplC,SAAU,SAAC/T,GAAM,OAAAs2C,GAAgBt2C,EAAE+U,OAAOwL,QAASi4B,GAAc,KAItE3E,EAAamG,aAAex0C,MAAM,OAAA,CAAAK,MAAO,CAAEoW,WAAY43B,EAAakG,cAAgB,EAAI,OAAUx0C,SAAAsuC,EAAamG,kBAjC9G,aAqCRX,EAAcY,QAAQH,EACvB,CAED,IAAMI,EAAiBvF,aAAW,EAAXA,EAAchB,EAAS,GAE9C,OACEnuC,EAAAA,IAAO,QAAA,CAAA+N,IAAKwiC,YACVvwC,EAAAA,IAAQ,KAAAnG,EAAA,CAAA,EAAC66C,GAAkB,GAAG,CAAA30C,SAAG8zC,MAGtC,EAAE,CAAC1F,EAASM,EAAYiB,GAASrB,EAAciB,GAAiB0D,GAAez2B,EAAQ20B,GAAYJ,GAAiBtC,EAAQW,EAAa+D,KAGpIyB,GAAkB7qC,cAAY,SAAC0N,GACnC24B,GAAmB34B,EACpB,EAAE,IAEGo9B,GAAiB9qC,EAAAA,YAAY,SAACtP,EAAoBgd,GACtDhd,EAAE0K,iBACFmrC,GAAoB74B,EACrB,EAAE,IAEGq9B,GAAa/qC,EAAAA,YAAY,SAACtP,EAAoBs6C,GAElD,GADAt6C,EAAE0K,iBACsB,OAApBgrC,IAA4BA,KAAoB4E,EAGlD,OAFA3E,GAAmB,WACnBE,GAAoB,MAItB,IAAM0E,EAAO/3C,EAAA,GAAOg2C,IAAa,GAC3BgC,EAAcD,EAAQ7E,IAC5B6E,EAAQE,OAAO/E,GAAiB,GAChC6E,EAAQE,OAAOH,EAAW,EAAGE,GAG7B7E,GAAmB,MACnBE,GAAoB,KACtB,EAAG,CAACH,GAAiB8C,KAEfkC,GAAgBprC,EAAAA,YAAY,WAChCqmC,GAAmB,MACnBE,GAAoB,KACrB,EAAE,IAGG8E,GAAcrrC,EAAAA,YAAY,WAC9B,IAAMsrC,EAAY5G,aAAA,EAAAA,EAAQ4G,UACpBt5B,EACiB,mBAAds5B,EACHA,SACchmC,IAAdgmC,EACAA,EACA,UACAC,EAAUlH,EAAQ/zC,QAAUi0C,EAAe,EAAI,GACrD,OACEruC,MAAA,KAAA,CAAI8B,UAAU,wBAAuB/B,SACnCC,EAAIC,IAAA,KAAA,CAAAo1C,QAASA,EAASh1C,MAAO,CAC3BoE,QAAS,YACT8S,UAAW,SACX7X,MAAO,UACPR,SAAU,OACVC,WAAY,OACZ2E,WAAY,sBACZuzB,aAAc,OACd/yB,gBAAiB,SAClBvE,SACE+b,KAIR,EAAE,CAAC0yB,eAAAA,EAAQ4G,UAAWjH,EAAQ/zC,OAAQi0C,IAGjCiH,GAAaxrC,EAAAA,YAAY,WAC7B,OAA6B,IAAzBkpC,GAAc54C,OACT+6C,KAEFnC,GAAcjrC,IAAI,SAACuU,EAAQ9E,SAC1BrH,EAAMkM,EAAUC,EAAQC,GACxB9E,EAAa63B,GAAgBl8B,SAASjD,GACtColC,EAAa1F,GAAgBz8B,SAASjD,GACtCqlC,GAAWzG,aAAK,EAALA,EAAQzyB,EAAQ9E,KAAU,CAAA,EACrCi+B,EAAYj+B,IAAUw7B,GAAc54C,OAAS,EAEnD,OACEuF,EAAAC,KAACkP,EAAMhP,SACL,CAAAC,SAAA,CAAAJ,EAAAC,KAAA,KAAA/F,EAAA,CACEiI,UAAW,UAA2B,mBAAjBotC,EAA8BA,EAAa5yB,EAAQ9E,GAAS03B,GAAgB,GAAM,KAAA3xC,OAAA2yC,KAAoB14B,EAAQ,WAAa,GAAE,KAAAja,OAAI6yC,KAAqB54B,EAAQ,YAAc,IACjMk+B,WAAW,EACXC,YAAa,WAAM,OAAAhB,GAAgBn9B,EAAM,EACzCo+B,WAAY,SAACp7C,GAAM,OAAAo6C,GAAep6C,EAAGgd,EAAM,EAC3Cq+B,OAAQ,SAACr7C,GAAM,OAAAq6C,GAAWr6C,EAAGgd,IAC7Bs+B,UAAWZ,GACX70C,MACExG,EAAA,CAAAmK,OAAQ,OACRnD,QAASqvC,KAAoB14B,EAAQ,GAAM,EAC3ClT,gBAAiB8rC,KAAqB54B,EAAQ,UAAY,QAC1DtT,WAAY,yBACTsxC,EAASn1C,OAEd8E,aAAc,SAAC3K,GACT01C,KAAoB14B,GAAS44B,KAAqB54B,IACpDhd,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,UAE5C,EACAc,aAAc,SAAC5K,GACT01C,KAAoB14B,GAAS44B,KAAqB54B,IACpDhd,EAAEgQ,cAAcnK,MAAMiE,gBAAkB,WAGxCkxC,EAEH,CAAAz1C,SAAA,CAAAsuC,GACCruC,MAAA,KAAA,CACEK,MAAO,CACLH,MAA2C,iBAA7BmuC,EAAakF,YACvB,GAAAh2C,OAAG8wC,EAAakF,YAAe,MACM,iBAA7BlF,EAAakF,YAA2BlF,EAAakF,YAAc,OAC/E7vC,SAAU2qC,EAAa+E,MAAQ,SAAW,WAC1C/qC,KAA6B,SAAvBgmC,EAAa+E,QAA2C,IAAvB/E,EAAa+E,MAAiB,WAAQhkC,EAC7E1G,MAA8B,UAAvB2lC,EAAa+E,MAAoB,WAAQhkC,EAChD9G,OAAQ+lC,EAAa+E,MAAgC,SAAvB/E,EAAa+E,QAA2C,IAAvB/E,EAAa+E,MAAiB,GAAK,GAAM,EACxG9uC,gBAAiB,QACjBG,QAAS,OACT4yB,aAAcoe,EAAY,OAAS,oBACnCl+B,UAAW,UACZxX,SAEDC,EAAAA,IAAK,MAAA,CAAAK,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUC,eAAgB,UAAU9D,SAC7EC,EAAAA,IAAC8a,EACC,CAAAC,QAAStD,EACTlJ,SAAU,SAAC/T,GAAM,OAAA2a,GAAamH,EAAQ9hB,EAAE+U,OAAOwL,UAC/C3Z,SAA0C,QAAhC5B,EAAA6uC,EAAaqC,wBAAmB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAA/xB,GAAQlb,eAKzD+sC,EAAQpmC,IAAI,SAACopC,EAAQ2C,SACd1C,EAAYD,EAAOhhC,MAAQ3W,MAAM0Z,QAAQi+B,EAAOE,WAAaF,EAAOE,UAAUpsC,KAAK,KAAOksC,EAAOE,YAAcyC,EAC/GiC,GAA4B,QAAhBv2C,EAAA2xC,EAAO6E,cAAS,IAAAx2C,OAAA,EAAAA,EAAA5F,KAAAu3C,EAAA70B,EAAQ9E,KAAU,GAC9Cy8B,EAAcf,GAAeY,EAAU3C,EAAOiC,OAAO,GACrDG,EAAcpC,EAAOjxC,MACE,iBAAjBixC,EAAOjxC,MAAqB,UAAGixC,EAAOjxC,MAAS,MAAGixC,EAAOjxC,WACjEkP,EAEJ,OACEpP,cAEE8B,UAAW,UAAGqvC,EAAOrvC,WAAa,GAAE,KAAAvE,OAAI4zC,EAAO+C,MAAQ,eAAQ/C,EAAO+C,OAAU,IAChF7zC,MAAKxG,EAAA,CACHqG,MAAOqzC,EACPlpC,SAAU8mC,EAAO9mC,SAAuC,iBAApB8mC,EAAO9mC,SAAwB,GAAA9M,OAAG4zC,EAAO9mC,eAAe8mC,EAAO9mC,SAAakpC,QAAenkC,EAC/HpF,SAAUupC,EACV7vC,SAAUytC,EAAOiC,MAAQ,SAAW,WACpC/qC,KAAuB,SAAjB8oC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,WAAkChkC,IAAhB6kC,EAA4B,GAAG12C,OAAA02C,QAAkB,SAAO7kC,EAClH1G,MAAwB,UAAjByoC,EAAOiC,WAAqChkC,IAAhB6kC,EAA4B,GAAA12C,OAAG02C,EAAW,MAAO,SAAO7kC,EAC3F9G,OAAQ6oC,EAAOiC,MAA0B,SAAjBjC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,MAAiB,GAAK,EAAK,EACrF9uC,gBAAiB,QACjBlB,UAA4B,SAAjB+tC,EAAOiC,QAAqC,IAAjBjC,EAAOiC,MACzC,gCACiB,UAAjBjC,EAAOiC,MACP,sCACAhkC,EACJ3K,QAAS,OACT4yB,aAAcoe,EAAY,OAAS,oBACnCv2C,SAAU,OACVC,WAAY,OACZO,MAAO,UACPoE,WAAY,sBACZyT,UAAW45B,EAAO+C,OAAS,QACxB6B,EAAU11C,OAEfg1C,QAASlE,EAAOkE,QAChBY,QAAS9E,EAAO8E,SACZF,EAEH,CAAAh2C,SAAAkzC,GAAW9B,EAAQ70B,EAAQ9E,KA7BvB45B,UAkCZnC,aAAU,EAAVA,EAAYiH,oBAAqBX,GAChCv1C,EACEC,IAAA,KAAA,CAAAF,SAAAC,EAAAC,IAAA,KAAA,CAAIo1C,QAASlH,EAAQ/zC,QAAUi0C,EAAe,EAAI,YAC/CY,EAAWiH,kBAAkB55B,EAAQ9E,EAAO,GAAG,SAnGnCrH,EAyGzB,EACF,EAAG,CAAC6iC,GAAez2B,EAAQ+yB,GAAiBO,GAAiBxB,EAAcF,EAASY,EAAOG,EAAc/5B,GAAc89B,GAAYhE,EAAYiB,GAAiBE,GAAkBuE,GAAiBC,GAAgBC,GAAYK,GAAehC,GAAgBiC,KAGxPgB,GAAmB,iBACvB,IAAmB,IAAf7H,IAAyBA,EAAY,OAAO,KAEhD,IAAMh2B,EAA4B,QAApB9Y,EAAA8uC,EAAWh2B,aAAS,IAAA9Y,EAAAA,EAAAszC,GAAc14C,OAC1CsJ,EAAW4qC,EAAW5qC,UAAY,cAExC,OACE1D,EACEC,IAAA,MAAA,CAAAI,MAAO,CACLiK,UAAW,OACX3G,QAAS,OACTE,eAAgBH,EAAS0P,SAAS,SAAW,WAAa1P,EAAS0P,SAAS,QAAU,aAAe,UACtGrT,SAEDC,EAACC,IAAAkY,EACC,CAAAjJ,QAAS6gC,GACTz3B,MAAOA,EACPE,SAAUA,GACVE,gBAAiB41B,EAAW51B,gBAC5BC,gBAAiB21B,EAAW31B,gBAC5BC,gBAAiB01B,EAAW11B,gBAC5BC,UAAWy1B,EAAWz1B,UACtBtK,SAAUqL,GACVd,iBAAkBc,GAClBb,OAAQu1B,EAAWv1B,OACnBE,WAAYq1B,EAAWr1B,WACvBxZ,KAAe,UAATA,EAAmB,QAAU,aAI3C,EAmFM22C,GAAkB1iC,EAAAA,QAAQ,WAC9B,OAAOy6B,EAAQrZ,KAAK,SAAAyd,GAAO,OAAAA,EAAIa,KAAK,IAAM/E,GAAgBA,EAAa+E,KACzE,EAAG,CAACjF,EAASE,IAGPgI,GAAqB3iC,EAAAA,QAAQ,WACjC,OAAOy6B,EAAQlwB,MAAM,SAAAs0B,GAAO,OAAAA,EAAIryC,WAAYmuC,GAAgBA,EAAakF,YAC3E,EAAG,CAACpF,EAASE,IAKPiI,GAAa5iC,EAAAA,QAAQ,WAEzB,GAAIi7B,aAAM,EAANA,EAAQ1M,EAAG,CACb,GAAwB,iBAAb0M,EAAO1M,EAChB,OAAO0M,EAAO1M,EACT,IAAiB,IAAb0M,EAAO1M,EAShB,OAPiBkM,EAAQhyB,OAAO,SAACo6B,EAAKhE,GAIpC,OAAOgE,GAHGhE,EAAIryC,MACY,iBAAdqyC,EAAIryC,MAAqBqyC,EAAIryC,MAAQ6Z,SAASzG,OAAOi/B,EAAIryC,OAAOye,QAAQ,KAAM,MAAQ,EAC9F,IAEL,EAAE,IACuB0vB,EAAoD,iBAA7BA,EAAakF,YAA2BlF,EAAakF,YAAcx5B,SAASzG,OAAO+6B,EAAakF,aAAe,MAAM50B,QAAQ,KAAM,MAAQ,GAAM,EAGrM,CAID,GAAIy3B,GAaF,OAXsBjI,EAAQhyB,OAAO,SAACo6B,EAAKhE,GACzC,OAAIA,EAAIa,OAASb,EAAIryC,MAEZq2C,GADwB,iBAAdhE,EAAIryC,MAAqBqyC,EAAIryC,MAAQ6Z,SAASzG,OAAOi/B,EAAIryC,OAAOye,QAAQ,KAAM,MAAQ,GAGlG43B,CACR,EAAE,IACwBlI,GAAgBA,EAAa+E,OAAS/E,EAAakF,YACrC,iBAA7BlF,EAAakF,YAA2BlF,EAAakF,YAAcx5B,SAASzG,OAAO+6B,EAAakF,aAAa50B,QAAQ,KAAM,MAAQ,GAC3I,EAOP,EAAE,CAACwvB,EAASQ,aAAM,EAANA,EAAQ1M,EAAGoM,EAAc+H,KAGhCI,GAAuB9iC,EAAAA,QAAQ,WACnC,MAAoB,UAAhBk7B,GACAwH,IACAC,IAEAlI,EAAQrZ,KAAK,SAAAyd,GAAO,OAAAA,EAAIryC,QAJQ,QAK7B0uC,CACR,EAAE,CAACA,EAAawH,GAAiBC,GAAoBlI,IAEhDsI,GACJ58C,EAAAA,EAAA,CAAAqG,MAAO,OACPmK,SAAUisC,GAAa,UAAGA,GAAU,MAAO,OAC3CI,eAAgB,WAChBC,cAAe,EACf/H,YAAa4H,GACblyC,gBAAiB,SACbiqC,GAAY,CAAEhqC,aAAc,MAAOpB,OAAQ,sBAAsB,CACrEqB,SAAU,WAGNoyC,MACJlzC,SAAU,WACVxD,MAAO,OACP8J,SAAU,OACVmN,UAAgC,iBAAdw3B,aAAA,EAAAA,EAAQ5yC,GAAiB,GAAAwB,OAAGoxC,EAAO5yC,EAAC,WAAOqT,EAC7D7K,aAAc,OACXlE,GAIL,GAAI6/B,GACF,OACEvgC,EAAAC,KAAA,MAAA/F,EAAA,CACEkU,IAAKuiC,GACLxuC,UAAW,sCAAsCvE,OAAAuE,GACjDzB,MAAOu2C,GAAY,cACRt1C,QAAiB8N,GACxBlN,EAAI,CAAAnC,SAAA,CAEP66B,GAAS56B,EAAAC,IAAA,MAAA,CAAKI,MAAO,CAAEiuB,aAAc,QAAQvuB,SAAG66B,EAAMkY,MACtDxE,GAAoC,iBAAfA,IAAgD,QAArBttC,EAAAstC,EAAW5qC,gBAAU,IAAA1C,OAAA,EAAAA,EAAA61C,WAAW,SAAUV,MA5KzFlE,GACyB,mBAAtBzD,aAAM,EAANA,EAAQ4G,WACX5G,EAAO4G,iBACehmC,KAAtBo/B,eAAAA,EAAQ4G,WACR5G,EAAO4G,UACP,UACuB,IAAzBpC,GAAc54C,OAEd4F,EAAKC,IAAA,MAAA,CAAA6B,UAAU,yCAAyCzB,MAAO,CAC7DoE,QAAS,YACT8S,UAAW,SACX7X,MAAO,UACPR,SAAU,OACVC,WAAY,OACZ2E,WAAY,uBAEX/D,SAAAkyC,KAKLjyC,MAAA,MAAA,CAAK8B,UAAU,mBAAkB/B,SAC9BizC,GAAcjrC,IAAI,SAACuU,EAAQ9E,SACpBrH,EAAMkM,EAAUC,EAAQC,GACxB9E,EAAa63B,GAAgBl8B,SAASjD,GAE5C,OACExQ,OAEE,MAAA,CAAAmC,UAAW,wBAAAvE,OAAwBka,EAAa,WAAa,IAC7DpX,MAAO,CACL8C,OAAQ,oBACRoB,aAAc,MACdE,QAAS,OACT6pB,aAAc,OACdhqB,gBAAiBmT,EAAa,UAAY,SAG3C1X,SAAA,CAAAsuC,GACCruC,MAAK,MAAA,CAAAK,MAAO,CAAEiuB,aAAc,OAC1BvuB,SAAAC,MAAC8a,EACC,CAAAC,QAAStD,EACTlJ,SAAU,SAAC/T,GAAM,OAAA2a,GAAamH,EAAQ9hB,EAAE+U,OAAOwL,UAC/C3Z,SAAuC,QAA7B5B,EAAA6uC,EAAaqC,wBAAgB,IAAAlxC,OAAA,EAAAA,EAAA5F,KAAAy0C,EAAG/xB,GAAQlb,aAIvD+sC,EAAQpmC,IAAI,SAACopC,GACZ,IAAMC,EAAYD,EAAOhhC,MAAQ3W,MAAM0Z,QAAQi+B,EAAOE,WAAaF,EAAOE,UAAUpsC,KAAK,KAAOksC,EAAOE,WACjGh2C,EAAQ2gB,EAASM,EAAQ60B,EAAOE,WAAa,IAC7CyF,EAAe3F,EAAO9lC,OAAS8lC,EAAO9lC,OAAOhQ,EAAOihB,EAAQ9E,GAASnc,EAE3E,OACEsE,EAEEC,KAAA,MAAA,CAAAS,MAAO,CACLsD,QAAS,OACTE,eAAgB,gBAChByqB,aAAc,MACd1e,cAAe,MACfynB,aAAc,qBAGhBt3B,SAAA,CAAAJ,OAAA,OAAA,CAAMU,MAAO,CAAE0D,WAAY,OAAQrE,MAAO,kBACf,mBAAjByxC,EAAOvW,MAAuBuW,EAAOvW,MAAM,CAAE,GAAIuW,EAAOvW,MAC3D,OACP56B,EAAAA,IAAM,OAAA,CAAAK,MAAO,CAAE+J,KAAM,EAAGmN,UAAW,SAASxX,SAAG+2C,MAZ1C1F,EAeX,KAzCKjhC,EA4CV,MAsGA4uB,GAAU/+B,EAAAA,IAAK,MAAA,CAAAK,MAAO,CAAEiK,UAAW,QAAWvK,SAAAg/B,EAAO+T,MACrDxE,IAAqC,iBAAfA,KAAgD,QAArBptC,EAAAotC,EAAW5qC,gBAAU,IAAAxC,OAAA,EAAAA,EAAA21C,WAAW,UAAkBV,KACpGn2C,EAACC,IAAA2b,EAAoB,CAAAta,QAASA,EAASua,UAAWwzB,SAMxD,IAAM0H,GAA4C,CAChDrzC,SAAU,WACV6pC,WAAYoB,aAAM,EAANA,EAAQ1M,IAAKmU,GAAmB,OAAS,UACrDp0B,WAAW2sB,eAAAA,EAAQ5yC,GAAI,OAAS,UAChCmE,MAAO,OAGP8J,UAAwB,KAAd2kC,eAAAA,EAAQ1M,GACd,OACqB,iBAAd0M,aAAA,EAAAA,EAAQ1M,GACf,GAAA1kC,OAAGoxC,EAAO1M,EAAK,WACf7yB,EACJ+H,UAAgC,iBAAdw3B,aAAA,EAAAA,EAAQ5yC,GAAiB,GAAAwB,OAAGoxC,EAAO5yC,EAAK,WAAGqT,EAE7D7K,aAAc,OAGhB,OACE5E,EAAAC,KAAA,MAAA/F,EAAA,CACEkU,IAAKuiC,GACLxuC,UAAW,aAAAvE,OAAauE,GACxBzB,MAAOu2C,GACI,cAAAt1C,QAAiB8N,GACxBlN,EAAI,CAAAnC,SAAA,CAEP66B,GAAS56B,EAAAA,IAAA,MAAA,CAAKK,MAAO,CAAEiuB,aAAc,QAAWvuB,SAAA66B,EAAMkY,MACtDxE,GAAoC,iBAAfA,IAA8C,UAAnBA,EAAW5qC,gBAAQ,IAAAvC,OAAA,EAAAA,EAAE01C,WAAW,SAAUV,KAC3Fn2C,EAAAC,IAAA,MAAA,CAAKI,MAAO02C,GACVh3C,SAAAC,EAAAC,IAAA,MAAA,CAAKI,MAAO,CACVH,MAAO,OACPmK,SAAUisC,GAAa,GAAG/4C,OAAA+4C,GAAc,MAAG,OAC3C3yC,QAAS,SAET5D,SAAAJ,EAAAC,KAAA,QAAA,CAAOS,MAAOo2C,GAAY30C,UAAWktC,EAClCjvC,SAAA,CAAAyzC,KACDxzC,wBAAQs1C,OACP5G,GACC1uC,EAAAC,IAAA,QAAA,CAAAF,SACEC,MACE,KAAA,CAAAD,SAAAC,EAAAC,IAAA,KAAA,CAAIo1C,QAASlH,EAAQ/zC,QAAUi0C,EAAe,EAAI,GAAKtuC,SAAA2uC,EAAQoE,iBAO1E/T,GAAU/+B,EAAAA,IAAK,MAAA,CAAAK,MAAO,CAAEiK,UAAW,QAAQvK,SAAGg/B,EAAO+T,MACrDxE,IAAqC,iBAAfA,aAA2BjtC,EAAAitC,EAAW5qC,+BAAUmzC,WAAW,UAAkBV,KACpGn2C,MAAC4b,EAAmB,CAACta,QAASA,EAASua,UAAWwzB,QAGxD,cNx/BgC,SAAC7vC,GAC/B,IAAAO,EAAQP,EAAAO,SACRL,EAAKF,EAAAE,MACLsB,EAAiBxB,EAAAokC,QAAjBA,OAAO,IAAA5iC,EAAG,QAAOA,EACjBE,SAAAzB,aAAO,KAAIyB,EACXC,EAAA3B,EAAAmB,OAAAA,OAAM,IAAAQ,GAAQA,EACJ61C,EAAYx3C,EAAAquC,SACtB9rC,SACAskC,cACAxpB,aACAxb,EAAA7B,EAAA0J,OAAAA,aAAS,OAAM7H,EACf41C,UACA7tC,EAAO5J,EAAA4J,QACP5H,aAAA01C,cAAgB11C,EACP21C,EAAW33C,EAAAub,QACpBq8B,oBACAn1C,iBACAN,EAAAnC,EAAAsC,UAAAA,OAAS,IAAAH,EAAG,GAAEA,EACdD,EAAOlC,EAAAkC,QACJQ,EAAI3H,EAAAiF,EAnBwB,gMAqBvB9B,EAAiBG,iBACnBgE,EAAwCO,EAAAA,UAAS,GAAhDqjB,EAAe5jB,EAAA,GAAE6jB,EAAkB7jB,EAAA,GAEpCw1C,EA7Gc,SAAC53C,GACrB,MAAa,UAATA,EAAyB,KAChB,UAATA,EAAyB,KACtBA,CACT,CAyGgB63C,CAAc73C,GACtBzF,EAAIqS,EAAKgrC,GAGTvxB,OAA4B1W,IAAhB+nC,EAA4BA,EAAc1xB,EAStDooB,EACJmJ,QAAAA,EACCj1C,GAAyB,YAAjBE,EAA6B,OAAS,OAG3Cs1C,EAA6B,SAAXruC,EAAoBA,OAASkG,EAG/Ci4B,EAAK6P,EAAkBl9C,EAAEwS,WACP,QAAbqhC,EAAwB7zC,EAAE0S,MACb,WAAbmhC,GAAsC,SAAbA,EAAsB7zC,EAAEyS,SACjDzS,EAAEsS,OAGPg7B,EAAyB,YAApBiQ,EAAgCv9C,EAAE4S,QACd,UAApB2qC,EAAgCv9C,EAAE6S,QAClC7S,EAAEsS,OAGP6tB,EAAsC,CAC1Cx2B,QAAS,cACTC,WAAY,SACZvE,IAAyB,YAApBk4C,EAAgCv9C,EAAEiT,QAAU,EACjDvI,YAAa2iC,EACb1iC,aAAc2iC,EACd33B,WAAY3V,EAAEuS,OACdqD,cAAe5V,EAAEuS,OACjBxN,OAAQ/E,EAAE+E,OACVwF,aAAc,EACdT,WAAY,sBACZC,WAAY,IACZ7E,SAAUlF,EAAEkF,SACZC,WAAYnF,EAAEmF,WACd+E,WAAY,WACZF,OAAQtC,EAAU,UAAY,UAC9BoO,UAAW,aACXxL,gBAAiB,UACjB5E,MAAO,UAEPuE,QAAS,oBACTuzC,cAAe,QAIjB,GAAI93C,EAAO,CACT,IAAM+3C,EAzNa,SAAC/3C,EAAiBhC,GACvC,GAAIgC,KAAS+L,EAAc,CACzB,IAAMka,EAASla,EAAa/L,GAC5B,MAAc,WAAVA,GAAsBhC,EACZ7D,EAAAA,EAAA,CAAA,EAAA8rB,GAAQ,CAAAvlB,KAAWvG,EAAAA,EAAA,CAAA,EAAA8rB,EAAOvlB,MAAM,CAAA6C,GAAIvF,MAE3CioB,CACR,CACD,GAAIjmB,EAAMm3C,WAAW,KAAM,CACzB,IAAMn2C,EAAIqZ,SAASra,EAAMpC,MAAM,EAAG,GAAI,IAChCjB,EAAI0d,SAASra,EAAMpC,MAAM,EAAG,GAAI,IAChClE,EAAI2gB,SAASra,EAAMpC,MAAM,EAAG,GAAI,IACtC,MAAO,CACLqO,MAAO,CAAE1I,GAAI,QAAA1F,OAAQmD,EAAK,KAAAnD,OAAAlB,EAAK,KAAAkB,OAAAnE,EAAQ,SAAEwS,KAAMlM,EAAOyD,OAAQ,QAAA5F,OAAQmD,EAAC,KAAAnD,OAAIlB,EAAC,KAAAkB,OAAInE,EAAC,UACjFgH,KAAO,CAAE6C,GAAIvD,EAAOkM,KAAM,WAE7B,CACD,OAAOH,EAAaS,IACtB,CAuMwBwrC,CAAeh4C,EAAOhC,GAC1B,UAAZkmC,GACFzJ,EAAe71B,gBAAkBmzC,EAAY9rC,MAAM1I,GACnDk3B,EAAez6B,MAAQ+3C,EAAY9rC,MAAMC,KACzCuuB,EAAel2B,QAAUtD,EAAS,aAAApD,OAhMhB,SAACmC,GACvB,IAAMqI,EAA8B,CAClC2D,MAAO,UAAWG,IAAK,UAAWC,OAAQ,UAC1CM,KAAM,UAAWD,OAAQ,UAAWJ,KAAM,UAC1CC,OAAQ,UAAWC,KAAM,UAAWC,KAAM,WAE5C,GAAIxM,KAASqI,EAAK,OAAOA,EAAIrI,GAC7B,GAAIA,EAAMm3C,WAAW,KAAM,CACzB,IAAMn2C,EAAIqZ,SAASra,EAAMpC,MAAM,EAAG,GAAI,IAChCjB,EAAI0d,SAASra,EAAMpC,MAAM,EAAG,GAAI,IAChClE,EAAI2gB,SAASra,EAAMpC,MAAM,EAAG,GAAI,IACtC,MAAO,eAAQoD,EAAC,KAAAnD,OAAIlB,EAAK,KAAAkB,OAAAnE,UAC1B,CACD,MAAO,SACT,CAkLqDu+C,CAAgBj4C,IAAW,OAC1Ey6B,EAAeqd,cAAgB72C,EAAS,YAASyO,IAEjD+qB,EAAe71B,gBAAkBmzC,EAAYr3C,KAAK6C,GAClDk3B,EAAez6B,MAAQ+3C,EAAYr3C,KAAKwL,KACxCuuB,EAAel2B,QAAU,OAE5B,CAEGvC,IACFy4B,EAAen2B,OAAS,WA4B1B,OACErE,EACEC,KAAA,MAAA/F,EAAA,CAAAiI,UAAWA,EACXzB,MAAO85B,EACPz4B,QAASA,GACLQ,EAGJ,CAAAnC,SAAA,CAAAJ,EAAAA,KAAA,MAAA,CAAKU,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUvE,IAAKrF,EAAEgT,WAAYzM,WAAY,GAAGR,SAAA,CAEpFm3C,GACCl3C,EAAAA,IACE,MAAA,CAAAwb,KAAK,WACS,eAAAsK,EACdpkB,QA7GmB,SAAClH,GAC5BA,EAAE+P,kBACF,IAAMhP,GAAQuqB,OACM1W,IAAhB+nC,GAA2BzxB,EAAmBnqB,GAClD67C,SAAAA,EAAkB77C,EACpB,EAyGU8E,MAAO,CACLH,MAAOlG,EAAE+S,aAAchO,OAAQ/E,EAAE+S,aACjCxI,aAAc,EAAGhE,WAAY,EAC7B4C,OAAQ2iB,EAAY,OAAS,oBAC7B7b,WAAY6b,EAAapoB,GAAgB,UAAa,UACtDiG,QAAS,OAAQC,WAAY,SAAUC,eAAgB,SACvDG,OAAQ,WACTjE,SAEA+lB,GACC9lB,aACEE,MAAOsG,KAAKw7B,MAAuB,IAAjBhoC,EAAE+S,cACpBhO,OAAQyH,KAAKw7B,MAAuB,IAAjBhoC,EAAE+S,cACrB5M,QAAQ,YAAYC,KAAK,OAEzBL,SAAAC,EAAAC,IAAA,OAAA,CAAM9G,EAAE,qBAAqBwH,OAAO,OAAOC,YAAY,MAAME,cAAc,QAAQ0P,eAAe,cArD7F,WAAbq9B,EACK7tC,EAACC,IAAAqN,EAAU,CAAAC,IAAK84B,EAAW5mC,KAAMzF,EAAE8S,aAE3B,QAAb+gC,EAEA7tC,aAAKE,MAAO,EAAGnB,OAAQ,EAAGoB,QAAQ,UAAUC,KAAK,OAAOC,MAAO,CAAEE,WAAY,GAAGR,SAC9EC,gBAAQQ,GAAI,EAAGC,GAAI,EAAGC,EAAG,IAAKN,KAAMyc,GAAY,mBAIrC,SAAbgxB,GAAuB9rC,EAEvB/B,EAAAA,YAAMK,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUrD,WAAY,GAAGR,SAClE+O,EAAMwpB,aAAav2B,EAAqD,CACvE7B,MAAOlG,EAAE8S,WACT/N,OAAQ/E,EAAE8S,eAKX,KA2CH9M,EAAMC,IAAA,OAAA,CAAAI,MAAO,CAAEgE,WAAY,mBAAatE,IAGnB,UAApBw3C,GAAgD,iBAAVN,GACrCj3C,EAAAC,IAAA,OAAA,CAAMI,MAAO,CACXsD,QAAS,OAAQC,WAAY,SAAUC,eAAgB,SACvDa,YAAa1K,EAAEkT,QAASvI,aAAc3K,EAAEkT,QACxCyC,WAAY,EAAGC,cAAe,EAC9B3F,WAAY,mBACZ1F,aAAc,EACdrF,SAAUlF,EAAEmT,cACZpJ,WAAY,IACZ5E,WAAY,OACZoB,WAAY,GACbR,SACEk3C,OAMc,YAApBM,GACCv3C,EACaC,IAAA,SAAA,CAAA,aAAA,SACXyB,QAAS,SAAClH,GAAQA,EAAE+P,kBAAmBnB,SAAAA,GAAY,EACnD/I,MAAO,CACLsD,QAAS,OAAQC,WAAY,SAAUC,eAAgB,SACvDY,QAASzK,EAAEqT,SAAU9I,aAAc,EACnCpB,OAAQ,OAAQ8G,WAAY,cAC5BjG,OAAQ,UAAWzD,WAAY,EAC/Bb,MAAO,UAAWmB,QAAS,IAC3B1B,WAAY,GACbY,SAEDC,EAAAA,WAAKE,MAAOlG,EAAEoT,UAAWrO,OAAQ/E,EAAEoT,UAAWjN,QAAQ,YAAYC,KAAK,OAAML,SAC3EC,EAAAA,YAAM7G,EAAE,4BAA4BwH,OAAO,eAAeC,YAAY,MAAME,cAAc,cAM9E,UAAjBmB,GAA4BF,IAASi1C,GACpCh3C,EAAAA,YAAMK,MAAO,CAAEsD,QAAS,OAAQC,WAAY,SAAUrD,WAAY,EAAGkW,WAAYzc,EAAEgT,YAChFjN,SAAAgC,OAKX,4CLzY2D,SAACvC,OAAEo4C,EAAKp4C,EAAAo4C,MAAE73C,EAAQP,EAAAO,SACrE83C,EAAankC,EAAAA,QAAQ,WACzB,OACK7Z,EAAAA,EAAA,CAAA,EAAA4D,GACAm6C,EAEP,EAAG,CAACA,IAEJ,OACE53C,EAAAC,IAACtC,EAAa23B,SAAQ,CAACj6B,MAAOw8C,EAAU93C,SACrCA,GAGP,gBIuUoC,SAACuG,GAGnC,OAAOtG,EAAAA,IAACyI,EAAS,CAAClC,GAAG,SAASD,MAAOA,GACvC,wBAqJsE,SAAC9G,GACrE,IAAAO,EAAQP,EAAAO,SAEFiB,EAAwBoB,EAAAA,UAAS,GAAhC49B,EAAOh/B,EAAA,GAAEi/B,EAAUj/B,EAAA,GAM1B,OAJA4G,EAAAA,UAAU,WACRq4B,GAAW,EACZ,EAAE,IAGDtgC,EAAAA,KACGE,EAAAA,SAAA,CAAAE,SAAA,CAAAA,EACAigC,GAAW9oB,EAAAA,aAAalX,EAAAA,IAAC0H,EAAc,CAAA,GAAKoD,SAASjP,QAG5D,kBiB9LwC,SAAC2D,GACvC,IAAAsc,EAAOtc,EAAAsc,QACP/b,EAAQP,EAAAO,SACRiB,EAAgBxB,EAAAkE,SAAhBA,OAAQ,IAAA1C,EAAG,MAAKA,EAChBE,EAAiB1B,EAAAs9B,QAAjBA,OAAU,IAAA57B,EAAA,QAAOA,EACjBC,UAAA22C,OAAQ,IAAA32C,EAAA,MACRE,EAAA7B,EAAA4B,SAAAA,cAAgBC,EAChBG,EAAAhC,EAAAsC,UAAAA,OAAS,IAAAN,EAAG,GAAEA,EACdG,EAAqBnC,EAAAu4C,iBAArBA,OAAgB,IAAAp2C,EAAG,GAAEA,EACrBE,EAAiBrC,EAAAH,IAAjBA,OAAM,IAAAwC,EAvSY,EAuSDA,EACjBG,cAAAg2C,OAAY,IAAAh2C,KACZ9B,EAAKV,EAAAU,MACLiC,mBAAA81C,OAAiB,IAAA91C,KACjBk7B,EAAO79B,EAAA69B,QACP6a,EAAe14C,EAAA04C,gBAGT/oC,OAA2BC,IAAZiuB,EACf96B,EAAwCH,EAAAA,SAAS61C,GAAhD9a,EAAe56B,EAAA,GAAE66B,EAAkB76B,EAAA,GACpCqG,EAAYuG,EAAekuB,EAAUF,EAGrChsB,EAAgC/O,EAAQA,SAAC+M,EAAgBkuB,SAAAA,EAAoB4a,GAA5EE,EAAWhnC,EAAA,GAAEinC,EAAcjnC,EAAA,GAE5BtI,EAAeiB,cAAY,SAACuuC,GAC3BlpC,GACHiuB,EAAmBib,GAErBH,SAAAA,EAAkBG,EACpB,EAAG,CAAClpC,EAAc+oC,IAGlBtwC,EAAAA,UAAU,WACJuH,IACEkuB,EAEF3oB,sBAAsB,WACpB0jC,GAAe,EACjB,GAGAA,GAAe,GAGrB,EAAG,CAACjpC,EAAckuB,IACZ,IAAA/rB,EAAsClP,EAAAA,SAA0BsB,GAA/D40C,EAAchnC,EAAA,GAAEinC,EAAiBjnC,EAAA,GAClCO,EAAwCzP,EAAAA,SAAiB,SAAxDo2C,EAAe3mC,EAAA,GAAE4mC,EAAkB5mC,EAAA,GACpCC,EAAkC1P,EAAAA,SAA8B,CACpEsB,SAAU,WACV0E,IAAK,EACLC,KAAM,EACNE,cAA2B,UAAZu0B,EAAsB,OAAS,SAJzC4b,EAAY5mC,EAAA,GAAE6mC,OAMf5mC,EAA8B3P,EAAAA,SAA8B,CAAE,GAA7Dg6B,EAAUrqB,EAAA,GAAE6mC,EAAa7mC,EAAA,GAE1ByrB,EAAa3uB,SAAuB,MACpCsoB,EAAatoB,SAAuB,MACpCgqC,EAAahqC,SAA8B,MAC3CiqC,EAAiBjqC,SAA8B,MAE/C+uB,EAAiB9zB,EAAAA,YAAY,WACjC,GAAK0zB,EAAWtuB,SAAYioB,EAAWjoB,SAAYtG,GAG9CuvC,EAAL,CAEA,IAAMrd,EAAc0C,EAAWtuB,QAAQ2E,wBACjCknB,EAAc5D,EAAWjoB,QAAQ2E,wBAGjCklC,EA/Kc,SACtBje,EACAC,EACAie,EACA35C,GAGA,QAHA,IAAAA,IAAAA,EAzLkB,IA4Lbm8B,GAAYV,EAAaC,EAAaie,EAAmB35C,GAC5D,OAAO25C,EA6BT,IAzBA,IAyBwB1lB,EAAA,EAAA2lB,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,GACjB1lB,WAAAA,IAAY,CAA/B,IAAM8lB,EAASH,EAAA3lB,GAClB,IAAKkI,GAAYV,EAAaC,EAAaqe,EAAW/5C,GACpD,OAAO+5C,CAEV,CAGD,OAAOJ,CACT,CAkI0BK,CAAgBve,EAAaC,EAAar3B,EAAUrE,GAC1Ek5C,EAAkBQ,GAEZ,IAAAv5C,EAAgBq7B,GAAkBC,EAAaC,EAAage,EAAe15C,GAAzE+I,QAAKC,SAab,GAZAswC,EAAgB,SAAC1jC,GAAS,OACrBpb,EAAAA,EAAA,GAAAob,GACH,CAAAvR,SAAU,WACV0E,IAAK,UAAGA,EAAG,MACXC,KAAM,GAAG9K,OAAA8K,EAAQ,MAGjBE,cAA2B,UAAZu0B,EAAsB,OAAS,OAC9Cx0B,OAAQ,MARgB,GAYtB0vC,EAAW,CACb,IAAMsB,EAlXa,SACvB51C,EACAo3B,EACAC,EACAe,EACAD,GAEA,IAAMrnB,EAAU3J,OAAO2J,SAAW3J,OAAOmwB,YACnCzmB,EAAU1J,OAAO0J,SAAW1J,OAAOowB,YAEnCC,EAAiBJ,EAAYzyB,MAAQyyB,EAAY56B,MAftC,GAe4D,EACvEi7B,EAAiBL,EAAY1yB,KAAO0yB,EAAY/7B,OAhBrC,GAgB4D,EAGvEw6C,EAAsBzd,EAActnB,EACpCglC,EAAqB3d,EAAatnB,EAExC,OAAQ7Q,GACN,IAAK,MACH,MAAO,CACLiF,QAzBW,EA0BXN,KAAM7B,KAAKwN,IAAIxN,KAAKyN,IAAIinB,EAAiBqe,EA1B9B,GA0BgExe,EAAY76B,MA1B5E,IA4Bf,IAAK,SACH,MAAO,CACLkI,KA9BW,EA+BXC,KAAM7B,KAAKwN,IAAIxN,KAAKyN,IAAIinB,EAAiBqe,EA/B9B,GA+BgExe,EAAY76B,MA/B5E,IAiCf,IAAK,OACH,MAAO,CACLwI,OAnCW,EAoCXN,IAAK5B,KAAKwN,IAAIxN,KAAKyN,IAAIknB,EAAiBqe,EApC7B,GAoC8Dze,EAAYh8B,OApC1E,IAsCf,IAAK,QACH,MAAO,CACLsJ,MAxCW,EAyCXD,IAAK5B,KAAKwN,IAAIxN,KAAKyN,IAAIknB,EAAiBqe,EAzC7B,GAyC8Dze,EAAYh8B,OAzC1E,IA2Cf,IAAK,WACH,MAAO,CACL4J,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,CAqTuB+wC,CACfV,EACAje,EACAC,EACA1yB,EACAD,GAEFwwC,EAAcU,EACf,CA/BwB,CAgC3B,EAAG,CAAC1wC,EAAWlF,EAAUrE,EAAK24C,EAAWG,EAAarb,IAEhD7F,GAAcntB,EAAAA,YAAY,WAC1B1I,IAGA03C,EAAe5pC,UACjBvF,aAAamvC,EAAe5pC,SAC5B4pC,EAAe5pC,QAAU,MAGvB2pC,EAAW3pC,SACbvF,aAAakvC,EAAW3pC,SAG1B2pC,EAAW3pC,QAAUxF,WAAW,WAC9Bb,GAAa,GAERsG,GAEHuF,sBAAsB,WACpB0jC,GAAe,EACjB,EAGH,EAAEN,GACJ,EAAE,CAAC12C,EAAU02C,EAAOjvC,EAAcsG,IAE7BuqC,GAAc5vC,EAAAA,YAAY,WAE1B+uC,EAAW3pC,UACbvF,aAAakvC,EAAW3pC,SACxB2pC,EAAW3pC,QAAU,MAInB4pC,EAAe5pC,SACjBvF,aAAamvC,EAAe5pC,SAGzBC,EASHtG,GAAa,IAPbuvC,GAAe,GACfU,EAAe5pC,QAAUxF,WAAW,WAClCb,GAAa,GACbiwC,EAAe5pC,QAAU,IAC1B,EAAE,KAKP,EAAG,CAACrG,EAAcsG,IAGZwqC,GAAqB7vC,EAAAA,YAAY,WACrB,UAAZgzB,IAGAgc,EAAe5pC,UACjBvF,aAAamvC,EAAe5pC,SAC5B4pC,EAAe5pC,QAAU,MAItBtG,IACHC,GAAa,GACb6L,sBAAsB,WACpB0jC,GAAe,EACjB,IAEJ,EAAG,CAACtb,EAASl0B,IAGPmB,GAAcD,cAAY,SAACtP,GAC3B4G,GAAwB,UAAZ07B,IAEhBtiC,EAAE+P,kBAGE3B,EACF8wC,MAGIb,EAAW3pC,UACbvF,aAAakvC,EAAW3pC,SACxB2pC,EAAW3pC,QAAU,MAEvBrG,GAAa,GACb6L,sBAAsB,WACpB0jC,GAAe,EACjB,IAEH,EAAE,CAACh3C,EAAU07B,EAASl0B,EAAW8wC,KAGlC9xC,EAAAA,UAAU,WACR,GAAIqwC,GAAkBrvC,GAAauvC,EAAa,CAE9C,IAAMyB,EAAoB,WACpBpc,EAAWtuB,SAAWioB,EAAWjoB,QACnC0uB,IAGAl0B,WAAW,WACTgL,sBAAsBklC,EACvB,EAAE,GAEP,EAGAlwC,WAAW,WACTgL,sBAAsBklC,EACvB,EAAE,EACJ,CACF,EAAE,CAAC3B,EAAgBrvC,EAAWuvC,EAAava,IAE5Ch2B,EAAAA,UAAU,WACR,GAAIgB,EAUF,OARA8L,sBAAsB,WACpBkpB,GACF,GAGA/yB,OAAO8J,iBAAiB,SAAUipB,GAAgB,GAClD/yB,OAAO8J,iBAAiB,SAAUipB,GAE3B,WACL/yB,OAAO+J,oBAAoB,SAAUgpB,GAAgB,GACrD/yB,OAAO+J,oBAAoB,SAAUgpB,EACvC,CAEJ,EAAG,CAACh1B,EAAWg1B,IAGfh2B,EAAAA,UAAU,WACR,GAAKgB,GAAyB,UAAZk0B,EAAlB,CAEA,IAAMjoB,EAAqB,SAACC,GAExB0oB,EAAWtuB,SACXioB,EAAWjoB,UACVsuB,EAAWtuB,QAAQ6F,SAASD,EAAMvF,UAClC4nB,EAAWjoB,QAAQ6F,SAASD,EAAMvF,SAEnCmqC,IAEJ,EAKA,OAFA5uC,SAAS6J,iBAAiB,YAAaE,GAAoB,GAEpD,WACL/J,SAAS8J,oBAAoB,YAAaC,GAAoB,EAChE,CAlB8C,CAmB/C,EAAE,CAACjM,EAAWk0B,EAAS4c,KAExB9xC,EAAAA,UAAU,WACR,OAAO,WACDixC,EAAW3pC,SACbvF,aAAakvC,EAAW3pC,SAEtB4pC,EAAe5pC,SACjBvF,aAAamvC,EAAe5pC,QAEhC,CACD,EAAE,IAGH,IAAM2qC,GAA6C,CACjDn2C,SAAU,WACV0E,IAAK,EACLC,KAAM,EACNxH,QAASs3C,EAAc,EAAI,EAC3BjuC,UAAWiuC,EAAc,WAAa,cACtCj0C,WAAY,mDAEZqE,cAA2B,UAAZu0B,EAAsB,OAAS,OAC9Cx0B,OAAQ,MAIJwxC,GAA2BhwC,EAAAA,YAAY,WAC3C,MAAsB,oBAAXe,QACWA,OAAOywB,YAGL,IAJkB,QAIF,oBACzC,EAAE,IAGH1zB,EAAAA,UAAU,WACR,IAAMmyC,EAAiB,WACrBtB,EAAmBqB,KACrB,EAKA,OAHAC,IACAlvC,OAAO8J,iBAAiB,SAAUolC,GAE3B,WACLlvC,OAAO+J,oBAAoB,SAAUmlC,EACvC,CACF,EAAG,CAACD,KAGJ,IAAME,GACJngD,EAAAA,EAAA,CAAAyK,gBAAiB,UACjB5E,MAAO,UACP+E,QAAS,WACTF,aAAc,MACdrF,SAAU,OACV6E,WAAY,IACZD,WAAY,sBACZ3E,WAAY,aAEEiQ,IAAVlP,EACA,CACEA,MAAwB,iBAAVA,EAAqB,GAAA3C,OAAG2C,EAAK,MAAOA,EAElD8J,SAA4B,oBAAXa,QAA0BA,OAAOywB,WAAa,IAC3D,0BACAlsB,GAEN,CACEpF,SAAUwuC,EACVt4C,MAAO,gBACP,CACN+5C,SAAU,aACV72C,UAAW,wEACXiB,WAAY,WACZX,SAAU,WACVoM,UAAW,eAGPoqC,GACJv6C,EAAAA,KAAA,MAAA,CACEU,MAAOxG,EAAAA,EAAAA,EAAA,CAAA,EACFggD,IACAnB,GAAY,CAEfnwC,cAA2B,UAAZu0B,EAAsB,OAAS,SAEhDh7B,UAAW,8BAAuBi2C,GAClC5yC,aAA0B,UAAZ23B,EAAsB6c,QAAqBvqC,EACzDhK,aAA0B,UAAZ03B,EAAsB4c,QAActqC,YAElDpP,EACEC,IAAA,MAAA,CAAA8N,IAAKopB,EACLr1B,UAAW,sBAAei2C,GAC1B13C,MAAO25C,GACPx+B,KAAK,UAEJzb,SAAA+b,IAEFk8B,GAAa7b,GAAYmc,EAAgBlc,MAKxC+d,GAA0BrwC,EAAAA,YAAY,WAC1B,UAAZgzB,IAIJgc,EAAe5pC,QAAUxF,WAAW,WAClCgwC,IACD,EAAE,KACL,EAAG,CAAC5c,EAAS4c,KAGPU,GAA2B,UAAZtd,EACjB,CACEp7B,QAASqI,IAEX,CACE5E,aAAc8xB,GACd7xB,aAAc+0C,GACd3rC,QAASyoB,GACTxoB,OAAQirC,IAGd,OACE/5C,EACEC,KAAAC,EAAAC,SAAA,CAAAC,SAAA,CAAAC,EAAAA,IAAA,MAAAnG,EAAA,CACEkU,IAAKyvB,EACL17B,UAAW,uBAAuBvE,OAAAuE,GAClCzB,MAAO,CAAEsD,QAAS,eAAgBK,OAAoB,UAAZ84B,EAAsB,UAAY,YACxEsd,GAAY,CAAAr6C,SAEfA,KAEF6I,GAAiC,oBAAbkC,UAA4BoM,eAAagjC,GAAgBpvC,SAASjP,QAG7F,yBjBnV8B,WAC5B4L,EAAaD,UACf,qBAP0B,SAACjB,GACzBkB,EAAaV,YAAYR,EAC3B,qBAQ0B,WACxBK,QAAQC,IAAI,sBACZD,QAAQC,IAAI,QAA2B,oBAAXgE,OAAyB,MAAQ,OAC7DjE,QAAQC,IAAI,eAAoC,oBAAbiE,UACnClE,QAAQC,IAAI,QAASiE,SAASE,eAAe,wBAC7CpE,QAAQC,IAAI,eAAgBY,EAAaR,aACzCL,QAAQC,IAAI,SAAU8D,GACtB/D,QAAQC,IAAI,WAAY+D,GACxBhE,QAAQC,IAAI,uBACd,qCAW0B,SAACmC,EAAiB2H,GAE1C,OADAlG,IACOzD,EAAWnN,EAAAA,EAAA,CAAA,EAAA8W,GAAS,CAAA3H,QAAOA,EAAE/H,KAAM,UAC5C,oBAEyB,SAAC+H,EAAiB2H,GAEzC,OADAlG,IACOzD,EAAWnN,EAAAA,EAAA,CAAA,EAAA8W,GAAS,CAAA3H,QAAOA,EAAE/H,KAAM,SAC5C,wBAE6B,SAC3B+H,EACA2H,GAGA,OADAlG,IACOzD,EAAWnN,EAAAA,EAAA,CAAA,EAAA8W,GAAS,CAAA3H,QAAOA,EAAE/H,KAAM,aAC5C,uBAxB4B,SAC1B+H,EACA2H,GAGA,OADAlG,IACOzD,EAAWnN,EAAAA,EAAA,CAAA,EAAA8W,GAAS,CAAA3H,QAAOA,EAAE/H,KAAM,YAC5C","x_google_ignoreList":[0]}