aha-components 1.8.3 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Avatar.esm.js +1 -1
- package/dist/Avatar.esm.js.map +1 -1
- package/dist/Avatar.js +1 -1
- package/dist/Avatar.js.map +1 -1
- package/dist/Badge.esm.js +1 -1
- package/dist/Badge.esm.js.map +1 -1
- package/dist/Badge.js +1 -1
- package/dist/Badge.js.map +1 -1
- package/dist/Button.esm.js +1 -1
- package/dist/Button.esm.js.map +1 -1
- package/dist/Button.js +1 -1
- package/dist/Button.js.map +1 -1
- package/dist/Checkbox.esm.js +1 -1
- package/dist/Checkbox.esm.js.map +1 -1
- package/dist/Checkbox.js +1 -1
- package/dist/Checkbox.js.map +1 -1
- package/dist/DatePicker.esm.js.map +1 -1
- package/dist/DatePicker.js.map +1 -1
- package/dist/Drawer.esm.js.map +1 -1
- package/dist/Drawer.js.map +1 -1
- package/dist/Form.esm.js.map +1 -1
- package/dist/Form.js.map +1 -1
- package/dist/Input.esm.js +1 -1
- package/dist/Input.esm.js.map +1 -1
- package/dist/Input.js +1 -1
- package/dist/Input.js.map +1 -1
- package/dist/Loading.esm.js +1 -1
- package/dist/Loading.esm.js.map +1 -1
- package/dist/Loading.js +1 -1
- package/dist/Loading.js.map +1 -1
- package/dist/MenuList.esm.js.map +1 -1
- package/dist/MenuList.js.map +1 -1
- package/dist/Pagination.esm.js +1 -1
- package/dist/Pagination.esm.js.map +1 -1
- package/dist/Pagination.js +1 -1
- package/dist/Pagination.js.map +1 -1
- package/dist/Popover.esm.js +1 -1
- package/dist/Popover.esm.js.map +1 -1
- package/dist/Popover.js +1 -1
- package/dist/Popover.js.map +1 -1
- package/dist/Progress.esm.js.map +1 -1
- package/dist/Progress.js.map +1 -1
- package/dist/Radio.esm.js +1 -1
- package/dist/Radio.esm.js.map +1 -1
- package/dist/Radio.js +1 -1
- package/dist/Radio.js.map +1 -1
- package/dist/Select.esm.js.map +1 -1
- package/dist/Select.js.map +1 -1
- package/dist/Switch.esm.js.map +1 -1
- package/dist/Switch.js.map +1 -1
- package/dist/Tab.esm.js.map +1 -1
- package/dist/Tab.js.map +1 -1
- package/dist/Table.esm.js +1 -1
- package/dist/Table.esm.js.map +1 -1
- package/dist/Table.js +1 -1
- package/dist/Table.js.map +1 -1
- package/dist/Tag.esm.js.map +1 -1
- package/dist/Tag.js.map +1 -1
- package/dist/Textarea.esm.js +1 -1
- package/dist/Textarea.esm.js.map +1 -1
- package/dist/Textarea.js +1 -1
- package/dist/Textarea.js.map +1 -1
- package/dist/Toast.esm.js.map +1 -1
- package/dist/Toast.js.map +1 -1
- package/dist/Tooltip.esm.js.map +1 -1
- package/dist/Tooltip.js.map +1 -1
- package/dist/components/Alert/icon.d.ts +5 -5
- package/dist/components/Badge/index.d.ts +2 -1
- package/dist/components/Button/index.d.ts +2 -2
- package/dist/components/Table/index.d.ts +1 -1
- package/dist/components/Toast/icon.d.ts +5 -5
- package/dist/components/shared/badgeColors.d.ts +25 -0
- package/dist/components/shared/buttonStyles.d.ts +18 -0
- package/dist/components/shared/colorUtils.d.ts +6 -0
- package/dist/components/shared/controlStyles.d.ts +27 -0
- package/dist/components/shared/fieldStyles.d.ts +37 -0
- package/dist/index.css +3848 -0
- package/dist/index.d.ts +29 -5
- package/dist/index.esm.css +3848 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tokens.d.ts +14 -14
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -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/InputGroup.tsx","../src/components/Input/InputTags.tsx","../src/components/Input/index.tsx","../src/components/Select/index.tsx","../src/icons/index.tsx","../src/components/Pagination/index.tsx","../src/components/Checkbox/index.tsx","../src/components/Table/index.tsx","../src/components/Radio/index.tsx","../src/components/Tab/index.tsx","../src/components/Progress/index.tsx","../src/components/Textarea/TextareaTags.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 if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && action}\n </div>\n {action && !closeable && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n </div>\n )}\n {closeable && (\n <div\n className=\"flex-shrink-0 self-start mt-1 cursor-pointer\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TagColor =\n | 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet'\n | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\n\nexport type TagVariant = 'light' | 'fill';\n\n/** sm/md/lg are the canonical sizes; large/small are legacy aliases */\nexport type TagSize = 'sm' | 'md' | 'lg' | 'large' | 'small';\n\n/** Leading icon variant */\nexport type TagIconType = 'none' | 'dot' | 'avatar' | 'icon';\n\n/** Right-side action */\nexport type TagAction = 'none' | 'x-close' | 'count';\n\n/** @deprecated Use iconType instead */\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color?: TagColor;\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean;\n // Icon variants (mutually exclusive; avatar takes precedence over icon)\n iconType?: TagIconType;\n icon?: React.ReactElement;\n avatarSrc?: string;\n dotColor?: string;\n // Action variants\n action?: TagAction;\n count?: number;\n onClose?: () => void;\n // Checkbox variant\n checkbox?: boolean;\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated use iconType='icon' */\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// ─── Color Configs ────────────────────────────────────────────────────────────\n\nconst COLOR_CONFIG = {\n Green: { light: { bg: '#ECFDF5', text: '#006045', border: '#A4F4CF' }, fill: { bg: '#00BC7D', text: '#FFFFFF' } },\n Red: { light: { bg: '#FEF2F2', text: '#9F0712', border: '#FFC9C9' }, fill: { bg: '#FB2C36', text: '#FFFFFF' } },\n Orange: { light: { bg: '#FFF6ED', text: '#9B2911', border: '#FFD1A9' }, fill: { bg: '#FB6011', text: '#FFFFFF' } },\n Cyan: { light: { bg: '#ECFEFF', text: '#005F78', border: '#A2F4FD' }, fill: { bg: '#00B8DB', text: '#FFFFFF' } },\n Violet: { light: { bg: '#F5F3FF', text: '#5D0EC0', border: '#DDD6FF' }, fill: { bg: '#8E51FF', text: '#FFFFFF' } },\n Pink: { light: { bg: '#FDF2F8', text: '#A3004C', border: '#FCCEE8' }, fill: { bg: '#F6339A', text: '#FFFFFF' } },\n Gray: { light: { bg: '#F5F5F4', text: '#292524', border: '#E7E5E4' }, fill: { bg: '#292524', text: '#FFFFFF' } },\n Yellow: { light: { bg: '#FFFBEB', text: '#973C00', border: '#FEE685' }, fill: { bg: '#FE9A00', text: '#FFFFFF' } },\n Blue: { light: { bg: '#EFF6FF', text: '#193CB8', border: '#BEDBFF' }, fill: { bg: '#2B7FFF', text: '#FFFFFF' } },\n};\n\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n if (color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n if (color === 'Orange' && primaryColor) {\n return { ...config, fill: { ...config.fill, bg: primaryColor } };\n }\n return config;\n }\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return {\n light: { bg: `rgba(${r},${g},${b},0.1)`, text: color, border: `rgba(${r},${g},${b},0.3)` },\n fill: { bg: color, text: '#FFFFFF' },\n };\n }\n return COLOR_CONFIG.Gray;\n};\n\nconst getIconColor = (color: TagColor, primaryColor?: string): string => {\n const map: Record<string, string> = {\n Green: '#009966', Red: '#E7000B', Orange: primaryColor || '#E17100',\n Blue: '#155DFC', Yellow: '#EC470A', Cyan: '#0092B8',\n Violet: '#7F22FE', Pink: '#E60076', Gray: '#57534D',\n };\n return map[color] ?? (color.startsWith('#') ? color : '#57534D');\n};\n\nconst getOutlineColor = (color: TagColor): string => {\n const map: Record<string, string> = {\n Green: '#A4F4CF', Red: '#FFC9C9', Orange: '#FFD1A9',\n Blue: '#BEDBFF', Yellow: '#FFD1A9', Cyan: '#A2F4FD',\n Violet: '#DDD6FF', Pink: '#FCCEE8', Gray: '#E7E5E4',\n };\n if (color in map) return map[color];\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return `rgba(${r},${g},${b},0.3)`;\n }\n return '#E7E5E4';\n};\n\n// ─── Size Config ──────────────────────────────────────────────────────────────\n// Values derived from Figma design (node 3307:417515)\n\ntype NSize = 'sm' | 'md' | 'lg';\n\nconst normalizeSize = (size: TagSize): NSize => {\n if (size === 'large') return 'lg';\n if (size === 'small') return 'sm';\n return size as NSize;\n};\n\nconst SIZE = {\n sm: {\n // Base padding: px-8px py-3px (h=24px with lh-18px)\n basePx: 8, basePy: 3,\n // Left padding adjustments per leading element (checkbox wins over icon)\n plCheckbox: 5, plAvatar: 4, plDot: 6, plIcon: 4,\n // Right padding adjustments per action\n prClose: 4, prCount: 4,\n fontSize: 12, lineHeight: '18px', height: 24,\n avatarSize: 16, checkboxSize: 14,\n contentGap: 4, rootGap: 3,\n countPx: 4, countFontSize: 12,\n closeSize: 10, closePad: 2,\n },\n md: {\n // Base padding: px-9px py-2px (h=24px with lh-20px)\n basePx: 9, basePy: 2,\n plCheckbox: 4, plAvatar: 5, plDot: 7, plIcon: 5,\n prClose: 4, prCount: 3,\n fontSize: 14, lineHeight: '20px', height: 24,\n avatarSize: 16, checkboxSize: 16,\n contentGap: 5, rootGap: 4,\n countPx: 5, countFontSize: 12,\n closeSize: 12, closePad: 2,\n },\n lg: {\n // Base padding: px-10px py-4px (h=28px with lh-20px)\n basePx: 10, basePy: 4,\n plCheckbox: 5, plAvatar: 7, plDot: 9, plIcon: 7,\n prClose: 4, prCount: 4,\n fontSize: 14, lineHeight: '20px', height: 28,\n avatarSize: 18, checkboxSize: 18,\n contentGap: 6, rootGap: 4,\n countPx: 6, countFontSize: 14,\n closeSize: 14, closePad: 3,\n },\n} as const;\n\n// ─── TagAvatar ────────────────────────────────────────────────────────────────\n\nexport interface TagAvatarProps {\n src?: string;\n alt?: string;\n size?: number;\n}\n\nexport const TagAvatar: React.FC<TagAvatarProps> = ({ src, alt = 'Avatar', size = 16 }) => {\n const [failed, setFailed] = useState(false);\n return (\n <div\n style={{\n width: size, height: size, borderRadius: '50%',\n overflow: 'hidden', flexShrink: 0,\n border: '0.667px solid rgba(0,0,0,0.08)',\n background: '#e5e5e4',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n >\n {src && !failed ? (\n <img\n src={src} alt={alt}\n onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <svg\n width={size * 0.625} height={size * 0.625}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <circle cx=\"5\" cy=\"3.5\" r=\"2\" stroke=\"#999\" strokeWidth=\"1.2\" />\n <path d=\"M1 9.5c0-2.2 1.8-4 4-4s4 1.8 4 4\" stroke=\"#999\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </div>\n );\n};\n\n// ─── Tag ──────────────────────────────────────────────────────────────────────\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'md',\n stroke = false,\n iconType: iconTypeProp,\n icon,\n avatarSrc,\n dotColor,\n action = 'none',\n count,\n onClose,\n checkbox = false,\n checked: checkedProp,\n onCheckedChange,\n iconPosition,\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [internalChecked, setInternalChecked] = useState(false);\n\n const nSize = normalizeSize(size);\n const s = SIZE[nSize];\n\n // Controlled/uncontrolled checkbox\n const isChecked = checkedProp !== undefined ? checkedProp : internalChecked;\n const handleCheckboxToggle = (e: React.MouseEvent) => {\n e.stopPropagation();\n const next = !isChecked;\n if (checkedProp === undefined) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n // Resolve icon type; backward-compat: legacy iconPosition='leading' → iconType='icon'\n const iconType: TagIconType =\n iconTypeProp ??\n (icon && iconPosition === 'leading' ? 'icon' : 'none');\n\n const hasLeading = iconType !== 'none';\n const effectiveAction = action !== 'none' ? action : undefined;\n\n // Compute left padding (checkbox wins > dot > avatar/icon > base)\n const pl = checkbox ? s.plCheckbox\n : iconType === 'dot' ? s.plDot\n : iconType === 'avatar' || iconType === 'icon' ? s.plAvatar\n : s.basePx;\n\n // Compute right padding\n const pr = effectiveAction === 'x-close' ? s.prClose\n : effectiveAction === 'count' ? s.prCount\n : s.basePx;\n\n // Base neutral style matching Figma (white bg + gray border)\n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: effectiveAction === 'x-close' ? s.rootGap : 0,\n paddingLeft: pl,\n paddingRight: pr,\n paddingTop: s.basePy,\n paddingBottom: s.basePy,\n height: s.height,\n borderRadius: 6,\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 500,\n fontSize: s.fontSize,\n lineHeight: s.lineHeight,\n transition: 'all 0.2s',\n cursor: onClick ? 'pointer' : 'default',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n color: '#44403c',\n // Inset outline matches Figma: outline-1 outline-offset-[-1px]\n outline: '1px solid #d7d3d0',\n outlineOffset: '-1px',\n };\n\n // Optional color override (keeps backward compat with color prop)\n if (color) {\n const colorConfig = getColorConfig(color, primaryColor);\n if (variant === 'light') {\n containerStyle.backgroundColor = colorConfig.light.bg;\n containerStyle.color = colorConfig.light.text;\n containerStyle.outline = stroke ? `1px solid ${getOutlineColor(color)}` : 'none';\n containerStyle.outlineOffset = stroke ? '-1px' : undefined;\n } else {\n containerStyle.backgroundColor = colorConfig.fill.bg;\n containerStyle.color = colorConfig.fill.text;\n containerStyle.outline = 'none';\n }\n }\n\n if (onClick) {\n containerStyle.cursor = 'pointer';\n }\n\n // Leading icon element\n const renderLeadingIcon = () => {\n if (iconType === 'avatar') {\n return <TagAvatar src={avatarSrc} size={s.avatarSize} />;\n }\n if (iconType === 'dot') {\n return (\n <svg width={8} height={8} viewBox=\"0 0 8 8\" fill=\"none\" style={{ flexShrink: 0 }}>\n <circle cx={4} cy={4} r={3.5} fill={dotColor || 'currentColor'} />\n </svg>\n );\n }\n if (iconType === 'icon' && icon) {\n return (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: s.avatarSize,\n height: s.avatarSize,\n })}\n </span>\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={containerStyle}\n onClick={onClick}\n {...rest}\n >\n {/* Content row: checkbox + icon + text + count */}\n <div style={{ display: 'flex', alignItems: 'center', gap: s.contentGap, flexShrink: 0 }}>\n {/* Checkbox */}\n {checkbox && (\n <div\n role=\"checkbox\"\n aria-checked={isChecked}\n onClick={handleCheckboxToggle}\n style={{\n width: s.checkboxSize, height: s.checkboxSize,\n borderRadius: 4, flexShrink: 0,\n border: isChecked ? 'none' : '1px solid #d7d3d0',\n background: isChecked ? (primaryColor || '#7F56D9') : '#ffffff',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n cursor: 'pointer',\n }}\n >\n {isChecked && (\n <svg\n width={Math.round(s.checkboxSize * 0.65)}\n height={Math.round(s.checkboxSize * 0.65)}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M8.5 2L4 7.5 1.5 5\" stroke=\"#fff\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )}\n\n {/* Leading icon (avatar / dot / generic icon) */}\n {renderLeadingIcon()}\n\n {/* Text label */}\n <span style={{ whiteSpace: 'nowrap' }}>{children}</span>\n\n {/* Count badge */}\n {effectiveAction === 'count' && typeof count === 'number' && (\n <span style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n paddingLeft: s.countPx, paddingRight: s.countPx,\n paddingTop: 1, paddingBottom: 1,\n background: 'rgba(0,0,0,0.07)',\n borderRadius: 3,\n fontSize: s.countFontSize,\n fontWeight: 500,\n lineHeight: '16px',\n flexShrink: 0,\n }}>\n {count}\n </span>\n )}\n </div>\n\n {/* Close X (outside content row, right side) */}\n {effectiveAction === 'x-close' && (\n <button\n aria-label=\"Remove\"\n onClick={(e) => { e.stopPropagation(); onClose?.(); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: s.closePad, borderRadius: 3,\n border: 'none', background: 'transparent',\n cursor: 'pointer', flexShrink: 0,\n color: 'inherit', opacity: 0.55,\n lineHeight: 0,\n }}\n >\n <svg width={s.closeSize} height={s.closeSize} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.5 2.5l-5 5M2.5 2.5l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n\n {/* Legacy: icon rendered after text when iconPosition='after' */}\n {iconPosition === 'after' && icon && !iconTypeProp && (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0, marginLeft: s.contentGap }}>\n {icon}\n </span>\n )}\n </div>\n );\n};\n\nexport default Tag;\n","import React, { forwardRef, useRef, useEffect, useState } from 'react';\nimport { InputProps } from './index';\n\nexport interface InputGroupProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n error?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Text addon on the left (e.g. \"https://\") — auto-styled with correct padding */\n leadingText?: React.ReactNode;\n /** Text addon on the right (e.g. \"USD\") — auto-styled with correct padding */\n trailingText?: React.ReactNode;\n /** Raw ReactNode on the left (dropdown, icon button, etc.) — no padding added */\n leadingAddon?: React.ReactNode;\n /** Raw ReactNode on the right (button, select, etc.) — no padding added */\n trailingAddon?: React.ReactNode;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst sizeMap: Record<NonNullable<InputGroupProps['size']>, { pt: string; pb: string }> = {\n small: { pt: '5px', pb: '5px' },\n mediumSmall: { pt: '7px', pb: '7px' },\n medium: { pt: '9px', pb: '9px' },\n large: { pt: '11px', pb: '11px' },\n};\n\nconst InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(({\n size = 'mediumSmall',\n error = false,\n disabled = false,\n readOnly = false,\n prefix,\n suffix,\n leadingText,\n trailingText,\n leadingAddon,\n trailingAddon,\n className = '',\n style,\n onFocus,\n onBlur,\n onKeyDown,\n onPressEnter,\n value,\n defaultValue,\n onChange,\n placeholder,\n type = 'text',\n label,\n required,\n hintText,\n ...restProps\n}, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n\n useEffect(() => {\n if (typeof ref === 'function') ref(inputRef.current);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) onPressEnter(e);\n onKeyDown?.(e);\n };\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const { pt, pb } = sizeMap[size];\n const dividerColor = disabled ? 'var(--color-border-disabled)' : 'var(--color-border-primary)';\n const iconColor = disabled ? 'var(--color-fg-disabled)' : 'var(--color-fg-quaternary)';\n const hasPrefixIcon = !!prefix;\n const hasSuffixIcon = !!suffix;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n pointerEvents: 'none',\n };\n\n const addonTextStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: '14px',\n paddingRight: '12px',\n color: 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n lineHeight: 'var(--line-height-text-md)',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n backgroundColor: disabled ? 'var(--color-bg-disabled_subtle)' : 'transparent',\n };\n\n const groupEl = (\n <div\n className={`aha-input-group ${className}`}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n width: '100%',\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: 'var(--radius-md)',\n backgroundColor: disabled || readOnly ? 'var(--color-bg-disabled_subtle)' : 'var(--color-bg-primary)',\n overflow: 'hidden',\n boxSizing: 'border-box',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n ...style,\n }}\n >\n {/* Leading text addon (auto-padded) */}\n {leadingText !== undefined && (\n <div style={{ ...addonTextStyle, borderRight: `1px solid ${dividerColor}` }}>\n {leadingText}\n </div>\n )}\n {/* Leading raw addon (no auto-padding) */}\n {leadingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderRight: `1px solid ${dividerColor}` }}>\n {leadingAddon}\n </div>\n )}\n\n {/* Input area */}\n <div style={{ flex: 1, position: 'relative', display: 'flex', alignItems: 'stretch', minWidth: 0 }}>\n {hasPrefixIcon && (\n <span style={{ ...iconSlotStyle, left: '14px' }}>{prefix}</span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n backgroundColor: 'transparent',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: hasPrefixIcon ? '40px' : '14px',\n paddingRight: hasSuffixIcon ? '40px' : '14px',\n }}\n autoComplete={restProps.autoComplete || 'off'}\n {...restProps}\n />\n {hasSuffixIcon && (\n <span style={{ ...iconSlotStyle, right: '14px' }}>{suffix}</span>\n )}\n </div>\n\n {/* Trailing text addon (auto-padded) */}\n {trailingText !== undefined && (\n <div style={{ ...addonTextStyle, paddingLeft: '12px', paddingRight: '14px', borderLeft: `1px solid ${dividerColor}` }}>\n {trailingText}\n </div>\n )}\n {/* Trailing raw addon (no auto-padding) */}\n {trailingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderLeft: `1px solid ${dividerColor}` }}>\n {trailingAddon}\n </div>\n )}\n </div>\n );\n\n if (!label && !hintText) return groupEl;\n\n const labelStyle: React.CSSProperties = {\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n };\n\n const hintStyle: React.CSSProperties = {\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={labelStyle}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {groupEl}\n {hintText && <p style={hintStyle}>{hintText}</p>}\n </div>\n );\n});\n\nInputGroup.displayName = 'InputGroup';\n\nexport default InputGroup;\n","import React, { useState, useRef, KeyboardEvent } from 'react';\nimport Tag from '../Tag';\n\nexport interface InputTagsProps {\n value?: string[];\n defaultValue?: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst containerPadding = {\n small: '4px',\n mediumSmall: '6px',\n medium: '8px',\n large: '10px',\n};\n\nconst tagSizeMap = {\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'lg',\n} as const;\n\nconst InputTags: React.FC<InputTagsProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag...',\n disabled = false,\n error = false,\n size = 'mediumSmall',\n className = '',\n style,\n label,\n required,\n hintText,\n}) => {\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isControlled = value !== undefined;\n const tags = isControlled ? value! : internalTags;\n\n const updateTags = (next: string[]) => {\n if (!isControlled) setInternalTags(next);\n onChange?.(next);\n };\n\n const addTag = (tag: string) => {\n const trimmed = tag.trim();\n if (!trimmed || tags.includes(trimmed)) return;\n updateTags([...tags, trimmed]);\n setInputValue('');\n };\n\n const removeTag = (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if ((e.key === 'Enter' || e.key === ',') && inputValue) {\n e.preventDefault();\n addTag(inputValue);\n }\n if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n };\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const p = containerPadding[size];\n const tagSize = tagSizeMap[size];\n\n const labelStyle: React.CSSProperties = {\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n };\n\n const tagsEl = (\n <div\n className={`aha-input-tags ${className}`}\n onClick={() => inputRef.current?.focus()}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n padding: p,\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: 'var(--radius-md)',\n backgroundColor: disabled ? 'var(--color-bg-disabled_subtle)' : 'var(--color-bg-primary)',\n boxSizing: 'border-box',\n width: '100%',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n cursor: disabled ? 'not-allowed' : 'text',\n ...style,\n }}\n >\n {tags.map((tag, i) => (\n <Tag\n key={i}\n size={tagSize}\n action={disabled ? 'none' : 'x-close'}\n onClose={() => removeTag(i)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => { setFocused(false); if (inputValue) addTag(inputValue); }}\n disabled={disabled}\n placeholder={tags.length === 0 ? placeholder : ''}\n style={{\n flex: 1,\n minWidth: '80px',\n border: 'none',\n outline: 'none',\n padding: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n lineHeight: 'var(--line-height-text-md)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n backgroundColor: 'transparent',\n }}\n />\n <style>{`\n .aha-input-tags input::placeholder { color: var(--color-text-placeholder); }\n `}</style>\n </div>\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={labelStyle}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {tagsEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n};\n\nexport default InputTags;\n","import React, { forwardRef, useRef, useEffect } from 'react';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n className?: string;\n style?: React.CSSProperties;\n type?: string;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\n// sm=36px, mediumSmall=40px, md=44px (matches Figma md), lg=48px\n// With box-sizing:border-box: height = 1px border × 2 + paddingTop + 24px lineHeight + paddingBottom\nconst sizeStyles: Record<NonNullable<InputProps['size']>, React.CSSProperties> = {\n small: { height: '36px', paddingTop: '5px', paddingBottom: '5px' },\n mediumSmall: { height: '40px', paddingTop: '7px', paddingBottom: '7px' },\n medium: { height: '44px', paddingTop: '9px', paddingBottom: '9px' },\n large: { height: '48px', paddingTop: '11px', paddingBottom: '11px' },\n};\n\nconst SHADOW_XS = 'var(--shadow-xs)';\n\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void }> = ({ onClick }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={onClick}\n style={{ cursor: 'pointer', flexShrink: 0 }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'mediumSmall',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n label,\n required,\n hintText,\n ...restProps\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(defaultValue || value || '');\n const [focused, setFocused] = React.useState(false);\n\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) onPressEnter(e);\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) setInternalValue('');\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return {\n border: '1px solid var(--color-border-disabled)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n if (error && focused) return {\n border: '1px solid var(--color-border-error)',\n boxShadow: SHADOW_XS,\n outline: '2px solid var(--color-border-error)',\n outlineOffset: '-2px',\n };\n if (error) return {\n border: '1px solid var(--color-border-error_subtle)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n if (focused) return {\n border: '1px solid var(--color-border-brand)',\n boxShadow: SHADOW_XS,\n outline: '2px solid var(--color-border-brand)',\n outlineOffset: '-2px',\n };\n return {\n border: '1px solid var(--color-border-primary)',\n boxShadow: SHADOW_XS,\n outline: 'none',\n };\n };\n\n const { border, boxShadow, outline, outlineOffset } = getFocusStyles();\n const { height, paddingTop, paddingBottom } = sizeStyles[size];\n\n const hasRightContent = suffix || showClear;\n const paddingLeft = prefix ? '40px' : '14px';\n const paddingRight = hasRightContent ? '40px' : '14px';\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n height,\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n borderRadius: 'var(--radius-md)',\n border,\n boxShadow,\n backgroundColor:\n disabled || readOnly\n ? 'var(--color-bg-disabled_subtle)'\n : 'var(--color-bg-primary)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n outline,\n outlineOffset,\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n appearance: 'none',\n ...style,\n };\n\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: var(--color-text-placeholder);\n font-size: var(--font-size-text-md);\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input::-moz-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input:-ms-input-placeholder { color: var(--color-text-placeholder); }\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] { -moz-appearance: textfield; }\n `;\n\n const iconColor = disabled\n ? 'var(--color-fg-disabled)'\n : 'var(--color-fg-quaternary)';\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n };\n\n const inputEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{ position: 'relative', display: 'block', width: '100%' }}\n >\n {prefix && (\n <span style={{ ...iconSlotStyle, left: '14px', pointerEvents: 'none' }}>\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span style={{ ...iconSlotStyle, right: '14px', gap: 'var(--spacing-xs)' }}>\n {showClear && <ClearIcon onClick={handleClear} />}\n {suffix}\n </span>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return inputEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n }}>\n {label}\n {required && (\n <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>\n )}\n </label>\n )}\n {inputEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nexport { default as InputGroup } from './InputGroup';\nexport type { InputGroupProps } from './InputGroup';\nexport { default as InputTags } from './InputTags';\nexport type { InputTagsProps } from './InputTags';\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(updatePosition);\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen, filteredOptions.length]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (item: number | string): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type={isActive ? \"primary\" : \"default\"}\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: isActive ? `1px solid ${primaryColor}` : undefined,\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n OK\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React, { useState } from 'react';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const isActive = checked || indeterminate;\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled) return;\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const iconSize = size === 'sm' ? '12px' : '14px';\n const borderRadius = size === 'sm' ? 'var(--radius-xs, 4px)' : 'var(--radius-sm, 6px)';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (isActive) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (isActive) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n // Disabled active: use muted icon so it's visible on the light bg\n const iconColor = disabled && isActive\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n const hasLabel = children || hint;\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Checkbox box */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius,\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Indeterminate dash */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n\n {/* Check mark */}\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: checked && !indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity={0.3}\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n);\n\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n innerClassName?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染空状态 ====================\n const renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset, renderEmpty]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={innerClassName}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n};\n\nexport default Table;\n\n","import React, { useState } from 'react';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled || checked) return;\n const syntheticEvent = {\n target: { checked: true, value },\n currentTarget: { checked: true, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const dotSize = size === 'sm' ? '6px' : '8px';\n const fontSize = size === 'sm' ? 'var(--font-size-text-sm, 14px)' : 'var(--font-size-text-md, 16px)';\n const lineHeight = size === 'sm' ? 'var(--line-height-text-sm, 20px)' : 'var(--line-height-text-md, 24px)';\n const gap = size === 'sm' ? 'var(--spacing-md, 8px)' : 'var(--spacing-lg, 12px)';\n\n const getBoxBg = () => {\n if (disabled) return 'var(--color-bg-disabled_subtle, #fafaf9)';\n if (checked) return hovered ? 'var(--color-bg-brand-solid_hover, #ec470a)' : 'var(--color-bg-brand-solid, #fb6011)';\n return hovered ? 'var(--color-bg-primary_hover, #fafaf9)' : 'var(--color-bg-primary, #ffffff)';\n };\n\n const getBoxBorder = () => {\n if (disabled) return '1px solid var(--color-border-disabled, #d7d3d0)';\n if (checked) return hovered ? '1px solid var(--color-bg-brand-solid_hover, #ec470a)' : '1px solid var(--color-bg-brand-solid, #fb6011)';\n return '1px solid var(--color-border-primary, #d7d3d0)';\n };\n\n const hasLabel = children || hint;\n\n // Disabled checked: use muted dot color so it's visible on the light bg\n const dotColor = disabled && checked\n ? 'var(--color-fg-disabled_subtle, #d7d3d0)'\n : 'var(--color-fg-white, #ffffff)';\n\n return (\n <div\n className={`aha-radio ${className}`}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n {/* Radio circle */}\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius: '50%',\n border: getBoxBorder(),\n backgroundColor: getBoxBg(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: showFocus ? 'var(--focus-ring, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px #fb6011)' : 'none',\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n {/* Inner dot */}\n <div\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: '50%',\n backgroundColor: dotColor,\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n flexShrink: 0,\n }}\n />\n </div>\n\n {/* Label + hint */}\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: size === 'md' ? 'var(--spacing-xxs, 2px)' : '0' }}>\n {children && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-medium, 500)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: disabled ? 'var(--color-text-disabled, #79716b)' : 'var(--color-text-secondary, #44403c)',\n userSelect: 'none',\n }}\n >\n {children}\n </span>\n )}\n {hint && (\n <span\n style={{\n fontSize,\n lineHeight,\n fontWeight: 'var(--font-weight-regular, 400)' as React.CSSProperties['fontWeight'],\n fontFamily: 'var(--font-family-body, \"DM Sans\", sans-serif)',\n color: 'var(--color-text-tertiary, #57534e)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '0px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React from 'react';\nimport InputTags, { InputTagsProps } from '../Input/InputTags';\n\nexport interface TextareaTagsProps extends Omit<InputTagsProps, 'size'> {\n minHeight?: number;\n helpIcon?: React.ReactNode;\n}\n\nconst TextareaTags: React.FC<TextareaTagsProps> = ({\n minHeight = 120,\n style,\n label,\n required,\n hintText,\n helpIcon,\n error,\n ...props\n}) => {\n const tagsEl = (\n <InputTags\n error={error}\n style={{\n minHeight: `${minHeight}px`,\n alignItems: 'flex-start',\n overflow: 'auto',\n resize: 'vertical',\n ...style,\n }}\n {...props}\n />\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n display: 'flex',\n alignItems: 'center',\n }}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: 'var(--color-fg-quaternary)' }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {tagsEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n};\n\nexport default TextareaTags;\n","import React, { forwardRef, useRef, useEffect, useMemo, useLayoutEffect } from 'react';\n\ninterface LinkifyOptions {\n validate?: (url: string) => boolean;\n className?: string;\n needProtocol?: boolean;\n needHost?: boolean;\n allowedTlds?: string[];\n}\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n showCount?: boolean;\n maxLength?: number;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n rows?: number;\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n linkify?: boolean;\n linkifyOptions?: LinkifyOptions;\n label?: string;\n required?: boolean;\n hintText?: string;\n helpIcon?: React.ReactNode;\n}\n\ntype TextToken =\n | { type: 'text'; text: string }\n | { type: 'url'; text: string; href: string };\n\nconst DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$/;\nconst URL_CANDIDATE_REGEX =\n /(https?:\\/\\/[^\\s<]+|www\\.[^\\s<]+|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/[^\\s<]*)?)/gi;\nconst DEFAULT_ALLOWED_TLDS = new Set([\n 'com',\n 'cn',\n 'net',\n 'org',\n 'io',\n 'co',\n 'edu',\n 'gov',\n 'ai',\n 'app',\n 'dev',\n 'me',\n 'info',\n 'biz',\n 'tech',\n 'cc',\n 'tv',\n 'xyz',\n 'top',\n 'vip',\n 'pro',\n 'store',\n 'site',\n 'online',\n 'cloud',\n]);\n\nexport const websiteValidator = (\n url: string,\n needProtocol: boolean = true,\n needHost: boolean = true,\n allowedTlds?: string[]\n): boolean => {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (!trimmed) return false;\n\n const hasProtocol = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(trimmed);\n if (needProtocol && !hasProtocol) return false;\n\n const normalized = hasProtocol ? trimmed : `https://${trimmed}`;\n\n try {\n const parsed = new URL(normalized);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'http:' && protocol !== 'https:') return false;\n\n if (needHost) {\n const host = parsed.hostname.toLowerCase();\n if (!host) return false;\n if (host === 'localhost') return true;\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host)) {\n return host.split('.').every((segment) => {\n const num = Number(segment);\n return Number.isInteger(num) && num >= 0 && num <= 255;\n });\n }\n if (!DOMAIN_REGEX.test(host)) return false;\n const tld = host.split('.').pop() || '';\n const tldSet = allowedTlds\n ? new Set(allowedTlds.map((item) => item.toLowerCase()))\n : DEFAULT_ALLOWED_TLDS;\n if (!tldSet.has(tld)) return false;\n }\n return true;\n } catch {\n return false;\n }\n};\n\nconst trimTrailingPunctuation = (value: string): { core: string; suffix: string } => {\n const match = value.match(/^(.*?)([),.;!?]+)?$/);\n return {\n core: match?.[1] || value,\n suffix: match?.[2] || '',\n };\n};\n\nconst tokenizeText = (\n text: string,\n options?: LinkifyOptions\n): TextToken[] => {\n if (!text) return [];\n\n const tokens: TextToken[] = [];\n let lastIndex = 0;\n const regex = new RegExp(URL_CANDIDATE_REGEX);\n let match = regex.exec(text);\n\n while (match) {\n const matchedText = match[0];\n const start = match.index;\n const end = start + matchedText.length;\n\n if (start > lastIndex) {\n tokens.push({ type: 'text', text: text.slice(lastIndex, start) });\n }\n\n const { core, suffix } = trimTrailingPunctuation(matchedText);\n const href = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(core)\n ? core\n : `https://${core}`;\n const defaultIsValid = websiteValidator(\n core,\n options?.needProtocol ?? false,\n options?.needHost ?? true,\n options?.allowedTlds\n );\n const isValid = options?.validate ? options.validate(href) : defaultIsValid;\n\n if (isValid && core) {\n tokens.push({ type: 'url', text: core, href });\n if (suffix) {\n tokens.push({ type: 'text', text: suffix });\n }\n } else {\n tokens.push({ type: 'text', text: matchedText });\n }\n\n lastIndex = end;\n match = regex.exec(text);\n }\n\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', text: text.slice(lastIndex) });\n }\n\n return tokens;\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst ZWSP = '\\u200B';\nconst stripEditorArtifacts = (value: string): string =>\n value.replace(new RegExp(ZWSP, 'g'), '');\n\nconst renderTokensAsHtml = (\n text: string,\n options?: LinkifyOptions,\n disabled?: boolean\n): string => {\n const tokens = tokenizeText(text, options);\n if (tokens.length === 0) return '';\n\n const html = tokens\n .map((token) => {\n if (token.type === 'text') {\n return escapeHtml(token.text);\n }\n\n const classAttr = options?.className ? ` class=\"${options.className}\"` : '';\n const pointerEvents = disabled ? 'pointer-events: none;' : '';\n return `<a href=\"${escapeHtml(token.href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${classAttr} style=\"color: #2563EB; text-decoration: underline; ${pointerEvents}\">${escapeHtml(token.text)}</a>`;\n })\n .join('');\n\n // contentEditable 在末尾是换行时可能吞掉视觉换行,补一个零宽字符占位\n if (text.endsWith('\\n')) {\n return `${html}<span data-aha-zwsp=\"true\">${ZWSP}</span>`;\n }\n return html;\n};\n\nconst getCaretOffset = (container: HTMLElement): number => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return 0;\n\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer)) return 0;\n\n const preRange = range.cloneRange();\n preRange.selectNodeContents(container);\n preRange.setEnd(range.startContainer, range.startOffset);\n return stripEditorArtifacts(preRange.toString()).length;\n};\n\nconst setCaretOffset = (container: HTMLElement, offset: number): void => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (!selection) return;\n\n let remaining = Math.max(0, offset);\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let currentNode = walker.nextNode();\n\n while (currentNode) {\n const rawText = currentNode.textContent || '';\n let visibleCount = 0;\n let targetOffsetInNode = -1;\n for (let i = 0; i < rawText.length; i += 1) {\n if (rawText[i] !== ZWSP) {\n visibleCount += 1;\n }\n if (visibleCount === remaining) {\n targetOffsetInNode = i + 1;\n break;\n }\n }\n\n if (remaining === 0) {\n range.setStart(currentNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n if (targetOffsetInNode !== -1) {\n range.setStart(currentNode, targetOffsetInNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n remaining -= visibleCount;\n currentNode = walker.nextNode();\n }\n\n range.selectNodeContents(container);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n};\n\nconst getSelectionOffsets = (\n container: HTMLElement\n): { start: number; end: number } | null => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer) || !container.contains(range.endContainer)) {\n return null;\n }\n\n const startRange = range.cloneRange();\n startRange.selectNodeContents(container);\n startRange.setEnd(range.startContainer, range.startOffset);\n\n const endRange = range.cloneRange();\n endRange.selectNodeContents(container);\n endRange.setEnd(range.endContainer, range.endOffset);\n\n return {\n start: stripEditorArtifacts(startRange.toString()).length,\n end: stripEditorArtifacts(endRange.toString()).length,\n };\n};\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n linkify = false,\n linkifyOptions,\n label,\n required,\n hintText,\n helpIcon,\n ...restProps\n },\n ref\n ) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const isComposingRef = useRef(false);\n const caretOffsetRef = useRef<number | null>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref(仅原生 textarea 模式)\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(linkify ? null : textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n linkify ? null : textareaRef.current;\n }\n }, [ref, linkify]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const getMaxLengthValue = useMemo(\n () => (typeof maxLength === 'number' ? maxLength : undefined),\n [maxLength]\n );\n\n // 自动调整高度(原生 textarea)\n useEffect(() => {\n if (!linkify && autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize, linkify]);\n\n // 自动调整高度(linkify + contentEditable)\n useEffect(() => {\n if (!linkify || !autoSize || !editableRef.current) return;\n const editable = editableRef.current;\n const minRows = typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows = typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n const lineHeight = parseInt(\n window.getComputedStyle(editable).lineHeight || '24',\n 10\n );\n const minHeight = minRows * lineHeight + 24;\n const maxHeight = maxRows ? maxRows * lineHeight + 24 : undefined;\n\n editable.style.height = 'auto';\n let newHeight = Math.max(editable.scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n editable.style.height = `${newHeight}px`;\n editable.style.overflowY = maxHeight && editable.scrollHeight > maxHeight ? 'auto' : 'hidden';\n setHeight(newHeight);\n }, [autoSize, currentValue, linkify]);\n\n useLayoutEffect(() => {\n if (!linkify || !editableRef.current || isComposingRef.current) return;\n const editable = editableRef.current;\n const isActive = document.activeElement === editable;\n const fallbackOffset = isActive ? getCaretOffset(editable) : 0;\n const caretOffset = caretOffsetRef.current ?? fallbackOffset;\n const nextHtml = renderTokensAsHtml(\n String(currentValue || ''),\n linkifyOptions,\n disabled\n );\n\n if (editable.innerHTML !== nextHtml) {\n editable.innerHTML = nextHtml;\n }\n\n if (isActive) {\n const maxOffset = String(currentValue || '').length;\n setCaretOffset(editable, Math.min(caretOffset, maxOffset));\n }\n caretOffsetRef.current = null;\n }, [currentValue, disabled, linkify, linkifyOptions]);\n\n const notifyChange = (nextValue: string) => {\n const syntheticEvent = {\n target: { value: nextValue },\n currentTarget: { value: nextValue },\n } as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleEditableInput = () => {\n if (!editableRef.current || isComposingRef.current) return;\n caretOffsetRef.current = getCaretOffset(editableRef.current);\n const rawValue = stripEditorArtifacts(editableRef.current.textContent || '');\n const nextValue = getMaxLengthValue ? rawValue.slice(0, getMaxLengthValue) : rawValue;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n notifyChange(nextValue);\n };\n\n const handleEditablePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (readOnly || disabled) return;\n\n const pastedText = e.clipboardData.getData('text/plain');\n const currentText = String(currentValue || '');\n const selection = window.getSelection();\n let nextText = `${currentText}${pastedText}`;\n let caretOffset = currentText.length + pastedText.length;\n\n if (\n selection &&\n selection.rangeCount > 0 &&\n editableRef.current?.contains(selection.anchorNode)\n ) {\n const startOffset = getCaretOffset(editableRef.current);\n const endOffset = (() => {\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(editableRef.current);\n preRange.setEnd(range.endContainer, range.endOffset);\n return preRange.toString().length;\n })();\n nextText =\n currentText.slice(0, startOffset) +\n pastedText +\n currentText.slice(endOffset);\n caretOffset = startOffset + pastedText.length;\n }\n\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n caretOffset = Math.min(caretOffset, nextText.length);\n }\n caretOffsetRef.current = caretOffset;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const handleEditableKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (disabled || readOnly) return;\n if (!editableRef.current) return;\n\n e.preventDefault();\n const currentText = String(currentValue || '');\n const offsets = getSelectionOffsets(editableRef.current);\n const start = offsets?.start ?? currentText.length;\n const end = offsets?.end ?? start;\n\n let nextText = `${currentText.slice(0, start)}\\n${currentText.slice(end)}`;\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n }\n\n const nextCaret = Math.min(start + 1, nextText.length);\n caretOffsetRef.current = nextCaret;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const SHADOW_XS = 'var(--shadow-xs)';\n\n const getFocusStyles = (): React.CSSProperties => {\n if (disabled) return { border: '1px solid var(--color-border-disabled)', boxShadow: SHADOW_XS, outline: 'none' };\n if (error && focused) return { border: '1px solid var(--color-border-error)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-error)', outlineOffset: '-2px' };\n if (error) return { border: '1px solid var(--color-border-error_subtle)', boxShadow: SHADOW_XS, outline: 'none' };\n if (focused) return { border: '1px solid var(--color-border-brand)', boxShadow: SHADOW_XS, outline: '2px solid var(--color-border-brand)', outlineOffset: '-2px' };\n return { border: '1px solid var(--color-border-primary)', boxShadow: SHADOW_XS, outline: 'none' };\n };\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: 'var(--font-family-body)',\n borderRadius: 'var(--radius-md)',\n ...getFocusStyles(),\n backgroundColor:\n disabled || readOnly\n ? 'var(--color-bg-disabled_subtle)'\n : 'var(--color-bg-primary)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-primary)',\n fontSize: 'var(--font-size-text-md)',\n fontWeight: 400,\n lineHeight: 'var(--line-height-text-md)',\n padding: '12px 14px',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n resize: autoSize || linkify ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none',\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: var(--color-text-placeholder);\n font-size: var(--font-size-text-md);\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder { color: var(--color-text-placeholder); }\n .aha-textarea-wrapper textarea::-moz-placeholder { color: var(--color-text-placeholder); }\n .aha-textarea-wrapper textarea:-ms-input-placeholder { color: var(--color-text-placeholder); }\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n .aha-textarea-wrapper .aha-textarea-editable {\n white-space: pre-wrap;\n word-break: break-word;\n }\n .aha-textarea-wrapper .aha-textarea-editable:empty::before {\n content: attr(data-placeholder);\n color: var(--color-text-placeholder);\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\n }\n `;\n\n const textareaEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n {linkify ? (\n <div\n ref={editableRef}\n className=\"aha-textarea-editable\"\n contentEditable={!disabled && !readOnly}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-disabled={disabled}\n data-placeholder={placeholder || ''}\n onInput={handleEditableInput}\n onPaste={handleEditablePaste}\n onKeyDown={handleEditableKeyDown}\n onFocus={(e) => handleFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onBlur={(e) => handleBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n handleEditableInput();\n }}\n style={{\n ...baseStyles,\n minHeight: autoSize ? undefined : `${rows * 24 + 24}px`,\n overflowY: autoSize ? 'hidden' : 'auto',\n }}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n />\n ) : (\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n )}\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: 'var(--font-size-text-xs)',\n lineHeight: 'var(--line-height-text-xs)',\n color: disabled ? 'var(--color-text-disabled)' : 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return textareaEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 500,\n lineHeight: '20px',\n color: 'var(--color-text-secondary)',\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n }}>\n {label}\n {required && <span style={{ color: 'var(--color-error-600)', marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: 'var(--color-fg-quaternary)' }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {textareaEl}\n {hintText && (\n <p style={{\n margin: 0,\n fontFamily: 'var(--font-family-body)',\n fontSize: 'var(--font-size-text-sm)',\n fontWeight: 400,\n lineHeight: '20px',\n color: error ? 'var(--color-error-600)' : 'var(--color-text-tertiary)',\n }}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\nexport { default as TextareaTags } from './TextareaTags';\nexport type { TextareaTagsProps } from './TextareaTags';\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 预设日期范围列表(仅在范围模式下有效) */\n presetRanges?: PresetRange[] | boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\n });\n }\n };\n\n updatePosition();\n\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n // 关闭时重置标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n }\n }, [isOpen]);\n\n // 点击外部关闭\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n // 清空后,只有在日历关闭时才重置月份为当前月份\n // 如果日历是打开的,保持当前显示的月份不变\n if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 默认预设日期范围\n const defaultPresetRanges = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n \n // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes dropdownFadeInTop {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : (currentRangeValue.startDate || currentRangeValue.endDate) ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n ) : (\n // 范围模式:显示两个输入框\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n )\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\n </div>\n\n {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 显示选中的日期段(单月模式,在月份导航下面) */}\n {isRangeMode && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFieldsState] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={setItemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 菜单项右侧图标 */\n suffixIcon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\n updatePosition();\n });\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow:\n \"0px 2px 2px -1px var(--ColorsEffectsShadowsshadow-lg03), 0px 4px 6px -2px var(--ColorsEffectsShadowsshadow-lg02), 0px 12px 16px -4px var(--ColorsEffectsShadowsshadow-lg01)\",\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = 'var(--theme-color, #5A31F0)',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\n","import React, { useState } from 'react';\nimport type { MouseEventHandler, ReactNode } from 'react';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BadgeColor =\n | 'gray'\n | 'brand'\n | 'error'\n | 'warning'\n | 'success'\n | 'grayBlue'\n | 'blueLight'\n | 'blue'\n | 'indigo'\n | 'purple'\n | 'pink'\n | 'orange';\n\nexport type BadgeVariant = 'pill' | 'badge' | 'modern';\n\nexport type BadgeSize = 'sm' | 'md' | 'lg';\n\nexport type BadgeIconComponent = React.FC<{\n style?: React.CSSProperties;\n className?: string;\n}>;\n\n// ─── Color Tokens ─────────────────────────────────────────────────────────────\n\ninterface ColorTokens {\n bg: string;\n text: string;\n ring: string;\n dot: string;\n btnText: string;\n btnHoverBg: string;\n btnHoverText: string;\n}\n\nconst colorTokens: Record<BadgeColor, ColorTokens> = {\n gray: {\n bg: 'var(--color-gray-50)',\n text: 'var(--color-gray-700)',\n ring: 'var(--color-gray-200)',\n dot: 'var(--color-gray-500)',\n btnText: 'var(--color-gray-400)',\n btnHoverBg: 'var(--color-gray-100)',\n btnHoverText: 'var(--color-gray-500)',\n },\n brand: {\n bg: 'var(--color-brand-50)',\n text: 'var(--color-brand-700)',\n ring: 'var(--color-brand-200)',\n dot: 'var(--color-brand-500)',\n btnText: 'var(--color-brand-400)',\n btnHoverBg: 'var(--color-brand-100)',\n btnHoverText: 'var(--color-brand-500)',\n },\n error: {\n bg: 'var(--color-error-50)',\n text: 'var(--color-error-700)',\n ring: 'var(--color-error-200)',\n dot: 'var(--color-error-500)',\n btnText: 'var(--color-error-400)',\n btnHoverBg: 'var(--color-error-100)',\n btnHoverText: 'var(--color-error-500)',\n },\n warning: {\n bg: 'var(--color-warning-50)',\n text: 'var(--color-warning-700)',\n ring: 'var(--color-warning-200)',\n dot: 'var(--color-warning-500)',\n btnText: 'var(--color-warning-400)',\n btnHoverBg: 'var(--color-warning-100)',\n btnHoverText: 'var(--color-warning-500)',\n },\n success: {\n bg: 'var(--color-success-50)',\n text: 'var(--color-success-700)',\n ring: 'var(--color-success-200)',\n dot: 'var(--color-success-500)',\n btnText: 'var(--color-success-400)',\n btnHoverBg: 'var(--color-success-100)',\n btnHoverText: 'var(--color-success-500)',\n },\n grayBlue: {\n bg: 'var(--color-gray-blue-50)',\n text: 'var(--color-gray-blue-700)',\n ring: 'var(--color-gray-blue-200)',\n dot: 'var(--color-gray-blue-500)',\n btnText: 'var(--color-gray-blue-400)',\n btnHoverBg: 'var(--color-gray-blue-100)',\n btnHoverText: 'var(--color-gray-blue-500)',\n },\n blueLight: {\n bg: 'var(--color-blue-light-50)',\n text: 'var(--color-blue-light-700)',\n ring: 'var(--color-blue-light-200)',\n dot: 'var(--color-blue-light-500)',\n btnText: 'var(--color-blue-light-400)',\n btnHoverBg: 'var(--color-blue-light-100)',\n btnHoverText: 'var(--color-blue-light-500)',\n },\n blue: {\n bg: 'var(--color-blue-50)',\n text: 'var(--color-blue-700)',\n ring: 'var(--color-blue-200)',\n dot: 'var(--color-blue-500)',\n btnText: 'var(--color-blue-400)',\n btnHoverBg: 'var(--color-blue-100)',\n btnHoverText: 'var(--color-blue-500)',\n },\n indigo: {\n bg: 'var(--color-indigo-50)',\n text: 'var(--color-indigo-700)',\n ring: 'var(--color-indigo-200)',\n dot: 'var(--color-indigo-500)',\n btnText: 'var(--color-indigo-400)',\n btnHoverBg: 'var(--color-indigo-100)',\n btnHoverText: 'var(--color-indigo-500)',\n },\n purple: {\n bg: 'var(--color-purple-50)',\n text: 'var(--color-purple-700)',\n ring: 'var(--color-purple-200)',\n dot: 'var(--color-purple-500)',\n btnText: 'var(--color-purple-400)',\n btnHoverBg: 'var(--color-purple-100)',\n btnHoverText: 'var(--color-purple-500)',\n },\n pink: {\n bg: 'var(--color-pink-50)',\n text: 'var(--color-pink-700)',\n ring: 'var(--color-pink-200)',\n dot: 'var(--color-pink-500)',\n btnText: 'var(--color-pink-400)',\n btnHoverBg: 'var(--color-pink-100)',\n btnHoverText: 'var(--color-pink-500)',\n },\n orange: {\n bg: 'var(--color-orange-50)',\n text: 'var(--color-orange-700)',\n ring: 'var(--color-orange-200)',\n dot: 'var(--color-orange-500)',\n btnText: 'var(--color-orange-400)',\n btnHoverBg: 'var(--color-orange-100)',\n btnHoverText: 'var(--color-orange-500)',\n },\n};\n\n// ─── Size Configs ─────────────────────────────────────────────────────────────\n\nconst pillPadding: Record<BadgeSize, string> = {\n sm: '2px 8px',\n md: '2px 10px',\n lg: '4px 12px',\n};\nconst badgePadding: Record<BadgeSize, string> = {\n sm: '2px 6px',\n md: '2px 8px',\n lg: '4px 10px',\n};\nconst fontSize: Record<BadgeSize, string> = {\n sm: '12px',\n md: '14px',\n lg: '14px',\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getTokens(variant: BadgeVariant, color: BadgeColor) {\n if (variant === 'modern') {\n return {\n ...colorTokens[color],\n bg: 'var(--color-bg-primary)',\n text: 'var(--color-text-secondary)',\n ring: 'var(--color-border-secondary)',\n };\n }\n return colorTokens[color];\n}\n\nfunction getRootStyle(\n variant: BadgeVariant,\n color: BadgeColor,\n size: BadgeSize,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n const t = getTokens(variant, color);\n const isPill = variant === 'pill';\n const isLg = size === 'lg' && !isPill;\n const ring = `inset 0 0 0 1px ${t.ring}`;\n const shadow =\n variant === 'modern'\n ? `${ring}, 0px 1px 2px 0px rgba(10, 13, 18, 0.05)`\n : ring;\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n width: 'max-content',\n borderRadius: isPill ? '9999px' : isLg ? '8px' : '6px',\n backgroundColor: t.bg,\n color: t.text,\n boxShadow: shadow,\n fontFamily: 'DM Sans, system-ui, sans-serif',\n fontWeight: 500,\n fontSize: fontSize[size],\n lineHeight: size === 'sm' ? '18px' : '20px',\n padding: isPill ? pillPadding[size] : badgePadding[size],\n ...extra,\n };\n}\n\n// ─── Dot ──────────────────────────────────────────────────────────────────────\n\nconst BadgeDot: React.FC<{ color: string }> = ({ color }) => (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill={color} />\n </svg>\n);\n\n// ─── X Icon ───────────────────────────────────────────────────────────────────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={style}\n >\n <path d=\"M9 3L3 9M3 3l6 6\" />\n </svg>\n);\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => (\n <span\n style={{ ...getRootStyle(variant, color, size), ...style }}\n className={className}\n >\n {children}\n </span>\n);\n\n// ─── BadgeWithDot ─────────────────────────────────────────────────────────────\n\nexport interface BadgeWithDotProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithDot: React.FC<BadgeWithDotProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const dotColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const isPill = variant === 'pill';\n const dotPaddingLeft: Record<BadgeSize, string> = { sm: isPill ? '6px' : '6px', md: isPill ? '8px' : '8px', lg: isPill ? '10px' : '10px' };\n const dotPaddingRight: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: dotPaddingLeft[size],\n paddingRight: dotPaddingRight[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <BadgeDot color={dotColor} />\n {children}\n </span>\n );\n};\n\n// ─── BadgeWithIcon ────────────────────────────────────────────────────────────\n\nexport interface BadgeWithIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n iconLeading?: BadgeIconComponent;\n iconTrailing?: BadgeIconComponent;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithIcon: React.FC<BadgeWithIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n iconLeading: IconLeading,\n iconTrailing: IconTrailing,\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '4px', lg: '4px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n const isPill = variant === 'pill';\n const hasLeading = !!IconLeading;\n\n const smPad = { pl: isPill ? (hasLeading ? '6px' : '8px') : (hasLeading ? '6px' : '8px'), pr: isPill ? (hasLeading ? '8px' : '6px') : (hasLeading ? '8px' : '6px') };\n const mdPad = { pl: isPill ? (hasLeading ? '8px' : '10px') : (hasLeading ? '8px' : '8px'), pr: isPill ? (hasLeading ? '10px' : '8px') : (hasLeading ? '8px' : '8px') };\n const lgPad = { pl: isPill ? (hasLeading ? '10px' : '12px') : (hasLeading ? '10px' : '10px'), pr: isPill ? (hasLeading ? '12px' : '10px') : (hasLeading ? '10px' : '10px') };\n const padMap: Record<BadgeSize, { pl: string; pr: string }> = { sm: smPad, md: mdPad, lg: lgPad };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: padMap[size].pl,\n paddingRight: padMap[size].pr,\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {IconLeading && (\n <IconLeading style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n {children}\n {IconTrailing && (\n <IconTrailing style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n </span>\n );\n};\n\n// ─── BadgeWithButton ──────────────────────────────────────────────────────────\n\nexport interface BadgeWithButtonProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon?: BadgeIconComponent;\n children: ReactNode;\n buttonLabel?: string;\n onButtonClick?: MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithButton: React.FC<BadgeWithButtonProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n buttonLabel,\n onButtonClick,\n children,\n style,\n className,\n}) => {\n const [hovered, setHovered] = useState(false);\n const t = getTokens(variant, color);\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '2px', lg: '2px' };\n const isPill = variant === 'pill';\n const plMap: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n const prMap: Record<BadgeSize, string> = { sm: isPill ? '3px' : '3px', md: isPill ? '4px' : '4px', lg: isPill ? '6px' : '6px' };\n const btnBorderRadius = isPill ? '9999px' : '3px';\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {children}\n <button\n type=\"button\"\n aria-label={buttonLabel}\n onClick={onButtonClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2px',\n border: 'none',\n cursor: 'pointer',\n borderRadius: btnBorderRadius,\n backgroundColor: hovered ? t.btnHoverBg : 'transparent',\n color: hovered ? t.btnHoverText : t.btnText,\n transition: 'background-color 100ms linear, color 100ms linear',\n outline: 'none',\n flexShrink: 0,\n }}\n >\n {Icon ? (\n <Icon style={{ width: '12px', height: '12px' }} />\n ) : (\n <XIcon />\n )}\n </button>\n </span>\n );\n};\n\n// ─── BadgeIcon ────────────────────────────────────────────────────────────────\n\nexport interface BadgeIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon: BadgeIconComponent;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeIcon: React.FC<BadgeIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? colorTokens[color].dot : t.dot;\n const padMap: Record<BadgeSize, string> = { sm: '5px', md: '6px', lg: '8px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n padding: padMap[size],\n ...style,\n }}\n className={className}\n >\n <Icon style={{ width: iconSize[size], height: iconSize[size], color: iconColor }} />\n </span>\n );\n};\n\n// ─── BadgeWithImage ───────────────────────────────────────────────────────────\n\nexport interface BadgeWithImageProps {\n variant?: Exclude<BadgeVariant, 'modern'>;\n size?: BadgeSize;\n color?: BadgeColor;\n imgSrc: string;\n imgAlt?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithImage: React.FC<BadgeWithImageProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n imgSrc,\n imgAlt = 'avatar',\n children,\n style,\n className,\n}) => {\n const isPill = variant === 'pill';\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const plMap: Record<BadgeSize, string> = {\n sm: isPill ? '3px' : '4px',\n md: isPill ? '4px' : '6px',\n lg: isPill ? '6px' : '8px',\n };\n const prMap: Record<BadgeSize, string> = {\n sm: isPill ? '8px' : '6px',\n md: isPill ? '10px' : '8px',\n lg: isPill ? '12px' : '10px',\n };\n const imgSize: Record<BadgeSize, string> = { sm: '16px', md: '16px', lg: '18px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <img\n src={imgSrc}\n alt={imgAlt}\n style={{\n width: imgSize[size],\n height: imgSize[size],\n borderRadius: '9999px',\n objectFit: 'cover',\n flexShrink: 0,\n }}\n />\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import React, { type FC, useState } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface AvatarProps {\n size?: AvatarSize;\n src?: string | null;\n alt?: string;\n /** Two-letter initials displayed when no image is provided */\n initials?: string;\n /** Custom icon component displayed as placeholder */\n placeholderIcon?: FC<{ style?: React.CSSProperties }>;\n /** Online/offline status indicator dot */\n status?: 'online' | 'offline';\n /** Company logo badge displayed bottom-right */\n companyIcon?: { src: string; alt?: string };\n /** Blue verified checkmark badge */\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport interface AvatarLabelGroupProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n name: string;\n supportingText?: string;\n avatarSrc?: string | null;\n avatarInitials?: string;\n status?: 'online' | 'offline';\n companyIcon?: { src: string; alt?: string };\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ─── Size Config ────────────────────────────────────────────────────────────────\n\ninterface SizeConfig {\n size: number;\n border: number;\n fontSize: string;\n lineHeight: string;\n iconSize: number;\n onlineIndicator: { size: number; offset: number };\n companyIcon: { size: number; offset: number; border: number };\n verifiedTick: { size: number; offset: number };\n}\n\nconst SIZE_CONFIG: Record<AvatarSize, SizeConfig> = {\n xs: {\n size: 24, border: 0.5, fontSize: 'var(--font-size-text-xs)', lineHeight: 'var(--line-height-text-xs)', iconSize: 16,\n onlineIndicator: { size: 6, offset: -0.5 },\n companyIcon: { size: 10, offset: -2.5, border: 1.5 },\n verifiedTick: { size: 10, offset: -1.5 },\n },\n sm: {\n size: 32, border: 0.75, fontSize: 'var(--font-size-text-sm)', lineHeight: 'var(--line-height-text-sm)', iconSize: 20,\n onlineIndicator: { size: 8, offset: -0.75 },\n companyIcon: { size: 12, offset: -2.75, border: 1.5 },\n verifiedTick: { size: 12, offset: -0.75 },\n },\n md: {\n size: 40, border: 1, fontSize: 'var(--font-size-text-md)', lineHeight: 'var(--line-height-text-md)', iconSize: 24,\n onlineIndicator: { size: 10, offset: -1 },\n companyIcon: { size: 14, offset: -3, border: 1.5 },\n verifiedTick: { size: 14, offset: -1 },\n },\n lg: {\n size: 48, border: 1, fontSize: 'var(--font-size-text-lg)', lineHeight: 'var(--line-height-text-lg)', iconSize: 28,\n onlineIndicator: { size: 12, offset: -1 },\n companyIcon: { size: 16, offset: -3, border: 1.5 },\n verifiedTick: { size: 16, offset: -1 },\n },\n xl: {\n size: 56, border: 1, fontSize: 'var(--font-size-text-xl)', lineHeight: 'var(--line-height-text-xl)', iconSize: 32,\n onlineIndicator: { size: 14, offset: -1 },\n companyIcon: { size: 18, offset: -3, border: 1.5 },\n verifiedTick: { size: 18, offset: -1 },\n },\n '2xl': {\n size: 64, border: 1, fontSize: 'var(--font-size-display-xs)', lineHeight: 'var(--line-height-display-xs)', iconSize: 32,\n onlineIndicator: { size: 16, offset: -1 },\n companyIcon: { size: 20, offset: -3, border: 1.667 },\n verifiedTick: { size: 20, offset: -1 },\n },\n};\n\n// ─── AvatarLabelGroup Size Config ───────────────────────────────────────────────\n\ninterface LabelGroupSizeConfig {\n gap: string;\n nameFontSize: string;\n nameLineHeight: string;\n subFontSize: string;\n subLineHeight: string;\n}\n\nconst LABEL_GROUP_SIZE_CONFIG: Record<'sm' | 'md' | 'lg' | 'xl', LabelGroupSizeConfig> = {\n sm: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-xs)', subLineHeight: 'var(--line-height-text-xs)' },\n md: { gap: 'var(--spacing-md)', nameFontSize: 'var(--font-size-text-sm)', nameLineHeight: 'var(--line-height-text-sm)', subFontSize: 'var(--font-size-text-sm)', subLineHeight: 'var(--line-height-text-sm)' },\n lg: { gap: 'var(--spacing-lg)', nameFontSize: 'var(--font-size-text-md)', nameLineHeight: 'var(--line-height-text-md)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n xl: { gap: 'var(--spacing-xl)', nameFontSize: 'var(--font-size-text-lg)', nameLineHeight: 'var(--line-height-text-lg)', subFontSize: 'var(--font-size-text-md)', subLineHeight: 'var(--line-height-text-md)' },\n};\n\n// ─── Default User Icon ──────────────────────────────────────────────────────────\n\nconst UserIcon: FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <path\n d=\"M20 21C20 19.6044 20 18.9067 19.8278 18.3389C19.44 17.0605 18.4395 16.06 17.1611 15.6722C16.5933 15.5 15.8956 15.5 14.5 15.5H9.5C8.10444 15.5 7.40665 15.5 6.83886 15.6722C5.56045 16.06 4.56004 17.0605 4.17224 18.3389C4 18.9067 4 19.6044 4 21M16.5 7.5C16.5 9.98528 14.4853 12 12 12C9.51472 12 7.5 9.98528 7.5 7.5C7.5 5.01472 9.51472 3 12 3C14.4853 3 16.5 5.01472 16.5 7.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── Verified Tick ─────────────────────────────────────────────────────────────\n\nconst VerifiedTickBadge: FC<{ size: number; offset: number }> = ({ size, offset }) => (\n <svg\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: size,\n height: size,\n flexShrink: 0,\n color: 'var(--color-blue-500)',\n overflow: 'hidden',\n zIndex: 1,\n }}\n >\n <path\n d=\"M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// ─── Avatar ─────────────────────────────────────────────────────────────────────\n\nconst Avatar: React.FC<AvatarProps> = ({\n size = 'md',\n src,\n alt,\n initials,\n placeholderIcon: PlaceholderIcon,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const [imgFailed, setImgFailed] = useState(false);\n const cfg = SIZE_CONFIG[size];\n const canShowImage = Boolean(src && !imgFailed);\n const isPlaceholder = !canShowImage;\n const hasBadge = Boolean(status || companyIcon || verified);\n\n const renderContent = () => {\n if (canShowImage) {\n return (\n <img\n src={src!}\n alt={alt}\n onError={() => setImgFailed(true)}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (initials) {\n return (\n <span\n style={{\n fontSize: cfg.fontSize,\n lineHeight: cfg.lineHeight,\n fontWeight: 600,\n color: 'var(--color-text-quaternary)',\n fontFamily: 'var(--font-family-body)',\n userSelect: 'none',\n }}\n >\n {initials}\n </span>\n );\n }\n if (PlaceholderIcon) {\n return (\n <PlaceholderIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <UserIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: 'var(--color-fg-quaternary)',\n flexShrink: 0,\n }}\n />\n );\n };\n\n const renderBadge = () => {\n if (status === 'online' || status === 'offline') {\n const { size: iSize, offset } = cfg.onlineIndicator;\n return (\n <span\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: iSize,\n height: iSize,\n borderRadius: '50%',\n backgroundColor:\n status === 'online'\n ? 'var(--color-fg-success-secondary)'\n : 'var(--color-fg-quaternary)',\n border: '1.5px solid var(--color-bg-primary)',\n flexShrink: 0,\n }}\n />\n );\n }\n if (companyIcon) {\n const { size: cSize, offset, border } = cfg.companyIcon;\n return (\n <img\n src={companyIcon.src}\n alt={companyIcon.alt}\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: cSize,\n height: cSize,\n borderRadius: '50%',\n border: `${border}px solid var(--color-bg-primary)`,\n objectFit: 'cover',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (verified) {\n return (\n <VerifiedTickBadge\n size={cfg.verifiedTick.size}\n offset={cfg.verifiedTick.offset}\n />\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: cfg.size,\n height: cfg.size,\n borderRadius: '50%',\n border: `${cfg.border}px solid ${isPlaceholder ? 'var(--color-border-secondary)' : 'rgba(0, 0, 0, 0.08)'}`,\n backgroundColor: isPlaceholder ? 'var(--color-bg-tertiary)' : undefined,\n overflow: hasBadge ? undefined : 'hidden',\n flexShrink: 0,\n ...style,\n }}\n >\n {renderContent()}\n {renderBadge()}\n </div>\n );\n};\n\n// ─── AvatarLabelGroup ────────────────────────────────────────────────────────────\n\nexport const AvatarLabelGroup: React.FC<AvatarLabelGroupProps> = ({\n size = 'sm',\n name,\n supportingText,\n avatarSrc,\n avatarInitials,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const cfg = LABEL_GROUP_SIZE_CONFIG[size];\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: cfg.gap,\n position: 'relative',\n ...style,\n }}\n >\n <Avatar\n size={size}\n src={avatarSrc}\n initials={avatarInitials}\n status={status}\n companyIcon={companyIcon}\n verified={verified}\n />\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n fontSize: cfg.nameFontSize,\n lineHeight: cfg.nameLineHeight,\n fontWeight: 600,\n color: 'var(--color-text-primary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {name}\n </span>\n {supportingText && (\n <span\n style={{\n fontSize: cfg.subFontSize,\n lineHeight: cfg.subLineHeight,\n fontWeight: 400,\n color: 'var(--color-text-tertiary)',\n fontFamily: 'var(--font-family-body)',\n }}\n >\n {supportingText}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Avatar;\n"],"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","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","SHADOW_XS","sizeMap","pt","pb","InputGroup","forwardRef","ref","readOnly","prefix","suffix","leadingText","trailingText","leadingAddon","trailingAddon","onFocus","onBlur","onPressEnter","defaultValue","onChange","placeholder","required","hintText","restProps","inputRef","useRef","setFocused","internalValue","setInternalValue","current","isControlled","currentValue","dividerColor","hasPrefixIcon","hasSuffixIcon","iconSlotStyle","addonTextStyle","groupEl","borderRight","target","autoComplete","borderLeft","hintStyle","margin","containerPadding","tagSizeMap","InputTags","internalTags","setInternalTags","inputValue","setInputValue","tags","updateTags","addTag","tag","trimmed","trim","includes","removeTag","index","tagSize","tagsEl","focus","flexWrap","sizeStyles","ClearIcon","Input","allowClear","onClear","showClear","_m","baseStyles","WebkitAppearance","MozAppearance","appearance","inputEl","autoCorrect","autoCapitalize","spellCheck","Select","controlledValue","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","dropdownClassName","dropdownStyle","_o","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","_q","_r","internalOpen","setInternalOpen","_s","searchValue","setSearchValue","_t","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","getFilteredOptions","String","toLowerCase","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","handleClear","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","Fragment","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","minHeight","val","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","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","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","TextareaTags","helpIcon","resize","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","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","textareaEl","contentEditable","suppressContentEditableWarning","onInput","onPaste","pastedText","clipboardData","getData","currentText","nextText","anchorNode","endOffset","endContainer","nativeEvent","isComposing","offsets","startRange","endRange","getSelectionOffsets","nextCaret","onCompositionStart","onCompositionEnd","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","thumbSize","thumbOffset","thumbLeft","newChecked","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","showSelectedRange","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","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","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","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","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","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]}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@3.30.0_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/tokens.ts","../src/components/shared/colorUtils.ts","../src/components/shared/buttonStyles.ts","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Alert/index.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/components/shared/fieldStyles.ts","../src/components/Input/InputGroup.tsx","../src/components/Input/InputTags.tsx","../src/components/Input/index.tsx","../src/components/Select/index.tsx","../src/icons/index.tsx","../src/components/Pagination/index.tsx","../src/components/shared/controlStyles.ts","../src/components/Checkbox/index.tsx","../src/components/Table/index.tsx","../src/components/Radio/index.tsx","../src/components/Tab/index.tsx","../src/components/Progress/index.tsx","../src/components/Textarea/TextareaTags.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/index.tsx","../src/components/DatePicker/index.tsx","../src/components/Form/FormContext.tsx","../src/components/Form/index.tsx","../src/components/Form/FormItem.tsx","../src/components/MenuList/index.tsx","../src/components/Tooltip/index.tsx","../src/components/Popover/index.tsx","../src/components/Drawer/index.tsx","../src/components/Loading/index.tsx","../src/components/shared/badgeColors.ts","../src/components/Badge/index.tsx","../src/components/Avatar/index.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\n\nexport interface ThemeConfig {\n primaryColor?: string;\n}\n\nconst defaultTheme: ThemeConfig = {\n primaryColor: '#FB6011',\n};\n\nconst ThemeContext = createContext<ThemeConfig>(defaultTheme);\n\nexport interface ThemeProviderProps {\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const themeValue = useMemo(() => {\n return {\n ...defaultTheme,\n ...theme,\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={themeValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeConfig => {\n const context = useContext(ThemeContext);\n if (!context) {\n // 如果没有 Provider,返回默认主题\n return defaultTheme;\n }\n return context;\n};\n\n// 导出默认主题色,供组件内部使用\nexport const getDefaultPrimaryColor = () => defaultTheme.primaryColor!;\n\n","/**\n * Aha Components — Design Tokens (TypeScript)\n * Source: Untitled UI (Tokens Studio export), brand: Orange (#fb6011)\n * Synced with tokens.json / theme.css\n */\n\n// ─────────────────────────────────────────\n// Primitives: Base\n// ─────────────────────────────────────────\nexport const colorBase = {\n white: '#ffffff',\n black: '#000000',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Brand (Orange)\n// ─────────────────────────────────────────\nexport const colorBrandScale = {\n 25: '#fff9f2',\n 50: '#fff6ed',\n 100: '#ffead5',\n 200: '#ffd1a9',\n 300: '#feb073',\n 400: '#fd843a',\n 500: '#fb6011',\n 600: '#ec470a',\n 700: '#c4330a',\n 800: '#9b2911',\n 900: '#7d2511',\n 950: '#441006',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Error\n// ─────────────────────────────────────────\nexport const colorErrorScale = {\n 25: '#fffbfa',\n 50: '#fef3f2',\n 100: '#fee4e2',\n 200: '#fecdca',\n 300: '#fda29b',\n 400: '#f97066',\n 500: '#f04438',\n 600: '#d92d20',\n 700: '#b42318',\n 800: '#912018',\n 900: '#7a271a',\n 950: '#55160c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Warning\n// ─────────────────────────────────────────\nexport const colorWarningScale = {\n 25: '#fffcf5',\n 50: '#fffaeb',\n 100: '#fef0c7',\n 200: '#fedf89',\n 300: '#fec84b',\n 400: '#fdb022',\n 500: '#f79009',\n 600: '#dc6803',\n 700: '#b54708',\n 800: '#93370d',\n 900: '#7a2e0e',\n 950: '#4e1d09',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Success\n// ─────────────────────────────────────────\nexport const colorSuccessScale = {\n 25: '#f6fef9',\n 50: '#ecfdf3',\n 100: '#dcfae6',\n 200: '#abefc6',\n 300: '#75e0a7',\n 400: '#47cd89',\n 500: '#17b26a',\n 600: '#079455',\n 700: '#067647',\n 800: '#085d3a',\n 900: '#074d31',\n 950: '#053321',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Gray (warm gray — neutral scale)\n// ─────────────────────────────────────────\nexport const colorGray = {\n 25: '#fdfdfc',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d7d3d0',\n 400: '#a9a29d',\n 500: '#79716b',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#171412',\n} as const;\n\n// Backward-compat alias (components use colorNeutral[200] etc.)\nexport const colorNeutral = colorGray;\n\n// ─────────────────────────────────────────\n// Primitives: Gray Blue\n// ─────────────────────────────────────────\nexport const colorGrayBlue = {\n 25: '#fcfcfd',\n 50: '#f8f9fc',\n 100: '#eaecf5',\n 200: '#d5d9eb',\n 300: '#b3b8db',\n 400: '#717bbc',\n 500: '#4e5ba6',\n 600: '#3e4784',\n 700: '#363f72',\n 800: '#293056',\n 900: '#101323',\n 950: '#0d0f1c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Moss\n// ─────────────────────────────────────────\nexport const colorMoss = {\n 25: '#fafdf7',\n 50: '#f5fbee',\n 100: '#e6f4d7',\n 200: '#ceeab0',\n 300: '#acdc79',\n 400: '#86cb3c',\n 500: '#669f2a',\n 600: '#4f7a21',\n 700: '#3f621a',\n 800: '#335015',\n 900: '#2b4212',\n 950: '#1a280b',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Green Light\n// ─────────────────────────────────────────\nexport const colorGreenLight = {\n 25: '#fafef5',\n 50: '#f3fee7',\n 100: '#e3fbcc',\n 200: '#d0f8ab',\n 300: '#a6ef67',\n 400: '#85e13a',\n 500: '#66c61c',\n 600: '#4ca30d',\n 700: '#3b7c0f',\n 800: '#326212',\n 900: '#2b5314',\n 950: '#15290a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Green\n// ─────────────────────────────────────────\nexport const colorGreen = {\n 25: '#f6fef9',\n 50: '#edfcf2',\n 100: '#d3f8df',\n 200: '#aaf0c4',\n 300: '#73e2a3',\n 400: '#3ccb7f',\n 500: '#16b364',\n 600: '#099250',\n 700: '#087443',\n 800: '#095c37',\n 900: '#084c2e',\n 950: '#052e1c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Teal\n// ─────────────────────────────────────────\nexport const colorTeal = {\n 25: '#f6fefc',\n 50: '#f0fdf9',\n 100: '#ccfbef',\n 200: '#99f6e0',\n 300: '#5fe9d0',\n 400: '#2ed3b7',\n 500: '#15b79e',\n 600: '#0e9384',\n 700: '#107569',\n 800: '#125d56',\n 900: '#134e48',\n 950: '#0a2926',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Cyan\n// ─────────────────────────────────────────\nexport const colorCyan = {\n 25: '#f5feff',\n 50: '#ecfdff',\n 100: '#cff9fe',\n 200: '#a5f0fc',\n 300: '#67e3f9',\n 400: '#22ccee',\n 500: '#06aed4',\n 600: '#088ab2',\n 700: '#0e7090',\n 800: '#155b75',\n 900: '#164c63',\n 950: '#0d2d3a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue Light\n// ─────────────────────────────────────────\nexport const colorBlueLight = {\n 25: '#f5fbff',\n 50: '#f0f9ff',\n 100: '#e0f2fe',\n 200: '#b9e6fe',\n 300: '#7cd4fd',\n 400: '#36bffa',\n 500: '#0ba5ec',\n 600: '#0086c9',\n 700: '#026aa2',\n 800: '#065986',\n 900: '#0b4a6f',\n 950: '#062c41',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue\n// ─────────────────────────────────────────\nexport const colorBlue = {\n 25: '#f5faff',\n 50: '#eff8ff',\n 100: '#d1e9ff',\n 200: '#b2ddff',\n 300: '#84caff',\n 400: '#53b1fd',\n 500: '#2e90fa',\n 600: '#1570ef',\n 700: '#175cd3',\n 800: '#1849a9',\n 900: '#194185',\n 950: '#102a56',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Blue Dark\n// ─────────────────────────────────────────\nexport const colorBlueDark = {\n 25: '#f5f8ff',\n 50: '#eff4ff',\n 100: '#d1e0ff',\n 200: '#b2ccff',\n 300: '#84adff',\n 400: '#528bff',\n 500: '#2970ff',\n 600: '#155eef',\n 700: '#004eeb',\n 800: '#0040c1',\n 900: '#00359e',\n 950: '#002266',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Indigo\n// ─────────────────────────────────────────\nexport const colorIndigo = {\n 25: '#f5f8ff',\n 50: '#eef4ff',\n 100: '#e0eaff',\n 200: '#c7d7fe',\n 300: '#a4bcfd',\n 400: '#8098f9',\n 500: '#6172f3',\n 600: '#444ce7',\n 700: '#3538cd',\n 800: '#2d31a6',\n 900: '#2d3282',\n 950: '#1f235b',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Violet\n// ─────────────────────────────────────────\nexport const colorViolet = {\n 25: '#fbfaff',\n 50: '#f5f3ff',\n 100: '#ece9fe',\n 200: '#ddd6fe',\n 300: '#c3b5fd',\n 400: '#a48afb',\n 500: '#875bf7',\n 600: '#7839ee',\n 700: '#6927da',\n 800: '#5720b7',\n 900: '#491c96',\n 950: '#2e125e',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Purple\n// ─────────────────────────────────────────\nexport const colorPurple = {\n 25: '#fafaff',\n 50: '#f4f3ff',\n 100: '#ebe9fe',\n 200: '#d9d6fe',\n 300: '#bdb4fe',\n 400: '#9b8afb',\n 500: '#7a5af8',\n 600: '#6938ef',\n 700: '#5925dc',\n 800: '#4a1fb8',\n 900: '#3e1c96',\n 950: '#27115f',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Fuchsia\n// ─────────────────────────────────────────\nexport const colorFuchsia = {\n 25: '#fefaff',\n 50: '#fdf4ff',\n 100: '#fbe8ff',\n 200: '#f6d0fe',\n 300: '#eeaafd',\n 400: '#e478fa',\n 500: '#d444f1',\n 600: '#ba24d5',\n 700: '#9f1ab1',\n 800: '#821890',\n 900: '#6f1877',\n 950: '#47104c',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Pink\n// ─────────────────────────────────────────\nexport const colorPink = {\n 25: '#fef6fb',\n 50: '#fdf2fa',\n 100: '#fce7f6',\n 200: '#fcceee',\n 300: '#faa7e0',\n 400: '#f670c7',\n 500: '#ee46bc',\n 600: '#dd2590',\n 700: '#c11574',\n 800: '#9e165f',\n 900: '#851651',\n 950: '#4e0d30',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Rose\n// ─────────────────────────────────────────\nexport const colorRose = {\n 25: '#fff5f6',\n 50: '#fff1f3',\n 100: '#ffe4e8',\n 200: '#fecdd6',\n 300: '#fea3b4',\n 400: '#fd6f8e',\n 500: '#f63d68',\n 600: '#e31b54',\n 700: '#c01048',\n 800: '#a11043',\n 900: '#89123e',\n 950: '#510b24',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Orange Dark\n// ─────────────────────────────────────────\nexport const colorOrangeDark = {\n 25: '#fff9f5',\n 50: '#fff4ed',\n 100: '#ffe6d5',\n 200: '#ffd6ae',\n 300: '#ff9c66',\n 400: '#ff692e',\n 500: '#ff4405',\n 600: '#e62e05',\n 700: '#bc1b06',\n 800: '#97180c',\n 900: '#771a0d',\n 950: '#57130a',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Orange\n// ─────────────────────────────────────────\nexport const colorOrange = {\n 25: '#fefaf5',\n 50: '#fef6ee',\n 100: '#fdead7',\n 200: '#f9dbaf',\n 300: '#f7b27a',\n 400: '#f38744',\n 500: '#ef6820',\n 600: '#e04f16',\n 700: '#b93815',\n 800: '#932f19',\n 900: '#772917',\n 950: '#511c10',\n} as const;\n\n// ─────────────────────────────────────────\n// Primitives: Yellow\n// ─────────────────────────────────────────\nexport const colorYellow = {\n 25: '#fefdf0',\n 50: '#fefbe8',\n 100: '#fef7c3',\n 200: '#feee95',\n 300: '#fde272',\n 400: '#fac515',\n 500: '#eaaa08',\n 600: '#ca8504',\n 700: '#a15c07',\n 800: '#854a0e',\n 900: '#713b12',\n 950: '#542c0d',\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorBrand (used by components)\n// ─────────────────────────────────────────\nexport const colorBrand = {\n primary: colorBrandScale[500], // #fb6011\n hover: colorBrandScale[400], // #fd843a\n pressed: colorBrandScale[600], // #ec470a\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorSemantic (used by components)\n// ─────────────────────────────────────────\nexport const colorSemantic = {\n success: {\n bg: colorSuccessScale[50], // #ecfdf3\n text: colorSuccessScale[600], // #079455\n border: colorSuccessScale[200], // #abefc6\n fill: colorSuccessScale[500], // #17b26a\n icon: colorSuccessScale[600], // #079455\n },\n error: {\n bg: colorErrorScale[50], // #fef3f2\n text: colorErrorScale[700], // #b42318\n border: colorErrorScale[200], // #fecdca\n strong: colorErrorScale[500], // #f04438 (used for input error border)\n fill: colorErrorScale[600], // #d92d20\n icon: colorErrorScale[500], // #f04438\n },\n warning: {\n bg: colorWarningScale[50], // #fffaeb\n text: colorWarningScale[600], // #dc6803\n border: colorWarningScale[200], // #fedf89\n fill: colorWarningScale[400], // #fdb022\n icon: colorWarningScale[600], // #dc6803\n },\n info: {\n bg: colorBlue[50], // #eff8ff\n text: colorBlue[700], // #175cd3\n border: colorBlue[200], // #b2ddff\n fill: colorBlue[500], // #2e90fa\n icon: colorBlue[600], // #1570ef\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Backward-compat: colorDecorative (Tag 系列)\n// ─────────────────────────────────────────\nexport const colorDecorative = {\n Green: { bg: colorSuccessScale[50], text: colorSuccessScale[700], border: colorSuccessScale[200], fill: colorSuccessScale[500], icon: colorSuccessScale[600] },\n Red: { bg: colorErrorScale[50], text: colorErrorScale[800], border: colorErrorScale[200], fill: colorErrorScale[500], icon: colorErrorScale[600] },\n Orange: { bg: colorBrandScale[50], text: colorBrandScale[800], border: colorBrandScale[200], fill: colorBrandScale[500], icon: colorBrandScale[700] },\n Cyan: { bg: colorCyan[50], text: colorCyan[700], border: colorCyan[200], fill: colorCyan[500], icon: colorCyan[600] },\n Violet: { bg: colorViolet[50], text: colorViolet[700], border: colorViolet[200], fill: colorViolet[500], icon: colorViolet[600] },\n Pink: { bg: colorPink[50], text: colorPink[700], border: colorPink[200], fill: colorPink[500], icon: colorPink[600] },\n Yellow: { bg: colorWarningScale[50], text: colorWarningScale[700], border: colorWarningScale[200], fill: colorWarningScale[400], icon: colorWarningScale[600] },\n Blue: { bg: colorBlue[50], text: colorBlue[700], border: colorBlue[200], fill: colorBlue[500], icon: colorBlue[600] },\n Gray: { bg: colorGray[100], text: colorGray[700], border: colorGray[200], fill: colorGray[700], icon: colorGray[600] },\n} as const;\n\nexport type DecorativeColor = keyof typeof colorDecorative;\n\n// ─────────────────────────────────────────\n// Semantic tokens — Light mode\n// ─────────────────────────────────────────\nexport const semanticText = {\n primary: '#1c1917',\n secondary: '#44403c',\n tertiary: '#57534e',\n quaternary: '#79716b',\n disabled: '#79716b',\n placeholder: '#79716b',\n placeholderSubtle: '#d7d3d0',\n white: '#ffffff',\n brandPrimary: '#7d2511',\n brandSecondary: '#ec470a',\n brandTertiary: '#fb6011',\n errorPrimary: '#d92d20',\n warningPrimary: '#dc6803',\n successPrimary: '#079455',\n} as const;\n\nexport const semanticBorder = {\n primary: '#d7d3d0',\n secondary: '#e7e5e4',\n tertiary: '#f5f5f4',\n brand: '#fb6011',\n error: '#f04438',\n errorSubtle: '#fda29b',\n disabled: '#d7d3d0',\n disabledSubtle: '#e7e5e4',\n} as const;\n\nexport const semanticBg = {\n primary: '#ffffff',\n secondary: '#fafaf9',\n tertiary: '#f5f5f4',\n quaternary: '#e7e5e4',\n disabled: '#f5f5f4',\n disabledSubtle: '#fafaf9',\n overlay: '#171412',\n brandPrimary: '#fff6ed',\n brandSecondary: '#ffead5',\n brandSolid: '#fb6011',\n brandSolidHover: '#ec470a',\n errorPrimary: '#fef3f2',\n errorSolid: '#d92d20',\n warningPrimary: '#fffaeb',\n warningSolid: '#dc6803',\n successPrimary: '#ecfdf3',\n successSolid: '#079455',\n} as const;\n\nexport const semanticFg = {\n primary: '#1c1917',\n secondary: '#44403c',\n tertiary: '#57534e',\n quaternary: '#a9a29d',\n disabled: '#a9a29d',\n disabledSubtle: '#d7d3d0',\n white: '#ffffff',\n brandPrimary: '#fb6011',\n brandSecondary: '#fb6011',\n errorPrimary: '#d92d20',\n errorSecondary: '#f04438',\n warningPrimary: '#dc6803',\n warningSecondary: '#f79009',\n successPrimary: '#079455',\n successSecondary: '#17b26a',\n} as const;\n\n// ─────────────────────────────────────────\n// Typography\n// ─────────────────────────────────────────\nexport const typography = {\n fontFamily: {\n display: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n body: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n base: '\"DM Sans\", system-ui, -apple-system, sans-serif',\n },\n fontSize: {\n // Text\n xs: '12px',\n sm: '14px',\n base: '16px',\n md: '16px',\n lg: '18px',\n xl: '20px',\n // Display\n displayXs: '24px',\n displaySm: '30px',\n displayMd: '36px',\n displayLg: '48px',\n displayXl: '60px',\n display2xl: '72px',\n },\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n // Text\n xs: '18px',\n sm: '20px',\n base: '24px',\n md: '24px',\n lg: '28px',\n xl: '30px',\n // Display\n displayXs: '32px',\n displaySm: '38px',\n displayMd: '44px',\n displayLg: '60px',\n displayXl: '72px',\n display2xl: '90px',\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Spacing (named scale)\n// ─────────────────────────────────────────\nexport const spacing = {\n none: '0px',\n xxs: '2px',\n xs: '4px',\n sm: '6px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n '2xl': '20px',\n '3xl': '24px',\n '4xl': '32px',\n '5xl': '40px',\n '6xl': '48px',\n '7xl': '64px',\n '8xl': '80px',\n '9xl': '96px',\n '10xl': '128px',\n '11xl': '160px',\n // Legacy numeric aliases\n 0: '0px',\n 1: '4px',\n 2: '8px',\n 3: '12px',\n 4: '16px',\n 5: '20px',\n} as const;\n\n// ─────────────────────────────────────────\n// Radius\n// ─────────────────────────────────────────\nexport const radius = {\n none: '0px',\n xxs: '2px',\n xs: '4px',\n sm: '6px',\n md: '8px',\n lg: '10px',\n xl: '12px',\n '2xl': '16px',\n '3xl': '20px',\n '4xl': '24px',\n full: '9999px',\n} as const;\n\n// ─────────────────────────────────────────\n// Component Sizing (project-specific)\n// ─────────────────────────────────────────\nexport const sizing = {\n tag: {\n sm: '20px',\n lg: '24px',\n },\n field: {\n sm: '32px',\n ms: '36px',\n md: '40px',\n lg: '48px',\n },\n icon: {\n sm: '14px',\n md: '16px',\n lg: '18px',\n xl: '20px',\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Border\n// ─────────────────────────────────────────\nexport const border = {\n radius: {\n sm: radius.sm, // 6px — Alert, Tag\n md: radius.md, // 8px — Button, Input (default)\n lg: radius.lg, // 10px\n xl: radius.xl, // 12px\n full: radius.full,\n },\n width: '1px',\n color: {\n default: semanticBorder.secondary, // #e7e5e4\n hover: semanticBorder.primary, // #d7d3d0\n focus: semanticBorder.brand, // #fb6011\n error: semanticBorder.error, // #f04438\n disabled: semanticBorder.disabled, // #d7d3d0\n },\n} as const;\n\n// ─────────────────────────────────────────\n// Shadow\n// ─────────────────────────────────────────\nexport const shadow = {\n xs: '0px 1px 2px 0px #0a0d120d',\n xsSkeuomorphic: 'inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d',\n sm: '0px 1px 3px 0px #0a0d121a, 0px 1px 2px -1px #0a0d121a',\n md: '0px 4px 6px -1px #0a0d121a, 0px 2px 4px -2px #0a0d120f',\n lg: '0px 12px 16px -4px #0a0d1214, 0px 4px 6px -2px #0a0d1208, 0px 2px 2px -1px #0a0d120a',\n xl: '0px 20px 24px -4px #0a0d1214, 0px 8px 8px -4px #0a0d1208, 0px 3px 3px -1.5px #0a0d120a',\n '2xl': '0px 24px 48px -12px #0a0d122e, 0px 4px 4px -2px #0a0d120a',\n '3xl': '0px 32px 64px -12px #0a0d1224, 0px 5px 5px -2.5px #0a0d120a',\n} as const;\n\n// ─────────────────────────────────────────\n// Focus Rings\n// ─────────────────────────────────────────\nexport const focusRing = {\n default: `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowXs: `0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowXsSkeuomorphic: `inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n shadowSm: `0px 1px 3px 0px #0a0d121a, 0px 1px 2px 0px #0a0d121a, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorBrandScale[500]}`,\n error: `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n errorShadowXs: `0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n errorShadowXsSkeuomorphic: `inset 0px 0px 0px 1px #0a0d122e, inset 0px -2px 0px 0px #0a0d120d, 0px 1px 2px 0px #0a0d120d, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${colorErrorScale[500]}`,\n} as const;\n\n// ─────────────────────────────────────────\n// Backdrop Blur\n// ─────────────────────────────────────────\nexport const backdropBlur = {\n sm: 'blur(8px)',\n md: 'blur(16px)',\n lg: 'blur(24px)',\n xl: 'blur(40px)',\n} as const;\n\n// ─────────────────────────────────────────\n// Motion\n// ─────────────────────────────────────────\nexport const motion = {\n duration: { base: '0.2s' },\n easing: { base: 'ease' },\n transition: { base: 'all 0.2s ease' },\n} as const;\n\n// ─────────────────────────────────────────\n// 默认 Export(全量)\n// ─────────────────────────────────────────\nconst tokens = {\n color: {\n base: colorBase,\n brand: colorBrandScale,\n error: colorErrorScale,\n warning: colorWarningScale,\n success: colorSuccessScale,\n gray: colorGray,\n grayBlue: colorGrayBlue,\n moss: colorMoss,\n greenLight: colorGreenLight,\n green: colorGreen,\n teal: colorTeal,\n cyan: colorCyan,\n blueLight: colorBlueLight,\n blue: colorBlue,\n blueDark: colorBlueDark,\n indigo: colorIndigo,\n violet: colorViolet,\n purple: colorPurple,\n fuchsia: colorFuchsia,\n pink: colorPink,\n rose: colorRose,\n orangeDark: colorOrangeDark,\n orange: colorOrange,\n yellow: colorYellow,\n // semantic\n semantic: {\n text: semanticText,\n border: semanticBorder,\n bg: semanticBg,\n fg: semanticFg,\n },\n // backward-compat\n neutral: colorNeutral,\n decorative: colorDecorative,\n },\n typography,\n spacing,\n radius,\n sizing,\n border,\n shadow,\n focusRing,\n backdropBlur,\n motion,\n} as const;\n\nexport default tokens;\n","import { colorBrandScale } from '../../tokens';\n\n/** 默认品牌色(与 ThemeProvider 默认值一致,忽略大小写) */\nexport const DEFAULT_BRAND_COLOR = colorBrandScale[500];\n\nexport function isDefaultBrandColor(color?: string): boolean {\n if (!color) return true;\n return color.toLowerCase() === DEFAULT_BRAND_COLOR.toLowerCase();\n}\n\nexport function resolveBrandColor(color?: string): string {\n return color || DEFAULT_BRAND_COLOR;\n}\n\n/** 品牌 hover 色:与旧版 CSS 变量 fallback `--color-bg-brand-solid_hover` 保持一致 */\nexport const BRAND_HOVER_COLOR = colorBrandScale[600];\n","import {\n colorBrandScale,\n colorErrorScale,\n focusRing,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n shadow,\n typography,\n} from '../../tokens';\nimport { BRAND_HOVER_COLOR, isDefaultBrandColor, resolveBrandColor } from './colorUtils';\n\nconst DEFAULT_BRAND_ICON = colorBrandScale[500];\n\nexport type ButtonNormalizedHierarchy =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'link-color'\n | 'link-gray'\n | 'destructive-primary'\n | 'destructive-secondary'\n | 'destructive-tertiary'\n | 'destructive-link';\n\nexport interface ButtonVisuals {\n bg: string;\n color: string;\n iconColor: string;\n border: string;\n boxShadow: string;\n textDecoration?: string;\n}\n\nexport function getButtonVisuals(options: {\n hierarchy: ButtonNormalizedHierarchy;\n disabled: boolean;\n interactive: boolean;\n brandColor?: string;\n}): ButtonVisuals {\n const { hierarchy, disabled, interactive } = options;\n const brand = resolveBrandColor(options.brandColor);\n const brandHover = BRAND_HOVER_COLOR;\n const brandText = colorBrandScale[600];\n const brandTextHover = colorBrandScale[700];\n\n if (disabled) {\n if (\n hierarchy === 'default' ||\n hierarchy === 'primary' ||\n hierarchy === 'secondary' ||\n hierarchy === 'destructive-primary' ||\n hierarchy === 'destructive-secondary'\n ) {\n return {\n bg: semanticBg.disabled,\n color: semanticFg.disabled,\n iconColor: semanticFg.disabled,\n border: `1px solid ${semanticBorder.disabledSubtle}`,\n boxShadow: 'none',\n };\n }\n return {\n bg: 'transparent',\n color: semanticFg.disabled,\n iconColor: semanticFg.disabled,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'default') {\n return {\n bg: interactive ? semanticBg.secondary : semanticBg.primary,\n color: interactive ? brandText : semanticText.secondary,\n iconColor: interactive ? DEFAULT_BRAND_ICON : semanticFg.quaternary,\n border: interactive ? `1px solid ${DEFAULT_BRAND_ICON}` : `1px solid ${semanticBorder.primary}`,\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'primary') {\n return {\n bg: interactive ? brandHover : brand,\n color: semanticText.white,\n iconColor: colorBrandScale[300],\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'secondary') {\n return {\n bg: interactive ? semanticBg.secondary : semanticBg.primary,\n color: interactive ? colorGrayHoverText() : semanticText.secondary,\n iconColor: interactive ? '#79716b' : semanticFg.quaternary,\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'tertiary') {\n return {\n bg: interactive ? semanticBg.secondary : 'transparent',\n color: interactive ? colorGray700Text() : semanticText.tertiary,\n iconColor: interactive ? '#79716b' : semanticFg.quaternary,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n if (hierarchy === 'link-color') {\n return {\n bg: 'transparent',\n color: interactive ? brandTextHover : brandText,\n iconColor: DEFAULT_BRAND_ICON,\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'link-gray') {\n return {\n bg: 'transparent',\n color: interactive ? colorGray700Text() : semanticText.tertiary,\n iconColor: semanticFg.quaternary,\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n }\n\n if (hierarchy === 'destructive-primary') {\n return {\n bg: interactive ? colorErrorScale[600] : colorErrorScale[500],\n color: semanticText.white,\n iconColor: interactive ? colorErrorScale[200] : colorErrorScale[300],\n border: 'none',\n boxShadow: shadow.xsSkeuomorphic,\n };\n }\n\n if (hierarchy === 'destructive-secondary') {\n return {\n bg: interactive ? semanticBg.errorPrimary : semanticBg.primary,\n color: semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: `inset 0 0 0 1px ${semanticBorder.errorSubtle}, inset 0 -2px 0 0 rgba(10,13,18,0.05), 0 1px 2px 0 rgba(10,13,18,0.05)`,\n };\n }\n\n if (hierarchy === 'destructive-tertiary') {\n return {\n bg: interactive ? semanticBg.errorPrimary : 'transparent',\n color: semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: 'none',\n };\n }\n\n return {\n bg: 'transparent',\n color: interactive ? colorErrorScale[700] : semanticText.errorPrimary,\n iconColor: semanticFg.errorSecondary,\n border: 'none',\n boxShadow: 'none',\n textDecoration: interactive ? 'underline' : 'none',\n };\n}\n\nfunction colorGrayHoverText() {\n return '#292524';\n}\n\nfunction colorGray700Text() {\n return '#44403c';\n}\n\nexport function getButtonFocusShadow(\n hierarchy: ButtonNormalizedHierarchy,\n showFocusRing: boolean,\n brandColor?: string,\n): string | undefined {\n if (!showFocusRing) return undefined;\n\n const isDestructive =\n hierarchy === 'destructive-primary' ||\n hierarchy === 'destructive-secondary' ||\n hierarchy === 'destructive-tertiary' ||\n hierarchy === 'destructive-link';\n\n if (isDestructive) {\n if (hierarchy === 'destructive-primary' || hierarchy === 'destructive-secondary') {\n return focusRing.errorShadowXsSkeuomorphic;\n }\n return focusRing.error;\n }\n\n if (hierarchy === 'primary' || hierarchy === 'secondary') {\n if (isDefaultBrandColor(brandColor)) {\n return focusRing.shadowXsSkeuomorphic;\n }\n return `${shadow.xsSkeuomorphic}, 0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n }\n\n if (isDefaultBrandColor(brandColor)) {\n return focusRing.default;\n }\n return `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n}\n\nexport const buttonFontFamily = typography.fontFamily.body;\nexport const buttonRadiusMd = radius.md;\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n buttonFontFamily,\n buttonRadiusMd,\n getButtonFocusShadow,\n getButtonVisuals,\n} from '../shared/buttonStyles';\n\n/**\n * 对齐 Figma: Untitled UI v7 — Buttons\n * 维度:Size × Hierarchy × State × Icon only\n * Size: sm(36) / md(40) / lg(44) / xl(48)\n * Hierarchy: primary / secondary / tertiary / link-color / link-gray\n * State: default / hover / focused / disabled / loading\n * Icon only: boolean\n */\n\nexport type ButtonHierarchy =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'link-color'\n | 'link-gray'\n | 'destructive-primary'\n | 'destructive-secondary'\n | 'destructive-tertiary'\n | 'destructive-link';\n\nexport type ButtonSize =\n | 'sm'\n | 'md'\n | 'lg'\n | 'xl'\n // legacy aliases\n | 'small'\n | 'mediumSmall'\n | 'medium'\n | 'large';\n\nexport type ButtonType = ButtonHierarchy;\n\nexport interface ButtonProps {\n children?: React.ReactNode;\n /** 按钮层级。`default` 为带边框白底(对齐 antd);`secondary` 为 Figma 无边框 skeuomorphic 样式 */\n type?: ButtonHierarchy;\n /** 按钮尺寸(对应 Figma Size)。旧名会映射到新尺寸 */\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n /** 仅图标按钮。不传 `children`、仅传 `icon` 时自动开启 */\n iconOnly?: boolean;\n /** 受控的 Focused 视觉态,用于 Storybook 预览设计稿;真实键盘焦点由 :focus-visible 处理 */\n focused?: boolean;\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n htmlType?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: React.CSSProperties;\n icon?: React.ReactNode;\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\ntype NormalizedSize = 'sm' | 'md' | 'lg' | 'xl';\ntype NormalizedHierarchy = 'default' | 'primary' | 'secondary' | 'tertiary' | 'link-color' | 'link-gray' | 'destructive-primary' | 'destructive-secondary' | 'destructive-tertiary' | 'destructive-link';\n\nconst SIZE_ALIAS: Record<ButtonSize, NormalizedSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'xl',\n};\n\nconst HIERARCHY_ALIAS: Record<ButtonHierarchy, NormalizedHierarchy> = {\n default: 'default',\n primary: 'primary',\n secondary: 'secondary',\n tertiary: 'tertiary',\n 'link-color': 'link-color',\n 'link-gray': 'link-gray',\n 'destructive-primary': 'destructive-primary',\n 'destructive-secondary': 'destructive-secondary',\n 'destructive-tertiary': 'destructive-tertiary',\n 'destructive-link': 'destructive-link',\n};\n\n/** Figma 标注的尺寸参数:高度、内边距、字号/行高、图标尺寸、间距 */\nconst SIZE_TOKENS: Record<\n NormalizedSize,\n {\n height: number;\n paddingX: number;\n paddingXLg: number; // lg/xl 大号内边距(与图标拼接时稍大)\n fontSize: number;\n lineHeight: number;\n iconSize: number;\n gap: number;\n iconOnlyPad: number;\n }\n> = {\n sm: { height: 36, paddingX: 12, paddingXLg: 12, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 8 },\n md: { height: 40, paddingX: 14, paddingXLg: 14, fontSize: 14, lineHeight: 20, iconSize: 20, gap: 4, iconOnlyPad: 10 },\n lg: { height: 44, paddingX: 16, paddingXLg: 16, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 12 },\n xl: { height: 48, paddingX: 18, paddingXLg: 18, fontSize: 16, lineHeight: 24, iconSize: 20, gap: 6, iconOnlyPad: 14 },\n};\n\nconst LoadingSpinner: React.FC<{ size: number; color: string }> = ({ size, color }) => (\n <>\n <style>{`@keyframes aha-button-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}`}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-button-spin 1s linear infinite', flexShrink: 0 }}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"2\" opacity=\"0.25\" />\n <path\n d=\"M22 12a10 10 0 0 1-10 10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n </>\n);\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'default',\n size = 'md',\n disabled = false,\n loading = false,\n iconOnly,\n focused = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const hierarchy = HIERARCHY_ALIAS[type] || 'default';\n const s = SIZE_TOKENS[SIZE_ALIAS[size] || 'md'];\n\n const isIconOnly = iconOnly ?? (!!icon && children == null);\n const isLink = hierarchy === 'link-color' || hierarchy === 'link-gray' || hierarchy === 'destructive-link';\n const isDisabled = disabled || loading;\n const showFocusRing = focused;\n\n const themeBrand = primaryColor;\n\n const visuals = getButtonVisuals({\n hierarchy,\n disabled,\n interactive: isHovered || isPressed,\n brandColor: themeBrand,\n });\n\n const focusShadow = getButtonFocusShadow(hierarchy, showFocusRing, themeBrand);\n\n const buttonStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: s.gap,\n fontFamily: buttonFontFamily,\n fontWeight: 600,\n fontSize: s.fontSize,\n lineHeight: `${s.lineHeight}px`,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'background-color .15s ease, color .15s ease, box-shadow .15s ease',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n whiteSpace: 'nowrap',\n backgroundColor: visuals.bg,\n color: visuals.color,\n border: visuals.border,\n boxShadow: focusShadow ?? visuals.boxShadow,\n textDecoration: visuals.textDecoration,\n ...style,\n };\n\n if (isLink) {\n // Link 类:保留与同尺寸按钮一致的高度和横向内边距,无背景、无边框\n buttonStyle.borderRadius = '4px';\n buttonStyle.overflow = 'hidden';\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n } else {\n buttonStyle.borderRadius = buttonRadiusMd;\n if (isIconOnly) {\n buttonStyle.width = s.height;\n buttonStyle.height = s.height;\n buttonStyle.padding = 0;\n } else {\n buttonStyle.height = s.height;\n buttonStyle.paddingLeft = s.paddingX;\n buttonStyle.paddingRight = s.paddingX;\n }\n }\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n const renderIcon = () => {\n if (loading) {\n return <LoadingSpinner size={s.iconSize} color={visuals.iconColor} />;\n }\n if (!icon) return null;\n return (\n <span\n aria-hidden\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: s.iconSize,\n height: s.iconSize,\n color: visuals.iconColor,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n };\n\n const showLeftIcon = loading || (icon && iconPosition === 'left');\n const showRightIcon = !loading && icon && iconPosition === 'right';\n\n return (\n <button\n type={htmlType}\n className={[\n 'aha-button',\n `aha-button--${hierarchy}`,\n `aha-button--${SIZE_ALIAS[size] || 'md'}`,\n isIconOnly && 'aha-button--icon-only',\n isDisabled && 'aha-button--disabled',\n loading && 'aha-button--loading',\n showFocusRing && 'aha-button--focused',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => !isDisabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n style={buttonStyle}\n {...rest}\n >\n {showLeftIcon && renderIcon()}\n {!isIconOnly && children}\n {showRightIcon && renderIcon()}\n {/* icon-only 且没传 icon 时,允许 children 作为图标 */}\n {isIconOnly && !icon && !loading && children}\n </button>\n );\n};\n\nButton.displayName = 'Button';\n\nexport default Button;\n","export const AlertIcon = {\n success: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 1.66663C5.40002 1.66663 1.66669 5.39996 1.66669 9.99996C1.66669 14.6 5.40002 18.3333 10 18.3333C14.6 18.3333 18.3334 14.6 18.3334 9.99996C18.3334 5.39996 14.6 1.66663 10 1.66663ZM13.3584 8.49997L9.46668 12.3833C9.35001 12.5083 9.19168 12.5666 9.02501 12.5666C8.86668 12.5666 8.70834 12.5083 8.58334 12.3833L6.64169 10.4417C6.40002 10.2 6.40002 9.79994 6.64169 9.55827C6.88336 9.3166 7.28335 9.3166 7.52502 9.55827L9.02501 11.0583L12.475 7.61664C12.7167 7.36664 13.1167 7.36664 13.3584 7.61664C13.6 7.8583 13.6 8.24997 13.3584 8.49997Z\"\n fill=\"#00BC7D\"\n />\n </svg>\n ),\n error: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17.1342 6.3009L13.6999 2.86666C13.4658 2.63249 13.1474 2.50085 12.8157 2.50085H7.18504C6.85337 2.50085 6.53584 2.63249 6.30084 2.86666L2.8666 6.3009C2.63243 6.53507 2.50079 6.85343 2.50079 7.1851V12.8158C2.50079 13.1475 2.63243 13.465 2.8666 13.7L6.30084 17.1342C6.53501 17.3684 6.85337 17.5 7.18504 17.5H12.8157C13.1474 17.5 13.4649 17.3684 13.6999 17.1342L17.1342 13.7C17.3683 13.4658 17.5 13.1475 17.5 12.8158V7.1851C17.5 6.85343 17.3683 6.53507 17.1342 6.3009ZM12.525 11.6417C12.7692 11.8858 12.7692 12.2817 12.525 12.5259C12.4033 12.6475 12.2433 12.7092 12.0833 12.7092C11.9233 12.7092 11.7633 12.6484 11.6416 12.5259L9.99998 10.8842L8.35834 12.5259C8.23667 12.6475 8.07665 12.7092 7.91665 12.7092C7.75665 12.7092 7.59662 12.6484 7.47496 12.5259C7.23079 12.2817 7.23079 11.8858 7.47496 11.6417L9.1166 10L7.47496 8.3584C7.23079 8.11423 7.23079 7.71837 7.47496 7.4742C7.71912 7.23004 8.11498 7.23004 8.35915 7.4742L10.0008 9.11585L11.6424 7.4742C11.8866 7.23004 12.2825 7.23004 12.5266 7.4742C12.7708 7.71837 12.7708 8.11423 12.5266 8.3584L10.885 10L12.525 11.6417Z\"\n fill=\"#FB2C36\"\n />\n </svg>\n ),\n warning: (\n <svg \n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.0057 14.2935L12.4999 3.99662C11.4333 2.00162 8.56744 2.00162 7.49995 3.99662L1.99417 14.2935C1.01583 16.1235 2.3442 18.3334 4.42337 18.3334H15.5765C17.6549 18.3334 18.9841 16.1226 18.0057 14.2935ZM9.37495 8.33337C9.37495 7.98837 9.65494 7.70837 9.99994 7.70837C10.3449 7.70837 10.6249 7.98837 10.6249 8.33337V11.6667C10.6249 12.0117 10.3449 12.2917 9.99994 12.2917C9.65494 12.2917 9.37495 12.0117 9.37495 11.6667V8.33337ZM10.0166 15C9.55663 15 9.17902 14.6267 9.17902 14.1667C9.17902 13.7067 9.54829 13.3334 10.0083 13.3334H10.0166C10.4775 13.3334 10.85 13.7067 10.85 14.1667C10.85 14.6267 10.4766 15 10.0166 15Z\"\n fill=\"#FE9A00\"\n />\n </svg>\n ),\n info: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6875 2.5H5.3125C3.4375 2.5 2.5 3.4375 2.5 5.3125V14.6875C2.5 16.5625 3.4375 17.5 5.3125 17.5H14.6875C16.5625 17.5 17.5 16.5625 17.5 14.6875V5.3125C17.5 3.4375 16.5625 2.5 14.6875 2.5ZM10.625 13.75C10.625 14.095 10.345 14.375 10 14.375C9.655 14.375 9.375 14.095 9.375 13.75V9.9408C9.375 9.5958 9.655 9.3158 10 9.3158C10.345 9.3158 10.625 9.5958 10.625 9.9408V13.75ZM10.0167 7.91667C9.55668 7.91667 9.17908 7.54333 9.17908 7.08333C9.17908 6.62333 9.54834 6.25 10.0083 6.25H10.0167C10.4775 6.25 10.85 6.62333 10.85 7.08333C10.85 7.54333 10.4767 7.91667 10.0167 7.91667Z\"\n fill=\"#2B7FFF\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"#57534D\"\n />\n </svg>\n);\n","import React, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div className=\"flex flex-col gap-1 flex-1 min-w-0\">\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && action}\n </div>\n {action && !closeable && (\n <div className=\"ml-auto flex-shrink-0 self-center flex items-center gap-2\">\n {action}\n </div>\n )}\n {closeable && (\n <div\n className=\"flex-shrink-0 self-start mt-1 cursor-pointer\"\n onClick={handleClose}\n onKeyDown={(e) => e.key === \"Enter\" && handleClose()}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type TagColor =\n | 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet'\n | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\n\nexport type TagVariant = 'light' | 'fill';\n\n/** sm/md/lg are the canonical sizes; large/small are legacy aliases */\nexport type TagSize = 'sm' | 'md' | 'lg' | 'large' | 'small';\n\n/** Leading icon variant */\nexport type TagIconType = 'none' | 'dot' | 'avatar' | 'icon';\n\n/** Right-side action */\nexport type TagAction = 'none' | 'x-close' | 'count';\n\n/** @deprecated Use iconType instead */\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color?: TagColor;\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean;\n // Icon variants (mutually exclusive; avatar takes precedence over icon)\n iconType?: TagIconType;\n icon?: React.ReactElement;\n avatarSrc?: string;\n dotColor?: string;\n // Action variants\n action?: TagAction;\n count?: number;\n onClose?: () => void;\n // Checkbox variant\n checkbox?: boolean;\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** @deprecated use iconType='icon' */\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// ─── Color Configs ────────────────────────────────────────────────────────────\n\nconst COLOR_CONFIG = {\n Green: { light: { bg: '#ECFDF5', text: '#006045', border: '#A4F4CF' }, fill: { bg: '#00BC7D', text: '#FFFFFF' } },\n Red: { light: { bg: '#FEF2F2', text: '#9F0712', border: '#FFC9C9' }, fill: { bg: '#FB2C36', text: '#FFFFFF' } },\n Orange: { light: { bg: '#FFF6ED', text: '#9B2911', border: '#FFD1A9' }, fill: { bg: '#FB6011', text: '#FFFFFF' } },\n Cyan: { light: { bg: '#ECFEFF', text: '#005F78', border: '#A2F4FD' }, fill: { bg: '#00B8DB', text: '#FFFFFF' } },\n Violet: { light: { bg: '#F5F3FF', text: '#5D0EC0', border: '#DDD6FF' }, fill: { bg: '#8E51FF', text: '#FFFFFF' } },\n Pink: { light: { bg: '#FDF2F8', text: '#A3004C', border: '#FCCEE8' }, fill: { bg: '#F6339A', text: '#FFFFFF' } },\n Gray: { light: { bg: '#F5F5F4', text: '#292524', border: '#E7E5E4' }, fill: { bg: '#292524', text: '#FFFFFF' } },\n Yellow: { light: { bg: '#FFFBEB', text: '#973C00', border: '#FEE685' }, fill: { bg: '#FE9A00', text: '#FFFFFF' } },\n Blue: { light: { bg: '#EFF6FF', text: '#193CB8', border: '#BEDBFF' }, fill: { bg: '#2B7FFF', text: '#FFFFFF' } },\n};\n\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n if (color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n if (color === 'Orange' && primaryColor) {\n return { ...config, fill: { ...config.fill, bg: primaryColor } };\n }\n return config;\n }\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return {\n light: { bg: `rgba(${r},${g},${b},0.1)`, text: color, border: `rgba(${r},${g},${b},0.3)` },\n fill: { bg: color, text: '#FFFFFF' },\n };\n }\n return COLOR_CONFIG.Gray;\n};\n\nconst getIconColor = (color: TagColor, primaryColor?: string): string => {\n const map: Record<string, string> = {\n Green: '#009966', Red: '#E7000B', Orange: primaryColor || '#E17100',\n Blue: '#155DFC', Yellow: '#EC470A', Cyan: '#0092B8',\n Violet: '#7F22FE', Pink: '#E60076', Gray: '#57534D',\n };\n return map[color] ?? (color.startsWith('#') ? color : '#57534D');\n};\n\nconst getOutlineColor = (color: TagColor): string => {\n const map: Record<string, string> = {\n Green: '#A4F4CF', Red: '#FFC9C9', Orange: '#FFD1A9',\n Blue: '#BEDBFF', Yellow: '#FFD1A9', Cyan: '#A2F4FD',\n Violet: '#DDD6FF', Pink: '#FCCEE8', Gray: '#E7E5E4',\n };\n if (color in map) return map[color];\n if (color.startsWith('#')) {\n const r = parseInt(color.slice(1, 3), 16);\n const g = parseInt(color.slice(3, 5), 16);\n const b = parseInt(color.slice(5, 7), 16);\n return `rgba(${r},${g},${b},0.3)`;\n }\n return '#E7E5E4';\n};\n\n// ─── Size Config ──────────────────────────────────────────────────────────────\n// Values derived from Figma design (node 3307:417515)\n\ntype NSize = 'sm' | 'md' | 'lg';\n\nconst normalizeSize = (size: TagSize): NSize => {\n if (size === 'large') return 'lg';\n if (size === 'small') return 'sm';\n return size as NSize;\n};\n\nconst SIZE = {\n sm: {\n // Base padding: px-8px py-3px (h=24px with lh-18px)\n basePx: 8, basePy: 3,\n // Left padding adjustments per leading element (checkbox wins over icon)\n plCheckbox: 5, plAvatar: 4, plDot: 6, plIcon: 4,\n // Right padding adjustments per action\n prClose: 4, prCount: 4,\n fontSize: 12, lineHeight: '18px', height: 24,\n avatarSize: 16, checkboxSize: 14,\n contentGap: 4, rootGap: 3,\n countPx: 4, countFontSize: 12,\n closeSize: 10, closePad: 2,\n },\n md: {\n // Base padding: px-9px py-2px (h=24px with lh-20px)\n basePx: 9, basePy: 2,\n plCheckbox: 4, plAvatar: 5, plDot: 7, plIcon: 5,\n prClose: 4, prCount: 3,\n fontSize: 14, lineHeight: '20px', height: 24,\n avatarSize: 16, checkboxSize: 16,\n contentGap: 5, rootGap: 4,\n countPx: 5, countFontSize: 12,\n closeSize: 12, closePad: 2,\n },\n lg: {\n // Base padding: px-10px py-4px (h=28px with lh-20px)\n basePx: 10, basePy: 4,\n plCheckbox: 5, plAvatar: 7, plDot: 9, plIcon: 7,\n prClose: 4, prCount: 4,\n fontSize: 14, lineHeight: '20px', height: 28,\n avatarSize: 18, checkboxSize: 18,\n contentGap: 6, rootGap: 4,\n countPx: 6, countFontSize: 14,\n closeSize: 14, closePad: 3,\n },\n} as const;\n\n// ─── TagAvatar ────────────────────────────────────────────────────────────────\n\nexport interface TagAvatarProps {\n src?: string;\n alt?: string;\n size?: number;\n}\n\nexport const TagAvatar: React.FC<TagAvatarProps> = ({ src, alt = 'Avatar', size = 16 }) => {\n const [failed, setFailed] = useState(false);\n return (\n <div\n style={{\n width: size, height: size, borderRadius: '50%',\n overflow: 'hidden', flexShrink: 0,\n border: '0.667px solid rgba(0,0,0,0.08)',\n background: '#e5e5e4',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}\n >\n {src && !failed ? (\n <img\n src={src} alt={alt}\n onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <svg\n width={size * 0.625} height={size * 0.625}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <circle cx=\"5\" cy=\"3.5\" r=\"2\" stroke=\"#999\" strokeWidth=\"1.2\" />\n <path d=\"M1 9.5c0-2.2 1.8-4 4-4s4 1.8 4 4\" stroke=\"#999\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )}\n </div>\n );\n};\n\n// ─── Tag ──────────────────────────────────────────────────────────────────────\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'md',\n stroke = false,\n iconType: iconTypeProp,\n icon,\n avatarSrc,\n dotColor,\n action = 'none',\n count,\n onClose,\n checkbox = false,\n checked: checkedProp,\n onCheckedChange,\n iconPosition,\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const [internalChecked, setInternalChecked] = useState(false);\n\n const nSize = normalizeSize(size);\n const s = SIZE[nSize];\n\n // Controlled/uncontrolled checkbox\n const isChecked = checkedProp !== undefined ? checkedProp : internalChecked;\n const handleCheckboxToggle = (e: React.MouseEvent) => {\n e.stopPropagation();\n const next = !isChecked;\n if (checkedProp === undefined) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n // Resolve icon type; backward-compat: legacy iconPosition='leading' → iconType='icon'\n const iconType: TagIconType =\n iconTypeProp ??\n (icon && iconPosition === 'leading' ? 'icon' : 'none');\n\n const hasLeading = iconType !== 'none';\n const effectiveAction = action !== 'none' ? action : undefined;\n\n // Compute left padding (checkbox wins > dot > avatar/icon > base)\n const pl = checkbox ? s.plCheckbox\n : iconType === 'dot' ? s.plDot\n : iconType === 'avatar' || iconType === 'icon' ? s.plAvatar\n : s.basePx;\n\n // Compute right padding\n const pr = effectiveAction === 'x-close' ? s.prClose\n : effectiveAction === 'count' ? s.prCount\n : s.basePx;\n\n // Base neutral style matching Figma (white bg + gray border)\n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: effectiveAction === 'x-close' ? s.rootGap : 0,\n paddingLeft: pl,\n paddingRight: pr,\n paddingTop: s.basePy,\n paddingBottom: s.basePy,\n height: s.height,\n borderRadius: 6,\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 500,\n fontSize: s.fontSize,\n lineHeight: s.lineHeight,\n transition: 'all 0.2s',\n cursor: onClick ? 'pointer' : 'default',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n color: '#44403c',\n // Inset outline matches Figma: outline-1 outline-offset-[-1px]\n outline: '1px solid #d7d3d0',\n outlineOffset: '-1px',\n };\n\n // Optional color override (keeps backward compat with color prop)\n if (color) {\n const colorConfig = getColorConfig(color, primaryColor);\n if (variant === 'light') {\n containerStyle.backgroundColor = colorConfig.light.bg;\n containerStyle.color = colorConfig.light.text;\n containerStyle.outline = stroke ? `1px solid ${getOutlineColor(color)}` : 'none';\n containerStyle.outlineOffset = stroke ? '-1px' : undefined;\n } else {\n containerStyle.backgroundColor = colorConfig.fill.bg;\n containerStyle.color = colorConfig.fill.text;\n containerStyle.outline = 'none';\n }\n }\n\n if (onClick) {\n containerStyle.cursor = 'pointer';\n }\n\n // Leading icon element\n const renderLeadingIcon = () => {\n if (iconType === 'avatar') {\n return <TagAvatar src={avatarSrc} size={s.avatarSize} />;\n }\n if (iconType === 'dot') {\n return (\n <svg width={8} height={8} viewBox=\"0 0 8 8\" fill=\"none\" style={{ flexShrink: 0 }}>\n <circle cx={4} cy={4} r={3.5} fill={dotColor || 'currentColor'} />\n </svg>\n );\n }\n if (iconType === 'icon' && icon) {\n return (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: s.avatarSize,\n height: s.avatarSize,\n })}\n </span>\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={containerStyle}\n onClick={onClick}\n {...rest}\n >\n {/* Content row: checkbox + icon + text + count */}\n <div style={{ display: 'flex', alignItems: 'center', gap: s.contentGap, flexShrink: 0 }}>\n {/* Checkbox */}\n {checkbox && (\n <div\n role=\"checkbox\"\n aria-checked={isChecked}\n onClick={handleCheckboxToggle}\n style={{\n width: s.checkboxSize, height: s.checkboxSize,\n borderRadius: 4, flexShrink: 0,\n border: isChecked ? 'none' : '1px solid #d7d3d0',\n background: isChecked ? (primaryColor || '#7F56D9') : '#ffffff',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n cursor: 'pointer',\n }}\n >\n {isChecked && (\n <svg\n width={Math.round(s.checkboxSize * 0.65)}\n height={Math.round(s.checkboxSize * 0.65)}\n viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M8.5 2L4 7.5 1.5 5\" stroke=\"#fff\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </div>\n )}\n\n {/* Leading icon (avatar / dot / generic icon) */}\n {renderLeadingIcon()}\n\n {/* Text label */}\n <span style={{ whiteSpace: 'nowrap' }}>{children}</span>\n\n {/* Count badge */}\n {effectiveAction === 'count' && typeof count === 'number' && (\n <span style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n paddingLeft: s.countPx, paddingRight: s.countPx,\n paddingTop: 1, paddingBottom: 1,\n background: 'rgba(0,0,0,0.07)',\n borderRadius: 3,\n fontSize: s.countFontSize,\n fontWeight: 500,\n lineHeight: '16px',\n flexShrink: 0,\n }}>\n {count}\n </span>\n )}\n </div>\n\n {/* Close X (outside content row, right side) */}\n {effectiveAction === 'x-close' && (\n <button\n aria-label=\"Remove\"\n onClick={(e) => { e.stopPropagation(); onClose?.(); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n padding: s.closePad, borderRadius: 3,\n border: 'none', background: 'transparent',\n cursor: 'pointer', flexShrink: 0,\n color: 'inherit', opacity: 0.55,\n lineHeight: 0,\n }}\n >\n <svg width={s.closeSize} height={s.closeSize} viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.5 2.5l-5 5M2.5 2.5l5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n\n {/* Legacy: icon rendered after text when iconPosition='after' */}\n {iconPosition === 'after' && icon && !iconTypeProp && (\n <span style={{ display: 'flex', alignItems: 'center', flexShrink: 0, marginLeft: s.contentGap }}>\n {icon}\n </span>\n )}\n </div>\n );\n};\n\nexport default Tag;\n","import type React from 'react';\nimport {\n colorErrorScale,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n shadow,\n spacing,\n typography,\n} from '../../tokens';\n\nexport const fieldFontFamily = typography.fontFamily.body;\nexport const fieldFontSizeMd = typography.fontSize.md;\nexport const fieldFontSizeSm = typography.fontSize.sm;\nexport const fieldFontSizeXs = typography.fontSize.xs;\nexport const fieldLineHeightMd = typography.lineHeight.md;\nexport const fieldLineHeightSm = typography.lineHeight.sm;\nexport const fieldLineHeightXs = typography.lineHeight.xs;\nexport const fieldRadiusMd = radius.md;\nexport const fieldShadowXs = shadow.xs;\nexport const fieldSpacingXs = spacing.xs;\n\nexport const fieldColors = {\n textPrimary: semanticText.primary,\n textSecondary: semanticText.secondary,\n textTertiary: semanticText.tertiary,\n textDisabled: semanticText.disabled,\n textPlaceholder: semanticText.placeholder,\n borderPrimary: semanticBorder.primary,\n borderDisabled: semanticBorder.disabled,\n borderBrand: semanticBorder.brand,\n borderError: semanticBorder.error,\n borderErrorSubtle: semanticBorder.errorSubtle,\n bgPrimary: semanticBg.primary,\n bgDisabledSubtle: semanticBg.disabledSubtle,\n fgDisabled: semanticFg.disabled,\n fgQuaternary: semanticFg.quaternary,\n error600: colorErrorScale[600],\n} as const;\n\nexport function getFieldFocusStyles(options: {\n disabled?: boolean;\n error?: boolean;\n focused?: boolean;\n brandColor?: string;\n}): React.CSSProperties {\n const { disabled = false, error = false, focused = false, brandColor } = options;\n const c = fieldColors;\n const boxShadow = fieldShadowXs;\n const brand = brandColor || c.borderBrand;\n\n if (disabled) {\n return { border: `1px solid ${c.borderDisabled}`, boxShadow, outline: 'none' };\n }\n if (error && focused) {\n return {\n border: `1px solid ${c.borderError}`,\n boxShadow,\n outline: `2px solid ${c.borderError}`,\n outlineOffset: '-2px',\n };\n }\n if (error) {\n return { border: `1px solid ${c.borderErrorSubtle}`, boxShadow, outline: 'none' };\n }\n if (focused) {\n return {\n border: `1px solid ${brand}`,\n boxShadow,\n outline: `2px solid ${brand}`,\n outlineOffset: '-2px',\n };\n }\n return { border: `1px solid ${c.borderPrimary}`, boxShadow, outline: 'none' };\n}\n\nexport function getFieldLabelStyle(): React.CSSProperties {\n return {\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeSm,\n fontWeight: 500,\n lineHeight: fieldLineHeightSm,\n color: fieldColors.textSecondary,\n };\n}\n\nexport function getFieldHintStyle(error = false): React.CSSProperties {\n return {\n margin: 0,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeSm,\n fontWeight: 400,\n lineHeight: fieldLineHeightSm,\n color: error ? fieldColors.error600 : fieldColors.textTertiary,\n };\n}\n\nexport function getPlaceholderCss(\n selector: string,\n extraRules = '',\n placeholderColor = fieldColors.textPlaceholder,\n): string {\n return `\n ${selector}::placeholder {\n color: ${placeholderColor};\n font-size: ${fieldFontSizeMd};\n font-weight: 400;\n opacity: 1;\n }\n ${selector}::-webkit-input-placeholder { color: ${placeholderColor}; }\n ${selector}::-moz-placeholder { color: ${placeholderColor}; }\n ${selector}:-ms-input-placeholder { color: ${placeholderColor}; }\n ${extraRules}\n `;\n}\n","import React, { forwardRef, useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport { InputProps } from './index';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n} from '../shared/fieldStyles';\n\nexport interface InputGroupProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n error?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Text addon on the left (e.g. \"https://\") — auto-styled with correct padding */\n leadingText?: React.ReactNode;\n /** Text addon on the right (e.g. \"USD\") — auto-styled with correct padding */\n trailingText?: React.ReactNode;\n /** Raw ReactNode on the left (dropdown, icon button, etc.) — no padding added */\n leadingAddon?: React.ReactNode;\n /** Raw ReactNode on the right (button, select, etc.) — no padding added */\n trailingAddon?: React.ReactNode;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst sizeMap: Record<NonNullable<InputGroupProps['size']>, { pt: string; pb: string }> = {\n small: { pt: '5px', pb: '5px' },\n mediumSmall: { pt: '7px', pb: '7px' },\n medium: { pt: '9px', pb: '9px' },\n large: { pt: '11px', pb: '11px' },\n};\n\nconst InputGroup = forwardRef<HTMLInputElement, InputGroupProps>(({\n size = 'mediumSmall',\n error = false,\n disabled = false,\n readOnly = false,\n prefix,\n suffix,\n leadingText,\n trailingText,\n leadingAddon,\n trailingAddon,\n className = '',\n style,\n onFocus,\n onBlur,\n onKeyDown,\n onPressEnter,\n value,\n defaultValue,\n onChange,\n placeholder,\n type = 'text',\n label,\n required,\n hintText,\n ...restProps\n}, ref) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [focused, setFocused] = useState(false);\n const [internalValue, setInternalValue] = useState(defaultValue ?? '');\n const { primaryColor } = useTheme();\n\n useEffect(() => {\n if (typeof ref === 'function') ref(inputRef.current);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) onPressEnter(e);\n onKeyDown?.(e);\n };\n\n const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { border, boxShadow, outline, outlineOffset } = focusStyles;\n const { pt, pb } = sizeMap[size];\n const dividerColor = disabled ? fieldColors.borderDisabled : fieldColors.borderPrimary;\n const iconColor = disabled ? fieldColors.fgDisabled : fieldColors.fgQuaternary;\n const hasPrefixIcon = !!prefix;\n const hasSuffixIcon = !!suffix;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n pointerEvents: 'none',\n };\n\n const addonTextStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: '14px',\n paddingRight: '12px',\n color: fieldColors.textTertiary,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n lineHeight: fieldLineHeightMd,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n backgroundColor: disabled ? fieldColors.bgDisabledSubtle : 'transparent',\n };\n\n const groupEl = (\n <div\n className={`aha-input-group ${className}`}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n width: '100%',\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: fieldRadiusMd,\n backgroundColor: disabled || readOnly ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n overflow: 'hidden',\n boxSizing: 'border-box',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n ...style,\n }}\n >\n {leadingText !== undefined && (\n <div style={{ ...addonTextStyle, borderRight: `1px solid ${dividerColor}` }}>\n {leadingText}\n </div>\n )}\n {leadingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderRight: `1px solid ${dividerColor}` }}>\n {leadingAddon}\n </div>\n )}\n\n <div style={{ flex: 1, position: 'relative', display: 'flex', alignItems: 'stretch', minWidth: 0 }}>\n {hasPrefixIcon && (\n <span style={{ ...iconSlotStyle, left: '14px' }}>{prefix}</span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n backgroundColor: 'transparent',\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n paddingTop: pt,\n paddingBottom: pb,\n paddingLeft: hasPrefixIcon ? '40px' : '14px',\n paddingRight: hasSuffixIcon ? '40px' : '14px',\n }}\n autoComplete={restProps.autoComplete || 'off'}\n {...restProps}\n />\n {hasSuffixIcon && (\n <span style={{ ...iconSlotStyle, right: '14px' }}>{suffix}</span>\n )}\n </div>\n\n {trailingText !== undefined && (\n <div style={{ ...addonTextStyle, paddingLeft: '12px', paddingRight: '14px', borderLeft: `1px solid ${dividerColor}` }}>\n {trailingText}\n </div>\n )}\n {trailingAddon !== undefined && (\n <div style={{ display: 'flex', alignItems: 'stretch', flexShrink: 0, borderLeft: `1px solid ${dividerColor}` }}>\n {trailingAddon}\n </div>\n )}\n </div>\n );\n\n if (!label && !hintText) return groupEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {groupEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n});\n\nInputGroup.displayName = 'InputGroup';\n\nexport default InputGroup;\n","import React, { useState, useRef, KeyboardEvent } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport Tag from '../Tag';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\n\nexport interface InputTagsProps {\n value?: string[];\n defaultValue?: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n disabled?: boolean;\n error?: boolean;\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n className?: string;\n style?: React.CSSProperties;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\nconst containerPadding = {\n small: '4px',\n mediumSmall: '6px',\n medium: '8px',\n large: '10px',\n};\n\nconst tagSizeMap = {\n small: 'sm',\n mediumSmall: 'sm',\n medium: 'md',\n large: 'lg',\n} as const;\n\nconst InputTags: React.FC<InputTagsProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag...',\n disabled = false,\n error = false,\n size = 'mediumSmall',\n className = '',\n style,\n label,\n required,\n hintText,\n}) => {\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { primaryColor } = useTheme();\n\n const isControlled = value !== undefined;\n const tags = isControlled ? value! : internalTags;\n\n const updateTags = (next: string[]) => {\n if (!isControlled) setInternalTags(next);\n onChange?.(next);\n };\n\n const addTag = (tag: string) => {\n const trimmed = tag.trim();\n if (!trimmed || tags.includes(trimmed)) return;\n updateTags([...tags, trimmed]);\n setInputValue('');\n };\n\n const removeTag = (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if ((e.key === 'Enter' || e.key === ',') && inputValue) {\n e.preventDefault();\n addTag(inputValue);\n }\n if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n removeTag(tags.length - 1);\n }\n };\n\n const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { border, boxShadow, outline, outlineOffset } = focusStyles;\n const p = containerPadding[size];\n const tagSize = tagSizeMap[size];\n\n const tagsEl = (\n <div\n className={`aha-input-tags ${className}`}\n onClick={() => inputRef.current?.focus()}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '6px',\n padding: p,\n border,\n boxShadow,\n outline,\n outlineOffset,\n borderRadius: fieldRadiusMd,\n backgroundColor: disabled ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n boxSizing: 'border-box',\n width: '100%',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease',\n cursor: disabled ? 'not-allowed' : 'text',\n ...style,\n }}\n >\n {tags.map((tag, i) => (\n <Tag\n key={i}\n size={tagSize}\n action={disabled ? 'none' : 'x-close'}\n onClose={() => removeTag(i)}\n >\n {tag}\n </Tag>\n ))}\n <input\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => { setFocused(false); if (inputValue) addTag(inputValue); }}\n disabled={disabled}\n placeholder={tags.length === 0 ? placeholder : ''}\n style={{\n flex: 1,\n minWidth: '80px',\n border: 'none',\n outline: 'none',\n padding: 0,\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n lineHeight: fieldLineHeightMd,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n backgroundColor: 'transparent',\n }}\n />\n <style>{getPlaceholderCss('.aha-input-tags input')}</style>\n </div>\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n </label>\n )}\n {tagsEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n};\n\nexport default InputTags;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldLineHeightMd,\n fieldRadiusMd,\n fieldSpacingXs,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n className?: string;\n style?: React.CSSProperties;\n type?: string;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n label?: string;\n required?: boolean;\n hintText?: string;\n}\n\n// sm=36px, mediumSmall=40px, md=44px (matches Figma md), lg=48px\n// With box-sizing:border-box: height = 1px border × 2 + paddingTop + 24px lineHeight + paddingBottom\nconst sizeStyles: Record<NonNullable<InputProps['size']>, React.CSSProperties> = {\n small: { height: '36px', paddingTop: '5px', paddingBottom: '5px' },\n mediumSmall: { height: '40px', paddingTop: '7px', paddingBottom: '7px' },\n medium: { height: '44px', paddingTop: '9px', paddingBottom: '9px' },\n large: { height: '48px', paddingTop: '11px', paddingBottom: '11px' },\n};\n\nconst ClearIcon: React.FC<{ onClick: (e: React.MouseEvent) => void }> = ({ onClick }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={onClick}\n style={{ cursor: 'pointer', flexShrink: 0 }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'mediumSmall',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n label,\n required,\n hintText,\n ...restProps\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(defaultValue || value || '');\n const [focused, setFocused] = React.useState(false);\n const { primaryColor } = useTheme();\n\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = inputRef.current;\n }\n }, [ref]);\n\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setInternalValue(e.target.value);\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) onPressEnter(e);\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) setInternalValue('');\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n const focusStyles = getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n const { height, paddingTop, paddingBottom } = sizeStyles[size];\n const hasRightContent = suffix || showClear;\n const paddingLeft = prefix ? '40px' : '14px';\n const paddingRight = hasRightContent ? '40px' : '14px';\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n height,\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n borderRadius: fieldRadiusMd,\n ...focusStyles,\n backgroundColor:\n disabled || readOnly ? fieldColors.bgDisabledSubtle : fieldColors.bgPrimary,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n appearance: 'none',\n ...style,\n };\n\n const placeholderStyles = getPlaceholderCss(\n '.aha-input-wrapper input',\n `\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] { -moz-appearance: textfield; }\n `,\n );\n\n const iconColor = disabled ? fieldColors.fgDisabled : fieldColors.fgQuaternary;\n\n const iconSlotStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'flex',\n alignItems: 'center',\n color: iconColor,\n zIndex: 1,\n };\n\n const inputEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{ position: 'relative', display: 'block', width: '100%' }}\n >\n {prefix && (\n <span style={{ ...iconSlotStyle, left: '14px', pointerEvents: 'none' }}>\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span style={{ ...iconSlotStyle, right: '14px', gap: fieldSpacingXs }}>\n {showClear && <ClearIcon onClick={handleClear} />}\n {suffix}\n </span>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return inputEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={getFieldLabelStyle()}>\n {label}\n {required && (\n <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>\n )}\n </label>\n )}\n {inputEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\nexport { default as InputGroup } from './InputGroup';\nexport type { InputGroupProps } from './InputGroup';\nexport { default as InputTags } from './InputTags';\nexport type { InputTagsProps } from './InputTags';\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{\n top: number;\n left: number;\n width: number;\n placement: 'top' | 'bottom';\n } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n const estimatedDropdownHeight =\n dropdownRef.current?.offsetHeight ??\n Math.min(256, Math.max(40, filteredOptions.length * 40));\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n const shouldOpenUp =\n spaceBelow < estimatedDropdownHeight + gap && spaceAbove > spaceBelow;\n const top = shouldOpenUp\n ? rect.top + window.scrollY - estimatedDropdownHeight - gap\n : rect.bottom + window.scrollY + gap;\n\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement: shouldOpenUp ? 'top' : 'bottom',\n });\n }\n };\n\n updatePosition();\n requestAnimationFrame(updatePosition);\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen, filteredOptions.length]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform:\n dropdownPosition.placement === 'top'\n ? 'translateY(8px)'\n : 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n transformOrigin:\n dropdownPosition.placement === 'top'\n ? 'bottom center'\n : 'top center',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport Input from \"../Input\";\nimport Select from \"../Select\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (item: number | string): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type={isActive ? \"primary\" : \"default\"}\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: isActive ? `1px solid ${primaryColor}` : undefined,\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <LeftArrowIcon />\n </Button>\n )}\n </>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {getPageNumbers().map((item) => renderItem(item))}\n </div>\n\n {total > 0 && (\n <>\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <RightArrowIcon />\n </Button>\n )}\n </>\n )}\n\n {showSizeChanger && (\n <Select\n value={pageSize}\n options={pageSizeOptions.map((s) => ({\n label: `${s} / page`,\n value: Number(s),\n }))}\n onChange={(val) => handlePageSizeChange(Number(val))}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ minWidth: size === \"small\" ? 80 : 96 }}\n />\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n Go to\n </span>\n <Input\n type=\"number\"\n min={1}\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onPressEnter={handleJumpTo}\n disabled={disabled}\n size={size === \"small\" ? \"small\" : \"medium\"}\n style={{ width: 56, minWidth: 56 }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n page\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n OK\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import type React from 'react';\nimport {\n focusRing,\n radius,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n spacing,\n typography,\n} from '../../tokens';\nimport { BRAND_HOVER_COLOR, isDefaultBrandColor, resolveBrandColor } from './colorUtils';\n\nexport const controlFontFamily = typography.fontFamily.body;\nexport const controlFontWeightMedium = typography.fontWeight.medium;\nexport const controlFontWeightRegular = typography.fontWeight.regular;\n\nexport function getControlTypography(size: 'sm' | 'md') {\n return {\n fontSize: size === 'sm' ? typography.fontSize.sm : typography.fontSize.md,\n lineHeight: size === 'sm' ? typography.lineHeight.sm : typography.lineHeight.md,\n gap: size === 'sm' ? spacing.md : spacing.lg,\n hintGap: size === 'md' ? spacing.xxs : '0',\n };\n}\n\nexport function getCheckboxBorderRadius(size: 'sm' | 'md') {\n return size === 'sm' ? radius.xs : radius.sm;\n}\n\nexport function getControlBoxStyles(options: {\n disabled: boolean;\n active: boolean;\n hovered: boolean;\n brandColor?: string;\n}) {\n const { disabled, active, hovered } = options;\n const brand = resolveBrandColor(options.brandColor);\n const brandHover = BRAND_HOVER_COLOR;\n\n const bg = (() => {\n if (disabled) return semanticBg.disabledSubtle;\n if (active) return hovered ? brandHover : brand;\n return hovered ? semanticBg.secondary : semanticBg.primary;\n })();\n\n const border = (() => {\n if (disabled) return `1px solid ${semanticBorder.disabled}`;\n if (active) return `1px solid ${hovered ? brandHover : brand}`;\n return `1px solid ${semanticBorder.primary}`;\n })();\n\n return { bg, border };\n}\n\nexport function getControlFocusShadow(showFocus: boolean, brandColor?: string): string {\n if (!showFocus) return 'none';\n if (isDefaultBrandColor(brandColor)) return focusRing.default;\n return `0px 0px 0px 2px #ffffff, 0px 0px 0px 4px ${brandColor}`;\n}\n\nexport function getControlLabelStyle(options: {\n size: 'sm' | 'md';\n disabled: boolean;\n}): React.CSSProperties {\n const { fontSize, lineHeight } = getControlTypography(options.size);\n return {\n fontSize,\n lineHeight,\n fontWeight: controlFontWeightMedium,\n fontFamily: controlFontFamily,\n color: options.disabled ? semanticText.disabled : semanticText.secondary,\n userSelect: 'none',\n };\n}\n\nexport function getControlHintStyle(size: 'sm' | 'md'): React.CSSProperties {\n const { fontSize, lineHeight } = getControlTypography(size);\n return {\n fontSize,\n lineHeight,\n fontWeight: controlFontWeightRegular,\n fontFamily: controlFontFamily,\n color: semanticText.tertiary,\n };\n}\n\nexport function getControlActiveIconColor(disabled: boolean, active: boolean): string {\n if (disabled && active) return semanticFg.disabledSubtle;\n return semanticFg.white;\n}\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n getCheckboxBorderRadius,\n getControlActiveIconColor,\n getControlBoxStyles,\n getControlFocusShadow,\n getControlHintStyle,\n getControlLabelStyle,\n getControlTypography,\n} from '../shared/controlStyles';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const { primaryColor } = useTheme();\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const isActive = checked || indeterminate;\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled) return;\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const iconSize = size === 'sm' ? '12px' : '14px';\n const borderRadius = getCheckboxBorderRadius(size);\n const { gap, hintGap } = getControlTypography(size);\n const { bg, border } = getControlBoxStyles({\n disabled,\n active: isActive,\n hovered,\n brandColor: primaryColor,\n });\n const iconColor = getControlActiveIconColor(disabled, isActive);\n const hasLabel = children || hint;\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius,\n border,\n backgroundColor: bg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: getControlFocusShadow(showFocus, primaryColor),\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M2.91675 7H11.0834\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n style={{\n position: 'absolute',\n width: iconSize,\n height: iconSize,\n color: iconColor,\n opacity: checked && !indeterminate ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n }}\n >\n <path d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: hintGap }}>\n {children && (\n <span style={getControlLabelStyle({ size, disabled })}>\n {children}\n </span>\n )}\n {hint && (\n <span\n style={getControlHintStyle(size)}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== Loading 遮罩 ====================\n\nconst TableLoadingSpinner: React.FC<{ color: string }> = ({ color }) => (\n <>\n <style>{`\n @keyframes aha-table-loading-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <svg\n width={32}\n height={32}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n style={{ animation: 'aha-table-loading-spin 1s linear infinite' }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity={0.3}\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n);\n\nconst TableLoadingOverlay: React.FC<{\n loading: boolean | React.ReactNode;\n spinColor: string;\n}> = ({ loading, spinColor }) => {\n if (!loading) return null;\n const content = loading === true ? <TableLoadingSpinner color={spinColor} /> : loading;\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading\"\n className=\"aha-table-loading-overlay\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(255, 255, 255, 0.55)',\n pointerEvents: 'auto',\n }}\n >\n {content}\n </div>\n );\n};\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n innerClassName?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n innerClassName = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n const { primaryColor } = useTheme();\n const loadingSpinColor = primaryColor || '#FB6011';\n\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n // 当传入 pagination.total 时视为服务端分页:dataSource 已是当前页数据,不再做客户端 slice\n const isServerPagination = Boolean(pagination && typeof pagination === 'object' && pagination.total !== undefined);\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n if (isServerPagination) return processedData;\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination, isServerPagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染空状态 ====================\n const renderEmpty = useCallback(() => {\n const emptyText = locale?.emptyText;\n const content =\n typeof emptyText === 'function'\n ? emptyText()\n : emptyText !== undefined\n ? emptyText\n : 'No data';\n const colSpan = columns.length + (rowSelection ? 1 : 0);\n return (\n <tr className=\"aha-table-placeholder\">\n <td colSpan={colSpan} style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n borderBottom: 'none',\n backgroundColor: 'white',\n }}>\n {content}\n </td>\n </tr>\n );\n }, [locale?.emptyText, columns.length, rowSelection]);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n if (paginatedData.length === 0) {\n return renderEmpty();\n }\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset, renderEmpty]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n const emptyContent =\n typeof locale?.emptyText === 'function'\n ? locale.emptyText()\n : locale?.emptyText !== undefined\n ? locale.emptyText\n : 'No data';\n if (paginatedData.length === 0) {\n return (\n <div className=\"aha-table-mobile aha-table-placeholder\" style={{\n padding: '48px 16px',\n textAlign: 'center',\n color: '#98A2B3',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n }}>\n {emptyContent}\n </div>\n );\n }\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n ...(bordered && { borderRadius: '8px', border: '1px solid #EAECF0' }),\n overflow: 'hidden',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div\n ref={tableRef}\n className={`aha-table aha-table-mobile-wrapper ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div\n ref={tableRef}\n className={`aha-table ${className}`}\n style={wrapperStyle}\n aria-busy={loading ? true : undefined}\n {...rest}\n >\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={innerClassName}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n <TableLoadingOverlay loading={loading} spinColor={loadingSpinColor} />\n </div>\n );\n};\n\nexport default Table;\n\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n getControlActiveIconColor,\n getControlBoxStyles,\n getControlFocusShadow,\n getControlHintStyle,\n getControlLabelStyle,\n getControlTypography,\n} from '../shared/controlStyles';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n /** sm = 16px, md = 20px */\n size?: 'sm' | 'md';\n /** Secondary description rendered below the label */\n hint?: React.ReactNode;\n /** Force focused appearance (useful for Storybook demos) */\n isFocused?: boolean;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n size = 'sm',\n hint,\n isFocused: isFocusedProp,\n}) => {\n const { primaryColor } = useTheme();\n const [hovered, setHovered] = useState(false);\n const [focused, setFocused] = useState(false);\n\n const showFocus = isFocusedProp ?? focused;\n\n const handleClick = () => {\n if (disabled || checked) return;\n const syntheticEvent = {\n target: { checked: true, value },\n currentTarget: { checked: true, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const boxSize = size === 'sm' ? '16px' : '20px';\n const dotSize = size === 'sm' ? '6px' : '8px';\n const { gap, hintGap } = getControlTypography(size);\n const { bg, border } = getControlBoxStyles({\n disabled,\n active: checked,\n hovered,\n brandColor: primaryColor,\n });\n const dotColor = getControlActiveIconColor(disabled, checked);\n const hasLabel = children || hint;\n\n return (\n <div\n className={`aha-radio ${className}`}\n role=\"radio\"\n aria-checked={checked}\n aria-disabled={disabled}\n tabIndex={disabled ? -1 : 0}\n style={{\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap,\n cursor: disabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n ...style,\n }}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n }}\n onMouseEnter={() => !disabled && setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => !disabled && setFocused(true)}\n onBlur={() => setFocused(false)}\n >\n <div\n style={{\n position: 'relative',\n width: boxSize,\n height: boxSize,\n minWidth: boxSize,\n minHeight: boxSize,\n flexShrink: 0,\n borderRadius: '50%',\n border,\n backgroundColor: bg,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.15s, border-color 0.15s, box-shadow 0.15s',\n boxSizing: 'border-box',\n boxShadow: getControlFocusShadow(showFocus, primaryColor),\n marginTop: hasLabel ? '2px' : '0',\n }}\n >\n <div\n style={{\n width: dotSize,\n height: dotSize,\n borderRadius: '50%',\n backgroundColor: dotColor,\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.15s',\n pointerEvents: 'none',\n flexShrink: 0,\n }}\n />\n </div>\n\n {hasLabel && (\n <div style={{ display: 'inline-flex', flexDirection: 'column', gap: hintGap }}>\n {children && (\n <span style={getControlLabelStyle({ size, disabled })}>\n {children}\n </span>\n )}\n {hint && (\n <span\n style={getControlHintStyle(size)}\n onClick={(e) => e.stopPropagation()}\n >\n {hint}\n </span>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n","import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TabVariant = 'underline' | 'background';\nexport type TabLayout = 'equal' | 'spaced';\n\nexport interface TabItem {\n key: string | number;\n label: React.ReactNode;\n icon?: React.ReactElement | React.ComponentType<any>;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[] | string[] | number[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string | number;\n value?: string | number;\n onChange?: (value: string | number) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\n scrollable?: boolean; // 是否支持横向滚动(仅对 underline 样式有效,移动端/小宽度容器)\n [key: string]: any;\n}\n\nconst Tab: React.FC<TabProps> = ({\n items = [],\n variant = 'underline',\n layout = 'equal',\n defaultValue,\n value: controlledValue,\n onChange,\n className = '',\n mode = 'children',\n scrollable = false,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 将 string[] 或 number[] 转换为 TabItem[]\n // 使用 useMemo 稳定引用,避免导致无限循环\n const normalizedItems: TabItem[] = useMemo(() => {\n if (items.length === 0) return [];\n \n // 判断第一个元素的类型\n const firstItem = items[0];\n if (typeof firstItem === 'string' || typeof firstItem === 'number') {\n return (items as (string | number)[]).map((item, index) => ({\n key: String(item),\n label: String(item),\n }));\n }\n \n return items as TabItem[];\n }, [items]);\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const firstKey: string | number = normalizedItems.length > 0 ? normalizedItems[0].key : '';\n \n // 查找匹配的 key:如果 value 在 normalizedItems 中找不到,尝试使用第一个 key\n const findMatchingKey = (value: string | number | undefined): string | number => {\n if (value === undefined) return firstKey;\n \n // 精确匹配(同时支持字符串和数字的比较)\n const exactMatch = normalizedItems.find(item => {\n // 1. 直接比较(最严格)\n if (item.key === value) return true;\n \n // 2. 字符串比较\n if (String(item.key) === String(value)) return true;\n \n // 3. 数字比较(确保两个都是有效数字)\n const itemNum = Number(item.key);\n const valueNum = Number(value);\n if (!isNaN(itemNum) && !isNaN(valueNum) && itemNum === valueNum) {\n return true;\n }\n \n return false;\n });\n \n if (exactMatch) {\n // 返回找到的 key,保持原始类型\n return exactMatch.key;\n }\n \n // 如果找不到,返回第一个 key(回退逻辑)\n return firstKey;\n };\n \n const [internalValue, setInternalValue] = useState<string | number>(() => {\n // 只在第一次渲染时计算\n const initialValue = controlledValue ?? defaultValue ?? firstKey;\n const matchedKey = findMatchingKey(initialValue);\n return matchedKey;\n });\n \n // 每次渲染时重新计算 currentValue,确保类型匹配\n const currentValue = isControlled \n ? (controlledValue !== undefined ? findMatchingKey(controlledValue) : firstKey)\n : internalValue;\n \n // 调试日志(可以帮助定位问题,问题解决后可以删除)\n useEffect(() => {\n console.log('[Tab Debug] currentValue:', currentValue, 'type:', typeof currentValue);\n console.log('[Tab Debug] normalizedItems:', normalizedItems.map(item => ({ key: item.key, type: typeof item.key })));\n console.log('[Tab Debug] controlledValue:', controlledValue, 'isControlled:', isControlled);\n }, [currentValue, normalizedItems, controlledValue, isControlled]);\n\n const handleTabClick = useCallback(\n (key: string | number, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n // 如果原始 items 是 number[],返回 number,否则返回 string\n const originalItem = items[0];\n const returnValue = typeof originalItem === 'number' && typeof key === 'number' ? key : (typeof key === 'number' ? String(key) : key);\n onChange?.(returnValue);\n \n // 如果支持滚动,点击后自动滚动到可见区域\n if (scrollable && variant === 'underline') {\n const activeTabElement = tabRefs.current[getKeyString(key)];\n const container = containerRef.current;\n if (activeTabElement && container) {\n // 标记正在滚动\n isScrollingRef.current = true;\n \n // 先立即更新一次位置(基于当前滚动位置)\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTabElement) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTabElement.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件,实时更新位置\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n // 滚动停止后,最终更新一次位置\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150); // 滚动停止 150ms 后认为滚动完成\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n // 使用 scrollIntoView 滚动到可见区域\n activeTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 如果 scrollIntoView 不支持或立即完成,也更新位置\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }\n },\n [isControlled, onChange, items, scrollable, variant]\n );\n\n const activeItem = normalizedItems.find((item) => {\n // 支持多种比较方式\n if (item.key === currentValue) return true;\n if (String(item.key) === String(currentValue)) return true;\n // 数字比较:确保两个都是数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) return true;\n return false;\n });\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n \n // 将 key 转为字符串的辅助函数\n const getKeyString = (key: string | number): string => String(key);\n const underlineRef = useRef<HTMLDivElement>(null);\n const backgroundSliderRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const backgroundContainerRef = useRef<HTMLDivElement>(null);\n const prevCurrentValueRef = useRef<string | number>('');\n const refsInitializedRef = useRef<Set<string>>(new Set());\n const isScrollingRef = useRef<boolean>(false); // 标记是否正在滚动\n const [underlineStyle, setUnderlineStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n const [backgroundSliderStyle, setBackgroundSliderStyle] = useState<React.CSSProperties>({\n width: 0,\n left: 0,\n opacity: 0,\n });\n\n // 更新下划线的辅助函数\n const updateUnderlinePosition = useCallback(() => {\n if (variant !== 'underline' || !containerRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!underlineRef.current || !containerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = containerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n // 计算下划线位置\n // 下划线是绝对定位,相对于容器(position: relative)\n // getBoundingClientRect() 返回的是相对于视口的位置\n // 下划线的 left 是相对于容器内容区域的起始位置\n // 所以需要:tab 相对于容器视口的位置 + 容器的滚动距离\n const scrollLeft = containerRef.current.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新下划线样式\n setUnderlineStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新背景滑块位置的辅助函数\n const updateBackgroundSliderPosition = useCallback(() => {\n if (variant !== 'background' || !backgroundContainerRef.current || !backgroundSliderRef.current || !currentValue) {\n return;\n }\n \n // 使用双重 requestAnimationFrame 确保 DOM 完全渲染完成\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // 再次检查 refs 和 currentValue,确保它们仍然有效\n if (!backgroundSliderRef.current || !backgroundContainerRef.current) {\n return;\n }\n \n let activeTab = tabRefs.current[getKeyString(currentValue)];\n \n // 如果找不到精确匹配的 tab,尝试使用第一个 item(回退逻辑)\n if (!activeTab && normalizedItems.length > 0) {\n const firstKey = normalizedItems[0].key;\n activeTab = tabRefs.current[getKeyString(firstKey)];\n }\n \n if (!activeTab) {\n return;\n }\n \n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n // 如果容器或标签页的尺寸为 0,说明还没有渲染完成,不更新\n if (containerRect.width === 0 || tabRect.width === 0) {\n return;\n }\n \n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n // 更新背景滑块样式\n setBackgroundSliderStyle((prev) => {\n if (prev.left === newLeft && prev.width === newWidth && prev.opacity === 1) {\n return prev; // 值相同,返回原对象,避免重新渲染\n }\n return {\n width: newWidth,\n left: newLeft,\n opacity: 1,\n };\n });\n });\n });\n }, [variant, currentValue, normalizedItems]);\n\n // 更新下划线和背景滑块位置\n useEffect(() => {\n // 如果没有 currentValue,不执行任何操作\n if (!currentValue) {\n prevCurrentValueRef.current = '';\n return;\n }\n \n // 如果 currentValue 没有变化,不执行(避免无限循环)\n if (prevCurrentValueRef.current === currentValue) {\n return;\n }\n \n // 更新 ref\n prevCurrentValueRef.current = currentValue;\n\n // 更新下划线位置\n // 如果正在滚动,不立即更新,等待滚动完成后再更新(在 handleTabClick 中处理)\n if (variant === 'underline' && containerRef.current && !isScrollingRef.current) {\n updateUnderlinePosition();\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundContainerRef.current && backgroundSliderRef.current) {\n updateBackgroundSliderPosition();\n }\n }, [currentValue, variant, normalizedItems.length, isControlled, updateUnderlinePosition, updateBackgroundSliderPosition]);\n \n // 初始渲染后,确保下划线和背景滑块正确显示(解决初始渲染时宽度为 0 的问题)\n // 只在组件挂载后执行一次\n useEffect(() => {\n if (!currentValue) return;\n \n // 延迟执行,确保所有 refs 都已设置\n const timer = setTimeout(() => {\n if (variant === 'underline') {\n // 检查 activeTab 是否存在\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && containerRef.current && underlineRef.current) {\n updateUnderlinePosition();\n \n // 如果支持滚动,初始渲染时自动滚动到激活项\n if (scrollable) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }\n } else if (variant === 'background') {\n // 更新背景滑块位置\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n if (activeTab && backgroundContainerRef.current && backgroundSliderRef.current) {\n const containerRect = backgroundContainerRef.current.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n const newLeft = `${left}px`;\n const newWidth = `${width}px`;\n \n setBackgroundSliderStyle({\n width: newWidth,\n left: newLeft,\n opacity: 1,\n });\n }\n }\n }\n }, 100); // 增加延迟,确保 refs 和 DOM 都已准备好\n \n return () => clearTimeout(timer);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // 只在组件挂载时执行一次\n \n // 当 currentValue 变化时,如果支持滚动,自动滚动到激活项\n // 注意:这个 useEffect 只在非点击触发的 currentValue 变化时执行(比如受控组件外部更新)\n useEffect(() => {\n if (!scrollable || variant !== 'underline' || !currentValue) return;\n \n // 如果正在滚动(由点击触发),不执行这个 useEffect 的滚动逻辑\n if (isScrollingRef.current) return;\n \n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[getKeyString(currentValue)];\n const container = containerRef.current;\n if (activeTab && container) {\n isScrollingRef.current = true;\n \n // 更新位置的函数\n const updatePosition = () => {\n if (!container || !underlineRef.current || !activeTab) return;\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n \n if (containerRect.width > 0 && tabRect.width > 0) {\n // 下划线是绝对定位,相对于容器内容区域\n // 需要加上容器的滚动距离\n const scrollLeft = container.scrollLeft || 0;\n const left = tabRect.left - containerRect.left + scrollLeft;\n const width = tabRect.width;\n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n };\n \n // 监听滚动事件\n let scrollTimeout: NodeJS.Timeout;\n const handleScroll = () => {\n updatePosition();\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n updatePosition();\n isScrollingRef.current = false;\n container.removeEventListener('scroll', handleScroll);\n }, 150);\n };\n \n container.addEventListener('scroll', handleScroll, { passive: true });\n \n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n \n // 立即更新一次\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n updatePosition();\n });\n });\n }\n }, 50);\n \n return () => clearTimeout(timer);\n }, [currentValue, scrollable, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n };\n \n // 如果支持滚动,添加滚动样式\n if (scrollable) {\n containerStyle.overflowX = 'auto';\n containerStyle.overflowY = 'hidden';\n containerStyle.scrollBehavior = 'smooth';\n // 隐藏滚动条但保持滚动功能\n containerStyle.scrollbarWidth = 'none'; // Firefox\n // @ts-ignore - WebKit 私有属性\n containerStyle.WebkitOverflowScrolling = 'touch'; // iOS 平滑滚动\n }\n \n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${scrollable ? 'aha-tab--scrollable' : ''} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '0px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={{\n position: 'relative',\n padding: '12px 0',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n opacity: item.disabled ? 0.5 : 1,\n transition: 'color 0.2s ease-in-out',\n // 如果支持滚动,tab 项需要 flex-shrink: 0 防止压缩\n flexShrink: scrollable ? 0 : undefined,\n whiteSpace: scrollable ? 'nowrap' : undefined,\n }}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 调试日志\n const iconType = typeof item.icon;\n const isReactElement = React.isValidElement(item.icon);\n console.log('[Tab Debug] Icon render:', {\n itemKey: item.key,\n iconType,\n isReactElement,\n iconValue: item.icon,\n });\n \n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 20,\n height: 20,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 20,\n height: 20,\n style: {\n color: isActive ? activeColor : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {normalizedItems.map((item) => {\n // 支持多种比较方式:直接比较、字符串比较、数字比较\n const isActive = (() => {\n // 直接比较(最严格)\n if (item.key === currentValue) {\n return true;\n }\n // 字符串比较\n if (String(item.key) === String(currentValue)) {\n return true;\n }\n // 数字比较:确保两个都是有效数字且相等\n const itemNum = Number(item.key);\n const currentNum = Number(currentValue);\n if (!isNaN(itemNum) && !isNaN(currentNum) && itemNum === currentNum) {\n return true;\n }\n return false;\n })();\n \n // 调试日志(仅对第一个 item 输出,避免太多日志)\n if (item.key === normalizedItems[0].key) {\n console.log('[Tab Debug] isActive check:', {\n itemKey: item.key,\n itemKeyType: typeof item.key,\n currentValue,\n currentValueType: typeof currentValue,\n isActive,\n variant,\n });\n }\n\n const itemStyle: React.CSSProperties = {\n position: 'relative',\n padding: '8px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n borderRadius: '6px',\n opacity: item.disabled ? 0.5 : 1,\n flex: layout === 'equal' ? 1 : 'none',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n transition: 'color 0.2s ease-in-out',\n zIndex: 1,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[getKeyString(item.key)] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (() => {\n // 如果 icon 是 ReactElement,直接克隆\n if (React.isValidElement(item.icon)) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.cloneElement(item.icon as React.ReactElement<any>, {\n width: 16,\n height: 16,\n style: {\n ...(item.icon.props as any)?.style,\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })}\n </div>\n );\n }\n \n // 如果 icon 是组件类型(函数),使用 createElement\n if (typeof item.icon === 'function') {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.createElement(item.icon as React.ComponentType<any>, {\n width: 16,\n height: 16,\n style: {\n color: isActive ? '#44403C' : '#79716B',\n },\n })}\n </div>\n );\n }\n \n // 其他情况直接渲染\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? '#44403C' : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.icon as React.ReactNode}\n </div>\n );\n })()}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: isActive ? '#FFF6ED' : '#FAFAF9',\n border: isActive ? '1px solid #FFD1A9' : '1px solid #E7E5E4',\n color: isActive ? '#C4330A' : '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n \n {/* 添加样式隐藏滚动条(仅对支持滚动的 underline 模式) */}\n {scrollable && variant === 'underline' && (\n <style>\n {`\n .aha-tab--scrollable::-webkit-scrollbar {\n display: none;\n }\n .aha-tab--scrollable {\n -ms-overflow-style: none;\n }\n `}\n </style>\n )}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n","import React from 'react';\nimport InputTags, { InputTagsProps } from '../Input/InputTags';\nimport {\n fieldColors,\n getFieldHintStyle,\n getFieldLabelStyle,\n} from '../shared/fieldStyles';\n\nexport interface TextareaTagsProps extends Omit<InputTagsProps, 'size'> {\n minHeight?: number;\n helpIcon?: React.ReactNode;\n}\n\nconst TextareaTags: React.FC<TextareaTagsProps> = ({\n minHeight = 120,\n style,\n label,\n required,\n hintText,\n helpIcon,\n error,\n ...props\n}) => {\n const tagsEl = (\n <InputTags\n error={error}\n style={{\n minHeight: `${minHeight}px`,\n alignItems: 'flex-start',\n overflow: 'auto',\n resize: 'vertical',\n ...style,\n }}\n {...props}\n />\n );\n\n if (!label && !hintText) return tagsEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n ...getFieldLabelStyle(),\n display: 'flex',\n alignItems: 'center',\n }}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: fieldColors.fgQuaternary }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {tagsEl}\n {hintText && <p style={getFieldHintStyle(error)}>{hintText}</p>}\n </div>\n );\n};\n\nexport default TextareaTags;\n","import React, { forwardRef, useRef, useEffect, useMemo, useLayoutEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\nimport {\n fieldColors,\n fieldFontFamily,\n fieldFontSizeMd,\n fieldFontSizeXs,\n fieldLineHeightMd,\n fieldLineHeightXs,\n fieldRadiusMd,\n getFieldFocusStyles,\n getFieldHintStyle,\n getFieldLabelStyle,\n getPlaceholderCss,\n} from '../shared/fieldStyles';\n\ninterface LinkifyOptions {\n validate?: (url: string) => boolean;\n className?: string;\n needProtocol?: boolean;\n needHost?: boolean;\n allowedTlds?: string[];\n}\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n disabled?: boolean;\n error?: boolean;\n readOnly?: boolean;\n showCount?: boolean;\n maxLength?: number;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n value?: string;\n defaultValue?: string;\n rows?: number;\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n linkify?: boolean;\n linkifyOptions?: LinkifyOptions;\n label?: string;\n required?: boolean;\n hintText?: string;\n helpIcon?: React.ReactNode;\n}\n\ntype TextToken =\n | { type: 'text'; text: string }\n | { type: 'url'; text: string; href: string };\n\nconst DOMAIN_REGEX = /^(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}$/;\nconst URL_CANDIDATE_REGEX =\n /(https?:\\/\\/[^\\s<]+|www\\.[^\\s<]+|(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(?:\\/[^\\s<]*)?)/gi;\nconst DEFAULT_ALLOWED_TLDS = new Set([\n 'com',\n 'cn',\n 'net',\n 'org',\n 'io',\n 'co',\n 'edu',\n 'gov',\n 'ai',\n 'app',\n 'dev',\n 'me',\n 'info',\n 'biz',\n 'tech',\n 'cc',\n 'tv',\n 'xyz',\n 'top',\n 'vip',\n 'pro',\n 'store',\n 'site',\n 'online',\n 'cloud',\n]);\n\nexport const websiteValidator = (\n url: string,\n needProtocol: boolean = true,\n needHost: boolean = true,\n allowedTlds?: string[]\n): boolean => {\n if (!url || typeof url !== 'string') return false;\n const trimmed = url.trim();\n if (!trimmed) return false;\n\n const hasProtocol = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(trimmed);\n if (needProtocol && !hasProtocol) return false;\n\n const normalized = hasProtocol ? trimmed : `https://${trimmed}`;\n\n try {\n const parsed = new URL(normalized);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== 'http:' && protocol !== 'https:') return false;\n\n if (needHost) {\n const host = parsed.hostname.toLowerCase();\n if (!host) return false;\n if (host === 'localhost') return true;\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host)) {\n return host.split('.').every((segment) => {\n const num = Number(segment);\n return Number.isInteger(num) && num >= 0 && num <= 255;\n });\n }\n if (!DOMAIN_REGEX.test(host)) return false;\n const tld = host.split('.').pop() || '';\n const tldSet = allowedTlds\n ? new Set(allowedTlds.map((item) => item.toLowerCase()))\n : DEFAULT_ALLOWED_TLDS;\n if (!tldSet.has(tld)) return false;\n }\n return true;\n } catch {\n return false;\n }\n};\n\nconst trimTrailingPunctuation = (value: string): { core: string; suffix: string } => {\n const match = value.match(/^(.*?)([),.;!?]+)?$/);\n return {\n core: match?.[1] || value,\n suffix: match?.[2] || '',\n };\n};\n\nconst tokenizeText = (\n text: string,\n options?: LinkifyOptions\n): TextToken[] => {\n if (!text) return [];\n\n const tokens: TextToken[] = [];\n let lastIndex = 0;\n const regex = new RegExp(URL_CANDIDATE_REGEX);\n let match = regex.exec(text);\n\n while (match) {\n const matchedText = match[0];\n const start = match.index;\n const end = start + matchedText.length;\n\n if (start > lastIndex) {\n tokens.push({ type: 'text', text: text.slice(lastIndex, start) });\n }\n\n const { core, suffix } = trimTrailingPunctuation(matchedText);\n const href = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(core)\n ? core\n : `https://${core}`;\n const defaultIsValid = websiteValidator(\n core,\n options?.needProtocol ?? false,\n options?.needHost ?? true,\n options?.allowedTlds\n );\n const isValid = options?.validate ? options.validate(href) : defaultIsValid;\n\n if (isValid && core) {\n tokens.push({ type: 'url', text: core, href });\n if (suffix) {\n tokens.push({ type: 'text', text: suffix });\n }\n } else {\n tokens.push({ type: 'text', text: matchedText });\n }\n\n lastIndex = end;\n match = regex.exec(text);\n }\n\n if (lastIndex < text.length) {\n tokens.push({ type: 'text', text: text.slice(lastIndex) });\n }\n\n return tokens;\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst ZWSP = '\\u200B';\nconst stripEditorArtifacts = (value: string): string =>\n value.replace(new RegExp(ZWSP, 'g'), '');\n\nconst renderTokensAsHtml = (\n text: string,\n options?: LinkifyOptions,\n disabled?: boolean\n): string => {\n const tokens = tokenizeText(text, options);\n if (tokens.length === 0) return '';\n\n const html = tokens\n .map((token) => {\n if (token.type === 'text') {\n return escapeHtml(token.text);\n }\n\n const classAttr = options?.className ? ` class=\"${options.className}\"` : '';\n const pointerEvents = disabled ? 'pointer-events: none;' : '';\n return `<a href=\"${escapeHtml(token.href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${classAttr} style=\"color: #2563EB; text-decoration: underline; ${pointerEvents}\">${escapeHtml(token.text)}</a>`;\n })\n .join('');\n\n // contentEditable 在末尾是换行时可能吞掉视觉换行,补一个零宽字符占位\n if (text.endsWith('\\n')) {\n return `${html}<span data-aha-zwsp=\"true\">${ZWSP}</span>`;\n }\n return html;\n};\n\nconst getCaretOffset = (container: HTMLElement): number => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return 0;\n\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer)) return 0;\n\n const preRange = range.cloneRange();\n preRange.selectNodeContents(container);\n preRange.setEnd(range.startContainer, range.startOffset);\n return stripEditorArtifacts(preRange.toString()).length;\n};\n\nconst setCaretOffset = (container: HTMLElement, offset: number): void => {\n const range = document.createRange();\n const selection = window.getSelection();\n if (!selection) return;\n\n let remaining = Math.max(0, offset);\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let currentNode = walker.nextNode();\n\n while (currentNode) {\n const rawText = currentNode.textContent || '';\n let visibleCount = 0;\n let targetOffsetInNode = -1;\n for (let i = 0; i < rawText.length; i += 1) {\n if (rawText[i] !== ZWSP) {\n visibleCount += 1;\n }\n if (visibleCount === remaining) {\n targetOffsetInNode = i + 1;\n break;\n }\n }\n\n if (remaining === 0) {\n range.setStart(currentNode, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n if (targetOffsetInNode !== -1) {\n range.setStart(currentNode, targetOffsetInNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n return;\n }\n\n remaining -= visibleCount;\n currentNode = walker.nextNode();\n }\n\n range.selectNodeContents(container);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n};\n\nconst getSelectionOffsets = (\n container: HTMLElement\n): { start: number; end: number } | null => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return null;\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer) || !container.contains(range.endContainer)) {\n return null;\n }\n\n const startRange = range.cloneRange();\n startRange.selectNodeContents(container);\n startRange.setEnd(range.startContainer, range.startOffset);\n\n const endRange = range.cloneRange();\n endRange.selectNodeContents(container);\n endRange.setEnd(range.endContainer, range.endOffset);\n\n return {\n start: stripEditorArtifacts(startRange.toString()).length,\n end: stripEditorArtifacts(endRange.toString()).length,\n };\n};\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n linkify = false,\n linkifyOptions,\n label,\n required,\n hintText,\n helpIcon,\n ...restProps\n },\n ref\n ) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editableRef = useRef<HTMLDivElement>(null);\n const isComposingRef = useRef(false);\n const caretOffsetRef = useRef<number | null>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n const { primaryColor } = useTheme();\n\n // 合并 ref(仅原生 textarea 模式)\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(linkify ? null : textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n linkify ? null : textareaRef.current;\n }\n }, [ref, linkify]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const getMaxLengthValue = useMemo(\n () => (typeof maxLength === 'number' ? maxLength : undefined),\n [maxLength]\n );\n\n // 自动调整高度(原生 textarea)\n useEffect(() => {\n if (!linkify && autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize, linkify]);\n\n // 自动调整高度(linkify + contentEditable)\n useEffect(() => {\n if (!linkify || !autoSize || !editableRef.current) return;\n const editable = editableRef.current;\n const minRows = typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows = typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n const lineHeight = parseInt(\n window.getComputedStyle(editable).lineHeight || '24',\n 10\n );\n const minHeight = minRows * lineHeight + 24;\n const maxHeight = maxRows ? maxRows * lineHeight + 24 : undefined;\n\n editable.style.height = 'auto';\n let newHeight = Math.max(editable.scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n editable.style.height = `${newHeight}px`;\n editable.style.overflowY = maxHeight && editable.scrollHeight > maxHeight ? 'auto' : 'hidden';\n setHeight(newHeight);\n }, [autoSize, currentValue, linkify]);\n\n useLayoutEffect(() => {\n if (!linkify || !editableRef.current || isComposingRef.current) return;\n const editable = editableRef.current;\n const isActive = document.activeElement === editable;\n const fallbackOffset = isActive ? getCaretOffset(editable) : 0;\n const caretOffset = caretOffsetRef.current ?? fallbackOffset;\n const nextHtml = renderTokensAsHtml(\n String(currentValue || ''),\n linkifyOptions,\n disabled\n );\n\n if (editable.innerHTML !== nextHtml) {\n editable.innerHTML = nextHtml;\n }\n\n if (isActive) {\n const maxOffset = String(currentValue || '').length;\n setCaretOffset(editable, Math.min(caretOffset, maxOffset));\n }\n caretOffsetRef.current = null;\n }, [currentValue, disabled, linkify, linkifyOptions]);\n\n const notifyChange = (nextValue: string) => {\n const syntheticEvent = {\n target: { value: nextValue },\n currentTarget: { value: nextValue },\n } as React.ChangeEvent<HTMLTextAreaElement>;\n onChange?.(syntheticEvent);\n };\n\n const handleEditableInput = () => {\n if (!editableRef.current || isComposingRef.current) return;\n caretOffsetRef.current = getCaretOffset(editableRef.current);\n const rawValue = stripEditorArtifacts(editableRef.current.textContent || '');\n const nextValue = getMaxLengthValue ? rawValue.slice(0, getMaxLengthValue) : rawValue;\n\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n notifyChange(nextValue);\n };\n\n const handleEditablePaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (readOnly || disabled) return;\n\n const pastedText = e.clipboardData.getData('text/plain');\n const currentText = String(currentValue || '');\n const selection = window.getSelection();\n let nextText = `${currentText}${pastedText}`;\n let caretOffset = currentText.length + pastedText.length;\n\n if (\n selection &&\n selection.rangeCount > 0 &&\n editableRef.current?.contains(selection.anchorNode)\n ) {\n const startOffset = getCaretOffset(editableRef.current);\n const endOffset = (() => {\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(editableRef.current);\n preRange.setEnd(range.endContainer, range.endOffset);\n return preRange.toString().length;\n })();\n nextText =\n currentText.slice(0, startOffset) +\n pastedText +\n currentText.slice(endOffset);\n caretOffset = startOffset + pastedText.length;\n }\n\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n caretOffset = Math.min(caretOffset, nextText.length);\n }\n caretOffsetRef.current = caretOffset;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const handleEditableKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (disabled || readOnly) return;\n if (!editableRef.current) return;\n\n e.preventDefault();\n const currentText = String(currentValue || '');\n const offsets = getSelectionOffsets(editableRef.current);\n const start = offsets?.start ?? currentText.length;\n const end = offsets?.end ?? start;\n\n let nextText = `${currentText.slice(0, start)}\\n${currentText.slice(end)}`;\n if (getMaxLengthValue) {\n nextText = nextText.slice(0, getMaxLengthValue);\n }\n\n const nextCaret = Math.min(start + 1, nextText.length);\n caretOffsetRef.current = nextCaret;\n\n if (!isControlled) {\n setInternalValue(nextText);\n }\n notifyChange(nextText);\n };\n\n const getFocusStyles = (): React.CSSProperties =>\n getFieldFocusStyles({ disabled, error, focused, brandColor: primaryColor });\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: fieldFontFamily,\n borderRadius: fieldRadiusMd,\n ...getFocusStyles(),\n backgroundColor:\n disabled || readOnly\n ? fieldColors.bgDisabledSubtle\n : fieldColors.bgPrimary,\n color: disabled ? fieldColors.textDisabled : fieldColors.textPrimary,\n fontSize: fieldFontSizeMd,\n fontWeight: 400,\n lineHeight: fieldLineHeightMd,\n padding: '12px 14px',\n transition: 'border-color 0.15s ease, box-shadow 0.15s ease, outline-color 0.15s ease',\n resize: autoSize || linkify ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none',\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n const placeholderStyles = getPlaceholderCss(\n '.aha-textarea-wrapper textarea',\n `\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n .aha-textarea-wrapper .aha-textarea-editable {\n white-space: pre-wrap;\n word-break: break-word;\n }\n .aha-textarea-wrapper .aha-textarea-editable:empty::before {\n content: attr(data-placeholder);\n color: ${fieldColors.textPlaceholder};\n }\n .aha-textarea-wrapper .aha-textarea-editable a {\n color: #2563EB;\n }\n `,\n );\n\n const textareaEl = (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n {linkify ? (\n <div\n ref={editableRef}\n className=\"aha-textarea-editable\"\n contentEditable={!disabled && !readOnly}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-disabled={disabled}\n data-placeholder={placeholder || ''}\n onInput={handleEditableInput}\n onPaste={handleEditablePaste}\n onKeyDown={handleEditableKeyDown}\n onFocus={(e) => handleFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onBlur={(e) => handleBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>)}\n onCompositionStart={() => {\n isComposingRef.current = true;\n }}\n onCompositionEnd={() => {\n isComposingRef.current = false;\n handleEditableInput();\n }}\n style={{\n ...baseStyles,\n minHeight: autoSize ? undefined : `${rows * 24 + 24}px`,\n overflowY: autoSize ? 'hidden' : 'auto',\n }}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n />\n ) : (\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n )}\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: fieldFontSizeXs,\n lineHeight: fieldLineHeightXs,\n color: disabled ? fieldColors.textDisabled : fieldColors.textTertiary,\n fontFamily: fieldFontFamily,\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n\n if (!label && !hintText) return textareaEl;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px', width: '100%' }}>\n {label && (\n <label style={{\n ...getFieldLabelStyle(),\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n }}>\n {label}\n {required && <span style={{ color: fieldColors.error600, marginLeft: '2px' }}>*</span>}\n {helpIcon && (\n <span style={{ marginLeft: '4px', display: 'inline-flex', alignItems: 'center', color: fieldColors.fgQuaternary }}>\n {helpIcon}\n </span>\n )}\n </label>\n )}\n {textareaEl}\n {hintText && (\n <p style={getFieldHintStyle(error)}>\n {hintText}\n </p>\n )}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\nexport { default as TextareaTags } from './TextareaTags';\nexport type { TextareaTagsProps } from './TextareaTags';\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 预设日期范围类型\nexport interface PresetRange {\n label: string;\n range: DateRange;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 预设日期范围列表(仅在范围模式下有效) */\n presetRanges?: PresetRange[] | boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n /** 是否显示选中的日期段(仅在范围模式下有效,默认false) */\n showSelectedRange?: boolean;\n /** 选中的开始日期段文本 */\n startSelectedRangeText?: string;\n /** 选中的结束日期段文本 */\n endSelectedRangeText?: string;\n /** 范围显示模式:'range'=显示两个输入框(xxx - xxx),'text'=显示一句话(仅在范围模式下有效,默认'range') */\n rangeDisplayMode?: 'range' | 'text';\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n showSelectedRange = false,\n startSelectedRangeText = 'Select dates',\n endSelectedRangeText = 'Select dates',\n rangeDisplayMode = 'range',\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number; placement?: 'top' | 'bottom' } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n const placementDeterminedRef = useRef(false); // 跟踪位置方向是否已确定\n const determinedPlacementRef = useRef<'top' | 'bottom' | null>(null); // 已确定的位置方向\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n } else {\n // 如果没有选中日期,设置为当前月份\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n // 重置位置方向确定标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n \n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.current.getBoundingClientRect();\n const gap = 4; // 下拉框与输入框的间距\n \n // 如果位置方向已经确定,只更新坐标,不改变方向\n if (placementDeterminedRef.current && determinedPlacementRef.current !== null) {\n const placement = determinedPlacementRef.current;\n let top: number;\n \n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n if (placement === 'top') {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n } else {\n top = rect.bottom + window.scrollY + gap;\n }\n } else {\n // 如果下拉框还没渲染,使用默认计算\n top = placement === 'top' \n ? rect.top + window.scrollY - 400 - gap // 估算高度\n : rect.bottom + window.scrollY + gap;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n return;\n }\n \n // 首次打开时,计算位置方向\n // 先设置为下方位置(默认)\n let top = rect.bottom + window.scrollY + gap;\n let placement: 'top' | 'bottom' = 'bottom';\n \n // 计算位置的函数\n const calculatePosition = () => {\n if (dropdownRef.current) {\n const dropdownHeight = dropdownRef.current.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n \n // 如果下方空间不够,但上方空间足够,则显示在上方\n if (spaceBelow < dropdownHeight && spaceAbove >= dropdownHeight) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n } else if (spaceBelow < dropdownHeight && spaceAbove < dropdownHeight) {\n // 如果上下都不够,选择空间更大的那一侧\n if (spaceAbove > spaceBelow) {\n top = rect.top + window.scrollY - dropdownHeight - gap;\n placement = 'top';\n }\n // 否则保持下方(即使可能被裁剪,也比上方好)\n }\n \n // 确定位置方向\n placementDeterminedRef.current = true;\n determinedPlacementRef.current = placement;\n }\n \n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n };\n \n // 先设置默认位置,让下拉框先渲染\n setDropdownPosition({\n top,\n left: rect.left + window.scrollX,\n width: rect.width,\n placement,\n });\n \n // 等待下拉框渲染后,重新计算位置\n // 使用双重 requestAnimationFrame 确保 DOM 已完全渲染\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n calculatePosition();\n });\n });\n }\n };\n\n updatePosition();\n\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n // 关闭时重置标记\n placementDeterminedRef.current = false;\n determinedPlacementRef.current = null;\n }\n }, [isOpen]);\n\n // 点击外部关闭\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n // 如果已经有完整的日期范围(开始和结束日期都存在),重新点击日期时清空之前的选择\n if (workingRange.startDate && workingRange.endDate) {\n // 清空之前的选择,将新点击的日期作为新的开始日期\n newRange = {\n startDate: date,\n endDate: null,\n };\n setSelectingStart(false); // 下一步选择结束日期\n } else if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n // 清空后,只有在日历关闭时才重置月份为当前月份\n // 如果日历是打开的,保持当前显示的月份不变\n if (!isOpen) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen) {\n // 打开日历时,如果没有选中日期,设置为当前月份\n if (isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n // 如果没有选中日期,设置为当前月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n } else {\n // 如果没有选中日期,设置为当前月份\n if (!currentSingleValue) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 默认预设日期范围\n const defaultPresetRanges = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n ];\n }, []);\n\n // 预设日期范围列表\n const presetRangesList = useMemo(() => {\n if (Array.isArray(presetRanges)) {\n // 如果传入的是数组,直接使用\n return presetRanges;\n } else if (presetRanges === true) {\n // 如果传入的是 true,使用默认值\n return defaultPresetRanges;\n } else {\n // 如果传入的是 false 或 undefined,返回空数组\n return [];\n }\n }, [presetRanges, defaultPresetRanges]);\n\n // 是否显示预设日期范围\n const hasPresetRanges = presetRangesList.length > 0;\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n // 更新日历显示为开始日期的月份\n if (range.startDate) {\n const startYear = range.startDate.getFullYear();\n const startMonth = range.startDate.getMonth();\n setCurrentMonth({\n year: startYear,\n month: startMonth,\n });\n }\n \n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n } else {\n // 如果日历已经打开,检查是否需要重置月份\n if (!currentRangeValue.startDate && !currentRangeValue.endDate) {\n const now = new Date();\n setCurrentMonth({\n year: now.getFullYear(),\n month: now.getMonth(),\n });\n }\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n \n // 计算范围文本显示值(当 rangeDisplayMode === 'text' 时使用)\n const rangeTextValue = useMemo(() => {\n if (!isRangeMode || rangeDisplayMode !== 'text') return '';\n \n // 默认格式化:如果两个日期都有,显示 \"Jan 10, 2025 - Jan 20, 2025\"\n // 如果只有一个日期,显示该日期\n // 如果都没有,返回空字符串\n if (currentRangeValue.startDate && currentRangeValue.endDate) {\n const startText = formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n const endText = formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n return `${startText} ${separator} ${endText}`;\n } else if (currentRangeValue.startDate) {\n return formatDate(currentRangeValue.startDate, 'MMM D, YYYY');\n } else if (currentRangeValue.endDate) {\n return formatDate(currentRangeValue.endDate, 'MMM D, YYYY');\n }\n return '';\n }, [isRangeMode, rangeDisplayMode, currentRangeValue, separator]);\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes dropdownFadeInTop {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: showClear ? '30px' : '12px', // 为清除按钮留出空间(如果有)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n rangeDisplayMode === 'text' ? (\n // 文本模式:显示单个输入框,显示格式化后的范围文本\n <input\n ref={inputRef}\n type=\"text\"\n value={rangeTextValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : (currentRangeValue.startDate || currentRangeValue.endDate) ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n ) : (\n // 范围模式:显示两个输入框\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n )\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n {showClear && (\n <div\n style={{\n position: 'absolute',\n right: '10px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <ClearIcon />\n </div>\n )}\n </div>\n\n {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: (dropdownPosition.placement || 'bottom') === 'top' ? 'translateY(8px)' : 'translateY(-8px)',\n animation: (dropdownPosition.placement || 'bottom') === 'top' \n ? 'dropdownFadeInTop 0.2s ease-out forwards' \n : 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && hasPresetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 显示选中的日期段(单月模式,在月份导航下面) */}\n {isRangeMode && showSelectedRange && calendarCount === 1 && monthIndex === 0 && (() => {\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n fontSize: '14px',\n marginBottom: '16px',\n }}\n >\n <div \n className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}\n >{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && hasPresetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && (\n <div\n style={{\n position: 'absolute',\n bottom: '3px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: (isRangeStart || isRangeEnd) ? \"#FFFFFF\" : primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* 显示选中的日期段(双月模式,无按钮时) */}\n {isRangeMode && showSelectedRange && calendarCount === 2 && !showApplyCancel && (() => {\n const workingRange = currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='flex items-center gap-2'\n style={{\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n </div>\n );\n })()}\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n {/* 显示选中的日期段(双月模式,在按钮旁边) */}\n {showSelectedRange && calendarCount === 2 && (() => {\n const workingRange = tempRangeValue || currentRangeValue;\n \n // 使用固定的 \"MMM D, YYYY\" 格式显示日期(如 \"Jan 10, 2025\")\n const startText = workingRange.startDate ? formatDate(workingRange.startDate, 'MMM D, YYYY') : startSelectedRangeText;\n const endText = workingRange.endDate ? formatDate(workingRange.endDate, 'MMM D, YYYY') : endSelectedRangeText;\n \n return (\n <div\n className='w-[260px] flex items-center gap-2'\n style={{\n fontSize: '14px',\n }}\n >\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.startDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{startText}</div>\n <div>{separator}</div>\n <div className={`flex-1 text-center border border-[#D7D3D0] rounded-md px-2 py-[6px] ${workingRange.endDate ? 'text-[#44403C]' : 'text-[#79716B]'}`}>{endText}</div>\n </div>\n );\n })()}\n <div\n className={`${ calendarCount === 2 ? '' : 'w-full'}`}\n style={{ display: 'flex', gap: '8px', flexShrink: 0, marginLeft: 'auto' }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n flex: 1,\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 批量设置字段(值 + 错误),类似 antd setFields\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n // 滚动到指定字段,类似 antd scrollToField\n scrollToField: (name: string, options?: ScrollIntoViewOptions) => void;\n // 注册字段 DOM 节点(供 scrollToField 使用,FormItem 内部调用)\n registerFieldRef: (name: string, element: HTMLElement | null) => void;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\n/** scrollToField 的选项,与 Element.scrollIntoView 一致 */\nexport type ScrollToFieldOptions = ScrollIntoViewOptions;\n\n/** 校验失败时抛出的错误,携带 values 和 errorFields,便于 catch 后使用 */\nexport class FormValidationError extends Error {\n /** 当前表单值 */\n values: Record<string, any>;\n /** 校验失败的字段列表 */\n errorFields: Array<{ name: string; errors: string[] }>;\n\n constructor(message: string, values: Record<string, any>, errorFields: Array<{ name: string; errors: string[] }>) {\n super(message);\n this.name = 'FormValidationError';\n this.values = values;\n this.errorFields = errorFields;\n Object.setPrototypeOf(this, FormValidationError.prototype);\n }\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 批量设置字段(值 + 错误),类似 antd 的 setFields */\n setFields: (fields: Array<{ name: string; value?: any; errors?: string[] }>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单:校验通过时 resolve 表单值,校验失败时 reject 为 FormValidationError(需 await 或 .catch() 才能捕获) */\n submit: () => Promise<any>;\n /** 滚动到指定字段(如第一个报错项) */\n scrollToField: (name: string, options?: ScrollToFieldOptions) => void;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFieldsState] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 存储每个字段的 DOM 元素,供 scrollToField 使用\n const fieldElementsRef = useRef<Record<string, HTMLElement>>({});\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldFnRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldFnRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFieldsState((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldFnRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n delete fieldElementsRef.current[name];\n setFieldsState((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n delete fieldsRef.current[name];\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFieldsState((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const values = getFieldsValue();\n const errorInfo = { values, errorFields: errors };\n onFinishFailed?.(errorInfo);\n // 抛出 Error 子类,保证可被 try/catch 和 Promise.catch 正常捕获,避免页面“挂掉”\n throw new FormValidationError('Form validation failed', values, errors);\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n fieldsRef.current[name] = { ...newFields[name] };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 批量设置字段(值 + 错误),类似 antd setFields\n const setFields = useCallback((fieldsToSet: Array<{ name: string; value?: any; errors?: string[] }>) => {\n setFieldsState((prev) => {\n const newFields = { ...prev };\n fieldsToSet.forEach(({ name, value, errors }) => {\n const error = errors && errors.length > 0 ? errors[0] : undefined;\n if (!newFields[name]) {\n newFields[name] = {\n value: value !== undefined ? value : undefined,\n error,\n touched: true,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n ...(value !== undefined && { value }),\n error,\n touched: true,\n };\n }\n fieldsRef.current[name] = { ...newFields[name] };\n });\n return newFields;\n });\n if (onValuesChange && fieldsToSet.some((f) => f.value !== undefined)) {\n const changedValues: Record<string, any> = {};\n fieldsToSet.forEach((f) => {\n if (f.value !== undefined) changedValues[f.name] = f.value;\n });\n setTimeout(() => onValuesChange(changedValues, getFieldsValue()), 0);\n }\n }, [onValuesChange, getFieldsValue]);\n\n // 注册字段 DOM 节点\n const registerFieldRef = useCallback((name: string, element: HTMLElement | null) => {\n if (element) {\n fieldElementsRef.current[name] = element;\n } else {\n delete fieldElementsRef.current[name];\n }\n }, []);\n\n // 滚动到指定字段\n const scrollToField = useCallback((name: string, options?: ScrollIntoViewOptions) => {\n const el = fieldElementsRef.current[name];\n el?.scrollIntoView({ behavior: 'smooth', block: 'center', ...options });\n }, []);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n setFields,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n scrollToField,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n }), [\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n setFields,\n submit,\n scrollToField,\n registerFieldRef,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n/** 获取表单实例的 hook,用法与 antd Form.useForm() 一致,返回的 ref 传给 <Form ref={formRef} /> 后即可使用 formRef.current?.setFieldValue 等方法 */\nfunction useForm(): [React.RefObject<FormInstance | null>] {\n const formRef = useRef<FormInstance | null>(null);\n return [formRef];\n}\n\n// 导出 FormItem 作为 Form.Item,并挂载 useForm\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nFormWithItem.Item = FormItem;\nFormWithItem.useForm = useForm;\n\nexport default FormWithItem;\nexport { useForm };\n\n","import React, { useContext, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 注册字段 DOM 节点,供 Form 的 scrollToField 使用\n const setItemRef = useCallback(\n (el: HTMLDivElement | null) => {\n (itemRef as React.MutableRefObject<HTMLDivElement | null>).current = el;\n if (name && formContext?.registerFieldRef) {\n formContext.registerFieldRef(name, el);\n }\n },\n [name, formContext]\n );\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件(函数组件 typeof 为 'function',React.memo 等为 'object')\n const childType = child.type as any;\n if (childType && (typeof childType === 'object' || typeof childType === 'function') && 'displayName' in childType) {\n const displayName = childType.displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={setItemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 菜单项右侧图标 */\n suffixIcon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 是否跳过全局点击事件(MenuList 的 onClick),默认为 false */\n skipGlobalClick?: boolean;\n}\n\nexport interface MenuGroupType {\n /** 分组标题 */\n title?: React.ReactNode;\n /** 分组下的菜单项 */\n children: MenuItemType[];\n /** 自定义类名 */\n className?: string;\n}\n\nexport interface UserProfileType {\n /** 用户头像 */\n avatar?: React.ReactNode;\n /** 用户姓名 */\n name: React.ReactNode;\n /** 用户邮箱 */\n email?: React.ReactNode;\n /** 在线状态 */\n online?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义用户资料的渲染 */\n render?: (profile: UserProfileType) => React.ReactNode;\n /** 点击事件 */\n onClick?: () => void;\n}\n\nexport interface MenuListProps {\n /** 菜单项数据 */\n items: (MenuItemType | MenuGroupType)[];\n /** 用户资料信息(显示在顶部) */\n userProfile?: UserProfileType;\n /** 当前选中的菜单项 key */\n selectedKeys?: string[];\n /** 默认选中的菜单项 key */\n defaultSelectedKeys?: string[];\n /** 选中项变化时的回调 */\n onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 取消选中时的回调 */\n onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[] }) => void;\n /** 统一的点击事件,无论点击哪个子项都会触发 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 菜单宽度 */\n width?: number | string;\n}\n\nconst MenuList: React.FC<MenuListProps> = ({\n items = [],\n userProfile,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n onDeselect,\n onClick,\n className = '',\n style,\n width = 320,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\n\n // 受控/非受控逻辑\n const isSelectedKeysControlled = controlledSelectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys);\n\n const selectedKeys = isSelectedKeysControlled ? controlledSelectedKeys : internalSelectedKeys;\n\n // 判断是否是分组\n const isGroup = (item: MenuItemType | MenuGroupType): item is MenuGroupType => {\n return 'children' in item && Array.isArray(item.children);\n };\n\n // 获取菜单项的完整路径\n const getKeyPath = useCallback(\n (key: string, items: (MenuItemType | MenuGroupType)[], path: string[] = []): string[] | null => {\n for (const item of items) {\n if (isGroup(item)) {\n // 是分组,递归查找子项\n const found = getKeyPath(key, item.children, path);\n if (found) return found;\n } else {\n const menuItem = item as MenuItemType;\n const currentPath = [...path, menuItem.key];\n if (menuItem.key === key) {\n return currentPath;\n }\n }\n }\n return null;\n },\n []\n );\n\n // 处理菜单项点击\n const handleItemClick = useCallback(\n (item: MenuItemType) => {\n if (item.disabled) return;\n\n const keyPath = getKeyPath(item.key, items) || [item.key];\n const isSelected = selectedKeys.includes(item.key);\n let newSelectedKeys: string[];\n\n if (isSelected) {\n newSelectedKeys = selectedKeys.filter((k) => k !== item.key);\n onDeselect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n } else {\n newSelectedKeys = [item.key];\n onSelect?.({ key: item.key, keyPath, selectedKeys: newSelectedKeys });\n }\n\n if (!isSelectedKeysControlled) {\n setInternalSelectedKeys(newSelectedKeys);\n }\n\n // 先调用菜单项自己的 onClick\n item.onClick?.({ key: item.key, keyPath });\n \n // 再调用统一的 onClick(MenuList 级别的),除非该菜单项设置了 skipGlobalClick\n if (!item.skipGlobalClick) {\n onClick?.({ key: item.key, keyPath });\n }\n },\n [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, onClick, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 600,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#44403C',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n {/* 右侧图标 */}\n {item.suffixIcon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginLeft: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.suffixIcon}\n </div>\n )}\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n /** 是否默认显示(非受控) */\n defaultVisible?: boolean;\n /** 是否显示(受控) */\n visible?: boolean;\n /** 显示/隐藏时的回调 */\n onVisibleChange?: (visible: boolean) => void;\n}\n\n// 箭头尺寸\nconst ARROW_SIZE = 6;\n// 默认间距\nconst GAP_DEFAULT = 6;\n\n// 计算箭头位置(相对于 tooltip 内容的位置)\nconst getArrowPosition = (\n position: TooltipPosition,\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n tooltipLeft: number,\n tooltipTop: number\n): React.CSSProperties => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + (triggerRect.width - ARROW_SIZE) / 2;\n const triggerCenterY = triggerRect.top + (triggerRect.height - ARROW_SIZE) / 2;\n \n // 计算箭头相对于 tooltip 内容的位置\n const tooltipAbsoluteLeft = tooltipLeft - scrollX;\n const tooltipAbsoluteTop = tooltipTop - scrollY;\n \n switch (position) {\n case \"top\":\n return {\n bottom: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"bottom\":\n return {\n top: -ARROW_SIZE,\n left: Math.min(Math.max(triggerCenterX - tooltipAbsoluteLeft, ARROW_SIZE), tooltipRect.width - ARROW_SIZE),\n };\n case \"left\":\n return {\n right: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"right\":\n return {\n left: -ARROW_SIZE,\n top: Math.min(Math.max(triggerCenterY - tooltipAbsoluteTop, ARROW_SIZE), tooltipRect.height - ARROW_SIZE),\n };\n case \"top-left\":\n return {\n bottom: -ARROW_SIZE,\n left: 12,\n };\n case \"top-right\":\n return {\n bottom: -ARROW_SIZE,\n right: 12,\n };\n case \"bottom-left\":\n return {\n top: -ARROW_SIZE,\n left: 12,\n };\n case \"bottom-right\":\n return {\n top: -ARROW_SIZE,\n right: 12,\n };\n default:\n return {};\n }\n};\n\n// 计算 tooltip 位置\nconst calculatePosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): { top: number; left: number } => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n \n // 考虑箭头的高度\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.left - tooltipRect.width - totalGap + scrollX;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2 + scrollY;\n left = triggerRect.right + totalGap + scrollX;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.left + scrollX;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerRect.right - tooltipRect.width + scrollX;\n break;\n default:\n top = triggerRect.bottom + totalGap + scrollY;\n left = triggerCenterX - tooltipRect.width / 2 + scrollX;\n }\n \n // 边界检测,确保 tooltip 不会超出视口\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n if (left < scrollX + padding) {\n left = scrollX + padding;\n } else if (left + tooltipRect.width > scrollX + viewportWidth - padding) {\n left = scrollX + viewportWidth - tooltipRect.width - padding;\n }\n \n if (top < scrollY + padding) {\n top = scrollY + padding;\n } else if (top + tooltipRect.height > scrollY + viewportHeight - padding) {\n top = scrollY + viewportHeight - tooltipRect.height - padding;\n }\n return { top, left };\n};\n\n// 检查指定位置是否会遮挡触发元素(使用实际计算后的位置)\nconst willOverlap = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): boolean => {\n // 使用 calculatePosition 计算实际位置(包含边界调整)\n const { top: calculatedTop, left: calculatedLeft } = calculatePosition(\n triggerRect,\n tooltipRect,\n position,\n gap\n );\n \n // 转换为视口坐标(不包含 scroll)\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const top = calculatedTop - scrollY;\n const left = calculatedLeft - scrollX;\n \n // 检查 tooltip 和触发元素是否重叠\n const tooltipBottom = top + tooltipRect.height;\n const tooltipRight = left + tooltipRect.width;\n const tooltipTop = top;\n const tooltipLeft = left;\n \n // 计算重叠区域\n const overlapTop = Math.max(tooltipTop, triggerRect.top);\n const overlapBottom = Math.min(tooltipBottom, triggerRect.bottom);\n const overlapLeft = Math.max(tooltipLeft, triggerRect.left);\n const overlapRight = Math.min(tooltipRight, triggerRect.right);\n \n // 如果有重叠,返回 true\n return overlapBottom > overlapTop + 1 && overlapRight > overlapLeft + 1;\n};\n\n// 自动选择最佳位置:灵活尝试多个方向\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 如果不会遮挡,直接返回指定位置\n if (!willOverlap(triggerRect, tooltipRect, preferredPosition, gap)) {\n return preferredPosition;\n }\n \n // 定义位置优先级列表\n const getPositionCandidates = (pos: TooltipPosition): TooltipPosition[] => {\n switch (pos) {\n case \"top\":\n return [\"bottom\", \"right\", \"left\"];\n case \"bottom\":\n return [\"top\", \"right\", \"left\"];\n case \"left\":\n return [\"right\", \"top\", \"bottom\"];\n case \"right\":\n return [\"left\", \"top\", \"bottom\"];\n case \"top-left\":\n return [\"bottom-left\", \"top-right\", \"bottom-right\", \"right\", \"left\"];\n case \"top-right\":\n return [\"bottom-right\", \"top-left\", \"bottom-left\", \"left\", \"right\"];\n case \"bottom-left\":\n return [\"top-left\", \"bottom-right\", \"top-right\", \"right\", \"left\"];\n case \"bottom-right\":\n return [\"top-right\", \"bottom-left\", \"top-left\", \"left\", \"right\"];\n default:\n return [];\n }\n };\n \n // 尝试候选位置,找到第一个不遮挡的\n const candidates = getPositionCandidates(preferredPosition);\n for (const candidate of candidates) {\n if (!willOverlap(triggerRect, tooltipRect, candidate, gap)) {\n return candidate;\n }\n }\n \n // 如果所有位置都遮挡,返回首选位置(至少保证功能可用)\n return preferredPosition;\n};\n\n// 渲染箭头\nconst renderArrow = (\n position: TooltipPosition,\n arrowStyle: React.CSSProperties\n) => {\n const baseArrowStyle: React.CSSProperties = {\n position: \"absolute\",\n width: 0,\n height: 0,\n borderStyle: \"solid\" as const,\n ...arrowStyle,\n };\n\n const arrowStyles: Record<TooltipPosition, React.CSSProperties> = {\n top: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n bottom: {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n left: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px 0 ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent transparent #0C0A09\",\n },\n right: {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px 0`,\n borderColor: \"transparent #0C0A09 transparent transparent\",\n },\n \"top-left\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"top-right\": {\n ...baseArrowStyle,\n borderWidth: `${ARROW_SIZE}px ${ARROW_SIZE}px 0 ${ARROW_SIZE}px`,\n borderColor: \"#0C0A09 transparent transparent transparent\",\n },\n \"bottom-left\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n \"bottom-right\": {\n ...baseArrowStyle,\n borderWidth: `0 ${ARROW_SIZE}px ${ARROW_SIZE}px ${ARROW_SIZE}px`,\n borderColor: \"transparent transparent #0C0A09 transparent\",\n },\n };\n return <div style={arrowStyles[position] as any} />;\n};\n\nconst Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n position = \"top\",\n trigger = \"hover\",\n delay = 200,\n disabled = false,\n className = \"\",\n tooltipClassName = \"\",\n gap = GAP_DEFAULT,\n showArrow = true,\n width,\n defaultVisible = false,\n visible,\n onVisibleChange,\n}) => {\n // 受控或非受控模式\n const isControlled = visible !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultVisible);\n const isVisible = isControlled ? visible : internalVisible;\n \n // 初始化 isAnimating 状态:受控模式用 visible,非受控模式用 defaultVisible\n const [isAnimating, setIsAnimating] = useState(isControlled ? (visible ?? false) : defaultVisible);\n \n const setIsVisible = useCallback((newVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(newVisible);\n }\n onVisibleChange?.(newVisible);\n }, [isControlled, onVisibleChange]);\n\n // 当受控模式的 visible 改变时,同步更新 isAnimating\n useEffect(() => {\n if (isControlled) {\n if (visible) {\n // 显示时,延迟一点再开始动画\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n } else {\n // 隐藏时,先停止动画,然后隐藏\n setIsAnimating(false);\n }\n }\n }, [isControlled, visible]);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\n const [tooltipMaxWidth, setTooltipMaxWidth] = useState<string>(\"320px\");\n const [tooltipStyle, setTooltipStyle] = useState<React.CSSProperties>({\n position: \"absolute\",\n top: 0,\n left: 0,\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n });\n const [arrowStyle, setArrowStyle] = useState<React.CSSProperties>({});\n \n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n \n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || !isVisible) return;\n \n // 如果正在隐藏动画中,不更新位置,避免移位\n if (!isAnimating) return;\n \n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n \n // 自动选择最佳位置,避免超出视口或被遮挡\n const finalPosition = getAutoPosition(triggerRect, tooltipRect, position, gap);\n setActualPosition(finalPosition);\n \n const { top, left } = calculatePosition(triggerRect, tooltipRect, finalPosition, gap);\n setTooltipStyle((prev) => ({\n ...prev,\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n // opacity 由 tooltipContainerStyle 控制,不在这里设置\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n }));\n\n // 计算箭头位置\n if (showArrow) {\n const arrowPos = getArrowPosition(\n finalPosition,\n triggerRect,\n tooltipRect,\n left,\n top\n );\n setArrowStyle(arrowPos);\n }\n }, [isVisible, position, gap, showArrow, isAnimating, trigger]);\n \n const showTooltip = useCallback(() => {\n if (disabled) return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n \n timeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n // 触发动画\n if (!isControlled) {\n // 非受控模式下,直接设置动画状态\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n // 受控模式下,动画状态由 visible prop 变化触发的 useEffect 控制\n }, delay);\n }, [disabled, delay, setIsVisible, isControlled]);\n \n const hideTooltip = useCallback(() => {\n // 清除显示定时器\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n \n if (!isControlled) {\n // 非受控模式下,先停止动画,然后隐藏\n setIsAnimating(false);\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n } else {\n // 受控模式下,直接调用 setIsVisible(会触发 onVisibleChange)\n setIsVisible(false);\n }\n }, [setIsVisible, isControlled]);\n\n // 保持 tooltip 显示(当鼠标在 tooltip 内容上时)\n const keepTooltipVisible = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 清除隐藏定时器\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n // 确保 tooltip 可见\n if (!isVisible) {\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [trigger, isVisible]);\n\n // 点击触发工具提示(click 模式)\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || trigger !== \"click\") return;\n \n e.stopPropagation();\n \n // 如果已经显示,则隐藏\n if (isVisible) {\n hideTooltip();\n } else {\n // 清除延迟定时器,立即显示(click 模式不使用延迟)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setIsVisible(true);\n requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }\n }, [disabled, trigger, isVisible, hideTooltip]);\n\n // 当 defaultVisible 为 true 时,确保初始位置正确计算\n useEffect(() => {\n if (defaultVisible && isVisible && isAnimating) {\n // 多次尝试更新位置,确保 DOM 已渲染\n const tryUpdatePosition = () => {\n if (triggerRef.current && tooltipRef.current) {\n updatePosition();\n } else {\n // 如果 DOM 还没准备好,再试一次\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 10);\n }\n };\n \n // 延迟执行,确保 Portal 已渲染到 DOM\n setTimeout(() => {\n requestAnimationFrame(tryUpdatePosition);\n }, 0);\n }\n }, [defaultVisible, isVisible, isAnimating, updatePosition]); // 只在初始化时执行\n\n useEffect(() => {\n if (isVisible) {\n // 使用 requestAnimationFrame 确保 DOM 已更新\n requestAnimationFrame(() => {\n updatePosition();\n });\n \n // 监听滚动和窗口大小变化\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n \n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [isVisible, updatePosition]);\n\n // 点击外部区域关闭 tooltip(仅 click 模式)\n useEffect(() => {\n if (!isVisible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n triggerRef.current &&\n tooltipRef.current &&\n !triggerRef.current.contains(event.target as Node) &&\n !tooltipRef.current.contains(event.target as Node)\n ) {\n hideTooltip();\n }\n };\n\n // 使用捕获阶段确保在其他点击处理之前执行\n document.addEventListener(\"mousedown\", handleClickOutside, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside, true);\n };\n }, [isVisible, trigger, hideTooltip]);\n \n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n };\n }, []);\n\n // Tooltip 容器样式\n const tooltipContainerStyle: React.CSSProperties = {\n position: \"absolute\",\n top: 0,\n left: 0,\n opacity: isAnimating ? 1 : 0,\n transform: isAnimating ? \"scale(1)\" : \"scale(0.95)\",\n transition: \"opacity 150ms ease-out, transform 150ms ease-out\",\n // hover 模式下允许鼠标事件,click 模式下禁用\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n zIndex: 9999,\n };\n\n // 计算 tooltip 最大宽度\n const calculateTooltipMaxWidth = useCallback((): string => {\n if (typeof window === \"undefined\") return \"320px\";\n const viewportWidth = window.innerWidth;\n // 移动端:使用 calc 确保不超出屏幕\n // 桌面端:最大宽度 320px\n return viewportWidth >= 768 ? \"320px\" : \"calc(100vw - 32px)\";\n }, []);\n\n // 更新 tooltip 最大宽度\n useEffect(() => {\n const updateMaxWidth = () => {\n setTooltipMaxWidth(calculateTooltipMaxWidth());\n };\n \n updateMaxWidth();\n window.addEventListener(\"resize\", updateMaxWidth);\n \n return () => {\n window.removeEventListener(\"resize\", updateMaxWidth);\n };\n }, [calculateTooltipMaxWidth]);\n\n // Tooltip 内容样式(符合设计系统)\n const tooltipContentStyle: React.CSSProperties = {\n backgroundColor: \"#0C0A09\",\n color: \"#FFFFFF\",\n padding: \"8px 12px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: 400,\n fontFamily: \"DM Sans, sans-serif\",\n lineHeight: \"16px\",\n // 如果设置了 width,使用设置的宽度,但在移动端也要限制最大宽度;否则使用自动计算的最大宽度\n ...(width !== undefined\n ? {\n width: typeof width === \"number\" ? `${width}px` : width,\n // 移动端也要限制最大宽度,不能超出屏幕\n maxWidth: typeof window !== \"undefined\" && window.innerWidth < 768 \n ? \"calc(100vw - 32px)\" \n : undefined,\n }\n : {\n maxWidth: tooltipMaxWidth,\n width: \"max-content\",\n }),\n wordWrap: \"break-word\",\n boxShadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n whiteSpace: \"pre-wrap\",\n position: \"relative\",\n boxSizing: \"border-box\",\n };\n\n const tooltipContent = (\n <div\n style={{\n ...tooltipContainerStyle,\n ...tooltipStyle,\n // 确保 hover 模式下 pointerEvents 为 auto\n pointerEvents: trigger === \"hover\" ? \"auto\" : \"none\",\n } as any}\n className={`aha-tooltip-wrapper ${tooltipClassName}`}\n onMouseEnter={trigger === \"hover\" ? keepTooltipVisible : undefined}\n onMouseLeave={trigger === \"hover\" ? hideTooltip : undefined}\n >\n <div\n ref={tooltipRef}\n className={`aha-tooltip ${tooltipClassName}`}\n style={tooltipContentStyle as any}\n role=\"tooltip\"\n >\n {content}\n </div>\n {showArrow && renderArrow(actualPosition, arrowStyle)}\n </div>\n );\n \n // 延迟隐藏(用于从触发元素移动到 tooltip 内容的过渡)\n const handleTriggerMouseLeave = useCallback(() => {\n if (trigger !== \"hover\") return;\n \n // 延迟隐藏,给用户时间移动到 tooltip 内容上\n // 如果用户在延迟期间移动到 tooltip 内容上,keepTooltipVisible 会清除这个定时器\n hideTimeoutRef.current = setTimeout(() => {\n hideTooltip();\n }, 100);\n }, [trigger, hideTooltip]);\n\n // 根据触发模式设置事件处理器\n const triggerProps = trigger === \"click\" \n ? {\n onClick: handleClick,\n }\n : {\n onMouseEnter: showTooltip,\n onMouseLeave: handleTriggerMouseLeave,\n onFocus: showTooltip,\n onBlur: hideTooltip,\n };\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-tooltip-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: trigger === \"click\" ? \"pointer\" : \"default\" }}\n {...triggerProps}\n >\n {children}\n </div>\n {isVisible && typeof document !== \"undefined\" && createPortal(tooltipContent, document.body)}\n </>\n );\n};\n\nexport default Tooltip;","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { shadow } from \"../../tokens\";\n\nexport type PopoverTrigger = \"click\" | \"hover\";\nexport type PopoverPlacement = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface PopoverProps {\n /** 触发节点 */\n children: React.ReactNode;\n /** Popover 内容 */\n content: React.ReactNode;\n /** 触发模式 */\n trigger?: PopoverTrigger;\n /** 是否显示(受控) */\n open?: boolean;\n /** 默认是否显示(非受控) */\n defaultOpen?: boolean;\n /** 显示状态变化回调 */\n onOpenChange?: (open: boolean) => void;\n /** 展示方向 */\n placement?: PopoverPlacement;\n /** 内容宽度 */\n width?: string | number;\n /** 触发节点和 Popover 的间距 */\n offset?: number;\n /** 自定义容器类名 */\n className?: string;\n /** 自定义 Popover 类名 */\n popoverClassName?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 关闭时是否销毁内容,默认 true */\n destroyOnHide?: boolean;\n /** antd 兼容参数:关闭时是否销毁内容 */\n destroyTooltipOnHide?: boolean;\n /** 是否显示箭头(兼容参数,当前不渲染箭头) */\n arrow?: boolean;\n}\n\nconst DEFAULT_OFFSET = 8;\nconst VIEWPORT_PADDING = 8;\n\nconst getOppositePlacement = (placement: PopoverPlacement): PopoverPlacement => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"bottom\":\n return \"top\";\n case \"left\":\n return \"right\";\n case \"right\":\n default:\n return \"left\";\n }\n};\n\nconst hasEnoughSpace = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom >= popoverRect.height + offset + VIEWPORT_PADDING;\n case \"left\":\n return triggerRect.left >= popoverRect.width + offset + VIEWPORT_PADDING;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right >= popoverRect.width + offset + VIEWPORT_PADDING;\n }\n};\n\nconst getAvailableSpace = (triggerRect: DOMRect, placement: PopoverPlacement) => {\n switch (placement) {\n case \"top\":\n return triggerRect.top;\n case \"bottom\":\n return window.innerHeight - triggerRect.bottom;\n case \"left\":\n return triggerRect.left;\n case \"right\":\n default:\n return window.innerWidth - triggerRect.right;\n }\n};\n\nconst getPlacementPosition = (\n triggerRect: DOMRect,\n popoverRect: DOMRect,\n placement: PopoverPlacement,\n offset: number\n) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n\n switch (placement) {\n case \"top\":\n return {\n top: triggerRect.top - popoverRect.height - offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"bottom\":\n return {\n top: triggerRect.bottom + offset + scrollY,\n left: triggerCenterX - popoverRect.width / 2 + scrollX,\n };\n case \"left\":\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.left - popoverRect.width - offset + scrollX,\n };\n case \"right\":\n default:\n return {\n top: triggerCenterY - popoverRect.height / 2 + scrollY,\n left: triggerRect.right + offset + scrollX,\n };\n }\n};\n\nconst clampToViewport = (top: number, left: number, popoverRect: DOMRect) => {\n const scrollX = window.scrollX || window.pageXOffset;\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const boundaryPadding = VIEWPORT_PADDING;\n\n let nextTop = top;\n let nextLeft = left;\n\n if (nextLeft < scrollX + boundaryPadding) {\n nextLeft = scrollX + boundaryPadding;\n }\n if (nextLeft + popoverRect.width > scrollX + viewportWidth - boundaryPadding) {\n nextLeft = scrollX + viewportWidth - popoverRect.width - boundaryPadding;\n }\n\n if (nextTop < scrollY + boundaryPadding) {\n nextTop = scrollY + boundaryPadding;\n }\n if (nextTop + popoverRect.height > scrollY + viewportHeight - boundaryPadding) {\n nextTop = scrollY + viewportHeight - popoverRect.height - boundaryPadding;\n }\n\n return { top: nextTop, left: nextLeft };\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n children,\n content,\n trigger = \"click\",\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"right\",\n width,\n offset = DEFAULT_OFFSET,\n className = \"\",\n popoverClassName = \"\",\n disabled = false,\n destroyOnHide,\n destroyTooltipOnHide,\n}) => {\n const shouldDestroyOnHide =\n destroyOnHide ?? destroyTooltipOnHide ?? true;\n const isControlled = open !== undefined;\n const [internalVisible, setInternalVisible] = useState(defaultOpen);\n const visible = isControlled ? !!open : internalVisible;\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({\n top: 0,\n left: 0,\n opacity: 0,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const setVisible = useCallback(\n (nextVisible: boolean) => {\n if (!isControlled) {\n setInternalVisible(nextVisible);\n }\n onOpenChange?.(nextVisible);\n },\n [isControlled, onOpenChange]\n );\n\n const updatePosition = useCallback(() => {\n if (!visible || !triggerRef.current || !popoverRef.current) {\n return;\n }\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const nextPlacement = (() => {\n if (hasEnoughSpace(triggerRect, popoverRect, placement, offset)) {\n return placement;\n }\n const oppositePlacement = getOppositePlacement(placement);\n if (hasEnoughSpace(triggerRect, popoverRect, oppositePlacement, offset)) {\n return oppositePlacement;\n }\n return getAvailableSpace(triggerRect, oppositePlacement) > getAvailableSpace(triggerRect, placement)\n ? oppositePlacement\n : placement;\n })();\n\n const { top, left } = getPlacementPosition(triggerRect, popoverRect, nextPlacement, offset);\n const clamped = clampToViewport(top, left, popoverRect);\n\n setPopoverStyle({\n top: clamped.top,\n left: clamped.left,\n opacity: 1,\n });\n }, [visible, placement, offset]);\n\n const openPopover = useCallback(() => {\n if (disabled) return;\n setVisible(true);\n }, [disabled, setVisible]);\n\n const closePopover = useCallback(() => {\n setVisible(false);\n }, [setVisible]);\n\n const togglePopover = useCallback(() => {\n if (disabled) return;\n setVisible(!visible);\n }, [disabled, visible, setVisible]);\n\n useEffect(() => {\n if (!visible) return;\n\n requestAnimationFrame(() => {\n updatePosition();\n });\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }, [visible, updatePosition]);\n\n useEffect(() => {\n if (!visible || trigger !== \"click\") return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n popoverRef.current &&\n !triggerRef.current.contains(target) &&\n !popoverRef.current.contains(target)\n ) {\n closePopover();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [visible, trigger, closePopover]);\n\n const triggerEvents =\n trigger === \"hover\"\n ? {\n onMouseEnter: openPopover,\n onMouseLeave: closePopover,\n onFocus: openPopover,\n onBlur: closePopover,\n }\n : {\n onClick: (event: React.MouseEvent) => {\n event.stopPropagation();\n togglePopover();\n },\n };\n\n const shouldRenderPopoverNode = visible || !shouldDestroyOnHide;\n\n const popoverNode = shouldRenderPopoverNode ? (\n <div\n ref={popoverRef}\n className={`aha-popover ${popoverClassName}`}\n style={{\n position: \"absolute\",\n zIndex: 9999,\n top: popoverStyle.top,\n left: popoverStyle.left,\n opacity: visible ? popoverStyle.opacity : 0,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n width: typeof width === \"number\" ? `${width}px` : width,\n maxWidth: `calc(100vw - ${VIEWPORT_PADDING * 2}px)`,\n backgroundColor: \"#FFFFFF\",\n border: \"1px solid #00000014\",\n borderRadius: \"12px\",\n padding: \"6px\",\n boxSizing: \"border-box\",\n boxShadow: shadow.lg,\n }}\n onMouseEnter={trigger === \"hover\" ? openPopover : undefined}\n onMouseLeave={trigger === \"hover\" ? closePopover : undefined}\n onMouseDown={trigger === \"click\" ? (event) => event.stopPropagation() : undefined}\n >\n {content}\n </div>\n ) : null;\n\n return (\n <>\n <div\n ref={triggerRef}\n className={`aha-popover-trigger ${className}`}\n style={{ display: \"inline-block\", cursor: disabled ? \"not-allowed\" : \"pointer\" }}\n {...triggerEvents}\n >\n {children}\n </div>\n {popoverNode && typeof document !== \"undefined\" && createPortal(popoverNode, document.body)}\n </>\n );\n};\n\nPopover.displayName = \"Popover\";\n\nexport default Popover;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type DrawerPlacement = \"left\" | \"right\" | \"top\" | \"bottom\";\n\nexport interface DrawerProps {\n /** 是否打开(受控) */\n open?: boolean;\n /** 默认是否打开(非受控) */\n defaultOpen?: boolean;\n /** 关闭回调 */\n onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n /** 打开/关闭动画结束回调 */\n afterOpenChange?: (open: boolean) => void;\n /** 抽屉标题 */\n title?: React.ReactNode;\n /** 头部右侧内容 */\n extra?: React.ReactNode;\n /** 底部内容 */\n footer?: React.ReactNode;\n /** 内容 */\n children?: React.ReactNode;\n /** 打开方向 */\n placement?: DrawerPlacement;\n /** PC 端宽度(移动端始终使用 100vw) */\n width?: number | string;\n /** 高度(top/bottom 生效,移动端同样支持) */\n height?: number | string;\n /** 是否显示遮罩 */\n mask?: boolean;\n /** 点击遮罩是否关闭 */\n maskClosable?: boolean;\n /** 是否显示右上角关闭按钮 */\n closable?: boolean;\n /** 自定义关闭图标 */\n closeIcon?: React.ReactNode;\n /** 是否支持 Esc 关闭 */\n keyboard?: boolean;\n /** 是否在关闭后销毁内容 */\n destroyOnClose?: boolean;\n /** 层级 */\n zIndex?: number;\n /** 移动端断点 */\n mobileBreakpoint?: number;\n /** 容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n /** 抽屉面板类名 */\n drawerStyle?: React.CSSProperties;\n /** 头部样式 */\n headerStyle?: React.CSSProperties;\n /** 内容样式 */\n bodyStyle?: React.CSSProperties;\n /** 底部样式 */\n footerStyle?: React.CSSProperties;\n /** 遮罩样式 */\n maskStyle?: React.CSSProperties;\n}\n\nconst ANIMATION_DURATION = 240;\n\nconst Drawer: React.FC<DrawerProps> = ({\n open,\n defaultOpen = false,\n onClose,\n afterOpenChange,\n title,\n extra,\n footer,\n children,\n placement = \"right\",\n width = 378,\n height = 378,\n mask = true,\n maskClosable = true,\n closable = true,\n closeIcon,\n keyboard = true,\n destroyOnClose = false,\n zIndex = 1000,\n mobileBreakpoint = 768,\n className = \"\",\n style,\n drawerStyle,\n headerStyle,\n bodyStyle,\n footerStyle,\n maskStyle,\n}) => {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const mergedOpen = isControlled ? !!open : internalOpen;\n const [shouldRender, setShouldRender] = useState(mergedOpen);\n const [animatedOpen, setAnimatedOpen] = useState(mergedOpen);\n const [mounted, setMounted] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const updateMobile = () => {\n setIsMobile(window.innerWidth < mobileBreakpoint);\n };\n\n updateMobile();\n window.addEventListener(\"resize\", updateMobile);\n return () => {\n window.removeEventListener(\"resize\", updateMobile);\n };\n }, [mobileBreakpoint]);\n\n useEffect(() => {\n if (mergedOpen) {\n setShouldRender(true);\n // 先在新方向的“关闭位置”渲染一帧,再执行打开动画,避免方向切换时动画起点错误\n setAnimatedOpen(false);\n const raf = requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatedOpen(true);\n });\n });\n const timer = window.setTimeout(() => {\n afterOpenChange?.(true);\n }, ANIMATION_DURATION);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(timer);\n };\n }\n\n setAnimatedOpen(false);\n const timer = window.setTimeout(() => {\n if (destroyOnClose) {\n setShouldRender(false);\n }\n afterOpenChange?.(false);\n }, ANIMATION_DURATION);\n\n return () => window.clearTimeout(timer);\n }, [mergedOpen, destroyOnClose, afterOpenChange]);\n\n useEffect(() => {\n if (!mergedOpen || !keyboard) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose?.(event as unknown as React.KeyboardEvent);\n if (!isControlled) {\n setInternalOpen(false);\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mergedOpen, keyboard, onClose, isControlled]);\n\n useEffect(() => {\n if (!mounted) return;\n if (!mergedOpen) return;\n\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [mergedOpen, mounted]);\n\n const closeDrawer = useCallback(\n (e?: React.MouseEvent | React.KeyboardEvent) => {\n onClose?.(e);\n if (!isControlled) {\n setInternalOpen(false);\n }\n },\n [onClose, isControlled]\n );\n\n const resolvedWidth = useMemo(() => {\n if (isMobile) return \"100vw\";\n if (placement === \"left\" || placement === \"right\") {\n return typeof width === \"number\" ? `${width}px` : width;\n }\n return \"100vw\";\n }, [placement, isMobile, width]);\n\n const resolvedHeight = useMemo(() => {\n if (placement === \"top\" || placement === \"bottom\") {\n return typeof height === \"number\" ? `${height}px` : height;\n }\n return \"100vh\";\n }, [placement, height]);\n\n const effectivePlacement: DrawerPlacement = useMemo(() => {\n if (!isMobile) return placement;\n // 移动端仅支持 top / bottom,left / right 自动降级为 bottom\n if (placement === \"left\" || placement === \"right\") return \"bottom\";\n return placement;\n }, [isMobile, placement]);\n\n const drawerPositionStyle: React.CSSProperties = useMemo(() => {\n const base: React.CSSProperties = {\n position: \"fixed\",\n backgroundColor: \"#FFFFFF\",\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n boxShadow: \"0 6px 16px rgba(0, 0, 0, 0.08), 0 3px 6px rgba(0, 0, 0, 0.12)\",\n transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n zIndex: zIndex + 1,\n };\n\n switch (effectivePlacement) {\n case \"left\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(-100%)\",\n };\n case \"right\":\n return {\n ...base,\n top: 0,\n right: 0,\n width: resolvedWidth,\n height: \"100vh\",\n transform: animatedOpen ? \"translateX(0)\" : \"translateX(100%)\",\n };\n case \"top\":\n return {\n ...base,\n top: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(-100%)\",\n };\n case \"bottom\":\n default:\n return {\n ...base,\n bottom: 0,\n left: 0,\n width: \"100vw\",\n height: resolvedHeight,\n transform: animatedOpen ? \"translateY(0)\" : \"translateY(100%)\",\n };\n }\n }, [effectivePlacement, resolvedWidth, resolvedHeight, animatedOpen, zIndex]);\n\n if (!mounted || (!shouldRender && !mergedOpen)) {\n return null;\n }\n\n const node = (\n <div\n className={`aha-drawer-root ${className}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex,\n pointerEvents: mergedOpen || animatedOpen ? \"auto\" : \"none\",\n ...style,\n }}\n >\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? (e) => closeDrawer(e) : undefined}\n style={{\n position: \"absolute\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.45)\",\n opacity: animatedOpen ? 1 : 0,\n transition: `opacity ${ANIMATION_DURATION}ms cubic-bezier(0.2, 0, 0, 1)`,\n ...maskStyle,\n }}\n />\n )}\n\n <div\n key={`${effectivePlacement}-${mergedOpen ? \"open\" : \"closed\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n style={{ ...drawerPositionStyle, ...drawerStyle }}\n >\n {(title !== undefined || closable || extra) && (\n <div\n style={{\n minHeight: \"56px\",\n padding: \"16px 24px\",\n borderBottom: \"1px solid #F0F0F0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"12px\",\n ...headerStyle,\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600, color: \"#1F2937\", flex: 1 }}>{title}</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\" }}>\n {extra}\n {closable && (\n <button\n type=\"button\"\n onClick={(e) => closeDrawer(e)}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 0,\n margin: 0,\n width: \"24px\",\n height: \"24px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n color: \"#6B7280\",\n }}\n aria-label=\"Close\"\n >\n {closeIcon || (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n style={{\n padding: \"24px\",\n overflowY: \"auto\",\n flex: 1,\n boxSizing: \"border-box\",\n ...bodyStyle,\n }}\n >\n {children}\n </div>\n\n {footer !== undefined && (\n <div\n style={{\n borderTop: \"1px solid #F0F0F0\",\n padding: \"12px 16px\",\n ...footerStyle,\n }}\n >\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n\nDrawer.displayName = \"Drawer\";\n\nexport default Drawer;\n","import React, { useEffect, useRef, useState } from 'react';\n\nconst curve = {\n name: 'Thinking Five',\n tag: 'Custom Rose Trail',\n rotate: true,\n particleCount: 62,\n trailSpan: 0.38,\n durationMs: 3900,\n rotationDurationMs: 28000,\n pulseDurationMs: 3000,\n strokeWidth: 5.5,\n baseRadius: 7,\n detailAmplitude: 3,\n petalCount: 5,\n curveScale: 3,\n} as const;\n\ntype CurveConfig = typeof curve;\n\nfunction point(\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number } {\n const t = progress * Math.PI * 2;\n const petals = Math.round(config.petalCount);\n const x =\n config.baseRadius * Math.cos(t) -\n config.detailAmplitude * detailScaleValue * Math.cos(petals * t);\n const y =\n config.baseRadius * Math.sin(t) -\n config.detailAmplitude * detailScaleValue * Math.sin(petals * t);\n return {\n x: 50 + x * config.curveScale,\n y: 50 + y * config.curveScale,\n };\n}\n\nfunction getDetailScale(elapsedMs: number, config: CurveConfig): number {\n const pulseProgress =\n (elapsedMs % config.pulseDurationMs) / config.pulseDurationMs;\n const pulseAngle = pulseProgress * Math.PI * 2;\n return 0.52 + ((Math.sin(pulseAngle + 0.55) + 1) / 2) * 0.48;\n}\n\nfunction normalizeProgress(progress: number): number {\n return ((progress % 1) + 1) % 1;\n}\n\nfunction buildPath(detailScaleValue: number, config: CurveConfig, steps = 480): string {\n const parts: string[] = [];\n for (let index = 0; index <= steps; index += 1) {\n const p = point(index / steps, detailScaleValue, config);\n parts.push(`${index === 0 ? 'M' : 'L'} ${p.x.toFixed(2)} ${p.y.toFixed(2)}`);\n }\n return parts.join(' ');\n}\n\nfunction getParticle(\n index: number,\n progress: number,\n detailScaleValue: number,\n config: CurveConfig\n): { x: number; y: number; radius: number; opacity: number } {\n const denom = Math.max(1, config.particleCount - 1);\n const tailOffset = index / denom;\n const p = point(\n normalizeProgress(progress - tailOffset * config.trailSpan),\n detailScaleValue,\n config\n );\n const fade = Math.pow(1 - tailOffset, 0.56);\n return {\n x: p.x,\n y: p.y,\n radius: 0.9 + fade * 2.7,\n opacity: 0.04 + fade * 0.96,\n };\n}\n\nfunction getRotationDeg(elapsedMs: number, config: CurveConfig): number {\n if (!config.rotate) return 0;\n return -(\n ((elapsedMs % config.rotationDurationMs) / config.rotationDurationMs) *\n 360\n );\n}\n\nexport interface LoadingProps {\n width?: number | string;\n height?: number | string;\n strokeWidth?: number;\n color?: string;\n className?: string;\n}\n\nconst Loading: React.FC<LoadingProps> = ({\n width = 80,\n height = 80,\n strokeWidth: strokeWidthProp,\n color = '#5A31F0',\n className,\n}) => {\n const [frame, setFrame] = useState(0);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n let id: number;\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n setFrame(now - startRef.current);\n id = requestAnimationFrame(tick);\n };\n id = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(id);\n }, []);\n\n const elapsed = frame;\n const s = getDetailScale(elapsed, curve);\n const progress = (elapsed % curve.durationMs) / curve.durationMs;\n const rotationDeg = getRotationDeg(elapsed, curve);\n const lineWeight = strokeWidthProp ?? curve.strokeWidth;\n const strokeScale = lineWeight / curve.strokeWidth;\n\n const pathD = buildPath(s, curve);\n\n const particles: { cx: number; cy: number; opacity: number; r: number }[] =\n [];\n for (let i = 0; i < curve.particleCount; i += 1) {\n const pt = getParticle(i, progress, s, curve);\n particles.push({\n cx: pt.x,\n cy: pt.y,\n opacity: pt.opacity,\n r: pt.radius * strokeScale,\n });\n }\n\n return (\n <div\n className={className}\n style={{\n width,\n height,\n display: 'inline-block',\n color,\n }}\n role=\"status\"\n aria-label=\"Loading\"\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 100 100\"\n fill=\"none\"\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ overflow: 'visible' }}\n >\n <title>Thinking Five</title>\n <g transform={curve.rotate ? `rotate(${rotationDeg} 50 50)` : undefined}>\n <path\n d={pathD}\n stroke=\"currentColor\"\n strokeWidth={lineWeight}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n opacity={0.1}\n />\n {particles.map((pt, i) => (\n <circle\n key={i}\n cx={pt.cx}\n cy={pt.cy}\n r={pt.r}\n fill=\"currentColor\"\n opacity={pt.opacity}\n />\n ))}\n </g>\n </svg>\n </div>\n );\n};\n\nexport default Loading;\n","import {\n colorBlue,\n colorBlueLight,\n colorBrandScale,\n colorErrorScale,\n colorGray,\n colorGrayBlue,\n colorIndigo,\n colorOrange,\n colorPink,\n colorPurple,\n colorSuccessScale,\n colorWarningScale,\n semanticBg,\n semanticBorder,\n semanticText,\n} from '../../tokens';\n\nexport interface BadgeColorTokens {\n bg: string;\n text: string;\n ring: string;\n dot: string;\n btnText: string;\n btnHoverBg: string;\n btnHoverText: string;\n}\n\ntype ColorScale = {\n 50: string;\n 100: string;\n 200: string;\n 400: string;\n 500: string;\n 700: string;\n};\n\nfunction fromScale(scale: ColorScale): BadgeColorTokens {\n return {\n bg: scale[50],\n text: scale[700],\n ring: scale[200],\n dot: scale[500],\n btnText: scale[400],\n btnHoverBg: scale[100],\n btnHoverText: scale[500],\n };\n}\n\nexport const badgeColorTokens = {\n gray: fromScale(colorGray),\n brand: fromScale(colorBrandScale),\n error: fromScale(colorErrorScale),\n warning: fromScale(colorWarningScale),\n success: fromScale(colorSuccessScale),\n grayBlue: fromScale(colorGrayBlue),\n blueLight: fromScale(colorBlueLight),\n blue: fromScale(colorBlue),\n indigo: fromScale(colorIndigo),\n purple: fromScale(colorPurple),\n pink: fromScale(colorPink),\n orange: fromScale(colorOrange),\n} as const;\n\nexport type BadgeColorKey = keyof typeof badgeColorTokens;\n\nexport function getBadgeColorTokens(\n variant: 'pill' | 'badge' | 'modern',\n color: BadgeColorKey,\n): BadgeColorTokens {\n if (variant === 'modern') {\n return {\n ...badgeColorTokens[color],\n bg: semanticBg.primary,\n text: semanticText.secondary,\n ring: semanticBorder.secondary,\n };\n }\n return badgeColorTokens[color];\n}\n","import React, { useState } from 'react';\nimport type { MouseEventHandler, ReactNode } from 'react';\nimport { badgeColorTokens, getBadgeColorTokens, type BadgeColorKey } from '../shared/badgeColors';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type BadgeColor = BadgeColorKey;\n\nexport type BadgeVariant = 'pill' | 'badge' | 'modern';\n\nexport type BadgeSize = 'sm' | 'md' | 'lg';\n\nexport type BadgeIconComponent = React.FC<{\n style?: React.CSSProperties;\n className?: string;\n}>;\n\n// ─── Size Configs ─────────────────────────────────────────────────────────────\n\nconst pillPadding: Record<BadgeSize, string> = {\n sm: '2px 8px',\n md: '2px 10px',\n lg: '4px 12px',\n};\nconst badgePadding: Record<BadgeSize, string> = {\n sm: '2px 6px',\n md: '2px 8px',\n lg: '4px 10px',\n};\nconst fontSize: Record<BadgeSize, string> = {\n sm: '12px',\n md: '14px',\n lg: '14px',\n};\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getTokens(variant: BadgeVariant, color: BadgeColor) {\n return getBadgeColorTokens(variant, color);\n}\n\nfunction getRootStyle(\n variant: BadgeVariant,\n color: BadgeColor,\n size: BadgeSize,\n extra?: React.CSSProperties,\n): React.CSSProperties {\n const t = getTokens(variant, color);\n const isPill = variant === 'pill';\n const isLg = size === 'lg' && !isPill;\n const ring = `inset 0 0 0 1px ${t.ring}`;\n const shadow =\n variant === 'modern'\n ? `${ring}, 0px 1px 2px 0px rgba(10, 13, 18, 0.05)`\n : ring;\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n whiteSpace: 'nowrap',\n width: 'max-content',\n borderRadius: isPill ? '9999px' : isLg ? '8px' : '6px',\n backgroundColor: t.bg,\n color: t.text,\n boxShadow: shadow,\n fontFamily: 'DM Sans, system-ui, sans-serif',\n fontWeight: 500,\n fontSize: fontSize[size],\n lineHeight: size === 'sm' ? '18px' : '20px',\n padding: isPill ? pillPadding[size] : badgePadding[size],\n ...extra,\n };\n}\n\n// ─── Dot ──────────────────────────────────────────────────────────────────────\n\nconst BadgeDot: React.FC<{ color: string }> = ({ color }) => (\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 8 8\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill={color} />\n </svg>\n);\n\n// ─── X Icon ───────────────────────────────────────────────────────────────────\n\nconst XIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n style={style}\n >\n <path d=\"M9 3L3 9M3 3l6 6\" />\n </svg>\n);\n\n// ─── Badge ────────────────────────────────────────────────────────────────────\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => (\n <span\n style={{ ...getRootStyle(variant, color, size), ...style }}\n className={className}\n >\n {children}\n </span>\n);\n\n// ─── BadgeWithDot ─────────────────────────────────────────────────────────────\n\nexport interface BadgeWithDotProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithDot: React.FC<BadgeWithDotProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const dotColor = variant === 'modern' ? badgeColorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const isPill = variant === 'pill';\n const dotPaddingLeft: Record<BadgeSize, string> = { sm: isPill ? '6px' : '6px', md: isPill ? '8px' : '8px', lg: isPill ? '10px' : '10px' };\n const dotPaddingRight: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: dotPaddingLeft[size],\n paddingRight: dotPaddingRight[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <BadgeDot color={dotColor} />\n {children}\n </span>\n );\n};\n\n// ─── BadgeWithIcon ────────────────────────────────────────────────────────────\n\nexport interface BadgeWithIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n iconLeading?: BadgeIconComponent;\n iconTrailing?: BadgeIconComponent;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithIcon: React.FC<BadgeWithIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n iconLeading: IconLeading,\n iconTrailing: IconTrailing,\n children,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? badgeColorTokens[color].dot : t.dot;\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '4px', lg: '4px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n const isPill = variant === 'pill';\n const hasLeading = !!IconLeading;\n\n const smPad = { pl: isPill ? (hasLeading ? '6px' : '8px') : (hasLeading ? '6px' : '8px'), pr: isPill ? (hasLeading ? '8px' : '6px') : (hasLeading ? '8px' : '6px') };\n const mdPad = { pl: isPill ? (hasLeading ? '8px' : '10px') : (hasLeading ? '8px' : '8px'), pr: isPill ? (hasLeading ? '10px' : '8px') : (hasLeading ? '8px' : '8px') };\n const lgPad = { pl: isPill ? (hasLeading ? '10px' : '12px') : (hasLeading ? '10px' : '10px'), pr: isPill ? (hasLeading ? '12px' : '10px') : (hasLeading ? '10px' : '10px') };\n const padMap: Record<BadgeSize, { pl: string; pr: string }> = { sm: smPad, md: mdPad, lg: lgPad };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: padMap[size].pl,\n paddingRight: padMap[size].pr,\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {IconLeading && (\n <IconLeading style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n {children}\n {IconTrailing && (\n <IconTrailing style={{ width: iconSize[size], height: iconSize[size], color: iconColor, flexShrink: 0 }} />\n )}\n </span>\n );\n};\n\n// ─── BadgeWithButton ──────────────────────────────────────────────────────────\n\nexport interface BadgeWithButtonProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon?: BadgeIconComponent;\n children: ReactNode;\n buttonLabel?: string;\n onButtonClick?: MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithButton: React.FC<BadgeWithButtonProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n buttonLabel,\n onButtonClick,\n children,\n style,\n className,\n}) => {\n const [hovered, setHovered] = useState(false);\n const t = getTokens(variant, color);\n const gapMap: Record<BadgeSize, string> = { sm: '2px', md: '2px', lg: '2px' };\n const isPill = variant === 'pill';\n const plMap: Record<BadgeSize, string> = { sm: isPill ? '8px' : '6px', md: isPill ? '10px' : '8px', lg: isPill ? '12px' : '10px' };\n const prMap: Record<BadgeSize, string> = { sm: isPill ? '3px' : '3px', md: isPill ? '4px' : '4px', lg: isPill ? '6px' : '6px' };\n const btnBorderRadius = isPill ? '9999px' : '3px';\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n {children}\n <button\n type=\"button\"\n aria-label={buttonLabel}\n onClick={onButtonClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2px',\n border: 'none',\n cursor: 'pointer',\n borderRadius: btnBorderRadius,\n backgroundColor: hovered ? t.btnHoverBg : 'transparent',\n color: hovered ? t.btnHoverText : t.btnText,\n transition: 'background-color 100ms linear, color 100ms linear',\n outline: 'none',\n flexShrink: 0,\n }}\n >\n {Icon ? (\n <Icon style={{ width: '12px', height: '12px' }} />\n ) : (\n <XIcon />\n )}\n </button>\n </span>\n );\n};\n\n// ─── BadgeIcon ────────────────────────────────────────────────────────────────\n\nexport interface BadgeIconProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n color?: BadgeColor;\n icon: BadgeIconComponent;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeIcon: React.FC<BadgeIconProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n icon: Icon,\n style,\n className,\n}) => {\n const t = getTokens(variant, color);\n const iconColor = variant === 'modern' ? badgeColorTokens[color].dot : t.dot;\n const padMap: Record<BadgeSize, string> = { sm: '5px', md: '6px', lg: '8px' };\n const iconSize: Record<BadgeSize, string> = { sm: '12px', md: '12px', lg: '14px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n padding: padMap[size],\n ...style,\n }}\n className={className}\n >\n <Icon style={{ width: iconSize[size], height: iconSize[size], color: iconColor }} />\n </span>\n );\n};\n\n// ─── BadgeWithImage ───────────────────────────────────────────────────────────\n\nexport interface BadgeWithImageProps {\n variant?: Exclude<BadgeVariant, 'modern'>;\n size?: BadgeSize;\n color?: BadgeColor;\n imgSrc: string;\n imgAlt?: string;\n children: ReactNode;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const BadgeWithImage: React.FC<BadgeWithImageProps> = ({\n variant = 'pill',\n size = 'md',\n color = 'gray',\n imgSrc,\n imgAlt = 'avatar',\n children,\n style,\n className,\n}) => {\n const isPill = variant === 'pill';\n const gapMap: Record<BadgeSize, string> = { sm: '4px', md: '6px', lg: '6px' };\n const plMap: Record<BadgeSize, string> = {\n sm: isPill ? '3px' : '4px',\n md: isPill ? '4px' : '6px',\n lg: isPill ? '6px' : '8px',\n };\n const prMap: Record<BadgeSize, string> = {\n sm: isPill ? '8px' : '6px',\n md: isPill ? '10px' : '8px',\n lg: isPill ? '12px' : '10px',\n };\n const imgSize: Record<BadgeSize, string> = { sm: '16px', md: '16px', lg: '18px' };\n\n return (\n <span\n style={{\n ...getRootStyle(variant, color, size),\n gap: gapMap[size],\n paddingLeft: plMap[size],\n paddingRight: prMap[size],\n paddingTop: size === 'lg' ? '4px' : '2px',\n paddingBottom: size === 'lg' ? '4px' : '2px',\n ...style,\n }}\n className={className}\n >\n <img\n src={imgSrc}\n alt={imgAlt}\n style={{\n width: imgSize[size],\n height: imgSize[size],\n borderRadius: '9999px',\n objectFit: 'cover',\n flexShrink: 0,\n }}\n />\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import React, { type FC, useState } from 'react';\nimport {\n colorBlue,\n semanticBg,\n semanticBorder,\n semanticFg,\n semanticText,\n spacing,\n typography,\n} from '../../tokens';\n\n// ─── Types ─────────────────────────────────────────────────────────────────────\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport interface AvatarProps {\n size?: AvatarSize;\n src?: string | null;\n alt?: string;\n /** Two-letter initials displayed when no image is provided */\n initials?: string;\n /** Custom icon component displayed as placeholder */\n placeholderIcon?: FC<{ style?: React.CSSProperties }>;\n /** Online/offline status indicator dot */\n status?: 'online' | 'offline';\n /** Company logo badge displayed bottom-right */\n companyIcon?: { src: string; alt?: string };\n /** Blue verified checkmark badge */\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport interface AvatarLabelGroupProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n name: string;\n supportingText?: string;\n avatarSrc?: string | null;\n avatarInitials?: string;\n status?: 'online' | 'offline';\n companyIcon?: { src: string; alt?: string };\n verified?: boolean;\n style?: React.CSSProperties;\n className?: string;\n}\n\n// ─── Size Config ────────────────────────────────────────────────────────────────\n\ninterface SizeConfig {\n size: number;\n border: number;\n fontSize: string;\n lineHeight: string;\n iconSize: number;\n onlineIndicator: { size: number; offset: number };\n companyIcon: { size: number; offset: number; border: number };\n verifiedTick: { size: number; offset: number };\n}\n\nconst SIZE_CONFIG: Record<AvatarSize, SizeConfig> = {\n xs: {\n size: 24, border: 0.5, fontSize: typography.fontSize.xs, lineHeight: typography.lineHeight.xs, iconSize: 16,\n onlineIndicator: { size: 6, offset: -0.5 },\n companyIcon: { size: 10, offset: -2.5, border: 1.5 },\n verifiedTick: { size: 10, offset: -1.5 },\n },\n sm: {\n size: 32, border: 0.75, fontSize: typography.fontSize.sm, lineHeight: typography.lineHeight.sm, iconSize: 20,\n onlineIndicator: { size: 8, offset: -0.75 },\n companyIcon: { size: 12, offset: -2.75, border: 1.5 },\n verifiedTick: { size: 12, offset: -0.75 },\n },\n md: {\n size: 40, border: 1, fontSize: typography.fontSize.md, lineHeight: typography.lineHeight.md, iconSize: 24,\n onlineIndicator: { size: 10, offset: -1 },\n companyIcon: { size: 14, offset: -3, border: 1.5 },\n verifiedTick: { size: 14, offset: -1 },\n },\n lg: {\n size: 48, border: 1, fontSize: typography.fontSize.lg, lineHeight: typography.lineHeight.lg, iconSize: 28,\n onlineIndicator: { size: 12, offset: -1 },\n companyIcon: { size: 16, offset: -3, border: 1.5 },\n verifiedTick: { size: 16, offset: -1 },\n },\n xl: {\n size: 56, border: 1, fontSize: typography.fontSize.xl, lineHeight: typography.lineHeight.xl, iconSize: 32,\n onlineIndicator: { size: 14, offset: -1 },\n companyIcon: { size: 18, offset: -3, border: 1.5 },\n verifiedTick: { size: 18, offset: -1 },\n },\n '2xl': {\n size: 64, border: 1, fontSize: typography.fontSize.displayXs, lineHeight: typography.lineHeight.displayXs, iconSize: 32,\n onlineIndicator: { size: 16, offset: -1 },\n companyIcon: { size: 20, offset: -3, border: 1.667 },\n verifiedTick: { size: 20, offset: -1 },\n },\n};\n\n// ─── AvatarLabelGroup Size Config ───────────────────────────────────────────────\n\ninterface LabelGroupSizeConfig {\n gap: string;\n nameFontSize: string;\n nameLineHeight: string;\n subFontSize: string;\n subLineHeight: string;\n}\n\nconst LABEL_GROUP_SIZE_CONFIG: Record<'sm' | 'md' | 'lg' | 'xl', LabelGroupSizeConfig> = {\n sm: { gap: spacing.md, nameFontSize: typography.fontSize.sm, nameLineHeight: typography.lineHeight.sm, subFontSize: typography.fontSize.xs, subLineHeight: typography.lineHeight.xs },\n md: { gap: spacing.md, nameFontSize: typography.fontSize.sm, nameLineHeight: typography.lineHeight.sm, subFontSize: typography.fontSize.sm, subLineHeight: typography.lineHeight.sm },\n lg: { gap: spacing.lg, nameFontSize: typography.fontSize.md, nameLineHeight: typography.lineHeight.md, subFontSize: typography.fontSize.md, subLineHeight: typography.lineHeight.md },\n xl: { gap: spacing.xl, nameFontSize: typography.fontSize.lg, nameLineHeight: typography.lineHeight.lg, subFontSize: typography.fontSize.md, subLineHeight: typography.lineHeight.md },\n};\n\n// ─── Default User Icon ──────────────────────────────────────────────────────────\n\nconst UserIcon: FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={style}\n >\n <path\n d=\"M20 21C20 19.6044 20 18.9067 19.8278 18.3389C19.44 17.0605 18.4395 16.06 17.1611 15.6722C16.5933 15.5 15.8956 15.5 14.5 15.5H9.5C8.10444 15.5 7.40665 15.5 6.83886 15.6722C5.56045 16.06 4.56004 17.0605 4.17224 18.3389C4 18.9067 4 19.6044 4 21M16.5 7.5C16.5 9.98528 14.4853 12 12 12C9.51472 12 7.5 9.98528 7.5 7.5C7.5 5.01472 9.51472 3 12 3C14.4853 3 16.5 5.01472 16.5 7.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// ─── Verified Tick ─────────────────────────────────────────────────────────────\n\nconst VerifiedTickBadge: FC<{ size: number; offset: number }> = ({ size, offset }) => (\n <svg\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: size,\n height: size,\n flexShrink: 0,\n color: colorBlue[500],\n overflow: 'hidden',\n zIndex: 1,\n }}\n >\n <path\n d=\"M7.72237 1.77098C7.81734 2.00068 7.99965 2.18326 8.2292 2.27858L9.03413 2.61199C9.26384 2.70714 9.44635 2.88965 9.5415 3.11936C9.63665 3.34908 9.63665 3.60718 9.5415 3.83689L9.20833 4.64125C9.11313 4.87106 9.113 5.12943 9.20863 5.35913L9.54122 6.16325C9.58839 6.27702 9.61268 6.39897 9.6127 6.52214C9.61272 6.6453 9.58847 6.76726 9.54134 6.88105C9.4942 6.99484 9.42511 7.09823 9.33801 7.18531C9.2509 7.27238 9.14749 7.34144 9.03369 7.38854L8.22934 7.72171C7.99964 7.81669 7.81706 7.99899 7.72174 8.22855L7.38833 9.03348C7.29318 9.26319 7.11067 9.4457 6.88096 9.54085C6.65124 9.636 6.39314 9.636 6.16343 9.54085L5.35907 9.20767C5.12935 9.11276 4.87134 9.11295 4.64177 9.20821L3.83684 9.54115C3.60725 9.63608 3.34937 9.636 3.11984 9.54092C2.89032 9.44585 2.70791 9.26356 2.6127 9.03409L2.27918 8.22892C2.18421 7.99923 2.0019 7.81665 1.77235 7.72133L0.967421 7.38792C0.737807 7.29281 0.555355 7.11041 0.460169 6.88083C0.364983 6.65125 0.364854 6.39327 0.45981 6.16359L0.792984 5.35924C0.8879 5.12952 0.887707 4.87151 0.792445 4.64193L0.459749 3.83642C0.41258 3.72265 0.388291 3.60069 0.388272 3.47753C0.388252 3.35436 0.412501 3.2324 0.459634 3.11861C0.506767 3.00482 0.57586 2.90144 0.662965 2.81436C0.75007 2.72728 0.853479 2.65822 0.967283 2.61113L1.77164 2.27795C2.00113 2.18306 2.1836 2.00099 2.27899 1.7717L2.6124 0.966768C2.70755 0.737054 2.89006 0.554547 3.11978 0.459397C3.34949 0.364246 3.60759 0.364246 3.83731 0.459397L4.64166 0.792571C4.87138 0.887487 5.12939 0.887293 5.35897 0.792031L6.16424 0.459913C6.39392 0.364816 6.65197 0.364836 6.88164 0.459968C7.11131 0.555099 7.29379 0.737554 7.38895 0.967208L7.72247 1.77238L7.72237 1.77098Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.95829 3.68932C7.02509 3.58439 7.04747 3.45723 7.02051 3.3358C6.99356 3.21437 6.91946 3.10862 6.81454 3.04182C6.70961 2.97502 6.58245 2.95264 6.46102 2.97959C6.33959 3.00655 6.23384 3.08064 6.16704 3.18557L4.33141 6.06995L3.49141 5.01995C3.41375 4.92281 3.30069 4.8605 3.17709 4.84673C3.05349 4.83296 2.92949 4.86885 2.83235 4.94651C2.73522 5.02417 2.67291 5.13723 2.65914 5.26083C2.64536 5.38443 2.68125 5.50843 2.75891 5.60557L4.00891 7.16807C4.0555 7.22638 4.11533 7.27271 4.18344 7.30323C4.25154 7.33375 4.32595 7.34757 4.40047 7.34353C4.47499 7.3395 4.54747 7.31773 4.61188 7.28004C4.67629 7.24234 4.73077 7.18981 4.77079 7.12682L6.95829 3.68932Z\"\n fill=\"white\"\n />\n </svg>\n);\n\n// ─── Avatar ─────────────────────────────────────────────────────────────────────\n\nconst Avatar: React.FC<AvatarProps> = ({\n size = 'md',\n src,\n alt,\n initials,\n placeholderIcon: PlaceholderIcon,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const [imgFailed, setImgFailed] = useState(false);\n const cfg = SIZE_CONFIG[size];\n const canShowImage = Boolean(src && !imgFailed);\n const isPlaceholder = !canShowImage;\n const hasBadge = Boolean(status || companyIcon || verified);\n\n const renderContent = () => {\n if (canShowImage) {\n return (\n <img\n src={src!}\n alt={alt}\n onError={() => setImgFailed(true)}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (initials) {\n return (\n <span\n style={{\n fontSize: cfg.fontSize,\n lineHeight: cfg.lineHeight,\n fontWeight: 600,\n color: semanticText.quaternary,\n fontFamily: typography.fontFamily.body,\n userSelect: 'none',\n }}\n >\n {initials}\n </span>\n );\n }\n if (PlaceholderIcon) {\n return (\n <PlaceholderIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: semanticFg.quaternary,\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <UserIcon\n style={{\n width: cfg.iconSize,\n height: cfg.iconSize,\n color: semanticFg.quaternary,\n flexShrink: 0,\n }}\n />\n );\n };\n\n const renderBadge = () => {\n if (status === 'online' || status === 'offline') {\n const { size: iSize, offset } = cfg.onlineIndicator;\n return (\n <span\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: iSize,\n height: iSize,\n borderRadius: '50%',\n backgroundColor:\n status === 'online'\n ? semanticFg.successSecondary\n : semanticFg.quaternary,\n border: `1.5px solid ${semanticBg.primary}`,\n flexShrink: 0,\n }}\n />\n );\n }\n if (companyIcon) {\n const { size: cSize, offset, border } = cfg.companyIcon;\n return (\n <img\n src={companyIcon.src}\n alt={companyIcon.alt}\n style={{\n position: 'absolute',\n bottom: offset,\n right: offset,\n width: cSize,\n height: cSize,\n borderRadius: '50%',\n border: `${border}px solid ${semanticBg.primary}`,\n objectFit: 'cover',\n pointerEvents: 'none',\n }}\n />\n );\n }\n if (verified) {\n return (\n <VerifiedTickBadge\n size={cfg.verifiedTick.size}\n offset={cfg.verifiedTick.offset}\n />\n );\n }\n return null;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: cfg.size,\n height: cfg.size,\n borderRadius: '50%',\n border: `${cfg.border}px solid ${isPlaceholder ? semanticBorder.secondary : 'rgba(0, 0, 0, 0.08)'}`,\n backgroundColor: isPlaceholder ? semanticBg.tertiary : undefined,\n overflow: hasBadge ? undefined : 'hidden',\n flexShrink: 0,\n ...style,\n }}\n >\n {renderContent()}\n {renderBadge()}\n </div>\n );\n};\n\n// ─── AvatarLabelGroup ────────────────────────────────────────────────────────────\n\nexport const AvatarLabelGroup: React.FC<AvatarLabelGroupProps> = ({\n size = 'sm',\n name,\n supportingText,\n avatarSrc,\n avatarInitials,\n status,\n companyIcon,\n verified,\n style,\n className,\n}) => {\n const cfg = LABEL_GROUP_SIZE_CONFIG[size];\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: cfg.gap,\n position: 'relative',\n ...style,\n }}\n >\n <Avatar\n size={size}\n src={avatarSrc}\n initials={avatarInitials}\n status={status}\n companyIcon={companyIcon}\n verified={verified}\n />\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }}\n >\n <span\n style={{\n fontSize: cfg.nameFontSize,\n lineHeight: cfg.nameLineHeight,\n fontWeight: 600,\n color: semanticText.primary,\n fontFamily: typography.fontFamily.body,\n }}\n >\n {name}\n </span>\n {supportingText && (\n <span\n style={{\n fontSize: cfg.subFontSize,\n lineHeight: cfg.subLineHeight,\n fontWeight: 400,\n color: semanticText.tertiary,\n fontFamily: typography.fontFamily.body,\n }}\n >\n {supportingText}\n </span>\n )}\n </div>\n </div>\n );\n};\n\nexport default Avatar;\n"],"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","colorBrandScale","colorErrorScale","colorBlue","semanticText","semanticBorder","semanticBg","semanticFg","typography","display","base","xs","sm","md","lg","xl","displayXs","displaySm","displayMd","displayLg","displayXl","display2xl","regular","medium","semibold","bold","spacing","radius","shadow","focusRing","default","shadowXs","shadowXsSkeuomorphic","shadowSm","error","errorShadowXs","errorShadowXsSkeuomorphic","DEFAULT_BRAND_COLOR","isDefaultBrandColor","color","toLowerCase","resolveBrandColor","BRAND_HOVER_COLOR","DEFAULT_BRAND_ICON","buttonFontFamily","buttonRadiusMd","SIZE_ALIAS","small","mediumSmall","large","HIERARCHY_ALIAS","primary","secondary","tertiary","SIZE_TOKENS","height","paddingX","paddingXLg","fontSize","lineHeight","iconSize","gap","iconOnlyPad","LoadingSpinner","size","_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","options","interactive","brand","brandColor","brandHover","brandText","brandTextHover","bg","iconColor","border","boxShadow","textDecoration","getButtonVisuals","focusShadow","getButtonFocusShadow","buttonStyle","position","alignItems","justifyContent","fontFamily","fontWeight","cursor","outline","transition","userSelect","WebkitTapHighlightColor","whiteSpace","backgroundColor","borderRadius","overflow","padding","paddingLeft","paddingRight","renderIcon","showLeftIcon","showRightIcon","filter","Boolean","join","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","warning","info","CloseIcon","Alert","title","description","showIcon","closeable","action","onClose","visible","setVisible","handleClose","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","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","fieldFontFamily","fieldFontSizeMd","fieldFontSizeSm","fieldFontSizeXs","fieldLineHeightMd","fieldLineHeightSm","fieldLineHeightXs","fieldRadiusMd","fieldShadowXs","fieldSpacingXs","fieldColors","textPrimary","textSecondary","textTertiary","textDisabled","textPlaceholder","borderPrimary","borderDisabled","borderBrand","borderError","borderErrorSubtle","bgPrimary","bgDisabledSubtle","fgDisabled","fgQuaternary","error600","getFieldFocusStyles","c","getFieldLabelStyle","getFieldHintStyle","margin","getPlaceholderCss","selector","extraRules","placeholderColor","sizeMap","pt","pb","InputGroup","forwardRef","ref","readOnly","prefix","suffix","leadingText","trailingText","leadingAddon","trailingAddon","onFocus","onBlur","onPressEnter","defaultValue","onChange","placeholder","required","hintText","restProps","inputRef","useRef","setFocused","internalValue","setInternalValue","current","isControlled","currentValue","focusStyles","dividerColor","hasPrefixIcon","hasSuffixIcon","iconSlotStyle","addonTextStyle","groupEl","borderRight","target","autoComplete","borderLeft","containerPadding","tagSizeMap","InputTags","internalTags","setInternalTags","inputValue","setInputValue","tags","updateTags","addTag","tag","trimmed","trim","includes","removeTag","index","tagSize","tagsEl","focus","flexWrap","sizeStyles","ClearIcon","Input","allowClear","onClear","showClear","baseStyles","WebkitAppearance","MozAppearance","appearance","placeholderStyles","inputEl","autoCorrect","autoCapitalize","spellCheck","Select","controlledValue","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","_m","dropdownClassName","dropdownStyle","_o","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","_q","_r","internalOpen","setInternalOpen","_s","searchValue","setSearchValue","_t","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","getFilteredOptions","String","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","estimatedDropdownHeight","offsetHeight","min","max","spaceBelow","innerHeight","spaceAbove","shouldOpenUp","top_1","scrollY","scrollX","placement","requestAnimationFrame","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","handleClear","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","Fragment","textOverflow","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","minHeight","val","maxHeight","transformOrigin","WebkitOverflowScrolling","overscrollBehavior","textAlign","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","start","end","pages","getPageNumbers","item","isActive","element","renderItem","Number","newPageSize","newTotalPages","newCurrent","goButton","controlFontFamily","controlFontWeightMedium","controlFontWeightRegular","getControlTypography","hintGap","getControlBoxStyles","active","hovered","getControlFocusShadow","showFocus","getControlLabelStyle","getControlHintStyle","getControlActiveIconColor","Checkbox","indeterminate","hint","isFocusedProp","setHovered","boxSize","getCheckboxBorderRadius","hasLabel","TableLoadingSpinner","strokeDasharray","strokeDashoffset","TableLoadingOverlay","spinColor","content","inset","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","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","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","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","TextareaTags","helpIcon","resize","DOMAIN_REGEX","URL_CANDIDATE_REGEX","DEFAULT_ALLOWED_TLDS","websiteValidator","url","needProtocol","needHost","allowedTlds","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","textareaEl","contentEditable","suppressContentEditableWarning","onInput","onPaste","pastedText","clipboardData","getData","currentText","nextText","anchorNode","endOffset","endContainer","nativeEvent","isComposing","offsets","startRange","endRange","getSelectionOffsets","nextCaret","onCompositionStart","onCompositionEnd","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","thumbSize","thumbOffset","thumbLeft","newChecked","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","padStart","day","getDate","dayNum","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","DatePicker","startPlaceholder","endPlaceholder","onOpenChange","separator","presetRanges","calendarCount","showApplyCancel","applyText","cancelText","onApply","onCancel","showSelectedRange","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","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","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","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","node","curve","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","preserveAspectRatio","fromScale","scale","ring","dot","btnText","btnHoverBg","btnHoverText","badgeColorTokens","gray","grayBlue","blueLight","blue","indigo","purple","pink","orange","pillPadding","badgePadding","getTokens","getBadgeColorTokens","getRootStyle","isPill","isLg","BadgeDot","XIcon","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","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]}
|