@varlet/ui 2.14.2 → 2.15.0-alpha.1692990022445

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 (91) hide show
  1. package/es/action-sheet/props.mjs +2 -7
  2. package/es/app-bar/props.mjs +8 -29
  3. package/es/avatar/Avatar.mjs +6 -6
  4. package/es/avatar/props.mjs +8 -36
  5. package/es/avatar-group/props.mjs +2 -7
  6. package/es/back-top/props.mjs +3 -9
  7. package/es/badge/props.mjs +7 -27
  8. package/es/bottom-navigation/props.mjs +7 -22
  9. package/es/bottom-navigation-item/props.mjs +3 -9
  10. package/es/breadcrumb/props.mjs +1 -3
  11. package/es/button/props.mjs +14 -57
  12. package/es/button-group/props.mjs +6 -25
  13. package/es/cell/props.mjs +10 -32
  14. package/es/checkbox/Checkbox.mjs +23 -19
  15. package/es/checkbox/props.mjs +10 -22
  16. package/es/checkbox-group/props.mjs +4 -12
  17. package/es/chip/props.mjs +7 -28
  18. package/es/col/props.mjs +9 -35
  19. package/es/collapse/props.mjs +2 -7
  20. package/es/collapse-item/CollapseItem.mjs +15 -5
  21. package/es/collapse-item/props.mjs +3 -10
  22. package/es/counter/props.mjs +14 -48
  23. package/es/date-picker/props.mjs +10 -35
  24. package/es/dialog/props.mjs +13 -42
  25. package/es/divider/props.mjs +5 -18
  26. package/es/drag/Drag.mjs +20 -27
  27. package/es/drag/props.mjs +2 -7
  28. package/es/ellipsis/props.mjs +2 -10
  29. package/es/fab/props.mjs +14 -51
  30. package/es/field-decorator/props.mjs +13 -46
  31. package/es/form/props.mjs +3 -15
  32. package/es/icon/props.mjs +4 -12
  33. package/es/image/props.mjs +9 -33
  34. package/es/image-preview/ImagePreview.mjs +49 -66
  35. package/es/image-preview/props.mjs +4 -15
  36. package/es/index-anchor/props.mjs +1 -3
  37. package/es/index-bar/props.mjs +4 -15
  38. package/es/index.bundle.mjs +1 -1
  39. package/es/index.mjs +1 -1
  40. package/es/input/Input.mjs +12 -29
  41. package/es/input/props.mjs +9 -33
  42. package/es/link/props.mjs +9 -33
  43. package/es/list/props.mjs +6 -21
  44. package/es/loading/props.mjs +6 -23
  45. package/es/loading-bar/props.mjs +5 -16
  46. package/es/menu/props.mjs +9 -37
  47. package/es/option/Option.mjs +18 -4
  48. package/es/overlay/props.mjs +2 -7
  49. package/es/pagination/props.mjs +4 -14
  50. package/es/paper/props.mjs +6 -21
  51. package/es/picker/props.mjs +7 -23
  52. package/es/popup/props.mjs +7 -26
  53. package/es/progress/props.mjs +8 -31
  54. package/es/pull-refresh/props.mjs +7 -29
  55. package/es/radio/Radio.mjs +5 -11
  56. package/es/radio/props.mjs +6 -20
  57. package/es/radio-group/props.mjs +2 -8
  58. package/es/rate/Rate.mjs +12 -9
  59. package/es/rate/props.mjs +11 -37
  60. package/es/result/props.mjs +4 -14
  61. package/es/row/props.mjs +2 -10
  62. package/es/select/props.mjs +5 -20
  63. package/es/skeleton/props.mjs +7 -25
  64. package/es/slider/props.mjs +13 -46
  65. package/es/snackbar/props.mjs +8 -36
  66. package/es/space/Space.mjs +3 -3
  67. package/es/space/props.mjs +4 -17
  68. package/es/step/props.mjs +2 -6
  69. package/es/steps/props.mjs +3 -11
  70. package/es/sticky/props.mjs +2 -8
  71. package/es/swipe/Swipe.mjs +51 -65
  72. package/es/swipe/props.mjs +3 -10
  73. package/es/switch/Switch.mjs +11 -7
  74. package/es/switch/props.mjs +8 -27
  75. package/es/tab/props.mjs +2 -7
  76. package/es/tab-item/props.mjs +1 -3
  77. package/es/tabs/props.mjs +14 -48
  78. package/es/tabs-items/props.mjs +1 -4
  79. package/es/time-picker/props.mjs +9 -31
  80. package/es/tooltip/props.mjs +11 -45
  81. package/es/uploader/props.mjs +7 -25
  82. package/es/utils/{jest.mjs → test.mjs} +19 -14
  83. package/es/varlet.esm.js +6687 -7777
  84. package/es/watermark/props.mjs +3 -10
  85. package/highlight/web-types.en-US.json +17 -4
  86. package/highlight/web-types.zh-CN.json +15 -2
  87. package/lib/varlet.cjs.js +710 -1742
  88. package/package.json +13 -12
  89. package/types/checkbox.d.ts +3 -0
  90. package/types/col.d.ts +7 -5
  91. package/umd/varlet.js +4 -4
package/es/fab/props.mjs CHANGED
@@ -1,19 +1,6 @@
1
1
  import { defineListenerProp } from '../utils/components.mjs';
2
- import { typeValidator } from '../button/props.mjs';
3
- export function positionValidator(position) {
4
- return ['left-top', 'right-top', 'left-bottom', 'right-bottom'].includes(position);
5
- }
6
- export function directionValidator(direction) {
7
- return ['top', 'right', 'bottom', 'left'].includes(direction);
8
- }
9
- export function triggerValidator(trigger) {
10
- return ['click', 'hover'].includes(trigger);
11
- }
12
2
  export var props = {
13
- active: {
14
- type: Boolean,
15
- default: false
16
- },
3
+ active: Boolean,
17
4
  show: {
18
5
  type: Boolean,
19
6
  default: true
@@ -24,31 +11,22 @@ export var props = {
24
11
  },
25
12
  type: {
26
13
  type: String,
27
- default: 'primary',
28
- validator: typeValidator
14
+ default: 'primary'
29
15
  },
30
16
  position: {
31
17
  type: String,
32
- default: 'right-bottom',
33
- validator: positionValidator
18
+ default: 'right-bottom'
34
19
  },
35
20
  direction: {
36
21
  type: String,
37
- default: 'top',
38
- validator: directionValidator
22
+ default: 'top'
39
23
  },
40
24
  trigger: {
41
25
  type: String,
42
- default: 'click',
43
- validator: triggerValidator
44
- },
45
- disabled: {
46
- type: Boolean,
47
- default: false
48
- },
49
- color: {
50
- type: String
26
+ default: 'click'
51
27
  },
28
+ disabled: Boolean,
29
+ color: String,
52
30
  inactiveIcon: {
53
31
  type: String,
54
32
  default: 'plus'
@@ -57,12 +35,8 @@ export var props = {
57
35
  type: String,
58
36
  default: 'window-close'
59
37
  },
60
- inactiveIconSize: {
61
- type: [Number, String]
62
- },
63
- activeIconSize: {
64
- type: [Number, String]
65
- },
38
+ inactiveIconSize: [Number, String],
39
+ activeIconSize: [Number, String],
66
40
  fixed: {
67
41
  type: Boolean,
68
42
  default: true
@@ -71,26 +45,15 @@ export var props = {
71
45
  type: [Number, String],
72
46
  default: 90
73
47
  },
74
- top: {
75
- type: [Number, String]
76
- },
77
- bottom: {
78
- type: [Number, String]
79
- },
80
- left: {
81
- type: [Number, String]
82
- },
83
- right: {
84
- type: [Number, String]
85
- },
48
+ top: [Number, String],
49
+ bottom: [Number, String],
50
+ left: [Number, String],
51
+ right: [Number, String],
86
52
  elevation: {
87
53
  type: [Boolean, Number, String],
88
54
  default: true
89
55
  },
90
- safeArea: {
91
- type: Boolean,
92
- default: false
93
- },
56
+ safeArea: Boolean,
94
57
  teleport: {
95
58
  type: [String, Object, Boolean],
96
59
  default: 'body'
@@ -1,10 +1,4 @@
1
1
  import { defineListenerProp } from '../utils/components.mjs';
2
- export function sizeValidator(size) {
3
- return ['small', 'normal'].includes(size);
4
- }
5
- export function variantValidator(variant) {
6
- return ['outlined', 'standard'].includes(variant);
7
- }
8
2
  export var props = {
9
3
  value: {
10
4
  type: null,
@@ -14,22 +8,16 @@ export var props = {
14
8
  type: String,
15
9
  default: ''
16
10
  },
17
- isFocus: {
18
- type: Boolean
19
- },
11
+ isFocus: Boolean,
20
12
  size: {
21
13
  type: String,
22
- default: 'normal',
23
- validator: sizeValidator
14
+ default: 'normal'
24
15
  },
25
16
  variant: {
26
17
  type: String,
27
- default: 'standard',
28
- validator: variantValidator
29
- },
30
- placeholder: {
31
- type: String
18
+ default: 'standard'
32
19
  },
20
+ placeholder: String,
33
21
  line: {
34
22
  type: Boolean,
35
23
  default: true
@@ -38,36 +26,15 @@ export var props = {
38
26
  type: Boolean,
39
27
  default: true
40
28
  },
41
- textColor: {
42
- type: String
43
- },
44
- focusColor: {
45
- type: String
46
- },
47
- blurColor: {
48
- type: String
49
- },
50
- errorMessage: {
51
- type: String
52
- },
53
- formDisabled: {
54
- type: Boolean
55
- },
56
- disabled: {
57
- type: Boolean,
58
- default: false
59
- },
60
- clearable: {
61
- type: Boolean,
62
- default: false
63
- },
64
- cursor: {
65
- type: String
66
- },
67
- composing: {
68
- type: Boolean,
69
- default: false
70
- },
29
+ textColor: String,
30
+ focusColor: String,
31
+ blurColor: String,
32
+ errorMessage: String,
33
+ formDisabled: Boolean,
34
+ disabled: Boolean,
35
+ clearable: Boolean,
36
+ cursor: String,
37
+ composing: Boolean,
71
38
  onClick: defineListenerProp(),
72
39
  onClear: defineListenerProp()
73
40
  };
package/es/form/props.mjs CHANGED
@@ -1,19 +1,7 @@
1
- function scrollToErrorValidator(status) {
2
- return ['start', 'end'].includes(status);
3
- }
4
1
  export var props = {
5
- disabled: {
6
- type: Boolean,
7
- default: false
8
- },
9
- readonly: {
10
- type: Boolean,
11
- default: false
12
- },
13
- scrollToError: {
14
- type: String,
15
- validator: scrollToErrorValidator
16
- },
2
+ disabled: Boolean,
3
+ readonly: Boolean,
4
+ scrollToError: String,
17
5
  scrollToErrorOffsetY: {
18
6
  type: [String, Number],
19
7
  default: 0
package/es/icon/props.mjs CHANGED
@@ -1,14 +1,8 @@
1
1
  import { defineListenerProp } from '../utils/components.mjs';
2
2
  export var props = {
3
- name: {
4
- type: String
5
- },
6
- size: {
7
- type: [Number, String]
8
- },
9
- color: {
10
- type: String
11
- },
3
+ name: String,
4
+ size: [Number, String],
5
+ color: String,
12
6
  namespace: {
13
7
  type: String,
14
8
  default: 'var-icon'
@@ -17,8 +11,6 @@ export var props = {
17
11
  type: [Number, String],
18
12
  default: 0
19
13
  },
20
- animationClass: {
21
- type: String
22
- },
14
+ animationClass: String,
23
15
  onClick: defineListenerProp()
24
16
  };
@@ -1,46 +1,22 @@
1
1
  import { defineListenerProp } from '../utils/components.mjs';
2
- function fitValidator(fit) {
3
- return ['fill', 'contain', 'cover', 'none', 'scale-down'].includes(fit);
4
- }
5
2
  export var props = {
6
- src: {
7
- type: String
8
- },
3
+ src: String,
9
4
  fit: {
10
5
  type: String,
11
- validator: fitValidator,
12
6
  default: 'fill'
13
7
  },
14
- alt: {
15
- type: String
16
- },
17
- title: {
18
- type: String
19
- },
20
- width: {
21
- type: [String, Number]
22
- },
23
- height: {
24
- type: [String, Number]
25
- },
8
+ alt: String,
9
+ title: String,
10
+ width: [String, Number],
11
+ height: [String, Number],
26
12
  radius: {
27
13
  type: [String, Number],
28
14
  default: 0
29
15
  },
30
- loading: {
31
- type: String
32
- },
33
- error: {
34
- type: String
35
- },
36
- lazy: {
37
- type: Boolean,
38
- default: false
39
- },
40
- ripple: {
41
- type: Boolean,
42
- default: false
43
- },
16
+ loading: String,
17
+ error: String,
18
+ lazy: Boolean,
19
+ ripple: Boolean,
44
20
  block: {
45
21
  type: Boolean,
46
22
  default: true
@@ -3,9 +3,9 @@ import VarSwipeItem from '../swipe-item/index.mjs';
3
3
  import VarIcon from '../icon/index.mjs';
4
4
  import VarPopup from '../popup/index.mjs';
5
5
  import { defineComponent, ref, computed, watch } from 'vue';
6
+ import { toNumber, clamp } from '@varlet/shared';
7
+ import { useEventListener, useTouch } from '@varlet/use';
6
8
  import { props } from './props.mjs';
7
- import { toNumber } from '@varlet/shared';
8
- import { useEventListener } from '@varlet/use';
9
9
  import { call, createNamespace } from '../utils/components.mjs';
10
10
  var {
11
11
  n,
@@ -121,6 +121,29 @@ var __sfc__ = defineComponent({
121
121
  props,
122
122
  setup(props) {
123
123
  var popupShow = ref(false);
124
+ var scale = ref(1);
125
+ var translateX = ref(0);
126
+ var translateY = ref(0);
127
+ var transitionTimingFunction = ref(undefined);
128
+ var transitionDuration = ref(undefined);
129
+ var canSwipe = ref(true);
130
+ var swipeRef = ref(null);
131
+ var {
132
+ moveX,
133
+ moveY,
134
+ distance,
135
+ startTime,
136
+ startTouch,
137
+ moveTouch,
138
+ endTouch
139
+ } = useTouch();
140
+ var targets = {
141
+ start: null,
142
+ prev: null
143
+ };
144
+ var closeRunner = null;
145
+ var longPressRunner = null;
146
+ var isLongPress = false;
124
147
  var initialIndex = computed(() => {
125
148
  // For compatibility with current, temporarily keep this computed method
126
149
  // Current will be replaced by initialIndex in the future
@@ -133,20 +156,8 @@ var __sfc__ = defineComponent({
133
156
  return toNumber(initialIndex);
134
157
  }
135
158
  var index = images.findIndex(image => image === current);
136
- return index >= 0 ? index : 0;
159
+ return Math.max(index, 0);
137
160
  });
138
- var scale = ref(1);
139
- var translateX = ref(0);
140
- var translateY = ref(0);
141
- var transitionTimingFunction = ref(undefined);
142
- var transitionDuration = ref(undefined);
143
- var canSwipe = ref(true);
144
- var swipeRef = ref(null);
145
- var startTouch = null;
146
- var prevTouch = null;
147
- var closeRunner = null;
148
- var longPressRunner = null;
149
- var isLongPress = false;
150
161
  var isPreventDefault = computed(() => {
151
162
  var {
152
163
  imagePreventDefault,
@@ -154,27 +165,10 @@ var __sfc__ = defineComponent({
154
165
  } = props;
155
166
  return show && imagePreventDefault;
156
167
  });
157
- var getDistance = (touch, target) => {
158
- var {
159
- clientX: touchX,
160
- clientY: touchY
161
- } = touch;
162
- var {
163
- clientX: targetX,
164
- clientY: targetY
165
- } = target;
166
- return Math.abs(Math.sqrt(Math.pow(targetX - touchX, 2) + Math.pow(targetY - touchY, 2)));
167
- };
168
- var createVarTouch = (touch, target) => ({
169
- clientX: touch.clientX,
170
- clientY: touch.clientY,
171
- timestamp: performance.now(),
172
- target
173
- });
174
168
  var zoomIn = () => {
175
169
  scale.value = toNumber(props.zoom);
176
170
  canSwipe.value = false;
177
- prevTouch = null;
171
+ targets.prev = null;
178
172
  window.setTimeout(() => {
179
173
  transitionTimingFunction.value = 'linear';
180
174
  transitionDuration.value = '0s';
@@ -185,28 +179,30 @@ var __sfc__ = defineComponent({
185
179
  translateX.value = 0;
186
180
  translateY.value = 0;
187
181
  canSwipe.value = true;
188
- prevTouch = null;
182
+ targets.prev = null;
189
183
  transitionTimingFunction.value = undefined;
190
184
  transitionDuration.value = undefined;
191
185
  };
192
- var isDoubleTouch = currentTouch => {
193
- if (!prevTouch) {
186
+ var isDoubleTouch = target => {
187
+ if (!targets.prev) {
194
188
  return false;
195
189
  }
196
- return getDistance(prevTouch, currentTouch) <= DISTANCE_OFFSET && currentTouch.timestamp - prevTouch.timestamp <= EVENT_DELAY && prevTouch.target === currentTouch.target;
190
+ return distance.value <= DISTANCE_OFFSET && performance.now() - startTime.value <= EVENT_DELAY && targets.prev === target;
197
191
  };
198
192
  var isTapTouch = target => {
199
- if (!target || !startTouch || !prevTouch) {
193
+ if (!target || !targets.start || !targets.prev) {
200
194
  return false;
201
195
  }
202
- return getDistance(startTouch, prevTouch) <= DISTANCE_OFFSET && performance.now() - prevTouch.timestamp < TAP_DELAY && (target === startTouch.target || target.parentNode === startTouch.target);
196
+ return distance.value <= DISTANCE_OFFSET && performance.now() - startTime.value < TAP_DELAY && (target === targets.start || target.parentNode === targets.start);
203
197
  };
204
198
  var handleTouchcancel = () => {
199
+ endTouch();
205
200
  window.clearTimeout(longPressRunner);
206
201
  isLongPress = false;
207
- startTouch = null;
202
+ targets.start = null;
208
203
  };
209
204
  var handleTouchend = event => {
205
+ endTouch();
210
206
  window.clearTimeout(longPressRunner);
211
207
 
212
208
  // avoid triggering tap event sometimes
@@ -217,26 +213,24 @@ var __sfc__ = defineComponent({
217
213
  var isTap = isTapTouch(event.target);
218
214
  closeRunner = window.setTimeout(() => {
219
215
  isTap && close();
220
- startTouch = null;
216
+ targets.start = null;
221
217
  }, EVENT_DELAY);
222
218
  };
223
219
  var handleTouchstart = (event, idx) => {
224
220
  window.clearTimeout(closeRunner);
225
221
  window.clearTimeout(longPressRunner);
226
- var currentTouch = createVarTouch(event.touches[0], event.currentTarget);
227
- startTouch = currentTouch;
222
+ var target = event.currentTarget;
223
+ targets.start = target;
228
224
  longPressRunner = window.setTimeout(() => {
229
- var {
230
- onLongPress
231
- } = props;
232
225
  isLongPress = true;
233
- call(onLongPress, idx);
226
+ call(props.onLongPress, idx);
234
227
  }, LONG_PRESS_DELAY);
235
- if (isDoubleTouch(currentTouch)) {
228
+ if (isDoubleTouch(target)) {
236
229
  scale.value > 1 ? zoomOut() : zoomIn();
237
230
  return;
238
231
  }
239
- prevTouch = currentTouch;
232
+ startTouch(event);
233
+ targets.prev = target;
240
234
  };
241
235
  var getZoom = target => {
242
236
  var {
@@ -283,33 +277,22 @@ var __sfc__ = defineComponent({
283
277
  var displayHeight = imageRadio > rootRadio ? height : width * imageRadio;
284
278
  return Math.max(0, (zoom * displayHeight - height) / 2) / zoom;
285
279
  };
286
- var getMoveTranslate = (current, move, limit) => {
287
- if (current + move >= limit) {
288
- return limit;
289
- }
290
- if (current + move <= -limit) {
291
- return -limit;
292
- }
293
- return current + move;
294
- };
295
280
  var handleTouchmove = event => {
296
- if (!prevTouch) {
281
+ if (!targets.prev) {
297
282
  return;
298
283
  }
284
+ moveTouch(event);
299
285
  var target = event.currentTarget;
300
- var currentTouch = createVarTouch(event.touches[0], target);
301
- if (getDistance(currentTouch, prevTouch) > DISTANCE_OFFSET) {
286
+ if (distance.value > DISTANCE_OFFSET) {
302
287
  window.clearTimeout(longPressRunner);
303
288
  }
304
289
  if (scale.value > 1) {
305
- var moveX = currentTouch.clientX - prevTouch.clientX;
306
- var moveY = currentTouch.clientY - prevTouch.clientY;
307
290
  var limitX = getLimitX(target);
308
291
  var limitY = getLimitY(target);
309
- translateX.value = getMoveTranslate(translateX.value, moveX, limitX);
310
- translateY.value = getMoveTranslate(translateY.value, moveY, limitY);
292
+ translateX.value = clamp(translateX.value + moveX.value, -limitX, limitX);
293
+ translateY.value = clamp(translateY.value + moveY.value, -limitY, limitY);
311
294
  }
312
- prevTouch = currentTouch;
295
+ targets.prev = target;
313
296
  };
314
297
  var close = () => {
315
298
  if (scale.value > 1) {
@@ -3,22 +3,14 @@ import { defineListenerProp, pickProps } from '../utils/components.mjs';
3
3
  import { props as swipeProps } from '../swipe/props.mjs';
4
4
  import { props as popupProps } from '../popup/props.mjs';
5
5
  export var props = _extends({
6
- show: {
7
- type: Boolean,
8
- default: false
9
- },
10
- imagePreventDefault: {
11
- type: Boolean,
12
- default: false
13
- },
6
+ show: Boolean,
7
+ imagePreventDefault: Boolean,
14
8
  images: {
15
9
  type: Array,
16
10
  default: () => []
17
11
  },
18
12
  /** @deprecated Use initialIndex to instead. */
19
- current: {
20
- type: String
21
- },
13
+ current: String,
22
14
  initialIndex: {
23
15
  type: [String, Number],
24
16
  default: 0
@@ -27,10 +19,7 @@ export var props = _extends({
27
19
  type: [String, Number],
28
20
  default: 2
29
21
  },
30
- closeable: {
31
- type: Boolean,
32
- default: false
33
- },
22
+ closeable: Boolean,
34
23
  'onUpdate:show': defineListenerProp(),
35
24
  onLongPress: defineListenerProp()
36
25
  }, pickProps(swipeProps, ['loop', 'indicator', 'onChange']), pickProps(popupProps, ['lockScroll', 'teleport', 'onOpen', 'onClose', 'onOpened', 'onClosed',
@@ -1,5 +1,3 @@
1
1
  export var props = {
2
- index: {
3
- type: [Number, String]
4
- }
2
+ index: [Number, String]
5
3
  };
@@ -9,25 +9,14 @@ export var props = {
9
9
  default: 0
10
10
  },
11
11
  /** @deprecated Use stickyCssMode to instead. */
12
- cssMode: {
13
- type: Boolean,
14
- default: false
15
- },
16
- stickyCssMode: {
17
- type: Boolean,
18
- default: false
19
- },
20
- hideList: {
21
- type: Boolean,
22
- default: false
23
- },
12
+ cssMode: Boolean,
13
+ stickyCssMode: Boolean,
14
+ hideList: Boolean,
24
15
  zIndex: {
25
16
  type: [Number, String],
26
17
  default: 1
27
18
  },
28
- highlightColor: {
29
- type: String
30
- },
19
+ highlightColor: String,
31
20
  duration: {
32
21
  type: [Number, String],
33
22
  default: 0
@@ -247,7 +247,7 @@ import './tooltip/style/index.mjs'
247
247
  import './uploader/style/index.mjs'
248
248
  import './watermark/style/index.mjs'
249
249
 
250
- const version = '2.14.2'
250
+ const version = '2.15.0-alpha.1692990022445'
251
251
 
252
252
  function install(app) {
253
253
  ActionSheet.install && app.use(ActionSheet)
package/es/index.mjs CHANGED
@@ -164,7 +164,7 @@ export * from './tooltip/index.mjs'
164
164
  export * from './uploader/index.mjs'
165
165
  export * from './watermark/index.mjs'
166
166
 
167
- const version = '2.14.2'
167
+ const version = '2.15.0-alpha.1692990022445'
168
168
 
169
169
  function install(app) {
170
170
  ActionSheet.install && app.use(ActionSheet)