vft 0.0.1

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 (321) hide show
  1. package/package.json +54 -0
  2. package/src/app/index.ts +3 -0
  3. package/src/app/page-loading/assets/spin.gif +0 -0
  4. package/src/app/page-loading/index.less +10 -0
  5. package/src/app/page-loading/index.ts +3 -0
  6. package/src/app/page-loading/index.vue +38 -0
  7. package/src/app/table/assets/sort_triangle.png +0 -0
  8. package/src/app/table/demos/basic.vue +117 -0
  9. package/src/app/table/demos/complex.vue +2543 -0
  10. package/src/app/table/demos/index.vue +453 -0
  11. package/src/app/table/demos/rightAngle.png +0 -0
  12. package/src/app/table/header.vue +203 -0
  13. package/src/app/table/index.less +119 -0
  14. package/src/app/table/index.ts +5 -0
  15. package/src/app/table/index.vue +478 -0
  16. package/src/app/table/md/api.md +23 -0
  17. package/src/app/table/md/demo.md +3 -0
  18. package/src/app/table/types.ts +45 -0
  19. package/src/common/badge/index.scss +78 -0
  20. package/src/common/badge/index.ts +4 -0
  21. package/src/common/badge/index.vue +111 -0
  22. package/src/common/badge/types.ts +1 -0
  23. package/src/common/clamp/clamp-toggle.vue +91 -0
  24. package/src/common/clamp/index.ts +4 -0
  25. package/src/common/clamp/index.vue +247 -0
  26. package/src/common/code/index.less +321 -0
  27. package/src/common/code/index.ts +3 -0
  28. package/src/common/code/index.vue +60 -0
  29. package/src/common/config-provider/index.ts +4 -0
  30. package/src/common/config-provider/index.vue +94 -0
  31. package/src/common/config-provider/types.ts +29 -0
  32. package/src/common/icon/iconfont/iconfont.css +334 -0
  33. package/src/common/icon/index.scss +31 -0
  34. package/src/common/icon/index.ts +4 -0
  35. package/src/common/icon/index.vue +74 -0
  36. package/src/common/icon/types.ts +16 -0
  37. package/src/common/index.ts +6 -0
  38. package/src/common/message/index.ts +5 -0
  39. package/src/common/message/instance.ts +29 -0
  40. package/src/common/message/message.scss +108 -0
  41. package/src/common/message/message.ts +80 -0
  42. package/src/common/message/message.vue +162 -0
  43. package/src/common/message/method.ts +172 -0
  44. package/src/common/overlay/index.scss +14 -0
  45. package/src/common/overlay/index.ts +3 -0
  46. package/src/common/overlay/index.vue +117 -0
  47. package/src/constants/comp.ts +1 -0
  48. package/src/constants/index.ts +1 -0
  49. package/src/index.ts +3 -0
  50. package/src/page/index.ts +1 -0
  51. package/src/page/page-wrapper/index.scss +31 -0
  52. package/src/page/page-wrapper/index.ts +5 -0
  53. package/src/page/page-wrapper/index.vue +31 -0
  54. package/src/styles/vars.scss +500 -0
  55. package/src/use/index.ts +14 -0
  56. package/src/use/onPopupReopen.ts +15 -0
  57. package/src/use/use-delayed-toggle/index.ts +30 -0
  58. package/src/use/use-floating/index.ts +121 -0
  59. package/src/use/use-forward-ref.ts +35 -0
  60. package/src/use/use-global-config/index.ts +81 -0
  61. package/src/use/use-id/index.ts +43 -0
  62. package/src/use/use-model-toggle/index.ts +151 -0
  63. package/src/use/use-namespace/index.ts +91 -0
  64. package/src/use/use-ordered-children/index.ts +43 -0
  65. package/src/use/use-popper-container/index.ts +43 -0
  66. package/src/use/use-timeout/index.ts +18 -0
  67. package/src/use/use-z-index/index.ts +20 -0
  68. package/src/use/useGlobalZIndex.ts +24 -0
  69. package/src/use/useLazyRender.ts +17 -0
  70. package/src/use/useLockScroll.ts +66 -0
  71. package/src/utils/aria.ts +126 -0
  72. package/src/utils/arrays.ts +13 -0
  73. package/src/utils/error.ts +23 -0
  74. package/src/utils/event.ts +15 -0
  75. package/src/utils/helper.ts +7 -0
  76. package/src/utils/index.ts +8 -0
  77. package/src/utils/interceptor.ts +39 -0
  78. package/src/utils/mount-component.ts +65 -0
  79. package/src/utils/popper.ts +6 -0
  80. package/src/utils/rand.ts +12 -0
  81. package/src/utils/scroll.ts +101 -0
  82. package/src/utils/vnode.ts +169 -0
  83. package/src/web/avatar/index.scss +50 -0
  84. package/src/web/avatar/index.ts +3 -0
  85. package/src/web/avatar/index.vue +83 -0
  86. package/src/web/back-top/index.scss +35 -0
  87. package/src/web/back-top/index.ts +3 -0
  88. package/src/web/back-top/index.vue +72 -0
  89. package/src/web/back-top/types.ts +14 -0
  90. package/src/web/back-top/use-back-top.ts +65 -0
  91. package/src/web/cascader/index.scss +214 -0
  92. package/src/web/cascader/index.ts +5 -0
  93. package/src/web/cascader/index.vue +767 -0
  94. package/src/web/cascader-panel/config.ts +44 -0
  95. package/src/web/cascader-panel/index.scss +134 -0
  96. package/src/web/cascader-panel/index.ts +5 -0
  97. package/src/web/cascader-panel/index.vue +319 -0
  98. package/src/web/cascader-panel/menu.vue +135 -0
  99. package/src/web/cascader-panel/node-content.ts +23 -0
  100. package/src/web/cascader-panel/node.ts +218 -0
  101. package/src/web/cascader-panel/node.vue +197 -0
  102. package/src/web/cascader-panel/store.ts +83 -0
  103. package/src/web/cascader-panel/types.ts +56 -0
  104. package/src/web/cascader-panel/utils.ts +40 -0
  105. package/src/web/cascader-select/README.md +31 -0
  106. package/src/web/cascader-select/index.scss +54 -0
  107. package/src/web/cascader-select/index.ts +5 -0
  108. package/src/web/cascader-select/index.vue +132 -0
  109. package/src/web/cascader-select/types.ts +9 -0
  110. package/src/web/context-menu/createContextMenu.ts +72 -0
  111. package/src/web/context-menu/index.ts +4 -0
  112. package/src/web/context-menu/index.vue +89 -0
  113. package/src/web/context-menu/types.ts +27 -0
  114. package/src/web/context-menu/useContextMenu.ts +14 -0
  115. package/src/web/descriptions/description-item.vue +34 -0
  116. package/src/web/descriptions/description.vue +124 -0
  117. package/src/web/descriptions/descriptions-cell.ts +95 -0
  118. package/src/web/descriptions/descriptions-item.scss +68 -0
  119. package/src/web/descriptions/descriptions-row.vue +49 -0
  120. package/src/web/descriptions/descriptions.scss +153 -0
  121. package/src/web/descriptions/descriptions.type.ts +19 -0
  122. package/src/web/descriptions/index.ts +4 -0
  123. package/src/web/descriptions/token.ts +4 -0
  124. package/src/web/divider/index.scss +53 -0
  125. package/src/web/divider/index.ts +5 -0
  126. package/src/web/divider/index.vue +60 -0
  127. package/src/web/divider/types.ts +2 -0
  128. package/src/web/empty/assets/no-collect.png +0 -0
  129. package/src/web/empty/assets/no-data.png +0 -0
  130. package/src/web/empty/assets/no-filter.png +0 -0
  131. package/src/web/empty/assets/no-page-data.png +0 -0
  132. package/src/web/empty/assets/no-search.png +0 -0
  133. package/src/web/empty/constants.ts +12 -0
  134. package/src/web/empty/index.scss +57 -0
  135. package/src/web/empty/index.ts +5 -0
  136. package/src/web/empty/index.vue +96 -0
  137. package/src/web/exception/exception.png +0 -0
  138. package/src/web/exception/index.ts +3 -0
  139. package/src/web/exception/index.vue +44 -0
  140. package/src/web/filter/README.md +25 -0
  141. package/src/web/filter/index.scss +14 -0
  142. package/src/web/filter/index.ts +5 -0
  143. package/src/web/filter/index.vue +60 -0
  144. package/src/web/filter/type.ts +13 -0
  145. package/src/web/focus-trap/index.ts +6 -0
  146. package/src/web/focus-trap/index.vue +328 -0
  147. package/src/web/focus-trap/tokens.ts +23 -0
  148. package/src/web/focus-trap/utils.ts +178 -0
  149. package/src/web/full-screen/index.scss +22 -0
  150. package/src/web/full-screen/index.ts +3 -0
  151. package/src/web/full-screen/index.vue +24 -0
  152. package/src/web/icon-text/index.ts +3 -0
  153. package/src/web/icon-text/index.vue +77 -0
  154. package/src/web/image/index.scss +46 -0
  155. package/src/web/image/index.ts +5 -0
  156. package/src/web/image/index.vue +251 -0
  157. package/src/web/image/types.ts +1 -0
  158. package/src/web/index.ts +33 -0
  159. package/src/web/input/index.scss +473 -0
  160. package/src/web/input/index.ts +3 -0
  161. package/src/web/input/index.vue +533 -0
  162. package/src/web/input/utils.ts +102 -0
  163. package/src/web/layouts/blank.vue +4 -0
  164. package/src/web/layouts/footer/index.scss +31 -0
  165. package/src/web/layouts/footer/index.ts +3 -0
  166. package/src/web/layouts/footer/index.vue +38 -0
  167. package/src/web/layouts/header/index.scss +35 -0
  168. package/src/web/layouts/header/index.ts +3 -0
  169. package/src/web/layouts/header/index.vue +47 -0
  170. package/src/web/layouts/iframe/index.scss +18 -0
  171. package/src/web/layouts/iframe/index.vue +36 -0
  172. package/src/web/layouts/iframe/page.vue +30 -0
  173. package/src/web/layouts/index.ts +8 -0
  174. package/src/web/layouts/router-view-content/index.vue +70 -0
  175. package/src/web/link/index.scss +95 -0
  176. package/src/web/link/index.ts +3 -0
  177. package/src/web/link/index.vue +68 -0
  178. package/src/web/loading/directive.ts +104 -0
  179. package/src/web/loading/index.ts +6 -0
  180. package/src/web/loading/loading.scss +108 -0
  181. package/src/web/loading/loading.ts +156 -0
  182. package/src/web/loading/service.ts +145 -0
  183. package/src/web/loading/types.ts +29 -0
  184. package/src/web/logo/index.scss +31 -0
  185. package/src/web/logo/index.ts +5 -0
  186. package/src/web/logo/index.vue +45 -0
  187. package/src/web/logo/types.ts +6 -0
  188. package/src/web/menu/index.scss +336 -0
  189. package/src/web/menu/index.ts +8 -0
  190. package/src/web/menu/menu-collapse-transition.vue +62 -0
  191. package/src/web/menu/menu-item-group.vue +27 -0
  192. package/src/web/menu/menu-item.vue +126 -0
  193. package/src/web/menu/menu.vue +459 -0
  194. package/src/web/menu/sub-menu.vue +440 -0
  195. package/src/web/menu/types.ts +66 -0
  196. package/src/web/menu/use-menu-css-var.ts +11 -0
  197. package/src/web/menu/use-menu.ts +60 -0
  198. package/src/web/menu/utils/menu-bar.ts +19 -0
  199. package/src/web/menu/utils/menu-item.ts +55 -0
  200. package/src/web/menu/utils/submenu.ts +66 -0
  201. package/src/web/multiple-select-flat/index.ts +5 -0
  202. package/src/web/multiple-select-flat/index.vue +53 -0
  203. package/src/web/multiple-select-flat/types.ts +5 -0
  204. package/src/web/multiple-tabs/index.scss +16 -0
  205. package/src/web/multiple-tabs/index.ts +5 -0
  206. package/src/web/multiple-tabs/index.vue +193 -0
  207. package/src/web/multiple-tabs/tab-content.vue +40 -0
  208. package/src/web/multiple-tabs/types.ts +3 -0
  209. package/src/web/multiple-tabs/use/index.ts +2 -0
  210. package/src/web/multiple-tabs/use/use-multiple-tabs.ts +86 -0
  211. package/src/web/multiple-tabs/use/use-tab-dropdown.ts +101 -0
  212. package/src/web/nodata/README.md +42 -0
  213. package/src/web/nodata/fail.vue +13 -0
  214. package/src/web/nodata/img/100.png +0 -0
  215. package/src/web/nodata/img/101.png +0 -0
  216. package/src/web/nodata/img/102.png +0 -0
  217. package/src/web/nodata/img/103.png +0 -0
  218. package/src/web/nodata/img/104.png +0 -0
  219. package/src/web/nodata/img/105.png +0 -0
  220. package/src/web/nodata/img/106.png +0 -0
  221. package/src/web/nodata/img/107.png +0 -0
  222. package/src/web/nodata/img/200.png +0 -0
  223. package/src/web/nodata/img/201.png +0 -0
  224. package/src/web/nodata/img/202.png +0 -0
  225. package/src/web/nodata/img/203.png +0 -0
  226. package/src/web/nodata/index.scss +37 -0
  227. package/src/web/nodata/index.ts +6 -0
  228. package/src/web/nodata/index.vue +46 -0
  229. package/src/web/nodata/types.ts +17 -0
  230. package/src/web/only-child/index.tsx +69 -0
  231. package/src/web/pagination/components/jumper.vue +49 -0
  232. package/src/web/pagination/components/next.vue +40 -0
  233. package/src/web/pagination/components/pager.vue +215 -0
  234. package/src/web/pagination/components/prev.vue +35 -0
  235. package/src/web/pagination/components/sizes.vue +76 -0
  236. package/src/web/pagination/components/total.vue +21 -0
  237. package/src/web/pagination/index.scss +231 -0
  238. package/src/web/pagination/index.ts +5 -0
  239. package/src/web/pagination/pagination.ts +363 -0
  240. package/src/web/pagination/usePagination.ts +13 -0
  241. package/src/web/popover/directive.ts +21 -0
  242. package/src/web/popover/index.scss +58 -0
  243. package/src/web/popover/index.ts +3 -0
  244. package/src/web/popover/index.vue +161 -0
  245. package/src/web/popover/types.ts +26 -0
  246. package/src/web/popper/arrow.vue +45 -0
  247. package/src/web/popper/content.vue +311 -0
  248. package/src/web/popper/index.scss +108 -0
  249. package/src/web/popper/index.ts +11 -0
  250. package/src/web/popper/popper.vue +57 -0
  251. package/src/web/popper/tokens.ts +28 -0
  252. package/src/web/popper/trigger.vue +166 -0
  253. package/src/web/popper/types.ts +49 -0
  254. package/src/web/popper/utils.ts +81 -0
  255. package/src/web/qrcode/drawCanvas.ts +32 -0
  256. package/src/web/qrcode/drawLogo.ts +82 -0
  257. package/src/web/qrcode/index.ts +5 -0
  258. package/src/web/qrcode/index.vue +107 -0
  259. package/src/web/qrcode/qrcodePlus.ts +4 -0
  260. package/src/web/qrcode/toCanvas.ts +11 -0
  261. package/src/web/qrcode/types.ts +38 -0
  262. package/src/web/result/index.scss +69 -0
  263. package/src/web/result/index.ts +3 -0
  264. package/src/web/result/index.vue +63 -0
  265. package/src/web/scrollbar/bar.vue +48 -0
  266. package/src/web/scrollbar/index.scss +91 -0
  267. package/src/web/scrollbar/index.ts +5 -0
  268. package/src/web/scrollbar/index.vue +236 -0
  269. package/src/web/scrollbar/thumb.vue +183 -0
  270. package/src/web/scrollbar/tokens.ts +10 -0
  271. package/src/web/scrollbar/types.ts +7 -0
  272. package/src/web/scrollbar/util.ts +38 -0
  273. package/src/web/select/constants.ts +13 -0
  274. package/src/web/select/index.ts +11 -0
  275. package/src/web/select/index.vue +555 -0
  276. package/src/web/select/option-group.scss +49 -0
  277. package/src/web/select/option-group.vue +97 -0
  278. package/src/web/select/option-item.scss +66 -0
  279. package/src/web/select/option.scss +32 -0
  280. package/src/web/select/option.vue +110 -0
  281. package/src/web/select/select-dropdown.scss +86 -0
  282. package/src/web/select/select-dropdown.vue +51 -0
  283. package/src/web/select/select.scss +213 -0
  284. package/src/web/select/token.ts +56 -0
  285. package/src/web/select/useOption.ts +146 -0
  286. package/src/web/select/useSelect.ts +942 -0
  287. package/src/web/select/utils.ts +5 -0
  288. package/src/web/side-menu/index.scss +66 -0
  289. package/src/web/side-menu/index.ts +4 -0
  290. package/src/web/side-menu/index.vue +228 -0
  291. package/src/web/side-menu/types.ts +20 -0
  292. package/src/web/single-select/index.scss +60 -0
  293. package/src/web/single-select/index.ts +5 -0
  294. package/src/web/single-select/index.vue +70 -0
  295. package/src/web/single-select/select@2x.png +0 -0
  296. package/src/web/single-select/types.ts +5 -0
  297. package/src/web/svg/index.ts +3 -0
  298. package/src/web/svg/index.vue +22 -0
  299. package/src/web/tabs/index.scss +579 -0
  300. package/src/web/tabs/index.ts +6 -0
  301. package/src/web/tabs/index.vue +236 -0
  302. package/src/web/tabs/tab-bar.vue +90 -0
  303. package/src/web/tabs/tab-nav.vue +403 -0
  304. package/src/web/tabs/tab-pane.vue +90 -0
  305. package/src/web/tabs/types.ts +66 -0
  306. package/src/web/tag/index.scss +182 -0
  307. package/src/web/tag/index.ts +5 -0
  308. package/src/web/tag/index.vue +78 -0
  309. package/src/web/tag/types.ts +2 -0
  310. package/src/web/tooltip/content.vue +239 -0
  311. package/src/web/tooltip/index.ts +4 -0
  312. package/src/web/tooltip/tokens.ts +21 -0
  313. package/src/web/tooltip/tooltip.vue +270 -0
  314. package/src/web/tooltip/trigger.vue +119 -0
  315. package/src/web/tooltip/types.ts +56 -0
  316. package/src/web/tooltip/utils.ts +20 -0
  317. package/src/web/transition/collapse-transition.vue +73 -0
  318. package/src/web/transition/index.ts +5 -0
  319. package/tsconfig.json +8 -0
  320. package/types/component.ts +1 -0
  321. package/types/index.d.ts +286 -0
@@ -0,0 +1,83 @@
1
+ <template>
2
+ <span :class="avatarClass" :style="sizeStyle">
3
+ <img
4
+ v-if="(src || srcSet) && !hasLoadError"
5
+ :src="src"
6
+ :alt="alt"
7
+ :srcset="srcSet"
8
+ :style="fitStyle"
9
+ @error="handleError"
10
+ />
11
+ <Icon v-else-if="icon" />
12
+ <slot v-else />
13
+ </span>
14
+ </template>
15
+
16
+ <script lang="ts" setup>
17
+ import { addUnit, isNumber, isString } from '@vri/utils';
18
+ import type { CSSProperties } from 'vue';
19
+ import { computed, ref, watch } from 'vue';
20
+ import { Icon, type IconProps } from '../../common';
21
+ import { useNamespace } from '../../use';
22
+
23
+ interface Props {
24
+ size?: number | 'large' | 'default' | 'small'
25
+ shape?: 'circle' | 'square'
26
+ icon?: IconProps
27
+ src?: string
28
+ alt?: string
29
+ srcSet?: string
30
+ fit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down'
31
+ }
32
+
33
+ const {
34
+ size = '',
35
+ shape = 'circle',
36
+ icon,
37
+ src,
38
+ alt,
39
+ srcSet,
40
+ fit = 'cover'
41
+ } = defineProps<Props>();
42
+
43
+ const emit = defineEmits(['error']);
44
+
45
+ const ns = useNamespace('avatar');
46
+
47
+ const hasLoadError = ref(false);
48
+
49
+ const avatarClass = computed(() => {
50
+ const classList = [ns.b()];
51
+ if (isString(size)) classList.push(ns.m(size));
52
+ if (icon) classList.push(ns.m('icon'));
53
+ if (shape) classList.push(ns.m(shape));
54
+ return classList;
55
+ });
56
+
57
+ const sizeStyle = computed(() => {
58
+ return isNumber(size)
59
+ ? (ns.cssVarBlock({
60
+ size: addUnit(size) || ''
61
+ }) as CSSProperties)
62
+ : undefined;
63
+ });
64
+
65
+ const fitStyle = computed<CSSProperties>(() => ({
66
+ objectFit: fit
67
+ }));
68
+
69
+ // need reset hasLoadError to false if src changed
70
+ watch(
71
+ () => src,
72
+ () => (hasLoadError.value = false)
73
+ );
74
+
75
+ function handleError (e: Event) {
76
+ hasLoadError.value = true;
77
+ emit('error', e);
78
+ }
79
+ </script>
80
+
81
+ <style lang="scss">
82
+ @import "./index.scss";
83
+ </style>
@@ -0,0 +1,35 @@
1
+ $name: back-top;
2
+ $back-top: () !default;
3
+ $back-top: map-merge((
4
+ 'bg-color': getCssVar('bg-color', 'overlay'),
5
+ 'text-color': getCssVar('primary-color'),
6
+ 'hover-bg-color': getCssVar('border-color-extra-light'),
7
+ ), $back-top);
8
+
9
+ @include b($name) {
10
+ @include set-component-css-var('backtop', $back-top);
11
+
12
+ position: fixed;
13
+ background-color: getCssVar('backtop', 'bg-color');
14
+ width: 40px;
15
+ height: 40px;
16
+ border-radius: 50%;
17
+ color: getCssVar('backtop', 'text-color');
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ font-size: 20px;
22
+ box-shadow: getCssVar('box-shadow', 'lighter');
23
+ cursor: pointer;
24
+ z-index: 5;
25
+
26
+ &:hover {
27
+ background-color: getCssVar('backtop', 'hover-bg-color');
28
+ }
29
+
30
+ @include e(icon) {
31
+ font-size: 20px;
32
+ }
33
+ }
34
+
35
+
@@ -0,0 +1,3 @@
1
+ import BackTop from './index.vue';
2
+
3
+ export { BackTop };
@@ -0,0 +1,72 @@
1
+ <script lang="ts" setup>
2
+ import { singleAttrToObj } from '@vri/utils';
3
+ import { type IconProps, Icon } from '../../common';
4
+ import { useBackTop } from './use-back-top';
5
+ import { useNamespace } from '../../use';
6
+ import { computed, getCurrentInstance } from 'vue';
7
+
8
+ interface BackTopProps {
9
+ /** 滚动高度达到此参数值才出现 */
10
+ visibilityHeight?: number
11
+ /** 触发滚动的对象 */
12
+ target?: string
13
+ /** 控制其显示位置,距离页面右边距 */
14
+ right?: number
15
+ /** 控制其显示位置,距离页面底部距离 */
16
+ bottom?: number
17
+ /** 滚动 icon dom */
18
+ icon?: IconProps
19
+ }
20
+
21
+ const {
22
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
23
+ visibilityHeight = 200,
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ target,
26
+ right = 40,
27
+ bottom = 40,
28
+ icon = 'vi-back-top',
29
+ } = defineProps<BackTopProps>();
30
+
31
+ const emit = defineEmits(['click']);
32
+
33
+ const ns = /* hoist-static*/ useNamespace('back-top');
34
+
35
+ defineOptions({
36
+ name: ns.b()
37
+ });
38
+
39
+ const instance = getCurrentInstance()!;
40
+
41
+ const { handleClick, visible } = useBackTop(instance.props, emit, ns.b());
42
+
43
+ const backTopStyle = computed(() => ({
44
+ right: `${right}px`,
45
+ bottom: `${bottom}px`
46
+ }));
47
+
48
+ const _icon = computed(() => {
49
+ return singleAttrToObj(icon, 'icon', {
50
+ color: 'black'
51
+ }) as IconProps;
52
+ });
53
+ </script>
54
+
55
+ <template>
56
+ <transition :name="`${ns.namespace}-fade-in`">
57
+ <div
58
+ v-if="visible"
59
+ :style="backTopStyle"
60
+ :class="ns.b()"
61
+ @click.stop="handleClick"
62
+ >
63
+ <slot>
64
+ <Icon v-if="_icon?.icon" v-bind="_icon" />
65
+ </slot>
66
+ </div>
67
+ </transition>
68
+ </template>
69
+
70
+ <style lang="scss">
71
+ @import "./index.scss";
72
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { IconProps } from '../../common';
2
+
3
+ export interface BackTopProps {
4
+ /** 滚动高度达到此参数值才出现 */
5
+ visibilityHeight?: number;
6
+ /** 触发滚动的对象 */
7
+ target?: string;
8
+ /** 控制其显示位置,距离页面右边距 */
9
+ right?: number;
10
+ /** 控制其显示位置,距离页面底部距离 */
11
+ bottom?: number;
12
+ /** 滚动 icon dom */
13
+ icon?: IconProps;
14
+ }
@@ -0,0 +1,65 @@
1
+ import { onMounted, ref, shallowRef } from 'vue';
2
+ import { useEventListener, useThrottleFn, useTimeoutFn } from '@vueuse/core';
3
+ import { throwError } from '../../utils';
4
+ import { type BackTopProps } from './types';
5
+
6
+ export const useBackTop = (props: BackTopProps, emit: Function, componentName: string) => {
7
+ const el = shallowRef<HTMLElement>();
8
+ const container = shallowRef<Document | HTMLElement>();
9
+ const visible = ref(false);
10
+
11
+ const scrollToTop = () => {
12
+ if (!el.value) return;
13
+ el.value.scrollTo(({ left: 0, top: 0, behavior: 'smooth' }));
14
+ };
15
+
16
+ const handleScroll = () => {
17
+ if (el.value) visible.value = el.value.scrollTop >= props.visibilityHeight!;
18
+ };
19
+
20
+ const handleClick = (event: MouseEvent) => {
21
+ scrollToTop();
22
+ emit('click', event);
23
+ };
24
+
25
+ const handleScrollThrottled = useThrottleFn(handleScroll, 300, true);
26
+
27
+ useEventListener(container, 'scroll', handleScrollThrottled);
28
+
29
+ onMounted(() => {
30
+ container.value = document;
31
+ el.value = document.documentElement;
32
+
33
+ if (props.target) {
34
+ useTimeoutFn(() => {
35
+ el.value = document.querySelector<HTMLElement>(props.target!) ?? undefined;
36
+ if (!el.value) {
37
+ throwError(componentName, `target does not exist: ${props.target}`);
38
+ }
39
+ container.value = el.value;
40
+ }, 10);
41
+ }
42
+ });
43
+
44
+ // listener scroll target,if scroll target change,the scrollTop dom visible need also change
45
+ watch(
46
+ () => props.target,
47
+ (val) => {
48
+ nextTick(() => {
49
+ if (val) {
50
+ el.value = document.querySelector<HTMLElement>(val) ?? undefined;
51
+ if (!el.value) {
52
+ throwError(componentName, `target does not exist: ${val}`);
53
+ }
54
+ if (el.value) visible.value = el.value.scrollTop >= props.visibilityHeight!;
55
+ container.value = el.value;
56
+ }
57
+ });
58
+ }
59
+ );
60
+
61
+ return {
62
+ visible,
63
+ handleClick
64
+ };
65
+ };
@@ -0,0 +1,214 @@
1
+ @mixin cascader-tag-normal($background-color) {
2
+ .el-tag {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ max-width: 100%;
6
+ margin: 2px 0 2px 6px;
7
+ text-overflow: ellipsis;
8
+ background: $background-color;
9
+
10
+ &:not(.is-hit) {
11
+ border-color: transparent;
12
+ }
13
+
14
+ > span {
15
+ flex: 1;
16
+ overflow: hidden;
17
+ text-overflow: ellipsis;
18
+ }
19
+
20
+ .#{$namespace}-icon-close {
21
+ flex: none;
22
+ background-color: getCssVar('text-color', 'placeholder');
23
+ color: getCssVar('color-white');
24
+
25
+ &:hover {
26
+ background-color: getCssVar('text-color', 'secondary');
27
+ }
28
+ }
29
+ }
30
+ }
31
+
32
+ @include b(cascader) {
33
+ @include set-component-css-var('cascader', $cascader);
34
+
35
+ display: inline-block;
36
+ vertical-align: middle;
37
+ position: relative;
38
+ font-size: getCssVar('font-size', 'base');
39
+ line-height: map-get($input-height, 'default');
40
+ outline: none;
41
+
42
+ &:not(.is-disabled):hover {
43
+ .#{$namespace}-input__wrapper {
44
+ cursor: pointer;
45
+ box-shadow: 0 0 0 1px getCssVar('input', 'hover-border-color') inset;
46
+ }
47
+ }
48
+
49
+ .#{$namespace}-input {
50
+ display: flex;
51
+ cursor: pointer;
52
+
53
+ .#{$namespace}-input__inner {
54
+ text-overflow: ellipsis;
55
+ cursor: pointer;
56
+
57
+ &::selection {
58
+ outline: none;
59
+ }
60
+ }
61
+
62
+ .#{$namespace}-input__suffix-inner {
63
+ .#{$namespace}-icon {
64
+ height: calc(100% - 2px);
65
+
66
+ svg {
67
+ vertical-align: middle;
68
+ }
69
+ }
70
+ }
71
+
72
+ .icon-arrow-down {
73
+ transition: transform getCssVar('transition-duration');
74
+ font-size: 14px;
75
+
76
+ @include when(reverse) {
77
+ transform: rotateZ(180deg);
78
+ }
79
+ }
80
+
81
+ .icon-circle-close:hover {
82
+ color: var(
83
+ #{getCssVarName('input', 'clear-hover-color')},
84
+ map-get($input, 'clear-hover-color')
85
+ );
86
+ }
87
+
88
+ @include when(focus) {
89
+ .#{$namespace}-input__wrapper {
90
+ box-shadow: 0 0 0 1px
91
+ var(
92
+ #{getCssVarName('input', 'focus-border-color')},
93
+ map-get($input, 'focus-border-color')
94
+ )
95
+ inset;
96
+ }
97
+ }
98
+ }
99
+
100
+ @each $size in (large, small) {
101
+ @include m($size) {
102
+ font-size: map-get($input-font-size, $size);
103
+ line-height: map-get($input-height, $size);
104
+ }
105
+ }
106
+
107
+ @include when(disabled) {
108
+ .#{$namespace}-cascader__label {
109
+ z-index: calc(getCssVar('index', 'normal') + 1);
110
+ color: getCssVar('disabled-text-color');
111
+ }
112
+ }
113
+
114
+ @include e(dropdown) {
115
+ @include set-component-css-var('cascader', $cascader);
116
+ }
117
+
118
+ @include e(dropdown) {
119
+ font-size: getCssVar('cascader-menu-font-size');
120
+ border-radius: getCssVar('cascader-menu-radius');
121
+
122
+ @include picker-popper(
123
+ getCssVar('cascader-menu-fill'),
124
+ getCssVar('cascader-menu-border'),
125
+ getCssVar('cascader-menu-shadow')
126
+ );
127
+
128
+ &.#{$namespace}-popper {
129
+ box-shadow: getCssVar('cascader-menu-shadow');
130
+ }
131
+ }
132
+
133
+ @include e(tags) {
134
+ position: absolute;
135
+ left: 0;
136
+ right: 30px;
137
+ top: 50%;
138
+ transform: translateY(-50%);
139
+ display: flex;
140
+ flex-wrap: wrap;
141
+ line-height: normal;
142
+ text-align: left;
143
+ box-sizing: border-box;
144
+ @include cascader-tag-normal(getCssVar('cascader-tag-background'));
145
+ }
146
+
147
+ @include e(collapse-tags) {
148
+ white-space: normal;
149
+ z-index: getCssVar('index-normal');
150
+ @include cascader-tag-normal(getCssVar('fill-color'));
151
+ }
152
+
153
+ @include e(suggestion-panel) {
154
+ border-radius: getCssVar('cascader-menu', 'radius');
155
+ }
156
+
157
+ @include e(suggestion-list) {
158
+ max-height: 204px;
159
+ margin: 0;
160
+ padding: 6px 0;
161
+ font-size: getCssVar('font-size', 'base');
162
+ color: getCssVar('cascader-menu', 'text-color');
163
+ text-align: center;
164
+ }
165
+
166
+ @include e(suggestion-item) {
167
+ display: flex;
168
+ justify-content: space-between;
169
+ align-items: center;
170
+ height: 34px;
171
+ padding: 0 15px;
172
+ text-align: left;
173
+ outline: none;
174
+ cursor: pointer;
175
+
176
+ &:hover,
177
+ &:focus {
178
+ background: getCssVar('cascader-node', 'background-hover');
179
+ }
180
+
181
+ &.is-checked {
182
+ color: getCssVar('cascader', 'menu-selected-text-color');
183
+ font-weight: bold;
184
+ }
185
+
186
+ > span {
187
+ margin-right: 10px;
188
+ }
189
+ }
190
+
191
+ @include e(empty-text) {
192
+ margin: 10px 0;
193
+ color: getCssVar('cascader', 'color-empty');
194
+ }
195
+
196
+ @include e(search-input) {
197
+ flex: 1;
198
+ height: 24px;
199
+ min-width: 60px;
200
+ margin: 2px 0 2px map-get($input-padding-horizontal, 'default')-$border-width;
201
+ padding: 0;
202
+ color: getCssVar('cascader', 'menu-text-color');
203
+ border: none;
204
+ outline: none;
205
+ box-sizing: border-box;
206
+
207
+ background: transparent;
208
+
209
+ &::placeholder {
210
+ // two input overlap
211
+ color: transparent;
212
+ }
213
+ }
214
+ }
@@ -0,0 +1,5 @@
1
+ import Cascader from './index.vue';
2
+
3
+ export {
4
+ Cascader
5
+ };