vant 4.0.0-rc.3 → 4.0.0-rc.5

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 (47) hide show
  1. package/README.md +4 -5
  2. package/changelog.generated.md +47 -23
  3. package/es/date-picker/DatePicker.mjs +4 -1
  4. package/es/date-picker/utils.d.ts +1 -0
  5. package/es/date-picker/utils.mjs +11 -0
  6. package/es/field/Field.mjs +5 -4
  7. package/es/field/index.css +1 -1
  8. package/es/field/types.d.ts +1 -1
  9. package/es/index.d.ts +1 -1
  10. package/es/index.mjs +1 -1
  11. package/es/loading/Loading.mjs +8 -4
  12. package/es/nav-bar/NavBar.d.ts +13 -0
  13. package/es/nav-bar/NavBar.mjs +4 -3
  14. package/es/nav-bar/index.d.ts +9 -0
  15. package/es/notify/function-call.mjs +1 -1
  16. package/es/stepper/Stepper.d.ts +13 -0
  17. package/es/stepper/Stepper.mjs +4 -3
  18. package/es/stepper/index.d.ts +9 -0
  19. package/es/tab/Tab.mjs +12 -2
  20. package/es/tabs/Tabs.mjs +51 -48
  21. package/es/time-picker/TimePicker.mjs +4 -3
  22. package/lib/date-picker/DatePicker.js +3 -0
  23. package/lib/date-picker/utils.d.ts +1 -0
  24. package/lib/date-picker/utils.js +11 -0
  25. package/lib/field/Field.js +5 -4
  26. package/lib/field/index.css +1 -1
  27. package/lib/field/types.d.ts +1 -1
  28. package/lib/index.css +1 -1
  29. package/lib/index.d.ts +1 -1
  30. package/lib/index.js +1 -1
  31. package/lib/loading/Loading.js +8 -4
  32. package/lib/nav-bar/NavBar.d.ts +13 -0
  33. package/lib/nav-bar/NavBar.js +4 -3
  34. package/lib/nav-bar/index.d.ts +9 -0
  35. package/lib/notify/function-call.js +1 -1
  36. package/lib/stepper/Stepper.d.ts +13 -0
  37. package/lib/stepper/Stepper.js +4 -3
  38. package/lib/stepper/index.d.ts +9 -0
  39. package/lib/tab/Tab.js +11 -1
  40. package/lib/tabs/Tabs.js +51 -48
  41. package/lib/time-picker/TimePicker.js +3 -2
  42. package/lib/vant.cjs.js +101 -67
  43. package/lib/vant.es.js +101 -67
  44. package/lib/vant.js +101 -67
  45. package/lib/vant.min.js +1 -1
  46. package/lib/web-types.json +523 -499
  47. package/package.json +5 -5
package/es/tabs/Tabs.mjs CHANGED
@@ -133,7 +133,7 @@ var stdin_default = defineComponent({
133
133
  index += diff;
134
134
  }
135
135
  };
136
- const setCurrentIndex = (currentIndex) => {
136
+ const setCurrentIndex = (currentIndex, skipScrollIntoView) => {
137
137
  const newIndex = findAvailableTab(currentIndex);
138
138
  if (!isDef(newIndex)) {
139
139
  return;
@@ -141,18 +141,27 @@ var stdin_default = defineComponent({
141
141
  const newTab = children[newIndex];
142
142
  const newName = getTabName(newTab, newIndex);
143
143
  const shouldEmitChange = state.currentIndex !== null;
144
- state.currentIndex = newIndex;
144
+ if (state.currentIndex !== newIndex) {
145
+ state.currentIndex = newIndex;
146
+ if (!skipScrollIntoView) {
147
+ scrollIntoView();
148
+ }
149
+ setLine();
150
+ }
145
151
  if (newName !== props.active) {
146
152
  emit("update:active", newName);
147
153
  if (shouldEmitChange) {
148
154
  emit("change", newName, newTab.title);
149
155
  }
150
156
  }
157
+ if (stickyFixed && !props.scrollspy) {
158
+ setRootScrollTop(Math.ceil(getElementTop(root.value) - offsetTopPx.value));
159
+ }
151
160
  };
152
- const setCurrentIndexByName = (name2) => {
161
+ const setCurrentIndexByName = (name2, skipScrollIntoView) => {
153
162
  const matched = children.find((tab, index2) => getTabName(tab, index2) === name2);
154
163
  const index = matched ? children.indexOf(matched) : 0;
155
- setCurrentIndex(index);
164
+ setCurrentIndex(index, skipScrollIntoView);
156
165
  };
157
166
  const scrollToCurrentContent = (immediate = false) => {
158
167
  if (props.scrollspy) {
@@ -243,13 +252,14 @@ var stdin_default = defineComponent({
243
252
  }
244
253
  };
245
254
  const renderHeader = () => {
246
- var _a, _b;
255
+ var _a, _b, _c;
247
256
  const {
248
257
  type,
249
- border
258
+ border,
259
+ sticky
250
260
  } = props;
251
- return _createVNode("div", {
252
- "ref": wrapRef,
261
+ const Header = [_createVNode("div", {
262
+ "ref": sticky ? void 0 : wrapRef,
253
263
  "class": [bem("wrap"), {
254
264
  [BORDER_TOP_BOTTOM]: type === "line" && border
255
265
  }]
@@ -262,7 +272,13 @@ var stdin_default = defineComponent({
262
272
  }]),
263
273
  "style": navStyle.value,
264
274
  "aria-orientation": "horizontal"
265
- }, [(_a = slots["nav-left"]) == null ? void 0 : _a.call(slots), renderNav(), renderLine(), (_b = slots["nav-right"]) == null ? void 0 : _b.call(slots)])]);
275
+ }, [(_a = slots["nav-left"]) == null ? void 0 : _a.call(slots), renderNav(), renderLine(), (_b = slots["nav-right"]) == null ? void 0 : _b.call(slots)])]), (_c = slots["nav-bottom"]) == null ? void 0 : _c.call(slots)];
276
+ if (sticky) {
277
+ return _createVNode("div", {
278
+ "ref": wrapRef
279
+ }, [Header]);
280
+ }
281
+ return Header;
266
282
  };
267
283
  watch([() => props.color, windowWidth], setLine);
268
284
  watch(() => props.active, (value) => {
@@ -279,15 +295,8 @@ var stdin_default = defineComponent({
279
295
  });
280
296
  }
281
297
  });
282
- watch(() => state.currentIndex, () => {
283
- scrollIntoView();
284
- setLine();
285
- if (stickyFixed && !props.scrollspy) {
286
- setRootScrollTop(Math.ceil(getElementTop(root.value) - offsetTopPx.value));
287
- }
288
- });
289
298
  const init = () => {
290
- setCurrentIndexByName(props.active);
299
+ setCurrentIndexByName(props.active, true);
291
300
  nextTick(() => {
292
301
  state.inited = true;
293
302
  if (wrapRef.value) {
@@ -323,37 +332,31 @@ var stdin_default = defineComponent({
323
332
  currentName,
324
333
  scrollIntoView
325
334
  });
326
- return () => {
327
- var _a;
328
- return _createVNode("div", {
329
- "ref": root,
330
- "class": bem([props.type])
331
- }, [props.sticky ? _createVNode(Sticky, {
332
- "container": root.value,
333
- "offsetTop": offsetTopPx.value,
334
- "onScroll": onStickyScroll
335
- }, {
336
- default: () => {
337
- var _a2;
338
- return [renderHeader(), (_a2 = slots["nav-bottom"]) == null ? void 0 : _a2.call(slots)];
339
- }
340
- }) : [renderHeader(), (_a = slots["nav-bottom"]) == null ? void 0 : _a.call(slots)], _createVNode(TabsContent, {
341
- "ref": contentRef,
342
- "count": children.length,
343
- "inited": state.inited,
344
- "animated": props.animated,
345
- "duration": props.duration,
346
- "swipeable": props.swipeable,
347
- "lazyRender": props.lazyRender,
348
- "currentIndex": state.currentIndex,
349
- "onChange": setCurrentIndex
350
- }, {
351
- default: () => {
352
- var _a2;
353
- return [(_a2 = slots.default) == null ? void 0 : _a2.call(slots)];
354
- }
355
- })]);
356
- };
335
+ return () => _createVNode("div", {
336
+ "ref": root,
337
+ "class": bem([props.type])
338
+ }, [props.sticky ? _createVNode(Sticky, {
339
+ "container": root.value,
340
+ "offsetTop": offsetTopPx.value,
341
+ "onScroll": onStickyScroll
342
+ }, {
343
+ default: () => [renderHeader()]
344
+ }) : renderHeader(), _createVNode(TabsContent, {
345
+ "ref": contentRef,
346
+ "count": children.length,
347
+ "inited": state.inited,
348
+ "animated": props.animated,
349
+ "duration": props.duration,
350
+ "swipeable": props.swipeable,
351
+ "lazyRender": props.lazyRender,
352
+ "currentIndex": state.currentIndex,
353
+ "onChange": setCurrentIndex
354
+ }, {
355
+ default: () => {
356
+ var _a;
357
+ return [(_a = slots.default) == null ? void 0 : _a.call(slots)];
358
+ }
359
+ })]);
357
360
  }
358
361
  });
359
362
  export {
@@ -1,7 +1,7 @@
1
1
  import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
2
2
  import { ref, watch, computed, defineComponent } from "vue";
3
3
  import { pick, extend, createNamespace, makeNumericProp, isSameValue } from "../utils/index.mjs";
4
- import { genOptions, sharedProps, pickerInheritKeys } from "../date-picker/utils.mjs";
4
+ import { genOptions, sharedProps, pickerInheritKeys, formatValueRange } from "../date-picker/utils.mjs";
5
5
  import { Picker } from "../picker/index.mjs";
6
6
  const [name] = createNamespace("time-picker");
7
7
  const timePickerProps = extend({}, sharedProps, {
@@ -45,13 +45,14 @@ var stdin_default = defineComponent({
45
45
  if (!isSameValue(newValues, props.modelValue)) {
46
46
  emit("update:modelValue", newValues);
47
47
  }
48
- }, {
49
- immediate: true
50
48
  });
51
49
  watch(() => props.modelValue, (newValues) => {
50
+ newValues = formatValueRange(newValues, columns.value);
52
51
  if (!isSameValue(newValues, currentValues.value)) {
53
52
  currentValues.value = newValues;
54
53
  }
54
+ }, {
55
+ immediate: true
55
56
  });
56
57
  const onChange = (...args) => emit("change", ...args);
57
58
  const onCancel = (...args) => emit("cancel", ...args);
@@ -112,9 +112,12 @@ var stdin_default = (0, import_vue2.defineComponent)({
112
112
  }
113
113
  });
114
114
  (0, import_vue2.watch)(() => props.modelValue, (newValues) => {
115
+ newValues = (0, import_utils2.formatValueRange)(newValues, columns.value);
115
116
  if (!(0, import_utils.isSameValue)(newValues, currentValues.value)) {
116
117
  currentValues.value = newValues;
117
118
  }
119
+ }, {
120
+ immediate: true
118
121
  });
119
122
  const onChange = (...args) => emit("change", ...args);
120
123
  const onCancel = (...args) => emit("cancel", ...args);
@@ -41,4 +41,5 @@ export declare const pickerInheritKeys: ("title" | "readonly" | "loading" | "all
41
41
  export declare function times<T>(n: number, iteratee: (index: number) => T): T[];
42
42
  export declare const getMonthEndDay: (year: number, month: number) => number;
43
43
  export declare const genOptions: <T extends string>(min: number, max: number, type: T, formatter: Formatter, filter?: Filter) => PickerOption[];
44
+ export declare const formatValueRange: (values: string[], columns: PickerOption[]) => string[];
44
45
  export {};
@@ -17,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var stdin_exports = {};
19
19
  __export(stdin_exports, {
20
+ formatValueRange: () => formatValueRange,
20
21
  genOptions: () => genOptions,
21
22
  getMonthEndDay: () => getMonthEndDay,
22
23
  pickerInheritKeys: () => pickerInheritKeys,
@@ -57,3 +58,13 @@ const genOptions = (min, max, type, formatter, filter) => {
57
58
  });
58
59
  return filter ? filter(type, options) : options;
59
60
  };
61
+ const formatValueRange = (values, columns) => values.map((value, index) => {
62
+ const column = columns[index];
63
+ if (column.length) {
64
+ const maxValue = +column[column.length - 1].value;
65
+ if (+value > maxValue) {
66
+ return String(maxValue);
67
+ }
68
+ }
69
+ return value;
70
+ });
@@ -161,7 +161,8 @@ var stdin_default = (0, import_vue2.defineComponent)({
161
161
  state.validateMessage = "";
162
162
  };
163
163
  const endValidate = () => emit("endValidate", {
164
- status: state.status
164
+ status: state.status,
165
+ message: state.validateMessage
165
166
  });
166
167
  const validate = (rules = props.rules) => new Promise((resolve) => {
167
168
  resetValidation();
@@ -450,9 +451,9 @@ var stdin_default = (0, import_vue2.defineComponent)({
450
451
  const labelAlign = getProp("labelAlign");
451
452
  const Label = renderLabel();
452
453
  const LeftIcon = renderLeftIcon();
454
+ const renderTitle = () => labelAlign === "top" ? [LeftIcon, Label] : Label;
453
455
  return (0, import_vue.createVNode)(import_cell.Cell, {
454
456
  "size": props.size,
455
- "icon": props.leftIcon,
456
457
  "class": bem({
457
458
  error: showError.value,
458
459
  disabled,
@@ -469,8 +470,8 @@ var stdin_default = (0, import_vue2.defineComponent)({
469
470
  }]), props.labelClass],
470
471
  "arrowDirection": props.arrowDirection
471
472
  }, {
472
- icon: LeftIcon ? () => LeftIcon : null,
473
- title: Label ? () => Label : null,
473
+ icon: LeftIcon && labelAlign !== "top" ? () => LeftIcon : null,
474
+ title: Label || labelAlign === "top" ? renderTitle : null,
474
475
  value: renderFieldBody,
475
476
  extra: slots.extra
476
477
  });
@@ -1 +1 @@
1
- :root{--van-field-label-width: 6.2em;--van-field-label-color: var(--van-text-color);--van-field-label-margin-right: var(--van-padding-sm);--van-field-input-text-color: var(--van-text-color);--van-field-input-error-text-color: var(--van-danger-color);--van-field-input-disabled-text-color: var(--van-text-color-3);--van-field-placeholder-text-color: var(--van-text-color-3);--van-field-icon-size: 16px;--van-field-clear-icon-size: 16px;--van-field-clear-icon-color: var(--van-gray-5);--van-field-right-icon-color: var(--van-gray-6);--van-field-error-message-color: var(--van-danger-color);--van-field-error-message-font-size: 12px;--van-field-text-area-min-height: 60px;--van-field-word-limit-color: var(--van-gray-7);--van-field-word-limit-font-size: var(--van-font-size-sm);--van-field-word-limit-line-height: 16px;--van-field-disabled-text-color: var(--van-text-color-3);--van-field-required-mark-color: var(--van-red)}.van-field__label{flex:none;box-sizing:border-box;width:var(--van-field-label-width);margin-right:var(--van-field-label-margin-right);color:var(--van-field-label-color);text-align:left;word-wrap:break-word}.van-field__label--center{text-align:center}.van-field__label--right{text-align:right}.van-field__label--required:before{margin-right:2px;color:var(--van-field-required-mark-color);content:"*"}.van-field--disabled .van-field__label{color:var(--van-field-disabled-text-color)}.van-field__value{overflow:visible}.van-field__body{display:flex;align-items:center}.van-field__control{display:block;box-sizing:border-box;width:100%;min-width:0;margin:0;padding:0;color:var(--van-field-input-text-color);line-height:inherit;text-align:left;background-color:transparent;border:0;resize:none;-webkit-user-select:auto;user-select:auto}.van-field__control::-webkit-input-placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control::placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control:disabled{color:var(--van-field-input-disabled-text-color);cursor:not-allowed;opacity:1;-webkit-text-fill-color:var(--van-field-input-disabled-text-color)}.van-field__control:read-only{cursor:default}.van-field__control--center{justify-content:center;text-align:center}.van-field__control--right{justify-content:flex-end;text-align:right}.van-field__control--custom{display:flex;align-items:center;min-height:var(--van-cell-line-height)}.van-field__control--error::-webkit-input-placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--error,.van-field__control--error::placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--min-height{min-height:var(--van-field-text-area-min-height)}.van-field__control[type=date],.van-field__control[type=time],.van-field__control[type=datetime-local]{min-height:var(--van-cell-line-height)}.van-field__control[type=search]{-webkit-appearance:none}.van-field__clear,.van-field__icon,.van-field__button,.van-field__right-icon{flex-shrink:0}.van-field__clear,.van-field__right-icon{margin-right:calc(var(--van-padding-xs) * -1);padding:0 var(--van-padding-xs);line-height:inherit}.van-field__clear{color:var(--van-field-clear-icon-color);font-size:var(--van-field-clear-icon-size);cursor:pointer}.van-field__left-icon .van-icon,.van-field__right-icon .van-icon{display:block;font-size:var(--van-field-icon-size);line-height:inherit}.van-field__left-icon{margin-right:var(--van-padding-base)}.van-field__right-icon{color:var(--van-field-right-icon-color)}.van-field__button{padding-left:var(--van-padding-xs)}.van-field__error-message{color:var(--van-field-error-message-color);font-size:var(--van-field-error-message-font-size);text-align:left}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{margin-top:var(--van-padding-base);color:var(--van-field-word-limit-color);font-size:var(--van-field-word-limit-font-size);line-height:var(--van-field-word-limit-line-height);text-align:right}
1
+ :root{--van-field-label-width: 6.2em;--van-field-label-color: var(--van-text-color);--van-field-label-margin-right: var(--van-padding-sm);--van-field-input-text-color: var(--van-text-color);--van-field-input-error-text-color: var(--van-danger-color);--van-field-input-disabled-text-color: var(--van-text-color-3);--van-field-placeholder-text-color: var(--van-text-color-3);--van-field-icon-size: 16px;--van-field-clear-icon-size: 16px;--van-field-clear-icon-color: var(--van-gray-5);--van-field-right-icon-color: var(--van-gray-6);--van-field-error-message-color: var(--van-danger-color);--van-field-error-message-font-size: 12px;--van-field-text-area-min-height: 60px;--van-field-word-limit-color: var(--van-gray-7);--van-field-word-limit-font-size: var(--van-font-size-sm);--van-field-word-limit-line-height: 16px;--van-field-disabled-text-color: var(--van-text-color-3);--van-field-required-mark-color: var(--van-red)}.van-field{flex-wrap:wrap}.van-field__label{flex:none;box-sizing:border-box;width:var(--van-field-label-width);margin-right:var(--van-field-label-margin-right);color:var(--van-field-label-color);text-align:left;word-wrap:break-word}.van-field__label--center{text-align:center}.van-field__label--right{text-align:right}.van-field__label--top{display:flex;width:100%;text-align:left;margin-bottom:var(--van-padding-base)}.van-field__label--required:before{margin-right:2px;color:var(--van-field-required-mark-color);content:"*"}.van-field--disabled .van-field__label{color:var(--van-field-disabled-text-color)}.van-field__value{overflow:visible}.van-field__body{display:flex;align-items:center}.van-field__control{display:block;box-sizing:border-box;width:100%;min-width:0;margin:0;padding:0;color:var(--van-field-input-text-color);line-height:inherit;text-align:left;background-color:transparent;border:0;resize:none;-webkit-user-select:auto;user-select:auto}.van-field__control::-webkit-input-placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control::placeholder{color:var(--van-field-placeholder-text-color)}.van-field__control:disabled{color:var(--van-field-input-disabled-text-color);cursor:not-allowed;opacity:1;-webkit-text-fill-color:var(--van-field-input-disabled-text-color)}.van-field__control:read-only{cursor:default}.van-field__control--center{justify-content:center;text-align:center}.van-field__control--right{justify-content:flex-end;text-align:right}.van-field__control--custom{display:flex;align-items:center;min-height:var(--van-cell-line-height)}.van-field__control--error::-webkit-input-placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--error,.van-field__control--error::placeholder{color:var(--van-field-input-error-text-color);-webkit-text-fill-color:currentColor}.van-field__control--min-height{min-height:var(--van-field-text-area-min-height)}.van-field__control[type=date],.van-field__control[type=time],.van-field__control[type=datetime-local]{min-height:var(--van-cell-line-height)}.van-field__control[type=search]{-webkit-appearance:none}.van-field__clear,.van-field__icon,.van-field__button,.van-field__right-icon{flex-shrink:0}.van-field__clear,.van-field__right-icon{margin-right:calc(var(--van-padding-xs) * -1);padding:0 var(--van-padding-xs);line-height:inherit}.van-field__clear{color:var(--van-field-clear-icon-color);font-size:var(--van-field-clear-icon-size);cursor:pointer}.van-field__left-icon .van-icon,.van-field__right-icon .van-icon{display:block;font-size:var(--van-field-icon-size);line-height:inherit}.van-field__left-icon{margin-right:var(--van-padding-base)}.van-field__right-icon{color:var(--van-field-right-icon-color)}.van-field__button{padding-left:var(--van-padding-xs)}.van-field__error-message{color:var(--van-field-error-message-color);font-size:var(--van-field-error-message-font-size);text-align:left}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{margin-top:var(--van-padding-base);color:var(--van-field-word-limit-color);font-size:var(--van-field-word-limit-font-size);line-height:var(--van-field-word-limit-line-height);text-align:right}
@@ -1,7 +1,7 @@
1
1
  import type { ComputedRef, ComponentPublicInstance } from 'vue';
2
2
  import type { FieldProps } from './Field';
3
3
  export declare type FieldType = 'tel' | 'url' | 'date' | 'file' | 'text' | 'time' | 'week' | 'color' | 'digit' | 'email' | 'image' | 'month' | 'radio' | 'range' | 'reset' | 'button' | 'hidden' | 'number' | 'search' | 'submit' | 'checkbox' | 'password' | 'textarea' | 'datetime-local';
4
- export declare type FieldTextAlign = 'left' | 'center' | 'right';
4
+ export declare type FieldTextAlign = 'left' | 'center' | 'right' | 'top';
5
5
  export declare type FieldClearTrigger = 'always' | 'focus';
6
6
  export declare type FieldFormatTrigger = 'onBlur' | 'onChange';
7
7
  export declare type FieldValidateTrigger = 'onBlur' | 'onChange' | 'onSubmit';