wssf-kage-ui 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +4 -4
  2. package/dist/cjs/Anchor/index.d.ts +56 -0
  3. package/dist/cjs/Anchor/index.js +307 -0
  4. package/dist/cjs/Anchor/style.less +183 -0
  5. package/dist/cjs/AutoComplete/index.d.ts +54 -0
  6. package/dist/cjs/AutoComplete/index.js +273 -0
  7. package/dist/cjs/AutoComplete/style.less +325 -0
  8. package/dist/cjs/Breadcrumb/index.d.ts +51 -0
  9. package/dist/cjs/Breadcrumb/index.js +129 -0
  10. package/dist/cjs/Breadcrumb/style.less +96 -0
  11. package/dist/cjs/Cascader/index.d.ts +53 -0
  12. package/dist/cjs/Cascader/index.js +338 -0
  13. package/dist/cjs/Cascader/style.less +457 -0
  14. package/dist/cjs/Checkbox/index.d.ts +52 -0
  15. package/dist/cjs/Checkbox/index.js +158 -0
  16. package/dist/cjs/Checkbox/style.less +211 -0
  17. package/dist/cjs/ColorPicker/index.d.ts +28 -0
  18. package/dist/cjs/ColorPicker/index.js +381 -0
  19. package/dist/cjs/ColorPicker/style.less +276 -0
  20. package/dist/cjs/DatePicker/index.d.ts +32 -0
  21. package/dist/cjs/DatePicker/index.js +377 -0
  22. package/dist/cjs/DatePicker/style.less +498 -0
  23. package/dist/cjs/Divider/index.d.ts +24 -0
  24. package/dist/cjs/Divider/index.js +75 -0
  25. package/dist/cjs/Divider/style.less +144 -0
  26. package/dist/cjs/Dropdown/index.d.ts +88 -0
  27. package/dist/cjs/Dropdown/index.js +253 -0
  28. package/dist/cjs/Dropdown/style.less +430 -0
  29. package/dist/cjs/Flex/index.d.ts +37 -0
  30. package/dist/cjs/Flex/index.js +76 -0
  31. package/dist/cjs/Flex/style.less +13 -0
  32. package/dist/cjs/Form/index.d.ts +89 -0
  33. package/dist/cjs/Form/index.js +421 -0
  34. package/dist/cjs/Form/style.less +203 -0
  35. package/dist/cjs/Grid/index.d.ts +69 -0
  36. package/dist/cjs/Grid/index.js +171 -0
  37. package/dist/cjs/Grid/style.less +273 -0
  38. package/dist/cjs/Layout/index.d.ts +74 -0
  39. package/dist/cjs/Layout/index.js +166 -0
  40. package/dist/cjs/Layout/style.less +145 -0
  41. package/dist/cjs/Masonry/index.d.ts +18 -0
  42. package/dist/cjs/Masonry/index.js +146 -0
  43. package/dist/cjs/Masonry/style.less +15 -0
  44. package/dist/cjs/Menu/index.d.ts +87 -0
  45. package/dist/cjs/Menu/index.js +306 -0
  46. package/dist/cjs/Menu/style.less +363 -0
  47. package/dist/cjs/Pagination/index.d.ts +38 -0
  48. package/dist/cjs/Pagination/index.js +255 -0
  49. package/dist/cjs/Pagination/style.less +353 -0
  50. package/dist/cjs/Space/index.d.ts +41 -0
  51. package/dist/cjs/Space/index.js +137 -0
  52. package/dist/cjs/Space/style.less +116 -0
  53. package/dist/cjs/Splitter/index.d.ts +43 -0
  54. package/dist/cjs/Splitter/index.js +219 -0
  55. package/dist/cjs/Splitter/style.less +99 -0
  56. package/dist/cjs/Steps/index.d.ts +58 -0
  57. package/dist/cjs/Steps/index.js +180 -0
  58. package/dist/cjs/Steps/style.less +507 -0
  59. package/dist/cjs/Tabs/index.d.ts +58 -0
  60. package/dist/cjs/Tabs/index.js +196 -0
  61. package/dist/cjs/Tabs/style.less +423 -0
  62. package/dist/cjs/Typography/index.d.ts +102 -0
  63. package/dist/cjs/Typography/index.js +168 -0
  64. package/dist/cjs/Typography/style.less +246 -0
  65. package/dist/cjs/index.d.ts +42 -0
  66. package/dist/cjs/index.js +260 -1
  67. package/dist/esm/Anchor/index.d.ts +56 -0
  68. package/dist/esm/Anchor/index.js +302 -0
  69. package/dist/esm/Anchor/style.less +183 -0
  70. package/dist/esm/AutoComplete/index.d.ts +54 -0
  71. package/dist/esm/AutoComplete/index.js +268 -0
  72. package/dist/esm/AutoComplete/style.less +325 -0
  73. package/dist/esm/Breadcrumb/index.d.ts +51 -0
  74. package/dist/esm/Breadcrumb/index.js +124 -0
  75. package/dist/esm/Breadcrumb/style.less +96 -0
  76. package/dist/esm/Cascader/index.d.ts +53 -0
  77. package/dist/esm/Cascader/index.js +333 -0
  78. package/dist/esm/Cascader/style.less +457 -0
  79. package/dist/esm/Checkbox/index.d.ts +52 -0
  80. package/dist/esm/Checkbox/index.js +152 -0
  81. package/dist/esm/Checkbox/style.less +211 -0
  82. package/dist/esm/ColorPicker/index.d.ts +28 -0
  83. package/dist/esm/ColorPicker/index.js +375 -0
  84. package/dist/esm/ColorPicker/style.less +276 -0
  85. package/dist/esm/DatePicker/index.d.ts +32 -0
  86. package/dist/esm/DatePicker/index.js +371 -0
  87. package/dist/esm/DatePicker/style.less +498 -0
  88. package/dist/esm/Divider/index.d.ts +24 -0
  89. package/dist/esm/Divider/index.js +68 -0
  90. package/dist/esm/Divider/style.less +144 -0
  91. package/dist/esm/Dropdown/index.d.ts +88 -0
  92. package/dist/esm/Dropdown/index.js +249 -0
  93. package/dist/esm/Dropdown/style.less +430 -0
  94. package/dist/esm/Flex/index.d.ts +37 -0
  95. package/dist/esm/Flex/index.js +69 -0
  96. package/dist/esm/Flex/style.less +13 -0
  97. package/dist/esm/Form/index.d.ts +89 -0
  98. package/dist/esm/Form/index.js +416 -0
  99. package/dist/esm/Form/style.less +203 -0
  100. package/dist/esm/Grid/index.d.ts +69 -0
  101. package/dist/esm/Grid/index.js +165 -0
  102. package/dist/esm/Grid/style.less +273 -0
  103. package/dist/esm/Layout/index.d.ts +74 -0
  104. package/dist/esm/Layout/index.js +161 -0
  105. package/dist/esm/Layout/style.less +145 -0
  106. package/dist/esm/Masonry/index.d.ts +18 -0
  107. package/dist/esm/Masonry/index.js +138 -0
  108. package/dist/esm/Masonry/style.less +15 -0
  109. package/dist/esm/Menu/index.d.ts +87 -0
  110. package/dist/esm/Menu/index.js +301 -0
  111. package/dist/esm/Menu/style.less +363 -0
  112. package/dist/esm/Pagination/index.d.ts +38 -0
  113. package/dist/esm/Pagination/index.js +247 -0
  114. package/dist/esm/Pagination/style.less +353 -0
  115. package/dist/esm/Space/index.d.ts +41 -0
  116. package/dist/esm/Space/index.js +131 -0
  117. package/dist/esm/Space/style.less +116 -0
  118. package/dist/esm/Splitter/index.d.ts +43 -0
  119. package/dist/esm/Splitter/index.js +214 -0
  120. package/dist/esm/Splitter/style.less +99 -0
  121. package/dist/esm/Steps/index.d.ts +58 -0
  122. package/dist/esm/Steps/index.js +174 -0
  123. package/dist/esm/Steps/style.less +507 -0
  124. package/dist/esm/Tabs/index.d.ts +58 -0
  125. package/dist/esm/Tabs/index.js +193 -0
  126. package/dist/esm/Tabs/style.less +423 -0
  127. package/dist/esm/Typography/index.d.ts +102 -0
  128. package/dist/esm/Typography/index.js +161 -0
  129. package/dist/esm/Typography/style.less +246 -0
  130. package/dist/esm/index.d.ts +42 -0
  131. package/dist/esm/index.js +22 -1
  132. package/package.json +13 -10
@@ -0,0 +1,276 @@
1
+ // ColorPicker 颜色选择器组件样式
2
+
3
+ @prefix: kage-color-picker;
4
+
5
+ // 颜色变量
6
+ @panel-bg: #fff;
7
+ @panel-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12);
8
+ @border-color: #d9d9d9;
9
+ @text-color: rgba(0, 0, 0, 0.88);
10
+ @primary-color: #6366f1;
11
+
12
+ // ============ 基础样式 ============
13
+ .@{prefix} {
14
+ position: relative;
15
+ display: inline-block;
16
+
17
+ * {
18
+ box-sizing: border-box;
19
+ }
20
+ }
21
+
22
+ // ============ 触发器 ============
23
+ .@{prefix}-trigger {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ width: 36px;
28
+ height: 36px;
29
+ padding: 4px;
30
+ background: @panel-bg;
31
+ border: 1px solid @border-color;
32
+ border-radius: 6px;
33
+ cursor: pointer;
34
+ transition: all 0.2s ease;
35
+
36
+ &:hover {
37
+ border-color: @primary-color;
38
+ }
39
+ }
40
+
41
+ .@{prefix}-open .@{prefix}-trigger {
42
+ border-color: @primary-color;
43
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);
44
+ }
45
+
46
+ .@{prefix}-color-block {
47
+ width: 100%;
48
+ height: 100%;
49
+ border-radius: 4px;
50
+ box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.1);
51
+ }
52
+
53
+ .@{prefix}-disabled {
54
+ .@{prefix}-trigger {
55
+ cursor: not-allowed;
56
+ opacity: 0.5;
57
+
58
+ &:hover {
59
+ border-color: @border-color;
60
+ }
61
+ }
62
+ }
63
+
64
+ // ============ 尺寸 ============
65
+ .@{prefix}-large .@{prefix}-trigger {
66
+ width: 44px;
67
+ height: 44px;
68
+ }
69
+
70
+ .@{prefix}-small .@{prefix}-trigger {
71
+ width: 28px;
72
+ height: 28px;
73
+ padding: 3px;
74
+ }
75
+
76
+ // ============ 面板 ============
77
+ .@{prefix}-panel {
78
+ position: absolute;
79
+ top: 100%;
80
+ left: 0;
81
+ z-index: 1050;
82
+ margin-top: 4px;
83
+ padding: 12px;
84
+ background: @panel-bg;
85
+ border-radius: 8px;
86
+ box-shadow: @panel-shadow;
87
+ animation: slideDown 0.2s ease;
88
+ }
89
+
90
+ @keyframes slideDown {
91
+ from {
92
+ opacity: 0;
93
+ transform: translateY(-8px);
94
+ }
95
+ to {
96
+ opacity: 1;
97
+ transform: translateY(0);
98
+ }
99
+ }
100
+
101
+ // ============ 饱和度面板 ============
102
+ .@{prefix}-saturation {
103
+ position: relative;
104
+ width: 200px;
105
+ height: 150px;
106
+ border-radius: 4px;
107
+ cursor: crosshair;
108
+ user-select: none;
109
+ }
110
+
111
+ .@{prefix}-saturation-white {
112
+ position: absolute;
113
+ top: 0;
114
+ right: 0;
115
+ bottom: 0;
116
+ left: 0;
117
+ background: linear-gradient(to right, #fff, transparent);
118
+ border-radius: 4px;
119
+ }
120
+
121
+ .@{prefix}-saturation-black {
122
+ position: absolute;
123
+ top: 0;
124
+ right: 0;
125
+ bottom: 0;
126
+ left: 0;
127
+ background: linear-gradient(to bottom, transparent, #000);
128
+ border-radius: 4px;
129
+ }
130
+
131
+ .@{prefix}-saturation-cursor {
132
+ position: absolute;
133
+ width: 12px;
134
+ height: 12px;
135
+ border: 2px solid #fff;
136
+ border-radius: 50%;
137
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
138
+ transform: translate(-50%, -50%);
139
+ pointer-events: none;
140
+ }
141
+
142
+ // ============ 色相条 ============
143
+ .@{prefix}-hue {
144
+ position: relative;
145
+ width: 100%;
146
+ height: 12px;
147
+ margin-top: 12px;
148
+ border-radius: 6px;
149
+ background: linear-gradient(
150
+ to right,
151
+ #ff0000 0%,
152
+ #ffff00 17%,
153
+ #00ff00 33%,
154
+ #00ffff 50%,
155
+ #0000ff 67%,
156
+ #ff00ff 83%,
157
+ #ff0000 100%
158
+ );
159
+ cursor: pointer;
160
+ user-select: none;
161
+ }
162
+
163
+ .@{prefix}-hue-cursor {
164
+ position: absolute;
165
+ top: 50%;
166
+ width: 14px;
167
+ height: 14px;
168
+ background: #fff;
169
+ border: 2px solid #fff;
170
+ border-radius: 50%;
171
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
172
+ transform: translate(-50%, -50%);
173
+ pointer-events: none;
174
+ }
175
+
176
+ // ============ 输入框 ============
177
+ .@{prefix}-input-wrapper {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 8px;
181
+ margin-top: 12px;
182
+ }
183
+
184
+ .@{prefix}-preview {
185
+ width: 28px;
186
+ height: 28px;
187
+ border-radius: 4px;
188
+ border: 1px solid @border-color;
189
+ flex-shrink: 0;
190
+ }
191
+
192
+ .@{prefix}-input {
193
+ flex: 1;
194
+ height: 28px;
195
+ padding: 4px 8px;
196
+ font-size: 12px;
197
+ font-family: monospace;
198
+ color: @text-color;
199
+ background: @panel-bg;
200
+ border: 1px solid @border-color;
201
+ border-radius: 4px;
202
+ outline: none;
203
+ transition: all 0.2s ease;
204
+
205
+ &:focus {
206
+ border-color: @primary-color;
207
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.1);
208
+ }
209
+ }
210
+
211
+ // ============ 预设颜色 ============
212
+ .@{prefix}-presets {
213
+ display: flex;
214
+ flex-wrap: wrap;
215
+ gap: 6px;
216
+ margin-top: 12px;
217
+ padding-top: 12px;
218
+ border-top: 1px solid rgba(0, 0, 0, 0.06);
219
+ }
220
+
221
+ .@{prefix}-preset {
222
+ width: 20px;
223
+ height: 20px;
224
+ border-radius: 4px;
225
+ cursor: pointer;
226
+ transition: transform 0.2s ease;
227
+ box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.2);
228
+
229
+ &:hover {
230
+ transform: scale(1.15);
231
+ }
232
+ }
233
+
234
+ // ============ 暗色模式适配 ============
235
+ [data-theme='dark'],
236
+ [data-prefers-color-scheme='dark'],
237
+ [data-prefers-color='dark'] {
238
+ .@{prefix}-trigger {
239
+ background: #1f1f1f;
240
+ border-color: #424242;
241
+
242
+ &:hover {
243
+ border-color: #818cf8;
244
+ }
245
+ }
246
+
247
+ .@{prefix}-open .@{prefix}-trigger {
248
+ border-color: #818cf8;
249
+ box-shadow: 0 0 0 2px rgba(129, 140, 248, 0.2);
250
+ }
251
+
252
+ .@{prefix}-panel {
253
+ background: #1f1f1f;
254
+ box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.3);
255
+ }
256
+
257
+ .@{prefix}-preview {
258
+ border-color: #424242;
259
+ }
260
+
261
+ .@{prefix}-input {
262
+ background: #1f1f1f;
263
+ border-color: #424242;
264
+ color: rgba(255, 255, 255, 0.85);
265
+
266
+ &:focus {
267
+ border-color: #818cf8;
268
+ box-shadow: 0 0 0 2px rgba(129, 140, 248, 0.2);
269
+ }
270
+ }
271
+
272
+ .@{prefix}-presets {
273
+ border-top-color: rgba(255, 255, 255, 0.12);
274
+ }
275
+ }
276
+
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import './style.less';
3
+ export interface DatePickerProps {
4
+ /** 当前值 */
5
+ value?: Date | string;
6
+ /** 默认值 */
7
+ defaultValue?: Date | string;
8
+ /** 占位符 */
9
+ placeholder?: string;
10
+ /** 日期格式 */
11
+ format?: string;
12
+ /** 是否禁用 */
13
+ disabled?: boolean;
14
+ /** 允许清除 */
15
+ allowClear?: boolean;
16
+ /** 尺寸 */
17
+ size?: 'large' | 'middle' | 'small';
18
+ /** 状态 */
19
+ status?: 'error' | 'warning';
20
+ /** 禁用日期函数 */
21
+ disabledDate?: (date: Date) => boolean;
22
+ /** 值变化回调 */
23
+ onChange?: (date: Date | null, dateString: string) => void;
24
+ /** 面板打开/关闭回调 */
25
+ onOpenChange?: (open: boolean) => void;
26
+ /** 自定义类名 */
27
+ className?: string;
28
+ /** 自定义样式 */
29
+ style?: React.CSSProperties;
30
+ }
31
+ export declare const DatePicker: React.FC<DatePickerProps>;
32
+ export default DatePicker;
@@ -0,0 +1,377 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = exports.DatePicker = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ require("./style.less");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
12
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
14
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
17
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
18
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // ============ 日期工具函数 ============
19
+ var formatDate = function formatDate(date) {
20
+ var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'YYYY-MM-DD';
21
+ var year = date.getFullYear();
22
+ var month = String(date.getMonth() + 1).padStart(2, '0');
23
+ var day = String(date.getDate()).padStart(2, '0');
24
+ return format.replace('YYYY', String(year)).replace('MM', month).replace('DD', day);
25
+ };
26
+ var parseDate = function parseDate(dateStr) {
27
+ var date = new Date(dateStr);
28
+ return isNaN(date.getTime()) ? null : date;
29
+ };
30
+ var isSameDay = function isSameDay(date1, date2) {
31
+ return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate();
32
+ };
33
+ var getDaysInMonth = function getDaysInMonth(year, month) {
34
+ return new Date(year, month + 1, 0).getDate();
35
+ };
36
+ var getFirstDayOfMonth = function getFirstDayOfMonth(year, month) {
37
+ return new Date(year, month, 1).getDay();
38
+ };
39
+
40
+ // ============ DatePicker Props ============
41
+
42
+ // ============ DatePicker Component ============
43
+ var DatePicker = exports.DatePicker = function DatePicker(_ref) {
44
+ var controlledValue = _ref.value,
45
+ defaultValue = _ref.defaultValue,
46
+ _ref$placeholder = _ref.placeholder,
47
+ placeholder = _ref$placeholder === void 0 ? '请选择日期' : _ref$placeholder,
48
+ _ref$format = _ref.format,
49
+ format = _ref$format === void 0 ? 'YYYY-MM-DD' : _ref$format,
50
+ _ref$disabled = _ref.disabled,
51
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
52
+ _ref$allowClear = _ref.allowClear,
53
+ allowClear = _ref$allowClear === void 0 ? true : _ref$allowClear,
54
+ _ref$size = _ref.size,
55
+ size = _ref$size === void 0 ? 'middle' : _ref$size,
56
+ status = _ref.status,
57
+ disabledDate = _ref.disabledDate,
58
+ onChange = _ref.onChange,
59
+ onOpenChange = _ref.onOpenChange,
60
+ _ref$className = _ref.className,
61
+ className = _ref$className === void 0 ? '' : _ref$className,
62
+ style = _ref.style;
63
+ // 解析初始值
64
+ var parseInitialValue = function parseInitialValue(val) {
65
+ if (!val) return null;
66
+ if (val instanceof Date) return val;
67
+ return parseDate(val);
68
+ };
69
+ var _useState = (0, _react.useState)(parseInitialValue(defaultValue)),
70
+ _useState2 = _slicedToArray(_useState, 2),
71
+ internalValue = _useState2[0],
72
+ setInternalValue = _useState2[1];
73
+ var _useState3 = (0, _react.useState)(false),
74
+ _useState4 = _slicedToArray(_useState3, 2),
75
+ isOpen = _useState4[0],
76
+ setIsOpen = _useState4[1];
77
+ var _useState5 = (0, _react.useState)(new Date()),
78
+ _useState6 = _slicedToArray(_useState5, 2),
79
+ viewDate = _useState6[0],
80
+ setViewDate = _useState6[1];
81
+ var _useState7 = (0, _react.useState)('date'),
82
+ _useState8 = _slicedToArray(_useState7, 2),
83
+ viewMode = _useState8[0],
84
+ setViewMode = _useState8[1];
85
+ var containerRef = (0, _react.useRef)(null);
86
+ var value = controlledValue !== undefined ? parseInitialValue(controlledValue) : internalValue;
87
+
88
+ // 同步 viewDate
89
+ (0, _react.useEffect)(function () {
90
+ if (value) {
91
+ setViewDate(new Date(value));
92
+ }
93
+ }, [value]);
94
+
95
+ // 打开/关闭面板
96
+ var setOpen = (0, _react.useCallback)(function (open) {
97
+ if (disabled) return;
98
+ setIsOpen(open);
99
+ onOpenChange === null || onOpenChange === void 0 || onOpenChange(open);
100
+ if (open) {
101
+ setViewMode('date');
102
+ if (value) {
103
+ setViewDate(new Date(value));
104
+ } else {
105
+ setViewDate(new Date());
106
+ }
107
+ }
108
+ }, [disabled, value, onOpenChange]);
109
+
110
+ // 点击外部关闭
111
+ (0, _react.useEffect)(function () {
112
+ var handleClickOutside = function handleClickOutside(e) {
113
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
114
+ setOpen(false);
115
+ }
116
+ };
117
+ document.addEventListener('mousedown', handleClickOutside);
118
+ return function () {
119
+ return document.removeEventListener('mousedown', handleClickOutside);
120
+ };
121
+ }, [setOpen]);
122
+
123
+ // 选择日期
124
+ var handleSelectDate = (0, _react.useCallback)(function (date) {
125
+ if (disabledDate !== null && disabledDate !== void 0 && disabledDate(date)) return;
126
+ if (controlledValue === undefined) {
127
+ setInternalValue(date);
128
+ }
129
+ onChange === null || onChange === void 0 || onChange(date, formatDate(date, format));
130
+ setOpen(false);
131
+ }, [controlledValue, format, disabledDate, onChange, setOpen]);
132
+
133
+ // 清除
134
+ var handleClear = (0, _react.useCallback)(function (e) {
135
+ e.stopPropagation();
136
+ if (controlledValue === undefined) {
137
+ setInternalValue(null);
138
+ }
139
+ onChange === null || onChange === void 0 || onChange(null, '');
140
+ }, [controlledValue, onChange]);
141
+
142
+ // 切换月份
143
+ var handlePrevMonth = (0, _react.useCallback)(function () {
144
+ setViewDate(function (prev) {
145
+ return new Date(prev.getFullYear(), prev.getMonth() - 1, 1);
146
+ });
147
+ }, []);
148
+ var handleNextMonth = (0, _react.useCallback)(function () {
149
+ setViewDate(function (prev) {
150
+ return new Date(prev.getFullYear(), prev.getMonth() + 1, 1);
151
+ });
152
+ }, []);
153
+
154
+ // 切换年份
155
+ var handlePrevYear = (0, _react.useCallback)(function () {
156
+ if (viewMode === 'year') {
157
+ setViewDate(function (prev) {
158
+ return new Date(prev.getFullYear() - 12, prev.getMonth(), 1);
159
+ });
160
+ } else {
161
+ setViewDate(function (prev) {
162
+ return new Date(prev.getFullYear() - 1, prev.getMonth(), 1);
163
+ });
164
+ }
165
+ }, [viewMode]);
166
+ var handleNextYear = (0, _react.useCallback)(function () {
167
+ if (viewMode === 'year') {
168
+ setViewDate(function (prev) {
169
+ return new Date(prev.getFullYear() + 12, prev.getMonth(), 1);
170
+ });
171
+ } else {
172
+ setViewDate(function (prev) {
173
+ return new Date(prev.getFullYear() + 1, prev.getMonth(), 1);
174
+ });
175
+ }
176
+ }, [viewMode]);
177
+
178
+ // 选择月份
179
+ var handleSelectMonth = (0, _react.useCallback)(function (month) {
180
+ setViewDate(function (prev) {
181
+ return new Date(prev.getFullYear(), month, 1);
182
+ });
183
+ setViewMode('date');
184
+ }, []);
185
+
186
+ // 选择年份
187
+ var handleSelectYear = (0, _react.useCallback)(function (year) {
188
+ setViewDate(function (prev) {
189
+ return new Date(year, prev.getMonth(), 1);
190
+ });
191
+ setViewMode('month');
192
+ }, []);
193
+
194
+ // 选择今天
195
+ var handleToday = (0, _react.useCallback)(function () {
196
+ var today = new Date();
197
+ handleSelectDate(today);
198
+ }, [handleSelectDate]);
199
+
200
+ // 生成日期网格
201
+ var generateDateGrid = (0, _react.useCallback)(function () {
202
+ var year = viewDate.getFullYear();
203
+ var month = viewDate.getMonth();
204
+ var daysInMonth = getDaysInMonth(year, month);
205
+ var firstDay = getFirstDayOfMonth(year, month);
206
+ var prevMonthDays = getDaysInMonth(year, month - 1);
207
+ var days = [];
208
+
209
+ // 上个月的天数
210
+ for (var i = firstDay - 1; i >= 0; i--) {
211
+ days.push({
212
+ date: new Date(year, month - 1, prevMonthDays - i),
213
+ isCurrentMonth: false
214
+ });
215
+ }
216
+
217
+ // 当前月的天数
218
+ for (var _i = 1; _i <= daysInMonth; _i++) {
219
+ days.push({
220
+ date: new Date(year, month, _i),
221
+ isCurrentMonth: true
222
+ });
223
+ }
224
+
225
+ // 下个月的天数
226
+ var remaining = 42 - days.length;
227
+ for (var _i2 = 1; _i2 <= remaining; _i2++) {
228
+ days.push({
229
+ date: new Date(year, month + 1, _i2),
230
+ isCurrentMonth: false
231
+ });
232
+ }
233
+ return days;
234
+ }, [viewDate]);
235
+
236
+ // 生成月份网格
237
+ var generateMonthGrid = (0, _react.useCallback)(function () {
238
+ var months = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
239
+ return months.map(function (name, index) {
240
+ return {
241
+ name: name,
242
+ index: index
243
+ };
244
+ });
245
+ }, []);
246
+
247
+ // 生成年份网格
248
+ var generateYearGrid = (0, _react.useCallback)(function () {
249
+ var currentYear = viewDate.getFullYear();
250
+ var startYear = Math.floor(currentYear / 12) * 12;
251
+ var years = [];
252
+ for (var i = 0; i < 12; i++) {
253
+ years.push(startYear + i);
254
+ }
255
+ return years;
256
+ }, [viewDate]);
257
+ var classNames = ['kage-datepicker', "kage-datepicker-".concat(size), disabled && 'kage-datepicker-disabled', status && "kage-datepicker-status-".concat(status), isOpen && 'kage-datepicker-open', className].filter(Boolean).join(' ');
258
+ var weekDays = ['日', '一', '二', '三', '四', '五', '六'];
259
+ var today = new Date();
260
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
261
+ ref: containerRef,
262
+ className: classNames,
263
+ style: style,
264
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
265
+ className: "kage-datepicker-input",
266
+ onClick: function onClick() {
267
+ return setOpen(!isOpen);
268
+ },
269
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
270
+ className: "kage-datepicker-value ".concat(!value ? 'kage-datepicker-placeholder' : ''),
271
+ children: value ? formatDate(value, format) : placeholder
272
+ }), allowClear && value && !disabled && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
273
+ className: "kage-datepicker-clear",
274
+ onClick: handleClear,
275
+ children: "\xD7"
276
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
277
+ className: "kage-datepicker-icon",
278
+ children: "\uD83D\uDCC5"
279
+ })]
280
+ }), isOpen && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
281
+ className: "kage-datepicker-panel",
282
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
283
+ className: "kage-datepicker-header",
284
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
285
+ className: "kage-datepicker-header-btn",
286
+ onClick: handlePrevYear,
287
+ children: "\xAB"
288
+ }), viewMode === 'date' && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
289
+ className: "kage-datepicker-header-btn",
290
+ onClick: handlePrevMonth,
291
+ children: "\u2039"
292
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
293
+ className: "kage-datepicker-header-title",
294
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
295
+ onClick: function onClick() {
296
+ return setViewMode('year');
297
+ },
298
+ children: [viewMode === 'year' ? "".concat(generateYearGrid()[0], " - ").concat(generateYearGrid()[11]) : viewDate.getFullYear(), "\u5E74"]
299
+ }), viewMode === 'date' && /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
300
+ onClick: function onClick() {
301
+ return setViewMode('month');
302
+ },
303
+ children: [viewDate.getMonth() + 1, "\u6708"]
304
+ })]
305
+ }), viewMode === 'date' && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
306
+ className: "kage-datepicker-header-btn",
307
+ onClick: handleNextMonth,
308
+ children: "\u203A"
309
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
310
+ className: "kage-datepicker-header-btn",
311
+ onClick: handleNextYear,
312
+ children: "\xBB"
313
+ })]
314
+ }), viewMode === 'date' && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
315
+ className: "kage-datepicker-body",
316
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
317
+ className: "kage-datepicker-weekdays",
318
+ children: weekDays.map(function (day) {
319
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
320
+ className: "kage-datepicker-weekday",
321
+ children: day
322
+ }, day);
323
+ })
324
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
325
+ className: "kage-datepicker-dates",
326
+ children: generateDateGrid().map(function (_ref2, index) {
327
+ var date = _ref2.date,
328
+ isCurrentMonth = _ref2.isCurrentMonth;
329
+ var isSelected = value && isSameDay(date, value);
330
+ var isToday = isSameDay(date, today);
331
+ var isDisabled = disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date);
332
+ var dayClassNames = ['kage-datepicker-date', !isCurrentMonth && 'kage-datepicker-date-other', isSelected && 'kage-datepicker-date-selected', isToday && 'kage-datepicker-date-today', isDisabled && 'kage-datepicker-date-disabled'].filter(Boolean).join(' ');
333
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
334
+ className: dayClassNames,
335
+ onClick: function onClick() {
336
+ return !isDisabled && handleSelectDate(date);
337
+ },
338
+ children: date.getDate()
339
+ }, index);
340
+ })
341
+ })]
342
+ }), viewMode === 'month' && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
343
+ className: "kage-datepicker-months",
344
+ children: generateMonthGrid().map(function (_ref3) {
345
+ var name = _ref3.name,
346
+ index = _ref3.index;
347
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
348
+ className: "kage-datepicker-month ".concat(viewDate.getMonth() === index ? 'kage-datepicker-month-selected' : ''),
349
+ onClick: function onClick() {
350
+ return handleSelectMonth(index);
351
+ },
352
+ children: name
353
+ }, index);
354
+ })
355
+ }), viewMode === 'year' && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
356
+ className: "kage-datepicker-years",
357
+ children: generateYearGrid().map(function (year) {
358
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
359
+ className: "kage-datepicker-year ".concat(viewDate.getFullYear() === year ? 'kage-datepicker-year-selected' : ''),
360
+ onClick: function onClick() {
361
+ return handleSelectYear(year);
362
+ },
363
+ children: year
364
+ }, year);
365
+ })
366
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
367
+ className: "kage-datepicker-footer",
368
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
369
+ className: "kage-datepicker-today",
370
+ onClick: handleToday,
371
+ children: "\u4ECA\u5929"
372
+ })
373
+ })]
374
+ })]
375
+ });
376
+ };
377
+ var _default = exports.default = DatePicker;