persagy-vant 0.0.35 → 0.0.37

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 (160) hide show
  1. package/es/cell/Cell.d.ts +9 -0
  2. package/es/cell/Cell.mjs +15 -3
  3. package/es/cell/index.css +1 -1
  4. package/es/cell/index.d.ts +5 -0
  5. package/es/cell/index.less +24 -2
  6. package/es/cell/var.less +6 -0
  7. package/es/cell-group/CellGroup.d.ts +4 -0
  8. package/es/cell-group/CellGroup.mjs +4 -2
  9. package/es/cell-group/index.css +1 -1
  10. package/es/cell-group/index.d.ts +3 -0
  11. package/es/cell-group/index.less +27 -0
  12. package/es/cell-group/var.less +3 -0
  13. package/es/collapse-item/CollapseItem.d.ts +7 -0
  14. package/es/collapse-item/index.d.ts +5 -0
  15. package/es/field/Field.d.ts +7 -0
  16. package/es/field/index.d.ts +5 -0
  17. package/es/index.d.ts +1 -1
  18. package/es/index.mjs +1 -1
  19. package/es/label/Label.d.ts +11 -1
  20. package/es/label/Label.mjs +34 -3
  21. package/es/label/index.css +1 -1
  22. package/es/label/index.d.ts +6 -2
  23. package/es/label/index.less +22 -0
  24. package/es/label/var.less +1 -0
  25. package/es/loading/index.css +1 -1
  26. package/es/loading/index.less +1 -1
  27. package/es/material-action-bar/MaterialActionBar.d.ts +15 -0
  28. package/es/material-action-bar/MaterialActionBar.mjs +107 -58
  29. package/es/material-action-bar/index.css +1 -1
  30. package/es/material-action-bar/index.d.ts +76 -2
  31. package/es/material-action-bar/index.less +6 -2
  32. package/es/material-action-bar/index.mjs +4 -2
  33. package/es/material-action-bar/style/index.mjs +1 -0
  34. package/es/material-action-bar/style/less.mjs +1 -0
  35. package/es/material-add/index.css +1 -1
  36. package/es/material-add/style/index.mjs +1 -0
  37. package/es/material-add/style/less.mjs +1 -0
  38. package/es/material-display-bar/MaterialDisplayBar.d.ts +2 -1
  39. package/es/material-display-bar/MaterialDisplayBar.mjs +4 -3
  40. package/es/material-display-bar/index.css +1 -1
  41. package/es/material-display-bar/index.d.ts +105 -4
  42. package/es/material-display-bar/index.mjs +5 -3
  43. package/es/material-display-bar/var.less +1 -1
  44. package/es/object-select/ObjectSelect.mjs +13 -1
  45. package/es/style/base.css +1 -1
  46. package/es/style/base.less +5 -0
  47. package/es/style/css-variables.css +1 -1
  48. package/es/style/css-variables.less +1 -0
  49. package/es/style/var.less +1 -0
  50. package/es/tag/Tag.d.ts +15 -2
  51. package/es/tag/Tag.mjs +20 -3
  52. package/es/tag/index.css +1 -1
  53. package/es/tag/index.d.ts +9 -0
  54. package/es/tag/index.less +45 -1
  55. package/es/tag/var.less +13 -0
  56. package/es/title-bar/TitleBar.d.ts +34 -12
  57. package/es/title-bar/TitleBar.mjs +42 -10
  58. package/es/title-bar/index.css +1 -1
  59. package/es/title-bar/index.d.ts +18 -2
  60. package/es/title-bar/index.less +15 -2
  61. package/es/title-bar/style/index.mjs +2 -0
  62. package/es/title-bar/style/less.mjs +2 -0
  63. package/es/title-bar/var.less +6 -0
  64. package/es/uploader/Uploader.d.ts +7 -0
  65. package/es/uploader/Uploader.mjs +55 -30
  66. package/es/uploader/UploaderPreviewItem.d.ts +2 -1
  67. package/es/uploader/UploaderPreviewItem.mjs +13 -6
  68. package/es/uploader/index.css +1 -1
  69. package/es/uploader/index.d.ts +5 -0
  70. package/es/uploader/index.less +30 -0
  71. package/es/uploader/types.d.ts +1 -0
  72. package/es/uploader/utils.d.ts +2 -0
  73. package/es/uploader/utils.mjs +74 -0
  74. package/es/uploader/var.less +5 -0
  75. package/lib/cell/Cell.d.ts +9 -0
  76. package/lib/cell/Cell.js +15 -3
  77. package/lib/cell/index.css +1 -1
  78. package/lib/cell/index.d.ts +5 -0
  79. package/lib/cell/index.less +24 -2
  80. package/lib/cell/var.less +6 -0
  81. package/lib/cell-group/CellGroup.d.ts +4 -0
  82. package/lib/cell-group/CellGroup.js +4 -2
  83. package/lib/cell-group/index.css +1 -1
  84. package/lib/cell-group/index.d.ts +3 -0
  85. package/lib/cell-group/index.less +27 -0
  86. package/lib/cell-group/var.less +3 -0
  87. package/lib/collapse-item/CollapseItem.d.ts +7 -0
  88. package/lib/collapse-item/index.d.ts +5 -0
  89. package/lib/field/Field.d.ts +7 -0
  90. package/lib/field/index.d.ts +5 -0
  91. package/lib/index.css +1 -1
  92. package/lib/index.d.ts +1 -1
  93. package/lib/index.js +1 -1
  94. package/lib/index.less +1 -1
  95. package/lib/label/Label.d.ts +11 -1
  96. package/lib/label/Label.js +34 -3
  97. package/lib/label/index.css +1 -1
  98. package/lib/label/index.d.ts +6 -2
  99. package/lib/label/index.less +22 -0
  100. package/lib/label/var.less +1 -0
  101. package/lib/loading/index.css +1 -1
  102. package/lib/loading/index.less +1 -1
  103. package/lib/material-action-bar/MaterialActionBar.d.ts +15 -0
  104. package/lib/material-action-bar/MaterialActionBar.js +106 -57
  105. package/lib/material-action-bar/index.css +1 -1
  106. package/lib/material-action-bar/index.d.ts +76 -2
  107. package/lib/material-action-bar/index.js +4 -2
  108. package/lib/material-action-bar/index.less +6 -2
  109. package/lib/material-action-bar/style/index.js +1 -0
  110. package/lib/material-action-bar/style/less.js +1 -0
  111. package/lib/material-add/index.css +1 -1
  112. package/lib/material-add/style/index.js +1 -0
  113. package/lib/material-add/style/less.js +1 -0
  114. package/lib/material-display-bar/MaterialDisplayBar.d.ts +2 -1
  115. package/lib/material-display-bar/MaterialDisplayBar.js +4 -3
  116. package/lib/material-display-bar/index.css +1 -1
  117. package/lib/material-display-bar/index.d.ts +105 -4
  118. package/lib/material-display-bar/index.js +5 -3
  119. package/lib/material-display-bar/var.less +1 -1
  120. package/lib/object-select/ObjectSelect.js +13 -1
  121. package/lib/style/base.css +1 -1
  122. package/lib/style/base.less +5 -0
  123. package/lib/style/css-variables.css +1 -1
  124. package/lib/style/css-variables.less +1 -0
  125. package/lib/style/var.less +1 -0
  126. package/lib/tag/Tag.d.ts +15 -2
  127. package/lib/tag/Tag.js +20 -3
  128. package/lib/tag/index.css +1 -1
  129. package/lib/tag/index.d.ts +9 -0
  130. package/lib/tag/index.less +45 -1
  131. package/lib/tag/var.less +13 -0
  132. package/lib/title-bar/TitleBar.d.ts +34 -12
  133. package/lib/title-bar/TitleBar.js +42 -10
  134. package/lib/title-bar/index.css +1 -1
  135. package/lib/title-bar/index.d.ts +18 -2
  136. package/lib/title-bar/index.less +15 -2
  137. package/lib/title-bar/style/index.js +2 -0
  138. package/lib/title-bar/style/less.js +2 -0
  139. package/lib/title-bar/var.less +6 -0
  140. package/lib/uploader/Uploader.d.ts +7 -0
  141. package/lib/uploader/Uploader.js +53 -28
  142. package/lib/uploader/UploaderPreviewItem.d.ts +2 -1
  143. package/lib/uploader/UploaderPreviewItem.js +12 -5
  144. package/lib/uploader/index.css +1 -1
  145. package/lib/uploader/index.d.ts +5 -0
  146. package/lib/uploader/index.less +30 -0
  147. package/lib/uploader/types.d.ts +1 -0
  148. package/lib/uploader/utils.d.ts +2 -0
  149. package/lib/uploader/utils.js +74 -0
  150. package/lib/uploader/var.less +5 -0
  151. package/lib/vant.cjs.js +382 -120
  152. package/lib/vant.es.js +382 -120
  153. package/lib/vant.js +382 -120
  154. package/lib/vant.min.js +1 -1
  155. package/lib/web-types.json +1 -1
  156. package/package.json +1 -1
  157. package/skills/use-persagy-vant/SKILL.md +4 -3
  158. package/skills/use-persagy-vant/references/component-documentation.md +4 -4
  159. package/skills/use-persagy-vant/references/component-variant-selection.md +53 -0
  160. package/skills/use-persagy-vant/references/reuse-policy.md +7 -4
@@ -25,6 +25,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  mod
26
26
  ));
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var __async = (__this, __arguments, generator) => {
29
+ return new Promise((resolve, reject) => {
30
+ var fulfilled = (value) => {
31
+ try {
32
+ step(generator.next(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var rejected = (value) => {
38
+ try {
39
+ step(generator.throw(value));
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ };
44
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
+ step((generator = generator.apply(__this, __arguments)).next());
46
+ });
47
+ };
28
48
  var stdin_exports = {};
29
49
  __export(stdin_exports, {
30
50
  default: () => stdin_default
@@ -43,6 +63,8 @@ const uploaderProps = {
43
63
  accept: (0, import_utils.makeStringProp)("image/*"),
44
64
  capture: String,
45
65
  multiple: Boolean,
66
+ label: String,
67
+ required: Boolean,
46
68
  disabled: Boolean,
47
69
  readonly: Boolean,
48
70
  lazyLoad: Boolean,
@@ -112,37 +134,29 @@ var stdin_default = (0, import_vue.defineComponent)({
112
134
  modelValue,
113
135
  resultType
114
136
  } = props;
137
+ const createFileItem = (file) => __async(this, null, function* () {
138
+ const content = yield (0, import_utils2.readFileContent)(file, resultType);
139
+ const result = {
140
+ file,
141
+ status: "",
142
+ message: ""
143
+ };
144
+ if (content) {
145
+ result.content = content;
146
+ }
147
+ if ((0, import_utils2.isVideoFile)(result)) {
148
+ result.videoThumbnail = yield (0, import_utils2.createVideoThumbnail)(file);
149
+ }
150
+ return result;
151
+ });
115
152
  if (Array.isArray(files)) {
116
153
  const remainCount = +maxCount - modelValue.length;
117
154
  if (files.length > remainCount) {
118
155
  files = files.slice(0, remainCount);
119
156
  }
120
- Promise.all(files.map((file) => (0, import_utils2.readFileContent)(file, resultType))).then((contents) => {
121
- const fileList = files.map((file, index) => {
122
- const result = {
123
- file,
124
- status: "",
125
- message: ""
126
- };
127
- if (contents[index]) {
128
- result.content = contents[index];
129
- }
130
- return result;
131
- });
132
- onAfterRead(fileList);
133
- });
157
+ Promise.all(files.map(createFileItem)).then(onAfterRead);
134
158
  } else {
135
- (0, import_utils2.readFileContent)(files, resultType).then((content) => {
136
- const result = {
137
- file: files,
138
- status: "",
139
- message: ""
140
- };
141
- if (content) {
142
- result.content = content;
143
- }
144
- onAfterRead(result);
145
- });
159
+ createFileItem(files).then(onAfterRead);
146
160
  }
147
161
  };
148
162
  const onChange = (event) => {
@@ -175,7 +189,7 @@ var stdin_default = (0, import_vue.defineComponent)({
175
189
  let imagePreview;
176
190
  const onClosePreview = () => emit("close-preview");
177
191
  const previewImage = (item) => {
178
- if (props.previewFullImage) {
192
+ if (props.previewFullImage && (0, import_utils2.isImageFile)(item)) {
179
193
  const imageFiles = props.modelValue.filter(import_utils2.isImageFile);
180
194
  const images = imageFiles.map((item2) => {
181
195
  if (item2.file && !item2.url && item2.status !== "failed") {
@@ -218,6 +232,15 @@ var stdin_default = (0, import_vue.defineComponent)({
218
232
  return props.modelValue.map(renderPreviewItem);
219
233
  }
220
234
  };
235
+ const renderLabel = () => {
236
+ if (!props.label)
237
+ return;
238
+ return (0, import_vue.createVNode)("div", {
239
+ "class": (0, import_utils2.bem)("label")
240
+ }, [props.required && (0, import_vue.createVNode)("span", {
241
+ "class": (0, import_utils2.bem)("required")
242
+ }, [(0, import_vue.createTextVNode)("*")]), props.label]);
243
+ };
221
244
  const onClickUpload = (event) => emit("click-upload", event);
222
245
  const renderUpload = () => {
223
246
  if (props.modelValue.length >= props.maxCount || !props.showUpload) {
@@ -266,8 +289,10 @@ var stdin_default = (0, import_vue.defineComponent)({
266
289
  });
267
290
  (0, import_use.useCustomFieldValue)(() => props.modelValue);
268
291
  return () => (0, import_vue.createVNode)("div", {
269
- "class": (0, import_utils2.bem)()
270
- }, [(0, import_vue.createVNode)("div", {
292
+ "class": (0, import_utils2.bem)({
293
+ required: props.required && !props.label
294
+ })
295
+ }, [renderLabel(), (0, import_vue.createVNode)("div", {
271
296
  "class": (0, import_utils2.bem)("wrapper", {
272
297
  disabled: props.disabled
273
298
  })
@@ -14,7 +14,7 @@ declare const _default: import("vue").DefineComponent<{
14
14
  deletable: BooleanConstructor;
15
15
  previewSize: PropType<Numeric | [Numeric, Numeric]>;
16
16
  beforeDelete: PropType<Interceptor>;
17
- }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("delete" | "preview")[], "delete" | "preview", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
17
+ }, () => JSX.Element, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("click" | "delete" | "preview")[], "click" | "delete" | "preview", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
18
18
  name: (NumberConstructor | StringConstructor)[];
19
19
  item: {
20
20
  type: PropType<UploaderFileListItem>;
@@ -27,6 +27,7 @@ declare const _default: import("vue").DefineComponent<{
27
27
  previewSize: PropType<Numeric | [Numeric, Numeric]>;
28
28
  beforeDelete: PropType<Interceptor>;
29
29
  }>> & {
30
+ onClick?: ((...args: any[]) => any) | undefined;
30
31
  onDelete?: ((...args: any[]) => any) | undefined;
31
32
  onPreview?: ((...args: any[]) => any) | undefined;
32
33
  }, {
@@ -37,7 +37,7 @@ var stdin_default = (0, import_vue.defineComponent)({
37
37
  previewSize: [Number, String, Array],
38
38
  beforeDelete: Function
39
39
  },
40
- emits: ["delete", "preview"],
40
+ emits: ["delete", "preview", "click"],
41
41
  setup(props, {
42
42
  emit,
43
43
  slots
@@ -78,7 +78,11 @@ var stdin_default = (0, import_vue.defineComponent)({
78
78
  done: () => emit("delete")
79
79
  });
80
80
  };
81
- const onPreview = () => emit("preview");
81
+ const onPreview = () => {
82
+ emit("preview");
83
+ emit("click");
84
+ };
85
+ const onFilePreview = () => emit("click");
82
86
  const renderDeleteIcon = () => {
83
87
  if (props.deletable && props.item.status !== "uploading") {
84
88
  const slot = slots["preview-delete"];
@@ -116,10 +120,12 @@ var stdin_default = (0, import_vue.defineComponent)({
116
120
  imageFit,
117
121
  previewSize
118
122
  } = props;
119
- if ((0, import_utils.isImageFile)(item)) {
123
+ const isImage = (0, import_utils.isImageFile)(item);
124
+ const isVideo = (0, import_utils.isVideoFile)(item);
125
+ if (isImage || isVideo && item.videoThumbnail) {
120
126
  return (0, import_vue.createVNode)(import_image.Image, {
121
127
  "fit": imageFit,
122
- "src": item.content || item.url,
128
+ "src": isVideo ? item.videoThumbnail : item.content || item.url,
123
129
  "class": (0, import_utils.bem)("preview-image"),
124
130
  "width": Array.isArray(previewSize) ? previewSize[0] : previewSize,
125
131
  "height": Array.isArray(previewSize) ? previewSize[1] : previewSize,
@@ -131,7 +137,8 @@ var stdin_default = (0, import_vue.defineComponent)({
131
137
  }
132
138
  return (0, import_vue.createVNode)("div", {
133
139
  "class": (0, import_utils.bem)("file"),
134
- "style": (0, import_utils2.getSizeStyle)(props.previewSize)
140
+ "style": (0, import_utils2.getSizeStyle)(props.previewSize),
141
+ "onClick": onFilePreview
135
142
  }, [(0, import_vue.createVNode)(import_icon.Icon, {
136
143
  "class": (0, import_utils.bem)("file-icon"),
137
144
  "name": "description"
@@ -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{position:relative;display:inline-block}.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-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,8 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
10
10
  };
11
11
  capture: StringConstructor;
12
12
  multiple: BooleanConstructor;
13
+ label: StringConstructor;
14
+ required: BooleanConstructor;
13
15
  disabled: BooleanConstructor;
14
16
  readonly: BooleanConstructor;
15
17
  lazyLoad: BooleanConstructor;
@@ -70,6 +72,8 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
70
72
  };
71
73
  capture: StringConstructor;
72
74
  multiple: BooleanConstructor;
75
+ label: StringConstructor;
76
+ required: BooleanConstructor;
73
77
  disabled: BooleanConstructor;
74
78
  readonly: BooleanConstructor;
75
79
  lazyLoad: BooleanConstructor;
@@ -127,6 +131,7 @@ export declare const Uploader: import("../utils").WithInstall<import("vue").Defi
127
131
  "onClose-preview"?: ((...args: any[]) => any) | undefined;
128
132
  "onClick-preview"?: ((...args: any[]) => any) | undefined;
129
133
  }, {
134
+ required: boolean;
130
135
  name: string | number;
131
136
  accept: string;
132
137
  disabled: boolean;
@@ -28,12 +28,42 @@
28
28
  --van-uploader-loading-icon-size: @uploader-loading-icon-size;
29
29
  --van-uploader-loading-icon-color: @uploader-loading-icon-color;
30
30
  --van-uploader-disabled-opacity: @uploader-disabled-opacity;
31
+ --van-uploader-required-color: @uploader-required-color;
32
+ --van-uploader-label-color: @uploader-label-color;
33
+ --van-uploader-label-font-size: @uploader-label-font-size;
34
+ --van-uploader-label-line-height: @uploader-label-line-height;
35
+ --van-uploader-label-margin-bottom: @uploader-label-margin-bottom;
31
36
  }
32
37
 
33
38
  .van-uploader {
34
39
  position: relative;
35
40
  display: inline-block;
36
41
 
42
+ &--required::before {
43
+ position: absolute;
44
+ top: 0;
45
+ left: calc(-1 * var(--van-padding-sm));
46
+ color: var(--van-uploader-required-color);
47
+ font-size: var(--van-font-size-md);
48
+ line-height: var(--van-line-height-md);
49
+ content: '*';
50
+ }
51
+
52
+ &__label {
53
+ position: relative;
54
+ margin-bottom: var(--van-uploader-label-margin-bottom);
55
+ color: var(--van-uploader-label-color);
56
+ font-size: var(--van-uploader-label-font-size);
57
+ line-height: var(--van-uploader-label-line-height);
58
+ }
59
+
60
+ &__required {
61
+ position: absolute;
62
+ top: 0;
63
+ left: calc(-1 * (var(--van-padding-md) - var(--van-padding-xs)));
64
+ color: var(--van-uploader-required-color);
65
+ }
66
+
37
67
  &__wrapper {
38
68
  display: flex;
39
69
  flex-wrap: wrap;
@@ -8,6 +8,7 @@ export declare type UploaderFileListItem = {
8
8
  file?: File;
9
9
  content?: string;
10
10
  isImage?: boolean;
11
+ videoThumbnail?: string;
11
12
  status?: '' | 'uploading' | 'done' | 'failed';
12
13
  message?: string;
13
14
  imageFit?: ImageFit;
@@ -9,3 +9,5 @@ export declare function filterFiles(items: UploaderFileListItem[], maxSize: Uplo
9
9
  };
10
10
  export declare const isImageUrl: (url: string) => boolean;
11
11
  export declare function isImageFile(item: UploaderFileListItem): boolean;
12
+ export declare function isVideoFile(item: UploaderFileListItem): boolean;
13
+ export declare function createVideoThumbnail(file: File): Promise<string | undefined>;
@@ -18,10 +18,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
18
18
  var stdin_exports = {};
19
19
  __export(stdin_exports, {
20
20
  bem: () => bem,
21
+ createVideoThumbnail: () => createVideoThumbnail,
21
22
  filterFiles: () => filterFiles,
22
23
  isImageFile: () => isImageFile,
23
24
  isImageUrl: () => isImageUrl,
24
25
  isOversize: () => isOversize,
26
+ isVideoFile: () => isVideoFile,
25
27
  name: () => name,
26
28
  readFileContent: () => readFileContent,
27
29
  t: () => t
@@ -70,6 +72,7 @@ function filterFiles(items, maxSize) {
70
72
  return { valid, invalid };
71
73
  }
72
74
  const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
75
+ const VIDEO_REGEXP = /\.(mp4|webm|ogg|mov)(?:$|\?)/i;
73
76
  const isImageUrl = (url) => IMAGE_REGEXP.test(url);
74
77
  function isImageFile(item) {
75
78
  if (item.isImage) {
@@ -86,3 +89,74 @@ function isImageFile(item) {
86
89
  }
87
90
  return false;
88
91
  }
92
+ function isVideoFile(item) {
93
+ var _a;
94
+ if ((_a = item.file) == null ? void 0 : _a.type) {
95
+ return item.file.type.indexOf("video/") === 0;
96
+ }
97
+ if (item.url) {
98
+ return VIDEO_REGEXP.test(item.url);
99
+ }
100
+ return typeof item.content === "string" && item.content.indexOf("data:video") === 0;
101
+ }
102
+ function createVideoThumbnail(file) {
103
+ if (typeof document === "undefined" || typeof URL === "undefined" || typeof URL.createObjectURL !== "function") {
104
+ return Promise.resolve(void 0);
105
+ }
106
+ return new Promise((resolve) => {
107
+ const video = document.createElement("video");
108
+ const objectUrl = URL.createObjectURL(file);
109
+ let settled = false;
110
+ let timeout;
111
+ const cleanup = () => {
112
+ if (timeout !== void 0) {
113
+ window.clearTimeout(timeout);
114
+ }
115
+ URL.revokeObjectURL(objectUrl);
116
+ video.removeAttribute("src");
117
+ try {
118
+ video.load();
119
+ } catch (e) {
120
+ }
121
+ };
122
+ const done = (thumbnail) => {
123
+ if (settled)
124
+ return;
125
+ settled = true;
126
+ cleanup();
127
+ resolve(thumbnail);
128
+ };
129
+ const captureFrame = () => {
130
+ if (!video.videoWidth || !video.videoHeight) {
131
+ done();
132
+ return;
133
+ }
134
+ const canvas = document.createElement("canvas");
135
+ canvas.width = video.videoWidth;
136
+ canvas.height = video.videoHeight;
137
+ const context = canvas.getContext("2d");
138
+ if (!context) {
139
+ done();
140
+ return;
141
+ }
142
+ context.drawImage(video, 0, 0, canvas.width, canvas.height);
143
+ done(canvas.toDataURL("image/jpeg", 0.8));
144
+ };
145
+ video.muted = true;
146
+ video.playsInline = true;
147
+ video.preload = "auto";
148
+ video.onloadedmetadata = () => {
149
+ const duration = Number.isFinite(video.duration) ? video.duration : 0.1;
150
+ const frameTime = Math.min(0.1, Math.max(duration - 0.01, 0));
151
+ if (frameTime) {
152
+ video.currentTime = frameTime;
153
+ } else {
154
+ captureFrame();
155
+ }
156
+ };
157
+ video.onseeked = captureFrame;
158
+ video.onerror = () => done();
159
+ video.src = objectUrl;
160
+ timeout = window.setTimeout(() => done(), 3e3);
161
+ });
162
+ }
@@ -27,3 +27,8 @@
27
27
  @uploader-loading-icon-size: 22px;
28
28
  @uploader-loading-icon-color: var(--van-white);
29
29
  @uploader-disabled-opacity: var(--van-disabled-opacity);
30
+ @uploader-required-color: var(--van-danger-color);
31
+ @uploader-label-color: var(--van-text-color);
32
+ @uploader-label-font-size: var(--van-font-size-md);
33
+ @uploader-label-line-height: var(--van-line-height-md);
34
+ @uploader-label-margin-bottom: var(--van-padding-sm);