antd-mobile 5.42.3 → 5.43.0

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 (202) hide show
  1. package/2x/bundle/antd-mobile.cjs.development.js +2383 -2054
  2. package/2x/bundle/antd-mobile.cjs.js +8 -7
  3. package/2x/bundle/antd-mobile.es.development.js +1545 -1216
  4. package/2x/bundle/antd-mobile.es.js +9230 -8978
  5. package/2x/bundle/antd-mobile.umd.development.js +2380 -2051
  6. package/2x/bundle/antd-mobile.umd.js +8 -7
  7. package/2x/bundle/style.css +116 -90
  8. package/2x/cjs/components/cascader/cascader.css +5 -0
  9. package/2x/cjs/components/cascader/cascader.d.ts +5 -3
  10. package/2x/cjs/components/cascader/cascader.js +6 -7
  11. package/2x/cjs/components/cascader/index.d.ts +2 -1
  12. package/2x/cjs/components/cascader-view/cascader-view.d.ts +8 -2
  13. package/2x/cjs/components/cascader-view/cascader-view.js +13 -10
  14. package/2x/cjs/components/cascader-view/index.d.ts +1 -1
  15. package/2x/cjs/components/date-picker/date-picker-date-utils.js +4 -10
  16. package/2x/cjs/components/date-picker/date-picker-week-utils.js +4 -4
  17. package/2x/cjs/components/date-picker/date-picker.d.ts +1 -1
  18. package/2x/cjs/components/date-picker/index.d.ts +1 -1
  19. package/2x/cjs/components/dropdown/dropdown.d.ts +6 -0
  20. package/2x/cjs/components/dropdown/dropdown.js +38 -7
  21. package/2x/cjs/components/dropdown/index.d.ts +3 -0
  22. package/2x/cjs/components/error-block/create-error-block.d.ts +3 -4
  23. package/2x/cjs/components/error-block/create-error-block.js +2 -2
  24. package/2x/cjs/components/error-block/images/busy.js +94 -89
  25. package/2x/cjs/components/error-block/images/default.js +170 -165
  26. package/2x/cjs/components/error-block/images/disconnected.js +127 -122
  27. package/2x/cjs/components/error-block/images/empty.js +123 -118
  28. package/2x/cjs/components/error-block/images/index.d.ts +1 -1
  29. package/2x/cjs/components/error-block/images/index.js +2 -2
  30. package/2x/cjs/components/floating-panel/floating-panel.d.ts +2 -0
  31. package/2x/cjs/components/floating-panel/floating-panel.js +7 -3
  32. package/2x/cjs/components/form/form-item.js +19 -11
  33. package/2x/cjs/components/form/index.d.ts +1 -1
  34. package/2x/cjs/components/input/input.d.ts +4 -2
  35. package/2x/cjs/components/input/input.js +6 -4
  36. package/2x/cjs/components/list/list-item.js +1 -1
  37. package/2x/cjs/components/notice-bar/notice-bar.js +2 -1
  38. package/2x/cjs/components/passcode-input/passcode-input.css +20 -0
  39. package/2x/cjs/components/passcode-input/passcode-input.d.ts +2 -0
  40. package/2x/cjs/components/passcode-input/passcode-input.js +6 -3
  41. package/2x/cjs/components/popover/popover.js +11 -1
  42. package/2x/cjs/components/popover/use-showing-guard.d.ts +12 -0
  43. package/2x/cjs/components/popover/use-showing-guard.js +40 -0
  44. package/2x/cjs/components/search-bar/search-bar.js +4 -5
  45. package/2x/cjs/components/segmented/segmented.css +1 -0
  46. package/2x/cjs/components/swipe-action/swipe-action.js +37 -21
  47. package/2x/cjs/components/swiper/index.d.ts +3 -1
  48. package/2x/cjs/components/swiper/swiper.d.ts +9 -2
  49. package/2x/cjs/components/swiper/swiper.js +36 -18
  50. package/2x/cjs/components/text-area/text-area.d.ts +1 -1
  51. package/2x/cjs/components/text-area/text-area.js +4 -3
  52. package/2x/cjs/components/virtual-input/use-click-outside.js +6 -4
  53. package/2x/cjs/utils/convert-px.js +7 -2
  54. package/2x/es/components/cascader/cascader.css +5 -0
  55. package/2x/es/components/cascader/cascader.d.ts +5 -3
  56. package/2x/es/components/cascader/cascader.js +7 -8
  57. package/2x/es/components/cascader/index.d.ts +2 -1
  58. package/2x/es/components/cascader-view/cascader-view.d.ts +8 -2
  59. package/2x/es/components/cascader-view/cascader-view.js +12 -9
  60. package/2x/es/components/cascader-view/index.d.ts +1 -1
  61. package/2x/es/components/date-picker/date-picker-date-utils.js +4 -9
  62. package/2x/es/components/date-picker/date-picker-week-utils.js +4 -4
  63. package/2x/es/components/date-picker/date-picker.d.ts +1 -1
  64. package/2x/es/components/date-picker/index.d.ts +1 -1
  65. package/2x/es/components/dropdown/dropdown.d.ts +6 -0
  66. package/2x/es/components/dropdown/dropdown.js +39 -8
  67. package/2x/es/components/dropdown/index.d.ts +3 -0
  68. package/2x/es/components/error-block/create-error-block.d.ts +3 -4
  69. package/2x/es/components/error-block/create-error-block.js +2 -2
  70. package/2x/es/components/error-block/images/busy.js +94 -89
  71. package/2x/es/components/error-block/images/default.js +170 -165
  72. package/2x/es/components/error-block/images/disconnected.js +127 -122
  73. package/2x/es/components/error-block/images/empty.js +123 -118
  74. package/2x/es/components/error-block/images/index.d.ts +1 -1
  75. package/2x/es/components/error-block/images/index.js +2 -2
  76. package/2x/es/components/floating-panel/floating-panel.d.ts +2 -0
  77. package/2x/es/components/floating-panel/floating-panel.js +7 -3
  78. package/2x/es/components/form/form-item.js +19 -11
  79. package/2x/es/components/form/index.d.ts +1 -1
  80. package/2x/es/components/input/input.d.ts +4 -2
  81. package/2x/es/components/input/input.js +6 -4
  82. package/2x/es/components/list/list-item.js +1 -1
  83. package/2x/es/components/notice-bar/notice-bar.js +2 -1
  84. package/2x/es/components/passcode-input/passcode-input.css +20 -0
  85. package/2x/es/components/passcode-input/passcode-input.d.ts +2 -0
  86. package/2x/es/components/passcode-input/passcode-input.js +6 -3
  87. package/2x/es/components/popover/popover.js +11 -1
  88. package/2x/es/components/popover/use-showing-guard.d.ts +12 -0
  89. package/2x/es/components/popover/use-showing-guard.js +34 -0
  90. package/2x/es/components/search-bar/search-bar.js +4 -5
  91. package/2x/es/components/segmented/segmented.css +1 -0
  92. package/2x/es/components/swipe-action/swipe-action.js +37 -21
  93. package/2x/es/components/swiper/index.d.ts +3 -1
  94. package/2x/es/components/swiper/swiper.d.ts +9 -2
  95. package/2x/es/components/swiper/swiper.js +35 -19
  96. package/2x/es/components/text-area/text-area.d.ts +1 -1
  97. package/2x/es/components/text-area/text-area.js +4 -3
  98. package/2x/es/components/virtual-input/use-click-outside.js +7 -4
  99. package/2x/es/utils/convert-px.js +7 -2
  100. package/2x/package.json +1 -1
  101. package/bundle/antd-mobile.cjs.development.js +2383 -2054
  102. package/bundle/antd-mobile.cjs.js +8 -7
  103. package/bundle/antd-mobile.compatible.umd.js +1 -1
  104. package/bundle/antd-mobile.es.development.js +1545 -1216
  105. package/bundle/antd-mobile.es.js +9230 -8978
  106. package/bundle/antd-mobile.umd.development.js +2380 -2051
  107. package/bundle/antd-mobile.umd.js +8 -7
  108. package/bundle/style.css +1 -1
  109. package/cjs/components/cascader/cascader.css +4 -0
  110. package/cjs/components/cascader/cascader.d.ts +5 -3
  111. package/cjs/components/cascader/cascader.js +6 -7
  112. package/cjs/components/cascader/index.d.ts +2 -1
  113. package/cjs/components/cascader-view/cascader-view.d.ts +8 -2
  114. package/cjs/components/cascader-view/cascader-view.js +13 -10
  115. package/cjs/components/cascader-view/index.d.ts +1 -1
  116. package/cjs/components/date-picker/date-picker-date-utils.js +4 -10
  117. package/cjs/components/date-picker/date-picker-week-utils.js +4 -4
  118. package/cjs/components/date-picker/date-picker.d.ts +1 -1
  119. package/cjs/components/date-picker/index.d.ts +1 -1
  120. package/cjs/components/dropdown/dropdown.d.ts +6 -0
  121. package/cjs/components/dropdown/dropdown.js +38 -7
  122. package/cjs/components/dropdown/index.d.ts +3 -0
  123. package/cjs/components/error-block/create-error-block.d.ts +3 -4
  124. package/cjs/components/error-block/create-error-block.js +2 -2
  125. package/cjs/components/error-block/images/busy.js +94 -89
  126. package/cjs/components/error-block/images/default.js +170 -165
  127. package/cjs/components/error-block/images/disconnected.js +127 -122
  128. package/cjs/components/error-block/images/empty.js +123 -118
  129. package/cjs/components/error-block/images/index.d.ts +1 -1
  130. package/cjs/components/error-block/images/index.js +2 -2
  131. package/cjs/components/floating-panel/floating-panel.d.ts +2 -0
  132. package/cjs/components/floating-panel/floating-panel.js +7 -3
  133. package/cjs/components/form/form-item.js +19 -11
  134. package/cjs/components/form/index.d.ts +1 -1
  135. package/cjs/components/input/input.d.ts +4 -2
  136. package/cjs/components/input/input.js +6 -4
  137. package/cjs/components/list/list-item.js +1 -1
  138. package/cjs/components/notice-bar/notice-bar.js +2 -1
  139. package/cjs/components/passcode-input/passcode-input.css +15 -0
  140. package/cjs/components/passcode-input/passcode-input.d.ts +2 -0
  141. package/cjs/components/passcode-input/passcode-input.js +6 -3
  142. package/cjs/components/popover/popover.js +11 -1
  143. package/cjs/components/popover/use-showing-guard.d.ts +12 -0
  144. package/cjs/components/popover/use-showing-guard.js +40 -0
  145. package/cjs/components/search-bar/search-bar.js +4 -5
  146. package/cjs/components/segmented/segmented.css +1 -0
  147. package/cjs/components/swipe-action/swipe-action.js +37 -21
  148. package/cjs/components/swiper/index.d.ts +3 -1
  149. package/cjs/components/swiper/swiper.d.ts +9 -2
  150. package/cjs/components/swiper/swiper.js +36 -18
  151. package/cjs/components/text-area/text-area.d.ts +1 -1
  152. package/cjs/components/text-area/text-area.js +4 -3
  153. package/cjs/components/virtual-input/use-click-outside.js +6 -4
  154. package/cjs/utils/convert-px.js +7 -2
  155. package/es/components/cascader/cascader.css +4 -0
  156. package/es/components/cascader/cascader.d.ts +5 -3
  157. package/es/components/cascader/cascader.js +7 -8
  158. package/es/components/cascader/index.d.ts +2 -1
  159. package/es/components/cascader-view/cascader-view.d.ts +8 -2
  160. package/es/components/cascader-view/cascader-view.js +12 -9
  161. package/es/components/cascader-view/index.d.ts +1 -1
  162. package/es/components/date-picker/date-picker-date-utils.js +4 -9
  163. package/es/components/date-picker/date-picker-week-utils.js +4 -4
  164. package/es/components/date-picker/date-picker.d.ts +1 -1
  165. package/es/components/date-picker/index.d.ts +1 -1
  166. package/es/components/dropdown/dropdown.d.ts +6 -0
  167. package/es/components/dropdown/dropdown.js +39 -8
  168. package/es/components/dropdown/index.d.ts +3 -0
  169. package/es/components/error-block/create-error-block.d.ts +3 -4
  170. package/es/components/error-block/create-error-block.js +2 -2
  171. package/es/components/error-block/images/busy.js +94 -89
  172. package/es/components/error-block/images/default.js +170 -165
  173. package/es/components/error-block/images/disconnected.js +127 -122
  174. package/es/components/error-block/images/empty.js +123 -118
  175. package/es/components/error-block/images/index.d.ts +1 -1
  176. package/es/components/error-block/images/index.js +2 -2
  177. package/es/components/floating-panel/floating-panel.d.ts +2 -0
  178. package/es/components/floating-panel/floating-panel.js +7 -3
  179. package/es/components/form/form-item.js +19 -11
  180. package/es/components/form/index.d.ts +1 -1
  181. package/es/components/input/input.d.ts +4 -2
  182. package/es/components/input/input.js +6 -4
  183. package/es/components/list/list-item.js +1 -1
  184. package/es/components/notice-bar/notice-bar.js +2 -1
  185. package/es/components/passcode-input/passcode-input.css +15 -0
  186. package/es/components/passcode-input/passcode-input.d.ts +2 -0
  187. package/es/components/passcode-input/passcode-input.js +6 -3
  188. package/es/components/popover/popover.js +11 -1
  189. package/es/components/popover/use-showing-guard.d.ts +12 -0
  190. package/es/components/popover/use-showing-guard.js +34 -0
  191. package/es/components/search-bar/search-bar.js +4 -5
  192. package/es/components/segmented/segmented.css +1 -0
  193. package/es/components/swipe-action/swipe-action.js +37 -21
  194. package/es/components/swiper/index.d.ts +3 -1
  195. package/es/components/swiper/swiper.d.ts +9 -2
  196. package/es/components/swiper/swiper.js +35 -19
  197. package/es/components/text-area/text-area.d.ts +1 -1
  198. package/es/components/text-area/text-area.js +4 -3
  199. package/es/components/virtual-input/use-click-outside.js +7 -4
  200. package/es/utils/convert-px.js +7 -2
  201. package/package.json +1 -1
  202. package/umd/antd-mobile.js +1 -1
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Swiper = void 0;
7
+ exports.getSwipeToPosition = getSwipeToPosition;
8
+ exports.modulus = modulus;
7
9
  var _web = require("@react-spring/web");
8
10
  var _react = require("@use-gesture/react");
9
11
  var _ahooks = require("ahooks");
@@ -53,7 +55,7 @@ const Swiper = (0, _react2.forwardRef)((0, _stagedComponents.staged)((p, ref) =>
53
55
  const [uid] = (0, _react2.useState)({});
54
56
  const timeoutRef = (0, _react2.useRef)(null);
55
57
  const isVertical = direction === 'vertical';
56
- const slideRatio = props.slideSize / 100;
58
+ const slideRatio = Math.max(props.slideSize, 1) / 100;
57
59
  const offsetRatio = props.trackOffset / 100;
58
60
  const {
59
61
  validChildren,
@@ -162,7 +164,7 @@ const Swiper = (0, _react2.forwardRef)((0, _stagedComponents.staged)((p, ref) =>
162
164
  const minIndex = Math.floor(offset / slidePixels);
163
165
  const maxIndex = minIndex + 1;
164
166
  const index = Math.round((offset + velocity * 2000 * direction) / slidePixels);
165
- swipeTo((0, _bound.bound)(index, minIndex, maxIndex));
167
+ swipeTo((0, _bound.bound)(index, minIndex, maxIndex), 'swipe', false);
166
168
  window.setTimeout(() => {
167
169
  setDragging(false);
168
170
  });
@@ -194,34 +196,43 @@ const Swiper = (0, _react2.forwardRef)((0, _stagedComponents.staged)((p, ref) =>
194
196
  touch: true
195
197
  }
196
198
  });
197
- function swipeTo(index, immediate = false) {
199
+ function swipeTo(index, source = 'swipe', immediate = false) {
198
200
  var _a;
199
201
  const roundedIndex = Math.round(index);
200
202
  const targetIndex = loop ? modulus(roundedIndex, mergedTotal) : (0, _bound.bound)(roundedIndex, 0, mergedTotal - 1);
201
203
  if (targetIndex !== getCurrent()) {
202
- (_a = props.onIndexChange) === null || _a === void 0 ? void 0 : _a.call(props, targetIndex);
204
+ (_a = props.onIndexChange) === null || _a === void 0 ? void 0 : _a.call(props, targetIndex, {
205
+ source
206
+ });
203
207
  }
204
208
  setCurrent(targetIndex);
205
- api.start({
206
- position: (loop ? roundedIndex : boundIndex(roundedIndex)) * 100,
207
- immediate
208
- });
209
+ if (loop) {
210
+ api.start({
211
+ position: getSwipeToPosition(position.get(), roundedIndex, mergedTotal),
212
+ immediate
213
+ });
214
+ } else {
215
+ api.start({
216
+ position: boundIndex(roundedIndex) * 100,
217
+ immediate
218
+ });
219
+ }
209
220
  }
210
- function swipeNext() {
211
- swipeTo(Math.round(position.get() / 100) + 1);
221
+ function swipeNext(source = 'swipe') {
222
+ swipeTo(Math.round(position.get() / 100) + 1, source, false);
212
223
  }
213
- function swipePrev() {
214
- swipeTo(Math.round(position.get() / 100) - 1);
224
+ function swipePrev(source = 'swipe') {
225
+ swipeTo(Math.round(position.get() / 100) - 1, source, false);
215
226
  }
216
227
  (0, _react2.useImperativeHandle)(ref, () => ({
217
- swipeTo,
228
+ swipeTo: index => swipeTo(index, 'swipe', false),
218
229
  swipeNext,
219
230
  swipePrev
220
231
  }));
221
232
  (0, _ahooks.useIsomorphicLayoutEffect)(() => {
222
233
  const maxIndex = mergedTotal - 1;
223
234
  if (current > maxIndex) {
224
- swipeTo(maxIndex, true);
235
+ swipeTo(maxIndex, 'resize', true);
225
236
  }
226
237
  });
227
238
  const {
@@ -231,9 +242,9 @@ const Swiper = (0, _react2.forwardRef)((0, _stagedComponents.staged)((p, ref) =>
231
242
  const runTimeSwiper = () => {
232
243
  timeoutRef.current = window.setTimeout(() => {
233
244
  if (autoplay === 'reverse') {
234
- swipePrev();
245
+ swipePrev('auto');
235
246
  } else {
236
- swipeNext();
247
+ swipeNext('auto');
237
248
  }
238
249
  runTimeSwiper();
239
250
  }, autoplayInterval);
@@ -250,11 +261,12 @@ const Swiper = (0, _react2.forwardRef)((0, _stagedComponents.staged)((p, ref) =>
250
261
  function renderItem(index, child, key) {
251
262
  let itemStyle = {};
252
263
  if (loop) {
264
+ // 计算循环模式下定位所需的常量,避免在动画回调中重复计算
265
+ const totalWidth = mergedTotal * 100;
266
+ const flagWidth = Math.min(totalWidth / 2, (offsetRatio / slideRatio + 1) * 100);
253
267
  itemStyle = {
254
268
  [isVertical ? 'y' : 'x']: position.to(position => {
255
269
  let finalPosition = -position + index * 100;
256
- const totalWidth = mergedTotal * 100;
257
- const flagWidth = totalWidth / 2;
258
270
  finalPosition = modulus(finalPosition + flagWidth, totalWidth) - flagWidth;
259
271
  return `${finalPosition}%`;
260
272
  }),
@@ -358,4 +370,10 @@ exports.Swiper = Swiper;
358
370
  function modulus(value, division) {
359
371
  const remainder = value % division;
360
372
  return remainder < 0 ? remainder + division : remainder;
373
+ }
374
+ function getSwipeToPosition(current, targetIndex, total) {
375
+ const totalWidth = 100 * total;
376
+ let delta = modulus(targetIndex * 100 - current, totalWidth);
377
+ if (delta > totalWidth / 2) delta -= totalWidth;
378
+ return current + delta;
361
379
  }
@@ -23,7 +23,7 @@ export declare type TextAreaRef = {
23
23
  blur: () => void;
24
24
  nativeElement: HTMLTextAreaElement | null;
25
25
  };
26
- export declare const TextArea: React.ForwardRefExoticComponent<Pick<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "onClick" | "disabled" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "autoFocus" | "name" | "readOnly" | "autoComplete"> & {
26
+ export declare const TextArea: React.ForwardRefExoticComponent<Pick<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "onClick" | "disabled" | "name" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "autoFocus" | "autoComplete" | "readOnly"> & {
27
27
  onChange?: ((val: string) => void) | undefined;
28
28
  value?: string | undefined;
29
29
  defaultValue?: string | undefined;
@@ -102,7 +102,7 @@ const TextArea = (0, _react.forwardRef)((p, ref) => {
102
102
  }
103
103
  return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
104
104
  className: classPrefix
105
- }, _react.default.createElement("textarea", {
105
+ }, _react.default.createElement("textarea", Object.assign({
106
106
  ref: nativeTextAreaRef,
107
107
  className: `${classPrefix}-element`,
108
108
  rows: rows,
@@ -138,9 +138,10 @@ const TextArea = (0, _react.forwardRef)((p, ref) => {
138
138
  onFocus: props.onFocus,
139
139
  onBlur: props.onBlur,
140
140
  onClick: props.onClick,
141
- onKeyDown: handleKeydown,
141
+ onKeyDown: handleKeydown
142
+ }, {
142
143
  enterKeyHint: props.enterKeyHint
143
- }), count, autoSize && _react.default.createElement("textarea", {
144
+ })), count, autoSize && _react.default.createElement("textarea", {
144
145
  ref: hiddenTextAreaRef,
145
146
  className: `${classPrefix}-element ${classPrefix}-element-hidden`,
146
147
  value: value,
@@ -4,15 +4,17 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
+ var _rcUtil = require("rc-util");
7
8
  var _react = require("react");
8
9
  // 监听点击组件外部的事件
9
10
  function useClickOutside(handler, ref, hasKeyboardProps = false) {
11
+ const stableHandler = (0, _rcUtil.useEvent)(handler);
10
12
  (0, _react.useEffect)(() => {
11
13
  function handleClick(event) {
12
14
  if (!ref.current || ref.current.contains(event.target)) {
13
15
  return;
14
16
  }
15
- handler(event);
17
+ stableHandler(event); // 使用 ref 中的 handler
16
18
  }
17
19
  // 向前兼容逻辑:
18
20
  // 1. 对于有键盘属性的 VirtualInput,在捕获阶段监听:
@@ -21,11 +23,11 @@ function useClickOutside(handler, ref, hasKeyboardProps = false) {
21
23
  // 这种情况通常是 VirtualInput + NumberKeyboard 为兄弟关系,在以前版本中点击 NumberKeyboard **不会**触发 VirtualInput 的 blur 事件
22
24
  // 原先原理:通过 NumberKeyboard 内部 onMouseDown 时 preventDefault 阻止的 VirtualInput 内原生的 blur 事件
23
25
  // 新的原理:NumberKeyboard 的 Popup 默认会 stopPropagation click, 这里在冒泡阶段监听不到,不会调用 VirtualInput 的 onBlur 回调(非原生事件)。
24
- document.addEventListener('click', handleClick, hasKeyboardProps ? true : false);
26
+ document.addEventListener('click', handleClick, hasKeyboardProps);
25
27
  return () => {
26
- document.removeEventListener('click', handleClick, hasKeyboardProps ? true : false);
28
+ document.removeEventListener('click', handleClick, hasKeyboardProps);
27
29
  };
28
- }, [handler, ref]);
30
+ }, [ref]); // 只依赖 ref,不依赖 handler
29
31
  }
30
32
  var _default = useClickOutside;
31
33
  exports.default = _default;
@@ -5,11 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.convertPx = convertPx;
7
7
  var _canUseDom = require("./can-use-dom");
8
- var _isDev = require("./is-dev");
9
8
  var _devLog = require("./dev-log");
9
+ var _isDev = require("./is-dev");
10
10
  let tenPxTester = null;
11
11
  let tester = null;
12
- if (_canUseDom.canUseDom) {
12
+ function initialize() {
13
+ if (tenPxTester !== null) return;
14
+ if (!_canUseDom.canUseDom || !document.body) return;
13
15
  tenPxTester = document.createElement('div');
14
16
  tenPxTester.className = 'adm-px-tester';
15
17
  tenPxTester.style.setProperty('--size', '10');
@@ -24,6 +26,9 @@ if (_canUseDom.canUseDom) {
24
26
  }
25
27
  }
26
28
  function convertPx(px) {
29
+ if (tenPxTester === null) {
30
+ initialize();
31
+ }
27
32
  if (tenPxTester === null || tester === null) return px;
28
33
  if (tenPxTester.getBoundingClientRect().height === 10) {
29
34
  return px;
@@ -32,3 +32,7 @@
32
32
  .adm-cascader-body > .adm-cascader-view {
33
33
  --height: 310px;
34
34
  }
35
+ .adm-cascader-popup .adm-popup-body {
36
+ border-top-left-radius: 8px;
37
+ border-top-right-radius: 8px;
38
+ }
@@ -1,8 +1,8 @@
1
1
  import React, { ReactNode } from 'react';
2
- import { PopupProps } from '../popup';
3
- import { CascaderValue, CascaderValueExtend, CascaderOption } from '../cascader-view';
4
- import { NativeProps } from '../../utils/native-props';
5
2
  import type { FieldNamesType } from '../../hooks';
3
+ import { NativeProps } from '../../utils/native-props';
4
+ import { CascaderOption, CascaderValue, CascaderValueExtend, CascaderViewOptionRender } from '../cascader-view';
5
+ import { PopupProps } from '../popup';
6
6
  export declare type CascaderActions = {
7
7
  open: () => void;
8
8
  close: () => void;
@@ -27,6 +27,7 @@ export declare type CascaderProps = {
27
27
  onTabsChange?: (index: number) => void;
28
28
  activeIcon?: ReactNode;
29
29
  fieldNames?: FieldNamesType;
30
+ optionRender?: CascaderViewOptionRender;
30
31
  } & Pick<PopupProps, 'getContainer' | 'afterShow' | 'afterClose' | 'onClick' | 'stopPropagation' | 'destroyOnClose' | 'forceRender'> & NativeProps;
31
32
  export declare const Cascader: React.ForwardRefExoticComponent<{
32
33
  options: CascaderOption[];
@@ -46,6 +47,7 @@ export declare const Cascader: React.ForwardRefExoticComponent<{
46
47
  onTabsChange?: ((index: number) => void) | undefined;
47
48
  activeIcon?: ReactNode;
48
49
  fieldNames?: FieldNamesType | undefined;
50
+ optionRender?: CascaderViewOptionRender | undefined;
49
51
  } & Pick<PopupProps, "onClick" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation"> & {
50
52
  className?: string | undefined;
51
53
  style?: (React.CSSProperties & Partial<Record<never, string>>) | undefined;
@@ -1,12 +1,12 @@
1
- import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
2
- import Popup from '../popup';
3
- import { mergeProps } from '../../utils/with-default-props';
1
+ import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
2
+ import { useFieldNames } from '../../hooks';
4
3
  import { withNativeProps } from '../../utils/native-props';
5
4
  import { usePropsValue } from '../../utils/use-props-value';
5
+ import { mergeProps } from '../../utils/with-default-props';
6
6
  import CascaderView from '../cascader-view';
7
- import { useConfig } from '../config-provider';
8
7
  import { useCascaderValueExtend } from '../cascader-view/use-cascader-value-extend';
9
- import { useFieldNames } from '../../hooks';
8
+ import { useConfig } from '../config-provider';
9
+ import Popup from '../popup';
10
10
  const classPrefix = `adm-cascader`;
11
11
  const defaultProps = {
12
12
  defaultValue: [],
@@ -58,9 +58,7 @@ export const Cascader = forwardRef((p, ref) => {
58
58
  });
59
59
  const [innerValue, setInnerValue] = useState(value);
60
60
  useEffect(() => {
61
- if (!visible) {
62
- setInnerValue(value);
63
- }
61
+ setInnerValue(value);
64
62
  }, [visible, value]);
65
63
  const cascaderElement = withNativeProps(props, React.createElement("div", {
66
64
  className: classPrefix
@@ -94,6 +92,7 @@ export const Cascader = forwardRef((p, ref) => {
94
92
  }
95
93
  })))));
96
94
  const popupElement = React.createElement(Popup, {
95
+ className: `${classPrefix}-popup`,
97
96
  visible: visible,
98
97
  position: 'bottom',
99
98
  onMaskClick: () => {
@@ -1,7 +1,7 @@
1
1
  import { prompt } from './prompt';
2
2
  import './cascader.less';
3
3
  export type { CascaderProps, CascaderRef, CascaderActions } from './cascader';
4
- export type { CascaderValue, CascaderValueExtend, CascaderOption, } from '../cascader-view';
4
+ export type { CascaderValue, CascaderValueExtend, CascaderOption, CascaderViewOptionRender, CascaderViewOptionRenderInfo, } from '../cascader-view';
5
5
  declare const _default: import("react").ForwardRefExoticComponent<{
6
6
  options: import("../cascader-view").CascaderOption[];
7
7
  value?: import("../check-list").CheckListValue[] | undefined;
@@ -20,6 +20,7 @@ declare const _default: import("react").ForwardRefExoticComponent<{
20
20
  onTabsChange?: ((index: number) => void) | undefined;
21
21
  activeIcon?: import("react").ReactNode;
22
22
  fieldNames?: import("../../hooks").FieldNamesType | undefined;
23
+ optionRender?: import("../cascader-view").CascaderViewOptionRender | undefined;
23
24
  } & Pick<import("../popup").PopupProps, "onClick" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation"> & {
24
25
  className?: string | undefined;
25
26
  style?: (import("react").CSSProperties & Partial<Record<never, string>>) | undefined;
@@ -1,7 +1,7 @@
1
1
  import type { FC, ReactNode } from 'react';
2
- import { CheckListValue } from '../check-list';
2
+ import type { BaseOptionType, FieldNamesType } from '../../hooks';
3
3
  import { NativeProps } from '../../utils/native-props';
4
- import type { FieldNamesType, BaseOptionType } from '../../hooks';
4
+ import { CheckListValue } from '../check-list';
5
5
  export declare type CascaderValue = CheckListValue;
6
6
  export declare type CascaderOption = {
7
7
  label?: string;
@@ -13,6 +13,11 @@ export declare type CascaderValueExtend = {
13
13
  items: (CascaderOption | null)[];
14
14
  isLeaf: boolean;
15
15
  };
16
+ export declare type CascaderViewOptionRenderInfo = {
17
+ depth: number;
18
+ active: boolean;
19
+ };
20
+ export declare type CascaderViewOptionRender = (option: CascaderOption, info: CascaderViewOptionRenderInfo) => ReactNode;
16
21
  export declare type CascaderViewProps = {
17
22
  options: CascaderOption[];
18
23
  value?: CascaderValue[];
@@ -23,5 +28,6 @@ export declare type CascaderViewProps = {
23
28
  activeIcon?: ReactNode;
24
29
  loading?: boolean;
25
30
  fieldNames?: FieldNamesType;
31
+ optionRender?: CascaderViewOptionRender;
26
32
  } & NativeProps<'--height'>;
27
33
  export declare const CascaderView: FC<CascaderViewProps>;
@@ -1,16 +1,16 @@
1
- import React, { useState, useEffect, useMemo } from 'react';
1
+ import { useUpdateEffect } from 'ahooks';
2
2
  import classNames from 'classnames';
3
- import Tabs from '../tabs';
4
- import CheckList from '../check-list';
3
+ import React, { useEffect, useMemo, useState } from 'react';
4
+ import { useFieldNames } from '../../hooks';
5
5
  import { withNativeProps } from '../../utils/native-props';
6
- import { mergeProps } from '../../utils/with-default-props';
7
6
  import { usePropsValue } from '../../utils/use-props-value';
8
- import { useCascaderValueExtend } from './use-cascader-value-extend';
7
+ import { mergeProps } from '../../utils/with-default-props';
8
+ import CheckList from '../check-list';
9
9
  import { useConfig } from '../config-provider';
10
- import { optionSkeleton } from './option-skeleton';
11
10
  import Skeleton from '../skeleton';
12
- import { useUpdateEffect } from 'ahooks';
13
- import { useFieldNames } from '../../hooks';
11
+ import Tabs from '../tabs';
12
+ import { optionSkeleton } from './option-skeleton';
13
+ import { useCascaderValueExtend } from './use-cascader-value-extend';
14
14
  const classPrefix = `adm-cascader-view`;
15
15
  const defaultProps = {
16
16
  defaultValue: []
@@ -125,7 +125,10 @@ export const CascaderView = p => {
125
125
  className: classNames(`${classPrefix}-item`, {
126
126
  [`${classPrefix}-item-active`]: active
127
127
  })
128
- }, option[labelName]);
128
+ }, props.optionRender ? props.optionRender(option, {
129
+ depth: index,
130
+ active
131
+ }) : option[labelName]);
129
132
  }))));
130
133
  }))));
131
134
  };
@@ -1,5 +1,5 @@
1
1
  import './cascader-view.less';
2
- export type { CascaderViewProps, CascaderValue, CascaderValueExtend, CascaderOption, } from './cascader-view';
2
+ export type { CascaderViewProps, CascaderViewOptionRender, CascaderViewOptionRenderInfo, CascaderValue, CascaderValueExtend, CascaderOption, } from './cascader-view';
3
3
  declare const _default: import("react").FC<import("./cascader-view").CascaderViewProps> & {
4
4
  optionSkeleton: import("./cascader-view").CascaderOption[];
5
5
  };
@@ -1,11 +1,4 @@
1
- import dayjs from 'dayjs';
2
- import isLeapYear from 'dayjs/plugin/isLeapYear';
3
- import isoWeek from 'dayjs/plugin/isoWeek';
4
- import isoWeeksInYear from 'dayjs/plugin/isoWeeksInYear';
5
1
  import { TILL_NOW } from './util';
6
- dayjs.extend(isoWeek);
7
- dayjs.extend(isoWeeksInYear);
8
- dayjs.extend(isLeapYear);
9
2
  const precisionRankRecord = {
10
3
  year: 0,
11
4
  month: 1,
@@ -14,6 +7,9 @@ const precisionRankRecord = {
14
7
  minute: 4,
15
8
  second: 5
16
9
  };
10
+ function getMonthDays(year, month) {
11
+ return new Date(Date.UTC(year, month, 0)).getUTCDate();
12
+ }
17
13
  export function generateDatePickerColumns(selected, min, max, precision, renderLabel, filter, tillNow) {
18
14
  const ret = [];
19
15
  const minYear = min.getFullYear();
@@ -30,7 +26,6 @@ export function generateDatePickerColumns(selected, min, max, precision, renderL
30
26
  const maxSecond = max.getSeconds();
31
27
  const rank = precisionRankRecord[precision];
32
28
  const selectedYear = parseInt(selected[0]);
33
- const firstDayInSelectedMonth = dayjs(convertStringArrayToDate([selected[0], selected[1], '1']));
34
29
  const selectedMonth = parseInt(selected[1]);
35
30
  const selectedDay = parseInt(selected[2]);
36
31
  const selectedHour = parseInt(selected[3]);
@@ -87,7 +82,7 @@ export function generateDatePickerColumns(selected, min, max, precision, renderL
87
82
  }
88
83
  if (rank >= precisionRankRecord.day) {
89
84
  const lower = isInMinMonth ? minDay : 1;
90
- const upper = isInMaxMonth ? maxDay : firstDayInSelectedMonth.daysInMonth();
85
+ const upper = isInMaxMonth ? maxDay : getMonthDays(selectedYear, selectedMonth);
91
86
  const days = generateColumn(lower, upper, 'day');
92
87
  ret.push(days.map(v => ({
93
88
  label: renderLabel('day', v, {
@@ -12,14 +12,14 @@ const precisionRankRecord = {
12
12
  };
13
13
  export function generateDatePickerColumns(selected, min, max, precision, renderLabel, filter) {
14
14
  const ret = [];
15
- const minYear = min.getFullYear();
16
- const maxYear = max.getFullYear();
15
+ const minDay = dayjs(min);
16
+ const maxDay = dayjs(max);
17
+ const minYear = minDay.isoWeekYear();
18
+ const maxYear = maxDay.isoWeekYear();
17
19
  const rank = precisionRankRecord[precision];
18
20
  const selectedYear = parseInt(selected[0]);
19
21
  const isInMinYear = selectedYear === minYear;
20
22
  const isInMaxYear = selectedYear === maxYear;
21
- const minDay = dayjs(min);
22
- const maxDay = dayjs(max);
23
23
  const minWeek = minDay.isoWeek();
24
24
  const maxWeek = maxDay.isoWeek();
25
25
  const minWeekday = minDay.isoWeekday();
@@ -19,7 +19,7 @@ export declare type DatePickerProps = Pick<PickerProps, 'onCancel' | 'onClose' |
19
19
  filter?: DatePickerFilter;
20
20
  tillNow?: boolean;
21
21
  } & NativeProps;
22
- export declare const DatePicker: React.ForwardRefExoticComponent<Pick<PickerProps, "style" | "title" | "onClick" | "visible" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation" | "closeOnMaskClick" | "onClose" | "cancelText" | "loading" | "confirmText" | "mouseWheel" | "loadingContent" | "onCancel"> & {
22
+ export declare const DatePicker: React.ForwardRefExoticComponent<Pick<PickerProps, "style" | "title" | "onClick" | "visible" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation" | "onCancel" | "onClose" | "loading" | "closeOnMaskClick" | "cancelText" | "confirmText" | "mouseWheel" | "loadingContent"> & {
23
23
  value?: PickerDate | null | undefined;
24
24
  defaultValue?: PickerDate | null | undefined;
25
25
  onSelect?: ((value: PickerDate) => void) | undefined;
@@ -2,7 +2,7 @@ import './date-picker.less';
2
2
  import { prompt } from './prompt';
3
3
  export type { DatePickerProps, DatePickerRef } from './date-picker';
4
4
  export type { DatePickerFilter } from './date-picker-utils';
5
- declare const _default: import("react").ForwardRefExoticComponent<Pick<import("../picker").PickerProps, "style" | "title" | "onClick" | "visible" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation" | "closeOnMaskClick" | "onClose" | "cancelText" | "loading" | "confirmText" | "mouseWheel" | "loadingContent" | "onCancel"> & {
5
+ declare const _default: import("react").ForwardRefExoticComponent<Pick<import("../picker").PickerProps, "style" | "title" | "onClick" | "visible" | "destroyOnClose" | "forceRender" | "getContainer" | "afterShow" | "afterClose" | "stopPropagation" | "onCancel" | "onClose" | "loading" | "closeOnMaskClick" | "cancelText" | "confirmText" | "mouseWheel" | "loadingContent"> & {
6
6
  value?: import("./util").PickerDate | null | undefined;
7
7
  defaultValue?: import("./util").PickerDate | null | undefined;
8
8
  onSelect?: ((value: import("./util").PickerDate) => void) | undefined;
@@ -8,6 +8,9 @@ export declare type DropdownProps = {
8
8
  closeOnMaskClick?: boolean;
9
9
  closeOnClickAway?: boolean;
10
10
  onChange?: (key: string | null) => void;
11
+ onVisibleChange?: (visible: boolean, info: {
12
+ key: string | null;
13
+ }) => void;
11
14
  arrowIcon?: ReactNode;
12
15
  /**
13
16
  * @deprecated use `arrowIcon` instead
@@ -24,6 +27,9 @@ declare const Dropdown: React.ForwardRefExoticComponent<{
24
27
  closeOnMaskClick?: boolean | undefined;
25
28
  closeOnClickAway?: boolean | undefined;
26
29
  onChange?: ((key: string | null) => void) | undefined;
30
+ onVisibleChange?: ((visible: boolean, info: {
31
+ key: string | null;
32
+ }) => void) | undefined;
27
33
  arrowIcon?: ReactNode;
28
34
  /**
29
35
  * @deprecated use `arrowIcon` instead
@@ -1,6 +1,7 @@
1
1
  import { useClickAway } from 'ahooks';
2
2
  import classNames from 'classnames';
3
- import React, { cloneElement, forwardRef, isValidElement, useEffect, useImperativeHandle, useRef, useState } from 'react';
3
+ import raf from 'rc-util/lib/raf';
4
+ import React, { cloneElement, forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
4
5
  import { withNativeProps } from '../../utils/native-props';
5
6
  import { usePropsValue } from '../../utils/use-props-value';
6
7
  import { mergeProp, mergeProps } from '../../utils/with-default-props';
@@ -27,6 +28,8 @@ const Dropdown = forwardRef((props, ref) => {
27
28
  defaultValue: mergedProps.defaultActiveKey,
28
29
  onChange: mergedProps.onChange
29
30
  });
31
+ const cacheKeyRef = useRef(null);
32
+ cacheKeyRef.current = value !== null && value !== void 0 ? value : cacheKeyRef.current;
30
33
  const navRef = useRef(null);
31
34
  const contentRef = useRef(null);
32
35
  // 点击外部区域,关闭
@@ -37,14 +40,30 @@ const Dropdown = forwardRef((props, ref) => {
37
40
  // 计算 navs 的 top 值
38
41
  const [top, setTop] = useState();
39
42
  const containerRef = useRef(null);
40
- useEffect(() => {
43
+ const rafIdRef = useRef(0);
44
+ const updatePosition = useCallback(() => {
41
45
  const container = containerRef.current;
42
46
  if (!container) return;
43
- if (value) {
44
- const rect = container.getBoundingClientRect();
45
- setTop(rect.bottom);
46
- }
47
- }, [value]);
47
+ setTop(container.getBoundingClientRect().bottom);
48
+ }, []);
49
+ const updateTop = useCallback(() => {
50
+ raf.cancel(rafIdRef.current);
51
+ rafIdRef.current = raf(updatePosition);
52
+ }, [updatePosition]);
53
+ useEffect(() => {
54
+ if (!value) return;
55
+ updatePosition();
56
+ window.addEventListener('scroll', updateTop, {
57
+ passive: true,
58
+ capture: true
59
+ });
60
+ window.addEventListener('resize', updateTop);
61
+ return () => {
62
+ raf.cancel(rafIdRef.current);
63
+ window.removeEventListener('scroll', updateTop, true);
64
+ window.removeEventListener('resize', updateTop);
65
+ };
66
+ }, [value, updateTop, updatePosition]);
48
67
  const changeActive = key => {
49
68
  if (value === key) {
50
69
  setValue(null);
@@ -99,7 +118,19 @@ const Dropdown = forwardRef((props, ref) => {
99
118
  forceRender: popupForceRender,
100
119
  onMaskClick: mergedProps.closeOnMaskClick ? () => {
101
120
  changeActive(null);
102
- } : undefined
121
+ } : undefined,
122
+ afterShow: () => {
123
+ var _a;
124
+ (_a = mergedProps.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(mergedProps, true, {
125
+ key: cacheKeyRef.current
126
+ });
127
+ },
128
+ afterClose: () => {
129
+ var _a;
130
+ (_a = mergedProps.onVisibleChange) === null || _a === void 0 ? void 0 : _a.call(mergedProps, false, {
131
+ key: cacheKeyRef.current
132
+ });
133
+ }
103
134
  }, React.createElement("div", {
104
135
  ref: contentRef
105
136
  }, items.map(item => {
@@ -7,6 +7,9 @@ declare const _default: import("react").ForwardRefExoticComponent<{
7
7
  closeOnMaskClick?: boolean | undefined;
8
8
  closeOnClickAway?: boolean | undefined;
9
9
  onChange?: ((key: string | null) => void) | undefined;
10
+ onVisibleChange?: ((visible: boolean, info: {
11
+ key: string | null;
12
+ }) => void) | undefined;
10
13
  arrowIcon?: import("react").ReactNode;
11
14
  arrow?: import("react").ReactNode;
12
15
  getContainer?: import("../../utils/render-to-container").GetContainer | undefined;
@@ -1,7 +1,6 @@
1
- import React from 'react';
2
- import type { ReactNode, ReactElement } from 'react';
3
- import { NativeProps } from '../../utils/native-props';
1
+ import type { FC, ReactElement, ReactNode } from 'react';
4
2
  import type { ErrorBlockStatus, ImageRecord } from '.';
3
+ import { NativeProps } from '../../utils/native-props';
5
4
  import './error-block.less';
6
5
  export declare type ErrorBlockProps = {
7
6
  status?: ErrorBlockStatus;
@@ -11,4 +10,4 @@ export declare type ErrorBlockProps = {
11
10
  fullPage?: boolean;
12
11
  children?: ReactNode;
13
12
  } & NativeProps<'--image-height' | '--image-height-full-page' | '--image-width' | '--image-width-full-page'>;
14
- export declare function createErrorBlock(imageRecord: ImageRecord): React.FC<ErrorBlockProps>;
13
+ export declare function createErrorBlock(imageRecord: ImageRecord): FC<ErrorBlockProps>;
@@ -1,7 +1,7 @@
1
- import React from 'react';
2
1
  import classNames from 'classnames';
3
- import { mergeProps } from '../../utils/with-default-props';
2
+ import React from 'react';
4
3
  import { withNativeProps } from '../../utils/native-props';
4
+ import { mergeProps } from '../../utils/with-default-props';
5
5
  import { useConfig } from '../config-provider';
6
6
  import "./error-block.css";
7
7
  const classPrefix = `adm-error-block`;