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.
- package/es/cell/Cell.d.ts +9 -0
- package/es/cell/Cell.mjs +15 -3
- package/es/cell/index.css +1 -1
- package/es/cell/index.d.ts +5 -0
- package/es/cell/index.less +24 -2
- package/es/cell/var.less +6 -0
- package/es/cell-group/CellGroup.d.ts +4 -0
- package/es/cell-group/CellGroup.mjs +4 -2
- package/es/cell-group/index.css +1 -1
- package/es/cell-group/index.d.ts +3 -0
- package/es/cell-group/index.less +27 -0
- package/es/cell-group/var.less +3 -0
- package/es/collapse-item/CollapseItem.d.ts +7 -0
- package/es/collapse-item/index.d.ts +5 -0
- package/es/field/Field.d.ts +7 -0
- package/es/field/index.d.ts +5 -0
- package/es/index.d.ts +1 -1
- package/es/index.mjs +1 -1
- package/es/label/Label.d.ts +11 -1
- package/es/label/Label.mjs +34 -3
- package/es/label/index.css +1 -1
- package/es/label/index.d.ts +6 -2
- package/es/label/index.less +22 -0
- package/es/label/var.less +1 -0
- package/es/loading/index.css +1 -1
- package/es/loading/index.less +1 -1
- package/es/material-action-bar/MaterialActionBar.d.ts +15 -0
- package/es/material-action-bar/MaterialActionBar.mjs +107 -58
- package/es/material-action-bar/index.css +1 -1
- package/es/material-action-bar/index.d.ts +76 -2
- package/es/material-action-bar/index.less +6 -2
- package/es/material-action-bar/index.mjs +4 -2
- package/es/material-action-bar/style/index.mjs +1 -0
- package/es/material-action-bar/style/less.mjs +1 -0
- package/es/material-add/index.css +1 -1
- package/es/material-add/style/index.mjs +1 -0
- package/es/material-add/style/less.mjs +1 -0
- package/es/material-display-bar/MaterialDisplayBar.d.ts +2 -1
- package/es/material-display-bar/MaterialDisplayBar.mjs +4 -3
- package/es/material-display-bar/index.css +1 -1
- package/es/material-display-bar/index.d.ts +105 -4
- package/es/material-display-bar/index.mjs +5 -3
- package/es/material-display-bar/var.less +1 -1
- package/es/object-select/ObjectSelect.mjs +13 -1
- package/es/style/base.css +1 -1
- package/es/style/base.less +5 -0
- package/es/style/css-variables.css +1 -1
- package/es/style/css-variables.less +1 -0
- package/es/style/var.less +1 -0
- package/es/tag/Tag.d.ts +15 -2
- package/es/tag/Tag.mjs +20 -3
- package/es/tag/index.css +1 -1
- package/es/tag/index.d.ts +9 -0
- package/es/tag/index.less +45 -1
- package/es/tag/var.less +13 -0
- package/es/title-bar/TitleBar.d.ts +34 -12
- package/es/title-bar/TitleBar.mjs +42 -10
- package/es/title-bar/index.css +1 -1
- package/es/title-bar/index.d.ts +18 -2
- package/es/title-bar/index.less +15 -2
- package/es/title-bar/style/index.mjs +2 -0
- package/es/title-bar/style/less.mjs +2 -0
- package/es/title-bar/var.less +6 -0
- package/es/uploader/Uploader.d.ts +7 -0
- package/es/uploader/Uploader.mjs +55 -30
- package/es/uploader/UploaderPreviewItem.d.ts +2 -1
- package/es/uploader/UploaderPreviewItem.mjs +13 -6
- package/es/uploader/index.css +1 -1
- package/es/uploader/index.d.ts +5 -0
- package/es/uploader/index.less +30 -0
- package/es/uploader/types.d.ts +1 -0
- package/es/uploader/utils.d.ts +2 -0
- package/es/uploader/utils.mjs +74 -0
- package/es/uploader/var.less +5 -0
- package/lib/cell/Cell.d.ts +9 -0
- package/lib/cell/Cell.js +15 -3
- package/lib/cell/index.css +1 -1
- package/lib/cell/index.d.ts +5 -0
- package/lib/cell/index.less +24 -2
- package/lib/cell/var.less +6 -0
- package/lib/cell-group/CellGroup.d.ts +4 -0
- package/lib/cell-group/CellGroup.js +4 -2
- package/lib/cell-group/index.css +1 -1
- package/lib/cell-group/index.d.ts +3 -0
- package/lib/cell-group/index.less +27 -0
- package/lib/cell-group/var.less +3 -0
- package/lib/collapse-item/CollapseItem.d.ts +7 -0
- package/lib/collapse-item/index.d.ts +5 -0
- package/lib/field/Field.d.ts +7 -0
- package/lib/field/index.d.ts +5 -0
- package/lib/index.css +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.less +1 -1
- package/lib/label/Label.d.ts +11 -1
- package/lib/label/Label.js +34 -3
- package/lib/label/index.css +1 -1
- package/lib/label/index.d.ts +6 -2
- package/lib/label/index.less +22 -0
- package/lib/label/var.less +1 -0
- package/lib/loading/index.css +1 -1
- package/lib/loading/index.less +1 -1
- package/lib/material-action-bar/MaterialActionBar.d.ts +15 -0
- package/lib/material-action-bar/MaterialActionBar.js +106 -57
- package/lib/material-action-bar/index.css +1 -1
- package/lib/material-action-bar/index.d.ts +76 -2
- package/lib/material-action-bar/index.js +4 -2
- package/lib/material-action-bar/index.less +6 -2
- package/lib/material-action-bar/style/index.js +1 -0
- package/lib/material-action-bar/style/less.js +1 -0
- package/lib/material-add/index.css +1 -1
- package/lib/material-add/style/index.js +1 -0
- package/lib/material-add/style/less.js +1 -0
- package/lib/material-display-bar/MaterialDisplayBar.d.ts +2 -1
- package/lib/material-display-bar/MaterialDisplayBar.js +4 -3
- package/lib/material-display-bar/index.css +1 -1
- package/lib/material-display-bar/index.d.ts +105 -4
- package/lib/material-display-bar/index.js +5 -3
- package/lib/material-display-bar/var.less +1 -1
- package/lib/object-select/ObjectSelect.js +13 -1
- package/lib/style/base.css +1 -1
- package/lib/style/base.less +5 -0
- package/lib/style/css-variables.css +1 -1
- package/lib/style/css-variables.less +1 -0
- package/lib/style/var.less +1 -0
- package/lib/tag/Tag.d.ts +15 -2
- package/lib/tag/Tag.js +20 -3
- package/lib/tag/index.css +1 -1
- package/lib/tag/index.d.ts +9 -0
- package/lib/tag/index.less +45 -1
- package/lib/tag/var.less +13 -0
- package/lib/title-bar/TitleBar.d.ts +34 -12
- package/lib/title-bar/TitleBar.js +42 -10
- package/lib/title-bar/index.css +1 -1
- package/lib/title-bar/index.d.ts +18 -2
- package/lib/title-bar/index.less +15 -2
- package/lib/title-bar/style/index.js +2 -0
- package/lib/title-bar/style/less.js +2 -0
- package/lib/title-bar/var.less +6 -0
- package/lib/uploader/Uploader.d.ts +7 -0
- package/lib/uploader/Uploader.js +53 -28
- package/lib/uploader/UploaderPreviewItem.d.ts +2 -1
- package/lib/uploader/UploaderPreviewItem.js +12 -5
- package/lib/uploader/index.css +1 -1
- package/lib/uploader/index.d.ts +5 -0
- package/lib/uploader/index.less +30 -0
- package/lib/uploader/types.d.ts +1 -0
- package/lib/uploader/utils.d.ts +2 -0
- package/lib/uploader/utils.js +74 -0
- package/lib/uploader/var.less +5 -0
- package/lib/vant.cjs.js +382 -120
- package/lib/vant.es.js +382 -120
- package/lib/vant.js +382 -120
- package/lib/vant.min.js +1 -1
- package/lib/web-types.json +1 -1
- package/package.json +1 -1
- package/skills/use-persagy-vant/SKILL.md +4 -3
- package/skills/use-persagy-vant/references/component-documentation.md +4 -4
- package/skills/use-persagy-vant/references/component-variant-selection.md +53 -0
- package/skills/use-persagy-vant/references/reuse-policy.md +7 -4
package/lib/uploader/Uploader.js
CHANGED
|
@@ -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(
|
|
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
|
-
(
|
|
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
|
-
|
|
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 = () =>
|
|
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
|
-
|
|
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"
|
package/lib/uploader/index.css
CHANGED
|
@@ -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}
|
package/lib/uploader/index.d.ts
CHANGED
|
@@ -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;
|
package/lib/uploader/index.less
CHANGED
|
@@ -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;
|
package/lib/uploader/types.d.ts
CHANGED
package/lib/uploader/utils.d.ts
CHANGED
|
@@ -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>;
|
package/lib/uploader/utils.js
CHANGED
|
@@ -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
|
+
}
|
package/lib/uploader/var.less
CHANGED
|
@@ -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);
|