aha-components 1.4.6 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DatePicker.esm.js +2 -0
- package/dist/DatePicker.esm.js.map +1 -0
- package/dist/DatePicker.js +2 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/components/DatePicker/DatePicker.stories.d.ts +20 -0
- package/dist/components/DatePicker/index.d.ts +84 -0
- package/dist/index.d.ts +84 -1
- 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 +24 -23
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../node_modules/tslib/tslib.es6.js","../src/theme/ThemeContext.tsx","../src/components/DatePicker/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, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTheme } from '../../theme/ThemeContext';\n\n// 日期范围类型\nexport interface DateRange {\n startDate: Date | null;\n endDate: Date | null;\n}\n\n// 基础 Props(单个日期模式)\nexport interface DatePickerBaseProps {\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否显示错误状态 */\n error?: boolean;\n /** 占位符(单个日期模式) */\n placeholder?: string;\n /** 开始日期占位符(范围模式) */\n startPlaceholder?: string;\n /** 结束日期占位符(范围模式) */\n endPlaceholder?: string;\n /** 尺寸 */\n size?: 'small' | 'mediumSmall' | 'medium' | 'large';\n /** 是否允许清除 */\n allowClear?: boolean;\n /** 日期格式 */\n format?: string;\n /** 聚焦回调 */\n onFocus?: (e: React.FocusEvent) => void;\n /** 失焦回调 */\n onBlur?: (e: React.FocusEvent) => void;\n /** 下拉框打开回调 */\n onOpenChange?: (open: boolean) => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: React.CSSProperties;\n /** 下拉框类名 */\n dropdownClassName?: string;\n /** 下拉框样式 */\n dropdownStyle?: React.CSSProperties;\n /** 是否默认打开 */\n defaultOpen?: boolean;\n /** 是否打开(受控) */\n open?: boolean;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 分隔符(范围模式) */\n separator?: string;\n /** 是否显示预设日期范围(仅在范围模式下有效) */\n presetRanges?: boolean;\n /** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */\n calendarCount?: 1 | 2;\n /** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */\n showApplyCancel?: boolean;\n /** Apply 按钮文本 */\n applyText?: string;\n /** Cancel 按钮文本 */\n cancelText?: string;\n /** Apply 按钮回调 */\n onApply?: (range: DateRange) => void;\n /** Cancel 按钮回调 */\n onCancel?: () => void;\n}\n\n// 单个日期模式 Props\nexport interface DatePickerSingleProps extends DatePickerBaseProps {\n /** 模式:单个日期 */\n mode?: 'date';\n /** 当前选中的值 */\n value?: Date | null;\n /** 默认选中的值 */\n defaultValue?: Date | null;\n /** 变化回调 */\n onChange?: (date: Date | null) => void;\n}\n\n// 日期范围模式 Props\nexport interface DatePickerRangeProps extends DatePickerBaseProps {\n /** 模式:日期范围 */\n mode: 'range';\n /** 当前选中的值 */\n value?: DateRange;\n /** 默认选中的值 */\n defaultValue?: DateRange;\n /** 变化回调 */\n onChange?: (range: DateRange) => void;\n}\n\n// 联合类型\nexport type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;\n\n// 月份名称\nconst monthNamesShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst monthNamesFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\n// 格式化日期\nconst formatDate = (date: Date | null, format: string = 'YYYY-MM-DD'): string => {\n if (!date) return '';\n \n const year = date.getFullYear();\n const month = date.getMonth();\n const monthNum = String(month + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const dayNum = String(date.getDate());\n \n // 使用特殊占位符避免替换冲突\n // 使用不常见的 Unicode 私有区域字符作为占位符\n const PLACEHOLDER_YYYY = '\\uE000';\n const PLACEHOLDER_YY = '\\uE001';\n const PLACEHOLDER_MMMM = '\\uE002';\n const PLACEHOLDER_MMM = '\\uE003';\n const PLACEHOLDER_MM = '\\uE004';\n const PLACEHOLDER_M = '\\uE005';\n const PLACEHOLDER_DD = '\\uE006';\n const PLACEHOLDER_D = '\\uE007';\n \n // 按从长到短的顺序替换,使用占位符避免冲突\n let result = format\n // 先替换所有格式标记为占位符\n .replace(/YYYY/g, PLACEHOLDER_YYYY)\n .replace(/YY/g, PLACEHOLDER_YY)\n .replace(/MMMM/g, PLACEHOLDER_MMMM)\n .replace(/MMM/g, PLACEHOLDER_MMM)\n .replace(/MM/g, PLACEHOLDER_MM)\n .replace(/DD/g, PLACEHOLDER_DD)\n .replace(/D/g, PLACEHOLDER_D)\n .replace(/M/g, PLACEHOLDER_M)\n // 然后将占位符替换为实际值\n .replace(new RegExp(PLACEHOLDER_YYYY, 'g'), String(year))\n .replace(new RegExp(PLACEHOLDER_YY, 'g'), String(year).slice(-2))\n .replace(new RegExp(PLACEHOLDER_MMMM, 'g'), monthNamesFull[month])\n .replace(new RegExp(PLACEHOLDER_MMM, 'g'), monthNamesShort[month])\n .replace(new RegExp(PLACEHOLDER_MM, 'g'), monthNum)\n .replace(new RegExp(PLACEHOLDER_M, 'g'), String(month + 1))\n .replace(new RegExp(PLACEHOLDER_DD, 'g'), day)\n .replace(new RegExp(PLACEHOLDER_D, 'g'), dayNum);\n \n return result;\n};\n\n// 获取月份的第一天是星期几(0=周日, 1=周一, ...)\nconst getFirstDayOfMonth = (year: number, month: number): number => {\n return new Date(year, month, 1).getDay();\n};\n\n// 获取月份的天数\nconst getDaysInMonth = (year: number, month: number): number => {\n return new Date(year, month + 1, 0).getDate();\n};\n\n// 判断两个日期是否是同一天\nconst isSameDay = (date1: Date | null, date2: Date | null): boolean => {\n if (!date1 || !date2) return false;\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\n// 判断日期是否在范围内\nconst isDateInRange = (date: Date, minDate?: Date, maxDate?: Date): boolean => {\n if (minDate && date < minDate) return false;\n if (maxDate && date > maxDate) return false;\n return true;\n};\n\n// 判断日期是否在选择的范围内\nconst isDateInSelectedRange = (date: Date, startDate: Date | null, endDate: Date | null): boolean => {\n if (!startDate || !endDate) return false;\n const dateTime = date.getTime();\n const startTime = startDate.getTime();\n const endTime = endDate.getTime();\n return dateTime >= startTime && dateTime <= endTime;\n};\n\n// 判断日期是否是范围的开始或结束\nconst isRangeEdge = (date: Date, startDate: Date | null, endDate: Date | null): 'start' | 'end' | 'both' | null => {\n if (!startDate || !endDate) return null;\n const isStart = isSameDay(date, startDate);\n const isEnd = isSameDay(date, endDate);\n if (isStart && isEnd) return 'both';\n if (isStart) return 'start';\n if (isEnd) return 'end';\n return null;\n};\n\nconst DatePicker: React.FC<DatePickerProps> = (props) => {\n const {\n mode = 'date',\n disabled = false,\n error = false,\n placeholder = 'Select date',\n startPlaceholder = 'Start date',\n endPlaceholder = 'End date',\n size = 'medium',\n allowClear = false,\n format = mode === 'range' ? 'MMM D, YYYY' : 'YYYY-MM-DD',\n onFocus,\n onBlur,\n onOpenChange,\n className = '',\n style,\n dropdownClassName = '',\n dropdownStyle,\n defaultOpen = false,\n open: controlledOpen,\n minDate,\n maxDate,\n separator = ' - ',\n presetRanges = false,\n calendarCount = 1,\n showApplyCancel = false,\n applyText = 'Apply',\n cancelText = 'Cancel',\n onApply,\n onCancel,\n } = props;\n\n const { primaryColor = '#FB6011' } = useTheme();\n const isRangeMode = mode === 'range';\n\n // 单个日期模式的状态\n const [internalSingleValue, setInternalSingleValue] = useState<Date | null>(() => {\n if (mode === 'date' && 'defaultValue' in props) {\n const val = props.defaultValue as Date | null | undefined;\n return val || null;\n }\n return null;\n });\n \n // 范围模式的状态\n const [internalRangeValue, setInternalRangeValue] = useState<DateRange>(() => {\n if (mode === 'range' && 'defaultValue' in props) {\n const val = props.defaultValue as DateRange | undefined;\n return val || { startDate: null, endDate: null };\n }\n return { startDate: null, endDate: null };\n });\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [selectingStart, setSelectingStart] = useState(true); // 范围模式:true=选择开始日期, false=选择结束日期\n const [tempRangeValue, setTempRangeValue] = useState<DateRange | null>(null); // 临时范围值(用于 Apply/Cancel)\n const [currentMonth, setCurrentMonth] = useState(() => {\n if (mode === 'date' && 'value' in props && props.value) {\n const date = props.value as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'value' in props && props.value) {\n const range = props.value as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'date' && 'defaultValue' in props && props.defaultValue) {\n const date = props.defaultValue as Date | null;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n if (mode === 'range' && 'defaultValue' in props && props.defaultValue) {\n const range = props.defaultValue as DateRange;\n const date = range.startDate || range.endDate;\n if (date) {\n return { year: date.getFullYear(), month: date.getMonth() };\n }\n }\n const now = new Date();\n return { year: now.getFullYear(), month: now.getMonth() };\n });\n \n // 第二个月份(用于双月显示)\n const [secondMonth, setSecondMonth] = useState<{ year: number; month: number } | null>(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n return { year: nextMonth.getFullYear(), month: nextMonth.getMonth() };\n }\n return null;\n });\n \n // 当第一个月份变化时,更新第二个月份\n useEffect(() => {\n if (calendarCount === 2 && isRangeMode) {\n const nextMonth = new Date(currentMonth.year, currentMonth.month + 1, 1);\n setSecondMonth({ year: nextMonth.getFullYear(), month: nextMonth.getMonth() });\n } else {\n setSecondMonth(null);\n }\n }, [currentMonth, calendarCount, isRangeMode]);\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const startInputRef = useRef<HTMLInputElement>(null);\n const endInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const hasOpenedRef = useRef(false); // 跟踪日历是否已经打开过\n\n // 判断是否受控\n const isControlled = 'value' in props && props.value !== undefined;\n const isOpenControlled = controlledOpen !== undefined;\n \n // 当前值\n const currentSingleValue: Date | null = isRangeMode\n ? null\n : isControlled && mode === 'date' && 'value' in props\n ? (props.value as Date | null)\n : internalSingleValue;\n \n const currentRangeValue: DateRange = !isRangeMode\n ? { startDate: null, endDate: null }\n : isControlled && mode === 'range' && 'value' in props\n ? (props.value as DateRange) || { startDate: null, endDate: null }\n : internalRangeValue;\n\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n // 当日历首次打开时,如果当前月份与选中日期月份不一致,才更新月份视图\n // 之后用户切换月份后,即使选择日期,也不应该自动更新月份\n useEffect(() => {\n if (isOpen && !hasOpenedRef.current) {\n // 首次打开时,根据选中日期设置月份\n if (isRangeMode) {\n const date = currentRangeValue.startDate || currentRangeValue.endDate;\n if (date) {\n const dateYear = date.getFullYear();\n const dateMonth = date.getMonth();\n if (currentMonth.year !== dateYear || currentMonth.month !== dateMonth) {\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n }\n }\n } else {\n if (currentSingleValue) {\n const dateYear = currentSingleValue.getFullYear();\n const dateMonth = currentSingleValue.getMonth();\n if (currentMonth.year !== dateYear || currentMonth.month !== dateMonth) {\n setCurrentMonth({\n year: dateYear,\n month: dateMonth,\n });\n }\n }\n }\n hasOpenedRef.current = true;\n } else if (!isOpen) {\n // 日历关闭时,重置标记,下次打开时重新判断\n hasOpenedRef.current = false;\n }\n }, [isOpen, currentSingleValue, currentRangeValue, isRangeMode, currentMonth]);\n\n // 计算下拉框位置\n useEffect(() => {\n if (isOpen && pickerRef.current) {\n const updatePosition = () => {\n if (pickerRef.current) {\n const rect = pickerRef.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 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 pickerRef.current &&\n !pickerRef.current.contains(target) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(target)\n ) {\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside, true);\n document.addEventListener('touchstart', handleClickOutside, true);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside, true);\n document.removeEventListener('touchstart', handleClickOutside, true);\n };\n }\n }, [isOpen, isOpenControlled, onOpenChange]);\n\n // 处理日期选择(单个日期模式)\n const handleSelectSingleDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n if (!isControlled) {\n setInternalSingleValue(date);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(date);\n }\n\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }, [isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理日期选择(范围模式)\n const handleSelectRangeDate = useCallback((date: Date) => {\n if (!isDateInRange(date, minDate, maxDate)) return;\n\n // 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n let newRange: DateRange;\n\n if (selectingStart) {\n // 选择开始日期\n if (workingRange.endDate && date > workingRange.endDate) {\n // 如果选择的开始日期大于结束日期,交换它们\n newRange = {\n startDate: workingRange.endDate,\n endDate: date,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: date,\n endDate: workingRange.endDate,\n };\n // 如果已经有结束日期,完成选择\n if (workingRange.endDate) {\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n } else {\n setSelectingStart(false);\n }\n }\n } else {\n // 选择结束日期\n if (workingRange.startDate && date < workingRange.startDate) {\n // 如果选择的结束日期小于开始日期,交换它们\n newRange = {\n startDate: date,\n endDate: workingRange.startDate,\n };\n setSelectingStart(false);\n } else {\n newRange = {\n startDate: workingRange.startDate,\n endDate: date,\n };\n // 完成选择\n setSelectingStart(true);\n if (!showApplyCancel) {\n // 如果没有 Apply/Cancel 按钮,直接关闭\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n }\n }\n\n if (showApplyCancel) {\n // 使用临时值\n setTempRangeValue(newRange);\n } else {\n // 直接更新\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n }\n }, [selectingStart, currentRangeValue, tempRangeValue, showApplyCancel, isControlled, isOpenControlled, mode, props, onOpenChange, minDate, maxDate]);\n\n // 处理清除\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (isRangeMode) {\n const newRange: DateRange = { startDate: null, endDate: null };\n if (!isControlled) {\n setInternalRangeValue(newRange);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(newRange);\n }\n setSelectingStart(true);\n } else {\n if (!isControlled) {\n setInternalSingleValue(null);\n }\n if (mode === 'date' && 'onChange' in props) {\n (props.onChange as (date: Date | null) => void)?.(null);\n }\n }\n };\n\n // 切换下拉框\n const handleToggle = () => {\n if (disabled) return;\n const newOpen = !isOpen;\n if (!isOpenControlled) {\n setInternalOpen(newOpen);\n }\n onOpenChange?.(newOpen);\n if (newOpen && isRangeMode) {\n setSelectingStart(!currentRangeValue.startDate);\n // 初始化临时值\n if (showApplyCancel) {\n setTempRangeValue(currentRangeValue);\n }\n } else if (!newOpen && showApplyCancel) {\n // 关闭时重置临时值\n setTempRangeValue(null);\n }\n };\n \n // 处理 Apply 按钮\n const handleApply = () => {\n if (tempRangeValue) {\n if (!isControlled) {\n setInternalRangeValue(tempRangeValue);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(tempRangeValue);\n }\n onApply?.(tempRangeValue);\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n setTempRangeValue(null);\n }\n };\n \n // 处理 Cancel 按钮\n const handleCancel = () => {\n setTempRangeValue(null);\n onCancel?.();\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n };\n \n // 预设日期范围\n const presetRangesList = useMemo(() => {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n \n // Last week: 从当前日期往前推7天(包含今天,共7天)\n const lastWeekEnd = new Date(today);\n const lastWeekStart = new Date(today);\n lastWeekStart.setDate(today.getDate() - 6); // 往前推6天,加上今天共7天\n \n // Last month: 从当前日期往前推一个月\n const lastMonthEnd = new Date(today);\n const lastMonthStart = new Date(today);\n const originalDate = today.getDate();\n lastMonthStart.setMonth(today.getMonth() - 1);\n // 如果往前推一个月后日期被调整了(比如3月31日往前推一个月变成3月3日,因为2月没有31日),\n // 说明原日期在上个月不存在,需要取上个月的最后一天\n if (lastMonthStart.getDate() !== originalDate) {\n // 设置为上个月的最后一天\n lastMonthStart.setDate(0);\n }\n \n // Last year: 从当前日期往前推一年\n const lastYearEnd = new Date(today);\n const lastYearStart = new Date(today);\n lastYearStart.setFullYear(today.getFullYear() - 1);\n \n return [\n // { label: 'Today', range: { startDate: today, endDate: today } },\n // { label: 'Yesterday', range: { startDate: yesterday, endDate: yesterday } },\n // { label: 'This week', range: { startDate: thisWeekStart, endDate: thisWeekEnd } },\n { label: 'Last week', range: { startDate: lastWeekStart, endDate: lastWeekEnd } },\n // { label: 'This month', range: { startDate: thisMonthStart, endDate: thisMonthEnd } },\n { label: 'Last month', range: { startDate: lastMonthStart, endDate: lastMonthEnd } },\n // { label: 'This year', range: { startDate: thisYearStart, endDate: thisYearEnd } },\n { label: 'Last year', range: { startDate: lastYearStart, endDate: lastYearEnd } },\n // { label: 'All time', range: { startDate: null, endDate: null } },\n ];\n }, []);\n \n // 处理预设范围选择\n const handlePresetRangeSelect = (range: DateRange) => {\n if (showApplyCancel) {\n setTempRangeValue(range);\n } else {\n if (!isControlled) {\n setInternalRangeValue(range);\n }\n if (mode === 'range' && 'onChange' in props) {\n (props.onChange as (range: DateRange) => void)?.(range);\n }\n if (!isOpenControlled) {\n setInternalOpen(false);\n }\n onOpenChange?.(false);\n }\n };\n\n // 处理输入框聚焦\n const handleFocus = (e: React.FocusEvent) => {\n onFocus?.(e);\n };\n\n // 处理输入框失焦\n const handleBlur = (e: React.FocusEvent) => {\n onBlur?.(e);\n };\n\n // 处理开始日期输入框点击\n const handleStartInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(true);\n if (!isOpen) {\n handleToggle();\n }\n }\n };\n\n // 处理结束日期输入框点击\n const handleEndInputClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!disabled) {\n setSelectingStart(false);\n if (!isOpen) {\n handleToggle();\n }\n }\n };\n\n // 上一个月\n const handlePrevMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n };\n\n // 下一个月\n const handleNextMonth = () => {\n setCurrentMonth((prev) => {\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n };\n\n // 生成日历数据的辅助函数\n const generateCalendarData = useCallback((year: number, month: number) => {\n const daysInMonth = getDaysInMonth(year, month);\n const days: (Date | null)[] = [];\n\n // 只生成当前月的日期\n for (let day = 1; day <= daysInMonth; day++) {\n days.push(new Date(year, month, day));\n }\n\n return days;\n }, []);\n\n // 生成日历数据\n const calendarData = useMemo(() => {\n return generateCalendarData(currentMonth.year, currentMonth.month);\n }, [currentMonth, generateCalendarData]);\n \n // 生成第二个月份的日历数据\n const secondCalendarData = useMemo(() => {\n if (calendarCount === 2 && isRangeMode && secondMonth) {\n return generateCalendarData(secondMonth.year, secondMonth.month);\n }\n return null;\n }, [calendarCount, isRangeMode, secondMonth, generateCalendarData]);\n \n // 处理第二个月份的导航\n const handleSecondPrevMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 0) {\n return { year: prev.year - 1, month: 11 };\n }\n return { year: prev.year, month: prev.month - 1 };\n });\n }\n };\n \n const handleSecondNextMonth = () => {\n if (secondMonth) {\n setSecondMonth((prev) => {\n if (!prev) return null;\n if (prev.month === 11) {\n return { year: prev.year + 1, month: 0 };\n }\n return { year: prev.year, month: prev.month + 1 };\n });\n }\n };\n\n // 尺寸样式\n const sizeStyles = {\n small: {\n height: '32px',\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n mediumSmall: {\n height: '36px',\n paddingTop: '5px',\n paddingBottom: '5px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n medium: {\n height: '40px',\n paddingTop: '7px',\n paddingBottom: '7px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n large: {\n height: '48px',\n paddingTop: '11px',\n paddingBottom: '11px',\n fontSize: '16px',\n lineHeight: '24px',\n },\n };\n\n const showClear = allowClear && !disabled && (\n isRangeMode\n ? (currentRangeValue.startDate || currentRangeValue.endDate)\n : currentSingleValue\n );\n \n const singleDisplayValue = currentSingleValue ? formatDate(currentSingleValue, format) : '';\n const startDisplayValue = currentRangeValue.startDate ? formatDate(currentRangeValue.startDate, format) : '';\n const endDisplayValue = currentRangeValue.endDate ? formatDate(currentRangeValue.endDate, format) : '';\n\n // 日历图标\n const CalendarIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.6667 2.66667H12V2C12 1.63181 11.7015 1.33333 11.3333 1.33333C10.9651 1.33333 10.6667 1.63181 10.6667 2V2.66667H5.33333V2C5.33333 1.63181 5.03486 1.33333 4.66667 1.33333C4.29848 1.33333 4 1.63181 4 2V2.66667H3.33333C2.59695 2.66667 2 3.26362 2 4V13.3333C2 14.0697 2.59695 14.6667 3.33333 14.6667H12.6667C13.403 14.6667 14 14.0697 14 13.3333V4C14 3.26362 13.403 2.66667 12.6667 2.66667ZM12.6667 13.3333H3.33333V7.33333H12.6667V13.3333ZM12.6667 6H3.33333V4H12.6667V6Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n\n // 清除图标\n const ClearIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={handleClear}\n style={{\n cursor: 'pointer',\n flexShrink: 0,\n color: '#78716C',\n }}\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n\n // 下拉箭头图标\n const 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 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 // 周几名称(周一开始)\n const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n\n return (\n <>\n <style>{dropdownAnimationStyles}</style>\n <div\n ref={pickerRef}\n className={`aha-date-picker ${className}`}\n style={{\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n fontFamily: \"DM Sans, sans-serif\",\n borderRadius: '8px',\n border: `1px solid ${error ? '#F04438' : isOpen ? primaryColor : '#D7D3D0'}`,\n backgroundColor: disabled ? '#FAFAF9' : '#FFFFFF',\n cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n paddingLeft: '40px', // 为日历图标留出空间\n paddingRight: '36px', // 为箭头和清除按钮留出空间\n paddingTop: sizeStyles[size].paddingTop,\n paddingBottom: sizeStyles[size].paddingBottom,\n fontSize: sizeStyles[size].fontSize,\n lineHeight: sizeStyles[size].lineHeight,\n fontWeight: 400,\n WebkitTapHighlightColor: 'transparent',\n WebkitTouchCallout: 'none',\n touchAction: 'manipulation',\n userSelect: 'none',\n ...style,\n }}\n onClick={handleToggle}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n >\n {/* 日历图标 */}\n <span\n style={{\n position: 'absolute',\n left: '12px',\n display: 'flex',\n alignItems: 'center',\n color: disabled ? '#98A2B3' : '#78716C',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n >\n <CalendarIcon />\n </span>\n\n {/* 输入框内容 */}\n {isRangeMode ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n gap: '8px',\n minWidth: 0,\n }}\n >\n {/* 开始日期输入框 */}\n <input\n ref={startInputRef}\n type=\"text\"\n value={startDisplayValue}\n readOnly\n placeholder={startPlaceholder}\n disabled={disabled}\n onClick={handleStartInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.startDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n\n {/* 分隔符 */}\n <span\n style={{\n color: disabled ? '#98A2B3' : '#78716C',\n fontSize: '16px',\n flexShrink: 0,\n }}\n >\n {separator}\n </span>\n\n {/* 结束日期输入框 */}\n <input\n ref={endInputRef}\n type=\"text\"\n value={endDisplayValue}\n readOnly\n placeholder={endPlaceholder}\n disabled={disabled}\n onClick={handleEndInputClick}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentRangeValue.endDate ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n </div>\n ) : (\n <input\n ref={inputRef}\n type=\"text\"\n value={singleDisplayValue}\n readOnly\n placeholder={placeholder}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n if (!disabled) {\n handleToggle();\n }\n }}\n style={{\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n fontSize: '16px',\n lineHeight: '24px',\n fontWeight: 400,\n color: disabled ? '#98A2B3' : currentSingleValue ? '#1C1917' : '#79716B',\n fontFamily: \"DM Sans, sans-serif\",\n minWidth: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n WebkitAppearance: 'none',\n appearance: 'none',\n }}\n />\n )}\n\n {/* 右侧图标 */}\n <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 {/* 日历下拉框 */}\n {isOpen && dropdownPosition && createPortal(\n <div\n ref={dropdownRef}\n className={`aha-date-picker-dropdown ${dropdownClassName}`}\n style={{\n position: 'absolute',\n top: `${dropdownPosition.top}px`,\n left: `${dropdownPosition.left}px`,\n zIndex: 1050,\n backgroundColor: '#FFFFFF',\n borderRadius: '8px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n border: '1px solid #E7E5E4',\n padding: '0',\n opacity: 0,\n transform: 'translateY(-8px)',\n animation: 'dropdownFadeIn 0.2s ease-out forwards',\n display: 'flex',\n flexDirection: 'column',\n ...dropdownStyle,\n }}\n >\n {/* 内容区域 */}\n <div\n style={{\n display: 'flex',\n flex: 1,\n minHeight: 0,\n flexDirection: isRangeMode && presetRanges && calendarCount === 1 ? 'column' : 'row',\n }}\n >\n {/* 预设日期范围列表(左侧 - 仅双月模式) */}\n {isRangeMode && presetRanges && calendarCount === 2 && (\n <div\n style={{\n width: '140px',\n borderRight: '1px solid #E7E5E4',\n padding: '12px 0',\n backgroundColor: '#FFFFFF',\n borderTopLeftRadius: '8px',\n borderBottomLeftRadius: showApplyCancel ? '0' : '8px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <div\n key={idx}\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '8px 16px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {preset.label}\n </div>\n );\n })}\n </div>\n )}\n <div>\n {/* 日历区域 */}\n <div\n style={{\n flex: 1,\n padding: '16px',\n display: 'flex',\n flexDirection: calendarCount === 2 ? 'row' : 'column',\n gap: calendarCount === 2 ? '24px' : '0',\n }}\n >\n \n {/* 渲染第一个日历 */}\n {(() => {\n const renderCalendar = (\n monthData: { year: number; month: number },\n calendarDays: (Date | null)[],\n onPrevMonth: () => void,\n onNextMonth: () => void,\n monthIndex: number = 0\n ) => (\n <div\n key={monthIndex}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* 月份导航 */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: calendarCount === 2 && isRangeMode ? 'center' : 'space-between',\n marginBottom: '16px',\n position: 'relative',\n }}\n >\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏左箭头,右侧月份(monthIndex === 1)在两个月模式下隐藏左箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 1) && (\n <button\n type=\"button\"\n onClick={onPrevMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n left: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <div\n style={{\n fontSize: '16px',\n fontWeight: 500,\n color: '#1C1917',\n fontFamily: \"DM Sans, sans-serif\",\n }}\n >\n {monthNamesFull[monthData.month]} {monthData.year}\n </div>\n\n {/* 左侧月份(monthIndex === 0)在两个月模式下隐藏右箭头 */}\n {!(calendarCount === 2 && isRangeMode && monthIndex === 0) && (\n <button\n type=\"button\"\n onClick={onNextMonth}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n borderRadius: '4px',\n color: '#78716C',\n transition: 'all 0.2s',\n position: calendarCount === 2 && isRangeMode ? 'absolute' : 'relative',\n right: calendarCount === 2 && isRangeMode ? 0 : undefined,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n\n {/* 预设日期范围列表(上方 - 仅单月模式) */}\n {isRangeMode && presetRanges && calendarCount === 1 && (\n <div\n style={{\n width: '252px',\n display: 'flex',\n flexWrap: 'wrap',\n paddingBottom: '16px',\n }}\n >\n {presetRangesList.map((preset, idx) => {\n const isSelected = tempRangeValue\n ? isSameDay(preset.range.startDate, tempRangeValue.startDate) &&\n isSameDay(preset.range.endDate, tempRangeValue.endDate)\n : isSameDay(preset.range.startDate, currentRangeValue.startDate) &&\n isSameDay(preset.range.endDate, currentRangeValue.endDate);\n \n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handlePresetRangeSelect(preset.range)}\n style={{\n padding: '4px 9px',\n cursor: 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n color: isSelected ? primaryColor : '#1C1917',\n backgroundColor: isSelected ? '#FAFAF9' : 'transparent',\n border: 'none',\n fontWeight: isSelected ? 500 : 400,\n transition: 'all 0.2s',\n borderRadius: '4px',\n }}\n >\n {preset.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* 星期标题 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n marginBottom: '8px',\n }}\n >\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n width: '36px',\n textAlign: 'center',\n fontSize: '12px',\n fontWeight: 500,\n color: '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n padding: '4px',\n }}\n >\n {day}\n </div>\n ))}\n </div>\n\n {/* 日期网格 */}\n <div\n style={{\n width: '252px',\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n rowGap: '4px',\n columnGap: '0px',\n }}\n >\n {(() => {\n // 计算第一天是星期几(0=周日, 1=周一, ...)\n const firstDay = getFirstDayOfMonth(monthData.year, monthData.month);\n // 将周日(0)转换为7,使周一作为第一天\n const firstDayOfWeek = firstDay === 0 ? 7 : firstDay;\n const offset = firstDayOfWeek - 1; // 需要偏移的空格数\n \n const cells: React.ReactNode[] = [];\n \n // 添加前面的空单元格\n for (let i = 0; i < offset; i++) {\n cells.push(<div key={`empty-${i}`} />);\n }\n \n // 添加当前月的日期\n calendarDays.forEach((date, index) => {\n if (!date) return;\n \n const actualIndex = offset + index;\n const isCurrentMonth = date.getMonth() === monthData.month;\n const isToday = isSameDay(date, new Date());\n const isDisabled = !isDateInRange(date, minDate, maxDate);\n\n if (isRangeMode) {\n // 范围模式 - 使用临时值或当前值\n const workingRange = showApplyCancel && tempRangeValue ? tempRangeValue : currentRangeValue;\n const isStartDate = isSameDay(date, workingRange.startDate);\n const isEndDate = isSameDay(date, workingRange.endDate);\n const isInRange = isDateInSelectedRange(date, workingRange.startDate, workingRange.endDate);\n\n // 判断是否是行的第一个或最后一个(基于 actualIndex,包含空单元格)\n const isFirstInRow = actualIndex % 7 === 0;\n const isLastInRow = actualIndex % 7 === 6;\n \n const isRangeStart = isStartDate;\n const isRangeEnd = isEndDate;\n \n // 判断前一个和后一个日期是否在范围内(同一行内)\n const prevDate = index > 0 ? calendarDays[index - 1] : null;\n const nextDate = index < calendarDays.length - 1 ? calendarDays[index + 1] : null;\n const prevInRange = prevDate ? isDateInSelectedRange(prevDate, workingRange.startDate, workingRange.endDate) : false;\n const nextInRange = nextDate ? isDateInSelectedRange(nextDate, workingRange.startDate, workingRange.endDate) : false;\n \n // 判断上一行和下一行的对应日期是否在范围内(跨行判断)\n const prevRowIndex = index - 7;\n const nextRowIndex = index + 7;\n const prevRowDate = prevRowIndex >= 0 ? calendarDays[prevRowIndex] : null;\n const nextRowDate = nextRowIndex < calendarDays.length ? calendarDays[nextRowIndex] : null;\n const prevRowInRange = prevRowDate ? isDateInSelectedRange(prevRowDate, workingRange.startDate, workingRange.endDate) : false;\n const nextRowInRange = nextRowDate ? isDateInSelectedRange(nextRowDate, workingRange.startDate, workingRange.endDate) : false;\n\n // 计算背景和圆角样式\n let buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n };\n\n // 开始和结束日期:圆形背景,橙色\n if (isRangeStart || isRangeEnd) {\n buttonStyle.background = primaryColor;\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = '#FFFFFF';\n buttonStyle.fontWeight = 500;\n } \n // 范围中间的日期:浅灰色矩形背景\n else if (isInRange) {\n buttonStyle.background = '#F5F5F4';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n \n // 判断是否是月份的第一天或最后一天\n const isFirstDayOfMonth = date.getDate() === 1;\n const daysInMonth = getDaysInMonth(monthData.year, monthData.month);\n const isLastDayOfMonth = date.getDate() === daysInMonth;\n \n // 判断是否需要左边圆角或右边圆角\n const needsLeftRadius = isFirstInRow || isFirstDayOfMonth;\n const needsRightRadius = isLastInRow || isLastDayOfMonth;\n \n // 设置圆角:每一行的第一个日期有左边圆角,最后一个日期有右边圆角\n // 每月的第一天和最后一天也要有圆角\n if (needsLeftRadius && needsRightRadius) {\n // 同时需要左边和右边圆角(单独一个日期或跨行的情况)\n buttonStyle.borderRadius = '18px';\n } else if (needsLeftRadius) {\n // 行的第一个或月份的第一天:添加左侧圆角(上下都有)\n buttonStyle.borderTopLeftRadius = '18px';\n buttonStyle.borderBottomLeftRadius = '18px';\n buttonStyle.borderTopRightRadius = '0';\n buttonStyle.borderBottomRightRadius = '0';\n } else if (needsRightRadius) {\n // 行的最后一个或月份的最后一天:添加右侧圆角(上下都有)\n buttonStyle.borderTopRightRadius = '18px';\n buttonStyle.borderBottomRightRadius = '18px';\n buttonStyle.borderTopLeftRadius = '0';\n buttonStyle.borderBottomLeftRadius = '0';\n } else {\n // 中间:无圆角,保持连续\n buttonStyle.borderRadius = '0';\n }\n } \n // 不在范围内的日期\n else {\n buttonStyle.background = 'transparent';\n buttonStyle.borderRadius = '50%';\n buttonStyle.color = isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C';\n buttonStyle.fontWeight = 400;\n }\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectRangeDate(date)}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (!isDisabled && !isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#E7E5E4';\n } else {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }\n }}\n onMouseLeave={(e) => {\n if (!isRangeStart && !isRangeEnd) {\n if (isInRange) {\n e.currentTarget.style.backgroundColor = '#F5F5F4';\n } else {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }\n }}\n >\n {date.getDate()}\n {isToday && !isRangeStart && !isRangeEnd && !isInRange && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n } else {\n // 单个日期模式\n const isSelected = isSameDay(date, currentSingleValue);\n\n cells.push(\n <button\n key={`date-${index}`}\n type=\"button\"\n disabled={isDisabled}\n onClick={() => handleSelectSingleDate(date)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n border: 'none',\n background: isSelected ? primaryColor : 'transparent',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n borderRadius: '4px',\n fontSize: '14px',\n fontWeight: isSelected ? 500 : 400,\n color: isSelected\n ? '#FFFFFF'\n : isCurrentMonth\n ? isDisabled\n ? '#D7D3D0'\n : '#1C1917'\n : '#78716C',\n fontFamily: \"DM Sans, sans-serif\",\n transition: 'all 0.2s',\n opacity: isDisabled ? 0.4 : 1,\n position: 'relative',\n padding: 0,\n margin: 0,\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isSelected) {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.backgroundColor = 'transparent';\n }\n }}\n >\n {date.getDate()}\n {isToday && !isSelected && (\n <div\n style={{\n position: 'absolute',\n bottom: '2px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n }}\n />\n )}\n </button>\n );\n }\n });\n \n return cells;\n })()}\n </div>\n </div>\n );\n\n return (\n <>\n {renderCalendar(currentMonth, calendarData, handlePrevMonth, handleNextMonth, 0)}\n {calendarCount === 2 && isRangeMode && secondMonth && secondCalendarData && (\n renderCalendar(secondMonth, secondCalendarData, handleSecondPrevMonth, handleSecondNextMonth, 1)\n )}\n \n </>\n );\n })()}\n </div>\n {/* Apply/Cancel 按钮 */}\n {isRangeMode && showApplyCancel && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n padding: '12px 16px',\n borderTop: '1px solid #E7E5E4',\n borderBottomLeftRadius: '8px',\n borderBottomRightRadius: '8px',\n }}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n style={{\n padding: '8px 16px',\n border: '1px solid #E7E5E4',\n borderRadius: '8px',\n background: '#FFFFFF',\n color: '#1C1917',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = '#FAFAF9';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = '#FFFFFF';\n }}\n >\n {cancelText}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!tempRangeValue || (!tempRangeValue.startDate || !tempRangeValue.endDate)}\n style={{\n padding: '8px 16px',\n border: 'none',\n borderRadius: '8px',\n background: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? '#D7D3D0' : primaryColor,\n color: '#FFFFFF',\n fontSize: '14px',\n fontWeight: 500,\n fontFamily: \"DM Sans, sans-serif\",\n cursor: (!tempRangeValue || !tempRangeValue.startDate || !tempRangeValue.endDate) ? 'not-allowed' : 'pointer',\n transition: 'all 0.2s',\n }}\n onMouseEnter={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = '#FD843A';\n }\n }}\n onMouseLeave={(e) => {\n if (tempRangeValue && tempRangeValue.startDate && tempRangeValue.endDate) {\n e.currentTarget.style.backgroundColor = primaryColor;\n }\n }}\n >\n {applyText}\n </button>\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n\nexport default DatePicker;\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","SuppressedError","defaultTheme","primaryColor","ThemeContext","createContext","monthNamesShort","monthNamesFull","formatDate","date","format","year","getFullYear","month","getMonth","monthNum","String","padStart","day","getDate","dayNum","replace","RegExp","slice","getDaysInMonth","Date","isSameDay","date1","date2","isDateInRange","minDate","maxDate","isDateInSelectedRange","startDate","endDate","dateTime","getTime","startTime","endTime","DatePicker","props","_a","mode","_b","disabled","_c","error","_d","placeholder","_e","startPlaceholder","_f","endPlaceholder","_g","size","_h","allowClear","_j","onFocus","onBlur","onOpenChange","_k","className","style","_l","dropdownClassName","dropdownStyle","_m","defaultOpen","controlledOpen","open","_o","separator","_p","presetRanges","_q","calendarCount","_r","showApplyCancel","_s","applyText","_t","cancelText","onApply","onCancel","_u","useContext","isRangeMode","_v","useState","defaultValue","internalSingleValue","setInternalSingleValue","_w","internalRangeValue","setInternalRangeValue","_x","internalOpen","setInternalOpen","_y","selectingStart","setSelectingStart","_z","tempRangeValue","setTempRangeValue","_0","range","value","now","currentMonth","setCurrentMonth","_1","nextMonth","secondMonth","setSecondMonth","useEffect","pickerRef","useRef","inputRef","startInputRef","endInputRef","dropdownRef","_2","dropdownPosition","setDropdownPosition","hasOpenedRef","isControlled","undefined","isOpenControlled","currentSingleValue","currentRangeValue","isOpen","current","dateYear","dateMonth","updatePosition_1","rect","getBoundingClientRect","top","bottom","window","scrollY","left","scrollX","width","addEventListener","removeEventListener","handleClickOutside","event","target","contains","document","renderCalendar","handleSelectSingleDate","useCallback","onChange","handleSelectRangeDate","newRange","workingRange","handleClear","e","stopPropagation","handleToggle","newOpen","presetRangesList","useMemo","today","setHours","lastWeekEnd","lastWeekStart","setDate","lastMonthEnd","lastMonthStart","originalDate","setMonth","lastYearEnd","lastYearStart","setFullYear","label","handlePresetRangeSelect","handlePrevMonth","prev","handleNextMonth","generateCalendarData","daysInMonth","days","push","calendarData","secondCalendarData","handleSecondPrevMonth","handleSecondNextMonth","sizeStyles","small","height","paddingTop","paddingBottom","fontSize","lineHeight","mediumSmall","medium","large","showClear","singleDisplayValue","startDisplayValue","endDisplayValue","weekDays","_jsxs","_Fragment","children","_jsx","ref","concat","position","display","alignItems","boxSizing","fontFamily","borderRadius","border","backgroundColor","cursor","transition","paddingLeft","paddingRight","fontWeight","WebkitTapHighlightColor","WebkitTouchCallout","touchAction","userSelect","onClick","tabIndex","color","zIndex","pointerEvents","viewBox","fill","xmlns","jsx","d","jsxs","flex","gap","minWidth","type","readOnly","outline","background","WebkitAppearance","appearance","flexShrink","right","stroke","strokeWidth","strokeLinecap","strokeLinejoin","transform","createPortal","boxShadow","padding","opacity","animation","flexDirection","minHeight","borderRight","borderTopLeftRadius","borderBottomLeftRadius","map","preset","idx","isSelected","onMouseEnter","currentTarget","onMouseLeave","monthData","calendarDays","onPrevMonth","onNextMonth","monthIndex","justifyContent","marginBottom","flexWrap","gridTemplateColumns","textAlign","rowGap","columnGap","firstDay","getDay","offset","cells","forEach","index","actualIndex","isCurrentMonth","isToday","isDisabled","isStartDate","isEndDate","isInRange_1","isFirstInRow","isLastInRow","isRangeStart_1","isRangeEnd_1","prevDate","nextDate","prevRowIndex","nextRowIndex","prevRowDate","nextRowDate","buttonStyle","margin","isFirstDayOfMonth","isLastDayOfMonth","needsLeftRadius","needsRightRadius","borderTopRightRadius","borderBottomRightRadius","isSelected_1","borderTop","body","displayName"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import DatePicker from './index';
|
|
3
|
+
declare const meta: Meta<typeof DatePicker>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof DatePicker>;
|
|
6
|
+
export declare const Basic: Story;
|
|
7
|
+
export declare const Sizes: Story;
|
|
8
|
+
export declare const RangeWithPresets: Story;
|
|
9
|
+
export declare const RangeWithPresetsAndDoubleCalendar: Story;
|
|
10
|
+
export declare const RangeDoubleCalendar: Story;
|
|
11
|
+
export declare const Disabled: Story;
|
|
12
|
+
export declare const Error: Story;
|
|
13
|
+
export declare const WithClear: Story;
|
|
14
|
+
export declare const CustomFormat: Story;
|
|
15
|
+
export declare const Controlled: Story;
|
|
16
|
+
export declare const WithDateRange: Story;
|
|
17
|
+
export declare const AllStates: Story;
|
|
18
|
+
export declare const RangeMode: Story;
|
|
19
|
+
export declare const RangeWithDefault: Story;
|
|
20
|
+
export declare const RangeCustomFormat: Story;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface DateRange {
|
|
3
|
+
startDate: Date | null;
|
|
4
|
+
endDate: Date | null;
|
|
5
|
+
}
|
|
6
|
+
export interface DatePickerBaseProps {
|
|
7
|
+
/** 是否禁用 */
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
/** 是否显示错误状态 */
|
|
10
|
+
error?: boolean;
|
|
11
|
+
/** 占位符(单个日期模式) */
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
/** 开始日期占位符(范围模式) */
|
|
14
|
+
startPlaceholder?: string;
|
|
15
|
+
/** 结束日期占位符(范围模式) */
|
|
16
|
+
endPlaceholder?: string;
|
|
17
|
+
/** 尺寸 */
|
|
18
|
+
size?: 'small' | 'mediumSmall' | 'medium' | 'large';
|
|
19
|
+
/** 是否允许清除 */
|
|
20
|
+
allowClear?: boolean;
|
|
21
|
+
/** 日期格式 */
|
|
22
|
+
format?: string;
|
|
23
|
+
/** 聚焦回调 */
|
|
24
|
+
onFocus?: (e: React.FocusEvent) => void;
|
|
25
|
+
/** 失焦回调 */
|
|
26
|
+
onBlur?: (e: React.FocusEvent) => void;
|
|
27
|
+
/** 下拉框打开回调 */
|
|
28
|
+
onOpenChange?: (open: boolean) => void;
|
|
29
|
+
/** 自定义类名 */
|
|
30
|
+
className?: string;
|
|
31
|
+
/** 自定义样式 */
|
|
32
|
+
style?: React.CSSProperties;
|
|
33
|
+
/** 下拉框类名 */
|
|
34
|
+
dropdownClassName?: string;
|
|
35
|
+
/** 下拉框样式 */
|
|
36
|
+
dropdownStyle?: React.CSSProperties;
|
|
37
|
+
/** 是否默认打开 */
|
|
38
|
+
defaultOpen?: boolean;
|
|
39
|
+
/** 是否打开(受控) */
|
|
40
|
+
open?: boolean;
|
|
41
|
+
/** 最小日期 */
|
|
42
|
+
minDate?: Date;
|
|
43
|
+
/** 最大日期 */
|
|
44
|
+
maxDate?: Date;
|
|
45
|
+
/** 分隔符(范围模式) */
|
|
46
|
+
separator?: string;
|
|
47
|
+
/** 是否显示预设日期范围(仅在范围模式下有效) */
|
|
48
|
+
presetRanges?: boolean;
|
|
49
|
+
/** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */
|
|
50
|
+
calendarCount?: 1 | 2;
|
|
51
|
+
/** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */
|
|
52
|
+
showApplyCancel?: boolean;
|
|
53
|
+
/** Apply 按钮文本 */
|
|
54
|
+
applyText?: string;
|
|
55
|
+
/** Cancel 按钮文本 */
|
|
56
|
+
cancelText?: string;
|
|
57
|
+
/** Apply 按钮回调 */
|
|
58
|
+
onApply?: (range: DateRange) => void;
|
|
59
|
+
/** Cancel 按钮回调 */
|
|
60
|
+
onCancel?: () => void;
|
|
61
|
+
}
|
|
62
|
+
export interface DatePickerSingleProps extends DatePickerBaseProps {
|
|
63
|
+
/** 模式:单个日期 */
|
|
64
|
+
mode?: 'date';
|
|
65
|
+
/** 当前选中的值 */
|
|
66
|
+
value?: Date | null;
|
|
67
|
+
/** 默认选中的值 */
|
|
68
|
+
defaultValue?: Date | null;
|
|
69
|
+
/** 变化回调 */
|
|
70
|
+
onChange?: (date: Date | null) => void;
|
|
71
|
+
}
|
|
72
|
+
export interface DatePickerRangeProps extends DatePickerBaseProps {
|
|
73
|
+
/** 模式:日期范围 */
|
|
74
|
+
mode: 'range';
|
|
75
|
+
/** 当前选中的值 */
|
|
76
|
+
value?: DateRange;
|
|
77
|
+
/** 默认选中的值 */
|
|
78
|
+
defaultValue?: DateRange;
|
|
79
|
+
/** 变化回调 */
|
|
80
|
+
onChange?: (range: DateRange) => void;
|
|
81
|
+
}
|
|
82
|
+
export type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;
|
|
83
|
+
declare const DatePicker: React.FC<DatePickerProps>;
|
|
84
|
+
export default DatePicker;
|
package/dist/index.d.ts
CHANGED
|
@@ -542,6 +542,89 @@ interface SelectProps {
|
|
|
542
542
|
}
|
|
543
543
|
declare const Select: React.FC<SelectProps>;
|
|
544
544
|
|
|
545
|
+
interface DateRange {
|
|
546
|
+
startDate: Date | null;
|
|
547
|
+
endDate: Date | null;
|
|
548
|
+
}
|
|
549
|
+
interface DatePickerBaseProps {
|
|
550
|
+
/** 是否禁用 */
|
|
551
|
+
disabled?: boolean;
|
|
552
|
+
/** 是否显示错误状态 */
|
|
553
|
+
error?: boolean;
|
|
554
|
+
/** 占位符(单个日期模式) */
|
|
555
|
+
placeholder?: string;
|
|
556
|
+
/** 开始日期占位符(范围模式) */
|
|
557
|
+
startPlaceholder?: string;
|
|
558
|
+
/** 结束日期占位符(范围模式) */
|
|
559
|
+
endPlaceholder?: string;
|
|
560
|
+
/** 尺寸 */
|
|
561
|
+
size?: 'small' | 'mediumSmall' | 'medium' | 'large';
|
|
562
|
+
/** 是否允许清除 */
|
|
563
|
+
allowClear?: boolean;
|
|
564
|
+
/** 日期格式 */
|
|
565
|
+
format?: string;
|
|
566
|
+
/** 聚焦回调 */
|
|
567
|
+
onFocus?: (e: React.FocusEvent) => void;
|
|
568
|
+
/** 失焦回调 */
|
|
569
|
+
onBlur?: (e: React.FocusEvent) => void;
|
|
570
|
+
/** 下拉框打开回调 */
|
|
571
|
+
onOpenChange?: (open: boolean) => void;
|
|
572
|
+
/** 自定义类名 */
|
|
573
|
+
className?: string;
|
|
574
|
+
/** 自定义样式 */
|
|
575
|
+
style?: React.CSSProperties;
|
|
576
|
+
/** 下拉框类名 */
|
|
577
|
+
dropdownClassName?: string;
|
|
578
|
+
/** 下拉框样式 */
|
|
579
|
+
dropdownStyle?: React.CSSProperties;
|
|
580
|
+
/** 是否默认打开 */
|
|
581
|
+
defaultOpen?: boolean;
|
|
582
|
+
/** 是否打开(受控) */
|
|
583
|
+
open?: boolean;
|
|
584
|
+
/** 最小日期 */
|
|
585
|
+
minDate?: Date;
|
|
586
|
+
/** 最大日期 */
|
|
587
|
+
maxDate?: Date;
|
|
588
|
+
/** 分隔符(范围模式) */
|
|
589
|
+
separator?: string;
|
|
590
|
+
/** 是否显示预设日期范围(仅在范围模式下有效) */
|
|
591
|
+
presetRanges?: boolean;
|
|
592
|
+
/** 显示日历数量:1=单月,2=双月(仅在范围模式下有效,默认1) */
|
|
593
|
+
calendarCount?: 1 | 2;
|
|
594
|
+
/** 是否显示 Apply/Cancel 按钮(仅在范围模式下有效) */
|
|
595
|
+
showApplyCancel?: boolean;
|
|
596
|
+
/** Apply 按钮文本 */
|
|
597
|
+
applyText?: string;
|
|
598
|
+
/** Cancel 按钮文本 */
|
|
599
|
+
cancelText?: string;
|
|
600
|
+
/** Apply 按钮回调 */
|
|
601
|
+
onApply?: (range: DateRange) => void;
|
|
602
|
+
/** Cancel 按钮回调 */
|
|
603
|
+
onCancel?: () => void;
|
|
604
|
+
}
|
|
605
|
+
interface DatePickerSingleProps extends DatePickerBaseProps {
|
|
606
|
+
/** 模式:单个日期 */
|
|
607
|
+
mode?: 'date';
|
|
608
|
+
/** 当前选中的值 */
|
|
609
|
+
value?: Date | null;
|
|
610
|
+
/** 默认选中的值 */
|
|
611
|
+
defaultValue?: Date | null;
|
|
612
|
+
/** 变化回调 */
|
|
613
|
+
onChange?: (date: Date | null) => void;
|
|
614
|
+
}
|
|
615
|
+
interface DatePickerRangeProps extends DatePickerBaseProps {
|
|
616
|
+
/** 模式:日期范围 */
|
|
617
|
+
mode: 'range';
|
|
618
|
+
/** 当前选中的值 */
|
|
619
|
+
value?: DateRange;
|
|
620
|
+
/** 默认选中的值 */
|
|
621
|
+
defaultValue?: DateRange;
|
|
622
|
+
/** 变化回调 */
|
|
623
|
+
onChange?: (range: DateRange) => void;
|
|
624
|
+
}
|
|
625
|
+
type DatePickerProps = DatePickerSingleProps | DatePickerRangeProps;
|
|
626
|
+
declare const DatePicker: React.FC<DatePickerProps>;
|
|
627
|
+
|
|
545
628
|
interface FormItemProps {
|
|
546
629
|
/** 字段名 */
|
|
547
630
|
name?: string;
|
|
@@ -789,4 +872,4 @@ declare const MinusIcon: React.FC<{
|
|
|
789
872
|
style?: React.CSSProperties;
|
|
790
873
|
}>;
|
|
791
874
|
|
|
792
|
-
export { Alert, AlertProps, Button, ButtonProps, CheckIcon, Checkbox, CheckboxProps, ColumnType, FormWithItem as Form, FormInstance, FormItemProps, FormProps, Input, InputProps, MenuGroupType, MenuItemType, MenuList, MenuListProps, MinusIcon, Pagination, PaginationProps, Progress, ProgressProps, ProgressStatus, ProgressType, Radio, RadioProps, Select, SelectOption, SelectProps, SortOrder, SorterResult, Switch, SwitchProps, Tab, TabItem, TabLayout, TabProps, TabVariant, Table, TableCurrentDataSource, TableLayout, TableProps, TableRowSelection, TableSize, Tag, TagProps, Textarea, TextareaProps, ThemeConfig, ThemeProvider, ThemeProviderProps, Toast, ToastPosition, ToastProps, ToastProvider, ToastType, Tooltip, TooltipPosition, TooltipProps, UserProfileType, clearAllToasts, closeToast, debugToast, toast, toastError, toastInfo, toastQuestion, toastSuccess, useTheme };
|
|
875
|
+
export { Alert, AlertProps, Button, ButtonProps, CheckIcon, Checkbox, CheckboxProps, ColumnType, DatePicker, DatePickerProps, DateRange, FormWithItem as Form, FormInstance, FormItemProps, FormProps, Input, InputProps, MenuGroupType, MenuItemType, MenuList, MenuListProps, MinusIcon, Pagination, PaginationProps, Progress, ProgressProps, ProgressStatus, ProgressType, Radio, RadioProps, Select, SelectOption, SelectProps, SortOrder, SorterResult, Switch, SwitchProps, Tab, TabItem, TabLayout, TabProps, TabVariant, Table, TableCurrentDataSource, TableLayout, TableProps, TableRowSelection, TableSize, Tag, TagProps, Textarea, TextareaProps, ThemeConfig, ThemeProvider, ThemeProviderProps, Toast, ToastPosition, ToastProps, ToastProvider, ToastType, Tooltip, TooltipPosition, TooltipProps, UserProfileType, clearAllToasts, closeToast, debugToast, toast, toastError, toastInfo, toastQuestion, toastSuccess, useTheme };
|