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,182 @@
1
+ $name: tag;
2
+
3
+ @include set-root-css-vars($name, $tag);
4
+
5
+ @function getCompCssVar($value) {
6
+ @return getCssVar($name, $value);
7
+ }
8
+
9
+ $tag-border-width: 1px;
10
+
11
+ $tag-icon-span-gap: () !default;
12
+ $tag-icon-span-gap: map-merge(
13
+ (
14
+ 'large': 8px,
15
+ 'default': 6px,
16
+ 'small': 4px,
17
+ ),
18
+ $tag-icon-span-gap
19
+ );
20
+
21
+ @function returnVarList($var, $type: 'primary') {
22
+ $list: ('fill-color', 'blank');
23
+ @if $var != false {
24
+ $list: ($type, 'color', $var);
25
+ }
26
+ @return $list;
27
+ }
28
+ // false mean --el-color-white
29
+ @mixin genTheme($backgroundColorWeight, $borderColorWeight, $hoverColorWeight) {
30
+ @include css-var-from-global(
31
+ ('tag', 'bg-color'),
32
+ returnVarList($backgroundColorWeight)
33
+ );
34
+ @include css-var-from-global(
35
+ ('tag', 'border-color'),
36
+ returnVarList($borderColorWeight)
37
+ );
38
+ @include css-var-from-global(
39
+ ('tag', 'hover-color'),
40
+ returnVarList($hoverColorWeight)
41
+ );
42
+
43
+ @each $type in $types {
44
+ &.#{bem('tag', '', $type)} {
45
+ @include css-var-from-global(
46
+ ('tag', 'bg-color'),
47
+ returnVarList($backgroundColorWeight, $type)
48
+ );
49
+ @include css-var-from-global(
50
+ ('tag', 'border-color'),
51
+ returnVarList($borderColorWeight, $type)
52
+ );
53
+ @include css-var-from-global(
54
+ ('tag', 'hover-color'),
55
+ returnVarList($hoverColorWeight, $type)
56
+ );
57
+ }
58
+ }
59
+ }
60
+
61
+ @include b(tag) {
62
+ @include genTheme('light-9', 'light-8', '');
63
+
64
+ @include css-var-from-global(('tag', 'text-color'), ('primary', 'color'));
65
+ @each $type in $types {
66
+ &.#{bem('tag', '', $type)} {
67
+ @include css-var-from-global(('tag', 'text-color'), ($type, 'color'));
68
+ }
69
+ }
70
+
71
+ @include when(hit) {
72
+ border-color: getCssVar('primary', 'color');
73
+ }
74
+ @include when(round) {
75
+ border-radius: getCssVar('tag', 'border-radius-rounded');
76
+ }
77
+
78
+ .#{$namespace}-tag__close {
79
+ color: getCssVar('tag', 'text-color');
80
+ &:hover {
81
+ color: getCssVar('color-white');
82
+ background-color: getCssVar('tag-hover-color');
83
+ }
84
+ }
85
+
86
+ background-color: getCssVar('tag-bg-color');
87
+ border-color: getCssVar('tag-border-color');
88
+ color: getCssVar('tag-text-color');
89
+
90
+ display: inline-flex;
91
+ justify-content: center;
92
+ align-items: center;
93
+
94
+ height: map-get($tag-height, 'default');
95
+ padding: 0 map-get($tag-padding, 'default') - $border-width;
96
+
97
+ font-size: getCssVar('tag-font-size');
98
+ line-height: 1;
99
+ border-width: $tag-border-width;
100
+ border-style: solid;
101
+ border-radius: getCssVar('tag-border-radius');
102
+ box-sizing: border-box;
103
+ white-space: nowrap;
104
+
105
+ @include set-css-var-value('icon-size', 14px);
106
+
107
+ $svg-margin-size: 1px;
108
+ .#{$namespace}-icon {
109
+ cursor: pointer;
110
+ color: inherit;
111
+ font-size: calc(#{getCssVar('icon-size')} - #{$svg-margin-size * 2});
112
+ }
113
+
114
+ .#{$namespace}-tag__close {
115
+ @include flex-center();
116
+ border-radius: 50%;
117
+ height: getCssVar('icon-size');
118
+ width: getCssVar('icon-size');
119
+ margin-left: map-get($tag-icon-span-gap, 'default');
120
+ }
121
+
122
+ @include m(dark) {
123
+ @include genTheme('', '', 'light-3');
124
+ @include css-var-from-global(('tag', 'text-color'), ('color', 'white'));
125
+
126
+ @include css-var-from-global(('tag', 'text-color'), ('color', 'white'));
127
+ @each $type in $types {
128
+ &.#{bem('tag', '', $type)} {
129
+ @include css-var-from-global(('tag', 'text-color'), ('color', 'white'));
130
+ }
131
+ }
132
+ }
133
+
134
+ @include m(plain) {
135
+ @include genTheme(false, 'light-5', '');
136
+ @include css-var-from-global(('tag', 'bg-color'), ('fill-color', 'blank'));
137
+ }
138
+
139
+ &.is-closable {
140
+ padding-right: map-get($tag-icon-span-gap, 'default') - $border-width;
141
+ }
142
+
143
+ @include e(content) {
144
+ @include line-clamp(getCompCssVar('content-line-clamp-num'));
145
+ max-width: getCompCssVar('content-max-width');
146
+ white-space: break-spaces;
147
+ }
148
+
149
+ @each $size in (large, small) {
150
+ @include m($size) {
151
+ padding: 0 map-get($tag-padding, $size) - $tag-border-width;
152
+ height: map-get($tag-height, $size);
153
+
154
+ @include set-css-var-value(
155
+ 'icon-size',
156
+ #{map-get($tag-icon-size, $size)}
157
+ );
158
+
159
+ .#{$namespace}-tag__close {
160
+ margin-left: map-get($tag-icon-span-gap, $size);
161
+ }
162
+
163
+ &.is-closable {
164
+ padding-right: map-get($tag-icon-span-gap, $size) - $border-width;
165
+ }
166
+ }
167
+ }
168
+
169
+ @include m(small) {
170
+ .#{$namespace}-icon-close {
171
+ transform: scale(0.8);
172
+ }
173
+ }
174
+
175
+ @each $type in $types {
176
+ &.#{bem('tag', '', $type)} {
177
+ @include when(hit) {
178
+ border-color: getCssVar($type, 'color');
179
+ }
180
+ }
181
+ }
182
+ }
@@ -0,0 +1,5 @@
1
+ import Tag from './index.vue';
2
+
3
+ export { Tag };
4
+
5
+ export * from './types';
@@ -0,0 +1,78 @@
1
+ <script lang="tsx" setup>
2
+ import { useSize } from 'element-plus';
3
+ import { type ComponentSize } from '../../../types/component';
4
+ import Icon from '../../common/icon/index.vue';
5
+ import { computed, Transition } from 'vue';
6
+ import { useNamespace } from '../../use';
7
+ import './index.scss';
8
+ import type { TagType } from './types';
9
+
10
+ interface Props {
11
+ closable?: boolean;
12
+ type?: TagType;
13
+ hit?: boolean;
14
+ disableTransitions?: boolean;
15
+ color?: string;
16
+ size?: ComponentSize;
17
+ effect?: 'dark' | 'light' | 'plain';
18
+ round?: boolean;
19
+ }
20
+
21
+ const {
22
+ closable,
23
+ type,
24
+ hit,
25
+ disableTransitions = true,
26
+ color,
27
+ size,
28
+ effect = 'light',
29
+ round
30
+ } = defineProps<Props>();
31
+
32
+ const emit = defineEmits(['close', 'click']);
33
+ const slots = useSlots();
34
+
35
+ const tagSize = useSize();
36
+ const ns = useNamespace('tag');
37
+ const classes = computed(() => {
38
+ return [
39
+ ns.b(),
40
+ ns.is('closable', closable),
41
+ ns.m(type),
42
+ ns.m(tagSize.value),
43
+ ns.m(effect),
44
+ ns.is('hit', hit),
45
+ ns.is('round', round)
46
+ ];
47
+ });
48
+
49
+ // methods
50
+ const handleClose = (event: MouseEvent) => {
51
+ emit('close', event);
52
+ };
53
+
54
+ const handleClick = (event: MouseEvent) => {
55
+ emit('click', event);
56
+ };
57
+
58
+ const renderTag = () => {
59
+ return <span class={classes.value}
60
+ style={{ backgroundColor: color }} onClick={handleClick}>
61
+ <span class={ns.e('content')}>
62
+ {slots.default?.()}
63
+ </span>
64
+ {
65
+ closable ? <div class={ns.e('close')} onClick={handleClose}>
66
+ <Icon icon="vi-close" />
67
+ </div> : ''
68
+ }
69
+ </span>;
70
+ };
71
+
72
+ defineRender(() => {
73
+ return disableTransitions ? renderTag() :
74
+ <Transition name={`${ns.namespace.value}-zoom-in-center`} appear>
75
+ {renderTag()}
76
+ </Transition>;
77
+ });
78
+ </script>
@@ -0,0 +1,2 @@
1
+ export type TagType = 'success' | 'info' | 'warning' | 'danger' | ''
2
+
@@ -0,0 +1,239 @@
1
+ <template>
2
+ <teleport :disabled="!teleported" :to="_appendTo">
3
+ <transition :name="transition" @after-leave="onTransitionLeave" @before-enter="onBeforeEnter" @after-enter="onAfterShow" @before-leave="onBeforeLeave">
4
+ <popper-content
5
+ v-if="shouldRender"
6
+ v-show="shouldShow"
7
+ :id="id"
8
+ ref="contentRef"
9
+ v-bind="$attrs"
10
+ :aria-label="ariaLabel"
11
+ :aria-hidden="ariaHidden"
12
+ :boundaries-padding="boundariesPadding"
13
+ :fallback-placements="fallbackPlacements"
14
+ :gpu-acceleration="gpuAcceleration"
15
+ :offset="offset"
16
+ :placement="placement"
17
+ :popper-options="popperOptions"
18
+ :strategy="strategy"
19
+ :effect="effect"
20
+ :enterable="enterable"
21
+ :pure="pure"
22
+ :popper-class="popperClass"
23
+ :popper-style="[popperStyle, contentStyle]"
24
+ :reference-el="referenceEl"
25
+ :trigger-target-el="triggerTargetEl"
26
+ :visible="shouldShow"
27
+ :z-index="zIndex"
28
+ @mouseenter="onContentEnter"
29
+ @mouseleave="onContentLeave"
30
+ @blur="onBlur"
31
+ @close="onClose"
32
+ >
33
+ <template v-if="!destroyed">
34
+ <slot />
35
+ </template>
36
+ </popper-content>
37
+ </transition>
38
+ </teleport>
39
+ </template>
40
+
41
+ <script lang="ts" setup>
42
+ /* eslint-disable @typescript-eslint/no-unused-vars */
43
+ import type { Options, Placement } from '@popperjs/core';
44
+ import { computed, inject, onBeforeUnmount, ref, type StyleValue, unref, watch } from 'vue';
45
+ import { onClickOutside } from '@vueuse/core';
46
+ import { usePopperContainerId } from '../../use';
47
+ import { composeEventHandlers } from '../../utils';
48
+ import { PopperContent } from '../popper';
49
+ import { TOOLTIP_INJECTION_KEY } from './tokens';
50
+
51
+ defineOptions({
52
+ name: 'VriTooltipContent',
53
+ inheritAttrs: false
54
+ });
55
+
56
+ interface Props {
57
+ boundariesPadding?: number;
58
+ fallbackPlacements?: Placement[];
59
+ gpuAcceleration?: boolean;
60
+ offset?: number;
61
+ placement?: Placement;
62
+ popperOptions?: Partial<Options>;
63
+ strategy?: 'fixed' | 'absolute';
64
+ style?: StyleValue;
65
+ className?: ClassType;
66
+ effect?: string;
67
+ visible?: boolean;
68
+ enterable?: boolean;
69
+ pure?: boolean;
70
+ focusOnShow?: boolean;
71
+ trapping?: boolean;
72
+ popperClass?: ClassType;
73
+ popperStyle?: StyleValue;
74
+ referenceEl?: HTMLElement;
75
+ triggerTargetEl?: HTMLElement;
76
+ stopPopperMouseEvent?: boolean;
77
+ ariaLabel?: string;
78
+ virtualTriggering?: boolean;
79
+ zIndex?: number;
80
+ // ==
81
+ showAfter?: number;
82
+ hideAfter?: number;
83
+ appendTo?: HTMLElement | string;
84
+ content?: string;
85
+ rawContent?: boolean;
86
+ persistent?: boolean;
87
+ transition?: string;
88
+ teleported?: boolean;
89
+ disabled?: boolean;
90
+ }
91
+
92
+ const {
93
+ boundariesPadding = 0,
94
+ fallbackPlacements,
95
+ gpuAcceleration = true,
96
+ offset = 12,
97
+ placement = 'bottom',
98
+ popperOptions = {},
99
+ strategy = 'absolute',
100
+ style,
101
+ appendTo,
102
+ className,
103
+ effect = 'dark',
104
+ visible,
105
+ enterable = true,
106
+ pure,
107
+ focusOnShow = false,
108
+ trapping = false,
109
+ popperClass,
110
+ popperStyle,
111
+ referenceEl,
112
+ triggerTargetEl,
113
+ stopPopperMouseEvent = true,
114
+ ariaLabel,
115
+ virtualTriggering,
116
+ zIndex,
117
+ showAfter = 0,
118
+ hideAfter = 200,
119
+ content = '',
120
+ rawContent = false,
121
+ persistent,
122
+ transition = 'vri-fade-in-linear',
123
+ teleported = true,
124
+ disabled
125
+ } = defineProps<Props>();
126
+
127
+ const { selector } = usePopperContainerId();
128
+ // TODO any is temporary, replace with `InstanceType<typeof ElPopperContent> | null` later
129
+ const contentRef = ref<any>(null);
130
+ const destroyed = ref(false);
131
+ const { controlled, id, open, trigger, onClose, onOpen, onShow, onHide, onBeforeShow, onBeforeHide } = inject(TOOLTIP_INJECTION_KEY, undefined)!;
132
+ const persistentRef = computed(() => {
133
+ // For testing, we would always want the content to be rendered
134
+ // to the DOM, so we need to return true here.
135
+ if (process.env.NODE_ENV === 'test') {
136
+ return true;
137
+ }
138
+ return persistent;
139
+ });
140
+
141
+ onBeforeUnmount(() => {
142
+ destroyed.value = true;
143
+ });
144
+
145
+ const shouldRender = computed(() => {
146
+ return unref(persistentRef) ? true : unref(open);
147
+ });
148
+
149
+ const shouldShow = computed(() => {
150
+ return disabled ? false : unref(open);
151
+ });
152
+
153
+ const _appendTo = computed(() => {
154
+ return appendTo || selector.value;
155
+ });
156
+
157
+ const contentStyle = computed(() => (style ?? {}) as any);
158
+
159
+ const ariaHidden = computed(() => !unref(open));
160
+
161
+ const onTransitionLeave = () => {
162
+ onHide();
163
+ };
164
+
165
+ const stopWhenControlled = () => {
166
+ if (unref(controlled)) return true;
167
+ };
168
+
169
+ const onContentEnter = composeEventHandlers(stopWhenControlled, () => {
170
+ if (enterable && unref(trigger) === 'hover') {
171
+ onOpen();
172
+ }
173
+ });
174
+
175
+ const onContentLeave = composeEventHandlers(stopWhenControlled, () => {
176
+ if (unref(trigger) === 'hover') {
177
+ onClose();
178
+ }
179
+ });
180
+
181
+ const onBeforeEnter = () => {
182
+ contentRef.value?.updatePopper?.();
183
+ onBeforeShow?.();
184
+ };
185
+
186
+ const onBeforeLeave = () => {
187
+ onBeforeHide?.();
188
+ };
189
+
190
+ const onAfterShow = () => {
191
+ onShow();
192
+ stopHandle = onClickOutside(
193
+ computed(() => {
194
+ return contentRef.value?.popperContentRef;
195
+ }),
196
+ () => {
197
+ if (unref(controlled)) return;
198
+ const $trigger = unref(trigger);
199
+ if ($trigger !== 'hover') {
200
+ onClose();
201
+ }
202
+ }
203
+ );
204
+ };
205
+
206
+ const onBlur = () => {
207
+ if (!virtualTriggering) {
208
+ onClose();
209
+ }
210
+ };
211
+
212
+ let stopHandle: ReturnType<typeof onClickOutside>;
213
+
214
+ watch(
215
+ () => unref(open),
216
+ (val) => {
217
+ if (!val) {
218
+ stopHandle?.();
219
+ }
220
+ },
221
+ {
222
+ flush: 'post'
223
+ }
224
+ );
225
+
226
+ watch(
227
+ () => content,
228
+ () => {
229
+ contentRef.value?.updatePopper?.();
230
+ }
231
+ );
232
+
233
+ defineExpose({
234
+ /**
235
+ * @description el-popper-content component instance
236
+ */
237
+ contentRef
238
+ });
239
+ </script>
@@ -0,0 +1,4 @@
1
+ import Tooltip from './tooltip.vue';
2
+
3
+ export * from './types';
4
+ export { Tooltip };
@@ -0,0 +1,21 @@
1
+ import type { InjectionKey, Ref } from 'vue';
2
+
3
+ export type Arrayable<T> = T | T[];
4
+ export type TooltipTriggerType = 'hover' | 'focus' | 'click' | 'contextmenu';
5
+
6
+ export type ElTooltipInjectionContext = {
7
+ controlled?: Ref<boolean>;
8
+ id?: Ref<string>;
9
+ open?: Ref<boolean>;
10
+ trigger?: Arrayable<TooltipTriggerType>;
11
+ onOpen?: (e?: Event) => void;
12
+ onClose?: (e?: Event) => void;
13
+ onToggle?: (e?: Event) => void;
14
+ onShow?: () => void;
15
+ onHide?: () => void;
16
+ onBeforeShow?: () => void;
17
+ onBeforeHide?: () => void;
18
+ updatePopper?: () => void;
19
+ };
20
+
21
+ export const TOOLTIP_INJECTION_KEY: InjectionKey<ElTooltipInjectionContext> = Symbol('vriTooltip');