aha-components 1.8.3 → 1.8.5

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 (85) hide show
  1. package/dist/Avatar.esm.js +1 -1
  2. package/dist/Avatar.esm.js.map +1 -1
  3. package/dist/Avatar.js +1 -1
  4. package/dist/Avatar.js.map +1 -1
  5. package/dist/Badge.esm.js +1 -1
  6. package/dist/Badge.esm.js.map +1 -1
  7. package/dist/Badge.js +1 -1
  8. package/dist/Badge.js.map +1 -1
  9. package/dist/Button.esm.js +1 -1
  10. package/dist/Button.esm.js.map +1 -1
  11. package/dist/Button.js +1 -1
  12. package/dist/Button.js.map +1 -1
  13. package/dist/Checkbox.esm.js +1 -1
  14. package/dist/Checkbox.esm.js.map +1 -1
  15. package/dist/Checkbox.js +1 -1
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/DatePicker.esm.js.map +1 -1
  18. package/dist/DatePicker.js.map +1 -1
  19. package/dist/Drawer.esm.js.map +1 -1
  20. package/dist/Drawer.js.map +1 -1
  21. package/dist/Form.esm.js.map +1 -1
  22. package/dist/Form.js.map +1 -1
  23. package/dist/Input.esm.js +1 -1
  24. package/dist/Input.esm.js.map +1 -1
  25. package/dist/Input.js +1 -1
  26. package/dist/Input.js.map +1 -1
  27. package/dist/Loading.esm.js +1 -1
  28. package/dist/Loading.esm.js.map +1 -1
  29. package/dist/Loading.js +1 -1
  30. package/dist/Loading.js.map +1 -1
  31. package/dist/MenuList.esm.js.map +1 -1
  32. package/dist/MenuList.js.map +1 -1
  33. package/dist/Pagination.esm.js +1 -1
  34. package/dist/Pagination.esm.js.map +1 -1
  35. package/dist/Pagination.js +1 -1
  36. package/dist/Pagination.js.map +1 -1
  37. package/dist/Popover.esm.js +1 -1
  38. package/dist/Popover.esm.js.map +1 -1
  39. package/dist/Popover.js +1 -1
  40. package/dist/Popover.js.map +1 -1
  41. package/dist/Progress.esm.js.map +1 -1
  42. package/dist/Progress.js.map +1 -1
  43. package/dist/Radio.esm.js +1 -1
  44. package/dist/Radio.esm.js.map +1 -1
  45. package/dist/Radio.js +1 -1
  46. package/dist/Radio.js.map +1 -1
  47. package/dist/Select.esm.js.map +1 -1
  48. package/dist/Select.js.map +1 -1
  49. package/dist/Switch.esm.js.map +1 -1
  50. package/dist/Switch.js.map +1 -1
  51. package/dist/Tab.esm.js.map +1 -1
  52. package/dist/Tab.js.map +1 -1
  53. package/dist/Table.esm.js +1 -1
  54. package/dist/Table.esm.js.map +1 -1
  55. package/dist/Table.js +1 -1
  56. package/dist/Table.js.map +1 -1
  57. package/dist/Tag.esm.js.map +1 -1
  58. package/dist/Tag.js.map +1 -1
  59. package/dist/Textarea.esm.js +1 -1
  60. package/dist/Textarea.esm.js.map +1 -1
  61. package/dist/Textarea.js +1 -1
  62. package/dist/Textarea.js.map +1 -1
  63. package/dist/Toast.esm.js.map +1 -1
  64. package/dist/Toast.js.map +1 -1
  65. package/dist/Tooltip.esm.js.map +1 -1
  66. package/dist/Tooltip.js.map +1 -1
  67. package/dist/components/Alert/icon.d.ts +5 -5
  68. package/dist/components/Badge/index.d.ts +2 -1
  69. package/dist/components/Button/index.d.ts +2 -2
  70. package/dist/components/Table/index.d.ts +1 -1
  71. package/dist/components/Toast/icon.d.ts +5 -5
  72. package/dist/components/shared/badgeColors.d.ts +25 -0
  73. package/dist/components/shared/buttonStyles.d.ts +18 -0
  74. package/dist/components/shared/colorUtils.d.ts +6 -0
  75. package/dist/components/shared/controlStyles.d.ts +27 -0
  76. package/dist/components/shared/fieldStyles.d.ts +37 -0
  77. package/dist/index.css +3848 -0
  78. package/dist/index.d.ts +29 -5
  79. package/dist/index.esm.css +3848 -0
  80. package/dist/index.esm.js +1 -1
  81. package/dist/index.esm.js.map +1 -1
  82. package/dist/index.js +1 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/tokens.d.ts +14 -14
  85. 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/InputGroup.tsx","../src/components/Input/InputTags.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","../src/components/Textarea/TextareaTags.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, useState } from 'react';\nimport { InputProps } from './index';\n\nexport interface InputGroupProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n error?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Text addon on the left (e.g. \"https://\") — auto-styled with correct padding */\n leadingText?: React.ReactNode;\n /** Text addon on the right (e.g. \"USD\") — auto-styled with correct padding */\n trailingText?: React.ReactNode;\n /** Raw ReactNode on the left (dropdown, icon button, etc.) — no padding added */\n leadingAddon?: React.ReactNode;\n /** Raw ReactNode on the right (button, select, etc.) — no padding added */\n trailingAddon?: React.ReactNode;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst sizeMap: Record<NonNullable<InputGroupProps['size']>, { pt: string; pb: string }> = {\n small: { pt: '5px', pb: '5px' },\n mediumSmall: { pt: '7px', pb: '7px' },\n medium: { pt: '9px', pb: '9px' },\n large: { pt: '11px', pb: '11px' },\n};\n\nconst InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(({\n size = 'mediumSmall',\n error = false,\n disabled = false,\n readOnly = false,\n prefix,\n suffix,\n leadingText,\n trailingText,\n leadingAddon,\n trailingAddon,\n className = '',\n style,\n onFocus,\n onBlur,\n onKeyDown,\n onPressEnter,\n value,\n defaultValue,\n onChange,\n placeholder,\n type = 'text',\n label,\n required,\n hintText,\n ...restProps\n}, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n\n useEffect(() => {\n if (typeof ref === 'function') ref(inputRef.current);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\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) onPressEnter(e);\n onKeyDown?.(e);\n };\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const { pt, pb } = sizeMap[size];\n const dividerColor = disabled ? 'var(--color-border-disabled)' : 'var(--color-border-primary)';\n const iconColor = disabled ? 'var(--color-fg-disabled)' : 'var(--color-fg-quaternary)';\n const hasPrefixIcon = !!prefix;\n const hasSuffixIcon = !!suffix;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n pointerEvents: 'none',\n };\n\n const addonTextStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: '14px',\n paddingRight: '12px',\n color: 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n lineHeight: 'var(--line-height-text-md)',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n backgroundColor: disabled ? 'var(--color-bg-disabled_subtle)' : 'transparent',\n };\n\n const groupEl = (\n <div\n className={`aha-input-group ${className}`}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n width: '100%',\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: 'var(--radius-md)',\n backgroundColor: disabled || readOnly ? 'var(--color-bg-disabled_subtle)' : 'var(--color-bg-primary)',\n overflow: 'hidden',\n boxSizing: 'border-box',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n ...style,\n }}\n >\n {/* Leading text addon (auto-padded) */}\n {leadingText !== undefined && (\n <div style={{ ...addonTextStyle, borderRight: `1px solid ${dividerColor}` }}>\n {leadingText}\n </div>\n )}\n {/* Leading raw addon (no auto-padding) */}\n {leadingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderRight: `1px solid ${dividerColor}` }}>\n {leadingAddon}\n </div>\n )}\n\n {/* Input area */}\n <div style={{ flex: 1, position: 'relative', display: 'flex', alignItems: 'stretch', minWidth: 0 }}>\n {hasPrefixIcon && (\n <span style={{ ...iconSlotStyle, left: '14px' }}>{prefix}</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={{\n flex: 1,\n border: 'none',\n outline: 'none',\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n backgroundColor: 'transparent',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: hasPrefixIcon ? '40px' : '14px',\n paddingRight: hasSuffixIcon ? '40px' : '14px',\n }}\n autoComplete={restProps.autoComplete || 'off'}\n {...restProps}\n />\n {hasSuffixIcon && (\n <span style={{ ...iconSlotStyle, right: '14px' }}>{suffix}</span>\n )}\n </div>\n\n {/* Trailing text addon (auto-padded) */}\n {trailingText !== undefined && (\n <div style={{ ...addonTextStyle, paddingLeft: '12px', paddingRight: '14px', borderLeft: `1px solid ${dividerColor}` }}>\n {trailingText}\n </div>\n )}\n {/* Trailing raw addon (no auto-padding) */}\n {trailingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderLeft: `1px solid ${dividerColor}` }}>\n {trailingAddon}\n </div>\n )}\n </div>\n );\n\n if (!label && !hintText) return groupEl;\n\n const labelStyle: React.CSSProperties = {\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n };\n\n const hintStyle: React.CSSProperties = {\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={labelStyle}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {groupEl}\n {hintText && <p style={hintStyle}>{hintText}</p>}\n </div>\n );\n});\n\nInputGroup.displayName = 'InputGroup';\n\nexport default InputGroup;\n","import React, { useState, useRef, KeyboardEvent } from 'react';\nimport Tag from '../Tag';\n\nexport interface InputTagsProps {\n value?: string[];\n defaultValue?: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst containerPadding = {\n small: '4px',\n mediumSmall: '6px',\n medium: '8px',\n large: '10px',\n};\n\nconst tagSizeMap = {\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'lg',\n} as const;\n\nconst InputTags: React.FC<InputTagsProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag...',\n disabled = false,\n error = false,\n size = 'mediumSmall',\n className = '',\n style,\n label,\n required,\n hintText,\n}) => {\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n const tags = isControlled ? value! : internalTags;\n\n const updateTags = (next: string[]) => {\n if (!isControlled) setInternalTags(next);\n onChange?.(next);\n };\n\n const addTag = (tag: string) => {\n const trimmed = tag.trim();\n if (!trimmed || tags.includes(trimmed)) return;\n updateTags([...tags, trimmed]);\n setInputValue('');\n };\n\n const removeTag = (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if ((e.key === 'Enter' || e.key === ',') && inputValue) {\n e.preventDefault();\n addTag(inputValue);\n }\n if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n };\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const p = containerPadding[size];\n const tagSize = tagSizeMap[size];\n\n const labelStyle: React.CSSProperties = {\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n };\n\n const tagsEl = (\n <div\n className={`aha-input-tags ${className}`}\n onClick={() => inputRef.current?.focus()}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n padding: p,\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: 'var(--radius-md)',\n backgroundColor: disabled ? 'var(--color-bg-disabled_subtle)' : 'var(--color-bg-primary)',\n boxSizing: 'border-box',\n width: '100%',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n cursor: disabled ? 'not-allowed' : 'text',\n ...style,\n }}\n >\n {tags.map((tag, i) => (\n <Tag\n key={i}\n size={tagSize}\n action={disabled ? 'none' : 'x-close'}\n onClose={() => removeTag(i)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => { setFocused(false); if (inputValue) addTag(inputValue); }}\n disabled={disabled}\n placeholder={tags.length === 0 ? placeholder : ''}\n style={{\n flex: 1,\n minWidth: '80px',\n border: 'none',\n outline: 'none',\n padding: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n lineHeight: 'var(--line-height-text-md)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n backgroundColor: 'transparent',\n }}\n />\n <style>{`\n .aha-input-tags input::placeholder { color: var(--color-text-placeholder); }\n `}</style>\n </div>\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={labelStyle}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {tagsEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n};\n\nexport default InputTags;\n","import React, { forwardRef, useRef, useEffect } from 'react';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n className?: string;\n style?: React.CSSProperties;\n type?: string;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\n// sm=36px, mediumSmall=40px, md=44px (matches Figma md), lg=48px\n// With box-sizing:border-box: height = 1px border × 2 + paddingTop + 24px lineHeight + paddingBottom\nconst sizeStyles: Record<NonNullable<InputProps['size']>, React.CSSProperties> = {\n small: { height: '36px', paddingTop: '5px', paddingBottom: '5px' },\n mediumSmall: { height: '40px', paddingTop: '7px', paddingBottom: '7px' },\n medium: { height: '44px', paddingTop: '9px', paddingBottom: '9px' },\n large: { height: '48px', paddingTop: '11px', paddingBottom: '11px' },\n};\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void }> = ({ onClick }) => (\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={onClick}\n style={{ cursor: 'pointer', flexShrink: 0 }}\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\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'mediumSmall',\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 label,\n required,\n hintText,\n ...restProps\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(defaultValue || value || '');\n const [focused, setFocused] = React.useState(false);\n\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\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) onPressEnter(e);\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) setInternalValue('');\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 const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return {\n border: '1px solid var(--color-border-disabled)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n if (error && focused) return {\n border: '1px solid var(--color-border-error)',\n boxShadow: SHADOW_XS,\n outline: '2px solid var(--color-border-error)',\n outlineOffset: '-2px',\n };\n if (error) return {\n border: '1px solid var(--color-border-error_subtle)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n if (focused) return {\n border: '1px solid var(--color-border-brand)',\n boxShadow: SHADOW_XS,\n outline: '2px solid var(--color-border-brand)',\n outlineOffset: '-2px',\n };\n return {\n border: '1px solid var(--color-border-primary)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const { height, paddingTop, paddingBottom } = sizeStyles[size];\n\n const hasRightContent = suffix || showClear;\n const paddingLeft = prefix ? '40px' : '14px';\n const paddingRight = hasRightContent ? '40px' : '14px';\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n height,\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n borderRadius: 'var(--radius-md)',\n border,\n boxShadow,\n backgroundColor:\n disabled || readOnly\n ? 'var(--color-bg-disabled_subtle)'\n : 'var(--color-bg-primary)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n outline,\n outlineOffset,\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n appearance: 'none',\n ...style,\n };\n\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: var(--color-text-placeholder);\n font-size: var(--font-size-text-md);\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input::-moz-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input:-ms-input-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\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\"] { -moz-appearance: textfield; }\n `;\n\n const iconColor = disabled\n ? 'var(--color-fg-disabled)'\n : 'var(--color-fg-quaternary)';\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n };\n\n const inputEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{ position: 'relative', display: 'block', width: '100%' }}\n >\n {prefix && (\n <span style={{ ...iconSlotStyle, left: '14px', pointerEvents: 'none' }}>\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 style={{ ...iconSlotStyle, right: '14px', gap: 'var(--spacing-xs)' }}>\n {showClear && <ClearIcon onClick={handleClear} />}\n {suffix}\n </span>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return inputEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n }}>\n {label}\n {required && (\n <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>\n )}\n </label>\n )}\n {inputEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nexport { default as InputGroup } from './InputGroup';\nexport type { InputGroupProps } from './InputGroup';\nexport { default as InputTags } from './InputTags';\nexport type { InputTagsProps } from './InputTags';\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';\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 disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n showCount?: boolean;\n maxLength?: number;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n rows?: number;\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n linkify?: boolean;\n linkifyOptions?: LinkifyOptions;\n label?: string;\n required?: boolean;\n hintText?: string;\n helpIcon?: React.ReactNode;\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 label,\n required,\n hintText,\n helpIcon,\n ...restProps\n },\n ref\n ) => {\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 SHADOW_XS = 'var(--shadow-xs)';\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n borderRadius: 'var(--radius-md)',\n ...getFocusStyles(),\n backgroundColor:\n disabled || readOnly\n ? 'var(--color-bg-disabled_subtle)'\n : 'var(--color-bg-primary)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n padding: '12px 14px',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n resize: autoSize || linkify ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none',\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: var(--color-text-placeholder);\n font-size: var(--font-size-text-md);\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder { color: var(--color-text-placeholder); }\n .aha-textarea-wrapper textarea::-moz-placeholder { color: var(--color-text-placeholder); }\n .aha-textarea-wrapper textarea:-ms-input-placeholder { color: var(--color-text-placeholder); }\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: var(--color-text-placeholder);\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\n }\n `;\n\n const textareaEl = (\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: 'var(--font-size-text-xs)',\n lineHeight: 'var(--line-height-text-xs)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\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 if (!label && !hintText) return textareaEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n }}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: 'var(--color-fg-quaternary)' }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {textareaEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\nexport { default as TextareaTags } from './TextareaTags';\nexport type { TextareaTagsProps } from './TextareaTags';\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 if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && action}\n </div>\n {action && !closeable && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n </div>\n )}\n {closeable && (\n <div\n className=\"flex-shrink-0 self-start mt-1 cursor-pointer\"\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};\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","import React from 'react';\nimport InputTags, { InputTagsProps } from '../Input/InputTags';\n\nexport interface TextareaTagsProps extends Omit<InputTagsProps, 'size'> {\n minHeight?: number;\n helpIcon?: React.ReactNode;\n}\n\nconst TextareaTags: React.FC<TextareaTagsProps> = ({\n minHeight = 120,\n style,\n label,\n required,\n hintText,\n helpIcon,\n error,\n ...props\n}) => {\n const tagsEl = (\n <InputTags\n error={error}\n style={{\n minHeight: `${minHeight}px`,\n alignItems: 'flex-start',\n overflow: 'auto',\n resize: 'vertical',\n ...style,\n }}\n {...props}\n />\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n display: 'flex',\n alignItems: 'center',\n }}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: 'var(--color-fg-quaternary)' }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {tagsEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n};\n\nexport default TextareaTags;\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","Tag","variant","iconTypeProp","iconType","avatarSrc","dotColor","count","checkbox","checkedProp","checked","onCheckedChange","internalChecked","setInternalChecked","nSize","normalizeSize","isChecked","undefined","effectiveAction","pl","pr","containerStyle","paddingTop","paddingBottom","boxSizing","outlineOffset","colorConfig","config","startsWith","parseInt","getColorConfig","getOutlineColor","role","round","strokeLinejoin","React","cloneElement","marginLeft","SHADOW_XS","sizeMap","pt","pb","InputGroup","forwardRef","ref","readOnly","prefix","suffix","leadingText","trailingText","leadingAddon","trailingAddon","onFocus","onBlur","onKeyDown","onPressEnter","defaultValue","onChange","placeholder","required","hintText","restProps","inputRef","useRef","setFocused","internalValue","setInternalValue","current","isControlled","currentValue","dividerColor","hasPrefixIcon","hasSuffixIcon","iconSlotStyle","addonTextStyle","groupEl","borderRight","target","key","autoComplete","borderLeft","hintStyle","margin","containerPadding","tagSizeMap","InputTags","internalTags","setInternalTags","inputValue","setInputValue","tags","updateTags","addTag","tag","trimmed","trim","includes","removeTag","index","tagSize","tagsEl","focus","flexWrap","sizeStyles","ClearIcon","Input","allowClear","onClear","showClear","_m","baseStyles","WebkitAppearance","MozAppearance","appearance","inputEl","autoCorrect","autoCapitalize","spellCheck","Select","controlledValue","options","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","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","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","handleClear","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","minHeight","val","createPortal","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","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","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","Checkbox","indeterminate","hint","isFocusedProp","hovered","setHovered","showFocus","boxSize","hasLabel","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","dotSize","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","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","helpIcon","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","textareaEl","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","thumbSize","thumbOffset","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","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","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","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","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","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","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","PI","petals","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","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","supportingText","avatarInitials","Icon","buttonLabel","onButtonClick","plMap","prMap","btnBorderRadius","dotPaddingLeft","dotPaddingRight","IconLeading","iconLeading","IconTrailing","iconTrailing","hasLeading","padMap","imgSrc","imgAlt","imgSize","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","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","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","displayValue","scrollContainerStyle","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/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@3.30.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/tokens.ts","../src/components/shared/colorUtils.ts","../src/components/shared/buttonStyles.ts","../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/shared/fieldStyles.ts","../src/components/Input/InputGroup.tsx","../src/components/Input/InputTags.tsx","../src/components/Input/index.tsx","../src/components/Select/index.tsx","../src/icons/index.tsx","../src/components/Pagination/index.tsx","../src/components/shared/controlStyles.ts","../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/shared/badgeColors.ts","../src/components/Badge/index.tsx","../src/components/Avatar/index.tsx","../src/components/Alert/index.tsx","../src/components/Progress/index.tsx","../src/components/Textarea/TextareaTags.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","/**\n * Aha Components — Design Tokens (TypeScript)\n * Source: Untitled UI (Tokens Studio export), brand: Orange (#fb6011)\n * Synced with tokens.json / theme.css\n */\n\n// ─────────────────────────────────────────\n// Primitives: Base\n// ─────────────────────────────────────────\nexport const colorBase = {\n white: '#ffffff',\n black: '#000000',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Brand (Orange)\n// ─────────────────────────────────────────\nexport const colorBrandScale = {\n 25: '#fff9f2',\n 50: '#fff6ed',\n 100: '#ffead5',\n 200: '#ffd1a9',\n 300: '#feb073',\n 400: '#fd843a',\n 500: '#fb6011',\n 600: '#ec470a',\n 700: '#c4330a',\n 800: '#9b2911',\n 900: '#7d2511',\n 950: '#441006',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Error\n// ─────────────────────────────────────────\nexport const colorErrorScale = {\n 25: '#fffbfa',\n 50: '#fef3f2',\n 100: '#fee4e2',\n 200: '#fecdca',\n 300: '#fda29b',\n 400: '#f97066',\n 500: '#f04438',\n 600: '#d92d20',\n 700: '#b42318',\n 800: '#912018',\n 900: '#7a271a',\n 950: '#55160c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Warning\n// ─────────────────────────────────────────\nexport const colorWarningScale = {\n 25: '#fffcf5',\n 50: '#fffaeb',\n 100: '#fef0c7',\n 200: '#fedf89',\n 300: '#fec84b',\n 400: '#fdb022',\n 500: '#f79009',\n 600: '#dc6803',\n 700: '#b54708',\n 800: '#93370d',\n 900: '#7a2e0e',\n 950: '#4e1d09',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Success\n// ─────────────────────────────────────────\nexport const colorSuccessScale = {\n 25: '#f6fef9',\n 50: '#ecfdf3',\n 100: '#dcfae6',\n 200: '#abefc6',\n 300: '#75e0a7',\n 400: '#47cd89',\n 500: '#17b26a',\n 600: '#079455',\n 700: '#067647',\n 800: '#085d3a',\n 900: '#074d31',\n 950: '#053321',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Gray (warm gray — neutral scale)\n// ─────────────────────────────────────────\nexport const colorGray = {\n 25: '#fdfdfc',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d7d3d0',\n 400: '#a9a29d',\n 500: '#79716b',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#171412',\n} as const;\n\n// Backward-compat alias (components use colorNeutral[200] etc.)\nexport const colorNeutral = colorGray;\n\n// ─────────────────────────────────────────\n// Primitives: Gray Blue\n// ─────────────────────────────────────────\nexport const colorGrayBlue = {\n 25: '#fcfcfd',\n 50: '#f8f9fc',\n 100: '#eaecf5',\n 200: '#d5d9eb',\n 300: '#b3b8db',\n 400: '#717bbc',\n 500: '#4e5ba6',\n 600: '#3e4784',\n 700: '#363f72',\n 800: '#293056',\n 900: '#101323',\n 950: '#0d0f1c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Moss\n// ─────────────────────────────────────────\nexport const colorMoss = {\n 25: '#fafdf7',\n 50: '#f5fbee',\n 100: '#e6f4d7',\n 200: '#ceeab0',\n 300: '#acdc79',\n 400: '#86cb3c',\n 500: '#669f2a',\n 600: '#4f7a21',\n 700: '#3f621a',\n 800: '#335015',\n 900: '#2b4212',\n 950: '#1a280b',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Green Light\n// ─────────────────────────────────────────\nexport const colorGreenLight = {\n 25: '#fafef5',\n 50: '#f3fee7',\n 100: '#e3fbcc',\n 200: '#d0f8ab',\n 300: '#a6ef67',\n 400: '#85e13a',\n 500: '#66c61c',\n 600: '#4ca30d',\n 700: '#3b7c0f',\n 800: '#326212',\n 900: '#2b5314',\n 950: '#15290a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Green\n// ─────────────────────────────────────────\nexport const colorGreen = {\n 25: '#f6fef9',\n 50: '#edfcf2',\n 100: '#d3f8df',\n 200: '#aaf0c4',\n 300: '#73e2a3',\n 400: '#3ccb7f',\n 500: '#16b364',\n 600: '#099250',\n 700: '#087443',\n 800: '#095c37',\n 900: '#084c2e',\n 950: '#052e1c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Teal\n// ─────────────────────────────────────────\nexport const colorTeal = {\n 25: '#f6fefc',\n 50: '#f0fdf9',\n 100: '#ccfbef',\n 200: '#99f6e0',\n 300: '#5fe9d0',\n 400: '#2ed3b7',\n 500: '#15b79e',\n 600: '#0e9384',\n 700: '#107569',\n 800: '#125d56',\n 900: '#134e48',\n 950: '#0a2926',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Cyan\n// ─────────────────────────────────────────\nexport const colorCyan = {\n 25: '#f5feff',\n 50: '#ecfdff',\n 100: '#cff9fe',\n 200: '#a5f0fc',\n 300: '#67e3f9',\n 400: '#22ccee',\n 500: '#06aed4',\n 600: '#088ab2',\n 700: '#0e7090',\n 800: '#155b75',\n 900: '#164c63',\n 950: '#0d2d3a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue Light\n// ─────────────────────────────────────────\nexport const colorBlueLight = {\n 25: '#f5fbff',\n 50: '#f0f9ff',\n 100: '#e0f2fe',\n 200: '#b9e6fe',\n 300: '#7cd4fd',\n 400: '#36bffa',\n 500: '#0ba5ec',\n 600: '#0086c9',\n 700: '#026aa2',\n 800: '#065986',\n 900: '#0b4a6f',\n 950: '#062c41',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue\n// ─────────────────────────────────────────\nexport const colorBlue = {\n 25: '#f5faff',\n 50: '#eff8ff',\n 100: '#d1e9ff',\n 200: '#b2ddff',\n 300: '#84caff',\n 400: '#53b1fd',\n 500: '#2e90fa',\n 600: '#1570ef',\n 700: '#175cd3',\n 800: '#1849a9',\n 900: '#194185',\n 950: '#102a56',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue Dark\n// ─────────────────────────────────────────\nexport const colorBlueDark = {\n 25: '#f5f8ff',\n 50: '#eff4ff',\n 100: '#d1e0ff',\n 200: '#b2ccff',\n 300: '#84adff',\n 400: '#528bff',\n 500: '#2970ff',\n 600: '#155eef',\n 700: '#004eeb',\n 800: '#0040c1',\n 900: '#00359e',\n 950: '#002266',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Indigo\n// ─────────────────────────────────────────\nexport const colorIndigo = {\n 25: '#f5f8ff',\n 50: '#eef4ff',\n 100: '#e0eaff',\n 200: '#c7d7fe',\n 300: '#a4bcfd',\n 400: '#8098f9',\n 500: '#6172f3',\n 600: '#444ce7',\n 700: '#3538cd',\n 800: '#2d31a6',\n 900: '#2d3282',\n 950: '#1f235b',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Violet\n// ─────────────────────────────────────────\nexport const colorViolet = {\n 25: '#fbfaff',\n 50: '#f5f3ff',\n 100: '#ece9fe',\n 200: '#ddd6fe',\n 300: '#c3b5fd',\n 400: '#a48afb',\n 500: '#875bf7',\n 600: '#7839ee',\n 700: '#6927da',\n 800: '#5720b7',\n 900: '#491c96',\n 950: '#2e125e',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Purple\n// ─────────────────────────────────────────\nexport const colorPurple = {\n 25: '#fafaff',\n 50: '#f4f3ff',\n 100: '#ebe9fe',\n 200: '#d9d6fe',\n 300: '#bdb4fe',\n 400: '#9b8afb',\n 500: '#7a5af8',\n 600: '#6938ef',\n 700: '#5925dc',\n 800: '#4a1fb8',\n 900: '#3e1c96',\n 950: '#27115f',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Fuchsia\n// ─────────────────────────────────────────\nexport const colorFuchsia = {\n 25: '#fefaff',\n 50: '#fdf4ff',\n 100: '#fbe8ff',\n 200: '#f6d0fe',\n 300: '#eeaafd',\n 400: '#e478fa',\n 500: '#d444f1',\n 600: '#ba24d5',\n 700: '#9f1ab1',\n 800: '#821890',\n 900: '#6f1877',\n 950: '#47104c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Pink\n// ─────────────────────────────────────────\nexport const colorPink = {\n 25: '#fef6fb',\n 50: '#fdf2fa',\n 100: '#fce7f6',\n 200: '#fcceee',\n 300: '#faa7e0',\n 400: '#f670c7',\n 500: '#ee46bc',\n 600: '#dd2590',\n 700: '#c11574',\n 800: '#9e165f',\n 900: '#851651',\n 950: '#4e0d30',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Rose\n// ─────────────────────────────────────────\nexport const colorRose = {\n 25: '#fff5f6',\n 50: '#fff1f3',\n 100: '#ffe4e8',\n 200: '#fecdd6',\n 300: '#fea3b4',\n 400: '#fd6f8e',\n 500: '#f63d68',\n 600: '#e31b54',\n 700: '#c01048',\n 800: '#a11043',\n 900: '#89123e',\n 950: '#510b24',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Orange Dark\n// ─────────────────────────────────────────\nexport const colorOrangeDark = {\n 25: '#fff9f5',\n 50: '#fff4ed',\n 100: '#ffe6d5',\n 200: '#ffd6ae',\n 300: '#ff9c66',\n 400: '#ff692e',\n 500: '#ff4405',\n 600: '#e62e05',\n 700: '#bc1b06',\n 800: '#97180c',\n 900: '#771a0d',\n 950: '#57130a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Orange\n// ─────────────────────────────────────────\nexport const colorOrange = {\n 25: '#fefaf5',\n 50: '#fef6ee',\n 100: '#fdead7',\n 200: '#f9dbaf',\n 300: '#f7b27a',\n 400: '#f38744',\n 500: '#ef6820',\n 600: '#e04f16',\n 700: '#b93815',\n 800: '#932f19',\n 900: '#772917',\n 950: '#511c10',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Yellow\n// ─────────────────────────────────────────\nexport const colorYellow = {\n 25: '#fefdf0',\n 50: '#fefbe8',\n 100: '#fef7c3',\n 200: '#feee95',\n 300: '#fde272',\n 400: '#fac515',\n 500: '#eaaa08',\n 600: '#ca8504',\n 700: '#a15c07',\n 800: '#854a0e',\n 900: '#713b12',\n 950: '#542c0d',\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorBrand (used by components)\n// ─────────────────────────────────────────\nexport const colorBrand = {\n primary: colorBrandScale[500], // #fb6011\n hover: colorBrandScale[400], // #fd843a\n pressed: colorBrandScale[600], // #ec470a\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorSemantic (used by components)\n// ─────────────────────────────────────────\nexport const colorSemantic = {\n success: {\n bg: colorSuccessScale[50], // #ecfdf3\n text: colorSuccessScale[600], // #079455\n border: colorSuccessScale[200], // #abefc6\n fill: colorSuccessScale[500], // #17b26a\n icon: colorSuccessScale[600], // #079455\n },\n error: {\n bg: colorErrorScale[50], // #fef3f2\n text: colorErrorScale[700], // #b42318\n border: colorErrorScale[200], // #fecdca\n strong: colorErrorScale[500], // #f04438 (used for input error border)\n fill: colorErrorScale[600], // #d92d20\n icon: colorErrorScale[500], // #f04438\n },\n warning: {\n bg: colorWarningScale[50], // #fffaeb\n text: colorWarningScale[600], // #dc6803\n border: colorWarningScale[200], // #fedf89\n fill: colorWarningScale[400], // #fdb022\n icon: colorWarningScale[600], // #dc6803\n },\n info: {\n bg: colorBlue[50], // #eff8ff\n text: colorBlue[700], // #175cd3\n border: colorBlue[200], // #b2ddff\n fill: colorBlue[500], // #2e90fa\n icon: colorBlue[600], // #1570ef\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorDecorative (Tag 系列)\n// ─────────────────────────────────────────\nexport const colorDecorative = {\n Green: { bg: colorSuccessScale[50], text: colorSuccessScale[700], border: colorSuccessScale[200], fill: colorSuccessScale[500], icon: colorSuccessScale[600] },\n Red: { bg: colorErrorScale[50], text: colorErrorScale[800], border: colorErrorScale[200], fill: colorErrorScale[500], icon: colorErrorScale[600] },\n Orange: { bg: colorBrandScale[50], text: colorBrandScale[800], border: colorBrandScale[200], fill: colorBrandScale[500], icon: colorBrandScale[700] },\n Cyan: { bg: colorCyan[50], text: colorCyan[700], border: colorCyan[200], fill: colorCyan[500], icon: colorCyan[600] },\n Violet: { bg: colorViolet[50], text: colorViolet[700], border: colorViolet[200], fill: colorViolet[500], icon: colorViolet[600] },\n Pink: { bg: colorPink[50], text: colorPink[700], border: colorPink[200], fill: colorPink[500], icon: colorPink[600] },\n Yellow: { bg: colorWarningScale[50], text: colorWarningScale[700], border: colorWarningScale[200], fill: colorWarningScale[400], icon: colorWarningScale[600] },\n Blue: { bg: colorBlue[50], text: colorBlue[700], border: colorBlue[200], fill: colorBlue[500], icon: colorBlue[600] },\n Gray: { bg: colorGray[100], text: colorGray[700], border: colorGray[200], fill: colorGray[700], icon: colorGray[600] },\n} as const;\n\nexport type DecorativeColor = keyof typeof colorDecorative;\n\n// ─────────────────────────────────────────\n// Semantic tokens — Light mode\n// ─────────────────────────────────────────\nexport const semanticText = {\n primary: '#1c1917',\n secondary: '#44403c',\n tertiary: '#57534e',\n quaternary: '#79716b',\n disabled: '#79716b',\n placeholder: '#79716b',\n placeholderSubtle: '#d7d3d0',\n white: '#ffffff',\n brandPrimary: '#7d2511',\n brandSecondary: '#ec470a',\n brandTertiary: '#fb6011',\n errorPrimary: '#d92d20',\n warningPrimary: '#dc6803',\n successPrimary: '#079455',\n} as const;\n\nexport const semanticBorder = {\n primary: '#d7d3d0',\n secondary: '#e7e5e4',\n tertiary: '#f5f5f4',\n brand: '#fb6011',\n error: '#f04438',\n errorSubtle: '#fda29b',\n disabled: '#d7d3d0',\n disabledSubtle: '#e7e5e4',\n} as const;\n\nexport const semanticBg = {\n primary: '#ffffff',\n secondary: '#fafaf9',\n tertiary: '#f5f5f4',\n quaternary: '#e7e5e4',\n disabled: '#f5f5f4',\n disabledSubtle: '#fafaf9',\n overlay: '#171412',\n brandPrimary: '#fff6ed',\n brandSecondary: '#ffead5',\n brandSolid: '#fb6011',\n brandSolidHover: '#ec470a',\n errorPrimary: '#fef3f2',\n errorSolid: '#d92d20',\n warningPrimary: '#fffaeb',\n warningSolid: '#dc6803',\n successPrimary: '#ecfdf3',\n successSolid: '#079455',\n} as const;\n\nexport const semanticFg = {\n primary: '#1c1917',\n secondary: '#44403c',\n tertiary: '#57534e',\n quaternary: '#a9a29d',\n disabled: '#a9a29d',\n disabledSubtle: '#d7d3d0',\n white: '#ffffff',\n brandPrimary: '#fb6011',\n brandSecondary: '#fb6011',\n errorPrimary: '#d92d20',\n errorSecondary: '#f04438',\n warningPrimary: '#dc6803',\n warningSecondary: '#f79009',\n successPrimary: '#079455',\n successSecondary: '#17b26a',\n} as const;\n\n// ─────────────────────────────────────────\n// Typography\n// ─────────────────────────────────────────\nexport const typography = {\n fontFamily: {\n display: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n body: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n base: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n },\n fontSize: {\n // Text\n xs: '12px',\n sm: '14px',\n base: '16px',\n md: '16px',\n lg: '18px',\n xl: '20px',\n // Display\n displayXs: '24px',\n displaySm: '30px',\n displayMd: '36px',\n displayLg: '48px',\n displayXl: '60px',\n display2xl: '72px',\n },\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n // Text\n xs: '18px',\n sm: '20px',\n base: '24px',\n md: '24px',\n lg: '28px',\n xl: '30px',\n // Display\n displayXs: '32px',\n displaySm: '38px',\n displayMd: '44px',\n displayLg: '60px',\n displayXl: '72px',\n display2xl: '90px',\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Spacing (named scale)\n// ─────────────────────────────────────────\nexport const spacing = {\n none: '0px',\n xxs: '2px',\n xs: '4px',\n sm: '6px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n '2xl': '20px',\n '3xl': '24px',\n '4xl': '32px',\n '5xl': '40px',\n '6xl': '48px',\n '7xl': '64px',\n '8xl': '80px',\n '9xl': '96px',\n '10xl': '128px',\n '11xl': '160px',\n // Legacy numeric aliases\n 0: '0px',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n} as const;\n\n// ─────────────────────────────────────────\n// Radius\n// ─────────────────────────────────────────\nexport const radius = {\n none: '0px',\n xxs: '2px',\n xs: '4px',\n sm: '6px',\n md: '8px',\n lg: '10px',\n xl: '12px',\n '2xl': '16px',\n '3xl': '20px',\n '4xl': '24px',\n full: '9999px',\n} as const;\n\n// ─────────────────────────────────────────\n// Component Sizing (project-specific)\n// ─────────────────────────────────────────\nexport const sizing = {\n tag: {\n sm: '20px',\n lg: '24px',\n },\n field: {\n sm: '32px',\n ms: '36px',\n md: '40px',\n lg: '48px',\n },\n icon: {\n sm: '14px',\n md: '16px',\n lg: '18px',\n xl: '20px',\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Border\n// ─────────────────────────────────────────\nexport const border = {\n radius: {\n sm: radius.sm, // 6px — Alert, Tag\n md: radius.md, // 8px — Button, Input (default)\n lg: radius.lg, // 10px\n xl: radius.xl, // 12px\n full: radius.full,\n },\n width: '1px',\n color: {\n default: semanticBorder.secondary, // #e7e5e4\n hover: semanticBorder.primary, // #d7d3d0\n focus: semanticBorder.brand, // #fb6011\n error: semanticBorder.error, // #f04438\n disabled: semanticBorder.disabled, // #d7d3d0\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Shadow\n// ─────────────────────────────────────────\nexport const shadow = {\n xs: '0px 1px 2px 0px #0a0d120d',\n xsSkeuomorphic: 'inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d',\n sm: '0px 1px 3px 0px #0a0d121a, 0px 1px 2px -1px #0a0d121a',\n md: '0px 4px 6px -1px #0a0d121a, 0px 2px 4px -2px #0a0d120f',\n lg: '0px 12px 16px -4px #0a0d1214, 0px 4px 6px -2px #0a0d1208, 0px 2px 2px -1px #0a0d120a',\n xl: '0px 20px 24px -4px #0a0d1214, 0px 8px 8px -4px #0a0d1208, 0px 3px 3px -1.5px #0a0d120a',\n '2xl': '0px 24px 48px -12px #0a0d122e, 0px 4px 4px -2px #0a0d120a',\n '3xl': '0px 32px 64px -12px #0a0d1224, 0px 5px 5px -2.5px #0a0d120a',\n} as const;\n\n// ─────────────────────────────────────────\n// Focus Rings\n// ─────────────────────────────────────────\nexport const focusRing = {\n default: `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowXs: `0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowXsSkeuomorphic: `inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowSm: `0px 1px 3px 0px #0a0d121a, 0px 1px 2px 0px #0a0d121a, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n error: `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n errorShadowXs: `0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n errorShadowXsSkeuomorphic: `inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n} as const;\n\n// ─────────────────────────────────────────\n// Backdrop Blur\n// ─────────────────────────────────────────\nexport const backdropBlur = {\n sm: 'blur(8px)',\n md: 'blur(16px)',\n lg: 'blur(24px)',\n xl: 'blur(40px)',\n} as const;\n\n// ─────────────────────────────────────────\n// Motion\n// ─────────────────────────────────────────\nexport const motion = {\n duration: { base: '0.2s' },\n easing: { base: 'ease' },\n transition: { base: 'all 0.2s ease' },\n} as const;\n\n// ─────────────────────────────────────────\n// 默认 Export(全量)\n// ─────────────────────────────────────────\nconst tokens = {\n color: {\n base: colorBase,\n brand: colorBrandScale,\n error: colorErrorScale,\n warning: colorWarningScale,\n success: colorSuccessScale,\n gray: colorGray,\n grayBlue: colorGrayBlue,\n moss: colorMoss,\n greenLight: colorGreenLight,\n green: colorGreen,\n teal: colorTeal,\n cyan: colorCyan,\n blueLight: colorBlueLight,\n blue: colorBlue,\n blueDark: colorBlueDark,\n indigo: colorIndigo,\n violet: colorViolet,\n purple: colorPurple,\n fuchsia: colorFuchsia,\n pink: colorPink,\n rose: colorRose,\n orangeDark: colorOrangeDark,\n orange: colorOrange,\n yellow: colorYellow,\n // semantic\n semantic: {\n text: semanticText,\n border: semanticBorder,\n bg: semanticBg,\n fg: semanticFg,\n },\n // backward-compat\n neutral: colorNeutral,\n decorative: colorDecorative,\n },\n typography,\n spacing,\n radius,\n sizing,\n border,\n shadow,\n focusRing,\n backdropBlur,\n motion,\n} as const;\n\nexport default tokens;\n","import { colorBrandScale } from '../../tokens';\n\n/** 默认品牌色(与 ThemeProvider 默认值一致,忽略大小写) */\nexport const DEFAULT_BRAND_COLOR = colorBrandScale[500];\n\nexport function isDefaultBrandColor(color?: string): boolean {\n if (!color) return true;\n return color.toLowerCase() === DEFAULT_BRAND_COLOR.toLowerCase();\n}\n\nexport function resolveBrandColor(color?: string): string {\n return color || DEFAULT_BRAND_COLOR;\n}\n\n/** 品牌 hover 色:与旧版 CSS 变量 fallback `--color-bg-brand-solid_hover` 保持一致 */\nexport const BRAND_HOVER_COLOR = colorBrandScale[600];\n","import {\n colorBrandScale,\n colorErrorScale,\n focusRing,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n shadow,\n typography,\n} from '../../tokens';\nimport { BRAND_HOVER_COLOR, isDefaultBrandColor, resolveBrandColor } from './colorUtils';\n\nconst DEFAULT_BRAND_ICON = colorBrandScale[500];\n\nexport type ButtonNormalizedHierarchy =\n | 'default'\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\nexport interface ButtonVisuals {\n bg: string;\n color: string;\n iconColor: string;\n border: string;\n boxShadow: string;\n textDecoration?: string;\n}\n\nexport function getButtonVisuals(options: {\n hierarchy: ButtonNormalizedHierarchy;\n disabled: boolean;\n interactive: boolean;\n brandColor?: string;\n}): ButtonVisuals {\n const { hierarchy, disabled, interactive } = options;\n const brand = resolveBrandColor(options.brandColor);\n const brandHover = BRAND_HOVER_COLOR;\n const brandText = colorBrandScale[600];\n const brandTextHover = colorBrandScale[700];\n\n if (disabled) {\n if (\n hierarchy === 'default' ||\n hierarchy === 'primary' ||\n hierarchy === 'secondary' ||\n hierarchy === 'destructive-primary' ||\n hierarchy === 'destructive-secondary'\n ) {\n return {\n bg: semanticBg.disabled,\n color: semanticFg.disabled,\n iconColor: semanticFg.disabled,\n border: `1px solid ${semanticBorder.disabledSubtle}`,\n boxShadow: 'none',\n };\n }\n return {\n bg: 'transparent',\n color: semanticFg.disabled,\n iconColor: semanticFg.disabled,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'default') {\n return {\n bg: interactive ? semanticBg.secondary : semanticBg.primary,\n color: interactive ? brandText : semanticText.secondary,\n iconColor: interactive ? DEFAULT_BRAND_ICON : semanticFg.quaternary,\n border: interactive ? `1px solid ${DEFAULT_BRAND_ICON}` : `1px solid ${semanticBorder.primary}`,\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'primary') {\n return {\n bg: interactive ? brandHover : brand,\n color: semanticText.white,\n iconColor: colorBrandScale[300],\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'secondary') {\n return {\n bg: interactive ? semanticBg.secondary : semanticBg.primary,\n color: interactive ? colorGrayHoverText() : semanticText.secondary,\n iconColor: interactive ? '#79716b' : semanticFg.quaternary,\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'tertiary') {\n return {\n bg: interactive ? semanticBg.secondary : 'transparent',\n color: interactive ? colorGray700Text() : semanticText.tertiary,\n iconColor: interactive ? '#79716b' : semanticFg.quaternary,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'link-color') {\n return {\n bg: 'transparent',\n color: interactive ? brandTextHover : brandText,\n iconColor: DEFAULT_BRAND_ICON,\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 ? colorGray700Text() : semanticText.tertiary,\n iconColor: semanticFg.quaternary,\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'destructive-primary') {\n return {\n bg: interactive ? colorErrorScale[600] : colorErrorScale[500],\n color: semanticText.white,\n iconColor: interactive ? colorErrorScale[200] : colorErrorScale[300],\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'destructive-secondary') {\n return {\n bg: interactive ? semanticBg.errorPrimary : semanticBg.primary,\n color: semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: `inset 0 0 0 1px ${semanticBorder.errorSubtle}, 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 ? semanticBg.errorPrimary : 'transparent',\n color: semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n return {\n bg: 'transparent',\n color: interactive ? colorErrorScale[700] : semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n}\n\nfunction colorGrayHoverText() {\n return '#292524';\n}\n\nfunction colorGray700Text() {\n return '#44403c';\n}\n\nexport function getButtonFocusShadow(\n hierarchy: ButtonNormalizedHierarchy,\n showFocusRing: boolean,\n brandColor?: string,\n): string | undefined {\n if (!showFocusRing) return undefined;\n\n const isDestructive =\n hierarchy === 'destructive-primary' ||\n hierarchy === 'destructive-secondary' ||\n hierarchy === 'destructive-tertiary' ||\n hierarchy === 'destructive-link';\n\n if (isDestructive) {\n if (hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return focusRing.errorShadowXsSkeuomorphic;\n }\n return focusRing.error;\n }\n\n if (hierarchy === 'primary' || hierarchy === 'secondary') {\n if (isDefaultBrandColor(brandColor)) {\n return focusRing.shadowXsSkeuomorphic;\n }\n return `${shadow.xsSkeuomorphic}, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n }\n\n if (isDefaultBrandColor(brandColor)) {\n return focusRing.default;\n }\n return `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n}\n\nexport const buttonFontFamily = typography.fontFamily.body;\nexport const buttonRadiusMd = radius.md;\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n buttonFontFamily,\n buttonRadiusMd,\n getButtonFocusShadow,\n getButtonVisuals,\n} from '../shared/buttonStyles';\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 | 'default'\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\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 /** 按钮层级。`default` 为带边框白底(对齐 antd);`secondary` 为 Figma 无边框 skeuomorphic 样式 */\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 = 'default' | '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 default: 'default',\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};\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 = 'default',\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] || 'default';\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;\n\n const visuals = getButtonVisuals({\n hierarchy,\n disabled,\n interactive: isHovered || isPressed,\n brandColor: themeBrand,\n });\n\n const focusShadow = getButtonFocusShadow(hierarchy, showFocusRing, themeBrand);\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: buttonFontFamily,\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 = buttonRadiusMd;\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 type React from 'react';\nimport {\n colorErrorScale,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n shadow,\n spacing,\n typography,\n} from '../../tokens';\n\nexport const fieldFontFamily = typography.fontFamily.body;\nexport const fieldFontSizeMd = typography.fontSize.md;\nexport const fieldFontSizeSm = typography.fontSize.sm;\nexport const fieldFontSizeXs = typography.fontSize.xs;\nexport const fieldLineHeightMd = typography.lineHeight.md;\nexport const fieldLineHeightSm = typography.lineHeight.sm;\nexport const fieldLineHeightXs = typography.lineHeight.xs;\nexport const fieldRadiusMd = radius.md;\nexport const fieldShadowXs = shadow.xs;\nexport const fieldSpacingXs = spacing.xs;\n\nexport const fieldColors = {\n textPrimary: semanticText.primary,\n textSecondary: semanticText.secondary,\n textTertiary: semanticText.tertiary,\n textDisabled: semanticText.disabled,\n textPlaceholder: semanticText.placeholder,\n borderPrimary: semanticBorder.primary,\n borderDisabled: semanticBorder.disabled,\n borderBrand: semanticBorder.brand,\n borderError: semanticBorder.error,\n borderErrorSubtle: semanticBorder.errorSubtle,\n bgPrimary: semanticBg.primary,\n bgDisabledSubtle: semanticBg.disabledSubtle,\n fgDisabled: semanticFg.disabled,\n fgQuaternary: semanticFg.quaternary,\n error600: colorErrorScale[600],\n} as const;\n\nexport function getFieldFocusStyles(options: {\n disabled?: boolean;\n error?: boolean;\n focused?: boolean;\n brandColor?: string;\n}): React.CSSProperties {\n const { disabled = false, error = false, focused = false, brandColor } = options;\n const c = fieldColors;\n const boxShadow = fieldShadowXs;\n const brand = brandColor || c.borderBrand;\n\n if (disabled) {\n return { border: `1px solid ${c.borderDisabled}`, boxShadow, outline: 'none' };\n }\n if (error && focused) {\n return {\n border: `1px solid ${c.borderError}`,\n boxShadow,\n outline: `2px solid ${c.borderError}`,\n outlineOffset: '-2px',\n };\n }\n if (error) {\n return { border: `1px solid ${c.borderErrorSubtle}`, boxShadow, outline: 'none' };\n }\n if (focused) {\n return {\n border: `1px solid ${brand}`,\n boxShadow,\n outline: `2px solid ${brand}`,\n outlineOffset: '-2px',\n };\n }\n return { border: `1px solid ${c.borderPrimary}`, boxShadow, outline: 'none' };\n}\n\nexport function getFieldLabelStyle(): React.CSSProperties {\n return {\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeSm,\n fontWeight: 500,\n lineHeight: fieldLineHeightSm,\n color: fieldColors.textSecondary,\n };\n}\n\nexport function getFieldHintStyle(error = false): React.CSSProperties {\n return {\n margin: 0,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeSm,\n fontWeight: 400,\n lineHeight: fieldLineHeightSm,\n color: error ? fieldColors.error600 : fieldColors.textTertiary,\n };\n}\n\nexport function getPlaceholderCss(\n selector: string,\n extraRules = '',\n placeholderColor = fieldColors.textPlaceholder,\n): string {\n return `\n ${selector}::placeholder {\n color: ${placeholderColor};\n font-size: ${fieldFontSizeMd};\n font-weight: 400;\n opacity: 1;\n }\n ${selector}::-webkit-input-placeholder { color: ${placeholderColor}; }\n ${selector}::-moz-placeholder { color: ${placeholderColor}; }\n ${selector}:-ms-input-placeholder { color: ${placeholderColor}; }\n ${extraRules}\n `;\n}\n","import React, { forwardRef, useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport { InputProps } from './index';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n} from '../shared/fieldStyles';\n\nexport interface InputGroupProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n error?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Text addon on the left (e.g. \"https://\") — auto-styled with correct padding */\n leadingText?: React.ReactNode;\n /** Text addon on the right (e.g. \"USD\") — auto-styled with correct padding */\n trailingText?: React.ReactNode;\n /** Raw ReactNode on the left (dropdown, icon button, etc.) — no padding added */\n leadingAddon?: React.ReactNode;\n /** Raw ReactNode on the right (button, select, etc.) — no padding added */\n trailingAddon?: React.ReactNode;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst sizeMap: Record<NonNullable<InputGroupProps['size']>, { pt: string; pb: string }> = {\n small: { pt: '5px', pb: '5px' },\n mediumSmall: { pt: '7px', pb: '7px' },\n medium: { pt: '9px', pb: '9px' },\n large: { pt: '11px', pb: '11px' },\n};\n\nconst InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(({\n size = 'mediumSmall',\n error = false,\n disabled = false,\n readOnly = false,\n prefix,\n suffix,\n leadingText,\n trailingText,\n leadingAddon,\n trailingAddon,\n className = '',\n style,\n onFocus,\n onBlur,\n onKeyDown,\n onPressEnter,\n value,\n defaultValue,\n onChange,\n placeholder,\n type = 'text',\n label,\n required,\n hintText,\n ...restProps\n}, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n const { primaryColor } = useTheme();\n\n useEffect(() => {\n if (typeof ref === 'function') ref(inputRef.current);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\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) onPressEnter(e);\n onKeyDown?.(e);\n };\n\n const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { border, boxShadow, outline, outlineOffset } = focusStyles;\n const { pt, pb } = sizeMap[size];\n const dividerColor = disabled ? fieldColors.borderDisabled : fieldColors.borderPrimary;\n const iconColor = disabled ? fieldColors.fgDisabled : fieldColors.fgQuaternary;\n const hasPrefixIcon = !!prefix;\n const hasSuffixIcon = !!suffix;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n pointerEvents: 'none',\n };\n\n const addonTextStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: '14px',\n paddingRight: '12px',\n color: fieldColors.textTertiary,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n lineHeight: fieldLineHeightMd,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n backgroundColor: disabled ? fieldColors.bgDisabledSubtle : 'transparent',\n };\n\n const groupEl = (\n <div\n className={`aha-input-group ${className}`}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n width: '100%',\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: fieldRadiusMd,\n backgroundColor: disabled || readOnly ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n overflow: 'hidden',\n boxSizing: 'border-box',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n ...style,\n }}\n >\n {leadingText !== undefined && (\n <div style={{ ...addonTextStyle, borderRight: `1px solid ${dividerColor}` }}>\n {leadingText}\n </div>\n )}\n {leadingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderRight: `1px solid ${dividerColor}` }}>\n {leadingAddon}\n </div>\n )}\n\n <div style={{ flex: 1, position: 'relative', display: 'flex', alignItems: 'stretch', minWidth: 0 }}>\n {hasPrefixIcon && (\n <span style={{ ...iconSlotStyle, left: '14px' }}>{prefix}</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={{\n flex: 1,\n border: 'none',\n outline: 'none',\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n backgroundColor: 'transparent',\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: hasPrefixIcon ? '40px' : '14px',\n paddingRight: hasSuffixIcon ? '40px' : '14px',\n }}\n autoComplete={restProps.autoComplete || 'off'}\n {...restProps}\n />\n {hasSuffixIcon && (\n <span style={{ ...iconSlotStyle, right: '14px' }}>{suffix}</span>\n )}\n </div>\n\n {trailingText !== undefined && (\n <div style={{ ...addonTextStyle, paddingLeft: '12px', paddingRight: '14px', borderLeft: `1px solid ${dividerColor}` }}>\n {trailingText}\n </div>\n )}\n {trailingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderLeft: `1px solid ${dividerColor}` }}>\n {trailingAddon}\n </div>\n )}\n </div>\n );\n\n if (!label && !hintText) return groupEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {groupEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n});\n\nInputGroup.displayName = 'InputGroup';\n\nexport default InputGroup;\n","import React, { useState, useRef, KeyboardEvent } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport Tag from '../Tag';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\n\nexport interface InputTagsProps {\n value?: string[];\n defaultValue?: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst containerPadding = {\n small: '4px',\n mediumSmall: '6px',\n medium: '8px',\n large: '10px',\n};\n\nconst tagSizeMap = {\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'lg',\n} as const;\n\nconst InputTags: React.FC<InputTagsProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag...',\n disabled = false,\n error = false,\n size = 'mediumSmall',\n className = '',\n style,\n label,\n required,\n hintText,\n}) => {\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { primaryColor } = useTheme();\n\n const isControlled = value !== undefined;\n const tags = isControlled ? value! : internalTags;\n\n const updateTags = (next: string[]) => {\n if (!isControlled) setInternalTags(next);\n onChange?.(next);\n };\n\n const addTag = (tag: string) => {\n const trimmed = tag.trim();\n if (!trimmed || tags.includes(trimmed)) return;\n updateTags([...tags, trimmed]);\n setInputValue('');\n };\n\n const removeTag = (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if ((e.key === 'Enter' || e.key === ',') && inputValue) {\n e.preventDefault();\n addTag(inputValue);\n }\n if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n };\n\n const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { border, boxShadow, outline, outlineOffset } = focusStyles;\n const p = containerPadding[size];\n const tagSize = tagSizeMap[size];\n\n const tagsEl = (\n <div\n className={`aha-input-tags ${className}`}\n onClick={() => inputRef.current?.focus()}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n padding: p,\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: fieldRadiusMd,\n backgroundColor: disabled ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n boxSizing: 'border-box',\n width: '100%',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n cursor: disabled ? 'not-allowed' : 'text',\n ...style,\n }}\n >\n {tags.map((tag, i) => (\n <Tag\n key={i}\n size={tagSize}\n action={disabled ? 'none' : 'x-close'}\n onClose={() => removeTag(i)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => { setFocused(false); if (inputValue) addTag(inputValue); }}\n disabled={disabled}\n placeholder={tags.length === 0 ? placeholder : ''}\n style={{\n flex: 1,\n minWidth: '80px',\n border: 'none',\n outline: 'none',\n padding: 0,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n lineHeight: fieldLineHeightMd,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n backgroundColor: 'transparent',\n }}\n />\n <style>{getPlaceholderCss('.aha-input-tags input')}</style>\n </div>\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {tagsEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n};\n\nexport default InputTags;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n fieldSpacingXs,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n className?: string;\n style?: React.CSSProperties;\n type?: string;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\n// sm=36px, mediumSmall=40px, md=44px (matches Figma md), lg=48px\n// With box-sizing:border-box: height = 1px border × 2 + paddingTop + 24px lineHeight + paddingBottom\nconst sizeStyles: Record<NonNullable<InputProps['size']>, React.CSSProperties> = {\n small: { height: '36px', paddingTop: '5px', paddingBottom: '5px' },\n mediumSmall: { height: '40px', paddingTop: '7px', paddingBottom: '7px' },\n medium: { height: '44px', paddingTop: '9px', paddingBottom: '9px' },\n large: { height: '48px', paddingTop: '11px', paddingBottom: '11px' },\n};\n\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void }> = ({ onClick }) => (\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={onClick}\n style={{ cursor: 'pointer', flexShrink: 0 }}\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\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'mediumSmall',\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 label,\n required,\n hintText,\n ...restProps\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(defaultValue || value || '');\n const [focused, setFocused] = React.useState(false);\n const { primaryColor } = useTheme();\n\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\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) onPressEnter(e);\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) setInternalValue('');\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 const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { height, paddingTop, paddingBottom } = sizeStyles[size];\n const hasRightContent = suffix || showClear;\n const paddingLeft = prefix ? '40px' : '14px';\n const paddingRight = hasRightContent ? '40px' : '14px';\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n height,\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n borderRadius: fieldRadiusMd,\n ...focusStyles,\n backgroundColor:\n disabled || readOnly ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n appearance: 'none',\n ...style,\n };\n\n const placeholderStyles = getPlaceholderCss(\n '.aha-input-wrapper input',\n `\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\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\"] { -moz-appearance: textfield; }\n `,\n );\n\n const iconColor = disabled ? fieldColors.fgDisabled : fieldColors.fgQuaternary;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n };\n\n const inputEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{ position: 'relative', display: 'block', width: '100%' }}\n >\n {prefix && (\n <span style={{ ...iconSlotStyle, left: '14px', pointerEvents: 'none' }}>\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 style={{ ...iconSlotStyle, right: '14px', gap: fieldSpacingXs }}>\n {showClear && <ClearIcon onClick={handleClear} />}\n {suffix}\n </span>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return inputEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && (\n <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>\n )}\n </label>\n )}\n {inputEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nexport { default as InputGroup } from './InputGroup';\nexport type { InputGroupProps } from './InputGroup';\nexport { default as InputTags } from './InputTags';\nexport type { InputTagsProps } from './InputTags';\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 type React from 'react';\nimport {\n focusRing,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n spacing,\n typography,\n} from '../../tokens';\nimport { BRAND_HOVER_COLOR, isDefaultBrandColor, resolveBrandColor } from './colorUtils';\n\nexport const controlFontFamily = typography.fontFamily.body;\nexport const controlFontWeightMedium = typography.fontWeight.medium;\nexport const controlFontWeightRegular = typography.fontWeight.regular;\n\nexport function getControlTypography(size: 'sm' | 'md') {\n return {\n fontSize: size === 'sm' ? typography.fontSize.sm : typography.fontSize.md,\n lineHeight: size === 'sm' ? typography.lineHeight.sm : typography.lineHeight.md,\n gap: size === 'sm' ? spacing.md : spacing.lg,\n hintGap: size === 'md' ? spacing.xxs : '0',\n };\n}\n\nexport function getCheckboxBorderRadius(size: 'sm' | 'md') {\n return size === 'sm' ? radius.xs : radius.sm;\n}\n\nexport function getControlBoxStyles(options: {\n disabled: boolean;\n active: boolean;\n hovered: boolean;\n brandColor?: string;\n}) {\n const { disabled, active, hovered } = options;\n const brand = resolveBrandColor(options.brandColor);\n const brandHover = BRAND_HOVER_COLOR;\n\n const bg = (() => {\n if (disabled) return semanticBg.disabledSubtle;\n if (active) return hovered ? brandHover : brand;\n return hovered ? semanticBg.secondary : semanticBg.primary;\n })();\n\n const border = (() => {\n if (disabled) return `1px solid ${semanticBorder.disabled}`;\n if (active) return `1px solid ${hovered ? brandHover : brand}`;\n return `1px solid ${semanticBorder.primary}`;\n })();\n\n return { bg, border };\n}\n\nexport function getControlFocusShadow(showFocus: boolean, brandColor?: string): string {\n if (!showFocus) return 'none';\n if (isDefaultBrandColor(brandColor)) return focusRing.default;\n return `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n}\n\nexport function getControlLabelStyle(options: {\n size: 'sm' | 'md';\n disabled: boolean;\n}): React.CSSProperties {\n const { fontSize, lineHeight } = getControlTypography(options.size);\n return {\n fontSize,\n lineHeight,\n fontWeight: controlFontWeightMedium,\n fontFamily: controlFontFamily,\n color: options.disabled ? semanticText.disabled : semanticText.secondary,\n userSelect: 'none',\n };\n}\n\nexport function getControlHintStyle(size: 'sm' | 'md'): React.CSSProperties {\n const { fontSize, lineHeight } = getControlTypography(size);\n return {\n fontSize,\n lineHeight,\n fontWeight: controlFontWeightRegular,\n fontFamily: controlFontFamily,\n color: semanticText.tertiary,\n };\n}\n\nexport function getControlActiveIconColor(disabled: boolean, active: boolean): string {\n if (disabled && active) return semanticFg.disabledSubtle;\n return semanticFg.white;\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n getCheckboxBorderRadius,\n getControlActiveIconColor,\n getControlBoxStyles,\n getControlFocusShadow,\n getControlHintStyle,\n getControlLabelStyle,\n getControlTypography,\n} from '../shared/controlStyles';\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 { primaryColor } = useTheme();\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 = getCheckboxBorderRadius(size);\n const { gap, hintGap } = getControlTypography(size);\n const { bg, border } = getControlBoxStyles({\n disabled,\n active: isActive,\n hovered,\n brandColor: primaryColor,\n });\n const iconColor = getControlActiveIconColor(disabled, isActive);\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 <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,\n backgroundColor: bg,\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: getControlFocusShadow(showFocus, primaryColor),\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\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 <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 {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: hintGap }}>\n {children && (\n <span style={getControlLabelStyle({ size, disabled })}>\n {children}\n </span>\n )}\n {hint && (\n <span\n style={getControlHintStyle(size)}\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';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n getControlActiveIconColor,\n getControlBoxStyles,\n getControlFocusShadow,\n getControlHintStyle,\n getControlLabelStyle,\n getControlTypography,\n} from '../shared/controlStyles';\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 { primaryColor } = useTheme();\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 { gap, hintGap } = getControlTypography(size);\n const { bg, border } = getControlBoxStyles({\n disabled,\n active: checked,\n hovered,\n brandColor: primaryColor,\n });\n const dotColor = getControlActiveIconColor(disabled, checked);\n const hasLabel = children || hint;\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 <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,\n backgroundColor: bg,\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: getControlFocusShadow(showFocus, primaryColor),\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\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 {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: hintGap }}>\n {children && (\n <span style={getControlLabelStyle({ size, disabled })}>\n {children}\n </span>\n )}\n {hint && (\n <span\n style={getControlHintStyle(size)}\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';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldFontSizeXs,\n fieldLineHeightMd,\n fieldLineHeightXs,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\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 disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n showCount?: boolean;\n maxLength?: number;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n rows?: number;\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n linkify?: boolean;\n linkifyOptions?: LinkifyOptions;\n label?: string;\n required?: boolean;\n hintText?: string;\n helpIcon?: React.ReactNode;\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 label,\n required,\n hintText,\n helpIcon,\n ...restProps\n },\n ref\n ) => {\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 const { primaryColor } = useTheme();\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 getFocusStyles = (): React.CSSProperties =>\n getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n borderRadius: fieldRadiusMd,\n ...getFocusStyles(),\n backgroundColor:\n disabled || readOnly\n ? fieldColors.bgDisabledSubtle\n : fieldColors.bgPrimary,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n padding: '12px 14px',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n resize: autoSize || linkify ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none',\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n const placeholderStyles = getPlaceholderCss(\n '.aha-textarea-wrapper textarea',\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: ${fieldColors.textPlaceholder};\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\n }\n `,\n );\n\n const textareaEl = (\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: fieldFontSizeXs,\n lineHeight: fieldLineHeightXs,\n color: disabled ? fieldColors.textDisabled : fieldColors.textTertiary,\n fontFamily: fieldFontFamily,\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 if (!label && !hintText) return textareaEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n ...getFieldLabelStyle(),\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n }}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: fieldColors.fgQuaternary }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {textareaEl}\n {hintText && (\n <p style={getFieldHintStyle(error)}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\nexport { default as TextareaTags } from './TextareaTags';\nexport type { TextareaTagsProps } from './TextareaTags';\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\";\nimport { shadow } from \"../../tokens\";\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: shadow.lg,\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 = '#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 {\n colorBlue,\n colorBlueLight,\n colorBrandScale,\n colorErrorScale,\n colorGray,\n colorGrayBlue,\n colorIndigo,\n colorOrange,\n colorPink,\n colorPurple,\n colorSuccessScale,\n colorWarningScale,\n semanticBg,\n semanticBorder,\n semanticText,\n} from '../../tokens';\n\nexport interface BadgeColorTokens {\n bg: string;\n text: string;\n ring: string;\n dot: string;\n btnText: string;\n btnHoverBg: string;\n btnHoverText: string;\n}\n\ntype ColorScale = {\n 50: string;\n 100: string;\n 200: string;\n 400: string;\n 500: string;\n 700: string;\n};\n\nfunction fromScale(scale: ColorScale): BadgeColorTokens {\n return {\n bg: scale[50],\n text: scale[700],\n ring: scale[200],\n dot: scale[500],\n btnText: scale[400],\n btnHoverBg: scale[100],\n btnHoverText: scale[500],\n };\n}\n\nexport const badgeColorTokens = {\n gray: fromScale(colorGray),\n brand: fromScale(colorBrandScale),\n error: fromScale(colorErrorScale),\n warning: fromScale(colorWarningScale),\n success: fromScale(colorSuccessScale),\n grayBlue: fromScale(colorGrayBlue),\n blueLight: fromScale(colorBlueLight),\n blue: fromScale(colorBlue),\n indigo: fromScale(colorIndigo),\n purple: fromScale(colorPurple),\n pink: fromScale(colorPink),\n orange: fromScale(colorOrange),\n} as const;\n\nexport type BadgeColorKey = keyof typeof badgeColorTokens;\n\nexport function getBadgeColorTokens(\n variant: 'pill' | 'badge' | 'modern',\n color: BadgeColorKey,\n): BadgeColorTokens {\n if (variant === 'modern') {\n return {\n ...badgeColorTokens[color],\n bg: semanticBg.primary,\n text: semanticText.secondary,\n ring: semanticBorder.secondary,\n };\n }\n return badgeColorTokens[color];\n}\n","import React, { useState } from 'react';\nimport type { MouseEventHandler, ReactNode } from 'react';\nimport { badgeColorTokens, getBadgeColorTokens, type BadgeColorKey } from '../shared/badgeColors';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BadgeColor = BadgeColorKey;\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// ─── 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 return getBadgeColorTokens(variant, 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' ? badgeColorTokens[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' ? badgeColorTokens[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' ? badgeColorTokens[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';\nimport {\n colorBlue,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n spacing,\n typography,\n} from '../../tokens';\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: typography.fontSize.xs, lineHeight: typography.lineHeight.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: typography.fontSize.sm, lineHeight: typography.lineHeight.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: typography.fontSize.md, lineHeight: typography.lineHeight.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: typography.fontSize.lg, lineHeight: typography.lineHeight.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: typography.fontSize.xl, lineHeight: typography.lineHeight.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: typography.fontSize.displayXs, lineHeight: typography.lineHeight.displayXs, 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: spacing.md, nameFontSize: typography.fontSize.sm, nameLineHeight: typography.lineHeight.sm, subFontSize: typography.fontSize.xs, subLineHeight: typography.lineHeight.xs },\n md: { gap: spacing.md, nameFontSize: typography.fontSize.sm, nameLineHeight: typography.lineHeight.sm, subFontSize: typography.fontSize.sm, subLineHeight: typography.lineHeight.sm },\n lg: { gap: spacing.lg, nameFontSize: typography.fontSize.md, nameLineHeight: typography.lineHeight.md, subFontSize: typography.fontSize.md, subLineHeight: typography.lineHeight.md },\n xl: { gap: spacing.xl, nameFontSize: typography.fontSize.lg, nameLineHeight: typography.lineHeight.lg, subFontSize: typography.fontSize.md, subLineHeight: typography.lineHeight.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: colorBlue[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: semanticText.quaternary,\n fontFamily: typography.fontFamily.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: semanticFg.quaternary,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <UserIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: semanticFg.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 ? semanticFg.successSecondary\n : semanticFg.quaternary,\n border: `1.5px solid ${semanticBg.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 ${semanticBg.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 ? semanticBorder.secondary : 'rgba(0, 0, 0, 0.08)'}`,\n backgroundColor: isPlaceholder ? semanticBg.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: semanticText.primary,\n fontFamily: typography.fontFamily.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: semanticText.tertiary,\n fontFamily: typography.fontFamily.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 if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && action}\n </div>\n {action && !closeable && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n </div>\n )}\n {closeable && (\n <div\n className=\"flex-shrink-0 self-start mt-1 cursor-pointer\"\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};\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","import React from 'react';\nimport InputTags, { InputTagsProps } from '../Input/InputTags';\nimport {\n fieldColors,\n getFieldHintStyle,\n getFieldLabelStyle,\n} from '../shared/fieldStyles';\n\nexport interface TextareaTagsProps extends Omit<InputTagsProps, 'size'> {\n minHeight?: number;\n helpIcon?: React.ReactNode;\n}\n\nconst TextareaTags: React.FC<TextareaTagsProps> = ({\n minHeight = 120,\n style,\n label,\n required,\n hintText,\n helpIcon,\n error,\n ...props\n}) => {\n const tagsEl = (\n <InputTags\n error={error}\n style={{\n minHeight: `${minHeight}px`,\n alignItems: 'flex-start',\n overflow: 'auto',\n resize: 'vertical',\n ...style,\n }}\n {...props}\n />\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n ...getFieldLabelStyle(),\n display: 'flex',\n alignItems: 'center',\n }}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: fieldColors.fgQuaternary }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {tagsEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n};\n\nexport default TextareaTags;\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","colorBrandScale","colorErrorScale","colorBlue","semanticText","semanticBorder","semanticBg","semanticFg","typography","display","base","xs","sm","md","lg","xl","displayXs","displaySm","displayMd","displayLg","displayXl","display2xl","regular","medium","semibold","bold","spacing","radius","shadow","focusRing","default","shadowXs","shadowXsSkeuomorphic","shadowSm","error","errorShadowXs","errorShadowXsSkeuomorphic","DEFAULT_BRAND_COLOR","isDefaultBrandColor","color","toLowerCase","resolveBrandColor","BRAND_HOVER_COLOR","DEFAULT_BRAND_ICON","buttonFontFamily","buttonRadiusMd","SIZE_ALIAS","small","mediumSmall","large","HIERARCHY_ALIAS","primary","secondary","tertiary","SIZE_TOKENS","height","paddingX","paddingXLg","fontSize","lineHeight","iconSize","gap","iconOnlyPad","LoadingSpinner","_a","size","_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","options","interactive","brand","brandColor","brandHover","brandText","brandTextHover","bg","iconColor","border","boxShadow","textDecoration","getButtonVisuals","focusShadow","getButtonFocusShadow","buttonStyle","position","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","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","Tag","variant","iconTypeProp","iconType","avatarSrc","dotColor","count","checkbox","checkedProp","checked","onCheckedChange","internalChecked","setInternalChecked","nSize","normalizeSize","isChecked","undefined","effectiveAction","pl","pr","containerStyle","paddingTop","paddingBottom","boxSizing","outlineOffset","colorConfig","config","startsWith","parseInt","getColorConfig","getOutlineColor","role","round","strokeLinejoin","React","cloneElement","marginLeft","fieldFontFamily","fieldFontSizeMd","fieldFontSizeSm","fieldFontSizeXs","fieldLineHeightMd","fieldLineHeightSm","fieldLineHeightXs","fieldRadiusMd","fieldShadowXs","fieldSpacingXs","fieldColors","textPrimary","textSecondary","textTertiary","textDisabled","textPlaceholder","borderPrimary","borderDisabled","borderBrand","borderError","borderErrorSubtle","bgPrimary","bgDisabledSubtle","fgDisabled","fgQuaternary","error600","getFieldFocusStyles","c","getFieldLabelStyle","getFieldHintStyle","margin","getPlaceholderCss","selector","extraRules","placeholderColor","sizeMap","pt","pb","InputGroup","forwardRef","ref","readOnly","prefix","suffix","leadingText","trailingText","leadingAddon","trailingAddon","onFocus","onBlur","onKeyDown","onPressEnter","defaultValue","onChange","placeholder","required","hintText","restProps","inputRef","useRef","setFocused","internalValue","setInternalValue","current","isControlled","currentValue","focusStyles","dividerColor","hasPrefixIcon","hasSuffixIcon","iconSlotStyle","addonTextStyle","groupEl","borderRight","target","key","autoComplete","borderLeft","containerPadding","tagSizeMap","InputTags","internalTags","setInternalTags","inputValue","setInputValue","tags","updateTags","addTag","tag","trimmed","trim","includes","removeTag","index","tagSize","tagsEl","focus","flexWrap","sizeStyles","ClearIcon","Input","allowClear","onClear","showClear","baseStyles","WebkitAppearance","MozAppearance","appearance","placeholderStyles","inputEl","autoCorrect","autoCapitalize","spellCheck","Select","controlledValue","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","getFilteredOptions","String","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","handleClear","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","minHeight","val","createPortal","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","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","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","controlFontFamily","controlFontWeightMedium","controlFontWeightRegular","getControlTypography","hintGap","getControlBoxStyles","active","hovered","getControlFocusShadow","showFocus","getControlLabelStyle","getControlHintStyle","getControlActiveIconColor","Checkbox","indeterminate","hint","isFocusedProp","setHovered","boxSize","getCheckboxBorderRadius","hasLabel","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","dotSize","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","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","helpIcon","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","textareaEl","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","thumbSize","thumbOffset","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","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","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","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","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","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","node","curve","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","PI","petals","x","cos","sin","getParticle","tailOffset","normalizeProgress","fade","pow","fromScale","scale","ring","dot","btnText","btnHoverBg","btnHoverText","badgeColorTokens","gray","grayBlue","blueLight","blue","indigo","purple","pink","orange","pillPadding","badgePadding","getTokens","getBadgeColorTokens","getRootStyle","isPill","isLg","BadgeDot","XIcon","SIZE_CONFIG","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","supportingText","avatarInitials","Icon","buttonLabel","onButtonClick","plMap","prMap","btnBorderRadius","dotPaddingLeft","dotPaddingRight","IconLeading","iconLeading","IconTrailing","iconTrailing","hasLeading","padMap","imgSrc","imgAlt","imgSize","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","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","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","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","displayValue","scrollContainerStyle","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]}