persagy-vant 0.0.42 → 0.0.43

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 (46) hide show
  1. package/es/action-sheet/ActionSheet.d.ts +4 -0
  2. package/es/action-sheet/ActionSheet.mjs +4 -1
  3. package/es/action-sheet/index.css +1 -1
  4. package/es/action-sheet/index.d.ts +3 -0
  5. package/es/action-sheet/index.less +4 -0
  6. package/es/index.d.ts +1 -1
  7. package/es/index.mjs +1 -1
  8. package/es/locale/lang/en-US.d.ts +6 -0
  9. package/es/locale/lang/en-US.mjs +6 -0
  10. package/es/locale/lang/zh-CN.d.ts +6 -0
  11. package/es/locale/lang/zh-CN.mjs +6 -0
  12. package/es/uploader/Uploader.d.ts +6 -1
  13. package/es/uploader/Uploader.mjs +80 -19
  14. package/es/uploader/index.css +1 -1
  15. package/es/uploader/index.d.ts +6 -2
  16. package/es/uploader/index.less +4 -0
  17. package/es/uploader/style/index.mjs +3 -0
  18. package/es/uploader/style/less.mjs +3 -0
  19. package/es/uploader/types.d.ts +2 -1
  20. package/lib/action-sheet/ActionSheet.d.ts +4 -0
  21. package/lib/action-sheet/ActionSheet.js +4 -1
  22. package/lib/action-sheet/index.css +1 -1
  23. package/lib/action-sheet/index.d.ts +3 -0
  24. package/lib/action-sheet/index.less +4 -0
  25. package/lib/index.css +1 -1
  26. package/lib/index.d.ts +1 -1
  27. package/lib/index.js +1 -1
  28. package/lib/locale/lang/en-US.d.ts +6 -0
  29. package/lib/locale/lang/en-US.js +6 -0
  30. package/lib/locale/lang/zh-CN.d.ts +6 -0
  31. package/lib/locale/lang/zh-CN.js +6 -0
  32. package/lib/uploader/Uploader.d.ts +6 -1
  33. package/lib/uploader/Uploader.js +79 -18
  34. package/lib/uploader/index.css +1 -1
  35. package/lib/uploader/index.d.ts +6 -2
  36. package/lib/uploader/index.less +4 -0
  37. package/lib/uploader/style/index.js +3 -0
  38. package/lib/uploader/style/less.js +3 -0
  39. package/lib/uploader/types.d.ts +2 -1
  40. package/lib/vant.cjs.js +89 -20
  41. package/lib/vant.es.js +89 -20
  42. package/lib/vant.js +89 -20
  43. package/lib/vant.min.js +1 -1
  44. package/lib/web-types.json +1 -1
  45. package/package.json +1 -1
  46. package/skills/use-persagy-vant/references/component-catalog.md +1 -1
package/lib/index.d.ts CHANGED
@@ -117,4 +117,4 @@ declare namespace _default {
117
117
  }
118
118
  export default _default;
119
119
  export function install(app: any): void;
120
- export const version: "0.0.42";
120
+ export const version: "0.0.43";
package/lib/index.js CHANGED
@@ -248,7 +248,7 @@ __reExport(stdin_exports, require("./uploader"), module.exports);
248
248
  __reExport(stdin_exports, require("./video-preview"), module.exports);
249
249
  __reExport(stdin_exports, require("./work-order-card"), module.exports);
250
250
  __reExport(stdin_exports, require("./work-order-filter"), module.exports);
251
- const version = "0.0.42";
251
+ const version = "0.0.43";
252
252
  function install(app) {
253
253
  const components = [
254
254
  import_action_bar.ActionBar,
@@ -63,5 +63,11 @@ declare const _default: {
63
63
  vanTabs: {
64
64
  moreTitle: string;
65
65
  };
66
+ vanUploader: {
67
+ sourcePickerTitle: string;
68
+ takePhoto: string;
69
+ recordVideo: string;
70
+ chooseFromAlbum: string;
71
+ };
66
72
  };
67
73
  export default _default;
@@ -84,5 +84,11 @@ var stdin_default = {
84
84
  },
85
85
  vanTabs: {
86
86
  moreTitle: "More tabs"
87
+ },
88
+ vanUploader: {
89
+ sourcePickerTitle: "Choose upload source",
90
+ takePhoto: "Take photo",
91
+ recordVideo: "Record video",
92
+ chooseFromAlbum: "Choose from album"
87
93
  }
88
94
  };
@@ -63,5 +63,11 @@ declare const _default: {
63
63
  vanTabs: {
64
64
  moreTitle: string;
65
65
  };
66
+ vanUploader: {
67
+ sourcePickerTitle: string;
68
+ takePhoto: string;
69
+ recordVideo: string;
70
+ chooseFromAlbum: string;
71
+ };
66
72
  };
67
73
  export default _default;
@@ -84,5 +84,11 @@ var stdin_default = {
84
84
  },
85
85
  vanTabs: {
86
86
  moreTitle: "\u66F4\u591A\u6807\u7B7E"
87
+ },
88
+ vanUploader: {
89
+ sourcePickerTitle: "\u9009\u62E9\u4E0A\u4F20\u65B9\u5F0F",
90
+ takePhoto: "\u62CD\u7167",
91
+ recordVideo: "\u62CD\u89C6\u9891",
92
+ chooseFromAlbum: "\u4ECE\u76F8\u518C\u9009\u62E9"
87
93
  }
88
94
  };
@@ -14,6 +14,7 @@ declare const uploaderProps: {
14
14
  };
15
15
  capture: StringConstructor;
16
16
  multiple: BooleanConstructor;
17
+ sourcePicker: BooleanConstructor;
17
18
  label: StringConstructor;
18
19
  required: BooleanConstructor;
19
20
  disabled: BooleanConstructor;
@@ -79,6 +80,7 @@ declare const _default: import("vue").DefineComponent<{
79
80
  };
80
81
  capture: StringConstructor;
81
82
  multiple: BooleanConstructor;
83
+ sourcePicker: BooleanConstructor;
82
84
  label: StringConstructor;
83
85
  required: BooleanConstructor;
84
86
  disabled: BooleanConstructor;
@@ -131,7 +133,7 @@ declare const _default: import("vue").DefineComponent<{
131
133
  type: PropType<UploaderMaxSize>;
132
134
  default: number;
133
135
  };
134
- }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview")[], "update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<ExtractPropTypes<{
136
+ }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview" | "select-source")[], "update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview" | "select-source", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<ExtractPropTypes<{
135
137
  name: {
136
138
  type: (NumberConstructor | StringConstructor)[];
137
139
  default: string;
@@ -142,6 +144,7 @@ declare const _default: import("vue").DefineComponent<{
142
144
  };
143
145
  capture: StringConstructor;
144
146
  multiple: BooleanConstructor;
147
+ sourcePicker: BooleanConstructor;
145
148
  label: StringConstructor;
146
149
  required: BooleanConstructor;
147
150
  disabled: BooleanConstructor;
@@ -201,6 +204,7 @@ declare const _default: import("vue").DefineComponent<{
201
204
  "onClick-upload"?: ((...args: any[]) => any) | undefined;
202
205
  "onClose-preview"?: ((...args: any[]) => any) | undefined;
203
206
  "onClick-preview"?: ((...args: any[]) => any) | undefined;
207
+ "onSelect-source"?: ((...args: any[]) => any) | undefined;
204
208
  }, {
205
209
  required: boolean;
206
210
  name: string | number;
@@ -210,6 +214,7 @@ declare const _default: import("vue").DefineComponent<{
210
214
  readonly: boolean;
211
215
  multiple: boolean;
212
216
  lazyLoad: boolean;
217
+ sourcePicker: boolean;
213
218
  maxCount: string | number;
214
219
  imageFit: ImageFit;
215
220
  resultType: UploaderResultType;
@@ -56,6 +56,7 @@ var import_utils2 = require("./utils");
56
56
  var import_use = require("@vant/use");
57
57
  var import_use_expose = require("../composables/use-expose");
58
58
  var import_icon = require("../icon");
59
+ var import_action_sheet = require("../action-sheet");
59
60
  var import_image_preview = require("../image-preview");
60
61
  var import_UploaderPreviewItem = __toESM(require("./UploaderPreviewItem"));
61
62
  const uploaderProps = {
@@ -63,6 +64,7 @@ const uploaderProps = {
63
64
  accept: (0, import_utils.makeStringProp)("image/*"),
64
65
  capture: String,
65
66
  multiple: Boolean,
67
+ sourcePicker: Boolean,
66
68
  label: String,
67
69
  required: Boolean,
68
70
  disabled: Boolean,
@@ -92,21 +94,26 @@ const uploaderProps = {
92
94
  var stdin_default = (0, import_vue.defineComponent)({
93
95
  name: import_utils2.name,
94
96
  props: uploaderProps,
95
- emits: ["delete", "oversize", "click-upload", "close-preview", "click-preview", "update:modelValue"],
97
+ emits: ["delete", "oversize", "click-upload", "close-preview", "click-preview", "select-source", "update:modelValue"],
96
98
  setup(props, {
97
99
  emit,
98
100
  slots
99
101
  }) {
100
102
  const inputRef = (0, import_vue.ref)();
103
+ const cameraInputRef = (0, import_vue.ref)();
104
+ const videoInputRef = (0, import_vue.ref)();
105
+ const sourcePickerVisible = (0, import_vue.ref)(false);
101
106
  const urls = [];
102
107
  const getDetail = (index = props.modelValue.length) => ({
103
108
  name: props.name,
104
109
  index
105
110
  });
106
111
  const resetInput = () => {
107
- if (inputRef.value) {
108
- inputRef.value.value = "";
109
- }
112
+ [inputRef, cameraInputRef, videoInputRef].forEach((input) => {
113
+ if (input.value) {
114
+ input.value.value = "";
115
+ }
116
+ });
110
117
  };
111
118
  const onAfterRead = (items) => {
112
119
  resetInput();
@@ -242,21 +249,69 @@ var stdin_default = (0, import_vue.defineComponent)({
242
249
  "class": (0, import_utils2.bem)("required")
243
250
  }, [(0, import_vue.createTextVNode)("*")]), props.label]);
244
251
  };
245
- const onClickUpload = (event) => emit("click-upload", event);
252
+ const acceptTypes = () => props.accept.split(",").map((type) => type.trim().toLowerCase()).filter(Boolean);
253
+ const acceptsMediaType = (type) => acceptTypes().some((accept) => accept === `${type}/*` || accept.startsWith(`${type}/`));
254
+ const triggerInput = (source) => {
255
+ const target = source === "camera" ? cameraInputRef.value : source === "video" ? videoInputRef.value : inputRef.value;
256
+ if (target && !props.disabled && !props.readonly) {
257
+ emit("select-source", source);
258
+ target.click();
259
+ }
260
+ };
261
+ const onClickUpload = (event) => {
262
+ emit("click-upload", event);
263
+ if (props.sourcePicker && !props.disabled && !props.readonly) {
264
+ sourcePickerVisible.value = true;
265
+ }
266
+ };
267
+ const renderInput = (input, accept, capture, multiple = false, hidden = false) => (0, import_vue.createVNode)("input", {
268
+ "ref": input,
269
+ "type": "file",
270
+ "class": (0, import_utils2.bem)("input", {
271
+ hidden
272
+ }),
273
+ "accept": accept,
274
+ "capture": capture,
275
+ "multiple": multiple,
276
+ "disabled": props.disabled,
277
+ "onChange": onChange
278
+ }, null);
279
+ const renderSourcePicker = () => {
280
+ if (!props.sourcePicker)
281
+ return;
282
+ const actions = [];
283
+ if (acceptsMediaType("image")) {
284
+ actions.push({
285
+ name: (0, import_utils2.t)("takePhoto"),
286
+ callback: () => triggerInput("camera")
287
+ });
288
+ }
289
+ if (acceptsMediaType("video")) {
290
+ actions.push({
291
+ name: (0, import_utils2.t)("recordVideo"),
292
+ callback: () => triggerInput("video")
293
+ });
294
+ }
295
+ actions.push({
296
+ name: (0, import_utils2.t)("chooseFromAlbum"),
297
+ callback: () => triggerInput("album")
298
+ });
299
+ return (0, import_vue.createVNode)(import_action_sheet.ActionSheet, {
300
+ "show": sourcePickerVisible.value,
301
+ "title": (0, import_utils2.t)("sourcePickerTitle"),
302
+ "actions": actions,
303
+ "contentAdaptive": true,
304
+ "closeOnClickAction": true,
305
+ "onUpdate:show": (show) => {
306
+ sourcePickerVisible.value = show;
307
+ }
308
+ }, null);
309
+ };
246
310
  const renderUpload = () => {
247
311
  if (props.modelValue.length >= props.maxCount || !props.showUpload) {
248
312
  return;
249
313
  }
250
- const Input = props.readonly ? null : (0, import_vue.createVNode)("input", {
251
- "ref": inputRef,
252
- "type": "file",
253
- "class": (0, import_utils2.bem)("input"),
254
- "accept": props.accept,
255
- "capture": props.capture,
256
- "multiple": props.multiple,
257
- "disabled": props.disabled,
258
- "onChange": onChange
259
- }, null);
314
+ const Input = props.readonly ? null : props.sourcePicker ? [renderInput(inputRef, props.accept, void 0, props.multiple, true), acceptsMediaType("image") && renderInput(cameraInputRef, "image/*", props.capture || "environment", false, true), acceptsMediaType("video") && renderInput(videoInputRef, "video/*", props.capture || "environment", false, true)] : renderInput(inputRef, props.accept, props.capture, props.multiple);
260
315
  if (slots.default) {
261
316
  return (0, import_vue.createVNode)("div", {
262
317
  "class": (0, import_utils2.bem)("input-wrapper"),
@@ -276,8 +331,14 @@ var stdin_default = (0, import_vue.defineComponent)({
276
331
  "class": (0, import_utils2.bem)("upload-text")
277
332
  }, [props.uploadText]), Input]);
278
333
  };
279
- const chooseFile = () => {
280
- if (inputRef.value && !props.disabled) {
334
+ const chooseFile = (source) => {
335
+ if (props.disabled || props.readonly)
336
+ return;
337
+ if (source) {
338
+ triggerInput(source);
339
+ } else if (props.sourcePicker) {
340
+ sourcePickerVisible.value = true;
341
+ } else if (inputRef.value) {
281
342
  inputRef.value.click();
282
343
  }
283
344
  };
@@ -297,6 +358,6 @@ var stdin_default = (0, import_vue.defineComponent)({
297
358
  "class": (0, import_utils2.bem)("wrapper", {
298
359
  disabled: props.disabled
299
360
  })
300
- }, [props.uploadFirst ? (0, import_vue.createVNode)(import_vue.Fragment, null, [renderUpload(), renderPreviewList()]) : (0, import_vue.createVNode)(import_vue.Fragment, null, [renderPreviewList(), renderUpload()])])]);
361
+ }, [props.uploadFirst ? (0, import_vue.createVNode)(import_vue.Fragment, null, [renderUpload(), renderPreviewList()]) : (0, import_vue.createVNode)(import_vue.Fragment, null, [renderPreviewList(), renderUpload()])]), renderSourcePicker()]);
301
362
  }
302
363
  });
@@ -1 +1 @@
1
- :root{--van-uploader-size: 72px;--van-uploader-border-radius: 8px;--van-uploader-border: 1px solid var(--van-grey-50);--van-uploader-icon-size: 24px;--van-uploader-icon-color: var(--van-gray-4);--van-uploader-text-color: var(--van-text-color-2);--van-uploader-text-font-size: var(--van-font-size-sm);--van-uploader-upload-background-color: var(--van-gray-1);--van-uploader-upload-active-color: var(--van-active-color);--van-uploader-delete-color: var(--van-white);--van-uploader-delete-icon-size: 14px;--van-uploader-delete-background-color: rgba(0, 0, 0, .7);--van-uploader-file-background-color: var(--van-background-color);--van-uploader-file-icon-size: 20px;--van-uploader-file-icon-color: var(--van-gray-7);--van-uploader-file-name-padding: 0 var(--van-padding-base);--van-uploader-file-name-margin-top: var(--van-padding-xs);--van-uploader-file-name-font-size: var(--van-font-size-sm);--van-uploader-file-name-text-color: var(--van-gray-7);--van-uploader-mask-text-color: var(--van-white);--van-uploader-mask-background-color: rgba(50, 50, 51, .88);--van-uploader-mask-icon-size: 22px;--van-uploader-mask-message-font-size: var(--van-font-size-sm);--van-uploader-mask-message-line-height: var(--van-line-height-xs);--van-uploader-loading-icon-size: 22px;--van-uploader-loading-icon-color: var(--van-white);--van-uploader-disabled-opacity: var(--van-disabled-opacity);--van-uploader-required-color: var(--van-danger-color);--van-uploader-label-color: var(--van-text-color);--van-uploader-label-font-size: var(--van-font-size-md);--van-uploader-label-line-height: var(--van-line-height-md);--van-uploader-label-margin-bottom: var(--van-padding-sm)}.van-uploader{position:relative;display:inline-block}.van-uploader--required:before{position:absolute;top:0;left:calc(-1 * var(--van-padding-sm));color:var(--van-uploader-required-color);font-size:var(--van-font-size-md);line-height:var(--van-line-height-md);content:"*"}.van-uploader__label{position:relative;margin-bottom:var(--van-uploader-label-margin-bottom);color:var(--van-uploader-label-color);font-size:var(--van-uploader-label-font-size);line-height:var(--van-uploader-label-line-height)}.van-uploader__required{position:absolute;top:0;left:calc(-1 * (var(--van-padding-md) - var(--van-padding-xs)));color:var(--van-uploader-required-color)}.van-uploader__wrapper{display:flex;flex-wrap:wrap;gap:var(--van-padding-xs)}.van-uploader__wrapper--disabled{opacity:var(--van-uploader-disabled-opacity)}.van-uploader__input{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;cursor:pointer;opacity:0}.van-uploader__input-wrapper{position:relative}.van-uploader__input:disabled{cursor:not-allowed}.van-uploader__upload{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;width:var(--van-uploader-size);height:var(--van-uploader-size);background:var(--van-uploader-upload-background-color);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border)}.van-uploader__upload:active{background-color:var(--van-uploader-upload-active-color)}.van-uploader__upload--readonly:active{background-color:var(--van-uploader-upload-background-color)}.van-uploader__upload-icon{color:var(--van-uploader-icon-color);font-size:var(--van-uploader-icon-size)}.van-uploader__upload-text{margin-top:var(--van-padding-xs);color:var(--van-uploader-text-color);font-size:var(--van-uploader-text-font-size)}.van-uploader__preview{position:relative;cursor:pointer;border-radius:var(--van-uploader-border-radius);overflow:hidden}.van-uploader__preview-image{display:block;width:var(--van-uploader-size);height:var(--van-uploader-size);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border);overflow:hidden;box-sizing:border-box}.van-uploader__preview-delete{position:absolute;top:0;right:0}.van-uploader__preview-delete--shadow{width:var(--van-uploader-delete-icon-size);height:var(--van-uploader-delete-icon-size);background:var(--van-uploader-delete-background-color);border-radius:0 0 0 12px}.van-uploader__preview-delete-icon{position:absolute;top:0;right:0;color:var(--van-uploader-delete-color);font-size:var(--van-uploader-delete-icon-size);transform:scale(.7) translate(10%,-10%)}.van-uploader__preview-cover{position:absolute;top:0;right:0;bottom:0;left:0}.van-uploader__mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--van-uploader-mask-text-color);background:var(--van-uploader-mask-background-color);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border)}.van-uploader__mask-icon{font-size:var(--van-uploader-mask-icon-size)}.van-uploader__mask-message{margin-top:6px;padding:0 var(--van-padding-base);font-size:var(--van-uploader-mask-message-font-size);line-height:var(--van-uploader-mask-message-line-height)}.van-uploader__loading{width:var(--van-uploader-loading-icon-size);height:var(--van-uploader-loading-icon-size);color:var(--van-uploader-loading-icon-color)}.van-uploader__file{display:flex;flex-direction:column;align-items:center;justify-content:center;width:var(--van-uploader-size);height:var(--van-uploader-size);background:var(--van-uploader-file-background-color)}.van-uploader__file-icon{color:var(--van-uploader-file-icon-color);font-size:var(--van-uploader-file-icon-size)}.van-uploader__file-name{box-sizing:border-box;width:100%;margin-top:var(--van-uploader-file-name-margin-top);padding:var(--van-uploader-file-name-padding);color:var(--van-uploader-file-name-text-color);font-size:var(--van-uploader-file-name-font-size);text-align:center}
1
+ :root{--van-uploader-size: 72px;--van-uploader-border-radius: 8px;--van-uploader-border: 1px solid var(--van-grey-50);--van-uploader-icon-size: 24px;--van-uploader-icon-color: var(--van-gray-4);--van-uploader-text-color: var(--van-text-color-2);--van-uploader-text-font-size: var(--van-font-size-sm);--van-uploader-upload-background-color: var(--van-gray-1);--van-uploader-upload-active-color: var(--van-active-color);--van-uploader-delete-color: var(--van-white);--van-uploader-delete-icon-size: 14px;--van-uploader-delete-background-color: rgba(0, 0, 0, .7);--van-uploader-file-background-color: var(--van-background-color);--van-uploader-file-icon-size: 20px;--van-uploader-file-icon-color: var(--van-gray-7);--van-uploader-file-name-padding: 0 var(--van-padding-base);--van-uploader-file-name-margin-top: var(--van-padding-xs);--van-uploader-file-name-font-size: var(--van-font-size-sm);--van-uploader-file-name-text-color: var(--van-gray-7);--van-uploader-mask-text-color: var(--van-white);--van-uploader-mask-background-color: rgba(50, 50, 51, .88);--van-uploader-mask-icon-size: 22px;--van-uploader-mask-message-font-size: var(--van-font-size-sm);--van-uploader-mask-message-line-height: var(--van-line-height-xs);--van-uploader-loading-icon-size: 22px;--van-uploader-loading-icon-color: var(--van-white);--van-uploader-disabled-opacity: var(--van-disabled-opacity);--van-uploader-required-color: var(--van-danger-color);--van-uploader-label-color: var(--van-text-color);--van-uploader-label-font-size: var(--van-font-size-md);--van-uploader-label-line-height: var(--van-line-height-md);--van-uploader-label-margin-bottom: var(--van-padding-sm)}.van-uploader{position:relative;display:inline-block}.van-uploader--required:before{position:absolute;top:0;left:calc(-1 * var(--van-padding-sm));color:var(--van-uploader-required-color);font-size:var(--van-font-size-md);line-height:var(--van-line-height-md);content:"*"}.van-uploader__label{position:relative;margin-bottom:var(--van-uploader-label-margin-bottom);color:var(--van-uploader-label-color);font-size:var(--van-uploader-label-font-size);line-height:var(--van-uploader-label-line-height)}.van-uploader__required{position:absolute;top:0;left:calc(-1 * (var(--van-padding-md) - var(--van-padding-xs)));color:var(--van-uploader-required-color)}.van-uploader__wrapper{display:flex;flex-wrap:wrap;gap:var(--van-padding-xs)}.van-uploader__wrapper--disabled{opacity:var(--van-uploader-disabled-opacity)}.van-uploader__input{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden;cursor:pointer;opacity:0}.van-uploader__input--hidden{display:none}.van-uploader__input-wrapper{position:relative}.van-uploader__input:disabled{cursor:not-allowed}.van-uploader__upload{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;width:var(--van-uploader-size);height:var(--van-uploader-size);background:var(--van-uploader-upload-background-color);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border)}.van-uploader__upload:active{background-color:var(--van-uploader-upload-active-color)}.van-uploader__upload--readonly:active{background-color:var(--van-uploader-upload-background-color)}.van-uploader__upload-icon{color:var(--van-uploader-icon-color);font-size:var(--van-uploader-icon-size)}.van-uploader__upload-text{margin-top:var(--van-padding-xs);color:var(--van-uploader-text-color);font-size:var(--van-uploader-text-font-size)}.van-uploader__preview{position:relative;cursor:pointer;border-radius:var(--van-uploader-border-radius);overflow:hidden}.van-uploader__preview-image{display:block;width:var(--van-uploader-size);height:var(--van-uploader-size);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border);overflow:hidden;box-sizing:border-box}.van-uploader__preview-delete{position:absolute;top:0;right:0}.van-uploader__preview-delete--shadow{width:var(--van-uploader-delete-icon-size);height:var(--van-uploader-delete-icon-size);background:var(--van-uploader-delete-background-color);border-radius:0 0 0 12px}.van-uploader__preview-delete-icon{position:absolute;top:0;right:0;color:var(--van-uploader-delete-color);font-size:var(--van-uploader-delete-icon-size);transform:scale(.7) translate(10%,-10%)}.van-uploader__preview-cover{position:absolute;top:0;right:0;bottom:0;left:0}.van-uploader__mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--van-uploader-mask-text-color);background:var(--van-uploader-mask-background-color);border-radius:var(--van-uploader-border-radius);border:var(--van-uploader-border)}.van-uploader__mask-icon{font-size:var(--van-uploader-mask-icon-size)}.van-uploader__mask-message{margin-top:6px;padding:0 var(--van-padding-base);font-size:var(--van-uploader-mask-message-font-size);line-height:var(--van-uploader-mask-message-line-height)}.van-uploader__loading{width:var(--van-uploader-loading-icon-size);height:var(--van-uploader-loading-icon-size);color:var(--van-uploader-loading-icon-color)}.van-uploader__file{display:flex;flex-direction:column;align-items:center;justify-content:center;width:var(--van-uploader-size);height:var(--van-uploader-size);background:var(--van-uploader-file-background-color)}.van-uploader__file-icon{color:var(--van-uploader-file-icon-color);font-size:var(--van-uploader-file-icon-size)}.van-uploader__file-name{box-sizing:border-box;width:100%;margin-top:var(--van-uploader-file-name-margin-top);padding:var(--van-uploader-file-name-padding);color:var(--van-uploader-file-name-text-color);font-size:var(--van-uploader-file-name-font-size);text-align:center}
@@ -10,6 +10,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
10
10
  };
11
11
  capture: StringConstructor;
12
12
  multiple: BooleanConstructor;
13
+ sourcePicker: BooleanConstructor;
13
14
  label: StringConstructor;
14
15
  required: BooleanConstructor;
15
16
  disabled: BooleanConstructor;
@@ -62,7 +63,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
62
63
  type: import("vue").PropType<import("./types").UploaderMaxSize>;
63
64
  default: number;
64
65
  };
65
- }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview")[], "update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
66
+ }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview" | "select-source")[], "update:modelValue" | "delete" | "oversize" | "click-upload" | "close-preview" | "click-preview" | "select-source", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
66
67
  name: {
67
68
  type: (NumberConstructor | StringConstructor)[];
68
69
  default: string;
@@ -73,6 +74,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
73
74
  };
74
75
  capture: StringConstructor;
75
76
  multiple: BooleanConstructor;
77
+ sourcePicker: BooleanConstructor;
76
78
  label: StringConstructor;
77
79
  required: BooleanConstructor;
78
80
  disabled: BooleanConstructor;
@@ -132,6 +134,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
132
134
  "onClick-upload"?: ((...args: any[]) => any) | undefined;
133
135
  "onClose-preview"?: ((...args: any[]) => any) | undefined;
134
136
  "onClick-preview"?: ((...args: any[]) => any) | undefined;
137
+ "onSelect-source"?: ((...args: any[]) => any) | undefined;
135
138
  }, {
136
139
  required: boolean;
137
140
  name: string | number;
@@ -141,6 +144,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
141
144
  readonly: boolean;
142
145
  multiple: boolean;
143
146
  lazyLoad: boolean;
147
+ sourcePicker: boolean;
144
148
  maxCount: string | number;
145
149
  imageFit: import("..").ImageFit;
146
150
  resultType: import("./types").UploaderResultType;
@@ -154,7 +158,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
154
158
  }>>;
155
159
  export default Uploader;
156
160
  export type { UploaderProps };
157
- export type { UploaderInstance, UploaderResultType, UploaderFileListItem, } from './types';
161
+ export type { UploaderInstance, UploaderResultType, UploaderSourceType, UploaderFileListItem, } from './types';
158
162
  declare module 'vue' {
159
163
  interface GlobalComponents {
160
164
  VanUploader: typeof Uploader;
@@ -84,6 +84,10 @@
84
84
  cursor: pointer;
85
85
  opacity: 0;
86
86
 
87
+ &--hidden {
88
+ display: none;
89
+ }
90
+
87
91
  &-wrapper {
88
92
  position: relative;
89
93
  }
@@ -5,6 +5,9 @@ require("../../image/index.css");
5
5
  require("../../loading/index.css");
6
6
  require("../../overlay/index.css");
7
7
  require("../../popup/index.css");
8
+ require("../../popover/index.css");
9
+ require("../../nav-bar/index.css");
10
+ require("../../action-sheet/index.css");
8
11
  require("../../swipe/index.css");
9
12
  require("../../swipe-item/index.css");
10
13
  require("../../image-preview/index.css");
@@ -5,6 +5,9 @@ require("../../image/index.less");
5
5
  require("../../loading/index.less");
6
6
  require("../../overlay/index.less");
7
7
  require("../../popup/index.less");
8
+ require("../../popover/index.less");
9
+ require("../../nav-bar/index.less");
10
+ require("../../action-sheet/index.less");
8
11
  require("../../swipe/index.less");
9
12
  require("../../swipe-item/index.less");
10
13
  require("../../image-preview/index.less");
@@ -3,6 +3,7 @@ import type { ImageFit } from '../image';
3
3
  import type { Numeric, Interceptor } from '../utils';
4
4
  import type { UploaderProps } from './Uploader';
5
5
  export declare type UploaderResultType = 'dataUrl' | 'text' | 'file';
6
+ export declare type UploaderSourceType = 'camera' | 'video' | 'album';
6
7
  export declare type UploaderFileListItem = {
7
8
  url?: string;
8
9
  file?: File;
@@ -26,7 +27,7 @@ export declare type UploaderAfterRead = (items: UploaderFileListItem | UploaderF
26
27
  index: number;
27
28
  }) => void;
28
29
  export declare type UploaderExpose = {
29
- chooseFile: () => void;
30
+ chooseFile: (source?: UploaderSourceType) => void;
30
31
  closeImagePreview: () => void;
31
32
  };
32
33
  export declare type UploaderInstance = ComponentPublicInstance<UploaderProps, UploaderExpose>;
package/lib/vant.cjs.js CHANGED
@@ -301,6 +301,12 @@ var stdin_default$29 = {
301
301
  },
302
302
  vanTabs: {
303
303
  moreTitle: "更多标签"
304
+ },
305
+ vanUploader: {
306
+ sourcePickerTitle: "选择上传方式",
307
+ takePhoto: "拍照",
308
+ recordVideo: "拍视频",
309
+ chooseFromAlbum: "从相册选择"
304
310
  }
305
311
  };
306
312
  const lang = vue.ref("zh-CN");
@@ -1786,6 +1792,7 @@ const actionSheetProps = extend({}, popupSharedProps, {
1786
1792
  closeable: truthProp,
1787
1793
  cancelText: String,
1788
1794
  description: String,
1795
+ contentAdaptive: Boolean,
1789
1796
  closeOnPopstate: truthProp,
1790
1797
  closeOnClickAction: Boolean,
1791
1798
  safeAreaInsetBottom: truthProp
@@ -1894,7 +1901,9 @@ var stdin_default$1W = vue.defineComponent({
1894
1901
  }
1895
1902
  };
1896
1903
  return () => vue.createVNode(Popup, vue.mergeProps({
1897
- "class": bem$1I(),
1904
+ "class": bem$1I({
1905
+ "content-adaptive": props2.contentAdaptive
1906
+ }),
1898
1907
  "position": "bottom",
1899
1908
  "onUpdate:show": updateShow
1900
1909
  }, pick(props2, popupInheritKeys$2)), {
@@ -19217,6 +19226,7 @@ const uploaderProps = {
19217
19226
  accept: makeStringProp("image/*"),
19218
19227
  capture: String,
19219
19228
  multiple: Boolean,
19229
+ sourcePicker: Boolean,
19220
19230
  label: String,
19221
19231
  required: Boolean,
19222
19232
  disabled: Boolean,
@@ -19246,21 +19256,26 @@ const uploaderProps = {
19246
19256
  var stdin_default$7 = vue.defineComponent({
19247
19257
  name: name$3,
19248
19258
  props: uploaderProps,
19249
- emits: ["delete", "oversize", "click-upload", "close-preview", "click-preview", "update:modelValue"],
19259
+ emits: ["delete", "oversize", "click-upload", "close-preview", "click-preview", "select-source", "update:modelValue"],
19250
19260
  setup(props2, {
19251
19261
  emit,
19252
19262
  slots
19253
19263
  }) {
19254
19264
  const inputRef = vue.ref();
19265
+ const cameraInputRef = vue.ref();
19266
+ const videoInputRef = vue.ref();
19267
+ const sourcePickerVisible = vue.ref(false);
19255
19268
  const urls = [];
19256
19269
  const getDetail = (index = props2.modelValue.length) => ({
19257
19270
  name: props2.name,
19258
19271
  index
19259
19272
  });
19260
19273
  const resetInput = () => {
19261
- if (inputRef.value) {
19262
- inputRef.value.value = "";
19263
- }
19274
+ [inputRef, cameraInputRef, videoInputRef].forEach((input) => {
19275
+ if (input.value) {
19276
+ input.value.value = "";
19277
+ }
19278
+ });
19264
19279
  };
19265
19280
  const onAfterRead = (items) => {
19266
19281
  resetInput();
@@ -19396,21 +19411,69 @@ var stdin_default$7 = vue.defineComponent({
19396
19411
  "class": bem$3("required")
19397
19412
  }, [vue.createTextVNode("*")]), props2.label]);
19398
19413
  };
19399
- const onClickUpload = (event) => emit("click-upload", event);
19414
+ const acceptTypes = () => props2.accept.split(",").map((type) => type.trim().toLowerCase()).filter(Boolean);
19415
+ const acceptsMediaType = (type) => acceptTypes().some((accept) => accept === `${type}/*` || accept.startsWith(`${type}/`));
19416
+ const triggerInput = (source) => {
19417
+ const target = source === "camera" ? cameraInputRef.value : source === "video" ? videoInputRef.value : inputRef.value;
19418
+ if (target && !props2.disabled && !props2.readonly) {
19419
+ emit("select-source", source);
19420
+ target.click();
19421
+ }
19422
+ };
19423
+ const onClickUpload = (event) => {
19424
+ emit("click-upload", event);
19425
+ if (props2.sourcePicker && !props2.disabled && !props2.readonly) {
19426
+ sourcePickerVisible.value = true;
19427
+ }
19428
+ };
19429
+ const renderInput = (input, accept, capture, multiple = false, hidden = false) => vue.createVNode("input", {
19430
+ "ref": input,
19431
+ "type": "file",
19432
+ "class": bem$3("input", {
19433
+ hidden
19434
+ }),
19435
+ "accept": accept,
19436
+ "capture": capture,
19437
+ "multiple": multiple,
19438
+ "disabled": props2.disabled,
19439
+ "onChange": onChange
19440
+ }, null);
19441
+ const renderSourcePicker = () => {
19442
+ if (!props2.sourcePicker)
19443
+ return;
19444
+ const actions = [];
19445
+ if (acceptsMediaType("image")) {
19446
+ actions.push({
19447
+ name: t("takePhoto"),
19448
+ callback: () => triggerInput("camera")
19449
+ });
19450
+ }
19451
+ if (acceptsMediaType("video")) {
19452
+ actions.push({
19453
+ name: t("recordVideo"),
19454
+ callback: () => triggerInput("video")
19455
+ });
19456
+ }
19457
+ actions.push({
19458
+ name: t("chooseFromAlbum"),
19459
+ callback: () => triggerInput("album")
19460
+ });
19461
+ return vue.createVNode(ActionSheet, {
19462
+ "show": sourcePickerVisible.value,
19463
+ "title": t("sourcePickerTitle"),
19464
+ "actions": actions,
19465
+ "contentAdaptive": true,
19466
+ "closeOnClickAction": true,
19467
+ "onUpdate:show": (show) => {
19468
+ sourcePickerVisible.value = show;
19469
+ }
19470
+ }, null);
19471
+ };
19400
19472
  const renderUpload = () => {
19401
19473
  if (props2.modelValue.length >= props2.maxCount || !props2.showUpload) {
19402
19474
  return;
19403
19475
  }
19404
- const Input = props2.readonly ? null : vue.createVNode("input", {
19405
- "ref": inputRef,
19406
- "type": "file",
19407
- "class": bem$3("input"),
19408
- "accept": props2.accept,
19409
- "capture": props2.capture,
19410
- "multiple": props2.multiple,
19411
- "disabled": props2.disabled,
19412
- "onChange": onChange
19413
- }, null);
19476
+ const Input = props2.readonly ? null : props2.sourcePicker ? [renderInput(inputRef, props2.accept, void 0, props2.multiple, true), acceptsMediaType("image") && renderInput(cameraInputRef, "image/*", props2.capture || "environment", false, true), acceptsMediaType("video") && renderInput(videoInputRef, "video/*", props2.capture || "environment", false, true)] : renderInput(inputRef, props2.accept, props2.capture, props2.multiple);
19414
19477
  if (slots.default) {
19415
19478
  return vue.createVNode("div", {
19416
19479
  "class": bem$3("input-wrapper"),
@@ -19430,8 +19493,14 @@ var stdin_default$7 = vue.defineComponent({
19430
19493
  "class": bem$3("upload-text")
19431
19494
  }, [props2.uploadText]), Input]);
19432
19495
  };
19433
- const chooseFile = () => {
19434
- if (inputRef.value && !props2.disabled) {
19496
+ const chooseFile = (source) => {
19497
+ if (props2.disabled || props2.readonly)
19498
+ return;
19499
+ if (source) {
19500
+ triggerInput(source);
19501
+ } else if (props2.sourcePicker) {
19502
+ sourcePickerVisible.value = true;
19503
+ } else if (inputRef.value) {
19435
19504
  inputRef.value.click();
19436
19505
  }
19437
19506
  };
@@ -19451,7 +19520,7 @@ var stdin_default$7 = vue.defineComponent({
19451
19520
  "class": bem$3("wrapper", {
19452
19521
  disabled: props2.disabled
19453
19522
  })
19454
- }, [props2.uploadFirst ? vue.createVNode(vue.Fragment, null, [renderUpload(), renderPreviewList()]) : vue.createVNode(vue.Fragment, null, [renderPreviewList(), renderUpload()])])]);
19523
+ }, [props2.uploadFirst ? vue.createVNode(vue.Fragment, null, [renderUpload(), renderPreviewList()]) : vue.createVNode(vue.Fragment, null, [renderPreviewList(), renderUpload()])]), renderSourcePicker()]);
19455
19524
  }
19456
19525
  });
19457
19526
  const Uploader = withInstall(stdin_default$7);
@@ -21331,7 +21400,7 @@ const Lazyload = {
21331
21400
  });
21332
21401
  }
21333
21402
  };
21334
- const version = "0.0.42";
21403
+ const version = "0.0.43";
21335
21404
  function install(app) {
21336
21405
  const components = [
21337
21406
  ActionBar,