antd-mobile 5.41.0-alpha.0 → 5.41.0-alpha.2

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 (60) hide show
  1. package/2x/bundle/antd-mobile.cjs.development.js +1407 -1367
  2. package/2x/bundle/antd-mobile.cjs.js +7 -7
  3. package/2x/bundle/antd-mobile.es.development.js +360 -320
  4. package/2x/bundle/antd-mobile.es.js +5316 -5283
  5. package/2x/bundle/antd-mobile.umd.development.js +1407 -1367
  6. package/2x/bundle/antd-mobile.umd.js +7 -7
  7. package/2x/cjs/components/calendar/calendar.d.ts +4 -1
  8. package/2x/cjs/components/calendar/calendar.js +18 -11
  9. package/2x/cjs/components/ellipsis/useMeasure.js +4 -3
  10. package/2x/cjs/components/input/input.d.ts +1 -1
  11. package/2x/cjs/components/input/input.js +1 -3
  12. package/2x/cjs/components/input/useInputHandleKeyDown.d.ts +1 -3
  13. package/2x/cjs/components/input/useInputHandleKeyDown.js +1 -12
  14. package/2x/cjs/components/number-keyboard/number-keyboard.js +21 -12
  15. package/2x/cjs/components/picker/index.d.ts +4 -2
  16. package/2x/cjs/components/text-area/text-area.d.ts +1 -1
  17. package/2x/cjs/components/text-area/text-area.js +6 -7
  18. package/2x/es/components/calendar/calendar.d.ts +4 -1
  19. package/2x/es/components/calendar/calendar.js +19 -12
  20. package/2x/es/components/ellipsis/useMeasure.js +4 -3
  21. package/2x/es/components/input/input.d.ts +1 -1
  22. package/2x/es/components/input/input.js +1 -3
  23. package/2x/es/components/input/useInputHandleKeyDown.d.ts +1 -3
  24. package/2x/es/components/input/useInputHandleKeyDown.js +1 -12
  25. package/2x/es/components/number-keyboard/number-keyboard.js +21 -12
  26. package/2x/es/components/picker/index.d.ts +4 -2
  27. package/2x/es/components/text-area/text-area.d.ts +1 -1
  28. package/2x/es/components/text-area/text-area.js +6 -7
  29. package/2x/package.json +1 -1
  30. package/bundle/antd-mobile.cjs.development.js +1407 -1367
  31. package/bundle/antd-mobile.cjs.js +7 -7
  32. package/bundle/antd-mobile.compatible.umd.js +1 -1
  33. package/bundle/antd-mobile.es.development.js +360 -320
  34. package/bundle/antd-mobile.es.js +5316 -5283
  35. package/bundle/antd-mobile.umd.development.js +1407 -1367
  36. package/bundle/antd-mobile.umd.js +7 -7
  37. package/cjs/components/calendar/calendar.d.ts +4 -1
  38. package/cjs/components/calendar/calendar.js +18 -11
  39. package/cjs/components/ellipsis/useMeasure.js +4 -3
  40. package/cjs/components/input/input.d.ts +1 -1
  41. package/cjs/components/input/input.js +1 -3
  42. package/cjs/components/input/useInputHandleKeyDown.d.ts +1 -3
  43. package/cjs/components/input/useInputHandleKeyDown.js +1 -12
  44. package/cjs/components/number-keyboard/number-keyboard.js +21 -12
  45. package/cjs/components/picker/index.d.ts +4 -2
  46. package/cjs/components/text-area/text-area.d.ts +1 -1
  47. package/cjs/components/text-area/text-area.js +6 -7
  48. package/es/components/calendar/calendar.d.ts +4 -1
  49. package/es/components/calendar/calendar.js +19 -12
  50. package/es/components/ellipsis/useMeasure.js +4 -3
  51. package/es/components/input/input.d.ts +1 -1
  52. package/es/components/input/input.js +1 -3
  53. package/es/components/input/useInputHandleKeyDown.d.ts +1 -3
  54. package/es/components/input/useInputHandleKeyDown.js +1 -12
  55. package/es/components/number-keyboard/number-keyboard.js +21 -12
  56. package/es/components/picker/index.d.ts +4 -2
  57. package/es/components/text-area/text-area.d.ts +1 -1
  58. package/es/components/text-area/text-area.js +6 -7
  59. package/package.json +1 -1
  60. package/umd/antd-mobile.js +1 -1
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
3
  import { Page } from './convert';
4
4
  export declare type CalendarRef = {
@@ -14,6 +14,9 @@ export declare type CalendarProps = {
14
14
  weekStartsOn?: 'Monday' | 'Sunday';
15
15
  renderLabel?: (date: Date) => React.ReactNode;
16
16
  renderDate?: (date: Date) => React.ReactNode;
17
+ cellRender?: (oriNode: React.ReactElement, info: {
18
+ date: Date;
19
+ }) => ReactNode;
17
20
  allowClear?: boolean;
18
21
  max?: Date;
19
22
  min?: Date;
@@ -4,23 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Calendar = void 0;
7
+ var _ahooks = require("ahooks");
8
+ var _classnames = _interopRequireDefault(require("classnames"));
9
+ var _dayjs = _interopRequireDefault(require("dayjs"));
10
+ var _isoWeek = _interopRequireDefault(require("dayjs/plugin/isoWeek"));
7
11
  var _react = _interopRequireWildcard(require("react"));
12
+ var _devLog = require("../../utils/dev-log");
8
13
  var _nativeProps = require("../../utils/native-props");
9
- var _dayjs = _interopRequireDefault(require("dayjs"));
10
- var _classnames = _interopRequireDefault(require("classnames"));
14
+ var _replaceMessage = require("../../utils/replace-message");
15
+ var _usePropsValue = require("../../utils/use-props-value");
11
16
  var _withDefaultProps = require("../../utils/with-default-props");
17
+ var _configProvider = require("../config-provider");
12
18
  var _arrowLeft = require("./arrow-left");
13
19
  var _arrowLeftDouble = require("./arrow-left-double");
14
- var _configProvider = require("../config-provider");
15
- var _isoWeek = _interopRequireDefault(require("dayjs/plugin/isoWeek"));
16
- var _ahooks = require("ahooks");
17
- var _usePropsValue = require("../../utils/use-props-value");
18
- var _replaceMessage = require("../../utils/replace-message");
19
- var _devLog = require("../../utils/dev-log");
20
20
  var _convert = require("./convert");
21
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
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); }
23
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; }
23
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
24
  _dayjs.default.extend(_isoWeek.default);
25
25
  const classPrefix = 'adm-calendar';
26
26
  const defaultProps = {
@@ -150,7 +150,7 @@ const Calendar = (0, _react.forwardRef)((p, ref) => {
150
150
  }
151
151
  const inThisMonth = d.month() === current.month();
152
152
  const disabled = props.shouldDisableDate ? props.shouldDisableDate(d.toDate()) : maxDay && d.isAfter(maxDay, 'day') || minDay && d.isBefore(minDay, 'day');
153
- cells.push(_react.default.createElement("div", {
153
+ const originalCell = _react.default.createElement("div", {
154
154
  key: d.valueOf(),
155
155
  className: (0, _classnames.default)(`${classPrefix}-cell`, (disabled || !inThisMonth) && `${classPrefix}-cell-disabled`, inThisMonth && {
156
156
  [`${classPrefix}-cell-today`]: d.isSame(today, 'day'),
@@ -204,7 +204,14 @@ const Calendar = (0, _react.forwardRef)((p, ref) => {
204
204
  className: `${classPrefix}-cell-top`
205
205
  }, props.renderDate ? props.renderDate(d.toDate()) : d.date()), _react.default.createElement("div", {
206
206
  className: `${classPrefix}-cell-bottom`
207
- }, (_a = props.renderLabel) === null || _a === void 0 ? void 0 : _a.call(props, d.toDate()))));
207
+ }, (_a = props.renderLabel) === null || _a === void 0 ? void 0 : _a.call(props, d.toDate())));
208
+ // Wrap with Fragment to ensure key is properly set
209
+ const cellWithKey = props.cellRender ? _react.default.createElement(_react.default.Fragment, {
210
+ key: d.valueOf()
211
+ }, props.cellRender(originalCell, {
212
+ date: d.toDate()
213
+ })) : originalCell;
214
+ cells.push(cellWithKey);
208
215
  iterator = iterator.add(1, 'day');
209
216
  }
210
217
  return cells;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = useMeasure;
7
7
  var _rcUtil = require("rc-util");
8
+ var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
8
9
  var _react = _interopRequireDefault(require("react"));
9
10
  var _reactDom = require("react-dom");
10
11
  var _runes = _interopRequireDefault(require("runes2"));
@@ -34,11 +35,11 @@ function useMeasure(containerRef, content, rows, direction, expanded, expandNode
34
35
  });
35
36
  });
36
37
  // Initialize
37
- _react.default.useLayoutEffect(() => {
38
+ (0, _useLayoutEffect.default)(() => {
38
39
  startMeasure();
39
40
  }, [contentChars, rows]);
40
41
  // Measure element height
41
- _react.default.useLayoutEffect(() => {
42
+ (0, _useLayoutEffect.default)(() => {
42
43
  var _a, _b;
43
44
  if (status === 1 /* PREPARE */) {
44
45
  const fullMeasureHeight = ((_a = fullMeasureRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) || 0;
@@ -53,7 +54,7 @@ function useMeasure(containerRef, content, rows, direction, expanded, expandNode
53
54
  }
54
55
  }, [status]);
55
56
  // Walking measure
56
- _react.default.useLayoutEffect(() => {
57
+ (0, _useLayoutEffect.default)(() => {
57
58
  var _a;
58
59
  if (status === 2 /* MEASURE_WALKING */) {
59
60
  const diff = walkingIndexes[1] - walkingIndexes[0];
@@ -22,7 +22,7 @@ export declare type InputRef = {
22
22
  blur: () => void;
23
23
  nativeElement: HTMLInputElement | null;
24
24
  };
25
- export declare const Input: React.ForwardRefExoticComponent<Pick<NativeInputProps, "pattern" | "id" | "onClick" | "disabled" | "onPaste" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "onKeyUp" | "type" | "step" | "autoFocus" | "placeholder" | "autoCapitalize" | "autoCorrect" | "inputMode" | "name" | "readOnly" | "autoComplete" | "enterKeyHint" | "maxLength" | "minLength"> & {
25
+ export declare const Input: React.ForwardRefExoticComponent<Pick<NativeInputProps, "pattern" | "id" | "onClick" | "disabled" | "onPaste" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "onKeyUp" | "type" | "step" | "autoCapitalize" | "autoFocus" | "enterKeyHint" | "autoCorrect" | "inputMode" | "placeholder" | "name" | "readOnly" | "autoComplete" | "maxLength" | "minLength"> & {
26
26
  value?: string | undefined;
27
27
  defaultValue?: string | undefined;
28
28
  onChange?: ((val: string) => void) | undefined;
@@ -35,9 +35,7 @@ const Input = (0, _react.forwardRef)((props, ref) => {
35
35
  const nativeInputRef = (0, _react.useRef)(null);
36
36
  const handleKeydown = (0, _useInputHandleKeyDown.default)({
37
37
  onEnterPress: mergedProps.onEnterPress,
38
- onKeyDown: mergedProps.onKeyDown,
39
- nativeInputRef,
40
- enterKeyHint: mergedProps.enterKeyHint
38
+ onKeyDown: mergedProps.onKeyDown
41
39
  });
42
40
  (0, _react.useImperativeHandle)(ref, () => ({
43
41
  clear: () => {
@@ -1,8 +1,6 @@
1
1
  interface InputHandleKeyDownType<T> {
2
2
  onEnterPress?: (e: React.KeyboardEvent<T>) => void;
3
3
  onKeyDown?: (e: React.KeyboardEvent<T>) => void;
4
- enterKeyHint?: React.InputHTMLAttributes<HTMLInputElement>['enterKeyHint'];
5
- nativeInputRef: React.RefObject<T>;
6
4
  }
7
- export default function useInputHandleKeyDown<T extends HTMLInputElement | HTMLTextAreaElement>({ onEnterPress, onKeyDown, nativeInputRef, enterKeyHint, }: InputHandleKeyDownType<T>): (e: React.KeyboardEvent<T>) => void;
5
+ export default function useInputHandleKeyDown<T extends HTMLInputElement | HTMLTextAreaElement>({ onEnterPress, onKeyDown }: InputHandleKeyDownType<T>): (e: React.KeyboardEvent<T>) => void;
8
6
  export {};
@@ -4,12 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = useInputHandleKeyDown;
7
- var _ahooks = require("ahooks");
8
7
  function useInputHandleKeyDown({
9
8
  onEnterPress,
10
- onKeyDown,
11
- nativeInputRef,
12
- enterKeyHint
9
+ onKeyDown
13
10
  }) {
14
11
  const handleKeydown = e => {
15
12
  if (onEnterPress && (e.code === 'Enter' || e.keyCode === 13)) {
@@ -17,13 +14,5 @@ function useInputHandleKeyDown({
17
14
  }
18
15
  onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
19
16
  };
20
- (0, _ahooks.useIsomorphicLayoutEffect)(() => {
21
- const ele = nativeInputRef.current;
22
- if (!enterKeyHint || !ele) return;
23
- ele.setAttribute('enterkeyhint', enterKeyHint);
24
- return () => {
25
- ele.removeAttribute('enterkeyhint');
26
- };
27
- }, [enterKeyHint]);
28
17
  return handleKeydown;
29
18
  }
@@ -117,6 +117,7 @@ const NumberKeyboard = p => {
117
117
  };
118
118
  const renderKey = (key, index) => {
119
119
  const isNumberKey = /^\d$/.test(key);
120
+ const isBackspace = key === 'BACKSPACE';
120
121
  const className = (0, _classnames.default)(`${classPrefix}-key`, {
121
122
  [`${classPrefix}-key-number`]: isNumberKey,
122
123
  [`${classPrefix}-key-sign`]: !isNumberKey && key,
@@ -124,25 +125,29 @@ const NumberKeyboard = p => {
124
125
  });
125
126
  const ariaProps = key ? {
126
127
  role: 'button',
127
- title: key,
128
+ title: isBackspace ? locale.Input.clear : key,
128
129
  tabIndex: -1
129
130
  } : undefined;
130
131
  return _react.default.createElement("div", Object.assign({
131
132
  key: key,
132
133
  className: className,
133
- onTouchStart: () => {
134
+ // 仅为 backspace 绑定,支持长按快速删除
135
+ onTouchStart: isBackspace ? () => {
136
+ stopContinueClear();
137
+ startContinueClear();
138
+ } : undefined,
139
+ onTouchEnd: isBackspace ? e => {
140
+ stopContinueClear();
141
+ onKeyPress(e, key);
142
+ } : undefined,
143
+ // <div role="button" title="1" onTouchEnd={e => {}}>1</div> 安卓上 talback 可读不可点
144
+ // see https://ua-gilded-eef7f9.netlify.app/grid-button-bug.html
145
+ // 所以还是绑定 click,通过 touchEnd 的 preventDefault 防重复触发
146
+ onClick: e => {
134
147
  stopContinueClear();
135
- if (key === 'BACKSPACE') {
136
- startContinueClear();
137
- }
138
- },
139
- onTouchEnd: e => {
140
148
  onKeyPress(e, key);
141
- if (key === 'BACKSPACE') {
142
- stopContinueClear();
143
- }
144
149
  }
145
- }, ariaProps), key === 'BACKSPACE' ? _react.default.createElement(_antdMobileIcons.TextDeletionOutline, null) : key);
150
+ }, ariaProps), isBackspace ? _react.default.createElement(_antdMobileIcons.TextDeletionOutline, null) : key);
146
151
  };
147
152
  return _react.default.createElement(_popup.default, {
148
153
  visible: visible,
@@ -174,8 +179,12 @@ const NumberKeyboard = p => {
174
179
  startContinueClear();
175
180
  },
176
181
  onTouchEnd: e => {
182
+ stopContinueClear();
177
183
  onKeyPress(e, 'BACKSPACE');
184
+ },
185
+ onClick: e => {
178
186
  stopContinueClear();
187
+ onKeyPress(e, 'BACKSPACE');
179
188
  },
180
189
  onContextMenu: e => {
181
190
  // Long press should not trigger native context menu
@@ -186,7 +195,7 @@ const NumberKeyboard = p => {
186
195
  tabIndex: -1
187
196
  }, _react.default.createElement(_antdMobileIcons.TextDeletionOutline, null)), _react.default.createElement("div", {
188
197
  className: `${classPrefix}-key ${classPrefix}-key-extra ${classPrefix}-key-ok`,
189
- onTouchEnd: e => onKeyPress(e, 'OK'),
198
+ onClick: e => onKeyPress(e, 'OK'),
190
199
  role: 'button',
191
200
  tabIndex: -1,
192
201
  "aria-label": confirmText
@@ -2,7 +2,7 @@ import './picker.less';
2
2
  import { prompt } from './prompt';
3
3
  export type { PickerProps, PickerRef, PickerActions } from './picker';
4
4
  export type { PickerValue, PickerColumnItem, PickerColumn, PickerValueExtend, } from '../picker-view';
5
- declare const _default: import("react").NamedExoticComponent<{
5
+ declare const _default: import("react").NamedExoticComponent<Omit<{
6
6
  columns: import("../picker-view").PickerColumn[] | ((value: import("../picker-view").PickerValue[]) => import("../picker-view").PickerColumn[]);
7
7
  value?: import("../picker-view").PickerValue[] | undefined;
8
8
  defaultValue?: import("../picker-view").PickerValue[] | undefined;
@@ -26,7 +26,9 @@ declare const _default: import("react").NamedExoticComponent<{
26
26
  className?: string | undefined;
27
27
  style?: (import("react").CSSProperties & Partial<Record<"--header-button-font-size" | "--title-font-size" | "--item-font-size" | "--item-height", string>>) | undefined;
28
28
  tabIndex?: number | undefined;
29
- } & import("react").AriaAttributes & import("react").RefAttributes<import("./picker").PickerActions>> & {
29
+ } & import("react").AriaAttributes & import("react").RefAttributes<import("./picker").PickerActions>, "ref"> & {
30
+ ref?: ((instance: import("./picker").PickerActions | null) => void) | import("react").RefObject<import("./picker").PickerActions> | null | undefined;
31
+ }> & {
30
32
  readonly type: import("react").ForwardRefExoticComponent<{
31
33
  columns: import("../picker-view").PickerColumn[] | ((value: import("../picker-view").PickerValue[]) => import("../picker-view").PickerColumn[]);
32
34
  value?: import("../picker-view").PickerValue[] | undefined;
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  import type { ReactNode } from 'react';
2
+ import React from 'react';
3
3
  import { NativeProps } from '../../utils/native-props';
4
4
  export declare type TextAreaProps = Pick<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, 'autoComplete' | 'autoFocus' | 'disabled' | 'readOnly' | 'name' | 'onFocus' | 'onBlur' | 'onCompositionStart' | 'onCompositionEnd' | 'onClick' | 'onKeyDown'> & {
5
5
  onChange?: (val: string) => void;
@@ -4,14 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.TextArea = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
8
7
  var _ahooks = require("ahooks");
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
  var _runes = _interopRequireDefault(require("runes2"));
10
+ var _useInputHandleKeyDown = _interopRequireDefault(require("../../components/input/useInputHandleKeyDown"));
11
+ var _devLog = require("../../utils/dev-log");
10
12
  var _nativeProps = require("../../utils/native-props");
11
13
  var _usePropsValue = require("../../utils/use-props-value");
12
14
  var _withDefaultProps = require("../../utils/with-default-props");
13
- var _devLog = require("../../utils/dev-log");
14
- var _useInputHandleKeyDown = _interopRequireDefault(require("../../components/input/useInputHandleKeyDown"));
15
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
16
  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); }
17
17
  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; }
@@ -42,9 +42,7 @@ const TextArea = (0, _react.forwardRef)((p, ref) => {
42
42
  const hiddenTextAreaRef = (0, _react.useRef)(null);
43
43
  const handleKeydown = (0, _useInputHandleKeyDown.default)({
44
44
  onEnterPress: props.onEnterPress,
45
- onKeyDown: props.onKeyDown,
46
- nativeInputRef: nativeTextAreaRef,
47
- enterKeyHint: props.enterKeyHint
45
+ onKeyDown: props.onKeyDown
48
46
  });
49
47
  (0, _react.useImperativeHandle)(ref, () => ({
50
48
  clear: () => {
@@ -140,7 +138,8 @@ const TextArea = (0, _react.forwardRef)((p, ref) => {
140
138
  onFocus: props.onFocus,
141
139
  onBlur: props.onBlur,
142
140
  onClick: props.onClick,
143
- onKeyDown: handleKeydown
141
+ onKeyDown: handleKeydown,
142
+ enterKeyHint: props.enterKeyHint
144
143
  }), count, autoSize && _react.default.createElement("textarea", {
145
144
  ref: hiddenTextAreaRef,
146
145
  className: `${classPrefix}-element ${classPrefix}-element-hidden`,
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { ReactNode } from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
3
  import { Page } from './convert';
4
4
  export declare type CalendarRef = {
@@ -14,6 +14,9 @@ export declare type CalendarProps = {
14
14
  weekStartsOn?: 'Monday' | 'Sunday';
15
15
  renderLabel?: (date: Date) => React.ReactNode;
16
16
  renderDate?: (date: Date) => React.ReactNode;
17
+ cellRender?: (oriNode: React.ReactElement, info: {
18
+ date: Date;
19
+ }) => ReactNode;
17
20
  allowClear?: boolean;
18
21
  max?: Date;
19
22
  min?: Date;
@@ -1,17 +1,17 @@
1
- import React, { forwardRef, useState, useImperativeHandle, useMemo, useEffect } from 'react';
2
- import { withNativeProps } from '../../utils/native-props';
3
- import dayjs from 'dayjs';
1
+ import { useUpdateEffect } from 'ahooks';
4
2
  import classNames from 'classnames';
3
+ import dayjs from 'dayjs';
4
+ import isoWeek from 'dayjs/plugin/isoWeek';
5
+ import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
6
+ import { devWarning } from '../../utils/dev-log';
7
+ import { withNativeProps } from '../../utils/native-props';
8
+ import { replaceMessage } from '../../utils/replace-message';
9
+ import { usePropsValue } from '../../utils/use-props-value';
5
10
  import { mergeProps } from '../../utils/with-default-props';
11
+ import { useConfig } from '../config-provider';
6
12
  import { ArrowLeft } from './arrow-left';
7
13
  import { ArrowLeftDouble } from './arrow-left-double';
8
- import { useConfig } from '../config-provider';
9
- import isoWeek from 'dayjs/plugin/isoWeek';
10
- import { useUpdateEffect } from 'ahooks';
11
- import { usePropsValue } from '../../utils/use-props-value';
12
- import { replaceMessage } from '../../utils/replace-message';
13
- import { devWarning } from '../../utils/dev-log';
14
- import { convertValueToRange, convertPageToDayjs } from './convert';
14
+ import { convertPageToDayjs, convertValueToRange } from './convert';
15
15
  dayjs.extend(isoWeek);
16
16
  const classPrefix = 'adm-calendar';
17
17
  const defaultProps = {
@@ -141,7 +141,7 @@ export const Calendar = forwardRef((p, ref) => {
141
141
  }
142
142
  const inThisMonth = d.month() === current.month();
143
143
  const disabled = props.shouldDisableDate ? props.shouldDisableDate(d.toDate()) : maxDay && d.isAfter(maxDay, 'day') || minDay && d.isBefore(minDay, 'day');
144
- cells.push(React.createElement("div", {
144
+ const originalCell = React.createElement("div", {
145
145
  key: d.valueOf(),
146
146
  className: classNames(`${classPrefix}-cell`, (disabled || !inThisMonth) && `${classPrefix}-cell-disabled`, inThisMonth && {
147
147
  [`${classPrefix}-cell-today`]: d.isSame(today, 'day'),
@@ -195,7 +195,14 @@ export const Calendar = forwardRef((p, ref) => {
195
195
  className: `${classPrefix}-cell-top`
196
196
  }, props.renderDate ? props.renderDate(d.toDate()) : d.date()), React.createElement("div", {
197
197
  className: `${classPrefix}-cell-bottom`
198
- }, (_a = props.renderLabel) === null || _a === void 0 ? void 0 : _a.call(props, d.toDate()))));
198
+ }, (_a = props.renderLabel) === null || _a === void 0 ? void 0 : _a.call(props, d.toDate())));
199
+ // Wrap with Fragment to ensure key is properly set
200
+ const cellWithKey = props.cellRender ? React.createElement(React.Fragment, {
201
+ key: d.valueOf()
202
+ }, props.cellRender(originalCell, {
203
+ date: d.toDate()
204
+ })) : originalCell;
205
+ cells.push(cellWithKey);
199
206
  iterator = iterator.add(1, 'day');
200
207
  }
201
208
  return cells;
@@ -1,4 +1,5 @@
1
1
  import { useEvent } from 'rc-util';
2
+ import useLayoutEffect from 'rc-util/lib/hooks/useLayoutEffect';
2
3
  import React from 'react';
3
4
  import { unstable_batchedUpdates } from 'react-dom';
4
5
  import runes from 'runes2';
@@ -27,11 +28,11 @@ export default function useMeasure(containerRef, content, rows, direction, expan
27
28
  });
28
29
  });
29
30
  // Initialize
30
- React.useLayoutEffect(() => {
31
+ useLayoutEffect(() => {
31
32
  startMeasure();
32
33
  }, [contentChars, rows]);
33
34
  // Measure element height
34
- React.useLayoutEffect(() => {
35
+ useLayoutEffect(() => {
35
36
  var _a, _b;
36
37
  if (status === 1 /* PREPARE */) {
37
38
  const fullMeasureHeight = ((_a = fullMeasureRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight) || 0;
@@ -46,7 +47,7 @@ export default function useMeasure(containerRef, content, rows, direction, expan
46
47
  }
47
48
  }, [status]);
48
49
  // Walking measure
49
- React.useLayoutEffect(() => {
50
+ useLayoutEffect(() => {
50
51
  var _a;
51
52
  if (status === 2 /* MEASURE_WALKING */) {
52
53
  const diff = walkingIndexes[1] - walkingIndexes[0];
@@ -22,7 +22,7 @@ export declare type InputRef = {
22
22
  blur: () => void;
23
23
  nativeElement: HTMLInputElement | null;
24
24
  };
25
- export declare const Input: React.ForwardRefExoticComponent<Pick<NativeInputProps, "pattern" | "id" | "onClick" | "disabled" | "onPaste" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "onKeyUp" | "type" | "step" | "autoFocus" | "placeholder" | "autoCapitalize" | "autoCorrect" | "inputMode" | "name" | "readOnly" | "autoComplete" | "enterKeyHint" | "maxLength" | "minLength"> & {
25
+ export declare const Input: React.ForwardRefExoticComponent<Pick<NativeInputProps, "pattern" | "id" | "onClick" | "disabled" | "onPaste" | "onCompositionEnd" | "onCompositionStart" | "onFocus" | "onBlur" | "onKeyDown" | "onKeyUp" | "type" | "step" | "autoCapitalize" | "autoFocus" | "enterKeyHint" | "autoCorrect" | "inputMode" | "placeholder" | "name" | "readOnly" | "autoComplete" | "maxLength" | "minLength"> & {
26
26
  value?: string | undefined;
27
27
  defaultValue?: string | undefined;
28
28
  onChange?: ((val: string) => void) | undefined;
@@ -26,9 +26,7 @@ export const Input = forwardRef((props, ref) => {
26
26
  const nativeInputRef = useRef(null);
27
27
  const handleKeydown = useInputHandleKeyDown({
28
28
  onEnterPress: mergedProps.onEnterPress,
29
- onKeyDown: mergedProps.onKeyDown,
30
- nativeInputRef,
31
- enterKeyHint: mergedProps.enterKeyHint
29
+ onKeyDown: mergedProps.onKeyDown
32
30
  });
33
31
  useImperativeHandle(ref, () => ({
34
32
  clear: () => {
@@ -1,8 +1,6 @@
1
1
  interface InputHandleKeyDownType<T> {
2
2
  onEnterPress?: (e: React.KeyboardEvent<T>) => void;
3
3
  onKeyDown?: (e: React.KeyboardEvent<T>) => void;
4
- enterKeyHint?: React.InputHTMLAttributes<HTMLInputElement>['enterKeyHint'];
5
- nativeInputRef: React.RefObject<T>;
6
4
  }
7
- export default function useInputHandleKeyDown<T extends HTMLInputElement | HTMLTextAreaElement>({ onEnterPress, onKeyDown, nativeInputRef, enterKeyHint, }: InputHandleKeyDownType<T>): (e: React.KeyboardEvent<T>) => void;
5
+ export default function useInputHandleKeyDown<T extends HTMLInputElement | HTMLTextAreaElement>({ onEnterPress, onKeyDown }: InputHandleKeyDownType<T>): (e: React.KeyboardEvent<T>) => void;
8
6
  export {};
@@ -1,9 +1,6 @@
1
- import { useIsomorphicLayoutEffect } from 'ahooks';
2
1
  export default function useInputHandleKeyDown({
3
2
  onEnterPress,
4
- onKeyDown,
5
- nativeInputRef,
6
- enterKeyHint
3
+ onKeyDown
7
4
  }) {
8
5
  const handleKeydown = e => {
9
6
  if (onEnterPress && (e.code === 'Enter' || e.keyCode === 13)) {
@@ -11,13 +8,5 @@ export default function useInputHandleKeyDown({
11
8
  }
12
9
  onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
13
10
  };
14
- useIsomorphicLayoutEffect(() => {
15
- const ele = nativeInputRef.current;
16
- if (!enterKeyHint || !ele) return;
17
- ele.setAttribute('enterkeyhint', enterKeyHint);
18
- return () => {
19
- ele.removeAttribute('enterkeyhint');
20
- };
21
- }, [enterKeyHint]);
22
11
  return handleKeydown;
23
12
  }
@@ -108,6 +108,7 @@ export const NumberKeyboard = p => {
108
108
  };
109
109
  const renderKey = (key, index) => {
110
110
  const isNumberKey = /^\d$/.test(key);
111
+ const isBackspace = key === 'BACKSPACE';
111
112
  const className = classNames(`${classPrefix}-key`, {
112
113
  [`${classPrefix}-key-number`]: isNumberKey,
113
114
  [`${classPrefix}-key-sign`]: !isNumberKey && key,
@@ -115,25 +116,29 @@ export const NumberKeyboard = p => {
115
116
  });
116
117
  const ariaProps = key ? {
117
118
  role: 'button',
118
- title: key,
119
+ title: isBackspace ? locale.Input.clear : key,
119
120
  tabIndex: -1
120
121
  } : undefined;
121
122
  return React.createElement("div", Object.assign({
122
123
  key: key,
123
124
  className: className,
124
- onTouchStart: () => {
125
+ // 仅为 backspace 绑定,支持长按快速删除
126
+ onTouchStart: isBackspace ? () => {
127
+ stopContinueClear();
128
+ startContinueClear();
129
+ } : undefined,
130
+ onTouchEnd: isBackspace ? e => {
131
+ stopContinueClear();
132
+ onKeyPress(e, key);
133
+ } : undefined,
134
+ // <div role="button" title="1" onTouchEnd={e => {}}>1</div> 安卓上 talback 可读不可点
135
+ // see https://ua-gilded-eef7f9.netlify.app/grid-button-bug.html
136
+ // 所以还是绑定 click,通过 touchEnd 的 preventDefault 防重复触发
137
+ onClick: e => {
125
138
  stopContinueClear();
126
- if (key === 'BACKSPACE') {
127
- startContinueClear();
128
- }
129
- },
130
- onTouchEnd: e => {
131
139
  onKeyPress(e, key);
132
- if (key === 'BACKSPACE') {
133
- stopContinueClear();
134
- }
135
140
  }
136
- }, ariaProps), key === 'BACKSPACE' ? React.createElement(TextDeletionOutline, null) : key);
141
+ }, ariaProps), isBackspace ? React.createElement(TextDeletionOutline, null) : key);
137
142
  };
138
143
  return React.createElement(Popup, {
139
144
  visible: visible,
@@ -165,8 +170,12 @@ export const NumberKeyboard = p => {
165
170
  startContinueClear();
166
171
  },
167
172
  onTouchEnd: e => {
173
+ stopContinueClear();
168
174
  onKeyPress(e, 'BACKSPACE');
175
+ },
176
+ onClick: e => {
169
177
  stopContinueClear();
178
+ onKeyPress(e, 'BACKSPACE');
170
179
  },
171
180
  onContextMenu: e => {
172
181
  // Long press should not trigger native context menu
@@ -177,7 +186,7 @@ export const NumberKeyboard = p => {
177
186
  tabIndex: -1
178
187
  }, React.createElement(TextDeletionOutline, null)), React.createElement("div", {
179
188
  className: `${classPrefix}-key ${classPrefix}-key-extra ${classPrefix}-key-ok`,
180
- onTouchEnd: e => onKeyPress(e, 'OK'),
189
+ onClick: e => onKeyPress(e, 'OK'),
181
190
  role: 'button',
182
191
  tabIndex: -1,
183
192
  "aria-label": confirmText
@@ -2,7 +2,7 @@ import './picker.less';
2
2
  import { prompt } from './prompt';
3
3
  export type { PickerProps, PickerRef, PickerActions } from './picker';
4
4
  export type { PickerValue, PickerColumnItem, PickerColumn, PickerValueExtend, } from '../picker-view';
5
- declare const _default: import("react").NamedExoticComponent<{
5
+ declare const _default: import("react").NamedExoticComponent<Omit<{
6
6
  columns: import("../picker-view").PickerColumn[] | ((value: import("../picker-view").PickerValue[]) => import("../picker-view").PickerColumn[]);
7
7
  value?: import("../picker-view").PickerValue[] | undefined;
8
8
  defaultValue?: import("../picker-view").PickerValue[] | undefined;
@@ -26,7 +26,9 @@ declare const _default: import("react").NamedExoticComponent<{
26
26
  className?: string | undefined;
27
27
  style?: (import("react").CSSProperties & Partial<Record<"--header-button-font-size" | "--title-font-size" | "--item-font-size" | "--item-height", string>>) | undefined;
28
28
  tabIndex?: number | undefined;
29
- } & import("react").AriaAttributes & import("react").RefAttributes<import("./picker").PickerActions>> & {
29
+ } & import("react").AriaAttributes & import("react").RefAttributes<import("./picker").PickerActions>, "ref"> & {
30
+ ref?: ((instance: import("./picker").PickerActions | null) => void) | import("react").RefObject<import("./picker").PickerActions> | null | undefined;
31
+ }> & {
30
32
  readonly type: import("react").ForwardRefExoticComponent<{
31
33
  columns: import("../picker-view").PickerColumn[] | ((value: import("../picker-view").PickerValue[]) => import("../picker-view").PickerColumn[]);
32
34
  value?: import("../picker-view").PickerValue[] | undefined;
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  import type { ReactNode } from 'react';
2
+ import React from 'react';
3
3
  import { NativeProps } from '../../utils/native-props';
4
4
  export declare type TextAreaProps = Pick<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, 'autoComplete' | 'autoFocus' | 'disabled' | 'readOnly' | 'name' | 'onFocus' | 'onBlur' | 'onCompositionStart' | 'onCompositionEnd' | 'onClick' | 'onKeyDown'> & {
5
5
  onChange?: (val: string) => void;
@@ -1,11 +1,11 @@
1
- import React, { forwardRef, useImperativeHandle, useRef } from 'react';
2
1
  import { useIsomorphicLayoutEffect } from 'ahooks';
2
+ import React, { forwardRef, useImperativeHandle, useRef } from 'react';
3
3
  import runes from 'runes2';
4
+ import useInputHandleKeyDown from '../../components/input/useInputHandleKeyDown';
5
+ import { devError } from '../../utils/dev-log';
4
6
  import { withNativeProps } from '../../utils/native-props';
5
7
  import { usePropsValue } from '../../utils/use-props-value';
6
8
  import { mergeProps } from '../../utils/with-default-props';
7
- import { devError } from '../../utils/dev-log';
8
- import useInputHandleKeyDown from '../../components/input/useInputHandleKeyDown';
9
9
  const classPrefix = 'adm-text-area';
10
10
  const defaultProps = {
11
11
  rows: 2,
@@ -33,9 +33,7 @@ export const TextArea = forwardRef((p, ref) => {
33
33
  const hiddenTextAreaRef = useRef(null);
34
34
  const handleKeydown = useInputHandleKeyDown({
35
35
  onEnterPress: props.onEnterPress,
36
- onKeyDown: props.onKeyDown,
37
- nativeInputRef: nativeTextAreaRef,
38
- enterKeyHint: props.enterKeyHint
36
+ onKeyDown: props.onKeyDown
39
37
  });
40
38
  useImperativeHandle(ref, () => ({
41
39
  clear: () => {
@@ -131,7 +129,8 @@ export const TextArea = forwardRef((p, ref) => {
131
129
  onFocus: props.onFocus,
132
130
  onBlur: props.onBlur,
133
131
  onClick: props.onClick,
134
- onKeyDown: handleKeydown
132
+ onKeyDown: handleKeydown,
133
+ enterKeyHint: props.enterKeyHint
135
134
  }), count, autoSize && React.createElement("textarea", {
136
135
  ref: hiddenTextAreaRef,
137
136
  className: `${classPrefix}-element ${classPrefix}-element-hidden`,
package/2x/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "antd-mobile",
3
- "version": "5.41.0-alpha.0",
3
+ "version": "5.41.0-alpha.2",
4
4
  "homepage": "https://github.com/ant-design/ant-design-mobile#readme",
5
5
  "bugs": {
6
6
  "url": "https://github.com/ant-design/ant-design-mobile/issues"