antd-mobile 5.25.0 → 5.26.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 (100) hide show
  1. package/2x/bundle/antd-mobile.cjs.development.js +188 -121
  2. package/2x/bundle/antd-mobile.cjs.js +8 -8
  3. package/2x/bundle/antd-mobile.es.development.js +188 -121
  4. package/2x/bundle/antd-mobile.es.js +3936 -3910
  5. package/2x/bundle/antd-mobile.umd.development.js +188 -121
  6. package/2x/bundle/antd-mobile.umd.js +8 -8
  7. package/2x/bundle/css-vars-patch.css +399 -0
  8. package/2x/bundle/style.css +29 -5
  9. package/2x/cjs/components/calendar/calendar.js +9 -1
  10. package/2x/cjs/components/floating-bubble/floating-bubble.d.ts +8 -0
  11. package/2x/cjs/components/floating-bubble/floating-bubble.js +25 -5
  12. package/2x/cjs/components/form/form.d.ts +1 -1
  13. package/2x/cjs/components/image-uploader/image-uploader.css +16 -1
  14. package/2x/cjs/components/image-uploader/image-uploader.d.ts +4 -1
  15. package/2x/cjs/components/image-uploader/image-uploader.js +46 -9
  16. package/2x/cjs/components/image-uploader/preview-item.d.ts +2 -1
  17. package/2x/cjs/components/image-uploader/preview-item.js +5 -7
  18. package/2x/cjs/components/mask/mask.d.ts +1 -1
  19. package/2x/cjs/components/mask/mask.js +6 -2
  20. package/2x/cjs/components/notice-bar/notice-bar.css +13 -4
  21. package/2x/cjs/components/notice-bar/notice-bar.d.ts +10 -8
  22. package/2x/cjs/components/notice-bar/notice-bar.js +5 -2
  23. package/2x/cjs/components/stepper/stepper.d.ts +2 -0
  24. package/2x/cjs/components/stepper/stepper.js +55 -32
  25. package/2x/cjs/components/water-mark/water-mark.d.ts +1 -1
  26. package/2x/cjs/components/water-mark/water-mark.js +5 -1
  27. package/2x/es/components/calendar/calendar.js +9 -1
  28. package/2x/es/components/floating-bubble/floating-bubble.d.ts +8 -0
  29. package/2x/es/components/floating-bubble/floating-bubble.js +26 -6
  30. package/2x/es/components/form/form.d.ts +1 -1
  31. package/2x/es/components/image-uploader/image-uploader.css +16 -1
  32. package/2x/es/components/image-uploader/image-uploader.d.ts +4 -1
  33. package/2x/es/components/image-uploader/image-uploader.js +48 -11
  34. package/2x/es/components/image-uploader/preview-item.d.ts +2 -1
  35. package/2x/es/components/image-uploader/preview-item.js +6 -8
  36. package/2x/es/components/mask/mask.d.ts +1 -1
  37. package/2x/es/components/mask/mask.js +6 -2
  38. package/2x/es/components/notice-bar/notice-bar.css +13 -4
  39. package/2x/es/components/notice-bar/notice-bar.d.ts +10 -8
  40. package/2x/es/components/notice-bar/notice-bar.js +5 -2
  41. package/2x/es/components/stepper/stepper.d.ts +2 -0
  42. package/2x/es/components/stepper/stepper.js +55 -32
  43. package/2x/es/components/water-mark/water-mark.d.ts +1 -1
  44. package/2x/es/components/water-mark/water-mark.js +5 -1
  45. package/2x/package.json +9 -9
  46. package/bundle/antd-mobile.cjs.development.js +188 -121
  47. package/bundle/antd-mobile.cjs.js +8 -8
  48. package/bundle/antd-mobile.compatible.umd.js +1 -1
  49. package/bundle/antd-mobile.es.development.js +188 -121
  50. package/bundle/antd-mobile.es.js +3936 -3910
  51. package/bundle/antd-mobile.umd.development.js +188 -121
  52. package/bundle/antd-mobile.umd.js +8 -8
  53. package/bundle/css-vars-patch.css +312 -0
  54. package/bundle/style.css +1 -1
  55. package/cjs/components/calendar/calendar.js +9 -1
  56. package/cjs/components/floating-bubble/floating-bubble.d.ts +8 -0
  57. package/cjs/components/floating-bubble/floating-bubble.js +25 -5
  58. package/cjs/components/form/form.d.ts +1 -1
  59. package/cjs/components/image-uploader/image-uploader.css +15 -1
  60. package/cjs/components/image-uploader/image-uploader.d.ts +4 -1
  61. package/cjs/components/image-uploader/image-uploader.js +46 -9
  62. package/cjs/components/image-uploader/preview-item.d.ts +2 -1
  63. package/cjs/components/image-uploader/preview-item.js +5 -7
  64. package/cjs/components/mask/mask.d.ts +1 -1
  65. package/cjs/components/mask/mask.js +6 -2
  66. package/cjs/components/notice-bar/notice-bar.css +11 -4
  67. package/cjs/components/notice-bar/notice-bar.d.ts +10 -8
  68. package/cjs/components/notice-bar/notice-bar.js +5 -2
  69. package/cjs/components/stepper/stepper.d.ts +2 -0
  70. package/cjs/components/stepper/stepper.js +55 -32
  71. package/cjs/components/water-mark/water-mark.d.ts +1 -1
  72. package/cjs/components/water-mark/water-mark.js +5 -1
  73. package/es/components/calendar/calendar.js +9 -1
  74. package/es/components/floating-bubble/floating-bubble.d.ts +8 -0
  75. package/es/components/floating-bubble/floating-bubble.js +26 -6
  76. package/es/components/form/form.d.ts +1 -1
  77. package/es/components/image-uploader/image-uploader.css +15 -1
  78. package/es/components/image-uploader/image-uploader.d.ts +4 -1
  79. package/es/components/image-uploader/image-uploader.js +48 -11
  80. package/es/components/image-uploader/preview-item.d.ts +2 -1
  81. package/es/components/image-uploader/preview-item.js +6 -8
  82. package/es/components/mask/mask.d.ts +1 -1
  83. package/es/components/mask/mask.js +6 -2
  84. package/es/components/notice-bar/notice-bar.css +11 -4
  85. package/es/components/notice-bar/notice-bar.d.ts +10 -8
  86. package/es/components/notice-bar/notice-bar.js +5 -2
  87. package/es/components/stepper/stepper.d.ts +2 -0
  88. package/es/components/stepper/stepper.js +55 -32
  89. package/es/components/water-mark/water-mark.d.ts +1 -1
  90. package/es/components/water-mark/water-mark.js +5 -1
  91. package/package.json +9 -9
  92. package/umd/antd-mobile.js +1 -1
  93. package/2x/cjs/components/image/test/image.test.d.ts +0 -1
  94. package/2x/cjs/components/image/test/image.test.js +0 -73
  95. package/2x/es/components/image/test/image.test.d.ts +0 -1
  96. package/2x/es/components/image/test/image.test.js +0 -70
  97. package/cjs/components/image/test/image.test.d.ts +0 -1
  98. package/cjs/components/image/test/image.test.js +0 -73
  99. package/es/components/image/test/image.test.d.ts +0 -1
  100. package/es/components/image/test/image.test.js +0 -70
@@ -14,7 +14,9 @@ var _usePropsValue = require("../../utils/use-props-value");
14
14
  var _ahooks = require("ahooks");
15
15
  var _space = _interopRequireDefault(require("../space"));
16
16
  var _nativeProps = require("../../utils/native-props");
17
+ var _measureCssLength = require("../../utils/measure-css-length");
17
18
  var _configProvider = require("../config-provider");
19
+ var _grid = _interopRequireDefault(require("../grid"));
18
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
21
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
22
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -22,6 +24,9 @@ const classPrefix = `adm-image-uploader`;
22
24
  const defaultProps = {
23
25
  disableUpload: false,
24
26
  deletable: true,
27
+ deleteIcon: _react.default.createElement(_antdMobileIcons.CloseOutline, {
28
+ className: `${classPrefix}-cell-delete-icon`
29
+ }),
25
30
  showUpload: true,
26
31
  multiple: false,
27
32
  maxCount: 0,
@@ -36,8 +41,26 @@ const ImageUploader = p => {
36
41
  locale
37
42
  } = (0, _configProvider.useConfig)();
38
43
  const props = (0, _withDefaultProps.mergeProps)(defaultProps, p);
44
+ const {
45
+ columns
46
+ } = props;
39
47
  const [value, setValue] = (0, _usePropsValue.usePropsValue)(props);
40
48
  const [tasks, setTasks] = (0, _react.useState)([]);
49
+ const containerRef = (0, _react.useRef)(null);
50
+ const containerSize = (0, _ahooks.useSize)(containerRef);
51
+ const gapMeasureRef = (0, _react.useRef)(null);
52
+ const [cellSize, setCellSize] = (0, _react.useState)(80);
53
+ (0, _ahooks.useIsomorphicLayoutEffect)(() => {
54
+ const gapMeasure = gapMeasureRef.current;
55
+ if (columns && containerSize && gapMeasure) {
56
+ const width = containerSize.width;
57
+ const gap = (0, _measureCssLength.measureCSSLength)(window.getComputedStyle(gapMeasure).getPropertyValue('height'));
58
+ setCellSize((width - gap * (columns - 1)) / columns);
59
+ }
60
+ }, [containerSize === null || containerSize === void 0 ? void 0 : containerSize.width]);
61
+ const style = {
62
+ '--cell-size': cellSize + 'px'
63
+ };
41
64
  (0, _ahooks.useIsomorphicLayoutEffect)(() => {
42
65
  setTasks(prev => prev.filter(task => {
43
66
  if (task.url === undefined) return true;
@@ -161,6 +184,7 @@ const ImageUploader = p => {
161
184
  key: (_a = fileItem.key) !== null && _a !== void 0 ? _a : index,
162
185
  url: (_b = fileItem.thumbnailUrl) !== null && _b !== void 0 ? _b : fileItem.url,
163
186
  deletable: props.deletable,
187
+ deleteIcon: props.deleteIcon,
164
188
  imageFit: props.imageFit,
165
189
  onClick: () => {
166
190
  if (props.preview) {
@@ -178,21 +202,19 @@ const ImageUploader = p => {
178
202
  return renderItem ? renderItem(originNode, fileItem, value) : originNode;
179
203
  });
180
204
  };
181
- return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
182
- className: classPrefix
183
- }, _react.default.createElement(_space.default, {
184
- className: `${classPrefix}-space`,
185
- wrap: true,
186
- block: true
187
- }, renderImages(), finalTasks.map(task => {
205
+ const contentNode = _react.default.createElement(_react.default.Fragment, null, renderImages(), tasks.map(task => {
206
+ if (!props.showFailed && task.status === 'fail') {
207
+ return null;
208
+ }
188
209
  return _react.default.createElement(_previewItem.default, {
189
210
  key: task.id,
190
211
  file: task.file,
191
212
  deletable: task.status !== 'pending',
213
+ deleteIcon: props.deleteIcon,
192
214
  status: task.status,
193
215
  imageFit: props.imageFit,
194
216
  onDelete: () => {
195
- setTasks(prev => prev.filter(x => x.id !== task.id));
217
+ setTasks(tasks.filter(x => x.id !== task.id));
196
218
  }
197
219
  });
198
220
  }), showUpload && _react.default.createElement("div", {
@@ -211,6 +233,21 @@ const ImageUploader = p => {
211
233
  className: `${classPrefix}-input`,
212
234
  onChange: onChange,
213
235
  "aria-hidden": true
214
- })))));
236
+ })));
237
+ return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
238
+ className: classPrefix,
239
+ ref: containerRef
240
+ }, columns ? _react.default.createElement(_grid.default, {
241
+ className: `${classPrefix}-grid`,
242
+ columns: columns,
243
+ style: style
244
+ }, _react.default.createElement("div", {
245
+ className: `${classPrefix}-gap-measure`,
246
+ ref: gapMeasureRef
247
+ }), contentNode.props.children) : _react.default.createElement(_space.default, {
248
+ className: `${classPrefix}-space`,
249
+ wrap: true,
250
+ block: true
251
+ }, contentNode.props.children)));
215
252
  };
216
253
  exports.ImageUploader = ImageUploader;
@@ -1,10 +1,11 @@
1
- import { FC } from 'react';
1
+ import React, { FC } from 'react';
2
2
  import { TaskStatus } from './image-uploader';
3
3
  import type { ImageProps } from '../image';
4
4
  declare type Props = {
5
5
  onClick?: () => void;
6
6
  onDelete?: () => void;
7
7
  deletable: boolean;
8
+ deleteIcon: React.ReactNode;
8
9
  url?: string;
9
10
  file?: File;
10
11
  status?: TaskStatus;
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
- var _antdMobileIcons = require("antd-mobile-icons");
9
8
  var _classnames = _interopRequireDefault(require("classnames"));
10
9
  var _image = _interopRequireDefault(require("../image"));
11
10
  var _spinLoading = _interopRequireDefault(require("../spin-loading"));
@@ -22,6 +21,7 @@ const PreviewItem = props => {
22
21
  url,
23
22
  file,
24
23
  deletable,
24
+ deleteIcon,
25
25
  onDelete,
26
26
  imageFit
27
27
  } = props;
@@ -34,11 +34,11 @@ const PreviewItem = props => {
34
34
  }
35
35
  return '';
36
36
  }, [url, file]);
37
- (0, _react.useLayoutEffect)(() => {
37
+ (0, _react.useEffect)(() => {
38
38
  return () => {
39
- URL.revokeObjectURL(src);
39
+ if (file) URL.revokeObjectURL(src);
40
40
  };
41
- }, [src]);
41
+ }, [src, file]);
42
42
  function renderLoading() {
43
43
  return props.status === 'pending' && _react.default.createElement("div", {
44
44
  className: `${classPrefix}-cell-mask`
@@ -54,9 +54,7 @@ const PreviewItem = props => {
54
54
  return deletable && _react.default.createElement("span", {
55
55
  className: `${classPrefix}-cell-delete`,
56
56
  onClick: onDelete
57
- }, _react.default.createElement(_antdMobileIcons.CloseOutline, {
58
- className: `${classPrefix}-cell-delete-icon`
59
- }));
57
+ }, deleteIcon);
60
58
  }
61
59
  return _react.default.createElement("div", {
62
60
  className: (0, _classnames.default)(`${classPrefix}-cell`, props.status === 'fail' && `${classPrefix}-cell-fail`)
@@ -8,7 +8,7 @@ export declare type MaskProps = {
8
8
  destroyOnClose?: boolean;
9
9
  forceRender?: boolean;
10
10
  disableBodyScroll?: boolean;
11
- color?: 'black' | 'white';
11
+ color?: 'white' | 'black' | (string & {});
12
12
  opacity?: 'default' | 'thin' | 'thick' | number;
13
13
  getContainer?: GetContainer;
14
14
  afterShow?: () => void;
@@ -22,6 +22,10 @@ const opacityRecord = {
22
22
  thin: 0.35,
23
23
  thick: 0.75
24
24
  };
25
+ const colorRecord = {
26
+ black: '0, 0, 0',
27
+ white: '255, 255, 255'
28
+ };
25
29
  const defaultProps = {
26
30
  visible: true,
27
31
  destroyOnClose: false,
@@ -42,8 +46,8 @@ const Mask = p => {
42
46
  const background = (0, _react.useMemo)(() => {
43
47
  var _a;
44
48
  const opacity = (_a = opacityRecord[props.opacity]) !== null && _a !== void 0 ? _a : props.opacity;
45
- const rgb = props.color === 'white' ? '255, 255, 255' : '0, 0, 0';
46
- return `rgba(${rgb}, ${opacity})`;
49
+ const rgb = colorRecord[props.color];
50
+ return rgb ? `rgba(${rgb}, ${opacity})` : props.color;
47
51
  }, [props.color, props.opacity]);
48
52
  const [active, setActive] = (0, _react.useState)(props.visible);
49
53
  const unmountedRef = (0, _ahooks.useUnmountedRef)();
@@ -4,11 +4,10 @@
4
4
  --text-color: var(--adm-color-white);
5
5
  --font-size: var(--adm-font-size-7);
6
6
  --icon-font-size: var(--adm-font-size-10);
7
- --height: 38px;
7
+ --height: 40px;
8
8
  height: var(--height);
9
9
  box-sizing: border-box;
10
10
  font-size: var(--font-size);
11
- line-height: var(--height);
12
11
  padding: 0 12px;
13
12
  display: flex;
14
13
  align-items: center;
@@ -41,7 +40,6 @@
41
40
  flex-shrink: 0;
42
41
  margin-right: 8px;
43
42
  font-size: var(--icon-font-size);
44
- line-height: var(--height);
45
43
  }
46
44
  .adm-notice-bar .adm-notice-bar-content {
47
45
  flex: 1;
@@ -54,9 +52,11 @@
54
52
  .adm-notice-bar .adm-notice-bar-content .adm-notice-bar-content-inner {
55
53
  width: auto;
56
54
  transition-timing-function: linear;
57
- position: absolute;
58
55
  white-space: nowrap;
59
56
  }
57
+ .adm-notice-bar-wrap.adm-notice-bar .adm-notice-bar-content .adm-notice-bar-content-inner {
58
+ white-space: normal;
59
+ }
60
60
  .adm-notice-bar .adm-notice-bar-right {
61
61
  flex-shrink: 0;
62
62
  margin-left: 12px;
@@ -72,3 +72,10 @@
72
72
  .adm-notice-bar-close-icon {
73
73
  font-size: var(--adm-font-size-10);
74
74
  }
75
+ .adm-notice-bar-wrap {
76
+ height: auto;
77
+ align-items: flex-start;
78
+ padding-top: 8px;
79
+ padding-bottom: 8px;
80
+ line-height: 22px;
81
+ }
@@ -1,21 +1,23 @@
1
1
  import React from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
3
  export declare type NoticeBarProps = {
4
- /** 通告栏的类型 */
4
+ /** The type of the NoticeBar */
5
5
  color?: 'default' | 'alert' | 'error' | 'info';
6
- /** 开始滚动的延迟,单位 ms */
6
+ /** TDelay to start scrolling, unit ms */
7
7
  delay?: number;
8
- /** 滚动速度,单位 px/s */
8
+ /** Scroll speed, unit px/s */
9
9
  speed?: number;
10
- /** 公告内容 */
10
+ /** The content of the NoticeBar */
11
11
  content: React.ReactNode;
12
- /** 是否可关闭 */
12
+ /** Whether it can be closed */
13
13
  closeable?: boolean;
14
- /** 关闭时的回调 */
14
+ /** Callback when closed */
15
15
  onClose?: () => void;
16
- /** 额外操作区域,显示在关闭按钮左侧 */
16
+ /** Additional operating area, displayed to the left of the close button */
17
17
  extra?: React.ReactNode;
18
- /** 左侧广播图标 */
18
+ /** Radio icon on the left */
19
19
  icon?: React.ReactNode;
20
+ /** Whether to display multiple lines */
21
+ wrap?: boolean;
20
22
  } & NativeProps<'--background-color' | '--border-color' | '--text-color' | '--font-size' | '--icon-font-size' | '--height'>;
21
23
  export declare const NoticeBar: React.NamedExoticComponent<NoticeBarProps>;
@@ -20,6 +20,7 @@ const defaultProps = {
20
20
  color: 'default',
21
21
  delay: 2000,
22
22
  speed: 50,
23
+ wrap: false,
23
24
  icon: _react.default.createElement(_antdMobileIcons.SoundOutline, null)
24
25
  };
25
26
  const NoticeBar = (0, _react.memo)(p => {
@@ -31,7 +32,7 @@ const NoticeBar = (0, _react.memo)(p => {
31
32
  const delayLockRef = (0, _react.useRef)(true);
32
33
  const animatingRef = (0, _react.useRef)(false);
33
34
  function start() {
34
- if (delayLockRef.current) return;
35
+ if (delayLockRef.current || props.wrap) return;
35
36
  const container = containerRef.current;
36
37
  const text = textRef.current;
37
38
  if (!container || !text) return;
@@ -70,7 +71,9 @@ const NoticeBar = (0, _react.memo)(p => {
70
71
  });
71
72
  if (!visible) return null;
72
73
  return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
73
- className: (0, _classnames.default)(classPrefix, `${classPrefix}-${props.color}`)
74
+ className: (0, _classnames.default)(classPrefix, `${classPrefix}-${props.color}`, {
75
+ [`${classPrefix}-wrap`]: props.wrap
76
+ })
74
77
  }, props.icon && _react.default.createElement("span", {
75
78
  className: `${classPrefix}-left`
76
79
  }, props.icon), _react.default.createElement("span", {
@@ -20,6 +20,8 @@ export declare type StepperProps = Pick<InputProps, 'onFocus' | 'onBlur'> & (Val
20
20
  digits?: number;
21
21
  disabled?: boolean;
22
22
  inputReadOnly?: boolean;
23
+ parser?: (text: string) => number;
24
+ formatter?: (value?: number) => string;
23
25
  } & NativeProps<'--height' | '--input-width' | '--input-font-size' | '--input-background-color' | '--border-radius' | '--border' | '--border-inner' | '--active-border' | '--button-font-size' | '--button-background-color' | '--button-width' | '--input-font-color' | '--button-text-color'>;
24
26
  export declare const Stepper: FC<StepperProps>;
25
27
  export {};
@@ -32,35 +32,45 @@ const Stepper = p => {
32
32
  step,
33
33
  max,
34
34
  min,
35
- inputReadOnly
35
+ inputReadOnly,
36
+ digits,
37
+ formatter,
38
+ parser
36
39
  } = props;
37
40
  const {
38
41
  locale
39
42
  } = (0, _configProvider.useConfig)();
43
+ // ========================== Parse / Format ==========================
44
+ const parseValue = text => {
45
+ if (text === '') return null;
46
+ return parser ? parser(text) : parseFloat(text);
47
+ };
48
+ const formatValue = value => {
49
+ if (value === null) return '';
50
+ if (formatter) {
51
+ return formatter(value);
52
+ } else if (digits !== undefined) {
53
+ return value.toFixed(digits);
54
+ } else {
55
+ return value.toString();
56
+ }
57
+ };
58
+ // ======================== Value & InputValue ========================
40
59
  const [value, setValue] = (0, _usePropsValue.usePropsValue)(props);
41
- const [inputValue, setInputValue] = (0, _react.useState)(() => convertValueToText(value, props.digits));
60
+ const [inputValue, setInputValue] = (0, _react.useState)(() => formatValue(value));
61
+ // >>>>> Value
42
62
  function setValueWithCheck(v) {
43
63
  if (isNaN(v)) return;
44
64
  let target = (0, _bound.bound)(v, props.min, props.max);
45
- if (props.digits !== undefined) {
46
- target = parseFloat(target.toFixed(props.digits));
65
+ if (digits !== undefined) {
66
+ target = parseFloat(target.toFixed(digits));
47
67
  }
48
68
  setValue(target);
49
69
  }
50
- const [hasFocus, setHasFocus] = (0, _react.useState)(false);
51
- (0, _react.useEffect)(() => {
52
- if (!hasFocus) {
53
- setInputValue(convertValueToText(value, props.digits));
54
- }
55
- }, [hasFocus]);
56
- (0, _react.useEffect)(() => {
57
- if (!hasFocus) {
58
- setInputValue(convertValueToText(value, props.digits));
59
- }
60
- }, [value, props.digits]);
70
+ // >>>>> Input
61
71
  const handleInputChange = v => {
62
72
  setInputValue(v);
63
- const value = convertTextToValue(v);
73
+ const value = parseValue(v);
64
74
  if (value === null) {
65
75
  if (props.allowEmpty) {
66
76
  setValue(null);
@@ -71,6 +81,29 @@ const Stepper = p => {
71
81
  setValueWithCheck(value);
72
82
  }
73
83
  };
84
+ // ============================== Focus ===============================
85
+ const [focused, setFocused] = (0, _react.useState)(false);
86
+ const inputRef = _react.default.useRef(null);
87
+ function triggerFocus(nextFocus) {
88
+ setFocused(nextFocus);
89
+ // We will convert value to original text when focus
90
+ if (nextFocus) {
91
+ setInputValue(typeof value === 'number' ? String(value) : '');
92
+ }
93
+ }
94
+ (0, _react.useEffect)(() => {
95
+ var _a, _b, _c;
96
+ if (focused) {
97
+ (_c = (_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.nativeElement) === null || _b === void 0 ? void 0 : _b.select) === null || _c === void 0 ? void 0 : _c.call(_b);
98
+ }
99
+ }, [focused]);
100
+ // Focus change to format value
101
+ (0, _react.useEffect)(() => {
102
+ if (!focused) {
103
+ setInputValue(formatValue(value));
104
+ }
105
+ }, [focused, value, digits]);
106
+ // ============================ Operations ============================
74
107
  const handleMinus = () => {
75
108
  setValueWithCheck((0, _big.default)(value !== null && value !== void 0 ? value : 0).minus(step).toNumber());
76
109
  };
@@ -93,9 +126,10 @@ const Stepper = p => {
93
126
  }
94
127
  return false;
95
128
  };
129
+ // ============================== Render ==============================
96
130
  return (0, _nativeProps.withNativeProps)(props, _react.default.createElement("div", {
97
131
  className: (0, _classnames.default)(classPrefix, {
98
- [`${classPrefix}-active`]: hasFocus
132
+ [`${classPrefix}-active`]: focused
99
133
  })
100
134
  }, _react.default.createElement(_button.default, {
101
135
  className: `${classPrefix}-minus`,
@@ -108,10 +142,11 @@ const Stepper = p => {
108
142
  }, _react.default.createElement(_antdMobileIcons.MinusOutline, null)), _react.default.createElement("div", {
109
143
  className: `${classPrefix}-middle`
110
144
  }, _react.default.createElement(_input.default, {
145
+ ref: inputRef,
111
146
  className: `${classPrefix}-input`,
112
147
  onFocus: e => {
113
148
  var _a;
114
- setHasFocus(true);
149
+ triggerFocus(true);
115
150
  (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
116
151
  },
117
152
  value: inputValue,
@@ -121,7 +156,7 @@ const Stepper = p => {
121
156
  disabled: disabled,
122
157
  onBlur: e => {
123
158
  var _a;
124
- setHasFocus(false);
159
+ triggerFocus(false);
125
160
  (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
126
161
  },
127
162
  readOnly: inputReadOnly,
@@ -140,16 +175,4 @@ const Stepper = p => {
140
175
  "aria-label": locale.Stepper.increase
141
176
  }, _react.default.createElement(_antdMobileIcons.AddOutline, null))));
142
177
  };
143
- exports.Stepper = Stepper;
144
- function convertValueToText(value, digits) {
145
- if (value === null) return '';
146
- if (digits !== undefined) {
147
- return value.toFixed(digits);
148
- } else {
149
- return value.toString();
150
- }
151
- }
152
- function convertTextToValue(text) {
153
- if (text === '') return null;
154
- return parseFloat(text);
155
- }
178
+ exports.Stepper = Stepper;
@@ -10,7 +10,7 @@ export declare type WaterMarkProps = {
10
10
  image?: string;
11
11
  imageWidth?: number;
12
12
  imageHeight?: number;
13
- content?: string;
13
+ content?: string | string[];
14
14
  fontColor?: string;
15
15
  fontStyle?: 'none' | 'normal' | 'italic' | 'oblique';
16
16
  fontFamily?: string;
@@ -67,7 +67,11 @@ const WaterMark = p => {
67
67
  const markSize = Number(fontSize) * ratio;
68
68
  ctx.font = `${fontStyle} normal ${fontWeight} ${markSize}px/${markHeight}px ${fontFamily}`;
69
69
  ctx.fillStyle = fontColor;
70
- ctx.fillText(content, 0, 0);
70
+ if (Array.isArray(content)) {
71
+ content.forEach((item, index) => ctx.fillText(item, 0, index * markSize));
72
+ } else {
73
+ ctx.fillText(content, 0, 0);
74
+ }
71
75
  ctx.restore();
72
76
  setBase64Url(canvas.toDataURL());
73
77
  }
@@ -122,11 +122,17 @@ export const Calendar = forwardRef((p, ref) => {
122
122
  let isSelect = false;
123
123
  let isBegin = false;
124
124
  let isEnd = false;
125
+ let isSelectRowBegin = false;
126
+ let isSelectRowEnd = false;
125
127
  if (dateRange) {
126
128
  const [begin, end] = dateRange;
127
129
  isBegin = d.isSame(begin, 'day');
128
130
  isEnd = d.isSame(end, 'day');
129
131
  isSelect = isBegin || isEnd || d.isAfter(begin, 'day') && d.isBefore(end, 'day');
132
+ if (isSelect) {
133
+ isSelectRowBegin = (cells.length % 7 === 0 || d.isSame(d.startOf('month'), 'day')) && !isBegin;
134
+ isSelectRowEnd = (cells.length % 7 === 6 || d.isSame(d.endOf('month'), 'day')) && !isEnd;
135
+ }
130
136
  }
131
137
  const inThisMonth = d.month() === current.month();
132
138
  const disabled = props.shouldDisableDate ? props.shouldDisableDate(d.toDate()) : maxDay && d.isAfter(maxDay, 'day') || minDay && d.isBefore(minDay, 'day');
@@ -136,7 +142,9 @@ export const Calendar = forwardRef((p, ref) => {
136
142
  [`${classPrefix}-cell-today`]: d.isSame(today, 'day'),
137
143
  [`${classPrefix}-cell-selected`]: isSelect,
138
144
  [`${classPrefix}-cell-selected-begin`]: isBegin,
139
- [`${classPrefix}-cell-selected-end`]: isEnd
145
+ [`${classPrefix}-cell-selected-end`]: isEnd,
146
+ [`${classPrefix}-cell-selected-row-begin`]: isSelectRowBegin,
147
+ [`${classPrefix}-cell-selected-row-end`]: isSelectRowEnd
140
148
  }),
141
149
  onClick: () => {
142
150
  if (!props.selectionMode) return;
@@ -1,9 +1,17 @@
1
1
  import React, { FC } from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
+ declare type Offset = {
4
+ x: number;
5
+ y: number;
6
+ };
3
7
  export declare type FloatingBubbleProps = {
4
8
  onClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
5
9
  axis?: 'x' | 'y' | 'xy' | 'lock';
6
10
  magnetic?: 'x' | 'y';
7
11
  children?: React.ReactNode;
12
+ offset?: Offset;
13
+ defaultOffset?: Offset;
14
+ onOffsetChange?: (offset: Offset) => void;
8
15
  } & NativeProps<'--initial-position-left' | '--initial-position-right' | '--initial-position-top' | '--initial-position-bottom' | '--z-index' | '--edge-distance' | '--size' | '--border-radius' | '--background'>;
9
16
  export declare const FloatingBubble: FC<FloatingBubbleProps>;
17
+ export {};
@@ -1,16 +1,28 @@
1
- import React, { useRef } from 'react';
1
+ import React, { useRef, useEffect, useState } from 'react';
2
2
  import { useSpring, animated, to } from '@react-spring/web';
3
3
  import { useDrag } from '@use-gesture/react';
4
4
  import { mergeProps } from '../../utils/with-default-props';
5
5
  import { withNativeProps } from '../../utils/native-props';
6
6
  const classPrefix = `adm-floating-bubble`;
7
7
  const defaultProps = {
8
- axis: 'y'
8
+ axis: 'y',
9
+ defaultOffset: {
10
+ x: 0,
11
+ y: 0
12
+ }
9
13
  };
10
14
  export const FloatingBubble = p => {
11
15
  const props = mergeProps(defaultProps, p);
12
16
  const boundaryRef = useRef(null);
13
17
  const buttonRef = useRef(null);
18
+ const [innerValue, setInnerValue] = useState(props.offset === undefined ? props.defaultOffset : props.offset);
19
+ useEffect(() => {
20
+ if (props.offset === undefined) return;
21
+ api.start({
22
+ x: props.offset.x,
23
+ y: props.offset.y
24
+ });
25
+ }, [props.offset]);
14
26
  /**
15
27
  * memoize the `to` function
16
28
  * inside a component that renders frequently
@@ -21,11 +33,12 @@ export const FloatingBubble = p => {
21
33
  y,
22
34
  opacity
23
35
  }, api] = useSpring(() => ({
24
- x: 0,
25
- y: 0,
36
+ x: innerValue.x,
37
+ y: innerValue.y,
26
38
  opacity: 1
27
39
  }));
28
40
  const bind = useDrag(state => {
41
+ var _a;
29
42
  let nextX = state.offset[0];
30
43
  let nextY = state.offset[1];
31
44
  if (state.last && props.magnetic) {
@@ -54,10 +67,17 @@ export const FloatingBubble = p => {
54
67
  }
55
68
  }
56
69
  }
57
- api.start({
70
+ const nextOffest = {
58
71
  x: nextX,
59
72
  y: nextY
60
- });
73
+ };
74
+ if (props.offset === undefined) {
75
+ // Uncontrolled mode
76
+ api.start(nextOffest);
77
+ } else {
78
+ setInnerValue(nextOffest);
79
+ }
80
+ (_a = props.onOffsetChange) === null || _a === void 0 ? void 0 : _a.call(props, nextOffest);
61
81
  // active status
62
82
  api.start({
63
83
  opacity: state.active ? 0.8 : 1
@@ -3,7 +3,7 @@ import { NativeProps } from '../../utils/native-props';
3
3
  import { ListProps } from '../list';
4
4
  import type { FormProps as RcFormProps, FormInstance as RCFormInstance } from 'rc-field-form';
5
5
  import { FormContextType } from './context';
6
- export declare type FormInstance = Pick<RCFormInstance, 'getFieldValue' | 'getFieldsValue' | 'getFieldError' | 'getFieldsError' | 'isFieldTouched' | 'isFieldsTouched' | 'resetFields' | 'setFields' | 'setFieldsValue' | 'submit' | 'validateFields'>;
6
+ export declare type FormInstance = Pick<RCFormInstance, 'getFieldValue' | 'getFieldsValue' | 'getFieldError' | 'getFieldsError' | 'isFieldTouched' | 'isFieldsTouched' | 'resetFields' | 'setFields' | 'setFieldValue' | 'setFieldsValue' | 'submit' | 'validateFields'>;
7
7
  export declare type FormProps = Pick<RcFormProps, 'form' | 'initialValues' | 'name' | 'preserve' | 'validateMessages' | 'validateTrigger' | 'onFieldsChange' | 'onFinish' | 'onFinishFailed' | 'onValuesChange' | 'children'> & NativeProps<'--border-inner' | '--border-top' | '--border-bottom' | '--prefix-width'> & Partial<FormContextType> & {
8
8
  footer?: ReactNode;
9
9
  mode?: ListProps['mode'];
@@ -1,8 +1,15 @@
1
1
  .adm-image-uploader {
2
2
  --cell-size: 80px;
3
+ --gap: 12px;
4
+ ---gap: var(--gap);
5
+ ---gap-horizontal: var(--gap-horizontal, var(--gap));
6
+ ---gap-vertical: var(--gap-vertical, var(--gap));
3
7
  }
8
+ .adm-image-uploader-grid,
4
9
  .adm-image-uploader-space {
5
- --gap: 12px;
10
+ --gap: var(---gap);
11
+ --gap-horizontal: var(---gap-horizontal);
12
+ --gap-vertical: var(---gap-vertical);
6
13
  }
7
14
  .adm-image-uploader-cell {
8
15
  position: relative;
@@ -82,3 +89,10 @@
82
89
  height: 100%;
83
90
  border-radius: 4px;
84
91
  }
92
+ .adm-image-uploader .adm-image-uploader-gap-measure {
93
+ position: absolute;
94
+ left: 0;
95
+ top: 0;
96
+ height: var(--gap-horizontal);
97
+ width: 0;
98
+ }
@@ -1,6 +1,7 @@
1
1
  import React, { FC, InputHTMLAttributes } from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
3
  import type { ImageProps } from '../image';
4
+ import { GridProps } from '../grid';
4
5
  export declare type TaskStatus = 'pending' | 'fail' | 'success';
5
6
  export interface ImageUploadItem {
6
7
  key?: string | number;
@@ -18,6 +19,7 @@ export declare type UploadTask = Pick<Task, 'id' | 'status'>;
18
19
  export declare type ImageUploaderProps = {
19
20
  defaultValue?: ImageUploadItem[];
20
21
  value?: ImageUploadItem[];
22
+ columns?: GridProps['columns'];
21
23
  onChange?: (items: ImageUploadItem[]) => void;
22
24
  onUploadQueueChange?: (tasks: UploadTask[]) => void;
23
25
  accept?: string;
@@ -27,6 +29,7 @@ export declare type ImageUploaderProps = {
27
29
  disableUpload?: boolean;
28
30
  showUpload?: boolean;
29
31
  deletable?: boolean;
32
+ deleteIcon?: React.ReactNode;
30
33
  capture?: InputHTMLAttributes<unknown>['capture'];
31
34
  onPreview?: (index: number, item: ImageUploadItem) => void;
32
35
  beforeUpload?: (file: File, files: File[]) => Promise<File | null> | File | null;
@@ -37,6 +40,6 @@ export declare type ImageUploaderProps = {
37
40
  imageFit?: ImageProps['fit'];
38
41
  children?: React.ReactNode;
39
42
  renderItem?: (originNode: React.ReactElement, file: ImageUploadItem, fileList: ImageUploadItem[]) => React.ReactNode;
40
- } & NativeProps<'--cell-size'>;
43
+ } & NativeProps<'--cell-size' | '--gap' | '--gap-vertical' | '--gap-horizontal'>;
41
44
  export declare const ImageUploader: FC<ImageUploaderProps>;
42
45
  export {};