persagy-vant 0.0.36 → 0.0.38

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 (231) hide show
  1. package/es/area/style/index.mjs +2 -0
  2. package/es/area/style/less.mjs +2 -0
  3. package/es/cell/Cell.d.ts +9 -0
  4. package/es/cell/Cell.mjs +15 -3
  5. package/es/cell/index.css +1 -1
  6. package/es/cell/index.d.ts +6 -1
  7. package/es/cell/index.less +24 -2
  8. package/es/cell/var.less +6 -0
  9. package/es/cell-group/CellGroup.d.ts +4 -0
  10. package/es/cell-group/CellGroup.mjs +4 -2
  11. package/es/cell-group/index.css +1 -1
  12. package/es/cell-group/index.d.ts +3 -0
  13. package/es/cell-group/index.less +27 -0
  14. package/es/cell-group/var.less +3 -0
  15. package/es/collapse-item/CollapseItem.d.ts +7 -0
  16. package/es/collapse-item/index.d.ts +5 -0
  17. package/es/field/Field.d.ts +7 -0
  18. package/es/field/index.d.ts +5 -0
  19. package/es/icon/Icon.mjs +7 -4
  20. package/es/icon/assets/copy.svg +4 -0
  21. package/es/icon/config.d.ts +1 -0
  22. package/es/icon/config.mjs +1 -0
  23. package/es/icon/gif.d.ts +6 -0
  24. package/es/icon/gif.mjs +9 -0
  25. package/es/icon/index.css +1 -1
  26. package/es/icon/index.d.ts +2 -0
  27. package/es/icon/index.mjs +4 -1
  28. package/es/icon/latest-iconfont.css +1 -1
  29. package/es/icon/latest-iconfont.less +11 -0
  30. package/es/index.d.ts +1 -1
  31. package/es/index.mjs +1 -1
  32. package/es/info-card/InfoCard.d.ts +31 -0
  33. package/es/info-card/InfoCard.mjs +45 -3
  34. package/es/info-card/index.css +1 -1
  35. package/es/info-card/index.d.ts +22 -1
  36. package/es/info-card/index.less +57 -0
  37. package/es/info-card/var.less +1 -1
  38. package/es/label/Label.d.ts +21 -0
  39. package/es/label/Label.mjs +12 -2
  40. package/es/label/index.css +1 -1
  41. package/es/label/index.d.ts +15 -0
  42. package/es/label/index.less +27 -0
  43. package/es/label/var.less +1 -0
  44. package/es/list/style/index.mjs +2 -0
  45. package/es/list/style/less.mjs +2 -0
  46. package/es/loading/Loading.mjs +8 -26
  47. package/es/loading/index.css +1 -1
  48. package/es/loading/index.less +1 -1
  49. package/es/loading/style/index.mjs +2 -0
  50. package/es/loading/style/less.mjs +2 -0
  51. package/es/material-action-bar/index.css +1 -1
  52. package/es/material-action-bar/index.less +3 -1
  53. package/es/material-add/MaterialAdd.mjs +158 -63
  54. package/es/material-add/index.css +1 -1
  55. package/es/material-add/index.d.ts +1 -1
  56. package/es/material-add/index.less +0 -14
  57. package/es/material-add/types.d.ts +7 -4
  58. package/es/material-detail/MaterialDetail.mjs +14 -9
  59. package/es/material-display-bar/index.css +1 -1
  60. package/es/material-display-bar/index.less +2 -1
  61. package/es/material-display-bar/var.less +1 -0
  62. package/es/number-keyboard/style/index.mjs +2 -0
  63. package/es/number-keyboard/style/less.mjs +2 -0
  64. package/es/object-select/ObjectSelect.mjs +13 -1
  65. package/es/picker/style/index.mjs +2 -0
  66. package/es/picker/style/less.mjs +2 -0
  67. package/es/progress/Progress.d.ts +17 -0
  68. package/es/progress/Progress.mjs +14 -9
  69. package/es/progress/index.css +1 -1
  70. package/es/progress/index.d.ts +12 -1
  71. package/es/progress/index.less +24 -14
  72. package/es/progress/types.d.ts +1 -0
  73. package/es/progress/var.less +10 -7
  74. package/es/pull-refresh/style/index.mjs +2 -0
  75. package/es/pull-refresh/style/less.mjs +2 -0
  76. package/es/style/base.css +1 -1
  77. package/es/style/base.less +5 -0
  78. package/es/style/css-variables.css +1 -1
  79. package/es/style/css-variables.less +1 -0
  80. package/es/style/var.less +1 -0
  81. package/es/switch/style/index.mjs +2 -0
  82. package/es/switch/style/less.mjs +2 -0
  83. package/es/title-bar/TitleBar.d.ts +5 -1
  84. package/es/title-bar/TitleBar.mjs +5 -3
  85. package/es/title-bar/index.css +1 -1
  86. package/es/title-bar/index.d.ts +4 -1
  87. package/es/title-bar/index.less +6 -1
  88. package/es/title-bar/var.less +2 -0
  89. package/es/tree-select/TreeSelect.mjs +9 -4
  90. package/es/tree-select/index.css +1 -1
  91. package/es/tree-select/index.less +29 -1
  92. package/es/uploader/Uploader.d.ts +7 -0
  93. package/es/uploader/Uploader.mjs +55 -30
  94. package/es/uploader/UploaderPreviewItem.d.ts +2 -1
  95. package/es/uploader/UploaderPreviewItem.mjs +13 -6
  96. package/es/uploader/index.css +1 -1
  97. package/es/uploader/index.d.ts +5 -0
  98. package/es/uploader/index.less +30 -0
  99. package/es/uploader/types.d.ts +1 -0
  100. package/es/uploader/utils.d.ts +2 -0
  101. package/es/uploader/utils.mjs +74 -0
  102. package/es/uploader/var.less +5 -0
  103. package/es/work-order-card/WorkOrderCard.mjs +52 -11
  104. package/es/work-order-card/index.css +1 -1
  105. package/es/work-order-card/index.less +3 -4
  106. package/es/work-order-card/style/index.mjs +2 -0
  107. package/es/work-order-card/style/less.mjs +2 -0
  108. package/es/work-order-card/types.d.ts +14 -1
  109. package/lib/area/style/index.js +2 -0
  110. package/lib/area/style/less.js +2 -0
  111. package/lib/cell/Cell.d.ts +9 -0
  112. package/lib/cell/Cell.js +15 -3
  113. package/lib/cell/index.css +1 -1
  114. package/lib/cell/index.d.ts +6 -1
  115. package/lib/cell/index.less +24 -2
  116. package/lib/cell/var.less +6 -0
  117. package/lib/cell-group/CellGroup.d.ts +4 -0
  118. package/lib/cell-group/CellGroup.js +4 -2
  119. package/lib/cell-group/index.css +1 -1
  120. package/lib/cell-group/index.d.ts +3 -0
  121. package/lib/cell-group/index.less +27 -0
  122. package/lib/cell-group/var.less +3 -0
  123. package/lib/collapse-item/CollapseItem.d.ts +7 -0
  124. package/lib/collapse-item/index.d.ts +5 -0
  125. package/lib/field/Field.d.ts +7 -0
  126. package/lib/field/index.d.ts +5 -0
  127. package/lib/icon/Icon.js +7 -4
  128. package/lib/icon/assets/copy.svg +4 -0
  129. package/lib/icon/config.d.ts +1 -0
  130. package/lib/icon/config.js +1 -0
  131. package/lib/icon/gif.d.ts +6 -0
  132. package/lib/icon/gif.js +28 -0
  133. package/lib/icon/index.css +1 -1
  134. package/lib/icon/index.d.ts +2 -0
  135. package/lib/icon/index.js +4 -1
  136. package/lib/icon/latest-iconfont.css +1 -1
  137. package/lib/icon/latest-iconfont.less +11 -0
  138. package/lib/index.css +1 -1
  139. package/lib/index.d.ts +1 -1
  140. package/lib/index.js +1 -1
  141. package/lib/info-card/InfoCard.d.ts +31 -0
  142. package/lib/info-card/InfoCard.js +45 -3
  143. package/lib/info-card/index.css +1 -1
  144. package/lib/info-card/index.d.ts +22 -1
  145. package/lib/info-card/index.less +57 -0
  146. package/lib/info-card/var.less +1 -1
  147. package/lib/label/Label.d.ts +21 -0
  148. package/lib/label/Label.js +12 -2
  149. package/lib/label/index.css +1 -1
  150. package/lib/label/index.d.ts +15 -0
  151. package/lib/label/index.less +27 -0
  152. package/lib/label/var.less +1 -0
  153. package/lib/list/style/index.js +2 -0
  154. package/lib/list/style/less.js +2 -0
  155. package/lib/loading/Loading.js +8 -26
  156. package/lib/loading/index.css +1 -1
  157. package/lib/loading/index.less +1 -1
  158. package/lib/loading/style/index.js +2 -0
  159. package/lib/loading/style/less.js +2 -0
  160. package/lib/material-action-bar/index.css +1 -1
  161. package/lib/material-action-bar/index.less +3 -1
  162. package/lib/material-add/MaterialAdd.js +158 -63
  163. package/lib/material-add/index.css +1 -1
  164. package/lib/material-add/index.d.ts +1 -1
  165. package/lib/material-add/index.less +0 -14
  166. package/lib/material-add/types.d.ts +7 -4
  167. package/lib/material-detail/MaterialDetail.js +14 -9
  168. package/lib/material-display-bar/index.css +1 -1
  169. package/lib/material-display-bar/index.less +2 -1
  170. package/lib/material-display-bar/var.less +1 -0
  171. package/lib/number-keyboard/style/index.js +2 -0
  172. package/lib/number-keyboard/style/less.js +2 -0
  173. package/lib/object-select/ObjectSelect.js +13 -1
  174. package/lib/picker/style/index.js +2 -0
  175. package/lib/picker/style/less.js +2 -0
  176. package/lib/progress/Progress.d.ts +17 -0
  177. package/lib/progress/Progress.js +13 -8
  178. package/lib/progress/index.css +1 -1
  179. package/lib/progress/index.d.ts +12 -1
  180. package/lib/progress/index.less +24 -14
  181. package/lib/progress/types.d.ts +1 -0
  182. package/lib/progress/var.less +10 -7
  183. package/lib/pull-refresh/style/index.js +2 -0
  184. package/lib/pull-refresh/style/less.js +2 -0
  185. package/lib/style/base.css +1 -1
  186. package/lib/style/base.less +5 -0
  187. package/lib/style/css-variables.css +1 -1
  188. package/lib/style/css-variables.less +1 -0
  189. package/lib/style/var.less +1 -0
  190. package/lib/switch/style/index.js +2 -0
  191. package/lib/switch/style/less.js +2 -0
  192. package/lib/title-bar/TitleBar.d.ts +5 -1
  193. package/lib/title-bar/TitleBar.js +5 -3
  194. package/lib/title-bar/index.css +1 -1
  195. package/lib/title-bar/index.d.ts +4 -1
  196. package/lib/title-bar/index.less +6 -1
  197. package/lib/title-bar/var.less +2 -0
  198. package/lib/tree-select/TreeSelect.js +9 -4
  199. package/lib/tree-select/index.css +1 -1
  200. package/lib/tree-select/index.less +29 -1
  201. package/lib/uploader/Uploader.d.ts +7 -0
  202. package/lib/uploader/Uploader.js +53 -28
  203. package/lib/uploader/UploaderPreviewItem.d.ts +2 -1
  204. package/lib/uploader/UploaderPreviewItem.js +12 -5
  205. package/lib/uploader/index.css +1 -1
  206. package/lib/uploader/index.d.ts +5 -0
  207. package/lib/uploader/index.less +30 -0
  208. package/lib/uploader/types.d.ts +1 -0
  209. package/lib/uploader/utils.d.ts +2 -0
  210. package/lib/uploader/utils.js +74 -0
  211. package/lib/uploader/var.less +5 -0
  212. package/lib/vant.cjs.js +482 -170
  213. package/lib/vant.es.js +482 -170
  214. package/lib/vant.js +482 -170
  215. package/lib/vant.min.js +1 -1
  216. package/lib/web-types.json +1 -1
  217. package/lib/work-order-card/WorkOrderCard.js +52 -11
  218. package/lib/work-order-card/index.css +1 -1
  219. package/lib/work-order-card/index.less +3 -4
  220. package/lib/work-order-card/style/index.js +2 -0
  221. package/lib/work-order-card/style/less.js +2 -0
  222. package/lib/work-order-card/types.d.ts +14 -1
  223. package/package.json +2 -2
  224. package/skills/use-persagy-vant/SKILL.md +4 -3
  225. package/skills/use-persagy-vant/references/component-documentation.md +8 -8
  226. package/skills/use-persagy-vant/references/component-variant-selection.md +53 -0
  227. package/skills/use-persagy-vant/references/design-interaction-baseline.md +2 -1
  228. package/skills/use-persagy-vant/references/page-recipes.md +4 -0
  229. package/skills/use-persagy-vant/references/reuse-policy.md +9 -6
  230. /package/es/{loading/assets/building.gif → icon/assets/gif/loading-building.gif} +0 -0
  231. /package/lib/{loading/assets/building.gif → icon/assets/gif/loading-building.gif} +0 -0
@@ -5,16 +5,20 @@
5
5
  --van-title-bar-gap: @title-bar-gap;
6
6
  --van-title-bar-title-color: @title-bar-title-color;
7
7
  --van-title-bar-description-color: @title-bar-description-color;
8
+ --van-title-bar-required-color: @title-bar-required-color;
8
9
  --van-title-bar-action-divider-before-gap: @title-bar-action-divider-before-gap;
9
10
  --van-title-bar-action-divider-after-gap: @title-bar-action-divider-after-gap;
10
11
  --van-title-bar-action-divider-color: @title-bar-action-divider-color;
11
12
  --van-title-bar-action-divider-height: @title-bar-action-divider-height;
13
+ --van-title-bar-action-padding: @title-bar-action-padding;
12
14
  }
13
15
 
14
16
  .van-title-bar {
15
17
  color: var(--van-title-bar-title-color);
16
18
 
17
19
  &__header { display: flex; align-items: flex-start; width: 100%; padding: var(--van-title-bar-padding); color: inherit; font: inherit; text-align: left; background: transparent; border: 0; }
20
+ &--required &__header { position: relative; overflow: visible; }
21
+ &--required &__header::before { position: absolute; top: 12px; left: var(--van-padding-xs); color: var(--van-title-bar-required-color); font-size: var(--van-font-size-md); line-height: var(--van-line-height-lg); content: '*'; }
18
22
  &--expandable &__header { cursor: pointer; &:active { background: var(--van-active-color); } }
19
23
  &__icon { flex: none; margin: 3px 4px 0 0; font-size: 16px; }
20
24
  &__text { display: flex; flex: 1; flex-direction: column; min-width: 0; }
@@ -23,11 +27,12 @@
23
27
  &__description { overflow: hidden; color: var(--van-title-bar-description-color); font-size: var(--van-font-size-sm); font-weight: 400; line-height: var(--van-line-height-md); text-overflow: ellipsis; white-space: nowrap; }
24
28
  &__action { display: flex; flex: none; align-items: center; margin-left: var(--van-title-bar-action-divider-before-gap); }
25
29
  &__action-divider { width: 1px; height: var(--van-title-bar-action-divider-height); margin-right: var(--van-title-bar-action-divider-after-gap); background: var(--van-title-bar-action-divider-color); }
26
- &__action .van-button { flex: none; }
30
+ &__action .van-button { flex: none; height: var(--van-line-height-lg); padding: var(--van-title-bar-action-padding); font-size: var(--van-font-size-md); font-weight: var(--van-font-weight-bold); line-height: var(--van-line-height-lg); }
27
31
  &__arrow { flex: none; margin: 4px 0 0 8px; color: var(--van-gray-6); font-size: 14px; transition: transform var(--van-animation-duration-fast); transform: rotate(180deg); }
28
32
  &__arrow--expanded { transform: rotate(0); }
29
33
  &--mini &__header { padding-top: 12px; padding-bottom: 4px; }
30
34
  &--mini &__text strong { font-size: var(--van-font-size-sm); line-height: var(--van-line-height-md); }
31
35
  &--mini &__icon { margin-top: 3px; font-size: 14px; }
32
36
  &--mini &__arrow { margin-top: 3px; }
37
+ &--mini &__action .van-button { height: var(--van-line-height-md); font-size: var(--van-font-size-sm); line-height: var(--van-line-height-md); }
33
38
  }
@@ -4,7 +4,9 @@
4
4
  @title-bar-gap: 4px;
5
5
  @title-bar-title-color: var(--van-gray-8);
6
6
  @title-bar-description-color: var(--van-gray-6);
7
+ @title-bar-required-color: var(--van-danger-color);
7
8
  @title-bar-action-divider-before-gap: 8px;
8
9
  @title-bar-action-divider-after-gap: 2px;
9
10
  @title-bar-action-divider-color: var(--van-gray-4);
10
11
  @title-bar-action-divider-height: 12px;
12
+ @title-bar-action-padding: 0 8px;
@@ -41,6 +41,10 @@ var stdin_default = defineComponent({
41
41
  const expandedKeys = computed(() => props.expandedKeys);
42
42
  const isExpanded = (id) => expandedKeys.value.includes(id);
43
43
  const isSelected = (id) => selectedKeys.value.includes(id);
44
+ const getNodeStyle = (level) => ({
45
+ paddingLeft: `calc(var(--van-padding-md) + ${level * 16}px)`,
46
+ "--van-tree-select-divider-left": `calc(var(--van-padding-md) + ${level * 16}px)`
47
+ });
44
48
  const getDescendantIds = (item) => {
45
49
  var _a;
46
50
  return ((_a = item.children) == null ? void 0 : _a.flatMap((child) => [child.id, ...getDescendantIds(child)])) || [];
@@ -103,7 +107,10 @@ var stdin_default = defineComponent({
103
107
  if (!hasChildren && slots.leaf) {
104
108
  return _createVNode("div", {
105
109
  "key": item.id,
106
- "class": bem("node")
110
+ "class": [bem("node"), bem("leaf", {
111
+ divider: props.showDivider
112
+ })],
113
+ "style": getNodeStyle(level)
107
114
  }, [slots.leaf({
108
115
  item,
109
116
  level
@@ -120,9 +127,7 @@ var stdin_default = defineComponent({
120
127
  }),
121
128
  "title": item.text,
122
129
  "border": props.showDivider,
123
- "style": {
124
- paddingLeft: `calc(var(--van-padding-md) + ${level * 16}px)`
125
- },
130
+ "style": getNodeStyle(level),
126
131
  "rightSelect": selectable && selectionState !== "indeterminate" ? selectionState === "checked" : void 0,
127
132
  "selectType": props.multiple ? "checkbox" : "radio",
128
133
  "onUpdate:rightSelect": (value) => updateSelected(item, value)
@@ -1 +1 @@
1
- :root{--van-tree-select-indent: var(--van-padding-md);--van-tree-select-arrow-size: 16px;--van-tree-select-animation-duration: .24s}.van-tree-select{overflow:hidden;color:var(--van-cell-text-color);background:var(--van-white)}.van-tree-select__node{overflow:hidden}.van-tree-select__cell{min-height:44px;padding:10px var(--van-padding-md)}.van-tree-select__cell .van-cell__title-row{align-items:center}.van-tree-select__cell .van-cell__title{font-size:var(--van-font-size-md);line-height:22px}.van-tree-select__node:not(:last-child)>.van-tree-select__cell:not(.van-cell--borderless):after{display:block}.van-tree-select__arrow{flex:none;margin-right:var(--van-padding-base);color:var(--van-gray-5);font-size:var(--van-tree-select-arrow-size);transition:transform var(--van-tree-select-animation-duration) ease}.van-tree-select__arrow--expanded{transform:rotate(0)}.van-tree-select__arrow:not(.van-tree-select__arrow--expanded){transform:rotate(-90deg)}.van-tree-select__expand-control{display:inline-flex;align-items:center;padding:0;color:inherit;font:inherit;line-height:inherit;text-align:left;background:transparent;border:0}.van-tree-select__expand-control:not(:disabled){cursor:pointer}.van-tree-select__expand-control:disabled{color:var(--van-text-color-3);cursor:not-allowed}.van-tree-select__children{overflow:hidden}.van-tree-select__indeterminate{position:relative;display:block;width:14px;height:14px;padding:0;background:var(--van-primary-color);border:0;border-radius:50%}.van-tree-select__indeterminate:after{position:absolute;top:calc(50% - 1px);right:25%;left:25%;height:2px;content:"";background:var(--van-white);border-radius:1px}.van-tree-select-expand-enter-active,.van-tree-select-expand-leave-active{overflow:hidden;transition:max-height var(--van-tree-select-animation-duration) ease,opacity var(--van-tree-select-animation-duration) ease}.van-tree-select-expand-enter-from,.van-tree-select-expand-leave-to{max-height:0;opacity:0}.van-tree-select-expand-enter-to,.van-tree-select-expand-leave-from{max-height:1000px;opacity:1}
1
+ :root{--van-tree-select-indent: var(--van-padding-md);--van-tree-select-arrow-size: 16px;--van-tree-select-animation-duration: .24s;--van-tree-select-divider-left: var(--van-padding-md)}.van-tree-select{overflow:hidden;color:var(--van-cell-text-color);background:var(--van-white)}.van-tree-select__node{overflow:hidden}.van-tree-select__leaf{position:relative;box-sizing:border-box}.van-tree-select__leaf--divider:not(:last-child):after{position:absolute;right:var(--van-padding-md);bottom:0;left:var(--van-tree-select-divider-left);height:1px;background:var(--van-border-color);content:"";transform:scaleY(.5)}.van-tree-select__cell{min-height:44px;padding:10px var(--van-padding-md)}.van-tree-select__cell .van-cell__title-row{align-items:center}.van-tree-select__cell .van-cell__title{font-size:var(--van-font-size-md);line-height:22px}.van-tree-select__node:not(:last-child)>.van-tree-select__cell:not(.van-cell--borderless):after{display:block;left:var(--van-tree-select-divider-left)}.van-tree-select__cell--branch:not(.van-cell--borderless):after{display:block;left:var(--van-tree-select-divider-left)}.van-tree-select__arrow{flex:none;margin-right:var(--van-padding-base);color:var(--van-gray-5);font-size:var(--van-tree-select-arrow-size);transition:transform var(--van-tree-select-animation-duration) ease}.van-tree-select__arrow--expanded{transform:rotate(0)}.van-tree-select__arrow:not(.van-tree-select__arrow--expanded){transform:rotate(-90deg)}.van-tree-select__expand-control{display:inline-flex;align-items:center;padding:0;color:inherit;font:inherit;line-height:inherit;text-align:left;background:transparent;border:0}.van-tree-select__expand-control:not(:disabled){cursor:pointer}.van-tree-select__expand-control:disabled{color:var(--van-text-color-3);cursor:not-allowed}.van-tree-select__children{overflow:hidden}.van-tree-select__indeterminate{position:relative;display:block;width:14px;height:14px;padding:0;background:var(--van-primary-color);border:0;border-radius:50%}.van-tree-select__indeterminate:after{position:absolute;top:calc(50% - 1px);right:25%;left:25%;height:2px;content:"";background:var(--van-white);border-radius:1px}.van-tree-select-expand-enter-active,.van-tree-select-expand-leave-active{overflow:hidden;transition:max-height var(--van-tree-select-animation-duration) ease,opacity var(--van-tree-select-animation-duration) ease}.van-tree-select-expand-enter-from,.van-tree-select-expand-leave-to{max-height:0;opacity:0}.van-tree-select-expand-enter-to,.van-tree-select-expand-leave-from{max-height:1000px;opacity:1}
@@ -4,6 +4,7 @@
4
4
  --van-tree-select-indent: @tree-select-indent;
5
5
  --van-tree-select-arrow-size: @tree-select-arrow-size;
6
6
  --van-tree-select-animation-duration: @tree-select-animation-duration;
7
+ --van-tree-select-divider-left: var(--van-padding-md);
7
8
  }
8
9
 
9
10
  .van-tree-select {
@@ -13,6 +14,26 @@
13
14
 
14
15
  &__node { overflow: hidden; }
15
16
 
17
+ // Slot content keeps the same left hierarchy as regular tree nodes. Embedded
18
+ // components retain their own right padding to avoid doubling the edge gap.
19
+ &__leaf {
20
+ position: relative;
21
+ box-sizing: border-box;
22
+
23
+ // Leaf-slot items are wrapped by separate tree nodes, so restore the
24
+ // divider between adjacent leaves just as we do for regular Cell nodes.
25
+ &--divider:not(:last-child)::after {
26
+ position: absolute;
27
+ right: var(--van-padding-md);
28
+ bottom: 0;
29
+ left: var(--van-tree-select-divider-left);
30
+ height: 1px;
31
+ background: var(--van-border-color);
32
+ content: '';
33
+ transform: scaleY(.5);
34
+ }
35
+ }
36
+
16
37
  &__cell {
17
38
  min-height: 44px;
18
39
  padding: 10px var(--van-padding-md);
@@ -22,9 +43,16 @@
22
43
  }
23
44
 
24
45
  // Each Cell is wrapped by a tree node, so Cell's :last-child rule would
25
- // otherwise hide every divider. Restore it between sibling tree nodes.
46
+ // otherwise hide every divider. Branches retain a divider even when they
47
+ // are the only sibling, separating the parent from its indented children.
26
48
  &__node:not(:last-child) > &__cell:not(.van-cell--borderless)::after {
27
49
  display: block;
50
+ left: var(--van-tree-select-divider-left);
51
+ }
52
+
53
+ &__cell--branch:not(.van-cell--borderless)::after {
54
+ display: block;
55
+ left: var(--van-tree-select-divider-left);
28
56
  }
29
57
 
30
58
  &__arrow {
@@ -14,6 +14,8 @@ declare const uploaderProps: {
14
14
  };
15
15
  capture: StringConstructor;
16
16
  multiple: BooleanConstructor;
17
+ label: StringConstructor;
18
+ required: BooleanConstructor;
17
19
  disabled: BooleanConstructor;
18
20
  readonly: BooleanConstructor;
19
21
  lazyLoad: BooleanConstructor;
@@ -76,6 +78,8 @@ declare const _default: import("vue").DefineComponent<{
76
78
  };
77
79
  capture: StringConstructor;
78
80
  multiple: BooleanConstructor;
81
+ label: StringConstructor;
82
+ required: BooleanConstructor;
79
83
  disabled: BooleanConstructor;
80
84
  readonly: BooleanConstructor;
81
85
  lazyLoad: BooleanConstructor;
@@ -136,6 +140,8 @@ declare const _default: import("vue").DefineComponent<{
136
140
  };
137
141
  capture: StringConstructor;
138
142
  multiple: BooleanConstructor;
143
+ label: StringConstructor;
144
+ required: BooleanConstructor;
139
145
  disabled: BooleanConstructor;
140
146
  readonly: BooleanConstructor;
141
147
  lazyLoad: BooleanConstructor;
@@ -193,6 +199,7 @@ declare const _default: import("vue").DefineComponent<{
193
199
  "onClose-preview"?: ((...args: any[]) => any) | undefined;
194
200
  "onClick-preview"?: ((...args: any[]) => any) | undefined;
195
201
  }, {
202
+ required: boolean;
196
203
  name: string | number;
197
204
  accept: string;
198
205
  disabled: boolean;
@@ -1,6 +1,26 @@
1
- import { ref, reactive, defineComponent, onBeforeUnmount, mergeProps as _mergeProps, createVNode as _createVNode } from "vue";
1
+ var __async = (__this, __arguments, generator) => {
2
+ return new Promise((resolve, reject) => {
3
+ var fulfilled = (value) => {
4
+ try {
5
+ step(generator.next(value));
6
+ } catch (e) {
7
+ reject(e);
8
+ }
9
+ };
10
+ var rejected = (value) => {
11
+ try {
12
+ step(generator.throw(value));
13
+ } catch (e) {
14
+ reject(e);
15
+ }
16
+ };
17
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
+ step((generator = generator.apply(__this, __arguments)).next());
19
+ });
20
+ };
21
+ import { ref, reactive, defineComponent, onBeforeUnmount, mergeProps as _mergeProps, createVNode as _createVNode, createTextVNode as _createTextVNode } from "vue";
2
22
  import { pick, extend, toArray, isPromise, truthProp, getSizeStyle, makeArrayProp, makeStringProp, makeNumericProp } from "../utils/index.mjs";
3
- import { bem, name, isOversize, filterFiles, isImageFile, readFileContent } from "./utils.mjs";
23
+ import { bem, name, isOversize, filterFiles, isImageFile, isVideoFile, readFileContent, createVideoThumbnail } from "./utils.mjs";
4
24
  import { useCustomFieldValue } from "@vant/use";
5
25
  import { useExpose } from "../composables/use-expose.mjs";
6
26
  import { Icon } from "../icon/index.mjs";
@@ -11,6 +31,8 @@ const uploaderProps = {
11
31
  accept: makeStringProp("image/*"),
12
32
  capture: String,
13
33
  multiple: Boolean,
34
+ label: String,
35
+ required: Boolean,
14
36
  disabled: Boolean,
15
37
  readonly: Boolean,
16
38
  lazyLoad: Boolean,
@@ -80,37 +102,29 @@ var stdin_default = defineComponent({
80
102
  modelValue,
81
103
  resultType
82
104
  } = props;
105
+ const createFileItem = (file) => __async(this, null, function* () {
106
+ const content = yield readFileContent(file, resultType);
107
+ const result = {
108
+ file,
109
+ status: "",
110
+ message: ""
111
+ };
112
+ if (content) {
113
+ result.content = content;
114
+ }
115
+ if (isVideoFile(result)) {
116
+ result.videoThumbnail = yield createVideoThumbnail(file);
117
+ }
118
+ return result;
119
+ });
83
120
  if (Array.isArray(files)) {
84
121
  const remainCount = +maxCount - modelValue.length;
85
122
  if (files.length > remainCount) {
86
123
  files = files.slice(0, remainCount);
87
124
  }
88
- Promise.all(files.map((file) => readFileContent(file, resultType))).then((contents) => {
89
- const fileList = files.map((file, index) => {
90
- const result = {
91
- file,
92
- status: "",
93
- message: ""
94
- };
95
- if (contents[index]) {
96
- result.content = contents[index];
97
- }
98
- return result;
99
- });
100
- onAfterRead(fileList);
101
- });
125
+ Promise.all(files.map(createFileItem)).then(onAfterRead);
102
126
  } else {
103
- readFileContent(files, resultType).then((content) => {
104
- const result = {
105
- file: files,
106
- status: "",
107
- message: ""
108
- };
109
- if (content) {
110
- result.content = content;
111
- }
112
- onAfterRead(result);
113
- });
127
+ createFileItem(files).then(onAfterRead);
114
128
  }
115
129
  };
116
130
  const onChange = (event) => {
@@ -143,7 +157,7 @@ var stdin_default = defineComponent({
143
157
  let imagePreview;
144
158
  const onClosePreview = () => emit("close-preview");
145
159
  const previewImage = (item) => {
146
- if (props.previewFullImage) {
160
+ if (props.previewFullImage && isImageFile(item)) {
147
161
  const imageFiles = props.modelValue.filter(isImageFile);
148
162
  const images = imageFiles.map((item2) => {
149
163
  if (item2.file && !item2.url && item2.status !== "failed") {
@@ -186,6 +200,15 @@ var stdin_default = defineComponent({
186
200
  return props.modelValue.map(renderPreviewItem);
187
201
  }
188
202
  };
203
+ const renderLabel = () => {
204
+ if (!props.label)
205
+ return;
206
+ return _createVNode("div", {
207
+ "class": bem("label")
208
+ }, [props.required && _createVNode("span", {
209
+ "class": bem("required")
210
+ }, [_createTextVNode("*")]), props.label]);
211
+ };
189
212
  const onClickUpload = (event) => emit("click-upload", event);
190
213
  const renderUpload = () => {
191
214
  if (props.modelValue.length >= props.maxCount || !props.showUpload) {
@@ -234,8 +257,10 @@ var stdin_default = defineComponent({
234
257
  });
235
258
  useCustomFieldValue(() => props.modelValue);
236
259
  return () => _createVNode("div", {
237
- "class": bem()
238
- }, [_createVNode("div", {
260
+ "class": bem({
261
+ required: props.required && !props.label
262
+ })
263
+ }, [renderLabel(), _createVNode("div", {
239
264
  "class": bem("wrapper", {
240
265
  disabled: props.disabled
241
266
  })
@@ -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
  }, {
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, createVNode as _createVNode } from "vue";
2
- import { t, bem, isImageFile } from "./utils.mjs";
2
+ import { t, bem, isImageFile, isVideoFile } from "./utils.mjs";
3
3
  import { isDef, extend, numericProp, getSizeStyle, callInterceptor, makeRequiredProp } from "../utils/index.mjs";
4
4
  import { Icon } from "../icon/index.mjs";
5
5
  import { Image } from "../image/index.mjs";
@@ -15,7 +15,7 @@ var stdin_default = defineComponent({
15
15
  previewSize: [Number, String, Array],
16
16
  beforeDelete: Function
17
17
  },
18
- emits: ["delete", "preview"],
18
+ emits: ["delete", "preview", "click"],
19
19
  setup(props, {
20
20
  emit,
21
21
  slots
@@ -56,7 +56,11 @@ var stdin_default = defineComponent({
56
56
  done: () => emit("delete")
57
57
  });
58
58
  };
59
- const onPreview = () => emit("preview");
59
+ const onPreview = () => {
60
+ emit("preview");
61
+ emit("click");
62
+ };
63
+ const onFilePreview = () => emit("click");
60
64
  const renderDeleteIcon = () => {
61
65
  if (props.deletable && props.item.status !== "uploading") {
62
66
  const slot = slots["preview-delete"];
@@ -94,10 +98,12 @@ var stdin_default = defineComponent({
94
98
  imageFit,
95
99
  previewSize
96
100
  } = props;
97
- if (isImageFile(item)) {
101
+ const isImage = isImageFile(item);
102
+ const isVideo = isVideoFile(item);
103
+ if (isImage || isVideo && item.videoThumbnail) {
98
104
  return _createVNode(Image, {
99
105
  "fit": imageFit,
100
- "src": item.content || item.url,
106
+ "src": isVideo ? item.videoThumbnail : item.content || item.url,
101
107
  "class": bem("preview-image"),
102
108
  "width": Array.isArray(previewSize) ? previewSize[0] : previewSize,
103
109
  "height": Array.isArray(previewSize) ? previewSize[1] : previewSize,
@@ -109,7 +115,8 @@ var stdin_default = defineComponent({
109
115
  }
110
116
  return _createVNode("div", {
111
117
  "class": bem("file"),
112
- "style": getSizeStyle(props.previewSize)
118
+ "style": getSizeStyle(props.previewSize),
119
+ "onClick": onFilePreview
113
120
  }, [_createVNode(Icon, {
114
121
  "class": bem("file-icon"),
115
122
  "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>;
@@ -41,6 +41,7 @@ function filterFiles(items, maxSize) {
41
41
  return { valid, invalid };
42
42
  }
43
43
  const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;
44
+ const VIDEO_REGEXP = /\.(mp4|webm|ogg|mov)(?:$|\?)/i;
44
45
  const isImageUrl = (url) => IMAGE_REGEXP.test(url);
45
46
  function isImageFile(item) {
46
47
  if (item.isImage) {
@@ -57,12 +58,85 @@ function isImageFile(item) {
57
58
  }
58
59
  return false;
59
60
  }
61
+ function isVideoFile(item) {
62
+ var _a;
63
+ if ((_a = item.file) == null ? void 0 : _a.type) {
64
+ return item.file.type.indexOf("video/") === 0;
65
+ }
66
+ if (item.url) {
67
+ return VIDEO_REGEXP.test(item.url);
68
+ }
69
+ return typeof item.content === "string" && item.content.indexOf("data:video") === 0;
70
+ }
71
+ function createVideoThumbnail(file) {
72
+ if (typeof document === "undefined" || typeof URL === "undefined" || typeof URL.createObjectURL !== "function") {
73
+ return Promise.resolve(void 0);
74
+ }
75
+ return new Promise((resolve) => {
76
+ const video = document.createElement("video");
77
+ const objectUrl = URL.createObjectURL(file);
78
+ let settled = false;
79
+ let timeout;
80
+ const cleanup = () => {
81
+ if (timeout !== void 0) {
82
+ window.clearTimeout(timeout);
83
+ }
84
+ URL.revokeObjectURL(objectUrl);
85
+ video.removeAttribute("src");
86
+ try {
87
+ video.load();
88
+ } catch (e) {
89
+ }
90
+ };
91
+ const done = (thumbnail) => {
92
+ if (settled)
93
+ return;
94
+ settled = true;
95
+ cleanup();
96
+ resolve(thumbnail);
97
+ };
98
+ const captureFrame = () => {
99
+ if (!video.videoWidth || !video.videoHeight) {
100
+ done();
101
+ return;
102
+ }
103
+ const canvas = document.createElement("canvas");
104
+ canvas.width = video.videoWidth;
105
+ canvas.height = video.videoHeight;
106
+ const context = canvas.getContext("2d");
107
+ if (!context) {
108
+ done();
109
+ return;
110
+ }
111
+ context.drawImage(video, 0, 0, canvas.width, canvas.height);
112
+ done(canvas.toDataURL("image/jpeg", 0.8));
113
+ };
114
+ video.muted = true;
115
+ video.playsInline = true;
116
+ video.preload = "auto";
117
+ video.onloadedmetadata = () => {
118
+ const duration = Number.isFinite(video.duration) ? video.duration : 0.1;
119
+ const frameTime = Math.min(0.1, Math.max(duration - 0.01, 0));
120
+ if (frameTime) {
121
+ video.currentTime = frameTime;
122
+ } else {
123
+ captureFrame();
124
+ }
125
+ };
126
+ video.onseeked = captureFrame;
127
+ video.onerror = () => done();
128
+ video.src = objectUrl;
129
+ timeout = window.setTimeout(() => done(), 3e3);
130
+ });
131
+ }
60
132
  export {
61
133
  bem,
134
+ createVideoThumbnail,
62
135
  filterFiles,
63
136
  isImageFile,
64
137
  isImageUrl,
65
138
  isOversize,
139
+ isVideoFile,
66
140
  name,
67
141
  readFileContent,
68
142
  t
@@ -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);