aha-components 1.3.1 → 1.3.3
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/Tooltip.esm.js +1 -1
- package/dist/Tooltip.esm.js.map +1 -1
- package/dist/Tooltip.js +1 -1
- package/dist/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/index.d.ts +2 -0
- package/dist/index.d.ts +2 -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/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/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/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/index.tsx","../src/components/Select/index.tsx","../src/components/Form/FormContext.tsx","../src/components/Form/index.tsx","../src/components/Form/FormItem.tsx","../src/components/MenuList/index.tsx","../src/components/Tooltip/index.tsx","../src/components/Alert/index.tsx","../src/components/Progress/index.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\n\nexport interface ThemeConfig {\n primaryColor?: string;\n}\n\nconst defaultTheme: ThemeConfig = {\n primaryColor: '#FB6011',\n};\n\nconst ThemeContext = createContext<ThemeConfig>(defaultTheme);\n\nexport interface ThemeProviderProps {\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const themeValue = useMemo(() => {\n return {\n ...defaultTheme,\n ...theme,\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={themeValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeConfig => {\n const context = useContext(ThemeContext);\n if (!context) {\n // 如果没有 Provider,返回默认主题\n return defaultTheme;\n }\n return context;\n};\n\n// 导出默认主题色,供组件内部使用\nexport const getDefaultPrimaryColor = () => defaultTheme.primaryColor!;\n\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ButtonType = 'default' | 'primary';\nexport type ButtonSize = 'small' | 'mediumSmall' | 'medium' | 'large';\n\nexport interface ButtonProps {\n /** 按钮内容 */\n children?: React.ReactNode;\n /** 按钮类型 */\n type?: ButtonType;\n /** 按钮尺寸 */\n size?: ButtonSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否加载中 */\n loading?: boolean;\n /** 点击事件 */\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** 按钮原生type */\n htmlType?: 'button' | 'submit' | 'reset';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 图标 */\n icon?: React.ReactNode;\n /** 图标位置 */\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\n// 尺寸配置:高度分别为 32、36、40、48px\nconst SIZE_CONFIG = {\n small: {\n height: '32px',\n paddingLeft: '12px',\n paddingRight: '12px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n mediumSmall: {\n height: '36px',\n paddingLeft: '14px',\n paddingRight: '14px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n medium: {\n height: '40px',\n paddingLeft: '16px',\n paddingRight: '16px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '18px',\n gap: '8px',\n },\n large: {\n height: '48px',\n paddingLeft: '20px',\n paddingRight: '20px',\n fontSize: '16px',\n lineHeight: '24px',\n iconSize: '20px',\n gap: '8px',\n },\n};\n\n// Loading 图标组件\nconst LoadingIcon: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n // 使用 React 方式注入样式,避免在模块顶层操作 DOM\n const loadingStyles = `\n @keyframes aha-button-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n\n return (\n <>\n <style>{loadingStyles}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'aha-button-spin 1s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n );\n};\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'default',\n size = 'medium',\n disabled = false,\n loading = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const sizeConfig = SIZE_CONFIG[size];\n const isDisabled = disabled || loading;\n\n // 计算按钮样式\n const getButtonStyles = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingLeft: sizeConfig.paddingLeft,\n paddingRight: sizeConfig.paddingRight,\n fontSize: sizeConfig.fontSize,\n lineHeight: sizeConfig.lineHeight,\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n borderRadius: '8px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'all 0.2s',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n ...style,\n };\n\n if (type === 'primary') {\n // Primary 按钮:使用主题色,所有状态下文字都是白色\n baseStyle.color = '#FFFFFF';\n baseStyle.backgroundColor = primaryColor;\n if (disabled) {\n // disabled状态:保持primary样式,通过降低透明度表示禁用\n baseStyle.opacity = 0.4;\n baseStyle.cursor = 'not-allowed';\n } else if (loading) {\n // loading状态:保持primary样式(主题色背景)\n baseStyle.backgroundColor = primaryColor;\n } else if (isPressed) {\n baseStyle.backgroundColor = '#EC470A'; // 按下时的深色\n } else if (isHovered) {\n baseStyle.backgroundColor = '#FD843A'; // hover时的浅色\n }\n } else {\n // Default 按钮:白色背景,灰色边框\n if (disabled) {\n // disabled状态:灰色背景,灰色文字\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#D6D3D1';\n baseStyle.border = '1px solid #E7E5E4';\n } else if (loading) {\n // loading状态:保持default样式(白色背景+边框)\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isPressed) {\n baseStyle.backgroundColor = '#F5F5F4';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isHovered) {\n // Hover 状态:浅灰色背景,边框稍微变深,增强阴影\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 2px 4px 0px rgba(12, 10, 9, 0.08)';\n } else {\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n }\n }\n\n return baseStyle;\n };\n\n // 处理点击事件\n const handleClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // 渲染图标\n const renderIcon = () => {\n if (loading) {\n // loading时,根据按钮类型确定颜色\n // primary按钮:白色图标;default按钮:黑色图标\n const iconColor = type === 'primary' ? '#FFFFFF' : '#101828';\n const iconSize = parseInt(sizeConfig.iconSize.replace('px', ''));\n return <LoadingIcon size={iconSize} color={iconColor} />;\n }\n if (icon) {\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: sizeConfig.iconSize,\n height: sizeConfig.iconSize,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n }\n return null;\n };\n\n const buttonStyle = getButtonStyles();\n\n return (\n <button\n type={htmlType}\n className={`aha-button aha-button--${type} aha-button--${size} ${isDisabled ? 'aha-button--disabled' : ''} ${loading ? 'aha-button--loading' : ''} ${className}`}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => !isDisabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n style={buttonStyle}\n {...rest}\n >\n {/* loading时,图标总是在左侧显示,忽略iconPosition */}\n {loading && renderIcon()}\n {!loading && iconPosition === 'left' && renderIcon()}\n {children && <span style={{ display: 'inline-block' }}>{children}</span>}\n {!loading && iconPosition === 'right' && renderIcon()}\n </button>\n );\n};\n\nButton.displayName = 'Button';\n\nexport default Button;\n","export const AlertIcon = {\n success: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 1.66663C5.40002 1.66663 1.66669 5.39996 1.66669 9.99996C1.66669 14.6 5.40002 18.3333 10 18.3333C14.6 18.3333 18.3334 14.6 18.3334 9.99996C18.3334 5.39996 14.6 1.66663 10 1.66663ZM13.3584 8.49997L9.46668 12.3833C9.35001 12.5083 9.19168 12.5666 9.02501 12.5666C8.86668 12.5666 8.70834 12.5083 8.58334 12.3833L6.64169 10.4417C6.40002 10.2 6.40002 9.79994 6.64169 9.55827C6.88336 9.3166 7.28335 9.3166 7.52502 9.55827L9.02501 11.0583L12.475 7.61664C12.7167 7.36664 13.1167 7.36664 13.3584 7.61664C13.6 7.8583 13.6 8.24997 13.3584 8.49997Z\"\n fill=\"#00BC7D\"\n />\n </svg>\n ),\n error: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17.1342 6.3009L13.6999 2.86666C13.4658 2.63249 13.1474 2.50085 12.8157 2.50085H7.18504C6.85337 2.50085 6.53584 2.63249 6.30084 2.86666L2.8666 6.3009C2.63243 6.53507 2.50079 6.85343 2.50079 7.1851V12.8158C2.50079 13.1475 2.63243 13.465 2.8666 13.7L6.30084 17.1342C6.53501 17.3684 6.85337 17.5 7.18504 17.5H12.8157C13.1474 17.5 13.4649 17.3684 13.6999 17.1342L17.1342 13.7C17.3683 13.4658 17.5 13.1475 17.5 12.8158V7.1851C17.5 6.85343 17.3683 6.53507 17.1342 6.3009ZM12.525 11.6417C12.7692 11.8858 12.7692 12.2817 12.525 12.5259C12.4033 12.6475 12.2433 12.7092 12.0833 12.7092C11.9233 12.7092 11.7633 12.6484 11.6416 12.5259L9.99998 10.8842L8.35834 12.5259C8.23667 12.6475 8.07665 12.7092 7.91665 12.7092C7.75665 12.7092 7.59662 12.6484 7.47496 12.5259C7.23079 12.2817 7.23079 11.8858 7.47496 11.6417L9.1166 10L7.47496 8.3584C7.23079 8.11423 7.23079 7.71837 7.47496 7.4742C7.71912 7.23004 8.11498 7.23004 8.35915 7.4742L10.0008 9.11585L11.6424 7.4742C11.8866 7.23004 12.2825 7.23004 12.5266 7.4742C12.7708 7.71837 12.7708 8.11423 12.5266 8.3584L10.885 10L12.525 11.6417Z\"\n fill=\"#FB2C36\"\n />\n </svg>\n ),\n warning: (\n <svg \n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.0057 14.2935L12.4999 3.99662C11.4333 2.00162 8.56744 2.00162 7.49995 3.99662L1.99417 14.2935C1.01583 16.1235 2.3442 18.3334 4.42337 18.3334H15.5765C17.6549 18.3334 18.9841 16.1226 18.0057 14.2935ZM9.37495 8.33337C9.37495 7.98837 9.65494 7.70837 9.99994 7.70837C10.3449 7.70837 10.6249 7.98837 10.6249 8.33337V11.6667C10.6249 12.0117 10.3449 12.2917 9.99994 12.2917C9.65494 12.2917 9.37495 12.0117 9.37495 11.6667V8.33337ZM10.0166 15C9.55663 15 9.17902 14.6267 9.17902 14.1667C9.17902 13.7067 9.54829 13.3334 10.0083 13.3334H10.0166C10.4775 13.3334 10.85 13.7067 10.85 14.1667C10.85 14.6267 10.4766 15 10.0166 15Z\"\n fill=\"#FE9A00\"\n />\n </svg>\n ),\n info: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6875 2.5H5.3125C3.4375 2.5 2.5 3.4375 2.5 5.3125V14.6875C2.5 16.5625 3.4375 17.5 5.3125 17.5H14.6875C16.5625 17.5 17.5 16.5625 17.5 14.6875V5.3125C17.5 3.4375 16.5625 2.5 14.6875 2.5ZM10.625 13.75C10.625 14.095 10.345 14.375 10 14.375C9.655 14.375 9.375 14.095 9.375 13.75V9.9408C9.375 9.5958 9.655 9.3158 10 9.3158C10.345 9.3158 10.625 9.5958 10.625 9.9408V13.75ZM10.0167 7.91667C9.55668 7.91667 9.17908 7.54333 9.17908 7.08333C9.17908 6.62333 9.54834 6.25 10.0083 6.25H10.0167C10.4775 6.25 10.85 6.62333 10.85 7.08333C10.85 7.54333 10.4767 7.91667 10.0167 7.91667Z\"\n fill=\"#2B7FFF\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"#57534D\"\n />\n </svg>\n);\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TagColor = 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet' | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\nexport type TagVariant = 'light' | 'fill';\nexport type TagSize = 'large' | 'small';\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color: TagColor; // 必需属性,支持预定义颜色或自定义十六进制颜色\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean; // 仅对 light 变体有效\n icon?: React.ReactElement; // 只允许 React 元素,不接受字符串\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// 颜色配置\nconst COLOR_CONFIG = {\n Green: {\n light: {\n bg: '#ECFDF5',\n text: '#006045',\n border: '#A4F4CF',\n },\n fill: {\n bg: '#00BC7D',\n text: '#FFFFFF',\n }\n },\n Red: {\n light: {\n bg: '#FEF2F2',\n text: '#9F0712',\n border: '#FFC9C9',\n },\n fill: {\n bg: '#FB2C36',\n text: '#FFFFFF',\n }\n },\n Orange: {\n light: {\n bg: '#FFF6ED',\n text: '#9B2911',\n border: '#FFD1A9',\n },\n fill: {\n bg: '#FB6011',\n text: '#FFFFFF',\n }\n },\n Cyan: {\n light: {\n bg: '#ECFEFF',\n text: '#005F78',\n border: '#A2F4FD',\n },\n fill: {\n bg: '#00B8DB',\n text: '#FFFFFF',\n }\n },\n Violet: {\n light: {\n bg: '#F5F3FF',\n text: '#5D0EC0',\n border: '#DDD6FF',\n },\n fill: {\n bg: '#8E51FF',\n text: '#FFFFFF',\n }\n },\n Pink: {\n light: {\n bg: '#FDF2F8',\n text: '#A3004C',\n border: '#FCCEE8',\n },\n fill: {\n bg: '#F6339A',\n text: '#FFFFFF',\n }\n },\n Gray: {\n light: {\n bg: '#F5F5F4',\n text: '#292524',\n border: '#E7E5E4',\n },\n fill: {\n bg: '#292524',\n text: '#FFFFFF',\n }\n },\n Yellow: {\n light: {\n bg: '#FFFBEB',\n text: '#973C00',\n border: '#FEE685',\n },\n fill: {\n bg: '#FE9A00',\n text: '#FFFFFF',\n }\n },\n Blue: {\n light: {\n bg: '#EFF6FF',\n text: '#193CB8',\n border: '#BEDBFF',\n },\n fill: {\n bg: '#2B7FFF',\n text: '#FFFFFF',\n }\n }\n};\n\n// 尺寸配置\nconst SIZE_CONFIG = {\n large: {\n padding: 'px-2 py-0.5',\n textSize: 'text-sm',\n iconSize: 'w-4 h-4',\n gap: 'gap-1',\n },\n small: {\n padding: 'px-2 py-0.5', // 与 large 相同的外层 padding\n textSize: 'text-xs',\n iconSize: 'w-3 h-3',\n gap: 'gap-0.5',\n }\n};\n\n// 获取颜色配置的函数\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的配置\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n // 如果是 Orange 颜色,使用主题色\n if (color === 'Orange' && primaryColor) {\n return {\n ...config,\n fill: {\n ...config.fill,\n bg: primaryColor,\n },\n };\n }\n return config;\n }\n \n // 如果是自定义颜色(十六进制),生成配置\n if (typeof color === 'string' && color.startsWith('#')) {\n // 将十六进制转换为 RGB 值\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n return {\n light: {\n bg: `rgba(${r}, ${g}, ${b}, 0.1)`, // 10% 透明度\n text: color,\n border: `rgba(${r}, ${g}, ${b}, 0.3)`, // 30% 透明度\n },\n fill: {\n bg: color,\n text: '#FFFFFF',\n }\n };\n }\n \n // 默认返回绿色配置\n return COLOR_CONFIG.Green;\n};\n\n// 获取图标颜色的函数\nconst getIconColor = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的图标颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#009966';\n case 'Red': return '#E7000B';\n case 'Orange': return primaryColor || '#E17100'; // 使用主题色\n case 'Blue': return '#155DFC';\n case 'Yellow': return '#EC470A';\n case 'Cyan': return '#0092B8';\n case 'Violet': return '#7F22FE';\n case 'Pink': return '#E60076';\n case 'Gray': return '#57534D';\n default: return '#009966';\n }\n }\n \n // 如果是自定义颜色,返回原色\n if (typeof color === 'string' && color.startsWith('#')) {\n return color;\n }\n \n return '#009966';\n};\n\n// 获取边框颜色的函数\nconst getOutlineColor = (color: TagColor) => {\n // 如果是预定义颜色,返回对应的边框颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#A4F4CF';\n case 'Red': return '#FFC9C9';\n case 'Orange': return '#FFD1A9';\n case 'Blue': return '#BEDBFF';\n case 'Yellow': return '#FFD1A9';\n case 'Cyan': return '#A2F4FD';\n case 'Violet': return '#DDD6FF';\n case 'Pink': return '#FCCEE8';\n case 'Gray': return '#E7E5E4';\n default: return '#A4F4CF';\n }\n }\n \n // 如果是自定义颜色,返回带透明度的颜色\n if (typeof color === 'string' && color.startsWith('#')) {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n return `rgba(${r}, ${g}, ${b}, 0.3)`; // 30% 透明度\n }\n \n return '#A4F4CF';\n};\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'large',\n stroke = false,\n icon,\n iconPosition = 'none',\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const colorConfig = getColorConfig(color, primaryColor);\n const sizeConfig = SIZE_CONFIG[size];\n \n // 构建基础样式对象\n const baseStyle: React.CSSProperties = {\n borderRadius: '0.375rem', // rounded-md\n display: 'inline-flex',\n justifyContent: 'start',\n alignItems: 'center',\n padding: '2px 8px', // px-2 py-0.5 (所有尺寸都相同)\n gap: size === 'large' ? '4px' : '2px', // gap-1 or gap-0.5\n fontWeight: 500, // font-medium\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: size === 'large' ? '1.375' : '1', // leading-snug or leading-none\n transition: 'all 0.2s',\n fontSize: size === 'large' ? '14px' : '12px', // text-sm or text-xs\n height: size === 'small' ? '20px' : '24px', // Small 尺寸 20px,Large 尺寸 24px\n };\n\n // 根据变体和颜色添加样式\n if (variant === 'light') {\n baseStyle.backgroundColor = colorConfig.light.bg;\n baseStyle.color = colorConfig.light.text;\n if (stroke) {\n // 使用 outline 样式而不是 border\n baseStyle.outline = '1px solid';\n baseStyle.outlineOffset = '-1px';\n // 根据颜色设置 outline 颜色\n baseStyle.outlineColor = getOutlineColor(color);\n }\n }\n\n // 添加点击样式\n if (onClick) {\n baseStyle.cursor = 'pointer';\n baseStyle.opacity = '1';\n }\n\n // 构建类名\n const baseClasses = [\n 'rounded-md',\n 'inline-flex',\n 'justify-start',\n 'items-center',\n sizeConfig.padding,\n sizeConfig.gap,\n 'font-medium',\n 'font-dm-sans',\n size === 'large' ? 'leading-snug' : 'leading-none',\n 'transition-colors',\n 'duration-200',\n size === 'small' ? 'h-5' : 'h-6' // Small 尺寸 20px,Large 尺寸 24px\n ].filter(Boolean); // 过滤掉空字符串\n\n // 为 fill 变体添加样式\n if (variant === 'fill') {\n baseStyle.backgroundColor = colorConfig.fill.bg;\n baseStyle.color = colorConfig.fill.text;\n }\n\n if (onClick) {\n baseClasses.push('cursor-pointer', 'hover:opacity-80');\n }\n\n if (className) {\n baseClasses.push(className);\n }\n\n const containerClasses = baseClasses.join(' ');\n\n // 渲染图标\n const renderIcon = () => {\n if (!icon) return null;\n \n // 根据颜色设置图标颜色\n const iconColor = getIconColor(color, primaryColor);\n \n // 根据尺寸设置图标大小\n const iconSize = size === 'small' ? '14px' : '16px';\n \n return (\n <div className=\"flex items-center justify-center\" style={{ width: iconSize, height: iconSize }}>\n {icon.type === 'svg' ? (\n React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: iconSize,\n height: iconSize,\n style: { fill: iconColor }\n })\n ) : (\n icon\n )}\n </div>\n );\n };\n\n // 渲染文本内容\n const renderContent = () => {\n return (\n <div className=\"px-1 flex justify-center items-center\">\n <div className={`justify-center ${sizeConfig.textSize} font-medium font-dm-sans ${size === 'large' ? 'leading-snug' : 'leading-none'}`}>\n {children}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={containerClasses}\n style={baseStyle}\n onClick={onClick}\n {...rest}\n >\n {iconPosition === 'leading' && renderIcon()}\n {renderContent()}\n {iconPosition === 'after' && renderIcon()}\n </div>\n );\n};\n\nexport default Tag;\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (\n item: number | string,\n index: number\n ): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: \"none\",\n background: isActive ? \"#FAFAF9\" : \"white\",\n backgroundColor: isActive ? \"#FAFAF9\" : \"white\",\n color: isActive ? primaryColor : \"#79716B\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 上一页\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 下一页\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n {getPageNumbers().map((item, index) => renderItem(item, index))}\n </div>\n\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )}\n\n {showSizeChanger && (\n <select\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n style={{\n padding: size === \"small\" ? \"6px 12px\" : \"8px 12px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: size === \"small\" ? \"12px\" : \"14px\",\n lineHeight: size === \"small\" ? \"18px\" : \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: \"white\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} 条/页\n </option>\n ))}\n </select>\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 跳至\n </span>\n <input\n type=\"number\"\n min=\"1\"\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onKeyPress={(e) => e.key === \"Enter\" && handleJumpTo()}\n disabled={disabled}\n style={{\n width: \"56px\",\n height: size === \"small\" ? \"28px\" : \"36px\",\n padding: \"0 8px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = primaryColor;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 页\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 确定\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n}) => {\n const { primaryColor } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const isChecked = checked || indeterminate;\n const backgroundColor = disabled\n ? '#FAFAF9'\n : isChecked\n ? primaryColor\n : 'white';\n const borderColor = disabled ? '#FAFAF9' : isChecked ? primaryColor : '#D7D3D0';\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '4px', // spacing-sm 通常是 4px\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n opacity: isChecked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n }}\n >\n {indeterminate ? (\n <MinusIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n ) : (\n <CheckIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n )}\n </div>\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"checkbox\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate;\n }}\n onChange={onChange}\n disabled={disabled}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n \n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n borderRadius: '8px',\n border: '1px solid #EAECF0',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div ref={tableRef} className={`aha-table aha-table-mobile-wrapper ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div ref={tableRef} className={`aha-table ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={bordered ? 'bordered' : ''}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n};\n\nexport default Table;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked, value },\n currentTarget: { checked: !checked, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const backgroundColor = disabled\n ? '#FAFAF9'\n : checked\n ? primaryColor\n : 'white';\n const borderColor = disabled \n ? '#FAFAF9' \n : checked \n ? primaryColor \n : '#D7D3D0';\n\n return (\n <div\n className={`aha-radio ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '50%',\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: '8px',\n height: '8px',\n minWidth: '8px',\n minHeight: '8px',\n borderRadius: '50%',\n backgroundColor: 'white',\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"radio\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n value={value}\n name={name}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n\n","import React, { useState, useCallback, useRef, useEffect } 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;\n label: React.ReactNode;\n icon?: React.ReactElement;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string;\n value?: string;\n onChange?: (value: string) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\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 ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const initialValue = controlledValue || defaultValue || items[0]?.key || '';\n const [internalValue, setInternalValue] = useState<string>(initialValue);\n const currentValue = isControlled ? (controlledValue || items[0]?.key || '') : internalValue;\n\n const handleTabClick = useCallback(\n (key: string, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n onChange?.(key);\n },\n [isControlled, onChange]\n );\n\n const activeItem = items.find((item) => item.key === currentValue);\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\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 [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 useEffect(() => {\n // 更新下划线位置\n if (variant === 'underline' && underlineRef.current && containerRef.current) {\n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[currentValue];\n if (activeTab) {\n const containerRect = containerRef.current!.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n \n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n }, 0);\n \n return () => clearTimeout(timer);\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundSliderRef.current && backgroundContainerRef.current) {\n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[currentValue];\n if (activeTab) {\n const containerRect = backgroundContainerRef.current!.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n \n setBackgroundSliderStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n }, 0);\n \n return () => clearTimeout(timer);\n }\n }, [currentValue, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${className}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n }}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '-1px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {items.map((item) => {\n const isActive = item.key === currentValue;\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[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 }}\n >\n {/* 图标 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.isValidElement(item.icon)\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 ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })\n : item.icon}\n </div>\n )}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {items.map((item) => {\n const isActive = item.key === currentValue;\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[item.key] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (\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.isValidElement(item.icon)\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 : item.icon}\n </div>\n )}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n textareaRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize]);\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n };\n\n updatePosition();\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单 */\n submit: () => Promise<any>;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFields] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFields((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n setFields((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFields((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const errorInfo = {\n values: getFieldsValue(),\n errorFields: errors,\n };\n onFinishFailed?.(errorInfo);\n throw errorInfo;\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFields((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFields((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n }), [\n fields, // fields 必须在依赖中,这样 FormItem 才能重新渲染显示错误\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n// 导出 FormItem 作为 Form.Item\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n};\nFormWithItem.Item = FormItem;\n\nexport default FormWithItem;\n\n","import React, { useContext, useEffect, useRef, useMemo } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件\n if (child.type && typeof child.type === 'object' && 'displayName' in child.type) {\n const displayName = (child.type as any).displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={itemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n}\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 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 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 [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n}\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// 计算指定位置的空间可用性得分(分数越高,空间越充足)\nconst getPositionScore = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n position: TooltipPosition,\n gap: number = GAP_DEFAULT\n): number => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const padding = 8;\n \n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n const arrowOffset = ARROW_SIZE;\n const totalGap = gap + arrowOffset;\n \n // 计算该位置下的 tooltip 在视口中的坐标(相对于视口,不包含 scroll)\n let top = 0;\n let left = 0;\n \n switch (position) {\n case \"top\":\n top = triggerRect.top - tooltipRect.height - totalGap;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case \"bottom\":\n top = triggerRect.bottom + totalGap;\n left = triggerCenterX - tooltipRect.width / 2;\n break;\n case \"left\":\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - totalGap;\n break;\n case \"right\":\n top = triggerCenterY - tooltipRect.height / 2;\n left = triggerRect.right + totalGap;\n break;\n case \"top-left\":\n top = triggerRect.top - tooltipRect.height - totalGap;\n left = triggerRect.left;\n break;\n case \"top-right\":\n top = triggerRect.top - tooltipRect.height - totalGap;\n left = triggerRect.right - tooltipRect.width;\n break;\n case \"bottom-left\":\n top = triggerRect.bottom + totalGap;\n left = triggerRect.left;\n break;\n case \"bottom-right\":\n top = triggerRect.bottom + totalGap;\n left = triggerRect.right - tooltipRect.width;\n break;\n default:\n return 0;\n }\n \n // 计算可用空间(相对于视口)\n const availableTop = top;\n const availableBottom = viewportHeight - (top + tooltipRect.height);\n const availableLeft = left;\n const availableRight = viewportWidth - (left + tooltipRect.width);\n \n // 如果超出视口,返回负分\n if (availableTop < padding || availableBottom < padding || \n availableLeft < padding || availableRight < padding) {\n return -1;\n }\n \n // 计算最小可用空间作为得分(确保所有方向都有足够空间)\n const minAvailable = Math.min(availableTop, availableBottom, availableLeft, availableRight);\n return minAvailable;\n};\n\n// 自动选择最佳位置\nconst getAutoPosition = (\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n preferredPosition: TooltipPosition,\n gap: number = GAP_DEFAULT\n): TooltipPosition => {\n // 基础位置列表(按优先级排序)\n const basePositions: TooltipPosition[] = [\"top\", \"bottom\", \"left\", \"right\"];\n \n // 如果首选位置是基础位置,优先尝试\n const positionsToTry: TooltipPosition[] = basePositions.includes(preferredPosition)\n ? [preferredPosition, ...basePositions.filter(p => p !== preferredPosition)]\n : [\n // 对于复合位置,尝试对应的基础位置\n preferredPosition.includes(\"top\") ? \"top\" : \"bottom\",\n preferredPosition.includes(\"bottom\") ? \"bottom\" : \"top\",\n preferredPosition.includes(\"left\") ? \"left\" : \"right\",\n preferredPosition.includes(\"right\") ? \"right\" : \"left\",\n ...basePositions.filter(p => \n !preferredPosition.includes(p.split(\"-\")[0]) && \n !preferredPosition.includes(p.split(\"-\")[1] || \"\")\n )\n ];\n \n let bestPosition = preferredPosition;\n let bestScore = getPositionScore(triggerRect, tooltipRect, preferredPosition, gap);\n \n // 如果首选位置得分小于0(超出视口),尝试其他位置\n if (bestScore < 0) {\n for (const pos of positionsToTry) {\n const score = getPositionScore(triggerRect, tooltipRect, pos, gap);\n if (score > bestScore) {\n bestScore = score;\n bestPosition = pos;\n // 如果找到完全合适的位置(得分>0),直接返回\n if (score > 0) {\n break;\n }\n }\n }\n }\n \n return bestPosition;\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 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}) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [actualPosition, setActualPosition] = useState<TooltipPosition>(position);\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 requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }, delay);\n }, [disabled, delay]);\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 setIsAnimating(false);\n // 等待动画完成后再隐藏\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n }, []);\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 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 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 maxWidth: \"200px\",\n minWidth: \"max-content\",\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 };\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, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2 relative\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div \n className=\"flex flex-col gap-1\"\n style={closeable ? { paddingRight: '2rem' } : {}}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && <div className=\"mt-3\">{action}</div>}\n </div>\n {action && !closeable && <div className=\"ml-3\">{action}</div>}\n {closeable && (\n <div\n className=\"absolute right-4 top-3 cursor-pointer\"\n onClick={handleClose}\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__spreadArray","to","from","pack","ar","l","Array","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","useTheme","context","useContext","SIZE_CONFIG","small","height","paddingLeft","paddingRight","fontSize","lineHeight","iconSize","gap","mediumSmall","medium","large","LoadingIcon","_a","size","color","_jsxs","jsxs","_Fragment","children","_jsx","width","viewBox","fill","style","animation","jsx","cx","cy","r","stroke","strokeWidth","strokeLinecap","strokeDasharray","strokeDashoffset","opacity","Button","baseStyle","_b","type","_c","_d","disabled","_e","loading","onClick","_f","htmlType","_g","className","icon","_h","iconPosition","rest","_j","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","sizeConfig","isDisabled","renderIcon","iconColor","parseInt","replace","display","alignItems","justifyContent","flexShrink","buttonStyle","position","fontWeight","fontFamily","borderRadius","border","cursor","outline","transition","userSelect","WebkitTapHighlightColor","backgroundColor","boxShadow","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","d","error","warning","info","CloseIcon","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","filter","toast","getToasts","subscribe","listener","_this","add","delete","forEach","clearAll","toastManager","ToastContainer","setToasts","useEffect","currentToasts","unsubscribe","map","topLeftToasts","topRightToasts","bottomLeftToasts","bottomRightToasts","top","left","zIndex","pointerEvents","flexDirection","ToastItem","right","bottom","isVisible","setIsVisible","isExiting","setIsExiting","message","duration","action","showClose","onClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","overflow","transform","padding","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","ensureToastContainer","toastContainerElement","toastContainerRoot","isInitializing","window","document","existingContainer","getElementById","createElement","appendChild","createRoot","require","render","import","catch","warn","COLOR_CONFIG","Green","light","bg","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","textSize","CheckIcon","strokeLinejoin","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","current","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onChange","onShowSizeChange","simple","hideOnSinglePage","_m","_o","responsive","showLessItems","itemRender","_q","_r","internalCurrent","setInternalCurrent","_s","internalPageSize","setInternalPageSize","_t","jumpToPage","setJumpToPage","totalPages","useMemo","ceil","undefined","handlePageChange","page","handleJumpTo","margin","marginLeft","start","end","min","flexWrap","pages","getPageNumbers","item","index","isActive","element","max","renderItem","newPageSize","Number","target","newTotalPages","newCurrent","borderColor","onKeyPress","key","onFocus","onBlur","goButton","Checkbox","checked","indeterminate","isChecked","minHeight","boxSizing","ref","el","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","Input","forwardRef","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onPressEnter","restProps","inputRef","useRef","React","internalValue","setInternalValue","focused","setFocused","isControlled","currentValue","handleClear","focus","showClear","sizeStyles","paddingTop","paddingBottom","baseStyles","WebkitAppearance","MozAppearance","appearance","onKeyDown","autoComplete","autoCorrect","autoCapitalize","spellCheck","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","String","textarea","minRows","maxRows","scrollHeight","getComputedStyle","maxHeight","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","config","thumbSize","thumbOffset","default","thumbLeft","role","newChecked","Select","controlledValue","options","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","dropdownClassName","dropdownStyle","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","internalOpen","setInternalOpen","searchValue","setSearchValue","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","includes","getFilteredOptions","toLowerCase","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","scrollY","scrollX","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","Fragment","textOverflow","whiteSpace","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","val","createPortal","WebkitOverflowScrolling","overscrollBehavior","textAlign","isSelected","isFocused","selected","FormContext","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","layout","initialFields","keys","touched","validating","fields","setFields","fieldsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","field","_i","rules_1","rule","validator","string","number","isNaN","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","requestAnimationFrame","errorInfo","errorFields","resetFields","setFieldsValue","allValues_2","submit","useImperativeHandle","contextValue","formStyle","Provider","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","some","rulesChanged","prevRule","currRule","marginBottom","content","showTooltip","setShowTooltip","tooltipRef","borderLeft","borderRight","borderBottom","Children","child","isValidElement","childProps","fieldValue_1","setFieldValue_1","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneElement","cloneChild","MenuList","items","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","k","renderMenuItem","itemStyle","danger","containerStyle","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","title","getPositionScore","triggerRect","tooltipRect","viewportWidth","innerWidth","viewportHeight","innerHeight","triggerCenterX","triggerCenterY","totalGap","availableTop","availableBottom","availableLeft","availableRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","description","showIcon","closeable","visible","setVisible","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","round","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","offset","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","variant","initialValue","handleTabClick","activeItem","activeColor","tabRefs","underlineRef","backgroundSliderRef","containerRef","backgroundContainerRef","underlineStyle","setUnderlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","activeTab","containerRect","tabRect","timer_2","badge","customElement","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","expandable","rowClassName","onHeaderRow","sticky","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","currentPage","setCurrentPage","_v","setPageSize","_w","draggedRowIndex","setDraggedRowIndex","_x","dragOverRowIndex","setDragOverRowIndex","_y","isMobile","setIsMobile","tableRef","headerRef","checkMobile","checkboxProps","getCheckboxProps","newSelectedRowKeys","selectedRows","Event","handleSelectAll","currentPageData","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","join","newSorters","set","sorterArray","entries","c","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","getProcessedData","processed","sort","a","b","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","state_1","processedData","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderRows","isExpanded","rowProps","isLastRow","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","colSpan","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","x","sum","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","startsWith","displayValue","scrollContainerStyle","overflowX","overflowY","colorConfig","hex","substr","getColorConfig","outlineOffset","outlineColor","getOutlineColor","baseClasses","Boolean","containerClasses","getIconColor","theme","themeValue","mounted","setMounted","trigger","delay","tooltipClassName","showArrow","isAnimating","setIsAnimating","actualPosition","setActualPosition","tooltipStyle","setTooltipStyle","setArrowStyle","triggerRef","timeoutRef","hideTimeoutRef","updatePosition","finalPosition","preferredPosition","basePositions","positionsToTry","split","bestPosition","bestScore","positionsToTry_1","pos","score","getAutoPosition","pageXOffset","pageYOffset","calculatePosition","arrowPos","tooltipLeft","tooltipTop","tooltipAbsoluteLeft","tooltipAbsoluteTop","getArrowPosition","hideTooltip","keepTooltipVisible","tooltipContainerStyle","tooltipContent","wordWrap","handleTriggerMouseLeave","triggerProps"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/Button/index.tsx","../src/components/Alert/icon.tsx","../src/components/Toast/icon.tsx","../src/components/Toast/index.tsx","../src/components/Tag/index.tsx","../src/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/Input/index.tsx","../src/components/Textarea/index.tsx","../src/components/Switch/index.tsx","../src/components/Select/index.tsx","../src/components/Form/FormContext.tsx","../src/components/Form/index.tsx","../src/components/Form/FormItem.tsx","../src/components/MenuList/index.tsx","../src/components/Tooltip/index.tsx","../src/components/Alert/index.tsx","../src/components/Progress/index.tsx"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { createContext, useContext, useMemo } from 'react';\n\nexport interface ThemeConfig {\n primaryColor?: string;\n}\n\nconst defaultTheme: ThemeConfig = {\n primaryColor: '#FB6011',\n};\n\nconst ThemeContext = createContext<ThemeConfig>(defaultTheme);\n\nexport interface ThemeProviderProps {\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {\n const themeValue = useMemo(() => {\n return {\n ...defaultTheme,\n ...theme,\n };\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={themeValue}>\n {children}\n </ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeConfig => {\n const context = useContext(ThemeContext);\n if (!context) {\n // 如果没有 Provider,返回默认主题\n return defaultTheme;\n }\n return context;\n};\n\n// 导出默认主题色,供组件内部使用\nexport const getDefaultPrimaryColor = () => defaultTheme.primaryColor!;\n\n","import React, { useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ButtonType = 'default' | 'primary';\nexport type ButtonSize = 'small' | 'mediumSmall' | 'medium' | 'large';\n\nexport interface ButtonProps {\n /** 按钮内容 */\n children?: React.ReactNode;\n /** 按钮类型 */\n type?: ButtonType;\n /** 按钮尺寸 */\n size?: ButtonSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否加载中 */\n loading?: boolean;\n /** 点击事件 */\n onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n /** 按钮原生type */\n htmlType?: 'button' | 'submit' | 'reset';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 图标 */\n icon?: React.ReactNode;\n /** 图标位置 */\n iconPosition?: 'left' | 'right';\n [key: string]: any;\n}\n\n// 尺寸配置:高度分别为 32、36、40、48px\nconst SIZE_CONFIG = {\n small: {\n height: '32px',\n paddingLeft: '12px',\n paddingRight: '12px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n mediumSmall: {\n height: '36px',\n paddingLeft: '14px',\n paddingRight: '14px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '16px',\n gap: '6px',\n },\n medium: {\n height: '40px',\n paddingLeft: '16px',\n paddingRight: '16px',\n fontSize: '14px',\n lineHeight: '20px',\n iconSize: '18px',\n gap: '8px',\n },\n large: {\n height: '48px',\n paddingLeft: '20px',\n paddingRight: '20px',\n fontSize: '16px',\n lineHeight: '24px',\n iconSize: '20px',\n gap: '8px',\n },\n};\n\n// Loading 图标组件\nconst LoadingIcon: React.FC<{ size: number; color: string }> = ({ size, color }) => {\n // 使用 React 方式注入样式,避免在模块顶层操作 DOM\n const loadingStyles = `\n @keyframes aha-button-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `;\n\n return (\n <>\n <style>{loadingStyles}</style>\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'aha-button-spin 1s linear infinite',\n }}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"16\"\n />\n </svg>\n </>\n );\n};\n\nconst Button: React.FC<ButtonProps> = ({\n children,\n type = 'default',\n size = 'medium',\n disabled = false,\n loading = false,\n onClick,\n htmlType = 'button',\n className = '',\n style,\n icon,\n iconPosition = 'left',\n ...rest\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n const [isPressed, setIsPressed] = useState(false);\n\n const sizeConfig = SIZE_CONFIG[size];\n const isDisabled = disabled || loading;\n\n // 计算按钮样式\n const getButtonStyles = (): React.CSSProperties => {\n const baseStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizeConfig.gap,\n height: sizeConfig.height,\n paddingLeft: sizeConfig.paddingLeft,\n paddingRight: sizeConfig.paddingRight,\n fontSize: sizeConfig.fontSize,\n lineHeight: sizeConfig.lineHeight,\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n borderRadius: '8px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n outline: 'none',\n transition: 'all 0.2s',\n userSelect: 'none',\n WebkitTapHighlightColor: 'transparent',\n ...style,\n };\n\n if (type === 'primary') {\n // Primary 按钮:使用主题色,所有状态下文字都是白色\n baseStyle.color = '#FFFFFF';\n baseStyle.backgroundColor = primaryColor;\n if (disabled) {\n // disabled状态:保持primary样式,通过降低透明度表示禁用\n baseStyle.opacity = 0.4;\n baseStyle.cursor = 'not-allowed';\n } else if (loading) {\n // loading状态:保持primary样式(主题色背景)\n baseStyle.backgroundColor = primaryColor;\n } else if (isPressed) {\n baseStyle.backgroundColor = '#EC470A'; // 按下时的深色\n } else if (isHovered) {\n baseStyle.backgroundColor = '#FD843A'; // hover时的浅色\n }\n } else {\n // Default 按钮:白色背景,灰色边框\n if (disabled) {\n // disabled状态:灰色背景,灰色文字\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#D6D3D1';\n baseStyle.border = '1px solid #E7E5E4';\n } else if (loading) {\n // loading状态:保持default样式(白色背景+边框)\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isPressed) {\n baseStyle.backgroundColor = '#F5F5F4';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n } else if (isHovered) {\n // Hover 状态:浅灰色背景,边框稍微变深,增强阴影\n baseStyle.backgroundColor = '#FAFAF9';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #D7D3D0';\n baseStyle.boxShadow = '0px 2px 4px 0px rgba(12, 10, 9, 0.08)';\n } else {\n baseStyle.backgroundColor = '#FFFFFF';\n baseStyle.color = '#101828';\n baseStyle.border = '1px solid #E7E5E4';\n baseStyle.boxShadow = '0px 1px 2px 0px rgba(12, 10, 9, 0.05)';\n }\n }\n\n return baseStyle;\n };\n\n // 处理点击事件\n const handleClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n // 渲染图标\n const renderIcon = () => {\n if (loading) {\n // loading时,根据按钮类型确定颜色\n // primary按钮:白色图标;default按钮:黑色图标\n const iconColor = type === 'primary' ? '#FFFFFF' : '#101828';\n const iconSize = parseInt(sizeConfig.iconSize.replace('px', ''));\n return <LoadingIcon size={iconSize} color={iconColor} />;\n }\n if (icon) {\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: sizeConfig.iconSize,\n height: sizeConfig.iconSize,\n flexShrink: 0,\n }}\n >\n {icon}\n </span>\n );\n }\n return null;\n };\n\n const buttonStyle = getButtonStyles();\n\n return (\n <button\n type={htmlType}\n className={`aha-button aha-button--${type} aha-button--${size} ${isDisabled ? 'aha-button--disabled' : ''} ${loading ? 'aha-button--loading' : ''} ${className}`}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={() => !isDisabled && setIsHovered(true)}\n onMouseLeave={() => {\n setIsHovered(false);\n setIsPressed(false);\n }}\n onMouseDown={() => !isDisabled && setIsPressed(true)}\n onMouseUp={() => setIsPressed(false)}\n style={buttonStyle}\n {...rest}\n >\n {/* loading时,图标总是在左侧显示,忽略iconPosition */}\n {loading && renderIcon()}\n {!loading && iconPosition === 'left' && renderIcon()}\n {children && <span style={{ display: 'inline-block' }}>{children}</span>}\n {!loading && iconPosition === 'right' && renderIcon()}\n </button>\n );\n};\n\nButton.displayName = 'Button';\n\nexport default Button;\n","export const AlertIcon = {\n success: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 1.66663C5.40002 1.66663 1.66669 5.39996 1.66669 9.99996C1.66669 14.6 5.40002 18.3333 10 18.3333C14.6 18.3333 18.3334 14.6 18.3334 9.99996C18.3334 5.39996 14.6 1.66663 10 1.66663ZM13.3584 8.49997L9.46668 12.3833C9.35001 12.5083 9.19168 12.5666 9.02501 12.5666C8.86668 12.5666 8.70834 12.5083 8.58334 12.3833L6.64169 10.4417C6.40002 10.2 6.40002 9.79994 6.64169 9.55827C6.88336 9.3166 7.28335 9.3166 7.52502 9.55827L9.02501 11.0583L12.475 7.61664C12.7167 7.36664 13.1167 7.36664 13.3584 7.61664C13.6 7.8583 13.6 8.24997 13.3584 8.49997Z\"\n fill=\"#00BC7D\"\n />\n </svg>\n ),\n error: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17.1342 6.3009L13.6999 2.86666C13.4658 2.63249 13.1474 2.50085 12.8157 2.50085H7.18504C6.85337 2.50085 6.53584 2.63249 6.30084 2.86666L2.8666 6.3009C2.63243 6.53507 2.50079 6.85343 2.50079 7.1851V12.8158C2.50079 13.1475 2.63243 13.465 2.8666 13.7L6.30084 17.1342C6.53501 17.3684 6.85337 17.5 7.18504 17.5H12.8157C13.1474 17.5 13.4649 17.3684 13.6999 17.1342L17.1342 13.7C17.3683 13.4658 17.5 13.1475 17.5 12.8158V7.1851C17.5 6.85343 17.3683 6.53507 17.1342 6.3009ZM12.525 11.6417C12.7692 11.8858 12.7692 12.2817 12.525 12.5259C12.4033 12.6475 12.2433 12.7092 12.0833 12.7092C11.9233 12.7092 11.7633 12.6484 11.6416 12.5259L9.99998 10.8842L8.35834 12.5259C8.23667 12.6475 8.07665 12.7092 7.91665 12.7092C7.75665 12.7092 7.59662 12.6484 7.47496 12.5259C7.23079 12.2817 7.23079 11.8858 7.47496 11.6417L9.1166 10L7.47496 8.3584C7.23079 8.11423 7.23079 7.71837 7.47496 7.4742C7.71912 7.23004 8.11498 7.23004 8.35915 7.4742L10.0008 9.11585L11.6424 7.4742C11.8866 7.23004 12.2825 7.23004 12.5266 7.4742C12.7708 7.71837 12.7708 8.11423 12.5266 8.3584L10.885 10L12.525 11.6417Z\"\n fill=\"#FB2C36\"\n />\n </svg>\n ),\n warning: (\n <svg \n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.0057 14.2935L12.4999 3.99662C11.4333 2.00162 8.56744 2.00162 7.49995 3.99662L1.99417 14.2935C1.01583 16.1235 2.3442 18.3334 4.42337 18.3334H15.5765C17.6549 18.3334 18.9841 16.1226 18.0057 14.2935ZM9.37495 8.33337C9.37495 7.98837 9.65494 7.70837 9.99994 7.70837C10.3449 7.70837 10.6249 7.98837 10.6249 8.33337V11.6667C10.6249 12.0117 10.3449 12.2917 9.99994 12.2917C9.65494 12.2917 9.37495 12.0117 9.37495 11.6667V8.33337ZM10.0166 15C9.55663 15 9.17902 14.6267 9.17902 14.1667C9.17902 13.7067 9.54829 13.3334 10.0083 13.3334H10.0166C10.4775 13.3334 10.85 13.7067 10.85 14.1667C10.85 14.6267 10.4766 15 10.0166 15Z\"\n fill=\"#FE9A00\"\n />\n </svg>\n ),\n info: (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6875 2.5H5.3125C3.4375 2.5 2.5 3.4375 2.5 5.3125V14.6875C2.5 16.5625 3.4375 17.5 5.3125 17.5H14.6875C16.5625 17.5 17.5 16.5625 17.5 14.6875V5.3125C17.5 3.4375 16.5625 2.5 14.6875 2.5ZM10.625 13.75C10.625 14.095 10.345 14.375 10 14.375C9.655 14.375 9.375 14.095 9.375 13.75V9.9408C9.375 9.5958 9.655 9.3158 10 9.3158C10.345 9.3158 10.625 9.5958 10.625 9.9408V13.75ZM10.0167 7.91667C9.55668 7.91667 9.17908 7.54333 9.17908 7.08333C9.17908 6.62333 9.54834 6.25 10.0083 6.25H10.0167C10.4775 6.25 10.85 6.62333 10.85 7.08333C10.85 7.54333 10.4767 7.91667 10.0167 7.91667Z\"\n fill=\"#2B7FFF\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = (\n <svg\n className=\"flex-shrink-0\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"#57534D\"\n />\n </svg>\n);\n","export const ToastIcon = {\n success: (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM16.03 10.2L11.36 14.86C11.22 15.01 11.03 15.08 10.83 15.08C10.64 15.08 10.45 15.01 10.3 14.86L7.97 12.53C7.68 12.24 7.68 11.76 7.97 11.47C8.26 11.18 8.74 11.18 9.03 11.47L10.83 13.27L14.97 9.14001C15.26 8.84001 15.74 8.84001 16.03 9.14001C16.32 9.43001 16.32 9.90001 16.03 10.2Z\"\n fill=\"#ECFDF5\"\n />\n </svg>\n ),\n error: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.3506 7.56104L17.2295 3.43994C16.9485 3.15894 16.5665 3.00098 16.1685 3.00098H9.41162C9.01362 3.00098 8.63259 3.15894 8.35059 3.43994L4.22949 7.56104C3.94849 7.84204 3.79053 8.22407 3.79053 8.62207V15.3789C3.79053 15.7769 3.94849 16.1579 4.22949 16.4399L8.35059 20.561C8.63159 20.842 9.01362 21 9.41162 21H16.1685C16.5665 21 16.9475 20.842 17.2295 20.561L21.3506 16.4399C21.6316 16.1589 21.7896 15.7769 21.7896 15.3789V8.62207C21.7896 8.22407 21.6316 7.84204 21.3506 7.56104ZM15.8196 13.97C16.1126 14.263 16.1126 14.738 15.8196 15.031C15.6736 15.177 15.4816 15.251 15.2896 15.251C15.0976 15.251 14.9055 15.178 14.7595 15.031L12.7896 13.061L10.8196 15.031C10.6736 15.177 10.4816 15.251 10.2896 15.251C10.0976 15.251 9.90552 15.178 9.75952 15.031C9.46652 14.738 9.46652 14.263 9.75952 13.97L11.7295 12L9.75952 10.03C9.46652 9.73703 9.46652 9.26199 9.75952 8.96899C10.0525 8.67599 10.5276 8.67599 10.8206 8.96899L12.7905 10.939L14.7605 8.96899C15.0535 8.67599 15.5285 8.67599 15.8215 8.96899C16.1145 9.26199 16.1145 9.73703 15.8215 10.03L13.8516 12L15.8196 13.97Z\"\n fill=\"#FEF2F2\"\n />\n </svg>\n ),\n question: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n info: (\n <svg\n width=\"25\"\n height=\"24\"\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M18.2041 3H6.9541C4.7041 3 3.5791 4.125 3.5791 6.375V17.625C3.5791 19.875 4.7041 21 6.9541 21H18.2041C20.4541 21 21.5791 19.875 21.5791 17.625V6.375C21.5791 4.125 20.4541 3 18.2041 3ZM12.5991 17.5C12.0471 17.5 11.594 17.052 11.594 16.5C11.594 15.948 12.0371 15.5 12.5891 15.5H12.5991C13.1521 15.5 13.5991 15.948 13.5991 16.5C13.5991 17.052 13.1511 17.5 12.5991 17.5ZM14.1821 12.5281C13.4511 13.0181 13.315 13.291 13.29 13.363C13.185 13.676 12.8931 13.874 12.5791 13.874C12.5001 13.874 12.4201 13.862 12.3411 13.835C11.9481 13.703 11.7372 13.278 11.8682 12.885C12.0492 12.345 12.5182 11.836 13.3462 11.281C14.3672 10.597 14.2361 9.84707 14.1931 9.60107C14.0801 8.94707 13.5291 8.38988 12.8821 8.27588C12.3891 8.18588 11.9092 8.31488 11.5332 8.62988C11.1552 8.94688 10.938 9.41391 10.938 9.90991C10.938 10.3239 10.602 10.6599 10.188 10.6599C9.77399 10.6599 9.43799 10.3239 9.43799 9.90991C9.43799 8.96891 9.85009 8.08396 10.5691 7.48096C11.2811 6.88496 12.2181 6.63605 13.1431 6.80005C14.4101 7.02405 15.4492 8.07097 15.6702 9.34497C15.8902 10.607 15.3611 11.7381 14.1821 12.5281Z\"\n fill=\"#FAFAF9\"\n />\n </svg>\n ),\n};\n\nexport const CloseIcon = ({ className }: any) => {\n return (\n <svg\n className={`flex-shrink-0 ${className}`}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4416 14.5583C15.6858 14.8025 15.6858 15.1984 15.4416 15.4425C15.32 15.5642 15.16 15.6258 15 15.6258C14.84 15.6258 14.68 15.565 14.5583 15.4425L9.99997 10.8842L5.44164 15.4425C5.31997 15.5642 5.15997 15.6258 4.99997 15.6258C4.83997 15.6258 4.67997 15.565 4.55831 15.4425C4.31414 15.1984 4.31414 14.8025 4.55831 14.5583L9.11664 10L4.55831 5.44171C4.31414 5.19754 4.31414 4.80168 4.55831 4.55751C4.80247 4.31335 5.19831 4.31335 5.44248 4.55751L10.0008 9.11587L14.5591 4.55751C14.8033 4.31335 15.1991 4.31335 15.4433 4.55751C15.6875 4.80168 15.6875 5.19754 15.4433 5.44171L10.885 10L15.4416 14.5583Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { CloseIcon, ToastIcon } from \"./icon\";\n\nexport type ToastType = \"success\" | \"error\" | \"info\" | \"question\";\nexport type ToastPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport interface ToastProps {\n /** Toast 消息内容 */\n message: string;\n /** Toast 类型 */\n type?: ToastType;\n /** 显示位置 */\n position?: ToastPosition;\n /** 显示时长(毫秒),0 表示不自动关闭 */\n duration?: number;\n /** 自定义图标 */\n icon?: React.ReactNode;\n /** 自定义操作按钮 */\n action?: React.ReactNode;\n /** 是否显示关闭按钮 */\n showClose?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n /** 点击回调 */\n onClick?: () => void;\n /** 自定义样式类名 */\n className?: string;\n}\n\nexport interface ToastInstance {\n id: string;\n props: ToastProps;\n}\n\n// Toast 管理器\nclass ToastManager {\n private toasts: ToastInstance[] = [];\n private listeners: Set<() => void> = new Set();\n\n addToast(props: ToastProps): string {\n const id = Math.random().toString(36).slice(-8);\n const toastInstance = { id, props };\n this.toasts.push(toastInstance);\n console.log('Toast: 添加 Toast 到管理器,ID:', id, '当前总数:', this.toasts.length);\n this.notifyListeners();\n return id;\n }\n\n removeToast(id: string): void {\n this.toasts = this.toasts.filter((toast) => toast.id !== id);\n this.notifyListeners();\n }\n\n getToasts(): ToastInstance[] {\n return [...this.toasts]; // 返回副本,避免外部修改\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notifyListeners(): void {\n console.log('Toast: 通知监听器,监听器数量:', this.listeners.size);\n this.listeners.forEach((listener) => listener());\n }\n\n // 清理所有 Toast(用于调试)\n clearAll(): void {\n this.toasts = [];\n this.notifyListeners();\n }\n}\n\n// 全局 Toast 管理器实例\nconst toastManager = new ToastManager();\n\n// Toast 容器组件\nconst ToastContainer: React.FC = () => {\n const [toasts, setToasts] = useState<ToastInstance[]>([]);\n\n useEffect(() => {\n console.log('Toast: ToastContainer 组件已挂载');\n \n // 立即获取当前的 Toast 列表\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 初始 Toast 数量:', currentToasts.length);\n setToasts(currentToasts);\n \n const unsubscribe = toastManager.subscribe(() => {\n const currentToasts = toastManager.getToasts();\n console.log('Toast: 收到 Toast 更新,当前数量:', currentToasts.length, 'Toast IDs:', currentToasts.map(t => t.id));\n setToasts(currentToasts);\n });\n return unsubscribe;\n }, []);\n\n // 按位置分组 Toast\n const topLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"top-left\"\n );\n const topRightToasts = toasts.filter(\n (toast) => toast.props.position === \"top-right\"\n );\n const bottomLeftToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-left\"\n );\n const bottomRightToasts = toasts.filter(\n (toast) => toast.props.position === \"bottom-right\"\n );\n\n return (\n <>\n {/* 左上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右上角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n top: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {topRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 左下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n left: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomLeftToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n\n {/* 右下角 Toast 容器 */}\n <div style={{ \n position: 'fixed', \n bottom: '16px', \n right: '16px', \n zIndex: 9999, \n pointerEvents: 'none',\n display: 'flex', \n flexDirection: 'column', \n gap: '8px' \n }}>\n {bottomRightToasts.map((toast) => (\n <ToastItem key={toast.id} {...toast} />\n ))}\n </div>\n </>\n );\n};\n\n// 单个 Toast 组件\nconst ToastItem: React.FC<ToastInstance> = ({ id, props }) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const {\n message,\n type = \"info\",\n duration = 3000,\n icon,\n action,\n showClose = true,\n onClose,\n onClick,\n className = \"\",\n } = props;\n\n // 获取类型对应的样式和默认图标\n const getTypeStyles = (type: ToastType) => {\n switch (type) {\n case \"success\":\n return {\n bgColor: \"#009966\",\n defaultIcon: ToastIcon.success,\n };\n case \"error\":\n return {\n bgColor: \"#E7000B\",\n defaultIcon: ToastIcon.error,\n };\n case \"question\":\n return {\n bgColor: \"#1C1917\",\n defaultIcon: ToastIcon.question,\n };\n case \"info\":\n default:\n return {\n bgColor: \"#1447E6\",\n defaultIcon: ToastIcon.info,\n };\n }\n };\n\n const typeStyles = getTypeStyles(type);\n\n // 显示动画\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsVisible(true);\n }, 10);\n return () => clearTimeout(timer);\n }, []);\n\n // 自动关闭\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, id]); // 添加 id 依赖,确保每个 Toast 独立处理\n\n const handleClose = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => {\n toastManager.removeToast(id);\n onClose?.();\n }, 300); // 动画持续时间\n }, [id, onClose]);\n\n const handleClick = useCallback(() => {\n onClick?.();\n }, [onClick]);\n\n return (\n <div\n style={{\n pointerEvents: 'auto',\n maxWidth: '380px',\n background: 'white',\n borderRadius: '8px',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n overflow: 'hidden',\n transform: isVisible && !isExiting ? 'translateY(0) scale(1)' : 'translateY(8px) scale(0.95)',\n opacity: isVisible && !isExiting ? 1 : 0,\n transition: 'all 300ms ease-out',\n position: 'relative',\n cursor: onClick ? 'pointer' : 'default',\n }}\n onClick={handleClick}\n >\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n padding: '16px',\n backgroundColor: typeStyles.bgColor,\n color: 'white',\n }}>\n {/* 图标 */}\n <div style={{\n flexShrink: 0,\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: '8px',\n }}>\n {icon || typeStyles.defaultIcon}\n </div>\n\n {/* 内容区域 */}\n <div style={{\n flex: 1,\n minWidth: 0,\n paddingRight: '20px',\n }}>\n <div style={{\n width: '100%',\n justifyContent: 'flex-start',\n color: '#f0fdf4',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '24px',\n }}>\n {message}\n </div>\n\n {/* 自定义操作 */}\n {action && <div style={{ marginTop: '12px' }}>{action}</div>}\n </div>\n\n {/* 关闭按钮 */}\n {showClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n style={{\n flexShrink: 0,\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 200ms',\n position: 'absolute',\n top: '14px',\n right: '16px',\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: 'white',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// Toast 组件\nconst Toast: React.FC<ToastProps> = (props) => {\n // 这个组件主要用于直接渲染单个 Toast\n // 通常使用 toast() 函数来显示 Toast\n return <ToastItem id=\"direct\" props={props} />;\n};\n\n// Toast 显示函数\nexport const toast = (props: ToastProps): string => {\n console.log('Toast: 调用 toast 函数', props);\n \n // 确保 Toast 容器已挂载\n ensureToastContainer();\n \n // 使用 setTimeout 确保容器完全初始化\n setTimeout(() => {\n const id = toastManager.addToast(props);\n console.log('Toast: 添加 Toast 成功,ID:', id);\n }, 100);\n \n // 临时返回一个 ID\n return Math.random().toString(36).slice(-8);\n};\n\n// Toast 关闭函数\nexport const closeToast = (id: string): void => {\n toastManager.removeToast(id);\n};\n\n// 清理所有 Toast\nexport const clearAllToasts = (): void => {\n toastManager.clearAll();\n};\n\n// 调试函数\nexport const debugToast = () => {\n console.log('=== Toast 调试信息 ===');\n console.log('当前环境:', typeof window !== 'undefined' ? '浏览器' : '服务端');\n console.log('document 可用:', typeof document !== 'undefined');\n console.log('容器元素:', document.getElementById('aha-toast-container'));\n console.log('Toast 管理器状态:', toastManager.getToasts());\n console.log('容器根节点:', toastContainerRoot);\n console.log('是否正在初始化:', isInitializing);\n console.log('====================');\n};\n\n// 便捷方法\nexport const toastSuccess = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"success\" });\n};\n\nexport const toastError = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"error\" });\n};\n\nexport const toastInfo = (message: string, options?: Partial<ToastProps>) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"info\" });\n};\n\nexport const toastQuestion = (\n message: string,\n options?: Partial<ToastProps>\n) => {\n ensureToastContainer();\n return toast({ ...options, message, type: \"question\" });\n};\n\n// 自动挂载的 Toast 容器\nlet toastContainerElement: HTMLElement | null = null;\nlet toastContainerRoot: any = null;\nlet isInitializing = false;\n\nconst ensureToastContainer = () => {\n console.log('Toast: 开始确保容器存在');\n \n // 检查是否在浏览器环境\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n console.warn('Toast: 当前环境不支持 Toast 组件');\n return;\n }\n\n // 如果已经在初始化中,直接返回\n if (isInitializing) {\n console.log('Toast: 容器正在初始化中,跳过');\n return;\n }\n\n if (!toastContainerElement) {\n console.log('Toast: 创建新的 Toast 容器');\n isInitializing = true;\n \n try {\n // 检查是否已存在容器\n const existingContainer = document.getElementById('aha-toast-container');\n if (existingContainer) {\n console.log('Toast: 发现已存在的容器');\n toastContainerElement = existingContainer;\n isInitializing = false;\n return;\n }\n\n // 创建容器元素\n console.log('Toast: 创建容器元素');\n toastContainerElement = document.createElement('div');\n toastContainerElement.id = 'aha-toast-container';\n document.body.appendChild(toastContainerElement);\n console.log('Toast: 容器已添加到 document.body');\n\n // 尝试直接导入 ReactDOM\n console.log('Toast: 开始导入 ReactDOM');\n try {\n // 先尝试同步导入\n const { createRoot } = require('react-dom/client');\n console.log('Toast: ReactDOM 同步导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n isInitializing = false;\n } catch (error) {\n console.log('Toast: 同步导入失败,尝试动态导入', error);\n // 如果同步导入失败,尝试动态导入\n import('react-dom/client').then(({ createRoot }) => {\n try {\n console.log('Toast: ReactDOM 动态导入成功,创建根节点');\n toastContainerRoot = createRoot(toastContainerElement!);\n console.log('Toast: 渲染 ToastContainer 组件');\n toastContainerRoot.render(<ToastContainer />);\n console.log('Toast: 容器渲染完成');\n } catch (error) {\n console.error('Toast: 渲染容器失败', error);\n }\n isInitializing = false;\n }).catch((error) => {\n console.error('Toast: 导入 ReactDOM 失败', error);\n isInitializing = false;\n });\n }\n } catch (error) {\n console.error('Toast: 创建容器失败', error);\n isInitializing = false;\n }\n } else {\n console.log('Toast: 容器已存在,跳过创建');\n }\n};\n\n// Toast 提供者组件(保持向后兼容)\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <>\n {children}\n {mounted && createPortal(<ToastContainer />, document.body)}\n </>\n );\n};\n\nexport default Toast;\n","import React, { SVGProps } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type TagColor = 'Green' | 'Red' | 'Orange' | 'Cyan' | 'Violet' | 'Pink' | 'Gray' | 'Yellow' | 'Blue' | string;\nexport type TagVariant = 'light' | 'fill';\nexport type TagSize = 'large' | 'small';\nexport type IconPosition = 'leading' | 'after' | 'none';\n\nexport interface TagProps {\n children: React.ReactNode;\n color: TagColor; // 必需属性,支持预定义颜色或自定义十六进制颜色\n variant?: TagVariant;\n size?: TagSize;\n stroke?: boolean; // 仅对 light 变体有效\n icon?: React.ReactElement; // 只允许 React 元素,不接受字符串\n iconPosition?: IconPosition;\n className?: string;\n onClick?: () => void;\n [key: string]: any;\n}\n\n// 颜色配置\nconst COLOR_CONFIG = {\n Green: {\n light: {\n bg: '#ECFDF5',\n text: '#006045',\n border: '#A4F4CF',\n },\n fill: {\n bg: '#00BC7D',\n text: '#FFFFFF',\n }\n },\n Red: {\n light: {\n bg: '#FEF2F2',\n text: '#9F0712',\n border: '#FFC9C9',\n },\n fill: {\n bg: '#FB2C36',\n text: '#FFFFFF',\n }\n },\n Orange: {\n light: {\n bg: '#FFF6ED',\n text: '#9B2911',\n border: '#FFD1A9',\n },\n fill: {\n bg: '#FB6011',\n text: '#FFFFFF',\n }\n },\n Cyan: {\n light: {\n bg: '#ECFEFF',\n text: '#005F78',\n border: '#A2F4FD',\n },\n fill: {\n bg: '#00B8DB',\n text: '#FFFFFF',\n }\n },\n Violet: {\n light: {\n bg: '#F5F3FF',\n text: '#5D0EC0',\n border: '#DDD6FF',\n },\n fill: {\n bg: '#8E51FF',\n text: '#FFFFFF',\n }\n },\n Pink: {\n light: {\n bg: '#FDF2F8',\n text: '#A3004C',\n border: '#FCCEE8',\n },\n fill: {\n bg: '#F6339A',\n text: '#FFFFFF',\n }\n },\n Gray: {\n light: {\n bg: '#F5F5F4',\n text: '#292524',\n border: '#E7E5E4',\n },\n fill: {\n bg: '#292524',\n text: '#FFFFFF',\n }\n },\n Yellow: {\n light: {\n bg: '#FFFBEB',\n text: '#973C00',\n border: '#FEE685',\n },\n fill: {\n bg: '#FE9A00',\n text: '#FFFFFF',\n }\n },\n Blue: {\n light: {\n bg: '#EFF6FF',\n text: '#193CB8',\n border: '#BEDBFF',\n },\n fill: {\n bg: '#2B7FFF',\n text: '#FFFFFF',\n }\n }\n};\n\n// 尺寸配置\nconst SIZE_CONFIG = {\n large: {\n padding: 'px-2 py-0.5',\n textSize: 'text-sm',\n iconSize: 'w-4 h-4',\n gap: 'gap-1',\n },\n small: {\n padding: 'px-2 py-0.5', // 与 large 相同的外层 padding\n textSize: 'text-xs',\n iconSize: 'w-3 h-3',\n gap: 'gap-0.5',\n }\n};\n\n// 获取颜色配置的函数\nconst getColorConfig = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的配置\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n const config = COLOR_CONFIG[color as keyof typeof COLOR_CONFIG];\n // 如果是 Orange 颜色,使用主题色\n if (color === 'Orange' && primaryColor) {\n return {\n ...config,\n fill: {\n ...config.fill,\n bg: primaryColor,\n },\n };\n }\n return config;\n }\n \n // 如果是自定义颜色(十六进制),生成配置\n if (typeof color === 'string' && color.startsWith('#')) {\n // 将十六进制转换为 RGB 值\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n \n return {\n light: {\n bg: `rgba(${r}, ${g}, ${b}, 0.1)`, // 10% 透明度\n text: color,\n border: `rgba(${r}, ${g}, ${b}, 0.3)`, // 30% 透明度\n },\n fill: {\n bg: color,\n text: '#FFFFFF',\n }\n };\n }\n \n // 默认返回绿色配置\n return COLOR_CONFIG.Green;\n};\n\n// 获取图标颜色的函数\nconst getIconColor = (color: TagColor, primaryColor?: string) => {\n // 如果是预定义颜色,返回对应的图标颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#009966';\n case 'Red': return '#E7000B';\n case 'Orange': return primaryColor || '#E17100'; // 使用主题色\n case 'Blue': return '#155DFC';\n case 'Yellow': return '#EC470A';\n case 'Cyan': return '#0092B8';\n case 'Violet': return '#7F22FE';\n case 'Pink': return '#E60076';\n case 'Gray': return '#57534D';\n default: return '#009966';\n }\n }\n \n // 如果是自定义颜色,返回原色\n if (typeof color === 'string' && color.startsWith('#')) {\n return color;\n }\n \n return '#009966';\n};\n\n// 获取边框颜色的函数\nconst getOutlineColor = (color: TagColor) => {\n // 如果是预定义颜色,返回对应的边框颜色\n if (typeof color === 'string' && color in COLOR_CONFIG) {\n switch (color) {\n case 'Green': return '#A4F4CF';\n case 'Red': return '#FFC9C9';\n case 'Orange': return '#FFD1A9';\n case 'Blue': return '#BEDBFF';\n case 'Yellow': return '#FFD1A9';\n case 'Cyan': return '#A2F4FD';\n case 'Violet': return '#DDD6FF';\n case 'Pink': return '#FCCEE8';\n case 'Gray': return '#E7E5E4';\n default: return '#A4F4CF';\n }\n }\n \n // 如果是自定义颜色,返回带透明度的颜色\n if (typeof color === 'string' && color.startsWith('#')) {\n const hex = color.replace('#', '');\n const r = parseInt(hex.substr(0, 2), 16);\n const g = parseInt(hex.substr(2, 2), 16);\n const b = parseInt(hex.substr(4, 2), 16);\n return `rgba(${r}, ${g}, ${b}, 0.3)`; // 30% 透明度\n }\n \n return '#A4F4CF';\n};\n\nconst Tag: React.FC<TagProps> = ({\n children,\n color,\n variant = 'light',\n size = 'large',\n stroke = false,\n icon,\n iconPosition = 'none',\n className = '',\n onClick,\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n const colorConfig = getColorConfig(color, primaryColor);\n const sizeConfig = SIZE_CONFIG[size];\n \n // 构建基础样式对象\n const baseStyle: React.CSSProperties = {\n borderRadius: '0.375rem', // rounded-md\n display: 'inline-flex',\n justifyContent: 'start',\n alignItems: 'center',\n padding: '2px 8px', // px-2 py-0.5 (所有尺寸都相同)\n gap: size === 'large' ? '4px' : '2px', // gap-1 or gap-0.5\n fontWeight: 500, // font-medium\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: size === 'large' ? '1.375' : '1', // leading-snug or leading-none\n transition: 'all 0.2s',\n fontSize: size === 'large' ? '14px' : '12px', // text-sm or text-xs\n height: size === 'small' ? '20px' : '24px', // Small 尺寸 20px,Large 尺寸 24px\n };\n\n // 根据变体和颜色添加样式\n if (variant === 'light') {\n baseStyle.backgroundColor = colorConfig.light.bg;\n baseStyle.color = colorConfig.light.text;\n if (stroke) {\n // 使用 outline 样式而不是 border\n baseStyle.outline = '1px solid';\n baseStyle.outlineOffset = '-1px';\n // 根据颜色设置 outline 颜色\n baseStyle.outlineColor = getOutlineColor(color);\n }\n }\n\n // 添加点击样式\n if (onClick) {\n baseStyle.cursor = 'pointer';\n baseStyle.opacity = '1';\n }\n\n // 构建类名\n const baseClasses = [\n 'rounded-md',\n 'inline-flex',\n 'justify-start',\n 'items-center',\n sizeConfig.padding,\n sizeConfig.gap,\n 'font-medium',\n 'font-dm-sans',\n size === 'large' ? 'leading-snug' : 'leading-none',\n 'transition-colors',\n 'duration-200',\n size === 'small' ? 'h-5' : 'h-6' // Small 尺寸 20px,Large 尺寸 24px\n ].filter(Boolean); // 过滤掉空字符串\n\n // 为 fill 变体添加样式\n if (variant === 'fill') {\n baseStyle.backgroundColor = colorConfig.fill.bg;\n baseStyle.color = colorConfig.fill.text;\n }\n\n if (onClick) {\n baseClasses.push('cursor-pointer', 'hover:opacity-80');\n }\n\n if (className) {\n baseClasses.push(className);\n }\n\n const containerClasses = baseClasses.join(' ');\n\n // 渲染图标\n const renderIcon = () => {\n if (!icon) return null;\n \n // 根据颜色设置图标颜色\n const iconColor = getIconColor(color, primaryColor);\n \n // 根据尺寸设置图标大小\n const iconSize = size === 'small' ? '14px' : '16px';\n \n return (\n <div className=\"flex items-center justify-center\" style={{ width: iconSize, height: iconSize }}>\n {icon.type === 'svg' ? (\n React.cloneElement(icon as React.ReactElement<SVGProps<SVGSVGElement>>, {\n width: iconSize,\n height: iconSize,\n style: { fill: iconColor }\n })\n ) : (\n icon\n )}\n </div>\n );\n };\n\n // 渲染文本内容\n const renderContent = () => {\n return (\n <div className=\"px-1 flex justify-center items-center\">\n <div className={`justify-center ${sizeConfig.textSize} font-medium font-dm-sans ${size === 'large' ? 'leading-snug' : 'leading-none'}`}>\n {children}\n </div>\n </div>\n );\n };\n\n return (\n <div\n className={containerClasses}\n style={baseStyle}\n onClick={onClick}\n {...rest}\n >\n {iconPosition === 'leading' && renderIcon()}\n {renderContent()}\n {iconPosition === 'after' && renderIcon()}\n </div>\n );\n};\n\nexport default Tag;\n","import React from \"react\";\n\n// Checkbox 选中图标\nexport const CheckIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox 半选中图标(减号)\nexport const MinusIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7H10.5\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标\nexport const SortIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 降序\nexport const SortDescIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M3.5 4.5L6 2L8.5 4.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.5 7.5L6 10L8.5 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Sort 图标 升序\nexport const SortAscIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M8.5 7.5L6 10L3.5 7.5\"\n stroke=\"#A9A29D\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 4.5L6 2L3.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向左的箭头\nexport const LeftArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M15.8334 10H4.16675M4.16675 10L10.0001 15.8334M4.16675 10L10.0001 4.16669\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 向右的箭头\nexport const RightArrowIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <path\n d=\"M4.16675 10H15.8334M15.8334 10L10.0001 4.16669M15.8334 10L10.0001 15.8334\"\n stroke=\"currentColor\"\n strokeWidth=\"1.66667\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n// 提示信息图标\nexport const TooltipIcon: React.FC<{\n className?: string;\n style?: React.CSSProperties;\n}> = ({ className, style }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n style={style}\n >\n <g clipPath=\"url(#clip0_54_1653)\">\n <path\n d=\"M6.06 6C6.21674 5.55444 6.5261 5.17873 6.9333 4.93942C7.34051 4.7001 7.81926 4.61262 8.28479 4.69247C8.75031 4.77232 9.17255 5.01434 9.47672 5.37568C9.78089 5.73702 9.94737 6.19434 9.94667 6.66666C9.94667 8 7.94667 8.66666 7.94667 8.66666M8 11.3333H8.00667M14.6667 8C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33333 11.6819 1.33333 8C1.33333 4.3181 4.3181 1.33333 8 1.33333C11.6819 1.33333 14.6667 4.3181 14.6667 8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.33333\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_54_1653\">\n <rect width=\"16\" height=\"16\" fill=\"currentColor\" />\n </clipPath>\n </defs>\n </svg>\n);\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport Button from \"../Button\";\nimport { LeftArrowIcon, RightArrowIcon } from \"../../icons\";\n\nexport interface PaginationProps {\n current?: number;\n defaultCurrent?: number;\n total?: number;\n pageSize?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n simple?: boolean;\n disabled?: boolean;\n hideOnSinglePage?: boolean;\n className?: string;\n style?: React.CSSProperties;\n size?: \"default\" | \"small\";\n responsive?: boolean;\n showLessItems?: boolean;\n itemRender?: (\n page: number,\n type: \"page\" | \"prev\" | \"next\" | \"jump-prev\" | \"jump-next\",\n originalElement: React.ReactNode\n ) => React.ReactNode;\n}\n\nconst Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total = 0,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n showSizeChanger = false,\n pageSizeOptions = [\"10\", \"20\", \"50\", \"100\"],\n showQuickJumper = false,\n showTotal,\n onChange,\n onShowSizeChange,\n simple = false,\n disabled = false,\n hideOnSinglePage = false,\n className = \"\",\n style,\n size = \"default\",\n responsive = false,\n showLessItems = false,\n itemRender,\n}) => {\n const { primaryColor = \"#FB6011\" } = useTheme();\n const [internalCurrent, setInternalCurrent] = useState(defaultCurrent);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const [jumpToPage, setJumpToPage] = useState(\"\");\n\n const current = controlledCurrent ?? internalCurrent;\n const pageSize = controlledPageSize ?? internalPageSize;\n\n const totalPages = useMemo(\n () => Math.ceil(total / pageSize),\n [total, pageSize]\n );\n\n useEffect(() => {\n if (controlledCurrent !== undefined) {\n setInternalCurrent(controlledCurrent);\n }\n }, [controlledCurrent]);\n\n useEffect(() => {\n if (controlledPageSize !== undefined) {\n setInternalPageSize(controlledPageSize);\n }\n }, [controlledPageSize]);\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || page === current || disabled) return;\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page);\n }\n onChange?.(page, pageSize);\n };\n\n const handlePageSizeChange = (newPageSize: number) => {\n const newTotalPages = Math.ceil(total / newPageSize);\n const newCurrent = current > newTotalPages ? newTotalPages : current;\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newPageSize);\n }\n if (controlledCurrent === undefined) {\n setInternalCurrent(newCurrent);\n }\n\n onShowSizeChange?.(newCurrent, newPageSize);\n onChange?.(newCurrent, newPageSize);\n };\n\n const handleJumpTo = () => {\n const page = parseInt(jumpToPage, 10);\n if (page >= 1 && page <= totalPages) {\n handlePageChange(page);\n setJumpToPage(\"\");\n }\n };\n\n const getPageNumbers = (): (number | string)[] => {\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const pages: (number | string)[] = [];\n\n if (current <= 4) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n } else if (current >= totalPages - 3) {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n pages.push(\"jump-prev\");\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push(\"jump-next\");\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n const renderItem = (\n item: number | string,\n index: number\n ): React.ReactNode => {\n if (typeof item === \"number\") {\n const isActive = item === current;\n const element = (\n <Button\n key={item}\n onClick={() => handlePageChange(item)}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n fontWeight: isActive ? 500 : 400,\n border: \"none\",\n background: isActive ? \"#FAFAF9\" : \"white\",\n backgroundColor: isActive ? \"#FAFAF9\" : \"white\",\n color: isActive ? primaryColor : \"#79716B\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {item}\n </Button>\n );\n\n return itemRender ? itemRender(item, \"page\", element) : element;\n }\n\n if (item === \"jump-prev\") {\n const element = (\n <Button\n key=\"jump-prev\"\n onClick={() => handlePageChange(Math.max(1, current - 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current - 5, \"jump-prev\", element)\n : element;\n }\n\n if (item === \"jump-next\") {\n const element = (\n <Button\n key=\"jump-next\"\n onClick={() => handlePageChange(Math.min(totalPages, current + 5))}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n minWidth: size === \"small\" ? \"32px\" : \"36px\",\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n margin: 0,\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n •••\n </Button>\n );\n\n return itemRender\n ? itemRender(current + 5, \"jump-next\", element)\n : element;\n }\n\n return null;\n };\n\n if (hideOnSinglePage && totalPages <= 1) {\n return null;\n }\n\n if (simple) {\n return (\n <div\n className={`aha-pagination aha-pagination-simple ${className}`}\n style={style}\n >\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginRight: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 上一页\n </Button>\n <span\n style={{\n margin: \"0 8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {current} / {totalPages}\n </span>\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n marginLeft: \"8px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 下一页\n </Button>\n </div>\n );\n }\n\n const start = (current - 1) * pageSize + 1;\n const end = Math.min(current * pageSize, total);\n\n return (\n <div\n className={`aha-pagination w-full ${className}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: responsive ? \"wrap\" : \"nowrap\",\n fontFamily: \"DM Sans, sans-serif\",\n ...style,\n }}\n >\n {showTotal && (\n <div className=\"justify-start text-Text-text-secondary text-sm font-medium font-['DM_Sans'] leading-5\">\n {showTotal(total, [start, end])}\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {itemRender ? (\n itemRender(\n current - 1,\n \"prev\",\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <LeftArrowIcon /> <span>Previous</span>\n </div>\n </Button>\n )}\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 0 }}>\n {getPageNumbers().map((item, index) => renderItem(item, index))}\n </div>\n\n {itemRender ? (\n itemRender(\n current + 1,\n \"next\",\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )\n ) : (\n <Button\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n height: size === \"small\" ? \"32px\" : \"36px\",\n padding: \"0 12px\",\n gap: \"4px\",\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n <div className=\"flex items-center gap-1\">\n <span>Next</span> <RightArrowIcon />\n </div>\n </Button>\n )}\n\n {showSizeChanger && (\n <select\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n style={{\n padding: size === \"small\" ? \"6px 12px\" : \"8px 12px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: size === \"small\" ? \"12px\" : \"14px\",\n lineHeight: size === \"small\" ? \"18px\" : \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n backgroundColor: \"white\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.borderColor = primaryColor;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} 条/页\n </option>\n ))}\n </select>\n )}\n\n {showQuickJumper && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 跳至\n </span>\n <input\n type=\"number\"\n min=\"1\"\n value={jumpToPage}\n onChange={(e) => setJumpToPage(e.target.value)}\n onKeyPress={(e) => e.key === \"Enter\" && handleJumpTo()}\n disabled={disabled}\n style={{\n width: \"56px\",\n height: size === \"small\" ? \"28px\" : \"36px\",\n padding: \"0 8px\",\n border: \"1px solid #EAECF0\",\n borderRadius: \"8px\",\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#101828\",\n fontFamily: \"DM Sans, sans-serif\",\n outline: \"none\",\n transition: \"all 0.2s\",\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = primaryColor;\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"#EAECF0\";\n }}\n />\n <span\n style={{\n fontSize: \"14px\",\n lineHeight: \"20px\",\n color: \"#475467\",\n }}\n >\n 页\n </span>\n {typeof showQuickJumper === \"object\" && showQuickJumper.goButton ? (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n {showQuickJumper.goButton}\n </Button>\n ) : (\n <Button\n onClick={handleJumpTo}\n disabled={disabled}\n type=\"default\"\n size={size === \"default\" ? \"medium\" : \"small\"}\n style={{\n border: \"1px solid #EAECF0\",\n boxShadow: \"none\",\n borderRadius: \"8px\",\n }}\n >\n 确定\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Pagination;\n","import React from 'react';\nimport { CheckIcon, MinusIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface CheckboxProps {\n checked?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n}) => {\n const { primaryColor } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked },\n currentTarget: { checked: !checked },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const isChecked = checked || indeterminate;\n const backgroundColor = disabled\n ? '#FAFAF9'\n : isChecked\n ? primaryColor\n : 'white';\n const borderColor = disabled ? '#FAFAF9' : isChecked ? primaryColor : '#D7D3D0';\n\n return (\n <div\n className={`aha-checkbox ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '4px', // spacing-sm 通常是 4px\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '14px',\n height: '14px',\n opacity: isChecked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n }}\n >\n {indeterminate ? (\n <MinusIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n ) : (\n <CheckIcon style={{ width: '14px', height: '14px', display: 'block' }} />\n )}\n </div>\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"checkbox\"\n checked={checked}\n ref={(el) => {\n if (el) el.indeterminate = indeterminate;\n }}\n onChange={onChange}\n disabled={disabled}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport default Checkbox;\n\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\nimport Pagination from '../Pagination';\nimport Checkbox from '../Checkbox';\nimport { SortIcon, SortDescIcon, SortAscIcon } from '../../icons';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// ==================== 类型定义 ====================\n\nexport type SortOrder = 'ascend' | 'descend' | null;\nexport type TableSize = 'small' | 'middle' | 'large';\nexport type TableLayout = 'auto' | 'fixed';\n\nexport interface SorterResult<T = any> {\n column?: ColumnType<T>;\n order?: SortOrder;\n field?: string | string[];\n columnKey?: string | string[];\n}\n\nexport interface TableCurrentDataSource<T = any> {\n currentDataSource: T[];\n action: 'paginate' | 'sort';\n}\n\nexport interface SelectionItem {\n key: string | number;\n text: React.ReactNode;\n onSelect?: (changeableRowKeys: (string | number)[]) => void;\n}\n\nexport interface TableRowSelection<T = any> {\n type?: 'checkbox' | 'radio';\n selectedRowKeys?: (string | number)[];\n defaultSelectedRowKeys?: (string | number)[];\n onChange?: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n onSelect?: (record: T, selected: boolean, selectedRows: T[], nativeEvent: Event) => void;\n onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => void;\n onSelectInvert?: (selectedRowKeys: (string | number)[]) => void;\n onSelectNone?: () => void;\n getCheckboxProps?: (record: T) => {\n disabled?: boolean;\n name?: string;\n };\n hideSelectAll?: boolean;\n fixed?: boolean | 'left' | 'right';\n columnWidth?: string | number;\n columnTitle?: string | React.ReactNode;\n checkStrictly?: boolean;\n preserveSelectedRowKeys?: boolean;\n renderCell?: (checked: boolean, record: T, index: number, node: React.ReactNode) => React.ReactNode;\n}\n\nexport interface ColumnType<T = any> {\n title?: React.ReactNode | ((props: { sortOrder?: SortOrder; sortColumn?: ColumnType<T> }) => React.ReactNode);\n key?: string;\n dataIndex?: string | string[];\n align?: 'left' | 'right' | 'center';\n ellipsis?: boolean | { showTitle?: boolean };\n colSpan?: number;\n width?: string | number;\n minWidth?: string | number;\n fixed?: boolean | 'left' | 'right';\n render?: (value: any, record: T, index: number) => React.ReactNode;\n sorter?: boolean | ((a: T, b: T) => number) | { compare?: (a: T, b: T) => number; multiple?: number };\n sortOrder?: SortOrder | SortOrder[];\n defaultSortOrder?: SortOrder;\n onCell?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableCellElement>;\n onHeaderCell?: (column: ColumnType<T>) => React.HTMLAttributes<HTMLTableCellElement>;\n className?: string;\n children?: ColumnType<T>[];\n onSorterChange?: (sorter: SorterResult<T>) => void;\n rowSpan?: number;\n rowScope?: 'row' | 'col' | 'rowgroup' | 'colgroup';\n}\n\nexport interface TableProps<T = any> {\n columns?: ColumnType<T>[];\n dataSource?: T[];\n rowKey?: string | ((record: T) => string | number);\n rowSelection?: TableRowSelection<T>;\n pagination?: false | {\n current?: number;\n pageSize?: number;\n total?: number;\n defaultCurrent?: number;\n defaultPageSize?: number;\n showSizeChanger?: boolean;\n pageSizeOptions?: string[];\n showQuickJumper?: boolean | { goButton?: React.ReactNode };\n showTotal?: (total: number, range: [number, number]) => React.ReactNode;\n onChange?: (page: number, pageSize?: number) => void;\n onShowSizeChange?: (current: number, size: number) => void;\n position?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n simple?: boolean;\n responsive?: boolean;\n };\n size?: TableSize;\n bordered?: boolean;\n loading?: boolean | React.ReactNode;\n locale?: {\n emptyText?: React.ReactNode | (() => React.ReactNode);\n selectAll?: React.ReactNode;\n selectInvert?: React.ReactNode;\n selectNone?: React.ReactNode;\n selectionAll?: React.ReactNode;\n sortTitle?: string;\n expand?: string;\n collapse?: string;\n triggerDesc?: string;\n triggerAsc?: string;\n cancelSort?: string;\n };\n showHeader?: boolean;\n title?: (currentData: T[]) => React.ReactNode;\n footer?: (currentData: T[]) => React.ReactNode;\n summary?: (currentData: T[]) => React.ReactNode;\n scroll?: {\n x?: number | string | true;\n y?: number | string;\n scrollToFirstRowOnChange?: boolean;\n };\n tableLayout?: TableLayout;\n onChange?: (pagination: any, filters: Record<string, any>, sorter: SorterResult<T> | SorterResult<T>[], extra: TableCurrentDataSource<T>) => void;\n onSorterChange?: (sorter: SorterResult<T> | SorterResult<T>[]) => void;\n onPaginationChange?: (page: number, pageSize: number) => void;\n onRow?: (record: T, index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n expandable?: {\n expandedRowKeys?: (string | number)[];\n defaultExpandedRowKeys?: (string | number)[];\n expandedRowRender?: (record: T, index: number, indent: number, expanded: boolean) => React.ReactNode;\n expandRowByClick?: boolean;\n onExpand?: (expanded: boolean, record: T) => void;\n onExpandedRowsChange?: (expandedKeys: (string | number)[]) => void;\n defaultExpandAllRows?: boolean;\n indentSize?: number;\n expandIcon?: (props: { expanded: boolean; onExpand: (record: T, e: React.MouseEvent<HTMLElement>) => void; record: T }) => React.ReactNode;\n rowExpandable?: (record: T) => boolean;\n };\n indentSize?: number;\n rowClassName?: string | ((record: T, index: number) => string);\n onHeaderRow?: (columns: ColumnType<T>[], index?: number) => React.HTMLAttributes<HTMLTableRowElement>;\n components?: {\n header?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n body?: {\n cell?: React.ComponentType<any>;\n row?: React.ComponentType<any>;\n wrapper?: React.ComponentType<any>;\n };\n };\n sticky?: boolean | { offsetHeader?: number; offsetScroll?: number; getContainer?: () => HTMLElement };\n}\n\n// ==================== 工具函数 ====================\n\nconst getValue = (obj: any, path: string | string[]): any => {\n if (typeof path === 'string') {\n return obj?.[path];\n }\n return path.reduce((acc, key) => acc?.[key], obj);\n};\n\nconst getRowKey = <T,>(record: T, rowKey?: string | ((record: T) => string | number)): string | number => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n if (typeof rowKey === 'string') {\n return getValue(record, rowKey) ?? '';\n }\n return (record as any).key ?? '';\n};\n\n// ==================== 默认图标 ====================\n\nconst SortIconComponent: React.FC<{ order?: SortOrder }> = ({ order }) => {\n const { primaryColor } = useTheme();\n \n if (order === 'ascend') {\n return (\n <SortAscIcon style={{ color: primaryColor }}/>\n );\n }\n if (order === 'descend') {\n return (\n <SortDescIcon style={{ color: primaryColor }}/>\n );\n }\n return (\n <SortIcon/>\n );\n};\n\n\n\n// ==================== Table 组件 ====================\n\nconst Table = <T extends Record<string, any> = any>({\n columns = [],\n dataSource = [],\n rowKey = 'key',\n rowSelection,\n pagination = false,\n size = 'middle',\n bordered = false,\n loading = false,\n locale,\n showHeader = true,\n title,\n footer,\n summary,\n scroll,\n tableLayout = 'auto',\n onChange,\n onSorterChange,\n onPaginationChange,\n onRow,\n className = '',\n style,\n expandable,\n rowClassName,\n onHeaderRow,\n sticky,\n ...rest\n}: TableProps<T>) => {\n // ==================== State ====================\n const [selectedRowKeys, setSelectedRowKeys] = useState<(string | number)[]>(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || []\n );\n\n // 同步外部传入的 selectedRowKeys\n useEffect(() => {\n if (rowSelection?.selectedRowKeys !== undefined) {\n setSelectedRowKeys(rowSelection.selectedRowKeys);\n }\n }, [rowSelection?.selectedRowKeys]);\n const [sorters, setSorters] = useState<Map<string, SortOrder>>(new Map());\n const [expandedRowKeys, setExpandedRowKeys] = useState<(string | number)[]>(\n expandable?.defaultExpandedRowKeys || []\n );\n const [currentPage, setCurrentPage] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.current || pagination.defaultCurrent || 1) \n : 1\n );\n const [pageSize, setPageSize] = useState(\n pagination && typeof pagination === 'object' \n ? (pagination.pageSize || pagination.defaultPageSize || 10) \n : 10\n );\n\n // 同步外部传入的 pagination\n useEffect(() => {\n if (pagination && typeof pagination === 'object') {\n if (pagination.current !== undefined) {\n setCurrentPage(pagination.current);\n }\n if (pagination.pageSize !== undefined) {\n setPageSize(pagination.pageSize);\n }\n }\n }, [pagination]);\n const [draggedRowIndex, setDraggedRowIndex] = useState<number | null>(null);\n const [dragOverRowIndex, setDragOverRowIndex] = useState<number | null>(null);\n const [isMobile, setIsMobile] = useState(false);\n const tableRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n // 检测移动端\n useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768);\n };\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // ==================== 处理行选择 ====================\n const handleSelect = useCallback((record: T, selected: boolean) => {\n // 检查是否禁用\n const checkboxProps = rowSelection?.getCheckboxProps?.(record);\n if (checkboxProps?.disabled) {\n return;\n }\n\n const key = getRowKey(record, rowKey);\n let newSelectedRowKeys: (string | number)[];\n \n if (rowSelection?.type === 'radio') {\n newSelectedRowKeys = selected ? [key] : [];\n } else {\n if (selected) {\n newSelectedRowKeys = [...selectedRowKeys, key];\n } else {\n newSelectedRowKeys = selectedRowKeys.filter(k => k !== key);\n }\n }\n\n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelect?.(record, selected, selectedRows, new Event('select'));\n }, [selectedRowKeys, rowKey, rowSelection, dataSource]);\n\n const handleSelectAll = useCallback((selected: boolean, currentPageData: T[]) => {\n // 只选择未禁用的行\n const keys = currentPageData\n .filter(d => !rowSelection?.getCheckboxProps?.(d).disabled)\n .map(d => getRowKey(d, rowKey));\n const newSelectedRowKeys = selected ? keys : [];\n \n setSelectedRowKeys(newSelectedRowKeys);\n \n const selectedRows = dataSource.filter(d => newSelectedRowKeys.includes(getRowKey(d, rowKey)));\n const changeRows = selected ? currentPageData.filter(d => !rowSelection?.getCheckboxProps?.(d).disabled) : [];\n \n rowSelection?.onChange?.(newSelectedRowKeys, selectedRows);\n rowSelection?.onSelectAll?.(selected, selectedRows, changeRows);\n }, [rowKey, rowSelection, dataSource]);\n\n // ==================== 处理排序 ====================\n const handleSort = useCallback((column: ColumnType<T>, order: SortOrder) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n if (!columnKey) return;\n\n const newSorters = new Map(sorters);\n \n if (order === null) {\n newSorters.delete(columnKey as string);\n } else {\n newSorters.set(columnKey as string, order);\n }\n\n setSorters(newSorters);\n \n // 构建排序结果数组\n const sorterArray: SorterResult<T>[] = Array.from(newSorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col || column,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n // 当前列的排序结果\n const currentSorter: SorterResult<T> = {\n column,\n order: order!,\n field: columnKey as string,\n columnKey: columnKey as string,\n };\n \n // 调用列的 onSorterChange 回调(单个列的排序变化)\n if (column.onSorterChange) {\n column.onSorterChange(currentSorter);\n }\n \n // 调用 Table 的 onSorterChange 回调(所有列的排序变化)\n if (onSorterChange) {\n onSorterChange(sorterArray.length === 1 ? sorterArray[0] : sorterArray);\n }\n \n // 触发 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n onChange(\n { current: currentPage, pageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: dataSource, action: 'sort' }\n );\n }\n }, [sorters, onChange, onSorterChange, currentPage, pageSize, dataSource, columns]);\n\n // ==================== 处理展开 ====================\n const handleExpand = useCallback((record: T, expanded: boolean) => {\n const key = getRowKey(record, rowKey);\n let newExpandedRowKeys: (string | number)[];\n \n if (expanded) {\n newExpandedRowKeys = [...expandedRowKeys, key];\n } else {\n newExpandedRowKeys = expandedRowKeys.filter(k => k !== key);\n }\n \n setExpandedRowKeys(newExpandedRowKeys);\n expandable?.onExpand?.(expanded, record);\n expandable?.onExpandedRowsChange?.(newExpandedRowKeys);\n }, [expandedRowKeys, rowKey, expandable]);\n\n // ==================== 数据处理 ====================\n const getProcessedData = useCallback((): T[] => {\n let processed = [...dataSource];\n\n // 排序\n if (sorters.size > 0) {\n processed.sort((a, b) => {\n const sorterEntries = Array.from(sorters.entries());\n for (const [columnKey, order] of sorterEntries) {\n const column = columns.find(col => {\n const colKey = col.key || (Array.isArray(col.dataIndex) ? col.dataIndex.join('.') : col.dataIndex);\n return colKey === columnKey;\n });\n \n if (!column) continue;\n \n let compareResult = 0;\n \n if (typeof column.sorter === 'function') {\n compareResult = column.sorter(a, b);\n } else if (column.sorter === true) {\n const aVal = getValue(a, column.dataIndex || columnKey);\n const bVal = getValue(b, column.dataIndex || columnKey);\n if (aVal < bVal) compareResult = -1;\n else if (aVal > bVal) compareResult = 1;\n }\n \n if (compareResult !== 0) {\n return order === 'ascend' ? compareResult : -compareResult;\n }\n }\n return 0;\n });\n }\n\n return processed;\n }, [dataSource, sorters, columns]);\n\n const processedData = getProcessedData();\n\n // ==================== 分页处理 ====================\n const paginatedData = useMemo(() => {\n if (pagination === false || !pagination) return processedData;\n \n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return processedData.slice(start, end);\n }, [processedData, currentPage, pageSize, pagination]);\n\n const handlePageChange = useCallback((page: number, size?: number) => {\n const newPageSize = size ?? pageSize;\n setCurrentPage(page);\n if (size) setPageSize(size);\n \n // 调用 Table 的 onPaginationChange 回调(专门用于分页变化)\n if (onPaginationChange) {\n onPaginationChange(page, newPageSize);\n }\n \n // 调用 pagination 内部的回调(保持向后兼容)\n if (pagination && typeof pagination === 'object') {\n pagination.onChange?.(page, size);\n if (size) pagination.onShowSizeChange?.(page, size);\n }\n \n // 触发 Table 的 onChange(综合回调,包含分页、筛选、排序)\n if (onChange) {\n const sorterArray: SorterResult<T>[] = Array.from(sorters.entries()).map(([key, order]) => {\n const col = columns.find(c => {\n const cKey = c.key || (Array.isArray(c.dataIndex) ? c.dataIndex.join('.') : c.dataIndex);\n return cKey === key;\n });\n return {\n column: col,\n order: order!,\n field: key,\n columnKey: key,\n };\n });\n \n onChange(\n { current: page, pageSize: newPageSize },\n {},\n sorterArray.length === 1 ? sorterArray[0] : sorterArray,\n { currentDataSource: processedData, action: 'paginate' }\n );\n }\n }, [pagination, onPaginationChange, onChange, pageSize, sorters, columns, processedData]);\n\n // ==================== 渲染单元格 ====================\n const renderCell = useCallback((column: ColumnType<T>, record: T, index: number): React.ReactNode => {\n const value = getValue(record, column.dataIndex || '');\n \n if (column.render) {\n return column.render(value, record, index);\n }\n \n return value;\n }, []);\n\n // ==================== 计算固定列的偏移量 ====================\n const getFixedOffset = useCallback((columnIndex: number, fixed: 'left' | 'right' | boolean | undefined, isHeader: boolean = false) => {\n if (!fixed) return undefined;\n \n const fixedDirection = fixed === true ? 'left' : fixed;\n let offset = 0;\n \n if (fixedDirection === 'left') {\n // 计算左侧固定列的偏移量\n // 如果有行选择且固定在左侧,先加上选择列的宽度\n if (rowSelection && (rowSelection.fixed === 'left' || rowSelection.fixed === true)) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n // 然后加上前面所有左侧固定列的宽度\n for (let i = 0; i < columnIndex; i++) {\n const col = columns[i];\n if (col.fixed === 'left' || col.fixed === true) {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n return offset;\n } else if (fixedDirection === 'right') {\n // 计算右侧固定列的偏移量\n for (let i = columnIndex + 1; i < columns.length; i++) {\n const col = columns[i];\n if (col.fixed === 'right') {\n const colWidth = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(col.width as string) || 0)\n : 150; // 默认宽度\n offset += colWidth;\n }\n }\n // 如果有行选择且固定在右侧,需要加上选择列的宽度\n if (rowSelection && rowSelection.fixed === 'right') {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? rowSelection.columnWidth \n : (typeof rowSelection.columnWidth === 'string' ? parseInt(rowSelection.columnWidth) : 60);\n offset += selectWidth;\n }\n return offset;\n }\n \n return undefined;\n }, [columns, rowSelection]);\n\n // ==================== 渲染表头 ====================\n const renderHeader = useCallback(() => {\n if (!showHeader) return null;\n\n const headerColumns = columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const sortOrder = sorters.get(columnKey as string) || null;\n const fixedOffset = getFixedOffset(colIndex, column.fixed, true);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n\n return (\n <th\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: column.fixed ? '#F9FAFB' : '#F9FAFB',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '12px 16px',\n textAlign: column.align || 'left',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n }}\n {...(column.onHeaderCell?.(column) || {})}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n justifyContent: column.align === 'right' ? 'flex-end' : column.align === 'center' ? 'center' : 'flex-start',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '12px', lineHeight: '18px', color: '#475467' }}>\n {typeof column.title === 'function' ? column.title({ sortOrder, sortColumn: column }) : column.title}\n </span>\n {column.sorter && (\n <button\n onClick={() => {\n const nextOrder = sortOrder === null ? 'ascend' : sortOrder === 'ascend' ? 'descend' : null;\n handleSort(column, nextOrder);\n }}\n style={{\n border: 'none',\n background: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n padding: '2px',\n color: sortOrder ? '#475467' : '#98A2B3',\n }}\n >\n <SortIconComponent order={sortOrder || undefined} />\n </button>\n )}\n </div>\n </th>\n );\n });\n\n // 如果有行选择,添加选择列\n if (rowSelection) {\n const selectWidth = typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px');\n const selectColumn = (\n <th\n key=\"selection\"\n style={{\n width: selectWidth,\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: '#F9FAFB',\n padding: '12px 16px',\n borderBottom: '1px solid #EAECF0',\n fontWeight: 600,\n fontSize: '12px',\n lineHeight: '18px',\n color: '#475467',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {!rowSelection.hideSelectAll && rowSelection.type !== 'radio' && (() => {\n const enabledRows = paginatedData.filter(d => !rowSelection.getCheckboxProps?.(d).disabled);\n const enabledKeys = enabledRows.map(d => getRowKey(d, rowKey));\n const allSelected = enabledRows.length > 0 && enabledKeys.every(key => selectedRowKeys.includes(key));\n const someSelected = enabledKeys.some(key => selectedRowKeys.includes(key));\n \n return (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected && !allSelected}\n onChange={(e) => handleSelectAll(e.target.checked, paginatedData)}\n />\n );\n })()}\n {rowSelection.columnTitle && <span style={{ marginLeft: rowSelection.hideSelectAll ? 0 : '8px' }}>{rowSelection.columnTitle}</span>}\n </div>\n </th>\n );\n headerColumns.unshift(selectColumn);\n }\n\n const headerRowProps = onHeaderRow?.(columns, 0);\n \n return (\n <thead ref={headerRef}>\n <tr {...(headerRowProps || {})}>{headerColumns}</tr>\n </thead>\n );\n }, [columns, showHeader, sorters, rowSelection, selectedRowKeys, paginatedData, rowKey, handleSort, handleSelectAll, locale, onHeaderRow, getFixedOffset]);\n\n // ==================== 拖拽排序处理 ====================\n const handleDragStart = useCallback((index: number) => {\n setDraggedRowIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDragOverRowIndex(index);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n if (draggedRowIndex === null || draggedRowIndex === dropIndex) {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n return;\n }\n\n const newData = [...paginatedData];\n const draggedItem = newData[draggedRowIndex];\n newData.splice(draggedRowIndex, 1);\n newData.splice(dropIndex, 0, draggedItem);\n\n // 这里可以触发 onChange 回调,让外部处理数据更新\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, [draggedRowIndex, paginatedData]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowIndex(null);\n setDragOverRowIndex(null);\n }, []);\n\n // ==================== 渲染表格行 ====================\n const renderRows = useCallback(() => {\n return paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n const isExpanded = expandedRowKeys.includes(key);\n const rowProps = onRow?.(record, index) || {};\n const isLastRow = index === paginatedData.length - 1;\n\n return (\n <React.Fragment key={key}>\n <tr\n className={`${typeof rowClassName === 'function' ? rowClassName(record, index) : rowClassName || ''} ${draggedRowIndex === index ? 'dragging' : ''} ${dragOverRowIndex === index ? 'drag-over' : ''}`}\n draggable={true}\n onDragStart={() => handleDragStart(index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n style={{\n cursor: 'move',\n opacity: draggedRowIndex === index ? 0.5 : 1,\n backgroundColor: dragOverRowIndex === index ? '#F9FAFB' : 'white',\n transition: 'background-color 0.2s',\n ...rowProps.style,\n }}\n onMouseEnter={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n if (draggedRowIndex !== index && dragOverRowIndex !== index) {\n e.currentTarget.style.backgroundColor = 'white';\n }\n }}\n {...rowProps}\n >\n {rowSelection && (\n <td\n style={{\n width: typeof rowSelection.columnWidth === 'number' \n ? `${rowSelection.columnWidth}px` \n : (typeof rowSelection.columnWidth === 'string' ? rowSelection.columnWidth : '60px'),\n position: rowSelection.fixed ? 'sticky' : 'relative',\n left: rowSelection.fixed === 'left' || rowSelection.fixed === true ? '0px' : undefined,\n right: rowSelection.fixed === 'right' ? '0px' : undefined,\n zIndex: rowSelection.fixed ? (rowSelection.fixed === 'left' || rowSelection.fixed === true ? 12 : 11) : 1,\n backgroundColor: 'white',\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n textAlign: 'center',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n </td>\n )}\n {columns.map((column, colIndex) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex) || colIndex;\n const cellProps = column.onCell?.(record, index) || {};\n const fixedOffset = getFixedOffset(colIndex, column.fixed, false);\n const columnWidth = column.width \n ? (typeof column.width === 'number' ? `${column.width}px` : column.width)\n : undefined;\n \n return (\n <td\n key={columnKey}\n className={`${column.className || ''} ${column.align ? `text-${column.align}` : ''}`}\n style={{\n width: columnWidth,\n minWidth: column.minWidth ? (typeof column.minWidth === 'number' ? `${column.minWidth}px` : column.minWidth) : (columnWidth || undefined),\n maxWidth: columnWidth,\n position: column.fixed ? 'sticky' : 'relative',\n left: column.fixed === 'left' || column.fixed === true ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n right: column.fixed === 'right' ? (fixedOffset !== undefined ? `${fixedOffset}px` : '0') : undefined,\n zIndex: column.fixed ? (column.fixed === 'left' || column.fixed === true ? 10 : 9) : 1,\n backgroundColor: 'white',\n boxShadow: column.fixed === 'left' || column.fixed === true \n ? '2px 0 4px rgba(0, 0, 0, 0.05)' \n : column.fixed === 'right' \n ? '-2px 0 4px rgba(0, 0, 0, 0.05)' \n : undefined,\n padding: '16px',\n borderBottom: isLastRow ? 'none' : '1px solid #EAECF0',\n fontSize: '14px',\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n textAlign: column.align || 'left',\n ...cellProps.style,\n }}\n colSpan={column.colSpan}\n rowSpan={column.rowSpan}\n {...cellProps}\n >\n {renderCell(column, record, index)}\n </td>\n );\n })}\n </tr>\n {expandable?.expandedRowRender && isExpanded && (\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>\n {expandable.expandedRowRender(record, index, 0, true)}\n </td>\n </tr>\n )}\n </React.Fragment>\n );\n });\n }, [paginatedData, rowKey, selectedRowKeys, expandedRowKeys, rowSelection, columns, onRow, rowClassName, handleSelect, renderCell, expandable, draggedRowIndex, dragOverRowIndex, handleDragStart, handleDragOver, handleDrop, handleDragEnd, getFixedOffset]);\n\n // ==================== 渲染分页 ====================\n const renderPagination = () => {\n if (pagination === false || !pagination) return null;\n \n const total = pagination.total ?? processedData.length;\n const position = pagination.position || 'bottomRight';\n \n return (\n <div\n style={{\n marginTop: '16px',\n display: 'flex',\n justifyContent: position.includes('Right') ? 'flex-end' : position.includes('Left') ? 'flex-start' : 'center',\n }}\n >\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n showSizeChanger={pagination.showSizeChanger}\n pageSizeOptions={pagination.pageSizeOptions}\n showQuickJumper={pagination.showQuickJumper}\n showTotal={pagination.showTotal}\n onChange={handlePageChange}\n onShowSizeChange={handlePageChange}\n simple={pagination.simple}\n responsive={pagination.responsive}\n size={size === 'small' ? 'small' : 'default'}\n />\n </div>\n );\n };\n\n // ==================== 移动端渲染 ====================\n const renderMobileView = () => {\n return (\n <div className=\"aha-table-mobile\">\n {paginatedData.map((record, index) => {\n const key = getRowKey(record, rowKey);\n const isSelected = selectedRowKeys.includes(key);\n \n return (\n <div\n key={key}\n className={`aha-table-mobile-row ${isSelected ? 'selected' : ''}`}\n style={{\n border: '1px solid #e8e8e8',\n borderRadius: '4px',\n padding: '12px',\n marginBottom: '12px',\n backgroundColor: isSelected ? '#e6f7ff' : 'white',\n }}\n >\n {rowSelection && (\n <div style={{ marginBottom: '8px' }}>\n <Checkbox\n checked={isSelected}\n onChange={(e) => handleSelect(record, e.target.checked)}\n disabled={rowSelection.getCheckboxProps?.(record).disabled}\n />\n </div>\n )}\n {columns.map((column) => {\n const columnKey = column.key || (Array.isArray(column.dataIndex) ? column.dataIndex.join('.') : column.dataIndex);\n const value = getValue(record, column.dataIndex || '');\n const displayValue = column.render ? column.render(value, record, index) : value;\n \n return (\n <div\n key={columnKey}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n paddingBottom: '8px',\n borderBottom: '1px solid #f0f0f0',\n }}\n >\n <span style={{ fontWeight: 'bold', color: '#666' }}>\n {typeof column.title === 'function' ? column.title({}) : column.title}:\n </span>\n <span style={{ flex: 1, textAlign: 'right' }}>{displayValue}</span>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n // ==================== 主渲染 ====================\n // 检查是否有固定列\n const hasFixedColumns = useMemo(() => {\n return columns.some(col => col.fixed) || (rowSelection && rowSelection.fixed);\n }, [columns, rowSelection]);\n\n // 检查是否所有列都有宽度\n const hasAllColumnWidths = useMemo(() => {\n return columns.every(col => col.width) && (!rowSelection || rowSelection.columnWidth);\n }, [columns, rowSelection]);\n\n // 计算表格总宽度\n // 只有在设置了 scroll.x 或者有固定列且需要滚动时,才使用固定宽度\n // 否则使用 100% 让表格撑满父元素\n const totalWidth = useMemo(() => {\n // 如果设置了 scroll.x,使用 scroll.x 作为表格宽度(Ant Design 的方式)\n if (scroll?.x) {\n if (typeof scroll.x === 'number') {\n return scroll.x;\n } else if (scroll.x === true) {\n // scroll.x === true 时,计算所有列的宽度总和\n const widthSum = columns.reduce((sum, col) => {\n const w = col.width \n ? (typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0)\n : 150; // 默认宽度\n return sum + w;\n }, 0);\n const total = widthSum + (rowSelection ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth || '60').replace('px', '')) || 60) : 0);\n return total;\n }\n }\n \n // 如果有固定列,需要计算最小宽度以确保固定列能正常工作\n // 但表格本身仍然使用 100% 宽度撑满父元素\n if (hasFixedColumns) {\n // 计算所有固定列的宽度总和,作为最小宽度\n const fixedWidthSum = columns.reduce((sum, col) => {\n if (col.fixed && col.width) {\n const w = typeof col.width === 'number' ? col.width : parseInt(String(col.width).replace('px', '')) || 0;\n return sum + w;\n }\n return sum;\n }, 0);\n const rowSelectionWidth = (rowSelection && rowSelection.fixed && rowSelection.columnWidth) \n ? (typeof rowSelection.columnWidth === 'number' ? rowSelection.columnWidth : parseInt(String(rowSelection.columnWidth).replace('px', '')) || 60)\n : 0;\n // 返回最小宽度,但表格宽度仍然使用 100%\n return fixedWidthSum + rowSelectionWidth;\n }\n \n // 默认返回 undefined,让表格使用 100% 宽度撑满父元素\n return undefined;\n }, [columns, scroll?.x, rowSelection, hasFixedColumns]);\n\n // 如果有固定列或所有列都有 width,使用 fixed layout\n const effectiveTableLayout = useMemo(() => {\n if (tableLayout === 'fixed') return 'fixed';\n if (hasFixedColumns) return 'fixed';\n if (hasAllColumnWidths) return 'fixed';\n // 如果有部分列设置了宽度,也使用 fixed layout,让未设置宽度的列自适应\n if (columns.some(col => col.width)) return 'fixed';\n return tableLayout;\n }, [tableLayout, hasFixedColumns, hasAllColumnWidths, columns]);\n\n const tableStyle: React.CSSProperties = {\n width: '100%', // 始终使用 100% 宽度撑满父元素\n minWidth: totalWidth ? `${totalWidth}px` : '100%', // 如果有固定列,设置最小宽度\n borderCollapse: 'separate',\n borderSpacing: 0,\n tableLayout: effectiveTableLayout,\n backgroundColor: 'white',\n borderRadius: '8px',\n border: '1px solid #EAECF0',\n };\n\n const wrapperStyle: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n maxWidth: '100%',\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n borderRadius: '8px',\n ...style,\n };\n\n // 移动端使用卡片式布局\n if (isMobile) {\n return (\n <div ref={tableRef} className={`aha-table aha-table-mobile-wrapper ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n {renderMobileView()}\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n }\n\n // 滚动容器的样式\n const scrollContainerStyle: React.CSSProperties = {\n position: 'relative',\n overflowX: (scroll?.x || hasFixedColumns) ? 'auto' : 'visible',\n overflowY: scroll?.y ? 'auto' : 'visible',\n width: '100%',\n // 关键:容器宽度必须小于表格宽度,才能触发滚动\n // 只有在设置了 scroll.x 时才限制容器宽度\n maxWidth: scroll?.x === true \n ? '100%' \n : typeof scroll?.x === 'number' \n ? `${scroll.x}px` \n : undefined,\n maxHeight: typeof scroll?.y === 'number' ? `${scroll.y}px` : undefined,\n // 确保滚动容器有明确的边界\n borderRadius: '8px',\n };\n\n return (\n <div ref={tableRef} className={`aha-table ${className}`} style={wrapperStyle} {...rest}>\n {title && <div style={{ marginBottom: '16px' }}>{title(processedData)}</div>}\n {pagination && typeof pagination === 'object' && pagination.position?.startsWith('top') && renderPagination()}\n <div style={scrollContainerStyle}>\n <div style={{ \n width: '100%', \n minWidth: totalWidth ? `${totalWidth}px` : '100%', \n display: 'block' \n }}>\n <table style={tableStyle} className={bordered ? 'bordered' : ''}>\n {renderHeader()}\n <tbody>{renderRows()}</tbody>\n {summary && (\n <tfoot>\n <tr>\n <td colSpan={columns.length + (rowSelection ? 1 : 0)}>{summary(processedData)}</td>\n </tr>\n </tfoot>\n )}\n </table>\n </div>\n </div>\n {footer && <div style={{ marginTop: '16px' }}>{footer(processedData)}</div>}\n {pagination && (typeof pagination === 'object' ? !pagination.position?.startsWith('top') : true) && renderPagination()}\n </div>\n );\n};\n\nexport default Table;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface RadioProps {\n checked?: boolean;\n disabled?: boolean;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n value?: any;\n name?: string;\n}\n\nconst Radio: React.FC<RadioProps> = ({\n checked = false,\n disabled = false,\n onChange,\n className = '',\n style,\n children,\n value,\n name,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n \n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n // 创建一个合成事件来触发 onChange\n const syntheticEvent = {\n target: { checked: !checked, value },\n currentTarget: { checked: !checked, value },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n };\n\n const backgroundColor = disabled\n ? '#FAFAF9'\n : checked\n ? primaryColor\n : 'white';\n const borderColor = disabled \n ? '#FAFAF9' \n : checked \n ? primaryColor \n : '#D7D3D0';\n\n return (\n <div\n className={`aha-radio ${className}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n ...style,\n }}\n onClick={handleClick}\n >\n <div\n style={{\n position: 'relative',\n width: '20px',\n height: '20px',\n minWidth: '20px',\n minHeight: '20px',\n borderRadius: '50%',\n border: `1px solid ${borderColor}`,\n backgroundColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s',\n flexShrink: 0,\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: '8px',\n height: '8px',\n minWidth: '8px',\n minHeight: '8px',\n borderRadius: '50%',\n backgroundColor: 'white',\n opacity: checked ? 1 : 0,\n transition: 'opacity 0.2s',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n {children && (\n <span\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: disabled ? '#98A2B3' : '#101828',\n fontFamily: 'DM Sans, sans-serif',\n }}\n >\n {children}\n </span>\n )}\n <input\n type=\"radio\"\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n value={value}\n name={name}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n />\n </div>\n );\n};\n\nRadio.displayName = 'Radio';\n\nexport default Radio;\n\n","import React, { useState, useCallback, useRef, useEffect } 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;\n label: React.ReactNode;\n icon?: React.ReactElement;\n badge?: number | string;\n customElement?: React.ReactNode;\n disabled?: boolean;\n children?: React.ReactNode; // 用于 children 模式的内容\n}\n\nexport interface TabProps {\n items: TabItem[];\n variant?: TabVariant;\n layout?: TabLayout; // 仅对 background 样式有效\n defaultValue?: string;\n value?: string;\n onChange?: (value: string) => void;\n className?: string;\n mode?: 'children' | 'value'; // children: 渲染 children,value: 只输出 value\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 ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 如果没有 items,返回空\n if (!items || items.length === 0) {\n return null;\n }\n\n // 简单的受控/非受控逻辑\n const isControlled = controlledValue !== undefined;\n const initialValue = controlledValue || defaultValue || items[0]?.key || '';\n const [internalValue, setInternalValue] = useState<string>(initialValue);\n const currentValue = isControlled ? (controlledValue || items[0]?.key || '') : internalValue;\n\n const handleTabClick = useCallback(\n (key: string, disabled?: boolean) => {\n if (disabled) return;\n if (!isControlled) {\n setInternalValue(key);\n }\n onChange?.(key);\n },\n [isControlled, onChange]\n );\n\n const activeItem = items.find((item) => item.key === currentValue);\n const activeColor = primaryColor || '#FB6011';\n \n // 用于下划线和背景滑块动画的 refs\n const tabRefs = useRef<{ [key: string]: HTMLDivElement | null }>({});\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 [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 useEffect(() => {\n // 更新下划线位置\n if (variant === 'underline' && underlineRef.current && containerRef.current) {\n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[currentValue];\n if (activeTab) {\n const containerRect = containerRef.current!.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n \n setUnderlineStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n }, 0);\n \n return () => clearTimeout(timer);\n }\n\n // 更新背景滑块位置\n if (variant === 'background' && backgroundSliderRef.current && backgroundContainerRef.current) {\n const timer = setTimeout(() => {\n const activeTab = tabRefs.current[currentValue];\n if (activeTab) {\n const containerRect = backgroundContainerRef.current!.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n const left = tabRect.left - containerRect.left;\n const width = tabRect.width;\n \n setBackgroundSliderStyle({\n width: `${width}px`,\n left: `${left}px`,\n opacity: 1,\n });\n }\n }, 0);\n \n return () => clearTimeout(timer);\n }\n }, [currentValue, variant]);\n\n // 下划线样式\n const renderUnderlineStyle = () => {\n return (\n <div\n ref={containerRef}\n className={`aha-tab aha-tab--underline ${className}`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '32px',\n borderBottom: '1px solid #E7E5E4',\n paddingBottom: '0',\n position: 'relative',\n }}\n {...rest}\n >\n {/* 动画下划线指示器 */}\n <div\n ref={underlineRef}\n style={{\n position: 'absolute',\n bottom: '-1px',\n height: '2px',\n backgroundColor: activeColor,\n borderRadius: '1px 1px 0 0',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n ...underlineStyle,\n }}\n />\n \n {items.map((item) => {\n const isActive = item.key === currentValue;\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n tabRefs.current[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 }}\n >\n {/* 图标 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: isActive ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {React.isValidElement(item.icon)\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 ? activeColor : '#79716B',\n transition: 'color 0.2s ease-in-out',\n },\n })\n : item.icon}\n </div>\n )}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? activeColor : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n // 背景边框样式\n const renderBackgroundStyle = () => {\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#FAFAF9',\n borderRadius: '8px',\n padding: '4px',\n border: '1px solid #E7E5E4',\n gap: '4px',\n position: 'relative',\n };\n\n if (layout === 'equal') {\n containerStyle.width = '100%';\n } else {\n // spaced 模式:等边距\n containerStyle.width = 'fit-content';\n }\n\n return (\n <div\n ref={backgroundContainerRef}\n className={`aha-tab aha-tab--background aha-tab--${layout} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {/* 背景滑块 */}\n <div\n ref={backgroundSliderRef}\n style={{\n position: 'absolute',\n top: '4px',\n bottom: '4px',\n borderRadius: '6px',\n backgroundColor: '#FFFFFF',\n border: 'none',\n boxShadow: '0px 1px 2px 0px rgba(10, 13, 18, 0.1)',\n transition: 'left 0.3s cubic-bezier(0.4, 0, 0.2, 1), width 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease-in-out',\n pointerEvents: 'none',\n ...backgroundSliderStyle,\n }}\n />\n \n {items.map((item) => {\n const isActive = item.key === currentValue;\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[item.key] = el;\n }}\n onClick={() => handleTabClick(item.key, item.disabled)}\n style={itemStyle}\n >\n {/* 图标 */}\n {item.icon && (\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.isValidElement(item.icon)\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 : item.icon}\n </div>\n )}\n\n {/* 标签文本 */}\n <span\n style={{\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n color: isActive ? '#44403C' : '#79716B',\n lineHeight: '1.375',\n transition: 'color 0.2s ease-in-out',\n }}\n >\n {item.label}\n </span>\n\n {/* Badge */}\n {item.badge !== undefined && item.badge !== null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: '20px',\n height: '20px',\n padding: '0 6px',\n borderRadius: '10px',\n backgroundColor: '#FAFAF9',\n border: '1px solid #E7E5E4',\n color: '#44403C',\n fontSize: '12px',\n fontWeight: 500,\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '1',\n transition: 'all 0.2s ease-in-out',\n }}\n >\n {item.badge}\n </div>\n )}\n\n {/* 自定义元素 */}\n {item.customElement}\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className=\"aha-tab-container\">\n {variant === 'underline' ? renderUnderlineStyle() : renderBackgroundStyle()}\n {mode === 'children' && activeItem?.children && (\n <div className=\"aha-tab-content\" style={{ marginTop: '24px' }}>\n {activeItem.children}\n </div>\n )}\n </div>\n );\n};\n\nexport default Tab;\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix' | 'suffix'> {\n /** 输入框大小 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 输入框前缀图标 */\n prefix?: React.ReactNode;\n /** 输入框后缀图标 */\n suffix?: React.ReactNode;\n /** 允许清除 */\n allowClear?: boolean;\n /** 清除回调 */\n onClear?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 输入框类型 */\n type?: string;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n /** 按下回车回调 */\n onPressEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = 'medium',\n disabled = false,\n error = false,\n readOnly = false,\n prefix,\n suffix,\n allowClear = false,\n onClear,\n className = '',\n style,\n type = 'text',\n placeholder,\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n onPressEnter,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(inputRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n inputRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onPressEnter) {\n onPressEnter(e);\n }\n restProps.onKeyDown?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isControlled) {\n setInternalValue('');\n }\n // 创建一个清除事件\n const syntheticEvent = {\n target: { value: '' },\n currentTarget: { value: '' },\n } as React.ChangeEvent<HTMLInputElement>;\n onChange?.(syntheticEvent);\n onClear?.();\n inputRef.current?.focus();\n };\n\n const showClear = allowClear && currentValue && !disabled;\n\n // 尺寸样式 - 高度包含边框(1px),实际内容区域需要减去上下边框(2px)\n // 字体 16px,line-height 24px,需要计算合适的 padding\n const sizeStyles = {\n small: {\n height: '32px', // 包含边框的实际高度\n paddingTop: '3px',\n paddingBottom: '3px',\n },\n mediumSmall: {\n height: '36px', // 包含边框的实际高度\n paddingTop: '5px',\n paddingBottom: '5px',\n },\n medium: {\n height: '40px', // 包含边框的实际高度\n paddingTop: '7px',\n paddingBottom: '7px',\n },\n large: {\n height: '48px', // 包含边框的实际高度\n paddingTop: '11px',\n paddingBottom: '11px',\n },\n };\n\n // 计算 padding-right\n const hasRightContent = suffix || showClear;\n const paddingRight = hasRightContent ? '40px' : '12px'; // 如果有后缀或清除按钮,右边留出空间\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md (0.5rem)\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n paddingLeft: prefix ? '40px' : '12px', // 所有情况下,如果没有前缀,padding-left 都是 12px\n paddingRight,\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n transition: 'all 0.2s',\n outline: 'none',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n MozAppearance: 'textfield', // 移除 Firefox 数字输入框的上下箭头\n appearance: 'none',\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-input-wrapper input::placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-webkit-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input::-moz-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-input-wrapper input:-ms-input-placeholder {\n color: #D7D3D0;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-input-wrapper input {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n /* 移除数字输入框的上下箭头 */\n .aha-input-wrapper input[type=\"number\"]::-webkit-inner-spin-button,\n .aha-input-wrapper input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n .aha-input-wrapper input[type=\"number\"] {\n -moz-appearance: textfield;\n }\n `;\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-input-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n }}\n >\n {prefix && (\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {prefix}\n </span>\n )}\n <input\n ref={inputRef}\n type={type}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(suffix || showClear) && (\n <span\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n }}\n >\n {showClear && <ClearIcon />}\n {suffix && <span style={{ pointerEvents: 'none' }}>{suffix}</span>}\n </span>\n )}\n </div>\n </>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport default Input;\n\n","import React, { forwardRef, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface TextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'> {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 是否只读 */\n readOnly?: boolean;\n /** 是否显示字符计数 */\n showCount?: boolean;\n /** 最大字符数 */\n maxLength?: number;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 占位符 */\n placeholder?: string;\n /** 值 */\n value?: string;\n /** 默认值 */\n defaultValue?: string;\n /** 行数 */\n rows?: number;\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** 变化回调 */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n disabled = false,\n error = false,\n readOnly = false,\n showCount = false,\n maxLength,\n className = '',\n style,\n placeholder,\n value,\n defaultValue,\n rows = 3,\n autoSize = false,\n onChange,\n onFocus,\n onBlur,\n ...restProps\n },\n ref\n ) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n defaultValue || value || ''\n );\n const [focused, setFocused] = React.useState(false);\n const [height, setHeight] = React.useState<number | undefined>(undefined);\n\n // 合并 ref\n useEffect(() => {\n if (typeof ref === 'function') {\n ref(textareaRef.current);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n textareaRef.current;\n }\n }, [ref]);\n\n // 受控/非受控处理\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const currentLength = String(currentValue || '').length;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleFocus = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(true);\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(e);\n };\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current;\n const minRows =\n typeof autoSize === 'object' ? autoSize.minRows || 1 : 1;\n const maxRows =\n typeof autoSize === 'object' ? autoSize.maxRows : undefined;\n\n // 重置高度以获取正确的 scrollHeight\n textarea.style.height = 'auto';\n const scrollHeight = textarea.scrollHeight;\n\n // 计算行高(假设每行约 22px,根据字体大小调整)\n const lineHeight = parseInt(\n window.getComputedStyle(textarea).lineHeight || '22',\n 10\n );\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n\n let newHeight = Math.max(scrollHeight, minHeight);\n if (maxHeight) {\n newHeight = Math.min(newHeight, maxHeight);\n }\n\n textarea.style.height = `${newHeight}px`;\n setHeight(newHeight);\n }\n }, [currentValue, autoSize]);\n\n const baseStyles: React.CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : focused ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : readOnly ? '#FAFAF9' : '#FFFFFF',\n color: disabled ? '#98A2B3' : '#1C1917',\n fontSize: '16px', // text-base - 至少 16px 避免 iOS Safari 自动缩放\n fontWeight: 400,\n lineHeight: '24px',\n padding: '12px 14px', // 上下 12px,左右 14px\n boxShadow: '0 1px 2px rgba(10, 13, 18, 0.05)', // #0A0D120D 5%\n transition: 'all 0.2s',\n outline: 'none',\n resize: autoSize ? 'none' : 'vertical',\n cursor: disabled ? 'not-allowed' : 'text',\n WebkitAppearance: 'none', // 移除 iOS Safari 默认样式\n appearance: 'none',\n ...(height !== undefined && autoSize ? { height: `${height}px` } : {}),\n ...style,\n };\n\n // 占位符样式通过 CSS 类名处理\n const placeholderStyles = `\n .aha-textarea-wrapper textarea::placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-webkit-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea::-moz-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n .aha-textarea-wrapper textarea:-ms-input-placeholder {\n color: #79716B;\n font-size: 16px;\n font-weight: 400;\n opacity: 1;\n }\n /* 移动端优化 */\n .aha-textarea-wrapper textarea {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n touch-action: manipulation;\n }\n `;\n\n return (\n <>\n <style>{placeholderStyles}</style>\n <div\n className={`aha-textarea-wrapper ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n flexDirection: 'column',\n width: '100%',\n }}\n >\n <textarea\n ref={textareaRef}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n rows={autoSize ? undefined : rows}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n style={baseStyles}\n autoComplete={restProps.autoComplete || 'off'}\n autoCorrect={restProps.autoCorrect || 'off'}\n autoCapitalize={restProps.autoCapitalize || 'off'}\n spellCheck={restProps.spellCheck || false}\n {...restProps}\n />\n {(showCount || maxLength) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: disabled ? '#98A2B3' : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {maxLength ? (\n <span>\n {currentLength} / {maxLength}\n </span>\n ) : (\n <span>{currentLength}</span>\n )}\n </div>\n )}\n </div>\n </>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\nexport default Textarea;\n\n","import React from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SwitchProps {\n /** 是否选中 */\n checked?: boolean;\n /** 默认是否选中 */\n defaultChecked?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 变化回调 */\n onChange?: (checked: boolean, event: React.MouseEvent) => void;\n /** 点击回调 */\n onClick?: (checked: boolean, event: React.MouseEvent) => void;\n /** 选中时的内容 */\n checkedChildren?: React.ReactNode;\n /** 非选中时的内容 */\n unCheckedChildren?: React.ReactNode;\n /** 尺寸 */\n size?: 'small' | 'default';\n /** 加载状态 */\n loading?: boolean;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n checked: controlledChecked,\n defaultChecked = false,\n disabled = false,\n onChange,\n onClick,\n checkedChildren,\n unCheckedChildren,\n size = 'default',\n loading = false,\n className = '',\n style,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || loading) return;\n\n const newChecked = !checked;\n if (!isControlled) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n // 尺寸配置\n const sizeConfig = {\n small: {\n width: '36px',\n height: '20px',\n thumbSize: '16px',\n thumbOffset: '2px',\n fontSize: '10px',\n },\n default: {\n width: '44px',\n height: '24px',\n thumbSize: '20px',\n thumbOffset: '2px',\n fontSize: '12px',\n },\n };\n\n const config = sizeConfig[size];\n const isChecked = checked || loading;\n\n // 背景色\n const backgroundColor = disabled\n ? '#E7E5E4'\n : isChecked\n ? primaryColor\n : '#F5F5F4';\n\n // 滑块位置 - 使用 left 定位更准确\n const thumbLeft = isChecked\n ? `calc(100% - ${config.thumbSize} - ${config.thumbOffset})`\n : config.thumbOffset;\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={`aha-switch ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: isChecked ? 'flex-end' : 'flex-start',\n width: config.width,\n height: config.height,\n padding: '0',\n margin: '0',\n border: 'none',\n borderRadius: size === 'small' ? '10px' : '12px', // 圆角为高度的一半\n backgroundColor,\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n outline: 'none',\n boxSizing: 'border-box',\n ...style,\n }}\n >\n {/* 内容区域 */}\n {(checkedChildren || unCheckedChildren) && (\n <span\n style={{\n position: 'absolute',\n left: isChecked ? '6px' : 'auto',\n right: isChecked ? 'auto' : '6px',\n fontSize: config.fontSize,\n lineHeight: '1',\n color: '#FFFFFF',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500,\n transition: 'opacity 0.2s',\n opacity: disabled ? 0.5 : 1,\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n {isChecked ? checkedChildren : unCheckedChildren}\n </span>\n )}\n\n {/* 滑块 */}\n <span\n style={{\n position: 'absolute',\n left: thumbLeft,\n top: '50%',\n transform: 'translateY(-50%)',\n width: config.thumbSize,\n height: config.thumbSize,\n borderRadius: '50%',\n backgroundColor: '#FFFFFF',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n transition: 'left 0.2s, background-color 0.2s',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 2,\n }}\n >\n {loading && (\n <svg\n width={size === 'small' ? '8' : '10'}\n height={size === 'small' ? '8' : '10'}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={{\n animation: 'spin 1s linear infinite',\n }}\n >\n <style>\n {`\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"32\"\n opacity=\"0.3\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"24\"\n />\n </svg>\n )}\n </span>\n </button>\n );\n};\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface SelectOption {\n label: React.ReactNode;\n value: string | number;\n disabled?: boolean;\n [key: string]: any;\n}\n\nexport interface SelectProps {\n /** 当前选中的值 */\n value?: string | number | (string | number)[];\n /** 默认选中的值 */\n defaultValue?: string | number | (string | number)[];\n /** 选项数据 */\n options?: SelectOption[];\n /** 是否支持多选 */\n mode?: 'multiple' | 'tags';\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符 */\n placeholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否可搜索 */\n showSearch?: boolean;\n /** 搜索过滤函数 */\n filterOption?: boolean | ((input: string, option: SelectOption) => boolean);\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 变化回调 */\n onChange?: (\n value: string | number | (string | number)[],\n option: SelectOption | SelectOption[]\n ) => void;\n /** 选择回调 */\n onSelect?: (value: string | number, option: SelectOption) => void;\n /** 取消选择回调 */\n onDeselect?: (value: string | number, option: SelectOption) => void;\n /** 搜索回调 */\n onSearch?: (value: string) => void;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onDropdownVisibleChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最大标签数量 */\n maxTagCount?: number | 'responsive';\n /** 标签渲染函数 */\n tagRender?: (props: {\n label: React.ReactNode;\n value: string | number;\n closable: boolean;\n onClose: () => void;\n }) => React.ReactNode;\n /** 选项渲染函数 */\n optionRender?: (option: SelectOption, info: {\n selected: boolean;\n focused: boolean;\n disabled: boolean;\n }) => React.ReactNode;\n}\n\nconst Select: React.FC<SelectProps> = ({\n value: controlledValue,\n defaultValue,\n options = [],\n mode,\n disabled = false,\n error = false,\n placeholder = 'Please select',\n size = 'medium',\n showSearch = false,\n filterOption = true,\n allowClear = false,\n onChange,\n onSelect,\n onDeselect,\n onSearch,\n onFocus,\n onBlur,\n onDropdownVisibleChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n maxTagCount,\n tagRender,\n optionRender,\n}) => {\n const { primaryColor = '#FB6011' } = useTheme();\n const [internalValue, setInternalValue] = useState<\n string | number | (string | number)[] | undefined\n >(defaultValue !== undefined ? defaultValue : (mode ? [] : undefined));\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [searchValue, setSearchValue] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n const selectRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n\n const isControlled = controlledValue !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n const currentValue = isControlled ? controlledValue : internalValue;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n // 获取选中的选项\n const getSelectedOptions = useCallback((): SelectOption[] => {\n if (!currentValue) return [];\n const values = Array.isArray(currentValue) ? currentValue : [currentValue];\n return options.filter((opt) => values.includes(opt.value));\n }, [currentValue, options]);\n\n // 过滤选项\n const getFilteredOptions = useCallback((): SelectOption[] => {\n if (!showSearch || !searchValue) return options;\n\n if (filterOption === false) return options;\n\n if (typeof filterOption === 'function') {\n return options.filter((opt) => filterOption(searchValue, opt));\n }\n\n // 默认过滤:匹配 label\n return options.filter((opt) => {\n const label = String(opt.label || '').toLowerCase();\n const search = searchValue.toLowerCase();\n return label.includes(search);\n });\n }, [options, searchValue, showSearch, filterOption]);\n\n const filteredOptions = useMemo(() => getFilteredOptions(), [getFilteredOptions]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const updatePosition = () => {\n if (selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownPosition({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n });\n }\n };\n\n updatePosition();\n\n // 监听窗口大小变化和滚动,更新位置\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n } else {\n setDropdownPosition(null);\n }\n }, [isOpen]);\n\n // 点击外部关闭(支持鼠标和触摸事件)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n if (\n selectRef.current &&\n !selectRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n }\n };\n\n if (isOpen) {\n // 使用 capture 阶段确保能捕获到事件\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onDropdownVisibleChange]);\n\n // 键盘导航\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex((prev) => (prev > 0 ? prev - 1 : 0));\n } else if (e.key === 'Enter' && focusedIndex >= 0) {\n e.preventDefault();\n const option = filteredOptions[focusedIndex];\n if (option && !option.disabled) {\n handleSelect(option);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n selectRef.current?.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, filteredOptions, focusedIndex, isOpenControlled, onDropdownVisibleChange]);\n\n // 滚动到聚焦项\n useEffect(() => {\n if (focusedIndex >= 0 && dropdownRef.current) {\n const items = dropdownRef.current.querySelectorAll('.aha-select-option');\n const focusedItem = items[focusedIndex] as HTMLElement;\n if (focusedItem) {\n focusedItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n }, [focusedIndex]);\n\n const handleSelect = useCallback((option: SelectOption) => {\n if (option.disabled) return;\n\n if (isMultiple) {\n const currentValues = Array.isArray(currentValue) ? currentValue : [];\n const isSelected = currentValues.includes(option.value);\n\n let newValues: (string | number)[];\n if (isSelected) {\n newValues = currentValues.filter((v) => v !== option.value);\n onDeselect?.(option.value, option);\n } else {\n newValues = [...currentValues, option.value];\n onSelect?.(option.value, option);\n }\n\n if (!isControlled) {\n setInternalValue(newValues);\n }\n // 计算选中的选项\n const selectedOptions = options.filter((opt) => newValues.includes(opt.value));\n onChange?.(newValues, selectedOptions);\n } else {\n if (!isControlled) {\n setInternalValue(option.value);\n }\n onChange?.(option.value, option);\n onSelect?.(option.value, option);\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onDropdownVisibleChange?.(false);\n setSearchValue('');\n selectRef.current?.focus();\n }\n }, [isMultiple, currentValue, isControlled, isOpenControlled, options, onChange, onSelect, onDeselect, onDropdownVisibleChange]);\n\n const handleRemoveTag = useCallback((e: React.MouseEvent, value: string | number) => {\n e.stopPropagation();\n if (isMultiple && Array.isArray(currentValue)) {\n const newValues = currentValue.filter((v) => v !== value);\n const option = options.find((opt) => opt.value === value);\n if (!isControlled) {\n setInternalValue(newValues);\n }\n onChange?.(newValues, getSelectedOptions());\n onDeselect?.(value, option!);\n }\n }, [isMultiple, currentValue, isControlled, options, onChange, onDeselect, getSelectedOptions]);\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n const newValue: string | number | (string | number)[] | undefined = isMultiple ? [] : undefined;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue as any, []);\n setSearchValue('');\n };\n\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onDropdownVisibleChange?.(newOpen);\n if (newOpen && showSearch) {\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n } else {\n setSearchValue('');\n }\n };\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchValue(val);\n onSearch?.(val);\n setFocusedIndex(-1);\n };\n\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 尺寸样式 - 对齐 Input 组件\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const selectedOptions = useMemo(() => getSelectedOptions(), [getSelectedOptions]);\n const showClear = useMemo(() => allowClear && currentValue && !disabled, [allowClear, currentValue, disabled]);\n const hasValue = useMemo(() => \n isMultiple\n ? Array.isArray(currentValue) && currentValue.length > 0\n : currentValue !== undefined && currentValue !== null && currentValue !== '',\n [isMultiple, currentValue]\n );\n\n // 渲染标签 - 使用 useMemo 优化\n const renderTags = useMemo(() => {\n if (!isMultiple || !Array.isArray(currentValue) || currentValue.length === 0) {\n return null;\n }\n\n const tagsToShow =\n maxTagCount === 'responsive'\n ? selectedOptions.slice(0, 2) // 简化处理\n : maxTagCount\n ? selectedOptions.slice(0, maxTagCount)\n : selectedOptions;\n\n const remainingCount =\n maxTagCount && selectedOptions.length > tagsToShow.length\n ? selectedOptions.length - tagsToShow.length\n : 0;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '4px',\n flex: 1,\n minWidth: 0,\n }}\n >\n {tagsToShow.map((option) => {\n const tagProps = {\n label: option.label,\n value: option.value,\n closable: !disabled,\n onClose: () => handleRemoveTag({} as any, option.value),\n };\n\n if (tagRender) {\n return <React.Fragment key={option.value}>{tagRender(tagProps)}</React.Fragment>;\n }\n\n return (\n <span\n key={option.value}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n backgroundColor: '#F5F5F4',\n borderRadius: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#101828',\n fontFamily: \"DM Sans, sans-serif\",\n maxWidth: '100%',\n }}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {option.label}\n </span>\n {!disabled && (\n <span\n onClick={(e) => handleRemoveTag(e, option.value)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n color: '#78716C',\n marginLeft: '4px',\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 3L3 9M3 3L9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n })}\n {remainingCount > 0 && (\n <span\n style={{\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n }, [isMultiple, currentValue, selectedOptions, maxTagCount, disabled, tagRender]);\n\n // 下拉箭头图标\n const ArrowIcon = ({ isOpen: open }: { isOpen: boolean }) => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease-in-out',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"#78716C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉框动画样式\n const dropdownAnimationStyles = `\n @keyframes dropdownFadeIn {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n `;\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={selectRef}\n className={`aha-select ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n width: '100%',\n minWidth: '120px',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px', // rounded-md\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '12px',\n paddingRight: '36px', // 为箭头和清除按钮留出空间(箭头16px + 右边距12px + 清除按钮8px)\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent', // 移动端移除点击高亮\n WebkitTouchCallout: 'none', // 禁用长按菜单\n touchAction: 'manipulation', // 优化触摸响应\n userSelect: 'none', // 禁用文本选择\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={(e) => {\n // 移动端触摸优化\n if (!disabled) {\n e.currentTarget.style.opacity = '0.8';\n }\n }}\n onTouchEnd={(e) => {\n e.currentTarget.style.opacity = '1';\n }}\n tabIndex={disabled ? -1 : 0}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n minWidth: 0,\n gap: '8px',\n }}\n >\n {isMultiple ? (\n (renderTags || (placeholder ? (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n }}\n >\n {placeholder}\n </span>\n ) : (\n <span style={{ flex: 1, minHeight: '24px' }} />\n )))) : showSearch && isOpen ? (\n <input\n ref={inputRef}\n type=\"text\"\n value={searchValue}\n onChange={handleSearch}\n onClick={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px', // 至少 16px 避免 iOS Safari 自动缩放\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n placeholder={hasValue ? undefined : placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n ) : (\n <span\n style={{\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: hasValue\n ? disabled\n ? '#98A2B3'\n : '#1C1917'\n : '#79716B',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n minHeight: '24px',\n display: 'inline-block',\n }}\n >\n {hasValue\n ? selectedOptions[0]?.label || currentValue\n : placeholder || '\\u00A0'}\n </span>\n )}\n </div>\n\n <div\n style={{\n position: 'absolute',\n right: '12px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {showClear && <ClearIcon />}\n <ArrowIcon isOpen={isOpen} />\n </div>\n </div>\n\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-select-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n width: `${dropdownPosition.width}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n maxHeight: '256px',\n overflow: 'auto',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n WebkitOverflowScrolling: 'touch', // iOS 平滑滚动\n overscrollBehavior: 'contain', // 防止滚动穿透\n ...dropdownStyle,\n }}\n >\n {filteredOptions.length === 0 ? (\n <div\n style={{\n padding: '8px 16px',\n textAlign: 'center',\n color: '#78716C',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n No data\n </div>\n ) : (\n filteredOptions.map((option, index) => {\n const isSelected = isMultiple\n ? Array.isArray(currentValue) && currentValue.includes(option.value)\n : currentValue === option.value;\n const isFocused = index === focusedIndex;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (optionRender) {\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => !option.disabled && handleSelect(option)}\n style={{\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n transition: 'background-color 0.2s',\n }}\n >\n {optionRender(option, {\n selected: isSelected,\n focused: isFocused,\n disabled: option.disabled || false,\n })}\n </div>\n );\n }\n\n // 默认渲染\n return (\n <div\n key={option.value}\n className={`aha-select-option ${!option.disabled ? 'hover:bg-[#FAFAF9]' : ''} ${isSelected ? 'bg-[#FAFAF9]' : ''}`}\n onClick={() => handleSelect(option)}\n style={{\n padding: '8px 16px',\n cursor: option.disabled ? 'not-allowed' : 'pointer',\n color: option.disabled ? '#98A2B3' : '#101828',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: \"DM Sans, sans-serif\",\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'background-color 0.2s',\n }}\n >\n <span>{option.label}</span>\n {/* 只有选中时才显示标识 */}\n {isSelected && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={isFocused ? 'hidden' : ''}\n >\n <path\n d=\"M13.3333 4L6 11.3333L2.66667 8\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n );\n })\n )}\n </div>,\n document.body\n )}\n </>\n );\n};\n\nSelect.displayName = 'Select';\n\nexport default Select;\n\n","import React, { createContext } from 'react';\n\nexport interface FieldData {\n value?: any;\n error?: string;\n touched?: boolean;\n validating?: boolean;\n rules?: any[];\n required?: boolean;\n}\n\nexport interface FormContextValue {\n // 字段管理\n fields: Record<string, FieldData>;\n // 获取字段值\n getFieldValue: (name: string) => any;\n // 设置字段值\n setFieldValue: (name: string, value: any) => void;\n // 获取字段错误\n getFieldError: (name: string) => string | undefined;\n // 设置字段错误\n setFieldError: (name: string, error: string | undefined) => void;\n // 是否字段被触摸\n isFieldTouched: (name: string) => boolean;\n // 设置字段触摸状态\n setFieldTouched: (name: string, touched: boolean) => void;\n // 是否字段正在校验\n isFieldValidating: (name: string) => boolean;\n // 设置字段校验状态\n setFieldValidating: (name: string, validating: boolean) => void;\n // 注册字段\n registerField: (name: string, options: { rules?: any[]; required?: boolean }) => void;\n // 注销字段\n unregisterField: (name: string) => void;\n // 校验字段\n validateField: (name: string) => Promise<string | undefined>;\n // 校验所有字段\n validateFields: (nameList?: string[]) => Promise<any>;\n // 重置字段\n resetFields: (nameList?: string[]) => void;\n // 获取所有字段值\n getFieldsValue: (nameList?: string[]) => any;\n // 设置所有字段值\n setFieldsValue: (values: Record<string, any>) => void;\n // 提交表单\n submit: () => Promise<any>;\n // 标签宽度\n labelWidth?: number | string;\n // 标签对齐\n labelAlign?: 'left' | 'right';\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null);\n\n","import React, { useRef, useCallback, useState, useImperativeHandle, useEffect, useMemo } from 'react';\nimport { FormContext, FormContextValue, FieldData } from './FormContext';\nimport FormItem from './FormItem';\n\nexport interface FormProps {\n /** 表单初始值 */\n initialValues?: Record<string, any>;\n /** 表单值变化回调 */\n onValuesChange?: (changedValues: Record<string, any>, allValues: Record<string, any>) => void;\n /** 表单提交回调 */\n onFinish?: (values: Record<string, any>) => void;\n /** 表单提交失败回调 */\n onFinishFailed?: (errorInfo: { values: Record<string, any>; errorFields: Array<{ name: string; errors: string[] }> }) => void;\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 布局方式 */\n layout?: 'horizontal' | 'vertical' | 'inline';\n /** 尺寸 */\n size?: 'small' | 'medium' | 'large';\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n}\n\nexport interface FormInstance {\n /** 获取字段值 */\n getFieldValue: (name: string) => any;\n /** 获取所有字段值 */\n getFieldsValue: (nameList?: string[]) => any;\n /** 设置字段值 */\n setFieldValue: (name: string, value: any) => void;\n /** 设置所有字段值 */\n setFieldsValue: (values: Record<string, any>) => void;\n /** 获取字段错误 */\n getFieldError: (name: string) => string | undefined;\n /** 校验字段 */\n validateField: (name: string) => Promise<string | undefined>;\n /** 校验所有字段 */\n validateFields: (nameList?: string[]) => Promise<any>;\n /** 重置字段 */\n resetFields: (nameList?: string[]) => void;\n /** 提交表单 */\n submit: () => Promise<any>;\n}\n\nconst Form = React.forwardRef<FormInstance, FormProps>(\n (\n {\n initialValues = {},\n onValuesChange,\n onFinish,\n onFinishFailed,\n labelWidth = '120px',\n labelAlign = 'right',\n layout = 'horizontal',\n size = 'medium',\n className = '',\n style,\n children,\n },\n ref\n ) => {\n const [fields, setFields] = useState<Record<string, FieldData>>(() => {\n const initialFields: Record<string, FieldData> = {};\n Object.keys(initialValues).forEach((key) => {\n initialFields[key] = {\n value: initialValues[key],\n error: undefined,\n touched: false,\n validating: false,\n };\n });\n return initialFields;\n });\n\n // 使用 ref 保存最新的 fields,避免闭包问题\n const fieldsRef = useRef(fields);\n useEffect(() => {\n fieldsRef.current = fields;\n }, [fields]);\n\n // 获取字段值 - 从 ref 读取,确保获取最新值\n const getFieldValue = useCallback((name: string) => {\n return fieldsRef.current[name]?.value;\n }, []);\n\n // 设置字段值\n const setFieldValue = useCallback((name: string, value: any) => {\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value,\n };\n }\n\n // 同步更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n value,\n };\n } else {\n fieldsRef.current[name] = {\n value,\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n\n // 触发 onValuesChange\n if (onValuesChange) {\n const changedValues: Record<string, any> = {};\n changedValues[name] = value;\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(changedValues, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 获取字段错误 - 从 ref 读取,确保获取最新值\n const getFieldError = useCallback((name: string) => {\n return fieldsRef.current[name]?.error;\n }, []);\n\n // 设置字段错误\n const setFieldError = useCallback((name: string, error: string | undefined) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n error,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段被触摸 - 从 ref 读取,确保获取最新值\n const isFieldTouched = useCallback((name: string) => {\n return fieldsRef.current[name]?.touched || false;\n }, []);\n\n // 设置字段触摸状态\n const setFieldTouched = useCallback((name: string, touched: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n touched,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n touched,\n };\n }\n return newFields;\n });\n }, []);\n\n // 是否字段正在校验 - 从 ref 读取,确保获取最新值\n const isFieldValidating = useCallback((name: string) => {\n return fieldsRef.current[name]?.validating || false;\n }, []);\n\n // 设置字段校验状态\n const setFieldValidating = useCallback((name: string, validating: boolean) => {\n // 先更新 ref\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n validating,\n };\n }\n \n // 然后更新 state\n setFields((prev) => {\n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: undefined,\n error: undefined,\n touched: false,\n validating,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n validating,\n };\n }\n return newFields;\n });\n }, []);\n\n // 使用 ref 存储 registerField 函数,避免依赖变化\n const registerFieldRef = useRef<(name: string, options: { rules?: any[]; required?: boolean }) => void>();\n \n registerFieldRef.current = (name: string, options: { rules?: any[]; required?: boolean }) => {\n setFields((prev) => {\n // 如果字段已存在且 rules 和 required 没有变化,不更新\n if (prev[name]) {\n const existingRules = prev[name].rules || [];\n const newRules = options.rules || [];\n \n // 深度比较 rules\n let rulesEqual = existingRules.length === newRules.length;\n if (rulesEqual && existingRules.length > 0) {\n for (let i = 0; i < existingRules.length; i++) {\n const existingRule = existingRules[i];\n const newRule = newRules[i];\n if (\n existingRule?.required !== newRule?.required ||\n existingRule?.message !== newRule?.message ||\n existingRule?.type !== newRule?.type ||\n existingRule?.pattern !== newRule?.pattern ||\n existingRule?.min !== newRule?.min ||\n existingRule?.max !== newRule?.max ||\n existingRule?.len !== newRule?.len ||\n existingRule?.whitespace !== newRule?.whitespace\n ) {\n rulesEqual = false;\n break;\n }\n }\n }\n \n if (rulesEqual && prev[name].required === options.required) {\n return prev; // 没有变化,返回原对象,避免触发重新渲染\n }\n }\n \n const newFields = { ...prev };\n if (!newFields[name]) {\n newFields[name] = {\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n rules: options.rules,\n required: options.required,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n rules: options.rules,\n required: options.required,\n };\n }\n return newFields;\n });\n };\n\n const registerField = useCallback((name: string, options: { rules?: any[]; required?: boolean }) => {\n registerFieldRef.current?.(name, options);\n }, []);\n\n // 注销字段\n const unregisterField = useCallback((name: string) => {\n setFields((prev) => {\n const newFields = { ...prev };\n delete newFields[name];\n return newFields;\n });\n }, []);\n\n // 校验单个字段\n const validateField = useCallback(async (name: string): Promise<string | undefined> => {\n // 使用 ref 获取最新的 fields 状态,避免闭包问题\n const field = fieldsRef.current[name];\n if (!field) {\n return undefined;\n }\n\n setFieldValidating(name, true);\n\n const rules = field.rules || [];\n let error: string | undefined;\n\n for (const rule of rules) {\n const value = field.value;\n\n // required 校验\n if (rule.required) {\n if (value === undefined || value === null || value === '') {\n error = rule.message || `${name} is required`;\n break;\n }\n }\n\n // type 校验\n if (rule.type && value !== undefined && value !== null && value !== '') {\n const typeMap: Record<string, (v: any) => boolean> = {\n string: (v) => typeof v === 'string',\n number: (v) => typeof v === 'number' && !isNaN(v),\n boolean: (v) => typeof v === 'boolean',\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)),\n url: (v) => {\n try {\n new URL(String(v));\n return true;\n } catch {\n return false;\n }\n },\n };\n\n const validator = typeMap[rule.type];\n if (validator && !validator(value)) {\n error = rule.message || `${name} must be a valid ${rule.type}`;\n break;\n }\n }\n\n // pattern 校验\n if (rule.pattern && value !== undefined && value !== null && value !== '') {\n if (!rule.pattern.test(String(value))) {\n error = rule.message || `${name} format is invalid`;\n break;\n }\n }\n\n // min 校验\n if (rule.min !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue < rule.min) {\n error = rule.message || `${name} must be at least ${rule.min}`;\n break;\n }\n }\n\n // max 校验\n if (rule.max !== undefined && value !== undefined && value !== null && value !== '') {\n const numValue = typeof value === 'string' ? value.length : Number(value);\n if (numValue > rule.max) {\n error = rule.message || `${name} must be at most ${rule.max}`;\n break;\n }\n }\n\n // len 校验\n if (rule.len !== undefined && value !== undefined && value !== null && value !== '') {\n const lenValue = typeof value === 'string' ? value.length : Number(value);\n if (lenValue !== rule.len) {\n error = rule.message || `${name} must be exactly ${rule.len}`;\n break;\n }\n }\n\n // whitespace 校验\n if (rule.whitespace && typeof value === 'string' && value.trim() !== value) {\n error = rule.message || `${name} cannot be whitespace`;\n break;\n }\n\n // 自定义 validator\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err: any) {\n error = err?.message || rule.message || `${name} validation failed`;\n break;\n }\n }\n }\n\n // 先同步更新 ref,确保立即可用\n if (fieldsRef.current[name]) {\n fieldsRef.current[name] = {\n ...fieldsRef.current[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n fieldsRef.current[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n\n // 然后更新 state - 使用函数式更新确保状态正确更新\n setFields((prev) => {\n const newFields = { ...prev };\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n error,\n validating: false,\n touched: true,\n };\n } else {\n // 如果字段不存在,创建一个新字段\n newFields[name] = {\n value: field.value,\n error,\n touched: true,\n validating: false,\n rules: field.rules,\n required: field.required,\n };\n }\n return newFields;\n });\n\n // 返回错误信息\n return error;\n }, []);\n\n // 获取所有字段值\n const getFieldsValue = useCallback((nameList?: string[]) => {\n const currentFields = fieldsRef.current;\n const values: Record<string, any> = {};\n const fieldsToGet = nameList || Object.keys(currentFields);\n\n fieldsToGet.forEach((name) => {\n values[name] = currentFields[name]?.value;\n });\n\n return values;\n }, []);\n\n // 校验所有字段\n const validateFields = useCallback(async (nameList?: string[]): Promise<any> => {\n // 使用 ref 获取最新的 fields 状态\n const currentFields = fieldsRef.current;\n const fieldsToValidate = nameList || Object.keys(currentFields);\n const errors: Array<{ name: string; errors: string[] }> = [];\n\n // 并行校验所有字段,并收集错误\n const validationResults = await Promise.all(\n fieldsToValidate.map(async (name) => {\n const field = currentFields[name];\n // 如果字段存在且有 rules,才进行校验\n if (field && field.rules && field.rules.length > 0) {\n const error = await validateField(name);\n return { name, error };\n }\n return { name, error: undefined };\n })\n );\n\n // 收集所有错误\n validationResults.forEach(({ name, error }) => {\n if (error) {\n errors.push({\n name,\n errors: [error],\n });\n }\n });\n\n // 等待状态更新完成 - 使用 requestAnimationFrame 确保 DOM 更新\n await new Promise((resolve) => requestAnimationFrame(() => {\n setTimeout(resolve, 0);\n }));\n\n if (errors.length > 0) {\n const errorInfo = {\n values: getFieldsValue(),\n errorFields: errors,\n };\n onFinishFailed?.(errorInfo);\n throw errorInfo;\n }\n\n return getFieldsValue();\n }, [validateField, getFieldsValue, onFinishFailed]);\n\n // 重置字段\n const resetFields = useCallback((nameList?: string[]) => {\n setFields((prev) => {\n const newFields = { ...prev };\n const fieldsToReset = nameList || Object.keys(newFields);\n\n fieldsToReset.forEach((name) => {\n if (newFields[name]) {\n newFields[name] = {\n ...newFields[name],\n value: initialValues[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n }\n });\n\n return newFields;\n });\n }, [initialValues]);\n\n // 设置所有字段值\n const setFieldsValue = useCallback((values: Record<string, any>) => {\n setFields((prev) => {\n const newFields = { ...prev };\n Object.keys(values).forEach((name) => {\n if (!newFields[name]) {\n newFields[name] = {\n value: values[name],\n error: undefined,\n touched: false,\n validating: false,\n };\n } else {\n newFields[name] = {\n ...newFields[name],\n value: values[name],\n };\n }\n });\n\n if (onValuesChange) {\n const allValues: Record<string, any> = {};\n Object.keys(newFields).forEach((key) => {\n allValues[key] = newFields[key].value;\n });\n onValuesChange(values, allValues);\n }\n\n return newFields;\n });\n }, [onValuesChange]);\n\n // 提交表单\n const submit = useCallback(async () => {\n try {\n const values = await validateFields();\n onFinish?.(values);\n return values;\n } catch (error) {\n throw error;\n }\n }, [validateFields, onFinish]);\n\n // 暴露方法给 ref\n useImperativeHandle(ref, () => ({\n getFieldValue,\n getFieldsValue,\n setFieldValue,\n setFieldsValue,\n getFieldError,\n validateField,\n validateFields,\n resetFields,\n submit,\n }));\n\n // 使用 useMemo 缓存 contextValue,但 fields 必须包含在依赖中,以便 FormItem 能重新渲染\n const contextValue: FormContextValue = useMemo(() => ({\n fields,\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n }), [\n fields, // fields 必须在依赖中,这样 FormItem 才能重新渲染显示错误\n getFieldValue,\n setFieldValue,\n getFieldError,\n setFieldError,\n isFieldTouched,\n setFieldTouched,\n isFieldValidating,\n setFieldValidating,\n registerField,\n unregisterField,\n validateField,\n validateFields,\n resetFields,\n getFieldsValue,\n setFieldsValue,\n submit,\n labelWidth,\n labelAlign,\n ]);\n\n const formStyle: React.CSSProperties = {\n ...style,\n };\n\n if (layout === 'vertical') {\n formStyle.display = 'flex';\n formStyle.flexDirection = 'column';\n } else if (layout === 'inline') {\n formStyle.display = 'inline-flex';\n formStyle.flexWrap = 'wrap';\n formStyle.gap = '16px';\n }\n\n return (\n <FormContext.Provider value={contextValue}>\n <form\n className={`aha-form ${className}`}\n style={formStyle}\n onSubmit={async (e) => {\n e.preventDefault();\n try {\n const values = await validateFields();\n // 只有校验通过才调用 onFinish\n onFinish?.(values);\n } catch (error) {\n // 校验失败,不调用 onFinish,错误信息已经通过 setFieldError 设置\n // 错误信息会显示在 FormItem 中\n // onFinishFailed 已经在 validateFields 中调用\n }\n }}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n }\n);\n\nForm.displayName = 'Form';\n\n// 导出 FormItem 作为 Form.Item\nconst FormWithItem = Form as typeof Form & {\n Item: typeof FormItem;\n};\nFormWithItem.Item = FormItem;\n\nexport default FormWithItem;\n\n","import React, { useContext, useEffect, useRef, useMemo } from 'react';\nimport { FormContext } from './FormContext';\nimport { TooltipIcon } from '../../icons';\n\nexport interface FormItemProps {\n /** 字段名 */\n name?: string;\n /** 标签 */\n label?: React.ReactNode;\n /** 标签的 HTML for 属性 */\n htmlFor?: string;\n /** 标签布局 */\n labelCol?: { span?: number; offset?: number };\n /** 输入控件布局 */\n wrapperCol?: { span?: number; offset?: number };\n /** 是否必填(显示红色星号) */\n required?: boolean;\n /** 校验规则 */\n rules?: Array<{\n required?: boolean;\n message?: string;\n validator?: (rule: any, value: any) => Promise<void> | void;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email';\n whitespace?: boolean;\n [key: string]: any;\n }>;\n /** 是否显示校验信息 */\n hasFeedback?: boolean;\n /** 校验状态 */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating';\n /** 帮助信息 */\n help?: React.ReactNode;\n /** 额外的提示信息 */\n extra?: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 子元素 */\n children?: React.ReactNode;\n /** 标签对齐方式 */\n labelAlign?: 'left' | 'right';\n /** 标签宽度 */\n labelWidth?: number | string;\n /** 是否隐藏 */\n hidden?: boolean;\n /** 标签提示信息(tooltip) */\n tooltip?: React.ReactNode;\n}\n\nconst FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n htmlFor,\n labelCol,\n wrapperCol,\n required = false,\n rules = [],\n hasFeedback = false,\n validateStatus,\n help,\n extra,\n className = '',\n style,\n children,\n labelAlign = 'right',\n labelWidth,\n hidden = false,\n tooltip,\n}) => {\n const formContext = useContext(FormContext);\n const itemRef = useRef<HTMLDivElement>(null);\n\n // 从 Form 上下文获取字段值、错误信息等\n // 使用 formContext.fields 来触发重新渲染,当 fields 变化时组件会重新渲染\n const fields = formContext?.fields || {};\n const fieldValue = name && formContext ? formContext.getFieldValue(name) : undefined;\n const fieldError = name && formContext ? formContext.getFieldError(name) : undefined;\n const fieldTouched = name && formContext ? formContext.isFieldTouched(name) : false;\n const fieldValidating = name && formContext ? formContext.isFieldValidating(name) : false;\n \n // 使用 fields 来触发重新渲染,确保错误信息能显示\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _ = name ? fields[name] : undefined; // 读取 fields[name] 来建立依赖关系\n\n // 计算校验状态\n // 如果有错误就显示错误状态,不管是否 touched(提交时会强制校验)\n const computedValidateStatus =\n validateStatus ||\n (fieldError\n ? 'error'\n : fieldValidating\n ? 'validating'\n : fieldTouched && !fieldError\n ? 'success'\n : undefined);\n\n // 计算帮助信息 - 如果有错误就显示,不管是否 touched\n const computedHelp = help !== undefined ? help : (fieldError || undefined);\n\n // 使用 useRef 存储上一次的 rules 和 required,避免不必要的更新\n const prevRulesRef = useRef(rules);\n const prevRequiredRef = useRef(required);\n const isMountedRef = useRef(false);\n\n // 计算是否必填\n const isRequired = required || rules.some((rule) => rule.required);\n\n // 检查 rules 是否真的变化了(深度比较)\n const rulesChanged = useMemo(() => {\n if (!isMountedRef.current) {\n isMountedRef.current = true;\n return true; // 首次挂载时注册\n }\n \n if (prevRulesRef.current.length !== rules.length) {\n return true;\n }\n // 简单比较:如果引用相同,肯定没变化\n if (prevRulesRef.current === rules) {\n return false;\n }\n // 深度比较关键属性\n for (let i = 0; i < rules.length; i++) {\n const prevRule = prevRulesRef.current[i];\n const currRule = rules[i];\n if (\n prevRule?.required !== currRule?.required ||\n prevRule?.message !== currRule?.message ||\n prevRule?.type !== currRule?.type ||\n prevRule?.pattern !== currRule?.pattern ||\n prevRule?.min !== currRule?.min ||\n prevRule?.max !== currRule?.max ||\n prevRule?.len !== currRule?.len ||\n prevRule?.whitespace !== currRule?.whitespace\n ) {\n return true;\n }\n }\n return false;\n }, [rules]);\n\n // 注册字段到 Form - 只在 name 变化时注册,rules 和 required 通过内部比较\n useEffect(() => {\n if (!name || !formContext) return;\n\n // 检查是否需要更新\n const shouldUpdate = \n !prevRulesRef.current || // 首次注册\n rulesChanged || \n prevRequiredRef.current !== required;\n\n if (shouldUpdate) {\n prevRulesRef.current = rules;\n prevRequiredRef.current = required;\n\n formContext.registerField(name, {\n rules,\n required: isRequired,\n });\n }\n\n return () => {\n if (name && formContext) {\n formContext.unregisterField(name);\n }\n };\n // 只依赖 name,formContext 是稳定的,rules 和 required 通过 ref 比较\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n // 克隆子元素,注入 value、onChange、error 等 props\n const cloneChild = (child: React.ReactElement) => {\n if (!React.isValidElement(child)) return child;\n\n const childProps: any = {\n ...(child.props as Record<string, any>),\n };\n\n // 注入 value 和 onChange\n if (name && formContext) {\n const fieldValue = formContext.getFieldValue(name);\n const setFieldValue = formContext.setFieldValue;\n\n if (!setFieldValue) {\n // 如果没有 formContext,直接返回原组件\n return child;\n }\n\n // 处理不同类型的组件\n if (child.type && typeof child.type === 'object' && 'displayName' in child.type) {\n const displayName = (child.type as any).displayName;\n\n // Input, Textarea\n if (displayName === 'Input' || displayName === 'Textarea') {\n childProps.value = fieldValue || '';\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setFieldValue(name, e.target.value);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Select\n else if (displayName === 'Select') {\n childProps.value = fieldValue;\n const originalOnChange = (child.props as any)?.onChange;\n const originalOnBlur = (child.props as any)?.onBlur;\n childProps.onChange = (value: any, option: any) => {\n setFieldValue(name, value);\n originalOnChange?.(value, option);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n childProps.onBlur = (e: React.FocusEvent) => {\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n formContext.validateField(name);\n }\n originalOnBlur?.(e);\n };\n childProps.error = computedValidateStatus === 'error';\n }\n // Switch\n else if (displayName === 'Switch') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (checked: boolean, event: any) => {\n setFieldValue(name, checked);\n originalOnChange?.(checked, event);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Checkbox\n else if (displayName === 'Checkbox') {\n childProps.checked = fieldValue || false;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, e.target.checked);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n // Radio\n else if (displayName === 'Radio') {\n // Radio 通常需要 Radio.Group,这里只处理单个 Radio\n const radioValue = (child.props as any)?.value;\n if (radioValue !== undefined) {\n childProps.checked = fieldValue === radioValue;\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setFieldValue(name, radioValue);\n originalOnChange?.(e);\n // 值变化时立即触发校验\n if (name && formContext) {\n formContext.setFieldTouched(name, true);\n // 使用 setTimeout 确保值已经更新\n setTimeout(() => {\n formContext.validateField(name);\n }, 0);\n }\n };\n }\n }\n } else {\n // 通用处理:尝试注入 value 和 onChange\n if (fieldValue !== undefined) {\n childProps.value = fieldValue;\n }\n const originalOnChange = (child.props as any)?.onChange;\n childProps.onChange = (e: any) => {\n const value = e?.target?.value ?? e;\n setFieldValue(name, value);\n originalOnChange?.(e);\n };\n }\n }\n\n // 注入 error 状态(如果组件支持)\n if (computedValidateStatus === 'error' && 'error' in childProps) {\n childProps.error = true;\n }\n\n return React.cloneElement(child, childProps);\n };\n\n if (hidden) return null;\n\n // Tooltip 组件(简单实现)\n const TooltipWrapper = ({ content }: { content: React.ReactNode }) => {\n const [showTooltip, setShowTooltip] = React.useState(false);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (tooltipRef.current && !tooltipRef.current.contains(event.target as Node)) {\n setShowTooltip(false);\n }\n };\n\n if (showTooltip) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showTooltip]);\n\n return (\n <div style={{ position: 'relative', display: 'inline-block', marginLeft: '4px' }}>\n <div\n onClick={(e) => {\n e.stopPropagation();\n setShowTooltip(!showTooltip);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: '#A9A29D',\n }}\n >\n <TooltipIcon />\n </div>\n {showTooltip && (\n <div\n ref={tooltipRef}\n style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '4px',\n padding: '8px 12px',\n backgroundColor: '#1C1917',\n color: '#FFFFFF',\n fontSize: '12px',\n lineHeight: '18px',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n zIndex: 1000,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n }}\n >\n {content}\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderBottom: '4px solid #1C1917',\n }}\n />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={itemRef}\n className={`aha-form-item ${className}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '16px',\n ...style,\n }}\n >\n {label && (\n <label\n htmlFor={htmlFor}\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n color: '#44403C',\n fontFamily: \"DM Sans, sans-serif\",\n fontWeight: 500, // font-medium\n }}\n >\n {label}\n {isRequired && (\n <span\n style={{\n color: '#EC470A',\n marginLeft: '4px',\n }}\n >\n *\n </span>\n )}\n {tooltip && <TooltipWrapper content={tooltip} />}\n </label>\n )}\n <div style={{ width: '100%' }}>\n <div>\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return cloneChild(child);\n }\n return child;\n })}\n </div>\n {computedHelp && (\n <div\n style={{\n marginTop: '6px',\n fontSize: '14px', // text-sm\n lineHeight: '20px',\n fontWeight: 400, // font-normal\n color:\n computedValidateStatus === 'error'\n ? '#D92D20'\n : computedValidateStatus === 'warning'\n ? '#F59E0B'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {computedHelp}\n </div>\n )}\n {extra && !computedHelp && (\n <div\n style={{\n marginTop: '4px',\n fontSize: '12px',\n lineHeight: '18px',\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {extra}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FormItem;\n\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport interface MenuItemType {\n /** 唯一标识 */\n key: string;\n /** 菜单项标签 */\n label: React.ReactNode;\n /** 菜单项图标 */\n icon?: React.ReactNode;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否危险项(红色) */\n danger?: boolean;\n /** 自定义渲染函数,如果提供则完全自定义该项的渲染 */\n render?: (item: MenuItemType, isSelected: boolean) => React.ReactNode;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 点击事件 */\n onClick?: (info: { key: string; keyPath: string[] }) => void;\n}\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 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 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 [selectedKeys, isSelectedKeysControlled, onSelect, onDeselect, items, getKeyPath]\n );\n\n // 渲染用户资料\n const renderUserProfile = () => {\n if (!userProfile) return null;\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (userProfile.render) {\n return userProfile.render(userProfile);\n }\n\n return (\n <div\n onClick={userProfile.onClick}\n style={{\n padding: '16px',\n cursor: userProfile.onClick ? 'pointer' : 'default',\n borderBottom: '1px solid #E7E5E4',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {/* 头像 */}\n <div style={{ position: 'relative', flexShrink: 0 }}>\n {userProfile.avatar || (\n <div\n style={{\n width: '40px',\n height: '40px',\n borderRadius: '50%',\n backgroundColor: '#F5F5F4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '16px',\n color: '#78716C',\n }}\n >\n {typeof userProfile.name === 'string' ? userProfile.name.charAt(0).toUpperCase() : 'U'}\n </div>\n )}\n {/* 在线状态指示器 */}\n {userProfile.online !== undefined && (\n <div\n style={{\n position: 'absolute',\n bottom: '0',\n right: '0',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n backgroundColor: userProfile.online ? '#10B981' : '#9CA3AF',\n border: '2px solid #FFFFFF',\n }}\n />\n )}\n </div>\n {/* 用户信息 */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: '14px',\n fontWeight: 500,\n lineHeight: '20px',\n color: '#101828',\n fontFamily: 'DM Sans, sans-serif',\n marginBottom: '2px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.name}\n </div>\n {userProfile.email && (\n <div\n style={{\n fontSize: '14px',\n lineHeight: '20px',\n color: '#78716C',\n fontFamily: 'DM Sans, sans-serif',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {userProfile.email}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n // 渲染单个菜单项\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\n const isSelected = selectedKeys.includes(item.key);\n\n // 如果提供了自定义渲染函数,使用自定义渲染\n if (item.render) {\n return (\n <div key={item.key} className={item.className} style={item.style}>\n {item.render(item, isSelected)}\n </div>\n );\n }\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n padding: '10px 16px',\n cursor: item.disabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily: 'DM Sans, sans-serif',\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n backgroundColor: 'transparent',\n transition: 'background-color 0.15s',\n opacity: item.disabled ? 0.5 : 1,\n ...item.style,\n };\n\n return (\n <div\n key={item.key}\n ref={(el) => {\n itemRefs.current[item.key] = el;\n }}\n className={`aha-menu-item ${item.className || ''}`}\n style={itemStyle}\n onClick={() => handleItemClick(item)}\n onMouseEnter={(e) => {\n if (!item.disabled) {\n e.currentTarget.style.backgroundColor = '#F9FAFB';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {/* 图标 - 可选,如果提供了icon则显示 */}\n {item.icon && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '20px',\n height: '20px',\n marginRight: '12px',\n flexShrink: 0,\n color: item.disabled\n ? '#98A2B3'\n : item.danger\n ? '#DC2626'\n : '#101828',\n }}\n >\n {item.icon}\n </div>\n )}\n {/* 标签文本 */}\n <span style={{ flex: 1 }}>{item.label}</span>\n </div>\n );\n };\n\n // 渲染菜单分组\n const renderGroup = (group: MenuGroupType): React.ReactNode => {\n return (\n <div key={`group-${group.title}`} className={`aha-menu-group ${group.className || ''}`}>\n {group.children.map((item) => renderMenuItem(item))}\n </div>\n );\n };\n\n // 主容器样式\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n backgroundColor: '#FFFFFF',\n borderRadius: '12px',\n boxShadow: '0px 10px 38px rgba(22, 23, 24, 0.35), 0px 10px 20px rgba(22, 23, 24, 0.2)',\n overflow: 'hidden',\n fontFamily: 'DM Sans, sans-serif',\n ...style,\n };\n\n // 计算是否需要显示分隔线\n const shouldShowDivider = (index: number, items: (MenuItemType | MenuGroupType)[]): boolean => {\n if (index === 0) return false;\n const currentItem = items[index];\n const prevItem = items[index - 1];\n \n // 如果前一项是分组,显示分隔线\n if (isGroup(prevItem)) {\n return true;\n }\n // 如果当前项是分组,且前一项不是分组,显示分隔线\n if (isGroup(currentItem) && !isGroup(prevItem)) {\n return true;\n }\n return false;\n };\n\n return (\n <div ref={menuRef} className={`aha-menu-list ${className}`} style={containerStyle}>\n {/* 用户资料 */}\n {userProfile && renderUserProfile()}\n \n {/* 菜单项 */}\n <div>\n {items.map((item, index) => (\n <React.Fragment key={index}>\n {/* 分隔线 */}\n {shouldShowDivider(index, items) && (\n <div\n style={{\n height: '1px',\n backgroundColor: '#E7E5E4',\n margin: '4px 0',\n }}\n />\n )}\n {/* 菜单项或分组 */}\n {isGroup(item)\n ? renderGroup(item)\n : renderMenuItem(item)}\n </React.Fragment>\n ))}\n </div>\n </div>\n );\n};\n\nMenuList.displayName = 'MenuList';\n\nexport default MenuList;\n","import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport type TooltipPosition = \n | \"top\" \n | \"bottom\" \n | \"left\" \n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport type TooltipTrigger = \"hover\" | \"click\";\n\nexport interface TooltipProps {\n /** Tooltip 内容 */\n content: React.ReactNode;\n /** 触发元素 */\n children: React.ReactNode;\n /** 显示位置 */\n position?: TooltipPosition;\n /** 触发方式 */\n trigger?: TooltipTrigger;\n /** 延迟显示时间(毫秒) */\n delay?: number;\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 自定义 tooltip 样式类名 */\n tooltipClassName?: string;\n /** Tooltip 与触发元素的间距(像素) */\n gap?: number;\n /** 是否显示箭头 */\n showArrow?: boolean;\n /** Tooltip 内容宽度(如 \"200px\"、\"50%\" 等),不设置则使用自动计算 */\n width?: string | number;\n}\n\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}) => {\n const [isVisible, setIsVisible] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\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 requestAnimationFrame(() => {\n setIsAnimating(true);\n });\n }, delay);\n }, [disabled, delay]);\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 setIsAnimating(false);\n // 等待动画完成后再隐藏\n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n hideTimeoutRef.current = null;\n }, 150);\n }, []);\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 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, { useState } from \"react\";\nimport { AlertIcon, CloseIcon } from \"./icon\";\n\nexport interface AlertProps {\n title?: string;\n description?: string;\n className?: string;\n type?: \"success\" | \"error\" | \"warning\" | \"info\";\n icon?: React.ReactNode;\n showIcon?: boolean;\n closeable?: boolean;\n action?: React.ReactNode;\n children?: React.ReactNode;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nconst Alert: React.FC<AlertProps> = ({\n className = \"\",\n type = \"info\",\n title,\n description,\n icon = AlertIcon[type],\n showIcon = true,\n closeable = false,\n action,\n children,\n onClose\n}) => {\n const baseClasses = \"aha-alert px-4 py-3 rounded-md flex gap-2 relative\";\n\n // 使用内联样式作为备选方案,确保样式始终生效\n const typeStyles = {\n success: { backgroundColor: '#ECFDF5' },\n error: { backgroundColor: '#FEF2F2' },\n warning: { backgroundColor: '#FFFBEB' },\n info: { backgroundColor: '#EFF6FF' },\n };\n\n const [visible, setVisible] = useState(true);\n const handleClose = () => {\n setVisible(false);\n onClose?.();\n };\n\n if (!visible) return null;\n\n return (\n <div \n className={`${baseClasses} ${className}`}\n style={typeStyles[type]}\n >\n {showIcon && icon}\n <div \n className=\"flex flex-col gap-1\"\n style={closeable ? { paddingRight: '2rem' } : {}}\n >\n {title && (\n <div className=\"justify-start text-[#292524] text-base font-semibold font-['DM_Sans'] leading-normal\">\n {title}\n </div>\n )}\n {description && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {description}\n </div>\n )}\n {children && (\n <div className=\"w-full justify-center text-[#57534D] text-sm font-normal font-['DM_Sans'] leading-snug\">\n {children}\n </div>\n )}\n {action && closeable && <div className=\"mt-3\">{action}</div>}\n </div>\n {action && !closeable && <div className=\"ml-3\">{action}</div>}\n {closeable && (\n <div\n className=\"absolute right-4 top-3 cursor-pointer\"\n onClick={handleClose}\n >\n {CloseIcon}\n </div>\n )}\n </div>\n );\n};\n\nexport default Alert;\n","import React, { useRef, useEffect, useState } from 'react';\nimport { useTheme } from '../../theme/ThemeContext';\n\nexport type ProgressType = 'circle' | 'semicircle' | string;\nexport type ProgressStatus = 'normal' | 'success' | 'exception' | 'active';\nexport type TitlePosition = 'inside' | 'outside';\n\nexport interface ProgressProps {\n /** 进度百分比,范围 0-100 */\n percent?: number;\n /** 进度条类型,目前支持 circle(圆形)和 semicircle(半圆) */\n type?: ProgressType;\n /** 进度条宽度(尺寸),单位 px */\n width?: number;\n /** 标题文本 */\n title?: string;\n /** 标题位置,圆内(inside)或圆外(outside),圆外时显示在圆下方 */\n titlePosition?: TitlePosition;\n /** 是否显示百分比 */\n showPercent?: boolean;\n /** 是否启用动画效果 */\n animated?: boolean;\n /** 进度条状态 */\n status?: ProgressStatus;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 进度条颜色,不设置则使用主题色 */\n strokeColor?: string;\n /** 进度条轨道颜色 */\n trailColor?: string;\n [key: string]: any;\n}\n\n// 获取标题位置:默认圆内\nconst getTitlePosition = (userPosition?: TitlePosition): TitlePosition => {\n return userPosition || 'inside';\n};\n\n// 计算标题字体大小:统一使用 text-sm (14px)\nconst getTitleFontSize = () => {\n return '14px'; // text-sm\n};\n\n// 计算百分比字体大小:统一使用 text-xs (12px)\nconst getPercentFontSize = () => {\n return '12px'; // text-xs\n};\n\nconst Progress: React.FC<ProgressProps> = ({\n percent = 0,\n type = 'circle',\n width = 120,\n title,\n titlePosition: userTitlePosition,\n showPercent = true,\n animated = false,\n status = 'normal',\n className = '',\n style,\n strokeColor,\n trailColor = '#F5F5F4',\n ...rest\n}) => {\n const { primaryColor } = useTheme();\n \n // 确保 percent 在 0-100 范围内\n const normalizedPercent = Math.min(100, Math.max(0, percent));\n \n // 跟踪是否是首次渲染,动画只在首次渲染时执行一次\n const isFirstRender = useRef(true);\n const [shouldAnimate, setShouldAnimate] = useState(false);\n const [animatingPercent, setAnimatingPercent] = useState(0); // 动画中的百分比\n \n useEffect(() => {\n if (animated && isFirstRender.current && normalizedPercent > 0) {\n // 首次渲染且启用了动画且 percent > 0 时,启用动画\n isFirstRender.current = false;\n // 初始设置为 0,然后启用动画,让它过渡到目标值\n setAnimatingPercent(0);\n setShouldAnimate(true);\n // 使用 requestAnimationFrame 确保在下一个渲染周期更新到目标值\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n setAnimatingPercent(normalizedPercent);\n });\n });\n // 动画结束后(0.3s)禁用动画,确保只执行一次\n const timer = setTimeout(() => {\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent); // 确保最终值是目标值\n }, 300);\n return () => clearTimeout(timer);\n } else if (isFirstRender.current) {\n // 首次渲染但不需要动画,直接标记为已渲染\n isFirstRender.current = false;\n setShouldAnimate(false);\n setAnimatingPercent(normalizedPercent);\n } else {\n // 非首次渲染,直接更新到目标值,无动画\n setAnimatingPercent(normalizedPercent);\n }\n }, [animated, normalizedPercent]);\n \n // 计算实际使用的颜色\n let finalStrokeColor = strokeColor || primaryColor || '#FB6011';\n \n // 根据状态调整颜色\n if (status === 'success') {\n finalStrokeColor = '#00BC7D';\n } else if (status === 'exception') {\n finalStrokeColor = '#FB2C36';\n }\n \n // 计算标题位置:默认圆内\n const titlePosition = getTitlePosition(userTitlePosition);\n \n // 计算圆环宽度(strokeWidth),根据 width 成比例,最小 4px\n const strokeWidth = Math.max(4, Math.round(width * 0.06));\n \n // 半径(用于 SVG 绘制)\n const radius = (width - strokeWidth) / 2;\n \n // 半圆的高度是宽度的一半\n const semicircleHeight = type === 'semicircle' ? width / 2 : width;\n \n // 标题字体大小:统一使用 14px (text-sm)\n const titleFontSize = getTitleFontSize();\n // 百分比字体大小:统一使用 12px (text-xs)\n const percentFontSize = getPercentFontSize();\n \n // 渲染圆形进度\n const renderCircleProgress = () => {\n // 计算容器高度\n const containerHeight = title && titlePosition === 'outside' \n ? width + 4 + 18 + 4\n : width;\n \n // 圆形进度计算\n const circumference = 2 * Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const offset = circumference - (currentPercent / 100) * circumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {/* SVG 绘制圆形进度,支持圆角 */}\n <svg\n width={width}\n height={width}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条:从上方开始,顺时针 */}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#292524',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width / 2}px`, // 相对于圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${width}px`,\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n // 渲染半圆进度\n const renderSemicircleProgress = () => {\n // 半圆弧形的起始点和结束点\n // 为了确保上方不被裁剪,把半圆弧形往下移\n // 在 SVG 顶部留出圆角空间,让弧形从顶部向下偏移\n \n const topPadding = strokeWidth; // 顶部留出圆角空间\n const svgHeight = semicircleHeight + topPadding; // SVG 总高度(包含顶部空间)\n \n const startX = strokeWidth / 2;\n const endX = width - strokeWidth / 2;\n // 底部位置:往下移,底部在 svgHeight - strokeWidth / 2\n const bottomY = svgHeight - strokeWidth / 2;\n \n // 半圆的中心点(用于文字定位)- 文字也相应往下移\n // 为了让文字更居中,需要适当往下移一些\n const textCenterY = (semicircleHeight / 2) + topPadding / 2 + strokeWidth / 2; // 在弧形中心位置,适当往下移\n \n // 计算容器高度:半圆的标准高度(width / 2),加上顶部空间\n // 如果 title 在圆外,再加 title 空间\n const baseContainerHeight = svgHeight; // 容器高度包含完整的 SVG(包括顶部空间)\n const containerHeight = title && titlePosition === 'outside' \n ? baseContainerHeight + 4 + 18 + 4\n : baseContainerHeight;\n \n // 半圆进度计算\n const semicircleCircumference = Math.PI * radius;\n // 如果正在动画,使用动画中的百分比,否则使用目标百分比\n const currentPercent = shouldAnimate ? animatingPercent : normalizedPercent;\n const semicircleOffset = semicircleCircumference - (currentPercent / 100) * semicircleCircumference;\n \n return (\n <div\n style={{\n position: 'relative',\n width: width,\n height: containerHeight,\n overflow: 'hidden', // 最外层设置 overflow: hidden,只裁剪底部\n }}\n >\n {/* SVG 绘制半圆进度,支持圆角(包括底部两个端点) */}\n <svg\n width={width}\n height={svgHeight}\n viewBox={`0 0 ${width} ${svgHeight}`}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n {/* 背景轨道(半圆) */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={trailColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n />\n {/* 进度条(半圆):从底部左侧开始,顺时针 */}\n <path\n d={`M ${startX} ${bottomY} A ${radius} ${radius} 0 0 1 ${endX} ${bottomY}`}\n fill=\"none\"\n stroke={finalStrokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={semicircleCircumference}\n strokeDashoffset={semicircleOffset}\n style={{\n transition: shouldAnimate ? 'stroke-dashoffset 0.3s ease' : 'none',\n }}\n />\n </svg>\n \n {/* 内容:百分比和标题 */}\n {title && titlePosition === 'inside' ? (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`,\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n }}\n >\n <div\n style={{\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {title}\n </div>\n {showPercent && (\n <div\n style={{\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n </div>\n ) : (\n <>\n {showPercent && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${textCenterY}px`, // 相对于半圆的位置,不是容器\n transform: 'translate(-50%, -50%)',\n textAlign: 'center',\n fontSize: percentFontSize,\n fontWeight: 600,\n color: '#1C1917',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: 1,\n }}\n >\n {`${Math.round(normalizedPercent)}%`}\n </div>\n )}\n {title && titlePosition === 'outside' && (\n <div\n style={{\n position: 'absolute',\n left: '50%',\n top: `${svgHeight}px`, // 相对于 SVG 底部的位置\n transform: 'translateX(-50%)',\n marginTop: '4px',\n textAlign: 'center',\n fontSize: titleFontSize,\n color: '#57534E',\n fontFamily: 'DM Sans, sans-serif',\n lineHeight: '18px',\n }}\n >\n {title}\n </div>\n )}\n </>\n )}\n </div>\n );\n };\n \n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n width: width,\n ...style,\n };\n \n // 根据类型渲染不同的进度条\n const renderProgress = () => {\n switch (type) {\n case 'circle':\n return renderCircleProgress();\n case 'semicircle':\n return renderSemicircleProgress();\n default:\n console.warn(`Progress type \"${type}\" is not supported yet, using \"circle\" as fallback`);\n return renderCircleProgress();\n }\n };\n \n return (\n <div\n className={`aha-progress aha-progress--${type} ${className}`}\n style={containerStyle}\n {...rest}\n >\n {renderProgress()}\n </div>\n );\n};\n\nexport default Progress;\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","__spreadArray","to","from","pack","ar","l","Array","slice","concat","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","useTheme","context","useContext","SIZE_CONFIG","small","height","paddingLeft","paddingRight","fontSize","lineHeight","iconSize","gap","mediumSmall","medium","large","LoadingIcon","_a","size","color","_jsxs","jsxs","_Fragment","children","_jsx","width","viewBox","fill","style","animation","jsx","cx","cy","r","stroke","strokeWidth","strokeLinecap","strokeDasharray","strokeDashoffset","opacity","Button","baseStyle","_b","type","_c","_d","disabled","_e","loading","onClick","_f","htmlType","_g","className","icon","_h","iconPosition","rest","_j","_k","useState","isHovered","setIsHovered","_l","isPressed","setIsPressed","sizeConfig","isDisabled","renderIcon","iconColor","parseInt","replace","display","alignItems","justifyContent","flexShrink","buttonStyle","position","fontWeight","fontFamily","borderRadius","border","cursor","outline","transition","userSelect","WebkitTapHighlightColor","backgroundColor","boxShadow","preventDefault","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","displayName","AlertIcon","success","xmlns","d","error","warning","info","CloseIcon","ToastIcon","question","ToastManager","toasts","listeners","Set","addToast","props","id","Math","random","toString","toastInstance","console","log","notifyListeners","removeToast","filter","toast","getToasts","subscribe","listener","_this","add","delete","forEach","clearAll","toastManager","ToastContainer","setToasts","useEffect","currentToasts","unsubscribe","map","topLeftToasts","topRightToasts","bottomLeftToasts","bottomRightToasts","top","left","zIndex","pointerEvents","flexDirection","ToastItem","right","bottom","isVisible","setIsVisible","isExiting","setIsExiting","message","duration","action","showClose","onClose","typeStyles","bgColor","defaultIcon","getTypeStyles","timer","setTimeout","clearTimeout","timer_1","handleClose","useCallback","handleClick","maxWidth","background","overflow","transform","padding","marginRight","flex","minWidth","marginTop","stopPropagation","currentTarget","ensureToastContainer","toastContainerElement","toastContainerRoot","isInitializing","window","document","existingContainer","getElementById","createElement","appendChild","createRoot","require","render","import","catch","warn","COLOR_CONFIG","Green","light","bg","text","Red","Orange","Cyan","Violet","Pink","Gray","Yellow","Blue","textSize","CheckIcon","strokeLinejoin","MinusIcon","SortIcon","SortDescIcon","SortAscIcon","LeftArrowIcon","RightArrowIcon","TooltipIcon","clipPath","Pagination","controlledCurrent","current","defaultCurrent","total","controlledPageSize","pageSize","defaultPageSize","showSizeChanger","pageSizeOptions","showQuickJumper","showTotal","onChange","onShowSizeChange","simple","hideOnSinglePage","_m","_o","responsive","showLessItems","itemRender","_q","_r","internalCurrent","setInternalCurrent","_s","internalPageSize","setInternalPageSize","_t","jumpToPage","setJumpToPage","totalPages","useMemo","ceil","undefined","handlePageChange","page","handleJumpTo","margin","marginLeft","start","end","min","flexWrap","pages","getPageNumbers","item","index","isActive","element","max","renderItem","newPageSize","Number","target","newTotalPages","newCurrent","borderColor","onKeyPress","key","onFocus","onBlur","goButton","Checkbox","checked","indeterminate","isChecked","minHeight","boxSizing","ref","el","getValue","obj","path","reduce","acc","getRowKey","record","rowKey","SortIconComponent","order","Radio","name","Input","forwardRef","readOnly","prefix","suffix","allowClear","onClear","placeholder","defaultValue","onPressEnter","restProps","inputRef","useRef","React","internalValue","setInternalValue","focused","setFocused","isControlled","currentValue","handleClear","focus","showClear","sizeStyles","paddingTop","paddingBottom","baseStyles","WebkitAppearance","MozAppearance","appearance","onKeyDown","autoComplete","autoCorrect","autoCapitalize","spellCheck","Textarea","showCount","maxLength","rows","autoSize","textareaRef","setHeight","currentLength","String","textarea","minRows","maxRows","scrollHeight","getComputedStyle","maxHeight","newHeight","resize","Switch","controlledChecked","defaultChecked","checkedChildren","unCheckedChildren","internalChecked","setInternalChecked","config","thumbSize","thumbOffset","default","thumbLeft","role","newChecked","Select","controlledValue","options","mode","showSearch","filterOption","onSelect","onDeselect","onSearch","onDropdownVisibleChange","dropdownClassName","dropdownStyle","defaultOpen","controlledOpen","open","maxTagCount","tagRender","optionRender","_p","internalOpen","setInternalOpen","searchValue","setSearchValue","focusedIndex","setFocusedIndex","selectRef","dropdownRef","_u","dropdownPosition","setDropdownPosition","isOpenControlled","isOpen","isMultiple","getSelectedOptions","values","isArray","opt","includes","getFilteredOptions","toLowerCase","search","filteredOptions","updatePosition_1","rect","getBoundingClientRect","scrollY","scrollX","addEventListener","removeEventListener","handleClickOutside","event","contains","handleKeyDown","prev","option","handleSelect","focusedItem","querySelectorAll","scrollIntoView","block","behavior","newValues_1","currentValues","selectedOptions_1","handleRemoveTag","newValues","find","newValue","selectedOptions","hasValue","renderTags","tagsToShow","remainingCount","tagProps","closable","Fragment","textOverflow","whiteSpace","WebkitTouchCallout","touchAction","newOpen","onTouchStart","onTouchEnd","tabIndex","val","createPortal","WebkitOverflowScrolling","overscrollBehavior","textAlign","isSelected","isFocused","selected","FormContext","Form","initialValues","onValuesChange","onFinish","onFinishFailed","labelWidth","labelAlign","layout","initialFields","keys","touched","validating","fields","setFields","fieldsRef","getFieldValue","setFieldValue","newFields","changedValues","allValues_1","getFieldError","setFieldError","isFieldTouched","setFieldTouched","isFieldValidating","setFieldValidating","registerFieldRef","existingRules","rules","newRules","rulesEqual","existingRule","newRule","required","pattern","len","whitespace","registerField","unregisterField","validateField","field","_i","rules_1","rule","validator","string","number","isNaN","boolean","email","test","url","URL","trim","err_1","getFieldsValue","nameList","currentFields","validateFields","fieldsToValidate","errors","all","requestAnimationFrame","errorInfo","errorFields","resetFields","setFieldsValue","allValues_2","submit","useImperativeHandle","contextValue","formStyle","Provider","onSubmit","FormWithItem","Item","htmlFor","wrapperCol","hasFeedback","validateStatus","help","extra","hidden","tooltip","formContext","itemRef","fieldError","fieldTouched","fieldValidating","computedValidateStatus","computedHelp","prevRulesRef","prevRequiredRef","isMountedRef","isRequired","some","rulesChanged","prevRule","currRule","marginBottom","content","showTooltip","setShowTooltip","tooltipRef","borderLeft","borderRight","borderBottom","Children","child","isValidElement","childProps","fieldValue_1","setFieldValue_1","originalOnChange_1","originalOnBlur_1","originalOnChange_2","originalOnBlur_2","originalOnChange_3","originalOnChange_4","radioValue_1","originalOnChange_5","originalOnChange_6","cloneElement","cloneChild","MenuList","items","userProfile","controlledSelectedKeys","selectedKeys","defaultSelectedKeys","menuRef","itemRefs","isSelectedKeysControlled","internalSelectedKeys","setInternalSelectedKeys","isGroup","getKeyPath","items_1","found","menuItem","currentPath","handleItemClick","newSelectedKeys","keyPath","k","renderMenuItem","itemStyle","danger","containerStyle","shouldShowDivider","currentItem","prevItem","avatar","charAt","toUpperCase","online","group","title","calculatePosition","triggerRect","tooltipRect","pageXOffset","pageYOffset","triggerCenterX","triggerCenterY","totalGap","viewportWidth","innerWidth","viewportHeight","innerHeight","willOverlap","calculatedTop","calculatedLeft","tooltipBottom","tooltipRight","tooltipTop","tooltipLeft","overlapTop","overlapBottom","overlapLeft","overlapRight","renderArrow","arrowStyle","baseArrowStyle","borderStyle","arrowStyles","borderWidth","description","showIcon","closeable","visible","setVisible","percent","userTitlePosition","titlePosition","showPercent","animated","status","strokeColor","trailColor","normalizedPercent","isFirstRender","shouldAnimate","setShouldAnimate","animatingPercent","setAnimatingPercent","finalStrokeColor","round","radius","semicircleHeight","titleFontSize","percentFontSize","renderCircleProgress","containerHeight","circumference","PI","offset","startX","endX","bottomY","svgHeight","textCenterY","semicircleCircumference","semicircleOffset","renderProgress","variant","initialValue","handleTabClick","activeItem","activeColor","tabRefs","underlineRef","backgroundSliderRef","containerRef","backgroundContainerRef","underlineStyle","setUnderlineStyle","backgroundSliderStyle","setBackgroundSliderStyle","activeTab","containerRect","tabRect","timer_2","badge","customElement","columns","dataSource","rowSelection","pagination","bordered","locale","showHeader","footer","summary","scroll","tableLayout","onSorterChange","onPaginationChange","onRow","expandable","rowClassName","onHeaderRow","sticky","selectedRowKeys","defaultSelectedRowKeys","setSelectedRowKeys","Map","sorters","setSorters","defaultExpandedRowKeys","expandedRowKeys","setExpandedRowKeys","currentPage","setCurrentPage","_v","setPageSize","_w","draggedRowIndex","setDraggedRowIndex","_x","dragOverRowIndex","setDragOverRowIndex","_y","isMobile","setIsMobile","tableRef","headerRef","checkMobile","checkboxProps","getCheckboxProps","newSelectedRowKeys","selectedRows","Event","handleSelectAll","currentPageData","changeRows","onSelectAll","handleSort","column","columnKey","dataIndex","join","newSorters","set","sorterArray","entries","c","currentSorter","currentDataSource","expanded","newExpandedRowKeys","onExpand","onExpandedRowsChange","getProcessedData","processed","sort","a","b","_loop_1","col","compareResult","sorter","aVal","bVal","sorterEntries_1","state_1","processedData","paginatedData","renderCell","getFixedOffset","columnIndex","fixed","isHeader","fixedDirection","columnWidth","renderHeader","enabledRows","enabledKeys","allSelected","someSelected","headerColumns","colIndex","sortOrder","get","fixedOffset","align","onHeaderCell","sortColumn","selectWidth","selectColumn","hideSelectAll","every","columnTitle","unshift","headerRowProps","handleDragStart","handleDragOver","handleDrop","dropIndex","newData","draggedItem","splice","handleDragEnd","renderRows","isExpanded","rowProps","isLastRow","draggable","onDragStart","onDragOver","onDrop","onDragEnd","cellProps","onCell","colSpan","rowSpan","expandedRowRender","renderPagination","hasFixedColumns","hasAllColumnWidths","totalWidth","x","sum","effectiveTableLayout","tableStyle","borderCollapse","borderSpacing","wrapperStyle","startsWith","displayValue","scrollContainerStyle","overflowX","overflowY","colorConfig","hex","substr","getColorConfig","outlineOffset","outlineColor","getOutlineColor","baseClasses","Boolean","containerClasses","getIconColor","theme","themeValue","mounted","setMounted","trigger","delay","tooltipClassName","showArrow","isAnimating","setIsAnimating","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","tooltipContainerStyle","calculateTooltipMaxWidth","updateMaxWidth","tooltipContentStyle","wordWrap","tooltipContent","handleTriggerMouseLeave","triggerProps"],"mappings":"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","x_google_ignoreList":[0]}
|