antd-mobile 5.19.0 → 5.22.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 (156) hide show
  1. package/2x/bundle/antd-mobile.cjs.development.js +25724 -0
  2. package/2x/bundle/antd-mobile.cjs.js +8 -32
  3. package/2x/bundle/antd-mobile.compatible.umd.js +10464 -10860
  4. package/2x/bundle/antd-mobile.es.development.js +25704 -0
  5. package/2x/bundle/antd-mobile.es.js +8381 -8615
  6. package/2x/bundle/antd-mobile.umd.development.js +25726 -0
  7. package/2x/bundle/antd-mobile.umd.js +8 -32
  8. package/2x/bundle/style.css +153 -7
  9. package/2x/cjs/components/action-sheet/action-sheet.css +6 -2
  10. package/2x/cjs/components/action-sheet/action-sheet.d.ts +1 -0
  11. package/2x/cjs/components/action-sheet/action-sheet.js +2 -1
  12. package/2x/cjs/components/check-list/check-list.css +1 -1
  13. package/2x/cjs/components/ellipsis/ellipsis.js +1 -0
  14. package/2x/cjs/components/floating-panel/floating-panel.js +2 -2
  15. package/2x/cjs/components/form/context.d.ts +1 -1
  16. package/2x/cjs/components/form/form-item.d.ts +1 -1
  17. package/2x/cjs/components/form/form-item.js +3 -0
  18. package/2x/cjs/components/image/test/image.test.js +57 -8
  19. package/2x/cjs/components/image-viewer/image-viewer.js +4 -2
  20. package/2x/cjs/components/index-bar/index-bar.css +1 -1
  21. package/2x/cjs/components/page-indicator/page-indicator.css +1 -1
  22. package/2x/cjs/components/picker-view/wheel.js +2 -0
  23. package/2x/cjs/components/rate/rate.css +4 -0
  24. package/2x/cjs/components/rate/rate.js +42 -13
  25. package/2x/cjs/components/result-page/index.d.ts +7 -0
  26. package/2x/cjs/components/result-page/index.js +20 -0
  27. package/2x/cjs/components/result-page/result-page-card.d.ts +6 -0
  28. package/2x/cjs/components/result-page/result-page-card.js +24 -0
  29. package/2x/cjs/components/result-page/result-page.css +130 -0
  30. package/2x/cjs/components/result-page/result-page.d.ts +23 -0
  31. package/2x/cjs/components/result-page/result-page.js +108 -0
  32. package/2x/cjs/components/selector/selector.css +10 -0
  33. package/2x/cjs/components/selector/selector.d.ts +3 -2
  34. package/2x/cjs/components/selector/selector.js +1 -4
  35. package/2x/cjs/components/swipe-action/swipe-action.d.ts +2 -0
  36. package/2x/cjs/components/swipe-action/swipe-action.js +34 -6
  37. package/2x/cjs/components/swiper/swiper.js +15 -1
  38. package/2x/cjs/components/tab-bar/tab-bar.css +2 -2
  39. package/2x/cjs/index.d.ts +1 -0
  40. package/2x/cjs/index.js +8 -0
  41. package/2x/cjs/locales/id-ID.js +13 -0
  42. package/2x/cjs/utils/use-resize-effect.js +3 -1
  43. package/2x/es/components/action-sheet/action-sheet.css +6 -2
  44. package/2x/es/components/action-sheet/action-sheet.d.ts +1 -0
  45. package/2x/es/components/action-sheet/action-sheet.js +2 -1
  46. package/2x/es/components/check-list/check-list.css +1 -1
  47. package/2x/es/components/ellipsis/ellipsis.js +1 -0
  48. package/2x/es/components/floating-panel/floating-panel.js +2 -2
  49. package/2x/es/components/form/context.d.ts +1 -1
  50. package/2x/es/components/form/form-item.d.ts +1 -1
  51. package/2x/es/components/form/form-item.js +3 -0
  52. package/2x/es/components/image/test/image.test.js +54 -8
  53. package/2x/es/components/image-viewer/image-viewer.js +4 -2
  54. package/2x/es/components/index-bar/index-bar.css +1 -1
  55. package/2x/es/components/page-indicator/page-indicator.css +1 -1
  56. package/2x/es/components/picker-view/wheel.js +2 -0
  57. package/2x/es/components/rate/rate.css +4 -0
  58. package/2x/es/components/rate/rate.js +36 -13
  59. package/2x/es/components/result-page/index.d.ts +7 -0
  60. package/2x/es/components/result-page/index.js +7 -0
  61. package/2x/es/components/result-page/result-page-card.d.ts +6 -0
  62. package/2x/es/components/result-page/result-page-card.js +9 -0
  63. package/2x/es/components/result-page/result-page.css +130 -0
  64. package/2x/es/components/result-page/result-page.d.ts +23 -0
  65. package/2x/es/components/result-page/result-page.js +83 -0
  66. package/2x/es/components/selector/selector.css +10 -0
  67. package/2x/es/components/selector/selector.d.ts +3 -2
  68. package/2x/es/components/selector/selector.js +1 -3
  69. package/2x/es/components/swipe-action/swipe-action.d.ts +2 -0
  70. package/2x/es/components/swipe-action/swipe-action.js +34 -6
  71. package/2x/es/components/swiper/swiper.js +15 -1
  72. package/2x/es/components/tab-bar/tab-bar.css +2 -2
  73. package/2x/es/index.d.ts +1 -0
  74. package/2x/es/index.js +1 -0
  75. package/2x/es/locales/id-ID.js +13 -0
  76. package/2x/es/utils/use-resize-effect.js +3 -1
  77. package/2x/package.json +6 -6
  78. package/2x/umd/antd-mobile.js +10464 -10860
  79. package/bundle/antd-mobile.cjs.development.js +25724 -0
  80. package/bundle/antd-mobile.cjs.js +8 -32
  81. package/bundle/antd-mobile.compatible.umd.js +10464 -10860
  82. package/bundle/antd-mobile.es.development.js +25704 -0
  83. package/bundle/antd-mobile.es.js +8381 -8615
  84. package/bundle/antd-mobile.umd.development.js +25726 -0
  85. package/bundle/antd-mobile.umd.js +8 -32
  86. package/bundle/style.css +1 -1
  87. package/cjs/components/action-sheet/action-sheet.css +5 -2
  88. package/cjs/components/action-sheet/action-sheet.d.ts +1 -0
  89. package/cjs/components/action-sheet/action-sheet.js +2 -1
  90. package/cjs/components/check-list/check-list.css +1 -1
  91. package/cjs/components/ellipsis/ellipsis.js +1 -0
  92. package/cjs/components/floating-panel/floating-panel.js +2 -2
  93. package/cjs/components/form/context.d.ts +1 -1
  94. package/cjs/components/form/form-item.d.ts +1 -1
  95. package/cjs/components/form/form-item.js +3 -0
  96. package/cjs/components/image/test/image.test.js +57 -8
  97. package/cjs/components/image-viewer/image-viewer.js +4 -2
  98. package/cjs/components/index-bar/index-bar.css +1 -1
  99. package/cjs/components/page-indicator/page-indicator.css +1 -1
  100. package/cjs/components/picker-view/wheel.js +2 -0
  101. package/cjs/components/rate/rate.css +4 -0
  102. package/cjs/components/rate/rate.js +42 -13
  103. package/cjs/components/result-page/index.d.ts +7 -0
  104. package/cjs/components/result-page/index.js +20 -0
  105. package/cjs/components/result-page/result-page-card.d.ts +6 -0
  106. package/cjs/components/result-page/result-page-card.js +24 -0
  107. package/cjs/components/result-page/result-page.css +113 -0
  108. package/cjs/components/result-page/result-page.d.ts +23 -0
  109. package/cjs/components/result-page/result-page.js +108 -0
  110. package/cjs/components/selector/selector.css +9 -0
  111. package/cjs/components/selector/selector.d.ts +3 -2
  112. package/cjs/components/selector/selector.js +1 -4
  113. package/cjs/components/swipe-action/swipe-action.d.ts +2 -0
  114. package/cjs/components/swipe-action/swipe-action.js +34 -6
  115. package/cjs/components/swiper/swiper.js +15 -1
  116. package/cjs/components/tab-bar/tab-bar.css +2 -2
  117. package/cjs/index.d.ts +1 -0
  118. package/cjs/index.js +8 -0
  119. package/cjs/locales/id-ID.js +13 -0
  120. package/cjs/utils/use-resize-effect.js +3 -1
  121. package/es/components/action-sheet/action-sheet.css +5 -2
  122. package/es/components/action-sheet/action-sheet.d.ts +1 -0
  123. package/es/components/action-sheet/action-sheet.js +2 -1
  124. package/es/components/check-list/check-list.css +1 -1
  125. package/es/components/ellipsis/ellipsis.js +1 -0
  126. package/es/components/floating-panel/floating-panel.js +2 -2
  127. package/es/components/form/context.d.ts +1 -1
  128. package/es/components/form/form-item.d.ts +1 -1
  129. package/es/components/form/form-item.js +3 -0
  130. package/es/components/image/test/image.test.js +54 -8
  131. package/es/components/image-viewer/image-viewer.js +4 -2
  132. package/es/components/index-bar/index-bar.css +1 -1
  133. package/es/components/page-indicator/page-indicator.css +1 -1
  134. package/es/components/picker-view/wheel.js +2 -0
  135. package/es/components/rate/rate.css +4 -0
  136. package/es/components/rate/rate.js +36 -13
  137. package/es/components/result-page/index.d.ts +7 -0
  138. package/es/components/result-page/index.js +7 -0
  139. package/es/components/result-page/result-page-card.d.ts +6 -0
  140. package/es/components/result-page/result-page-card.js +9 -0
  141. package/es/components/result-page/result-page.css +113 -0
  142. package/es/components/result-page/result-page.d.ts +23 -0
  143. package/es/components/result-page/result-page.js +83 -0
  144. package/es/components/selector/selector.css +9 -0
  145. package/es/components/selector/selector.d.ts +3 -2
  146. package/es/components/selector/selector.js +1 -3
  147. package/es/components/swipe-action/swipe-action.d.ts +2 -0
  148. package/es/components/swipe-action/swipe-action.js +34 -6
  149. package/es/components/swiper/swiper.js +15 -1
  150. package/es/components/tab-bar/tab-bar.css +2 -2
  151. package/es/index.d.ts +1 -0
  152. package/es/index.js +1 -0
  153. package/es/locales/id-ID.js +13 -0
  154. package/es/utils/use-resize-effect.js +3 -1
  155. package/package.json +6 -6
  156. package/umd/antd-mobile.js +1 -1
@@ -1,14 +1,9 @@
1
- import { __awaiter } from "tslib";
2
1
  import React from 'react';
3
- import { fireEvent, render, testA11y } from 'testing';
2
+ import { fireEvent, render, act } from 'testing';
4
3
  import Image from '../index';
4
+ const classPrefix = `adm-image`;
5
5
  const demoSrc = 'https://images.unsplash.com/photo-1567945716310-4745a6b7844b?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=300&q=60';
6
- describe('image', () => {
7
- test('a11y', () => __awaiter(void 0, void 0, void 0, function* () {
8
- yield testA11y(React.createElement(Image, {
9
- src: demoSrc
10
- }));
11
- }));
6
+ describe('Image', () => {
12
7
  test('onContainerClick can work', () => {
13
8
  const onContainerClick = jest.fn();
14
9
  const {
@@ -21,4 +16,55 @@ describe('image', () => {
21
16
  fireEvent.click(getByTestId('img'));
22
17
  expect(onContainerClick).toBeCalledTimes(1);
23
18
  });
19
+ test('load successfully', () => {
20
+ render(React.createElement(Image, {
21
+ src: demoSrc
22
+ }));
23
+ const img = document.querySelectorAll(`.${classPrefix}-img`)[0];
24
+ fireEvent.load(img);
25
+ expect(img).toHaveAttribute('src', demoSrc);
26
+ });
27
+ test('load failed', () => {
28
+ render(React.createElement(Image, {
29
+ src: '404'
30
+ }));
31
+ const img = document.querySelectorAll(`.${classPrefix}-img`)[0];
32
+ fireEvent.error(img);
33
+ expect(img).not.toBeInTheDocument();
34
+ expect(document.querySelectorAll(`.${classPrefix}-tip`)[0]).toBeInTheDocument();
35
+ });
36
+ test('lazy load should be work', () => {
37
+ // mock useInViewport
38
+ // https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useInViewport/__tests__/index.test.ts
39
+ const mockIntersectionObserver = jest.fn().mockReturnValue({
40
+ observe: () => null,
41
+ disconnect: () => null
42
+ });
43
+ window.IntersectionObserver = mockIntersectionObserver;
44
+ render(React.createElement(Image, {
45
+ src: demoSrc,
46
+ lazy: true
47
+ }));
48
+ const img = document.querySelectorAll(`.${classPrefix}-img`)[0];
49
+ expect(img).not.toHaveAttribute('src');
50
+ const calls = mockIntersectionObserver.mock.calls;
51
+ const [onChange] = calls[calls.length - 1];
52
+ act(() => {
53
+ onChange([{
54
+ isIntersecting: true
55
+ }]);
56
+ });
57
+ expect(img).toHaveAttribute('src', demoSrc);
58
+ });
59
+ test('renders with width and height', () => {
60
+ const {
61
+ getByTestId
62
+ } = render(React.createElement(Image, {
63
+ src: demoSrc,
64
+ width: 100,
65
+ height: 100,
66
+ "data-testid": 'image'
67
+ }));
68
+ expect(getByTestId('image')).toHaveStyle('--width: 100px;--height: 100px');
69
+ });
24
70
  });
@@ -19,7 +19,8 @@ export const ImageViewer = p => {
19
19
  visible: props.visible,
20
20
  disableBodyScroll: false,
21
21
  opacity: 'thick',
22
- afterClose: props.afterClose
22
+ afterClose: props.afterClose,
23
+ destroyOnClose: true
23
24
  }, React.createElement("div", {
24
25
  className: `${classPrefix}-content`
25
26
  }, props.image && React.createElement(Slide, {
@@ -64,7 +65,8 @@ export const MultiImageViewer = forwardRef((p, ref) => {
64
65
  visible: props.visible,
65
66
  disableBodyScroll: false,
66
67
  opacity: 'thick',
67
- afterClose: props.afterClose
68
+ afterClose: props.afterClose,
69
+ destroyOnClose: true
68
70
  }, React.createElement("div", {
69
71
  className: `${classPrefix}-content`
70
72
  }, props.images && React.createElement(Slides, {
@@ -45,7 +45,7 @@
45
45
  .adm-index-bar-sidebar-bubble {
46
46
  position: absolute;
47
47
  top: 50%;
48
- right: 84px;
48
+ right: 120px;
49
49
  width: 94px;
50
50
  height: 94px;
51
51
  color: var(--adm-color-white);
@@ -1,7 +1,7 @@
1
1
  .adm-page-indicator {
2
2
  display: flex;
3
3
  width: auto;
4
- --dot-color: rgba(0, 0, 0, 0.2);
4
+ --dot-color: #dddddd;
5
5
  --active-dot-color: var(--adm-color-primary);
6
6
  --dot-size: 6px;
7
7
  --active-dot-size: 26px;
@@ -186,6 +186,8 @@ export const Wheel = memo(props => {
186
186
  if (prev.index !== next.index) return false;
187
187
  if (prev.value !== next.value) return false;
188
188
  if (prev.onSelect !== next.onSelect) return false;
189
+ if (prev.renderLabel !== next.renderLabel) return false;
190
+ if (prev.mouseWheel !== next.mouseWheel) return false;
189
191
 
190
192
  if (!isEqual(prev.column, next.column)) {
191
193
  return false;
@@ -3,6 +3,9 @@
3
3
  --active-color: #ffd21e;
4
4
  --inactive-color: var(--adm-color-border);
5
5
  display: inline-flex;
6
+ touch-action: pan-y;
7
+ -webkit-user-select: none;
8
+ user-select: none;
6
9
  }
7
10
 
8
11
  .adm-rate-box {
@@ -18,6 +21,7 @@
18
21
  overflow: hidden;
19
22
  cursor: pointer;
20
23
  box-sizing: border-box;
24
+ transition: all 0.3s;
21
25
  }
22
26
 
23
27
  .adm-rate-star-half {
@@ -1,9 +1,11 @@
1
- import React from 'react';
1
+ import React, { useRef } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import { withNativeProps } from '../../utils/native-props';
4
4
  import { mergeProps } from '../../utils/with-default-props';
5
5
  import { usePropsValue } from '../../utils/use-props-value';
6
6
  import { Star } from './star';
7
+ import { useDrag } from '@use-gesture/react';
8
+ import { bound } from '../../utils/bound';
7
9
  const classPrefix = `adm-rate`;
8
10
  const defaultProps = {
9
11
  count: 5,
@@ -16,6 +18,7 @@ const defaultProps = {
16
18
  export const Rate = p => {
17
19
  const props = mergeProps(defaultProps, p);
18
20
  const [value, setValue] = usePropsValue(props);
21
+ const containerRef = useRef(null);
19
22
  const starList = Array(props.count).fill(null);
20
23
 
21
24
  function renderStar(v, half) {
@@ -25,26 +28,46 @@ export const Rate = p => {
25
28
  [`${classPrefix}-star-half`]: half,
26
29
  [`${classPrefix}-star-readonly`]: props.readOnly
27
30
  }),
28
- onClick: () => {
29
- if (props.readOnly) return;
30
-
31
- if (props.allowClear && value === v) {
32
- setValue(0);
33
- } else {
34
- setValue(v);
35
- }
36
- },
37
31
  role: 'radio',
38
32
  "aria-checked": value >= v,
39
33
  "aria-label": '' + v
40
34
  }, props.character);
41
35
  }
42
36
 
43
- return withNativeProps(props, React.createElement("div", {
37
+ const bind = useDrag(state => {
38
+ if (props.readOnly) return;
39
+ const {
40
+ xy: [clientX],
41
+ tap
42
+ } = state;
43
+ const container = containerRef.current;
44
+ if (!container) return;
45
+ const rect = container.getBoundingClientRect();
46
+ const rawValue = (clientX - rect.left) / rect.width * props.count;
47
+ const ceiledValue = props.allowHalf ? Math.ceil(rawValue * 2) / 2 : Math.ceil(rawValue);
48
+ const boundValue = bound(ceiledValue, 0, props.count);
49
+
50
+ if (tap) {
51
+ if (props.allowClear && boundValue === value) {
52
+ setValue(0);
53
+ return;
54
+ }
55
+ }
56
+
57
+ setValue(boundValue);
58
+ }, {
59
+ axis: 'x',
60
+ pointer: {
61
+ touch: true
62
+ },
63
+ filterTaps: true
64
+ });
65
+ return withNativeProps(props, React.createElement("div", Object.assign({
44
66
  className: classPrefix,
45
67
  role: 'radiogroup',
46
- "aria-readonly": props.readOnly
47
- }, starList.map((_, i) => React.createElement("div", {
68
+ "aria-readonly": props.readOnly,
69
+ ref: containerRef
70
+ }, bind()), starList.map((_, i) => React.createElement("div", {
48
71
  key: i,
49
72
  className: classNames(`${classPrefix}-box`)
50
73
  }, props.allowHalf && renderStar(i + 0.5, true), renderStar(i + 1, false)))));
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import './result-page.less';
3
+ export type { ResultPageProps } from './result-page';
4
+ declare const _default: import("react").FC<import("./result-page").ResultPageProps> & {
5
+ Card: import("react").FC<import("./result-page-card").ResultPageCardProps>;
6
+ };
7
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import "./result-page.css";
2
+ import { ResultPage } from './result-page';
3
+ import { attachPropertiesToComponent } from '../../utils/attach-properties-to-component';
4
+ import { ResultPageCard } from './result-page-card';
5
+ export default attachPropertiesToComponent(ResultPage, {
6
+ Card: ResultPageCard
7
+ });
@@ -0,0 +1,6 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { NativeProps } from '../../utils/native-props';
3
+ export declare type ResultPageCardProps = {
4
+ children?: ReactNode;
5
+ } & NativeProps;
6
+ export declare const ResultPageCard: FC<ResultPageCardProps>;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { withNativeProps } from '../../utils/native-props';
3
+ import classNames from 'classnames';
4
+ const classPrefix = `adm-result-page-card`;
5
+ export const ResultPageCard = props => {
6
+ return withNativeProps(props, React.createElement('div', {
7
+ className: classNames(`${classPrefix}`)
8
+ }, props.children));
9
+ };
@@ -0,0 +1,130 @@
1
+ .adm-result-page {
2
+ --background-color: var(--adm-color-primary);
3
+ position: relative;
4
+ background-color: var(--adm-color-box);
5
+ min-height: 100vh;
6
+ width: 100%;
7
+ }
8
+
9
+ .adm-result-page-header {
10
+ display: flex;
11
+ align-items: center;
12
+ flex-direction: column;
13
+ background-color: transparent;
14
+ position: relative;
15
+ padding: 40px;
16
+ padding-bottom: 200px;
17
+ z-index: 1;
18
+ overflow: hidden;
19
+ }
20
+
21
+ .adm-result-page-icon {
22
+ color: var(--adm-color-background);
23
+ box-sizing: border-box;
24
+ padding: 4px;
25
+ margin-bottom: 16px;
26
+ }
27
+
28
+ .adm-result-page-icon .antd-mobile-icon {
29
+ font-size: 64px;
30
+ }
31
+
32
+ .adm-result-page-title {
33
+ font-size: var(--adm-font-size-10);
34
+ color: var(--adm-color-background);
35
+ line-height: 1.4;
36
+ text-align: center;
37
+ }
38
+
39
+ .adm-result-page-description {
40
+ margin-top: 16px;
41
+ margin-bottom: 48px;
42
+ font-size: var(--adm-font-size-6);
43
+ color: rgba(255, 255, 255, 0.6);
44
+ line-height: 1.4;
45
+ text-align: center;
46
+ }
47
+
48
+ .adm-result-page-details {
49
+ width: 100%;
50
+ }
51
+
52
+ .adm-result-page-detail {
53
+ width: 100%;
54
+ display: flex;
55
+ flex-direction: row;
56
+ justify-content: space-between;
57
+ margin-bottom: 10px;
58
+ color: var(--adm-color-background);
59
+ font-size: var(--adm-font-size-6);
60
+ }
61
+
62
+ .adm-result-page-detail-bold {
63
+ font-weight: 600;
64
+ }
65
+
66
+ .adm-result-page-collapse {
67
+ opacity: 0.6;
68
+ width: 20px;
69
+ height: 20px;
70
+ margin: auto;
71
+ margin-bottom: 10px;
72
+ border-top: 4px solid var(--adm-color-background);
73
+ border-right: 4px solid var(--adm-color-background);
74
+ transform: rotate(135deg);
75
+ }
76
+
77
+ .adm-result-page-collapse-active {
78
+ transform: rotate(-45deg);
79
+ }
80
+
81
+ .adm-result-page-bgWrapper {
82
+ position: relative;
83
+ align-self: flex-start;
84
+ top: 108px;
85
+ }
86
+
87
+ .adm-result-page-bg {
88
+ --width: 440vw;
89
+ position: absolute;
90
+ height: var(--width);
91
+ width: var(--width);
92
+ left: calc((var(--width) - 100vw) * -1 / 2 - 40px);
93
+ top: calc(var(--width) * -1 + 1vw);
94
+ border-radius: 50%;
95
+ background-color: var(--background-color);
96
+ z-index: -1;
97
+ }
98
+
99
+ .adm-result-page-content {
100
+ position: relative;
101
+ padding: 24px;
102
+ top: -208px;
103
+ z-index: 2;
104
+ }
105
+
106
+ .adm-result-page-footer {
107
+ position: fixed;
108
+ bottom: 0;
109
+ width: 100%;
110
+ padding: 24px;
111
+ padding-bottom: 48px;
112
+ display: flex;
113
+ justify-content: center;
114
+ background-color: var(--adm-color-box);
115
+ z-index: 3;
116
+ }
117
+
118
+ .adm-result-page-footer-btn {
119
+ flex: 1;
120
+ max-width: calc((100vw - 72px) / 2);
121
+ }
122
+
123
+ .adm-result-page-footer-space {
124
+ width: 24px;
125
+ }
126
+
127
+ .adm-result-page-card {
128
+ border-radius: 16px;
129
+ background-color: var(--adm-color-background);
130
+ }
@@ -0,0 +1,23 @@
1
+ import React, { FC, ReactNode } from 'react';
2
+ import { NativeProps } from '../../utils/native-props';
3
+ interface ResultPageDetail {
4
+ label: ReactNode;
5
+ value: ReactNode;
6
+ bold?: boolean;
7
+ }
8
+ declare type ResultPageDetails = ResultPageDetail[];
9
+ declare type OnClick = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void | Promise<void> | unknown;
10
+ export declare type ResultPageProps = {
11
+ status?: 'success' | 'error' | 'info' | 'waiting' | 'warning';
12
+ title: ReactNode;
13
+ description?: ReactNode;
14
+ icon?: ReactNode;
15
+ details?: ResultPageDetails;
16
+ children?: ReactNode;
17
+ primaryButtonText?: ReactNode;
18
+ secondaryButtonText?: ReactNode;
19
+ onPrimaryButtonClick?: OnClick;
20
+ onSecondaryButtonClick?: OnClick;
21
+ } & NativeProps<'--background-color'>;
22
+ export declare const ResultPage: FC<ResultPageProps>;
23
+ export {};
@@ -0,0 +1,83 @@
1
+ import React, { useState } from 'react';
2
+ import { CheckCircleFill, CloseCircleFill, InformationCircleFill, ClockCircleFill, ExclamationCircleFill } from 'antd-mobile-icons';
3
+ import classNames from 'classnames';
4
+ import { withNativeProps } from '../../utils/native-props';
5
+ import { mergeProps } from '../../utils/with-default-props';
6
+ import { isNodeWithContent } from '../../utils/is-node-with-content';
7
+ import Button from '../button';
8
+ const classPrefix = `adm-result-page`;
9
+ const iconRecord = {
10
+ success: CheckCircleFill,
11
+ error: CloseCircleFill,
12
+ info: InformationCircleFill,
13
+ waiting: ClockCircleFill,
14
+ warning: ExclamationCircleFill
15
+ };
16
+ const defaultProps = {
17
+ status: 'info',
18
+ details: []
19
+ };
20
+ export const ResultPage = p => {
21
+ const props = mergeProps(defaultProps, p);
22
+ const {
23
+ status,
24
+ title,
25
+ description,
26
+ details,
27
+ icon,
28
+ primaryButtonText,
29
+ secondaryButtonText,
30
+ onPrimaryButtonClick,
31
+ onSecondaryButtonClick
32
+ } = props;
33
+ const resultIcon = icon || React.createElement(iconRecord[status]);
34
+ const [collapse, setCollapse] = useState(true);
35
+ const showSecondaryButton = isNodeWithContent(secondaryButtonText);
36
+ const showPrimaryButton = isNodeWithContent(primaryButtonText);
37
+ return withNativeProps(props, React.createElement("div", {
38
+ className: classPrefix
39
+ }, React.createElement("div", {
40
+ className: `${classPrefix}-header`
41
+ }, React.createElement("div", {
42
+ className: `${classPrefix}-icon`
43
+ }, resultIcon), React.createElement("div", {
44
+ className: `${classPrefix}-title`
45
+ }, title), isNodeWithContent(description) ? React.createElement("div", {
46
+ className: `${classPrefix}-description`
47
+ }, description) : null, details.length ? React.createElement("div", {
48
+ className: `${classPrefix}-details`
49
+ }, (collapse ? details.slice(0, 3) : details).map((detail, index) => {
50
+ return React.createElement("div", {
51
+ className: classNames(`${classPrefix}-detail`, detail.bold && `${classPrefix}-detail-bold`),
52
+ key: index
53
+ }, React.createElement("span", null, detail.label), React.createElement("span", null, detail.value));
54
+ }), details.length > 3 && React.createElement("div", {
55
+ onClick: () => setCollapse(prev => !prev)
56
+ }, React.createElement("div", {
57
+ className: classNames(`${classPrefix}-collapse`, !collapse && `${classPrefix}-collapse-active`)
58
+ }))) : null, React.createElement("div", {
59
+ className: `${classPrefix}-bgWrapper`
60
+ }, React.createElement("div", {
61
+ className: `${classPrefix}-bg`
62
+ }))), React.createElement("div", {
63
+ className: `${classPrefix}-content`
64
+ }, props.children), React.createElement("div", {
65
+ className: `${classPrefix}-footer`
66
+ }, showSecondaryButton && React.createElement(Button, {
67
+ block: true,
68
+ color: 'default',
69
+ fill: 'solid',
70
+ size: 'large',
71
+ onClick: onSecondaryButtonClick,
72
+ className: `${classPrefix}-footer-btn`
73
+ }, secondaryButtonText), showPrimaryButton && showSecondaryButton && React.createElement("div", {
74
+ className: `${classPrefix}-footer-space`
75
+ }), showPrimaryButton && React.createElement(Button, {
76
+ block: true,
77
+ color: 'primary',
78
+ fill: 'solid',
79
+ size: 'large',
80
+ onClick: onPrimaryButtonClick,
81
+ className: `${classPrefix}-footer-btn`
82
+ }, primaryButtonText))));
83
+ };
@@ -7,6 +7,10 @@
7
7
  --checked-border: none;
8
8
  --border-radius: 4px;
9
9
  --padding: 16px 32px;
10
+ --gap: 16px;
11
+ ---gap: var(--gap);
12
+ ---gap-horizontal: var(--gap-horizontal, var(--gap));
13
+ ---gap-vertical: var(--gap-vertical, var(--gap));
10
14
  overflow: hidden;
11
15
  font-size: var(--adm-font-size-7);
12
16
  line-height: 1.4;
@@ -16,6 +20,12 @@
16
20
  --gap: 24px;
17
21
  }
18
22
 
23
+ .adm-selector .adm-grid {
24
+ --gap: var(---gap);
25
+ --gap-horizontal: var(---gap-horizontal);
26
+ --gap-vertical: var(---gap-vertical);
27
+ }
28
+
19
29
  .adm-selector-item {
20
30
  padding: var(--padding);
21
31
  position: relative;
@@ -1,5 +1,6 @@
1
1
  import React, { ReactNode } from 'react';
2
2
  import { NativeProps } from '../../utils/native-props';
3
+ import { GridProps } from '../grid';
3
4
  declare type SelectorValue = string | number;
4
5
  export interface SelectorOption<V> {
5
6
  label: ReactNode;
@@ -9,7 +10,7 @@ export interface SelectorOption<V> {
9
10
  }
10
11
  export declare type SelectorProps<V> = {
11
12
  options: SelectorOption<V>[];
12
- columns?: number;
13
+ columns?: GridProps['columns'];
13
14
  multiple?: boolean;
14
15
  disabled?: boolean;
15
16
  defaultValue?: V[];
@@ -18,6 +19,6 @@ export declare type SelectorProps<V> = {
18
19
  items: SelectorOption<V>[];
19
20
  }) => void;
20
21
  showCheckMark?: boolean;
21
- } & NativeProps<'--color' | '--checked-color' | '--text-color' | '--checked-text-color' | '--border' | '--checked-border' | '--border-radius' | '--padding'>;
22
+ } & NativeProps<'--color' | '--checked-color' | '--text-color' | '--checked-text-color' | '--border' | '--checked-border' | '--border-radius' | '--padding' | '--gap' | '--gap-vertical' | '--gap-horizontal'>;
22
23
  export declare const Selector: <V extends SelectorValue>(p: SelectorProps<V>) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
23
24
  export {};
@@ -4,7 +4,6 @@ import { withNativeProps } from '../../utils/native-props';
4
4
  import { mergeProps } from '../../utils/with-default-props';
5
5
  import Space from '../space';
6
6
  import Grid from '../grid';
7
- import { convertPx } from '../../utils/convert-px';
8
7
  import { usePropsValue } from '../../utils/use-props-value';
9
8
  import { CheckMark } from './check-mark';
10
9
  const classPrefix = `adm-selector`;
@@ -65,7 +64,6 @@ export const Selector = p => {
65
64
  }, !props.columns && React.createElement(Space, {
66
65
  wrap: true
67
66
  }, items), props.columns && React.createElement(Grid, {
68
- columns: props.columns,
69
- gap: convertPx(8)
67
+ columns: props.columns
70
68
  }, items)));
71
69
  };
@@ -20,6 +20,7 @@ export declare type SwipeActionProps = {
20
20
  closeOnAction?: boolean;
21
21
  children: ReactNode;
22
22
  stopPropagation?: PropagationEvent[];
23
+ onActionsReveal?: (side: 'left' | 'right') => void;
23
24
  } & NativeProps<'--background'>;
24
25
  export declare const SwipeAction: React.ForwardRefExoticComponent<{
25
26
  rightActions?: Action[] | undefined;
@@ -29,6 +30,7 @@ export declare const SwipeAction: React.ForwardRefExoticComponent<{
29
30
  closeOnAction?: boolean | undefined;
30
31
  children: ReactNode;
31
32
  stopPropagation?: "click"[] | undefined;
33
+ onActionsReveal?: ((side: 'left' | 'right') => void) | undefined;
32
34
  } & {
33
35
  className?: string | undefined;
34
36
  style?: (React.CSSProperties & Partial<Record<"--background", string>>) | undefined;
@@ -44,8 +44,26 @@ export const SwipeAction = forwardRef((p, ref) => {
44
44
  }
45
45
  }), []);
46
46
  const draggingRef = useRef(false);
47
+ const dragCancelRef = useRef(null);
48
+
49
+ function forceCancelDrag() {
50
+ var _a;
51
+
52
+ (_a = dragCancelRef.current) === null || _a === void 0 ? void 0 : _a.call(dragCancelRef);
53
+ draggingRef.current = false;
54
+ }
55
+
47
56
  const bind = useDrag(state => {
48
- draggingRef.current = true;
57
+ var _a;
58
+
59
+ dragCancelRef.current = state.cancel;
60
+ if (!state.intentional) return;
61
+
62
+ if (state.down) {
63
+ draggingRef.current = true;
64
+ }
65
+
66
+ if (!draggingRef.current) return;
49
67
  const [offsetX] = state.offset;
50
68
 
51
69
  if (state.last) {
@@ -61,9 +79,15 @@ export const SwipeAction = forwardRef((p, ref) => {
61
79
  position = 0;
62
80
  }
63
81
 
82
+ const targetX = nearest([-rightWidth, 0, leftWidth], position);
64
83
  api.start({
65
- x: nearest([-rightWidth, 0, leftWidth], position)
84
+ x: targetX
66
85
  });
86
+
87
+ if (targetX !== 0) {
88
+ (_a = p.onActionsReveal) === null || _a === void 0 ? void 0 : _a.call(p, targetX > 0 ? 'left' : 'right');
89
+ }
90
+
67
91
  window.setTimeout(() => {
68
92
  draggingRef.current = false;
69
93
  });
@@ -88,17 +112,21 @@ export const SwipeAction = forwardRef((p, ref) => {
88
112
  preventScroll: true,
89
113
  pointer: {
90
114
  touch: true
91
- }
115
+ },
116
+ triggerAllEvents: true
92
117
  });
93
118
 
94
119
  function close() {
95
120
  api.start({
96
121
  x: 0
97
122
  });
123
+ forceCancelDrag();
98
124
  }
99
125
 
100
126
  useImperativeHandle(ref, () => ({
101
127
  show: (side = 'right') => {
128
+ var _a;
129
+
102
130
  if (side === 'right') {
103
131
  api.start({
104
132
  x: -getRightWidth()
@@ -108,6 +136,8 @@ export const SwipeAction = forwardRef((p, ref) => {
108
136
  x: getLeftWidth()
109
137
  });
110
138
  }
139
+
140
+ (_a = p.onActionsReveal) === null || _a === void 0 ? void 0 : _a.call(p, side);
111
141
  },
112
142
  close
113
143
  }));
@@ -179,9 +209,7 @@ export const SwipeAction = forwardRef((p, ref) => {
179
209
  if (x.goal !== 0) {
180
210
  e.preventDefault();
181
211
  e.stopPropagation();
182
- api.start({
183
- x: 0
184
- });
212
+ close();
185
213
  }
186
214
  }
187
215
  }, React.createElement(animated.div, {