aha-components 1.7.11 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +10 -0
  2. package/dist/Avatar.esm.js +2 -0
  3. package/dist/Avatar.esm.js.map +1 -0
  4. package/dist/Avatar.js +2 -0
  5. package/dist/Avatar.js.map +1 -0
  6. package/dist/Badge.esm.js +2 -0
  7. package/dist/Badge.esm.js.map +1 -0
  8. package/dist/Badge.js +2 -0
  9. package/dist/Badge.js.map +1 -0
  10. package/dist/Checkbox.esm.js +1 -1
  11. package/dist/Checkbox.esm.js.map +1 -1
  12. package/dist/Checkbox.js +1 -1
  13. package/dist/Checkbox.js.map +1 -1
  14. package/dist/Radio.esm.js +1 -1
  15. package/dist/Radio.esm.js.map +1 -1
  16. package/dist/Radio.js +1 -1
  17. package/dist/Radio.js.map +1 -1
  18. package/dist/Table.esm.js +1 -1
  19. package/dist/Table.esm.js.map +1 -1
  20. package/dist/Table.js +1 -1
  21. package/dist/Table.js.map +1 -1
  22. package/dist/Tag.esm.js +1 -1
  23. package/dist/Tag.esm.js.map +1 -1
  24. package/dist/Tag.js +1 -1
  25. package/dist/Tag.js.map +1 -1
  26. package/dist/Textarea.esm.js +1 -1
  27. package/dist/Textarea.esm.js.map +1 -1
  28. package/dist/Textarea.js +1 -1
  29. package/dist/Textarea.js.map +1 -1
  30. package/dist/components/Avatar/Avatar.stories.d.ts +12 -0
  31. package/dist/components/Avatar/index.d.ts +42 -0
  32. package/dist/components/Badge/Badge.stories.d.ts +15 -0
  33. package/dist/components/Badge/index.d.ts +71 -0
  34. package/dist/components/Checkbox/Checkbox.stories.d.ts +5 -4
  35. package/dist/components/Checkbox/index.d.ts +6 -0
  36. package/dist/components/Radio/Radio.stories.d.ts +6 -4
  37. package/dist/components/Radio/index.d.ts +6 -0
  38. package/dist/components/Tag/Tag.stories.d.ts +5 -8
  39. package/dist/components/Tag/index.d.ts +24 -2
  40. package/dist/components/Textarea/Textarea.stories.d.ts +2 -0
  41. package/dist/components/Textarea/Textarea.test.d.ts +1 -0
  42. package/dist/components/Textarea/index.d.ts +12 -0
  43. package/dist/design-tokens/theme.css +26 -0
  44. package/dist/design-tokens/theme.tailwind4.css +26 -0
  45. package/dist/index.css +3848 -0
  46. package/dist/index.d.ts +153 -4
  47. package/dist/index.esm.css +3848 -0
  48. package/dist/index.esm.js +1 -1
  49. package/dist/index.esm.js.map +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/theme.css +26 -0
  53. package/dist/tokens.d.ts +28 -0
  54. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Alert/index.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/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/Progress/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"],"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","import React, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n const hasRightSlot = action || closeable;\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div\n className={`flex flex-col gap-1 ${hasRightSlot ? \"flex-1 min-w-0\" : \"\"}`}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n </div>\n {hasRightSlot && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n {closeable && (\n <div\n className=\"cursor-pointer relative top-[-12px]\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TagColor = 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet' | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\nexport type TagVariant = 'light' | 'fill';\nexport type TagSize = 'large' | 'small';\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color: TagColor; // 必需属性,支持预定义颜色或自定义十六进制颜色\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean; // 仅对 light 变体有效\n icon?: React.ReactElement; // 只允许 React 元素,不接受字符串\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// 颜色配置\nconst COLOR_CONFIG = {\n Green: {\n light: {\n bg: '#ECFDF5',\n text: '#006045',\n border: '#A4F4CF',\n },\n fill: {\n bg: '#00BC7D',\n text: '#FFFFFF',\n }\n },\n Red: {\n light: {\n bg: '#FEF2F2',\n text: '#9F0712',\n border: '#FFC9C9',\n },\n fill: {\n bg: '#FB2C36',\n text: '#FFFFFF',\n }\n },\n Orange: {\n light: {\n bg: '#FFF6ED',\n text: '#9B2911',\n border: '#FFD1A9',\n },\n fill: {\n bg: '#FB6011',\n text: '#FFFFFF',\n }\n },\n Cyan: {\n light: {\n bg: '#ECFEFF',\n text: '#005F78',\n border: '#A2F4FD',\n },\n fill: {\n bg: '#00B8DB',\n text: '#FFFFFF',\n }\n },\n Violet: {\n light: {\n bg: '#F5F3FF',\n text: '#5D0EC0',\n border: '#DDD6FF',\n },\n fill: {\n bg: '#8E51FF',\n text: '#FFFFFF',\n }\n },\n Pink: {\n light: {\n bg: '#FDF2F8',\n text: '#A3004C',\n border: '#FCCEE8',\n },\n fill: {\n bg: '#F6339A',\n text: '#FFFFFF',\n }\n },\n Gray: {\n light: {\n bg: '#F5F5F4',\n text: '#292524',\n border: '#E7E5E4',\n },\n fill: {\n bg: '#292524',\n text: '#FFFFFF',\n }\n },\n Yellow: {\n light: {\n bg: '#FFFBEB',\n text: '#973C00',\n border: '#FEE685',\n },\n fill: {\n bg: '#FE9A00',\n text: '#FFFFFF',\n }\n },\n Blue: {\n light: {\n bg: '#EFF6FF',\n text: '#193CB8',\n border: '#BEDBFF',\n },\n fill: {\n bg: '#2B7FFF',\n text: '#FFFFFF',\n }\n }\n};\n\n// 尺寸配置\nconst SIZE_CONFIG = {\n large: {\n padding: 'px-2 py-0.5',\n textSize: 'text-sm',\n iconSize: 'w-4 h-4',\n gap: 'gap-1',\n },\n small: {\n padding: 'px-2 py-0.5', // 与 large 相同的外层 padding\n textSize: 'text-xs',\n iconSize: 'w-3 h-3',\n gap: 'gap-0.5',\n }\n};\n\n// 获取颜色配置的函数\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的配置\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n // 如果是 Orange 颜色,使用主题色\n if (color === 'Orange' && primaryColor) {\n return {\n ...config,\n fill: {\n ...config.fill,\n bg: primaryColor,\n },\n };\n }\n return config;\n }\n \n // 如果是自定义颜色(十六进制),生成配置\n if (typeof color === 'string' && color.startsWith('#')) {\n // 将十六进制转换为 RGB 值\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n return {\n light: {\n bg: `rgba(${r}, ${g}, ${b}, 0.1)`, // 10% 透明度\n text: color,\n border: `rgba(${r}, ${g}, ${b}, 0.3)`, // 30% 透明度\n },\n fill: {\n bg: color,\n text: '#FFFFFF',\n }\n };\n }\n \n // 默认返回绿色配置\n return COLOR_CONFIG.Green;\n};\n\n// 获取图标颜色的函数\nconst getIconColor = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的图标颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#009966';\n case 'Red': return '#E7000B';\n case 'Orange': return primaryColor || '#E17100'; // 使用主题色\n case 'Blue': return '#155DFC';\n case 'Yellow': return '#EC470A';\n case 'Cyan': return '#0092B8';\n case 'Violet': return '#7F22FE';\n case 'Pink': return '#E60076';\n case 'Gray': return '#57534D';\n default: return '#009966';\n }\n }\n \n // 如果是自定义颜色,返回原色\n if (typeof color === 'string' && color.startsWith('#')) {\n return color;\n }\n \n return '#009966';\n};\n\n// 获取边框颜色的函数\nconst getOutlineColor = (color: TagColor) => {\n // 如果是预定义颜色,返回对应的边框颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#A4F4CF';\n case 'Red': return '#FFC9C9';\n case 'Orange': return '#FFD1A9';\n case 'Blue': return '#BEDBFF';\n case 'Yellow': return '#FFD1A9';\n case 'Cyan': return '#A2F4FD';\n case 'Violet': return '#DDD6FF';\n case 'Pink': return '#FCCEE8';\n case 'Gray': return '#E7E5E4';\n default: return '#A4F4CF';\n }\n }\n \n // 如果是自定义颜色,返回带透明度的颜色\n if (typeof color === 'string' && color.startsWith('#')) {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n return `rgba(${r}, ${g}, ${b}, 0.3)`; // 30% 透明度\n }\n \n return '#A4F4CF';\n};\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'large',\n stroke = false,\n icon,\n iconPosition = 'none',\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const colorConfig = getColorConfig(color, primaryColor);\n const sizeConfig = SIZE_CONFIG[size];\n \n // 构建基础样式对象\n const baseStyle: React.CSSProperties = {\n borderRadius: '0.375rem', // rounded-md\n display: 'inline-flex',\n justifyContent: 'start',\n alignItems: 'center',\n padding: '2px 8px', // px-2 py-0.5 (所有尺寸都相同)\n gap: size === 'large' ? '4px' : '2px', // gap-1 or gap-0.5\n fontWeight: 500, // font-medium\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: size === 'large' ? '1.375' : '1', // leading-snug or leading-none\n transition: 'all 0.2s',\n fontSize: size === 'large' ? '14px' : '12px', // text-sm or text-xs\n height: size === 'small' ? '20px' : '24px', // Small 尺寸 20px,Large 尺寸 24px\n };\n\n // 根据变体和颜色添加样式\n if (variant === 'light') {\n baseStyle.backgroundColor = colorConfig.light.bg;\n baseStyle.color = colorConfig.light.text;\n if (stroke) {\n // 使用 outline 样式而不是 border\n baseStyle.outline = '1px solid';\n baseStyle.outlineOffset = '-1px';\n // 根据颜色设置 outline 颜色\n baseStyle.outlineColor = getOutlineColor(color);\n }\n }\n\n // 添加点击样式\n if (onClick) {\n baseStyle.cursor = 'pointer';\n baseStyle.opacity = '1';\n }\n\n // 构建类名\n const baseClasses = [\n 'rounded-md',\n 'inline-flex',\n 'justify-start',\n 'items-center',\n sizeConfig.padding,\n sizeConfig.gap,\n 'font-medium',\n 'font-dm-sans',\n size === 'large' ? 'leading-snug' : 'leading-none',\n 'transition-colors',\n 'duration-200',\n size === 'small' ? 'h-5' : 'h-6' // Small 尺寸 20px,Large 尺寸 24px\n ].filter(Boolean); // 过滤掉空字符串\n\n // 为 fill 变体添加样式\n if (variant === 'fill') {\n baseStyle.backgroundColor = colorConfig.fill.bg;\n baseStyle.color = colorConfig.fill.text;\n }\n\n if (onClick) {\n baseClasses.push('cursor-pointer', 'hover:opacity-80');\n }\n\n if (className) {\n baseClasses.push(className);\n }\n\n const containerClasses = baseClasses.join(' ');\n\n // 渲染图标\n const renderIcon = () => {\n if (!icon) return null;\n \n // 根据颜色设置图标颜色\n const iconColor = getIconColor(color, primaryColor);\n \n // 根据尺寸设置图标大小\n const iconSize = size === 'small' ? '14px' : '16px';\n \n return (\n <div className=\"flex items-center justify-center\" style={{ width: iconSize, height: iconSize }}>\n {icon.type === 'svg' ? (\n React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: iconSize,\n height: iconSize,\n style: { fill: iconColor }\n })\n ) : (\n icon\n )}\n </div>\n );\n };\n\n // 渲染文本内容\n const renderContent = () => {\n return (\n <div className=\"px-1 flex justify-center items-center\">\n <div className={`justify-center ${sizeConfig.textSize} font-medium font-dm-sans ${size === 'large' ? 'leading-snug' : 'leading-none'}`}>\n {children}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={containerClasses}\n style={baseStyle}\n onClick={onClick}\n {...rest}\n >\n {iconPosition === 'leading' && renderIcon()}\n {renderContent()}\n {iconPosition === 'after' && renderIcon()}\n </div>\n );\n};\n\nexport default Tag;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(updatePosition);\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen, filteredOptions.length]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (item: number | string): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type={isActive ? \"primary\" : \"default\"}\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: isActive ? `1px solid ${primaryColor}` : undefined,\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n OK\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n}) => {\n const { primaryColor } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const isChecked = checked || indeterminate;\n const backgroundColor = disabled\n ? '#FAFAF9'\n : isChecked\n ? primaryColor\n : 'white';\n const borderColor = disabled ? '#FAFAF9' : isChecked ? primaryColor : '#D7D3D0';\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '4px', // spacing-sm 通常是 4px\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n opacity: isChecked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n }}\n >\n {indeterminate ? (\n <MinusIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n ) : (\n <CheckIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n )}\n </div>\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"checkbox\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate;\n }}\n onChange={onChange}\n disabled={disabled}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity={0.3}\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n);\n\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n innerClassName?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染空状态 ====================\n const renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset, renderEmpty]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={innerClassName}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n};\n\nexport default Table;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked, value },\n currentTarget: { checked: !checked, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const backgroundColor = disabled\n ? '#FAFAF9'\n : checked\n ? primaryColor\n : 'white';\n const borderColor = disabled \n ? '#FAFAF9' \n : checked \n ? primaryColor \n : '#D7D3D0';\n\n return (\n <div\n className={`aha-radio ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '50%',\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: '8px',\n height: '8px',\n minWidth: '8px',\n minHeight: '8px',\n borderRadius: '50%',\n backgroundColor: 'white',\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"radio\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n value={value}\n name={name}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '0px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n textareaRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize]);\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 预设日期范围列表(仅在范围模式下有效) */\n presetRanges?: PresetRange[] | boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\n });\n }\n };\n\n updatePosition();\n\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n // 关闭时重置标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n }\n }, [isOpen]);\n\n // 点击外部关闭\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n // 清空后,只有在日历关闭时才重置月份为当前月份\n // 如果日历是打开的,保持当前显示的月份不变\n if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 默认预设日期范围\n const defaultPresetRanges = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n \n // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes dropdownFadeInTop {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : (currentRangeValue.startDate || currentRangeValue.endDate) ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n ) : (\n // 范围模式:显示两个输入框\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n )\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\n </div>\n\n {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 显示选中的日期段(单月模式,在月份导航下面) */}\n {isRangeMode && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFieldsState] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={setItemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 菜单项右侧图标 */\n suffixIcon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\n updatePosition();\n });\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow:\n \"0px 2px 2px -1px var(--ColorsEffectsShadowsshadow-lg03), 0px 4px 6px -2px var(--ColorsEffectsShadowsshadow-lg02), 0px 12px 16px -4px var(--ColorsEffectsShadowsshadow-lg01)\",\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = 'var(--theme-color, #5A31F0)',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\n"],"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","ThemeProvider","_a","theme","children","themeValue","useMemo","_jsx","Provider","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","size","color","_jsxs","_Fragment","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","Alert","title","description","showIcon","closeable","action","onClose","visible","setVisible","handleClose","hasRightSlot","onKeyDown","key","role","tabIndex","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","showClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","useCallback","handleClick","maxWidth","background","transform","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","Toast","ensureToastContainer","closeToast","clearAllToasts","debugToast","window","document","getElementById","toastContainerRoot","isInitializing","toastSuccess","options","toastError","toastInfo","toastQuestion","toastContainerElement","existingContainer","createElement","appendChild","createRoot","require","render","import","catch","warn","ToastProvider","mounted","setMounted","createPortal","COLOR_CONFIG","Green","light","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","SIZE_CONFIG","textSize","Tag","variant","colorConfig","config","startsWith","hex","replace","parseInt","substr","getColorConfig","sizeConfig","baseStyle","outlineOffset","outlineColor","getOutlineColor","baseClasses","containerClasses","getIconColor","React","cloneElement","Input","forwardRef","ref","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onChange","onFocus","onBlur","onPressEnter","restProps","inputRef","useRef","internalValue","setInternalValue","setFocused","current","isControlled","undefined","currentValue","handleClear","target","focus","showClear","sizeStyles","paddingTop","paddingBottom","baseStyles","boxSizing","WebkitAppearance","MozAppearance","appearance","autoComplete","autoCorrect","autoCapitalize","spellCheck","strokeLinejoin","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","includes","getFilteredOptions","String","toLowerCase","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","flexWrap","tagProps","closable","Fragment","textOverflow","marginLeft","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","minHeight","val","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","index","isSelected","isFocused","selected","CheckIcon","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onShowSizeChange","simple","hideOnSinglePage","responsive","showLessItems","itemRender","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpToPage","setJumpToPage","totalPages","ceil","handlePageChange","page","handleJumpTo","margin","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","Checkbox","checked","indeterminate","isChecked","borderColor","el","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Table","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","innerClassName","expandable","rowClassName","onHeaderRow","sticky","loadingSpinColor","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","_v","currentPage","setCurrentPage","_w","setPageSize","_x","draggedRowIndex","setDraggedRowIndex","_y","dragOverRowIndex","setDragOverRowIndex","_z","isMobile","setIsMobile","tableRef","headerRef","checkMobile","innerWidth","checkboxProps","getCheckboxProps","newSelectedRowKeys","k","selectedRows","Event","handleSelectAll","currentPageData","keys","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","newSorters","set","sorterArray","entries","c","field","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","emptyContent","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","_i","state_1","processedData","isServerPagination","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","offset","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","borderBottom","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","some","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","x","sum","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","marginBottom","displayValue","scrollContainerStyle","overflowX","overflowY","Radio","name","Tab","items","layout","scrollable","normalizedItems","firstItem","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","isNaN","initialValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","underlineRef","containerRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","inline","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","updateBackgroundSliderPosition","firstKey_2","container","scrollTimeout_2","updatePosition_2","handleScroll_2","containerStyle","scrollBehavior","scrollbarWidth","itemKey","itemKeyType","currentValueType","iconType","isReactElement","isValidElement","iconValue","badge","customElement","itemStyle","renderBackgroundStyle","Progress","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","round","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","thumbSize","thumbOffset","thumbLeft","newChecked","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","RegExp","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","showSelectedRange","startSelectedRangeText","endSelectedRangeText","rangeDisplayMode","isRangeMode","internalSingleValue","setInternalSingleValue","_0","startDate","endDate","internalRangeValue","setInternalRangeValue","_1","_2","selectingStart","setSelectingStart","_3","tempRangeValue","setTempRangeValue","_4","range","now","currentMonth","setCurrentMonth","_5","nextMonth","secondMonth","setSecondMonth","pickerRef","startInputRef","endInputRef","_6","hasOpenedRef","placementDeterminedRef","determinedPlacementRef","currentSingleValue","currentRangeValue","dateYear","dateMonth","rect_1","placement_1","dropdownHeight","top_2","placement_2","calculatePosition_1","workingRange","startText","endText","renderCalendar","handleSelectSingleDate","handleSelectRangeDate","newRange","handleToggle","defaultPresetRanges","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","presetRangesList","hasPresetRanges","handlePresetRangeSelect","startYear","startMonth","handlePrevMonth","handleNextMonth","generateCalendarData","daysInMonth","days","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","singleDisplayValue","startDisplayValue","endDisplayValue","rangeTextValue","weekDays","borderRight","borderTopLeftRadius","borderBottomLeftRadius","preset","idx","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","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","initialFields","touched","validating","fields","setFieldsState","fieldsRef","fieldElementsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldFnRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","rules_1","rule","validator","string","number","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","resetFields","setFieldsValue","allValues_2","submit","setFields","fieldsToSet","changedValues_1","registerFieldRef","scrollToField","useImperativeHandle","contextValue","formStyle","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","setItemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","showTooltip","setShowTooltip","tooltipRef","borderLeft","Children","child","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","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","skipGlobalClick","renderMenuItem","danger","suffixIcon","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","viewportHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","Tooltip","trigger","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","internalVisible","setInternalVisible","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","triggerRef","timeoutRef","hideTimeoutRef","updatePosition","finalPosition","preferredPosition","candidates_1","pos","getPositionCandidates","candidate","getAutoPosition","arrowPos","tooltipAbsoluteLeft","tooltipAbsoluteTop","getArrowPosition","hideTooltip","keepTooltipVisible","tryUpdatePosition_1","tooltipContainerStyle","calculateTooltipMaxWidth","updateMaxWidth","tooltipContentStyle","wordWrap","tooltipContent","handleTriggerMouseLeave","triggerProps","hasEnoughSpace","popoverRect","getAvailableSpace","Popover","popoverClassName","destroyOnHide","destroyTooltipOnHide","shouldDestroyOnHide","popoverStyle","setPopoverStyle","popoverRef","nextVisible","nextPlacement","oppositePlacement","getOppositePlacement","getPlacementPosition","clamped","nextTop","nextLeft","clampToViewport","openPopover","closePopover","togglePopover","triggerEvents","popoverNode","visibility","VIEWPORT_PADDING","ANIMATION_DURATION","Drawer","afterOpenChange","mask","maskClosable","closeIcon","keyboard","destroyOnClose","mobileBreakpoint","drawerStyle","headerStyle","bodyStyle","footerStyle","maskStyle","mergedOpen","shouldRender","setShouldRender","animatedOpen","setAnimatedOpen","updateMobile","raf_1","cancelAnimationFrame","previousOverflow","closeDrawer","resolvedWidth","resolvedHeight","effectivePlacement","drawerPositionStyle","base","node","curve","tag","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","petals","cos","sin","getParticle","tailOffset","normalizeProgress","fade","pow","Loading","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","pt","preserveAspectRatio"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Alert/index.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/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/Progress/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"],"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","import React, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n const hasRightSlot = action || closeable;\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div\n className={`flex flex-col gap-1 ${hasRightSlot ? \"flex-1 min-w-0\" : \"\"}`}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n </div>\n {hasRightSlot && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n {closeable && (\n <div\n className=\"cursor-pointer relative top-[-12px]\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TagColor =\n | 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet'\n | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\n\nexport type TagVariant = 'light' | 'fill';\n\n/** sm/md/lg are the canonical sizes; large/small are legacy aliases */\nexport type TagSize = 'sm' | 'md' | 'lg' | 'large' | 'small';\n\n/** Leading icon variant */\nexport type TagIconType = 'none' | 'dot' | 'avatar' | 'icon';\n\n/** Right-side action */\nexport type TagAction = 'none' | 'x-close' | 'count';\n\n/** @deprecated Use iconType instead */\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color?: TagColor;\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean;\n // Icon variants (mutually exclusive; avatar takes precedence over icon)\n iconType?: TagIconType;\n icon?: React.ReactElement;\n avatarSrc?: string;\n dotColor?: string;\n // Action variants\n action?: TagAction;\n count?: number;\n onClose?: () => void;\n // Checkbox variant\n checkbox?: boolean;\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated use iconType='icon' */\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// ─── Color Configs ────────────────────────────────────────────────────────────\n\nconst COLOR_CONFIG = {\n Green: { light: { bg: '#ECFDF5', text: '#006045', border: '#A4F4CF' }, fill: { bg: '#00BC7D', text: '#FFFFFF' } },\n Red: { light: { bg: '#FEF2F2', text: '#9F0712', border: '#FFC9C9' }, fill: { bg: '#FB2C36', text: '#FFFFFF' } },\n Orange: { light: { bg: '#FFF6ED', text: '#9B2911', border: '#FFD1A9' }, fill: { bg: '#FB6011', text: '#FFFFFF' } },\n Cyan: { light: { bg: '#ECFEFF', text: '#005F78', border: '#A2F4FD' }, fill: { bg: '#00B8DB', text: '#FFFFFF' } },\n Violet: { light: { bg: '#F5F3FF', text: '#5D0EC0', border: '#DDD6FF' }, fill: { bg: '#8E51FF', text: '#FFFFFF' } },\n Pink: { light: { bg: '#FDF2F8', text: '#A3004C', border: '#FCCEE8' }, fill: { bg: '#F6339A', text: '#FFFFFF' } },\n Gray: { light: { bg: '#F5F5F4', text: '#292524', border: '#E7E5E4' }, fill: { bg: '#292524', text: '#FFFFFF' } },\n Yellow: { light: { bg: '#FFFBEB', text: '#973C00', border: '#FEE685' }, fill: { bg: '#FE9A00', text: '#FFFFFF' } },\n Blue: { light: { bg: '#EFF6FF', text: '#193CB8', border: '#BEDBFF' }, fill: { bg: '#2B7FFF', text: '#FFFFFF' } },\n};\n\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n if (color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n if (color === 'Orange' && primaryColor) {\n return { ...config, fill: { ...config.fill, bg: primaryColor } };\n }\n return config;\n }\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return {\n light: { bg: `rgba(${r},${g},${b},0.1)`, text: color, border: `rgba(${r},${g},${b},0.3)` },\n fill: { bg: color, text: '#FFFFFF' },\n };\n }\n return COLOR_CONFIG.Gray;\n};\n\nconst getIconColor = (color: TagColor, primaryColor?: string): string => {\n const map: Record<string, string> = {\n Green: '#009966', Red: '#E7000B', Orange: primaryColor || '#E17100',\n Blue: '#155DFC', Yellow: '#EC470A', Cyan: '#0092B8',\n Violet: '#7F22FE', Pink: '#E60076', Gray: '#57534D',\n };\n return map[color] ?? (color.startsWith('#') ? color : '#57534D');\n};\n\nconst getOutlineColor = (color: TagColor): string => {\n const map: Record<string, string> = {\n Green: '#A4F4CF', Red: '#FFC9C9', Orange: '#FFD1A9',\n Blue: '#BEDBFF', Yellow: '#FFD1A9', Cyan: '#A2F4FD',\n Violet: '#DDD6FF', Pink: '#FCCEE8', Gray: '#E7E5E4',\n };\n if (color in map) return map[color];\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return `rgba(${r},${g},${b},0.3)`;\n }\n return '#E7E5E4';\n};\n\n// ─── Size Config ──────────────────────────────────────────────────────────────\n// Values derived from Figma design (node 3307:417515)\n\ntype NSize = 'sm' | 'md' | 'lg';\n\nconst normalizeSize = (size: TagSize): NSize => {\n if (size === 'large') return 'lg';\n if (size === 'small') return 'sm';\n return size as NSize;\n};\n\nconst SIZE = {\n sm: {\n // Base padding: px-8px py-3px (h=24px with lh-18px)\n basePx: 8, basePy: 3,\n // Left padding adjustments per leading element (checkbox wins over icon)\n plCheckbox: 5, plAvatar: 4, plDot: 6, plIcon: 4,\n // Right padding adjustments per action\n prClose: 4, prCount: 4,\n fontSize: 12, lineHeight: '18px', height: 24,\n avatarSize: 16, checkboxSize: 14,\n contentGap: 4, rootGap: 3,\n countPx: 4, countFontSize: 12,\n closeSize: 10, closePad: 2,\n },\n md: {\n // Base padding: px-9px py-2px (h=24px with lh-20px)\n basePx: 9, basePy: 2,\n plCheckbox: 4, plAvatar: 5, plDot: 7, plIcon: 5,\n prClose: 4, prCount: 3,\n fontSize: 14, lineHeight: '20px', height: 24,\n avatarSize: 16, checkboxSize: 16,\n contentGap: 5, rootGap: 4,\n countPx: 5, countFontSize: 12,\n closeSize: 12, closePad: 2,\n },\n lg: {\n // Base padding: px-10px py-4px (h=28px with lh-20px)\n basePx: 10, basePy: 4,\n plCheckbox: 5, plAvatar: 7, plDot: 9, plIcon: 7,\n prClose: 4, prCount: 4,\n fontSize: 14, lineHeight: '20px', height: 28,\n avatarSize: 18, checkboxSize: 18,\n contentGap: 6, rootGap: 4,\n countPx: 6, countFontSize: 14,\n closeSize: 14, closePad: 3,\n },\n} as const;\n\n// ─── TagAvatar ────────────────────────────────────────────────────────────────\n\nexport interface TagAvatarProps {\n src?: string;\n alt?: string;\n size?: number;\n}\n\nexport const TagAvatar: React.FC<TagAvatarProps> = ({ src, alt = 'Avatar', size = 16 }) => {\n const [failed, setFailed] = useState(false);\n return (\n <div\n style={{\n width: size, height: size, borderRadius: '50%',\n overflow: 'hidden', flexShrink: 0,\n border: '0.667px solid rgba(0,0,0,0.08)',\n background: '#e5e5e4',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n >\n {src && !failed ? (\n <img\n src={src} alt={alt}\n onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <svg\n width={size * 0.625} height={size * 0.625}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <circle cx=\"5\" cy=\"3.5\" r=\"2\" stroke=\"#999\" strokeWidth=\"1.2\" />\n <path d=\"M1 9.5c0-2.2 1.8-4 4-4s4 1.8 4 4\" stroke=\"#999\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </div>\n );\n};\n\n// ─── Tag ──────────────────────────────────────────────────────────────────────\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'md',\n stroke = false,\n iconType: iconTypeProp,\n icon,\n avatarSrc,\n dotColor,\n action = 'none',\n count,\n onClose,\n checkbox = false,\n checked: checkedProp,\n onCheckedChange,\n iconPosition,\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [internalChecked, setInternalChecked] = useState(false);\n\n const nSize = normalizeSize(size);\n const s = SIZE[nSize];\n\n // Controlled/uncontrolled checkbox\n const isChecked = checkedProp !== undefined ? checkedProp : internalChecked;\n const handleCheckboxToggle = (e: React.MouseEvent) => {\n e.stopPropagation();\n const next = !isChecked;\n if (checkedProp === undefined) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n // Resolve icon type; backward-compat: legacy iconPosition='leading' → iconType='icon'\n const iconType: TagIconType =\n iconTypeProp ??\n (icon && iconPosition === 'leading' ? 'icon' : 'none');\n\n const hasLeading = iconType !== 'none';\n const effectiveAction = action !== 'none' ? action : undefined;\n\n // Compute left padding (checkbox wins > dot > avatar/icon > base)\n const pl = checkbox ? s.plCheckbox\n : iconType === 'dot' ? s.plDot\n : iconType === 'avatar' || iconType === 'icon' ? s.plAvatar\n : s.basePx;\n\n // Compute right padding\n const pr = effectiveAction === 'x-close' ? s.prClose\n : effectiveAction === 'count' ? s.prCount\n : s.basePx;\n\n // Base neutral style matching Figma (white bg + gray border)\n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: effectiveAction === 'x-close' ? s.rootGap : 0,\n paddingLeft: pl,\n paddingRight: pr,\n paddingTop: s.basePy,\n paddingBottom: s.basePy,\n height: s.height,\n borderRadius: 6,\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 500,\n fontSize: s.fontSize,\n lineHeight: s.lineHeight,\n transition: 'all 0.2s',\n cursor: onClick ? 'pointer' : 'default',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n color: '#44403c',\n // Inset outline matches Figma: outline-1 outline-offset-[-1px]\n outline: '1px solid #d7d3d0',\n outlineOffset: '-1px',\n };\n\n // Optional color override (keeps backward compat with color prop)\n if (color) {\n const colorConfig = getColorConfig(color, primaryColor);\n if (variant === 'light') {\n containerStyle.backgroundColor = colorConfig.light.bg;\n containerStyle.color = colorConfig.light.text;\n containerStyle.outline = stroke ? `1px solid ${getOutlineColor(color)}` : 'none';\n containerStyle.outlineOffset = stroke ? '-1px' : undefined;\n } else {\n containerStyle.backgroundColor = colorConfig.fill.bg;\n containerStyle.color = colorConfig.fill.text;\n containerStyle.outline = 'none';\n }\n }\n\n if (onClick) {\n containerStyle.cursor = 'pointer';\n }\n\n // Leading icon element\n const renderLeadingIcon = () => {\n if (iconType === 'avatar') {\n return <TagAvatar src={avatarSrc} size={s.avatarSize} />;\n }\n if (iconType === 'dot') {\n return (\n <svg width={8} height={8} viewBox=\"0 0 8 8\" fill=\"none\" style={{ flexShrink: 0 }}>\n <circle cx={4} cy={4} r={3.5} fill={dotColor || 'currentColor'} />\n </svg>\n );\n }\n if (iconType === 'icon' && icon) {\n return (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: s.avatarSize,\n height: s.avatarSize,\n })}\n </span>\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={containerStyle}\n onClick={onClick}\n {...rest}\n >\n {/* Content row: checkbox + icon + text + count */}\n <div style={{ display: 'flex', alignItems: 'center', gap: s.contentGap, flexShrink: 0 }}>\n {/* Checkbox */}\n {checkbox && (\n <div\n role=\"checkbox\"\n aria-checked={isChecked}\n onClick={handleCheckboxToggle}\n style={{\n width: s.checkboxSize, height: s.checkboxSize,\n borderRadius: 4, flexShrink: 0,\n border: isChecked ? 'none' : '1px solid #d7d3d0',\n background: isChecked ? (primaryColor || '#7F56D9') : '#ffffff',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n cursor: 'pointer',\n }}\n >\n {isChecked && (\n <svg\n width={Math.round(s.checkboxSize * 0.65)}\n height={Math.round(s.checkboxSize * 0.65)}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M8.5 2L4 7.5 1.5 5\" stroke=\"#fff\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )}\n\n {/* Leading icon (avatar / dot / generic icon) */}\n {renderLeadingIcon()}\n\n {/* Text label */}\n <span style={{ whiteSpace: 'nowrap' }}>{children}</span>\n\n {/* Count badge */}\n {effectiveAction === 'count' && typeof count === 'number' && (\n <span style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n paddingLeft: s.countPx, paddingRight: s.countPx,\n paddingTop: 1, paddingBottom: 1,\n background: 'rgba(0,0,0,0.07)',\n borderRadius: 3,\n fontSize: s.countFontSize,\n fontWeight: 500,\n lineHeight: '16px',\n flexShrink: 0,\n }}>\n {count}\n </span>\n )}\n </div>\n\n {/* Close X (outside content row, right side) */}\n {effectiveAction === 'x-close' && (\n <button\n aria-label=\"Remove\"\n onClick={(e) => { e.stopPropagation(); onClose?.(); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: s.closePad, borderRadius: 3,\n border: 'none', background: 'transparent',\n cursor: 'pointer', flexShrink: 0,\n color: 'inherit', opacity: 0.55,\n lineHeight: 0,\n }}\n >\n <svg width={s.closeSize} height={s.closeSize} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.5 2.5l-5 5M2.5 2.5l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n\n {/* Legacy: icon rendered after text when iconPosition='after' */}\n {iconPosition === 'after' && icon && !iconTypeProp && (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0, marginLeft: s.contentGap }}>\n {icon}\n </span>\n )}\n </div>\n );\n};\n\nexport default Tag;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(updatePosition);\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen, filteredOptions.length]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (item: number | string): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type={isActive ? \"primary\" : \"default\"}\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: isActive ? `1px solid ${primaryColor}` : undefined,\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n OK\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React, { useState } from 'react';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const isActive = checked || indeterminate;\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled) return;\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const iconSize = size === 'sm' ? '12px' : '14px';\n const borderRadius = size === 'sm' ? 'var(--radius-xs, 4px)' : 'var(--radius-sm, 6px)';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (isActive) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (isActive) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n // Disabled active: use muted icon so it's visible on the light bg\n const iconColor = disabled && isActive\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n const hasLabel = children || hint;\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Checkbox box */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius,\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Indeterminate dash */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n\n {/* Check mark */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: checked && !indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity={0.3}\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n);\n\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n innerClassName?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染空状态 ====================\n const renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset, renderEmpty]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={innerClassName}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n};\n\nexport default Table;\n\n","import React, { useState } from 'react';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled || checked) return;\n const syntheticEvent = {\n target: { checked: true, value },\n currentTarget: { checked: true, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const dotSize = size === 'sm' ? '6px' : '8px';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (checked) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (checked) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n const hasLabel = children || hint;\n\n // Disabled checked: use muted dot color so it's visible on the light bg\n const dotColor = disabled && checked\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n return (\n <div\n className={`aha-radio ${className}`}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Radio circle */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius: '50%',\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Inner dot */}\n <div\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: '50%',\n backgroundColor: dotColor,\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n flexShrink: 0,\n }}\n />\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '0px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React, { forwardRef, useRef, useEffect, useMemo, useLayoutEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\ninterface LinkifyOptions {\n validate?: (url: string) => boolean;\n className?: string;\n needProtocol?: boolean;\n needHost?: boolean;\n allowedTlds?: string[];\n}\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 是否启用实时链接识别 */\n linkify?: boolean;\n /** 链接识别配置 */\n linkifyOptions?: LinkifyOptions;\n}\n\ntype TextToken =\n | { type: 'text'; text: string }\n | { type: 'url'; text: string; href: string };\n\nconst DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$/;\nconst URL_CANDIDATE_REGEX =\n /(https?:\\/\\/[^\\s<]+|www\\.[^\\s<]+|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/[^\\s<]*)?)/gi;\nconst DEFAULT_ALLOWED_TLDS = new Set([\n 'com',\n 'cn',\n 'net',\n 'org',\n 'io',\n 'co',\n 'edu',\n 'gov',\n 'ai',\n 'app',\n 'dev',\n 'me',\n 'info',\n 'biz',\n 'tech',\n 'cc',\n 'tv',\n 'xyz',\n 'top',\n 'vip',\n 'pro',\n 'store',\n 'site',\n 'online',\n 'cloud',\n]);\n\nexport const websiteValidator = (\n url: string,\n needProtocol: boolean = true,\n needHost: boolean = true,\n allowedTlds?: string[]\n): boolean => {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (!trimmed) return false;\n\n const hasProtocol = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(trimmed);\n if (needProtocol && !hasProtocol) return false;\n\n const normalized = hasProtocol ? trimmed : `https://${trimmed}`;\n\n try {\n const parsed = new URL(normalized);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'http:' && protocol !== 'https:') return false;\n\n if (needHost) {\n const host = parsed.hostname.toLowerCase();\n if (!host) return false;\n if (host === 'localhost') return true;\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host)) {\n return host.split('.').every((segment) => {\n const num = Number(segment);\n return Number.isInteger(num) && num >= 0 && num <= 255;\n });\n }\n if (!DOMAIN_REGEX.test(host)) return false;\n const tld = host.split('.').pop() || '';\n const tldSet = allowedTlds\n ? new Set(allowedTlds.map((item) => item.toLowerCase()))\n : DEFAULT_ALLOWED_TLDS;\n if (!tldSet.has(tld)) return false;\n }\n return true;\n } catch {\n return false;\n }\n};\n\nconst trimTrailingPunctuation = (value: string): { core: string; suffix: string } => {\n const match = value.match(/^(.*?)([),.;!?]+)?$/);\n return {\n core: match?.[1] || value,\n suffix: match?.[2] || '',\n };\n};\n\nconst tokenizeText = (\n text: string,\n options?: LinkifyOptions\n): TextToken[] => {\n if (!text) return [];\n\n const tokens: TextToken[] = [];\n let lastIndex = 0;\n const regex = new RegExp(URL_CANDIDATE_REGEX);\n let match = regex.exec(text);\n\n while (match) {\n const matchedText = match[0];\n const start = match.index;\n const end = start + matchedText.length;\n\n if (start > lastIndex) {\n tokens.push({ type: 'text', text: text.slice(lastIndex, start) });\n }\n\n const { core, suffix } = trimTrailingPunctuation(matchedText);\n const href = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(core)\n ? core\n : `https://${core}`;\n const defaultIsValid = websiteValidator(\n core,\n options?.needProtocol ?? false,\n options?.needHost ?? true,\n options?.allowedTlds\n );\n const isValid = options?.validate ? options.validate(href) : defaultIsValid;\n\n if (isValid && core) {\n tokens.push({ type: 'url', text: core, href });\n if (suffix) {\n tokens.push({ type: 'text', text: suffix });\n }\n } else {\n tokens.push({ type: 'text', text: matchedText });\n }\n\n lastIndex = end;\n match = regex.exec(text);\n }\n\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', text: text.slice(lastIndex) });\n }\n\n return tokens;\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n\nconst ZWSP = '\\u200B';\nconst stripEditorArtifacts = (value: string): string =>\n value.replace(new RegExp(ZWSP, 'g'), '');\n\nconst renderTokensAsHtml = (\n text: string,\n options?: LinkifyOptions,\n disabled?: boolean\n): string => {\n const tokens = tokenizeText(text, options);\n if (tokens.length === 0) return '';\n\n const html = tokens\n .map((token) => {\n if (token.type === 'text') {\n return escapeHtml(token.text);\n }\n\n const classAttr = options?.className ? ` class=\"${options.className}\"` : '';\n const pointerEvents = disabled ? 'pointer-events: none;' : '';\n return `<a href=\"${escapeHtml(token.href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${classAttr} style=\"color: #2563EB; text-decoration: underline; ${pointerEvents}\">${escapeHtml(token.text)}</a>`;\n })\n .join('');\n\n // contentEditable 在末尾是换行时可能吞掉视觉换行,补一个零宽字符占位\n if (text.endsWith('\\n')) {\n return `${html}<span data-aha-zwsp=\"true\">${ZWSP}</span>`;\n }\n return html;\n};\n\nconst getCaretOffset = (container: HTMLElement): number => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return 0;\n\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer)) return 0;\n\n const preRange = range.cloneRange();\n preRange.selectNodeContents(container);\n preRange.setEnd(range.startContainer, range.startOffset);\n return stripEditorArtifacts(preRange.toString()).length;\n};\n\nconst setCaretOffset = (container: HTMLElement, offset: number): void => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (!selection) return;\n\n let remaining = Math.max(0, offset);\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let currentNode = walker.nextNode();\n\n while (currentNode) {\n const rawText = currentNode.textContent || '';\n let visibleCount = 0;\n let targetOffsetInNode = -1;\n for (let i = 0; i < rawText.length; i += 1) {\n if (rawText[i] !== ZWSP) {\n visibleCount += 1;\n }\n if (visibleCount === remaining) {\n targetOffsetInNode = i + 1;\n break;\n }\n }\n\n if (remaining === 0) {\n range.setStart(currentNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n if (targetOffsetInNode !== -1) {\n range.setStart(currentNode, targetOffsetInNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n remaining -= visibleCount;\n currentNode = walker.nextNode();\n }\n\n range.selectNodeContents(container);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n};\n\nconst getSelectionOffsets = (\n container: HTMLElement\n): { start: number; end: number } | null => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer) || !container.contains(range.endContainer)) {\n return null;\n }\n\n const startRange = range.cloneRange();\n startRange.selectNodeContents(container);\n startRange.setEnd(range.startContainer, range.startOffset);\n\n const endRange = range.cloneRange();\n endRange.selectNodeContents(container);\n endRange.setEnd(range.endContainer, range.endOffset);\n\n return {\n start: stripEditorArtifacts(startRange.toString()).length,\n end: stripEditorArtifacts(endRange.toString()).length,\n };\n};\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n linkify = false,\n linkifyOptions,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const isComposingRef = useRef(false);\n const caretOffsetRef = useRef<number | null>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref(仅原生 textarea 模式)\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(linkify ? null : textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n linkify ? null : textareaRef.current;\n }\n }, [ref, linkify]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const getMaxLengthValue = useMemo(\n () => (typeof maxLength === 'number' ? maxLength : undefined),\n [maxLength]\n );\n\n // 自动调整高度(原生 textarea)\n useEffect(() => {\n if (!linkify && autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize, linkify]);\n\n // 自动调整高度(linkify + contentEditable)\n useEffect(() => {\n if (!linkify || !autoSize || !editableRef.current) return;\n const editable = editableRef.current;\n const minRows = typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows = typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n const lineHeight = parseInt(\n window.getComputedStyle(editable).lineHeight || '24',\n 10\n );\n const minHeight = minRows * lineHeight + 24;\n const maxHeight = maxRows ? maxRows * lineHeight + 24 : undefined;\n\n editable.style.height = 'auto';\n let newHeight = Math.max(editable.scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n editable.style.height = `${newHeight}px`;\n editable.style.overflowY = maxHeight && editable.scrollHeight > maxHeight ? 'auto' : 'hidden';\n setHeight(newHeight);\n }, [autoSize, currentValue, linkify]);\n\n useLayoutEffect(() => {\n if (!linkify || !editableRef.current || isComposingRef.current) return;\n const editable = editableRef.current;\n const isActive = document.activeElement === editable;\n const fallbackOffset = isActive ? getCaretOffset(editable) : 0;\n const caretOffset = caretOffsetRef.current ?? fallbackOffset;\n const nextHtml = renderTokensAsHtml(\n String(currentValue || ''),\n linkifyOptions,\n disabled\n );\n\n if (editable.innerHTML !== nextHtml) {\n editable.innerHTML = nextHtml;\n }\n\n if (isActive) {\n const maxOffset = String(currentValue || '').length;\n setCaretOffset(editable, Math.min(caretOffset, maxOffset));\n }\n caretOffsetRef.current = null;\n }, [currentValue, disabled, linkify, linkifyOptions]);\n\n const notifyChange = (nextValue: string) => {\n const syntheticEvent = {\n target: { value: nextValue },\n currentTarget: { value: nextValue },\n } as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleEditableInput = () => {\n if (!editableRef.current || isComposingRef.current) return;\n caretOffsetRef.current = getCaretOffset(editableRef.current);\n const rawValue = stripEditorArtifacts(editableRef.current.textContent || '');\n const nextValue = getMaxLengthValue ? rawValue.slice(0, getMaxLengthValue) : rawValue;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n notifyChange(nextValue);\n };\n\n const handleEditablePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (readOnly || disabled) return;\n\n const pastedText = e.clipboardData.getData('text/plain');\n const currentText = String(currentValue || '');\n const selection = window.getSelection();\n let nextText = `${currentText}${pastedText}`;\n let caretOffset = currentText.length + pastedText.length;\n\n if (\n selection &&\n selection.rangeCount > 0 &&\n editableRef.current?.contains(selection.anchorNode)\n ) {\n const startOffset = getCaretOffset(editableRef.current);\n const endOffset = (() => {\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(editableRef.current);\n preRange.setEnd(range.endContainer, range.endOffset);\n return preRange.toString().length;\n })();\n nextText =\n currentText.slice(0, startOffset) +\n pastedText +\n currentText.slice(endOffset);\n caretOffset = startOffset + pastedText.length;\n }\n\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n caretOffset = Math.min(caretOffset, nextText.length);\n }\n caretOffsetRef.current = caretOffset;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const handleEditableKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (disabled || readOnly) return;\n if (!editableRef.current) return;\n\n e.preventDefault();\n const currentText = String(currentValue || '');\n const offsets = getSelectionOffsets(editableRef.current);\n const start = offsets?.start ?? currentText.length;\n const end = offsets?.end ?? start;\n\n let nextText = `${currentText.slice(0, start)}\\n${currentText.slice(end)}`;\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n }\n\n const nextCaret = Math.min(start + 1, nextText.length);\n caretOffsetRef.current = nextCaret;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize || linkify ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n .aha-textarea-wrapper .aha-textarea-editable {\n white-space: pre-wrap;\n word-break: break-word;\n }\n .aha-textarea-wrapper .aha-textarea-editable:empty::before {\n content: attr(data-placeholder);\n color: #79716B;\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n {linkify ? (\n <div\n ref={editableRef}\n className=\"aha-textarea-editable\"\n contentEditable={!disabled && !readOnly}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-disabled={disabled}\n data-placeholder={placeholder || ''}\n onInput={handleEditableInput}\n onPaste={handleEditablePaste}\n onKeyDown={handleEditableKeyDown}\n onFocus={(e) => handleFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onBlur={(e) => handleBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n handleEditableInput();\n }}\n style={{\n ...baseStyles,\n minHeight: autoSize ? undefined : `${rows * 24 + 24}px`,\n overflowY: autoSize ? 'hidden' : 'auto',\n }}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n />\n ) : (\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n )}\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 预设日期范围列表(仅在范围模式下有效) */\n presetRanges?: PresetRange[] | boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\n });\n }\n };\n\n updatePosition();\n\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n // 关闭时重置标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n }\n }, [isOpen]);\n\n // 点击外部关闭\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n // 清空后,只有在日历关闭时才重置月份为当前月份\n // 如果日历是打开的,保持当前显示的月份不变\n if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 默认预设日期范围\n const defaultPresetRanges = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n \n // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes dropdownFadeInTop {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : (currentRangeValue.startDate || currentRangeValue.endDate) ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n ) : (\n // 范围模式:显示两个输入框\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n )\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\n </div>\n\n {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 显示选中的日期段(单月模式,在月份导航下面) */}\n {isRangeMode && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFieldsState] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={setItemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 菜单项右侧图标 */\n suffixIcon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\n updatePosition();\n });\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow:\n \"0px 2px 2px -1px var(--ColorsEffectsShadowsshadow-lg03), 0px 4px 6px -2px var(--ColorsEffectsShadowsshadow-lg02), 0px 12px 16px -4px var(--ColorsEffectsShadowsshadow-lg01)\",\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = 'var(--theme-color, #5A31F0)',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\n","import React, { useState } from 'react';\nimport type { MouseEventHandler, ReactNode } from 'react';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BadgeColor =\n | 'gray'\n | 'brand'\n | 'error'\n | 'warning'\n | 'success'\n | 'grayBlue'\n | 'blueLight'\n | 'blue'\n | 'indigo'\n | 'purple'\n | 'pink'\n | 'orange';\n\nexport type BadgeVariant = 'pill' | 'badge' | 'modern';\n\nexport type BadgeSize = 'sm' | 'md' | 'lg';\n\nexport type BadgeIconComponent = React.FC<{\n style?: React.CSSProperties;\n className?: string;\n}>;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\ninterface ColorTokens {\n bg: string;\n text: string;\n ring: string;\n dot: string;\n btnText: string;\n btnHoverBg: string;\n btnHoverText: string;\n}\n\nconst colorTokens: Record<BadgeColor, ColorTokens> = {\n gray: {\n bg: 'var(--color-gray-50)',\n text: 'var(--color-gray-700)',\n ring: 'var(--color-gray-200)',\n dot: 'var(--color-gray-500)',\n btnText: 'var(--color-gray-400)',\n btnHoverBg: 'var(--color-gray-100)',\n btnHoverText: 'var(--color-gray-500)',\n },\n brand: {\n bg: 'var(--color-brand-50)',\n text: 'var(--color-brand-700)',\n ring: 'var(--color-brand-200)',\n dot: 'var(--color-brand-500)',\n btnText: 'var(--color-brand-400)',\n btnHoverBg: 'var(--color-brand-100)',\n btnHoverText: 'var(--color-brand-500)',\n },\n error: {\n bg: 'var(--color-error-50)',\n text: 'var(--color-error-700)',\n ring: 'var(--color-error-200)',\n dot: 'var(--color-error-500)',\n btnText: 'var(--color-error-400)',\n btnHoverBg: 'var(--color-error-100)',\n btnHoverText: 'var(--color-error-500)',\n },\n warning: {\n bg: 'var(--color-warning-50)',\n text: 'var(--color-warning-700)',\n ring: 'var(--color-warning-200)',\n dot: 'var(--color-warning-500)',\n btnText: 'var(--color-warning-400)',\n btnHoverBg: 'var(--color-warning-100)',\n btnHoverText: 'var(--color-warning-500)',\n },\n success: {\n bg: 'var(--color-success-50)',\n text: 'var(--color-success-700)',\n ring: 'var(--color-success-200)',\n dot: 'var(--color-success-500)',\n btnText: 'var(--color-success-400)',\n btnHoverBg: 'var(--color-success-100)',\n btnHoverText: 'var(--color-success-500)',\n },\n grayBlue: {\n bg: 'var(--color-gray-blue-50)',\n text: 'var(--color-gray-blue-700)',\n ring: 'var(--color-gray-blue-200)',\n dot: 'var(--color-gray-blue-500)',\n btnText: 'var(--color-gray-blue-400)',\n btnHoverBg: 'var(--color-gray-blue-100)',\n btnHoverText: 'var(--color-gray-blue-500)',\n },\n blueLight: {\n bg: 'var(--color-blue-light-50)',\n text: 'var(--color-blue-light-700)',\n ring: 'var(--color-blue-light-200)',\n dot: 'var(--color-blue-light-500)',\n btnText: 'var(--color-blue-light-400)',\n btnHoverBg: 'var(--color-blue-light-100)',\n btnHoverText: 'var(--color-blue-light-500)',\n },\n blue: {\n bg: 'var(--color-blue-50)',\n text: 'var(--color-blue-700)',\n ring: 'var(--color-blue-200)',\n dot: 'var(--color-blue-500)',\n btnText: 'var(--color-blue-400)',\n btnHoverBg: 'var(--color-blue-100)',\n btnHoverText: 'var(--color-blue-500)',\n },\n indigo: {\n bg: 'var(--color-indigo-50)',\n text: 'var(--color-indigo-700)',\n ring: 'var(--color-indigo-200)',\n dot: 'var(--color-indigo-500)',\n btnText: 'var(--color-indigo-400)',\n btnHoverBg: 'var(--color-indigo-100)',\n btnHoverText: 'var(--color-indigo-500)',\n },\n purple: {\n bg: 'var(--color-purple-50)',\n text: 'var(--color-purple-700)',\n ring: 'var(--color-purple-200)',\n dot: 'var(--color-purple-500)',\n btnText: 'var(--color-purple-400)',\n btnHoverBg: 'var(--color-purple-100)',\n btnHoverText: 'var(--color-purple-500)',\n },\n pink: {\n bg: 'var(--color-pink-50)',\n text: 'var(--color-pink-700)',\n ring: 'var(--color-pink-200)',\n dot: 'var(--color-pink-500)',\n btnText: 'var(--color-pink-400)',\n btnHoverBg: 'var(--color-pink-100)',\n btnHoverText: 'var(--color-pink-500)',\n },\n orange: {\n bg: 'var(--color-orange-50)',\n text: 'var(--color-orange-700)',\n ring: 'var(--color-orange-200)',\n dot: 'var(--color-orange-500)',\n btnText: 'var(--color-orange-400)',\n btnHoverBg: 'var(--color-orange-100)',\n btnHoverText: 'var(--color-orange-500)',\n },\n};\n\n// ─── Size Configs ─────────────────────────────────────────────────────────────\n\nconst pillPadding: Record<BadgeSize, string> = {\n sm: '2px 8px',\n md: '2px 10px',\n lg: '4px 12px',\n};\nconst badgePadding: Record<BadgeSize, string> = {\n sm: '2px 6px',\n md: '2px 8px',\n lg: '4px 10px',\n};\nconst fontSize: Record<BadgeSize, string> = {\n sm: '12px',\n md: '14px',\n lg: '14px',\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getTokens(variant: BadgeVariant, color: BadgeColor) {\n if (variant === 'modern') {\n return {\n ...colorTokens[color],\n bg: 'var(--color-bg-primary)',\n text: 'var(--color-text-secondary)',\n ring: 'var(--color-border-secondary)',\n };\n }\n return colorTokens[color];\n}\n\nfunction getRootStyle(\n variant: BadgeVariant,\n color: BadgeColor,\n size: BadgeSize,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n const t = getTokens(variant, color);\n const isPill = variant === 'pill';\n const isLg = size === 'lg' && !isPill;\n const ring = `inset 0 0 0 1px ${t.ring}`;\n const shadow =\n variant === 'modern'\n ? `${ring}, 0px 1px 2px 0px rgba(10, 13, 18, 0.05)`\n : ring;\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n width: 'max-content',\n borderRadius: isPill ? '9999px' : isLg ? '8px' : '6px',\n backgroundColor: t.bg,\n color: t.text,\n boxShadow: shadow,\n fontFamily: 'DM Sans, system-ui, sans-serif',\n fontWeight: 500,\n fontSize: fontSize[size],\n lineHeight: size === 'sm' ? '18px' : '20px',\n padding: isPill ? pillPadding[size] : badgePadding[size],\n ...extra,\n };\n}\n\n// ─── Dot ──────────────────────────────────────────────────────────────────────\n\nconst BadgeDot: React.FC<{ color: string }> = ({ color }) => (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill={color} />\n </svg>\n);\n\n// ─── X Icon ───────────────────────────────────────────────────────────────────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={style}\n >\n <path d=\"M9 3L3 9M3 3l6 6\" />\n </svg>\n);\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => (\n <span\n style={{ ...getRootStyle(variant, color, size), ...style }}\n className={className}\n >\n {children}\n </span>\n);\n\n// ─── BadgeWithDot ─────────────────────────────────────────────────────────────\n\nexport interface BadgeWithDotProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithDot: React.FC<BadgeWithDotProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const dotColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const isPill = variant === 'pill';\n const dotPaddingLeft: Record<BadgeSize, string> = { sm: isPill ? '6px' : '6px', md: isPill ? '8px' : '8px', lg: isPill ? '10px' : '10px' };\n const dotPaddingRight: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: dotPaddingLeft[size],\n paddingRight: dotPaddingRight[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <BadgeDot color={dotColor} />\n {children}\n </span>\n );\n};\n\n// ─── BadgeWithIcon ────────────────────────────────────────────────────────────\n\nexport interface BadgeWithIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n iconLeading?: BadgeIconComponent;\n iconTrailing?: BadgeIconComponent;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithIcon: React.FC<BadgeWithIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n iconLeading: IconLeading,\n iconTrailing: IconTrailing,\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '4px', lg: '4px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n const isPill = variant === 'pill';\n const hasLeading = !!IconLeading;\n\n const smPad = { pl: isPill ? (hasLeading ? '6px' : '8px') : (hasLeading ? '6px' : '8px'), pr: isPill ? (hasLeading ? '8px' : '6px') : (hasLeading ? '8px' : '6px') };\n const mdPad = { pl: isPill ? (hasLeading ? '8px' : '10px') : (hasLeading ? '8px' : '8px'), pr: isPill ? (hasLeading ? '10px' : '8px') : (hasLeading ? '8px' : '8px') };\n const lgPad = { pl: isPill ? (hasLeading ? '10px' : '12px') : (hasLeading ? '10px' : '10px'), pr: isPill ? (hasLeading ? '12px' : '10px') : (hasLeading ? '10px' : '10px') };\n const padMap: Record<BadgeSize, { pl: string; pr: string }> = { sm: smPad, md: mdPad, lg: lgPad };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: padMap[size].pl,\n paddingRight: padMap[size].pr,\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {IconLeading && (\n <IconLeading style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n {children}\n {IconTrailing && (\n <IconTrailing style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n </span>\n );\n};\n\n// ─── BadgeWithButton ──────────────────────────────────────────────────────────\n\nexport interface BadgeWithButtonProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon?: BadgeIconComponent;\n children: ReactNode;\n buttonLabel?: string;\n onButtonClick?: MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithButton: React.FC<BadgeWithButtonProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n buttonLabel,\n onButtonClick,\n children,\n style,\n className,\n}) => {\n const [hovered, setHovered] = useState(false);\n const t = getTokens(variant, color);\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '2px', lg: '2px' };\n const isPill = variant === 'pill';\n const plMap: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n const prMap: Record<BadgeSize, string> = { sm: isPill ? '3px' : '3px', md: isPill ? '4px' : '4px', lg: isPill ? '6px' : '6px' };\n const btnBorderRadius = isPill ? '9999px' : '3px';\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {children}\n <button\n type=\"button\"\n aria-label={buttonLabel}\n onClick={onButtonClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2px',\n border: 'none',\n cursor: 'pointer',\n borderRadius: btnBorderRadius,\n backgroundColor: hovered ? t.btnHoverBg : 'transparent',\n color: hovered ? t.btnHoverText : t.btnText,\n transition: 'background-color 100ms linear, color 100ms linear',\n outline: 'none',\n flexShrink: 0,\n }}\n >\n {Icon ? (\n <Icon style={{ width: '12px', height: '12px' }} />\n ) : (\n <XIcon />\n )}\n </button>\n </span>\n );\n};\n\n// ─── BadgeIcon ────────────────────────────────────────────────────────────────\n\nexport interface BadgeIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon: BadgeIconComponent;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeIcon: React.FC<BadgeIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const padMap: Record<BadgeSize, string> = { sm: '5px', md: '6px', lg: '8px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n padding: padMap[size],\n ...style,\n }}\n className={className}\n >\n <Icon style={{ width: iconSize[size], height: iconSize[size], color: iconColor }} />\n </span>\n );\n};\n\n// ─── BadgeWithImage ───────────────────────────────────────────────────────────\n\nexport interface BadgeWithImageProps {\n variant?: Exclude<BadgeVariant, 'modern'>;\n size?: BadgeSize;\n color?: BadgeColor;\n imgSrc: string;\n imgAlt?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithImage: React.FC<BadgeWithImageProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n imgSrc,\n imgAlt = 'avatar',\n children,\n style,\n className,\n}) => {\n const isPill = variant === 'pill';\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const plMap: Record<BadgeSize, string> = {\n sm: isPill ? '3px' : '4px',\n md: isPill ? '4px' : '6px',\n lg: isPill ? '6px' : '8px',\n };\n const prMap: Record<BadgeSize, string> = {\n sm: isPill ? '8px' : '6px',\n md: isPill ? '10px' : '8px',\n lg: isPill ? '12px' : '10px',\n };\n const imgSize: Record<BadgeSize, string> = { sm: '16px', md: '16px', lg: '18px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <img\n src={imgSrc}\n alt={imgAlt}\n style={{\n width: imgSize[size],\n height: imgSize[size],\n borderRadius: '9999px',\n objectFit: 'cover',\n flexShrink: 0,\n }}\n />\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import React, { type FC, useState } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface AvatarProps {\n size?: AvatarSize;\n src?: string | null;\n alt?: string;\n /** Two-letter initials displayed when no image is provided */\n initials?: string;\n /** Custom icon component displayed as placeholder */\n placeholderIcon?: FC<{ style?: React.CSSProperties }>;\n /** Online/offline status indicator dot */\n status?: 'online' | 'offline';\n /** Company logo badge displayed bottom-right */\n companyIcon?: { src: string; alt?: string };\n /** Blue verified checkmark badge */\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport interface AvatarLabelGroupProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n name: string;\n supportingText?: string;\n avatarSrc?: string | null;\n avatarInitials?: string;\n status?: 'online' | 'offline';\n companyIcon?: { src: string; alt?: string };\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ─── Size Config ────────────────────────────────────────────────────────────────\n\ninterface SizeConfig {\n size: number;\n border: number;\n fontSize: string;\n lineHeight: string;\n iconSize: number;\n onlineIndicator: { size: number; offset: number };\n companyIcon: { size: number; offset: number; border: number };\n verifiedTick: { size: number; offset: number };\n}\n\nconst SIZE_CONFIG: Record<AvatarSize, SizeConfig> = {\n xs: {\n size: 24, border: 0.5, fontSize: 'var(--font-size-text-xs)', lineHeight: 'var(--line-height-text-xs)', iconSize: 16,\n onlineIndicator: { size: 6, offset: -0.5 },\n companyIcon: { size: 10, offset: -2.5, border: 1.5 },\n verifiedTick: { size: 10, offset: -1.5 },\n },\n sm: {\n size: 32, border: 0.75, fontSize: 'var(--font-size-text-sm)', lineHeight: 'var(--line-height-text-sm)', iconSize: 20,\n onlineIndicator: { size: 8, offset: -0.75 },\n companyIcon: { size: 12, offset: -2.75, border: 1.5 },\n verifiedTick: { size: 12, offset: -0.75 },\n },\n md: {\n size: 40, border: 1, fontSize: 'var(--font-size-text-md)', lineHeight: 'var(--line-height-text-md)', iconSize: 24,\n onlineIndicator: { size: 10, offset: -1 },\n companyIcon: { size: 14, offset: -3, border: 1.5 },\n verifiedTick: { size: 14, offset: -1 },\n },\n lg: {\n size: 48, border: 1, fontSize: 'var(--font-size-text-lg)', lineHeight: 'var(--line-height-text-lg)', iconSize: 28,\n onlineIndicator: { size: 12, offset: -1 },\n companyIcon: { size: 16, offset: -3, border: 1.5 },\n verifiedTick: { size: 16, offset: -1 },\n },\n xl: {\n size: 56, border: 1, fontSize: 'var(--font-size-text-xl)', lineHeight: 'var(--line-height-text-xl)', iconSize: 32,\n onlineIndicator: { size: 14, offset: -1 },\n companyIcon: { size: 18, offset: -3, border: 1.5 },\n verifiedTick: { size: 18, offset: -1 },\n },\n '2xl': {\n size: 64, border: 1, fontSize: 'var(--font-size-display-xs)', lineHeight: 'var(--line-height-display-xs)', iconSize: 32,\n onlineIndicator: { size: 16, offset: -1 },\n companyIcon: { size: 20, offset: -3, border: 1.667 },\n verifiedTick: { size: 20, offset: -1 },\n },\n};\n\n// ─── AvatarLabelGroup Size Config ───────────────────────────────────────────────\n\ninterface LabelGroupSizeConfig {\n gap: string;\n nameFontSize: string;\n nameLineHeight: string;\n subFontSize: string;\n subLineHeight: string;\n}\n\nconst LABEL_GROUP_SIZE_CONFIG: Record<'sm' | 'md' | 'lg' | 'xl', LabelGroupSizeConfig> = {\n sm: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-xs)', subLineHeight: 'var(--line-height-text-xs)' },\n md: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-sm)', subLineHeight: 'var(--line-height-text-sm)' },\n lg: { gap: 'var(--spacing-lg)', nameFontSize: 'var(--font-size-text-md)', nameLineHeight: 'var(--line-height-text-md)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n xl: { gap: 'var(--spacing-xl)', nameFontSize: 'var(--font-size-text-lg)', nameLineHeight: 'var(--line-height-text-lg)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n};\n\n// ─── Default User Icon ──────────────────────────────────────────────────────────\n\nconst UserIcon: FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <path\n d=\"M20 21C20 19.6044 20 18.9067 19.8278 18.3389C19.44 17.0605 18.4395 16.06 17.1611 15.6722C16.5933 15.5 15.8956 15.5 14.5 15.5H9.5C8.10444 15.5 7.40665 15.5 6.83886 15.6722C5.56045 16.06 4.56004 17.0605 4.17224 18.3389C4 18.9067 4 19.6044 4 21M16.5 7.5C16.5 9.98528 14.4853 12 12 12C9.51472 12 7.5 9.98528 7.5 7.5C7.5 5.01472 9.51472 3 12 3C14.4853 3 16.5 5.01472 16.5 7.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── Verified Tick ─────────────────────────────────────────────────────────────\n\nconst VerifiedTickBadge: FC<{ size: number; offset: number }> = ({ size, offset }) => (\n <svg\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: size,\n height: size,\n flexShrink: 0,\n color: 'var(--color-blue-500)',\n overflow: 'hidden',\n zIndex: 1,\n }}\n >\n <path\n d=\"M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// ─── Avatar ─────────────────────────────────────────────────────────────────────\n\nconst Avatar: React.FC<AvatarProps> = ({\n size = 'md',\n src,\n alt,\n initials,\n placeholderIcon: PlaceholderIcon,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const [imgFailed, setImgFailed] = useState(false);\n const cfg = SIZE_CONFIG[size];\n const canShowImage = Boolean(src && !imgFailed);\n const isPlaceholder = !canShowImage;\n const hasBadge = Boolean(status || companyIcon || verified);\n\n const renderContent = () => {\n if (canShowImage) {\n return (\n <img\n src={src!}\n alt={alt}\n onError={() => setImgFailed(true)}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (initials) {\n return (\n <span\n style={{\n fontSize: cfg.fontSize,\n lineHeight: cfg.lineHeight,\n fontWeight: 600,\n color: 'var(--color-text-quaternary)',\n fontFamily: 'var(--font-family-body)',\n userSelect: 'none',\n }}\n >\n {initials}\n </span>\n );\n }\n if (PlaceholderIcon) {\n return (\n <PlaceholderIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <UserIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n };\n\n const renderBadge = () => {\n if (status === 'online' || status === 'offline') {\n const { size: iSize, offset } = cfg.onlineIndicator;\n return (\n <span\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: iSize,\n height: iSize,\n borderRadius: '50%',\n backgroundColor:\n status === 'online'\n ? 'var(--color-fg-success-secondary)'\n : 'var(--color-fg-quaternary)',\n border: '1.5px solid var(--color-bg-primary)',\n flexShrink: 0,\n }}\n />\n );\n }\n if (companyIcon) {\n const { size: cSize, offset, border } = cfg.companyIcon;\n return (\n <img\n src={companyIcon.src}\n alt={companyIcon.alt}\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: cSize,\n height: cSize,\n borderRadius: '50%',\n border: `${border}px solid var(--color-bg-primary)`,\n objectFit: 'cover',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (verified) {\n return (\n <VerifiedTickBadge\n size={cfg.verifiedTick.size}\n offset={cfg.verifiedTick.offset}\n />\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: cfg.size,\n height: cfg.size,\n borderRadius: '50%',\n border: `${cfg.border}px solid ${isPlaceholder ? 'var(--color-border-secondary)' : 'rgba(0, 0, 0, 0.08)'}`,\n backgroundColor: isPlaceholder ? 'var(--color-bg-tertiary)' : undefined,\n overflow: hasBadge ? undefined : 'hidden',\n flexShrink: 0,\n ...style,\n }}\n >\n {renderContent()}\n {renderBadge()}\n </div>\n );\n};\n\n// ─── AvatarLabelGroup ────────────────────────────────────────────────────────────\n\nexport const AvatarLabelGroup: React.FC<AvatarLabelGroupProps> = ({\n size = 'sm',\n name,\n supportingText,\n avatarSrc,\n avatarInitials,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const cfg = LABEL_GROUP_SIZE_CONFIG[size];\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: cfg.gap,\n position: 'relative',\n ...style,\n }}\n >\n <Avatar\n size={size}\n src={avatarSrc}\n initials={avatarInitials}\n status={status}\n companyIcon={companyIcon}\n verified={verified}\n />\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n fontSize: cfg.nameFontSize,\n lineHeight: cfg.nameLineHeight,\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {name}\n </span>\n {supportingText && (\n <span\n style={{\n fontSize: cfg.subFontSize,\n lineHeight: cfg.subLineHeight,\n fontWeight: 400,\n color: 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {supportingText}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Avatar;\n"],"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","ThemeProvider","_a","theme","children","themeValue","useMemo","_jsx","Provider","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","size","color","_jsxs","_Fragment","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","Alert","title","description","showIcon","closeable","action","onClose","visible","setVisible","handleClose","hasRightSlot","onKeyDown","key","role","tabIndex","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","showClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","useCallback","handleClick","maxWidth","background","transform","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","Toast","ensureToastContainer","closeToast","clearAllToasts","debugToast","window","document","getElementById","toastContainerRoot","isInitializing","toastSuccess","options","toastError","toastInfo","toastQuestion","toastContainerElement","existingContainer","createElement","appendChild","createRoot","require","render","import","catch","warn","ToastProvider","mounted","setMounted","createPortal","COLOR_CONFIG","Green","light","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","round","strokeLinejoin","React","cloneElement","marginLeft","Input","forwardRef","ref","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onChange","onFocus","onBlur","onPressEnter","restProps","inputRef","useRef","internalValue","setInternalValue","setFocused","current","isControlled","currentValue","handleClear","target","focus","showClear","sizeStyles","baseStyles","WebkitAppearance","MozAppearance","appearance","autoComplete","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","includes","getFilteredOptions","String","toLowerCase","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","flexWrap","tagProps","closable","Fragment","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","minHeight","val","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","index","isSelected","isFocused","selected","CheckIcon","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onShowSizeChange","simple","hideOnSinglePage","responsive","showLessItems","itemRender","internalCurrent","setInternalCurrent","internalPageSize","setInternalPageSize","jumpToPage","setJumpToPage","totalPages","ceil","handlePageChange","page","handleJumpTo","margin","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","Table","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","innerClassName","expandable","rowClassName","onHeaderRow","sticky","loadingSpinColor","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","_v","currentPage","setCurrentPage","_w","setPageSize","_x","draggedRowIndex","setDraggedRowIndex","_y","dragOverRowIndex","setDragOverRowIndex","_z","isMobile","setIsMobile","tableRef","headerRef","checkMobile","innerWidth","checkboxProps","getCheckboxProps","newSelectedRowKeys","k","selectedRows","Event","handleSelectAll","currentPageData","keys","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","newSorters","set","sorterArray","entries","c","field","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","emptyContent","getProcessedData","processed","sort","a","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","_i","state_1","processedData","isServerPagination","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","offset","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","borderBottom","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","some","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","x","sum","replace","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","marginBottom","displayValue","scrollContainerStyle","overflowX","overflowY","Radio","name","dotSize","Tab","items","layout","scrollable","normalizedItems","firstItem","firstKey","findMatchingKey","exactMatch","itemNum","valueNum","isNaN","initialValue","handleTabClick","returnValue","activeTabElement_1","tabRefs","getKeyString","container_1","containerRef","isScrollingRef","scrollTimeout_1","underlineRef","containerRect","tabRect","scrollLeft","setUnderlineStyle","handleScroll_1","passive","inline","activeItem","currentNum","activeColor","backgroundSliderRef","backgroundContainerRef","prevCurrentValueRef","underlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","updateUnderlinePosition","activeTab","firstKey_1","newLeft","newWidth","updateBackgroundSliderPosition","firstKey_2","container","scrollTimeout_2","updatePosition_2","handleScroll_2","scrollBehavior","scrollbarWidth","itemKey","itemKeyType","currentValueType","el","isReactElement","isValidElement","iconValue","badge","customElement","itemStyle","renderBackgroundStyle","Progress","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","trimmed","trim","hasProtocol","test","normalized","parsed","URL","protocol","host","hostname","split","segment","num","isInteger","tld","has","trimTrailingPunctuation","match","core","escapeHtml","stripEditorArtifacts","RegExp","renderTokensAsHtml","tokens","lastIndex","regex","exec","matchedText","href","defaultIsValid","validate","tokenizeText","html","token","classAttr","endsWith","getCaretOffset","selection","getSelection","rangeCount","range","getRangeAt","startContainer","preRange","cloneRange","selectNodeContents","setEnd","startOffset","Textarea","showCount","maxLength","rows","autoSize","linkify","linkifyOptions","textareaRef","editableRef","isComposingRef","caretOffsetRef","setHeight","currentLength","handleFocus","handleBlur","getMaxLengthValue","textarea","minRows","maxRows","scrollHeight","getComputedStyle","newHeight","editable","useLayoutEffect","activeElement","fallbackOffset","caretOffset","nextHtml","innerHTML","maxOffset","createRange","remaining","walker","createTreeWalker","NodeFilter","SHOW_TEXT","currentNode","nextNode","rawText","textContent","visibleCount","targetOffsetInNode","setStart","collapse","removeAllRanges","addRange","setCaretOffset","notifyChange","nextValue","handleEditableInput","rawValue","resize","contentEditable","suppressContentEditableWarning","onInput","onPaste","pastedText","clipboardData","getData","currentText","nextText","anchorNode","endOffset","endContainer","nativeEvent","isComposing","offsets","startRange","endRange","getSelectionOffsets","nextCaret","onCompositionStart","onCompositionEnd","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","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","startSelectedRangeText","endSelectedRangeText","rangeDisplayMode","isRangeMode","internalSingleValue","setInternalSingleValue","_0","startDate","endDate","internalRangeValue","setInternalRangeValue","_1","_2","selectingStart","setSelectingStart","_3","tempRangeValue","setTempRangeValue","_4","now","currentMonth","setCurrentMonth","_5","nextMonth","secondMonth","setSecondMonth","pickerRef","startInputRef","endInputRef","_6","hasOpenedRef","placementDeterminedRef","determinedPlacementRef","currentSingleValue","currentRangeValue","dateYear","dateMonth","rect_1","placement_1","dropdownHeight","top_2","placement_2","calculatePosition_1","workingRange","startText","endText","renderCalendar","handleSelectSingleDate","handleSelectRangeDate","newRange","handleToggle","defaultPresetRanges","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","presetRangesList","hasPresetRanges","handlePresetRangeSelect","startYear","startMonth","handlePrevMonth","handleNextMonth","generateCalendarData","daysInMonth","days","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","singleDisplayValue","startDisplayValue","endDisplayValue","rangeTextValue","weekDays","borderRight","borderTopLeftRadius","borderBottomLeftRadius","preset","idx","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","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","initialFields","touched","validating","fields","setFieldsState","fieldsRef","fieldElementsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldFnRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","rules_1","rule","validator","string","number","boolean","email","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","errorInfo","resetFields","setFieldsValue","allValues_2","submit","setFields","fieldsToSet","changedValues_1","registerFieldRef","scrollToField","useImperativeHandle","contextValue","formStyle","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","setItemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","rulesChanged","prevRule","currRule","showTooltip","setShowTooltip","tooltipRef","borderLeft","Children","child","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","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","skipGlobalClick","renderMenuItem","danger","suffixIcon","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","viewportHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","borderColor","Tooltip","trigger","delay","tooltipClassName","showArrow","defaultVisible","onVisibleChange","internalVisible","setInternalVisible","isAnimating","setIsAnimating","newVisible","actualPosition","setActualPosition","tooltipMaxWidth","setTooltipMaxWidth","tooltipStyle","setTooltipStyle","setArrowStyle","triggerRef","timeoutRef","hideTimeoutRef","updatePosition","finalPosition","preferredPosition","candidates_1","pos","getPositionCandidates","candidate","getAutoPosition","arrowPos","tooltipAbsoluteLeft","tooltipAbsoluteTop","getArrowPosition","hideTooltip","keepTooltipVisible","tryUpdatePosition_1","tooltipContainerStyle","calculateTooltipMaxWidth","updateMaxWidth","tooltipContentStyle","wordWrap","tooltipContent","handleTriggerMouseLeave","triggerProps","hasEnoughSpace","popoverRect","getAvailableSpace","Popover","popoverClassName","destroyOnHide","destroyTooltipOnHide","shouldDestroyOnHide","popoverStyle","setPopoverStyle","popoverRef","nextVisible","nextPlacement","oppositePlacement","getOppositePlacement","getPlacementPosition","clamped","nextTop","nextLeft","clampToViewport","openPopover","closePopover","togglePopover","triggerEvents","popoverNode","visibility","VIEWPORT_PADDING","ANIMATION_DURATION","Drawer","afterOpenChange","mask","maskClosable","closeIcon","keyboard","destroyOnClose","mobileBreakpoint","drawerStyle","headerStyle","bodyStyle","footerStyle","maskStyle","mergedOpen","shouldRender","setShouldRender","animatedOpen","setAnimatedOpen","updateMobile","raf_1","cancelAnimationFrame","previousOverflow","closeDrawer","resolvedWidth","resolvedHeight","effectivePlacement","drawerPositionStyle","base","node","curve","tag","rotate","particleCount","trailSpan","durationMs","rotationDurationMs","pulseDurationMs","baseRadius","detailAmplitude","petalCount","curveScale","point","progress","detailScaleValue","petals","cos","sin","getParticle","tailOffset","normalizeProgress","fade","pow","Loading","strokeWidthProp","frame","setFrame","startRef","tick","pulseAngle","elapsed","rotationDeg","elapsedMs","getRotationDeg","lineWeight","strokeScale","pathD","steps","parts","toFixed","buildPath","particles","pt","preserveAspectRatio","colorTokens","gray","ring","dot","btnText","btnHoverBg","btnHoverText","brand","grayBlue","blueLight","blue","indigo","purple","pink","orange","pillPadding","badgePadding","getTokens","getRootStyle","isPill","isLg","shadow","BadgeDot","XIcon","Badge","BadgeWithDot","dotPaddingLeft","dotPaddingRight","BadgeWithIcon","IconLeading","iconLeading","IconTrailing","iconTrailing","hasLeading","padMap","BadgeWithButton","Icon","buttonLabel","onButtonClick","plMap","prMap","btnBorderRadius","BadgeIcon","BadgeWithImage","imgSrc","imgAlt","imgSize","SIZE_CONFIG","xs","onlineIndicator","companyIcon","verifiedTick","LABEL_GROUP_SIZE_CONFIG","nameFontSize","nameLineHeight","subFontSize","subLineHeight","UserIcon","VerifiedTickBadge","fillRule","clipRule","Avatar","initials","PlaceholderIcon","placeholderIcon","verified","imgFailed","setImgFailed","cfg","canShowImage","isPlaceholder","hasBadge","iSize","cSize","renderBadge","AvatarLabelGroup","supportingText","avatarInitials"],"mappings":"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","x_google_ignoreList":[0]}