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,270 @@
1
+ <template>
2
+ <popper ref="popperRef" :role="role">
3
+ <tooltip-trigger :disabled="disabled" :trigger="trigger" :trigger-keys="triggerKeys" :virtual-ref="virtualRef" :virtual-triggering="virtualTriggering">
4
+ <slot v-if="$slots.default" />
5
+ </tooltip-trigger>
6
+ <tooltip-content
7
+ ref="contentRef"
8
+ :aria-label="ariaLabel"
9
+ :boundaries-padding="boundariesPadding"
10
+ :content="content"
11
+ :disabled="disabled"
12
+ :effect="effect"
13
+ :enterable="enterable"
14
+ :fallback-placements="fallbackPlacements"
15
+ :hide-after="hideAfter"
16
+ :gpu-acceleration="gpuAcceleration"
17
+ :offset="offset"
18
+ :persistent="persistent"
19
+ :popper-class="popperClass"
20
+ :popper-style="popperStyle"
21
+ :placement="placement"
22
+ :popper-options="popperOptions"
23
+ :pure="pure"
24
+ :raw-content="rawContent"
25
+ :reference-el="referenceEl"
26
+ :trigger-target-el="triggerTargetEl"
27
+ :show-after="showAfter"
28
+ :strategy="strategy"
29
+ :teleported="teleported"
30
+ :transition="transition"
31
+ :virtual-triggering="virtualTriggering"
32
+ :z-index="zIndex"
33
+ :append-to="appendTo"
34
+ >
35
+ <slot name="content">
36
+ <span v-if="rawContent" v-html="content" />
37
+ <span v-else>{{ content }}</span>
38
+ </slot>
39
+ <popper-arrow v-if="showArrow" :arrow-offset="arrowOffset" />
40
+ </tooltip-content>
41
+ </popper>
42
+ </template>
43
+
44
+ <script lang="ts" setup>
45
+ /* eslint-disable @typescript-eslint/no-unused-vars */
46
+ import type { Options, Placement } from '@popperjs/core';
47
+ import { EVENT_CODE } from 'element-plus';
48
+ import { computed, onDeactivated, provide, readonly, ref, type StyleValue, unref, watch } from 'vue';
49
+ import { type Measurable, Popper, PopperArrow } from '../popper';
50
+ import { isBoolean } from '@vri/utils';
51
+ import { useDelayedToggle, useId, usePopperContainer } from '../../use';
52
+ import { TOOLTIP_INJECTION_KEY } from './tokens';
53
+ import TooltipTrigger from './trigger.vue';
54
+ import TooltipContent from './content.vue';
55
+ import type { TooltipTriggerType } from './types';
56
+ import { useTooltipModelToggle } from './utils';
57
+
58
+ defineOptions({
59
+ name: 'vri-tooltip'
60
+ });
61
+
62
+ export interface ToolTipProps {
63
+ role?: 'dialog' | 'grid' | 'group' | 'listbox' | 'menu' | 'navigation' | 'tooltip' | 'tree';
64
+ showArrow?: boolean;
65
+ arrowOffset?: number;
66
+ virtualRef?: Measurable;
67
+ virtualTriggering?: boolean;
68
+ onMouseenter?: Function;
69
+ onMouseleave?: Function;
70
+ onClick?: Function;
71
+ onKeydown?: Function;
72
+ onFocus?: Function;
73
+ onBlur?: Function;
74
+ onContextmenu?: Function;
75
+ id?: string;
76
+ open?: boolean;
77
+ boundariesPadding?: number;
78
+ fallbackPlacements?: Placement[];
79
+ gpuAcceleration?: boolean;
80
+ offset?: number;
81
+ placement?: Placement;
82
+ popperOptions?: Partial<Options>;
83
+ strategy?: 'fixed' | 'absolute';
84
+ style?: StyleValue;
85
+ className?: ClassType;
86
+ effect?: 'light' | 'dark';
87
+ visible?: boolean;
88
+ enterable?: boolean;
89
+ pure?: boolean;
90
+ focusOnShow?: boolean;
91
+ trapping?: boolean;
92
+ popperClass?: ClassType;
93
+ popperStyle?: StyleValue;
94
+ referenceEl?: HTMLElement;
95
+ triggerTargetEl?: HTMLElement;
96
+ stopPopperMouseEvent?: boolean;
97
+ ariaLabel?: string;
98
+ zIndex?: number;
99
+ // ==
100
+ showAfter?: number;
101
+ hideAfter?: number;
102
+ appendTo?: HTMLElement | string;
103
+ content?: string;
104
+ rawContent?: boolean;
105
+ persistent?: boolean;
106
+ transition?: string;
107
+ teleported?: boolean;
108
+ disabled?: boolean;
109
+ trigger?: TooltipTriggerType;
110
+ triggerKeys?: string[];
111
+ }
112
+
113
+ const {
114
+ role = 'tooltip',
115
+ showArrow = true,
116
+ arrowOffset = 5,
117
+ boundariesPadding = 0,
118
+ fallbackPlacements,
119
+ gpuAcceleration = true,
120
+ offset = 12,
121
+ placement = 'bottom',
122
+ popperOptions = {},
123
+ strategy = 'absolute',
124
+ style,
125
+ appendTo,
126
+ className,
127
+ effect = 'dark',
128
+ visible = null,
129
+ enterable = true,
130
+ pure,
131
+ focusOnShow = false,
132
+ trapping = false,
133
+ popperClass,
134
+ popperStyle,
135
+ referenceEl,
136
+ triggerTargetEl,
137
+ stopPopperMouseEvent = true,
138
+ ariaLabel,
139
+ virtualTriggering,
140
+ zIndex,
141
+ showAfter = 0,
142
+ hideAfter = 200,
143
+ content = '',
144
+ rawContent = false,
145
+ persistent,
146
+ transition = 'vri-fade-in-linear',
147
+ teleported = true,
148
+ disabled,
149
+ trigger = 'hover',
150
+ triggerKeys = [EVENT_CODE.enter, EVENT_CODE.space],
151
+ virtualRef
152
+ } = defineProps<ToolTipProps>();
153
+
154
+ const emit = defineEmits(['before-show', 'before-hide', 'show', 'hide', 'open', 'close']);
155
+
156
+ usePopperContainer();
157
+
158
+ const id = useId();
159
+ // TODO any is temporary, replace with `InstanceType<typeof ElPopper> | null` later
160
+ const popperRef = ref<any>();
161
+ // TODO any is temporary, replace with `InstanceType<typeof ElTooltipContent> | null` later
162
+ const contentRef = ref<any>();
163
+
164
+ const updatePopper = () => {
165
+ const popperComponent = unref(popperRef);
166
+ if (popperComponent) {
167
+ popperComponent.popperInstanceRef?.update();
168
+ }
169
+ };
170
+ const open = ref(false);
171
+ const toggleReason = ref<Event>();
172
+
173
+ const { show, hide, hasUpdateHandler } = useTooltipModelToggle({
174
+ indicator: open,
175
+ toggleReason
176
+ });
177
+
178
+ const { onOpen, onClose } = useDelayedToggle({
179
+ showAfter,
180
+ hideAfter,
181
+ open: show,
182
+ close: hide
183
+ });
184
+
185
+ const controlled = computed(() => isBoolean(visible) && !hasUpdateHandler.value);
186
+
187
+ provide(TOOLTIP_INJECTION_KEY, {
188
+ controlled,
189
+ id,
190
+ open: readonly(open),
191
+ trigger,
192
+ onOpen: (event?: Event) => {
193
+ onOpen(event);
194
+ },
195
+ onClose: (event?: Event) => {
196
+ onClose(event);
197
+ },
198
+ onToggle: (event?: Event) => {
199
+ if (unref(open)) {
200
+ onClose(event);
201
+ } else {
202
+ onOpen(event);
203
+ }
204
+ },
205
+ onShow: () => {
206
+ emit('show', toggleReason.value);
207
+ },
208
+ onHide: () => {
209
+ emit('hide', toggleReason.value);
210
+ },
211
+ onBeforeShow: () => {
212
+ emit('before-show', toggleReason.value);
213
+ },
214
+ onBeforeHide: () => {
215
+ emit('before-hide', toggleReason.value);
216
+ },
217
+ updatePopper
218
+ });
219
+
220
+ watch(
221
+ () => disabled,
222
+ (disabled) => {
223
+ if (disabled && open.value) {
224
+ open.value = false;
225
+ }
226
+ }
227
+ );
228
+
229
+ const isFocusInsideContent = () => {
230
+ const popperContent: HTMLElement | undefined = contentRef.value?.contentRef?.popperContentRef;
231
+ return popperContent && popperContent.contains(document.activeElement);
232
+ };
233
+
234
+ onDeactivated(() => open.value && hide());
235
+
236
+ defineExpose({
237
+ /**
238
+ * @description el-popper component instance
239
+ */
240
+ popperRef,
241
+ /**
242
+ * @description el-tooltip-content component instance
243
+ */
244
+ contentRef,
245
+ /**
246
+ * @description validate current focus event is trigger inside el-tooltip-content
247
+ */
248
+ isFocusInsideContent,
249
+ /**
250
+ * @description update el-popper component instance
251
+ */
252
+ updatePopper,
253
+ /**
254
+ * @description expose onOpen function to mange el-tooltip open state
255
+ */
256
+ onOpen,
257
+ /**
258
+ * @description expose onOpen function to mange el-tooltip open state
259
+ */
260
+ onClose,
261
+ /**
262
+ * @description expose hide function
263
+ */
264
+ hide
265
+ });
266
+ </script>
267
+
268
+ <style lang="scss">
269
+ @import '../popper/index.scss';
270
+ </style>
@@ -0,0 +1,119 @@
1
+ <template>
2
+ <popper-trigger
3
+ :id="id"
4
+ :virtual-ref="virtualRef"
5
+ :open="open"
6
+ :virtual-triggering="virtualTriggering"
7
+ :class="ns.e('trigger')"
8
+ @blur="onBlur"
9
+ @click="onClick"
10
+ @contextmenu="onContextMenu"
11
+ @focus="onFocus"
12
+ @mouseenter="onMouseenter"
13
+ @mouseleave="onMouseleave"
14
+ @keydown="onKeydown"
15
+ >
16
+ <slot />
17
+ </popper-trigger>
18
+ </template>
19
+ <script lang="ts" setup>
20
+ import { EVENT_CODE } from '@vri/constants';
21
+ import { inject, ref, unref } from 'vue';
22
+ import type { Measurable } from '../popper';
23
+ import { PopperTrigger } from '../popper';
24
+ import { composeEventHandlers } from '../../utils';
25
+ import { useNamespace } from '../../use';
26
+ import { TOOLTIP_INJECTION_KEY } from './tokens';
27
+ import { type TooltipTriggerType } from './types';
28
+ import { whenTrigger } from './utils';
29
+
30
+ defineOptions({
31
+ name: 'VriTooltipTrigger'
32
+ });
33
+
34
+ interface Props {
35
+ disabled?: boolean
36
+ trigger?: TooltipTriggerType
37
+ triggerKeys?: string[]
38
+ virtualRef?: Measurable
39
+ virtualTriggering?: boolean
40
+ }
41
+
42
+ const {
43
+ disabled,
44
+ trigger = 'hover',
45
+ triggerKeys = [EVENT_CODE.enter, EVENT_CODE.space],
46
+ virtualRef,
47
+ virtualTriggering
48
+
49
+ } = defineProps<Props>();
50
+
51
+ const ns = useNamespace('tooltip');
52
+ const { controlled, id, open, onOpen, onClose, onToggle } = inject(
53
+ TOOLTIP_INJECTION_KEY,
54
+ undefined
55
+ )!;
56
+
57
+ // TODO any is temporary, replace with `OnlyChildExpose | null` later
58
+ const triggerRef = ref<any>(null);
59
+
60
+ const stopWhenControlledOrDisabled = () => {
61
+ if (unref(controlled) || disabled) {
62
+ return true;
63
+ }
64
+ };
65
+
66
+ const onMouseenter = composeEventHandlers(
67
+ stopWhenControlledOrDisabled,
68
+ whenTrigger(trigger, 'hover', onOpen)
69
+ );
70
+ const onMouseleave = composeEventHandlers(
71
+ stopWhenControlledOrDisabled,
72
+ whenTrigger(trigger, 'hover', onClose)
73
+ );
74
+ const onClick = composeEventHandlers(
75
+ stopWhenControlledOrDisabled,
76
+ whenTrigger(trigger, 'click', (e) => {
77
+ // distinguish left click
78
+ if ((e as MouseEvent).button === 0) {
79
+ onToggle(e);
80
+ }
81
+ })
82
+ );
83
+
84
+ const onFocus = composeEventHandlers(
85
+ stopWhenControlledOrDisabled,
86
+ whenTrigger(trigger, 'focus', onOpen)
87
+ );
88
+
89
+ const onBlur = composeEventHandlers(
90
+ stopWhenControlledOrDisabled,
91
+ whenTrigger(trigger, 'focus', onClose)
92
+ );
93
+
94
+ const onContextMenu = composeEventHandlers(
95
+ stopWhenControlledOrDisabled,
96
+ whenTrigger(trigger, 'contextmenu', (e: Event) => {
97
+ e.preventDefault();
98
+ onToggle(e);
99
+ })
100
+ );
101
+
102
+ const onKeydown = composeEventHandlers(
103
+ stopWhenControlledOrDisabled,
104
+ (e: KeyboardEvent) => {
105
+ const { code } = e;
106
+ if (triggerKeys.includes(code)) {
107
+ e.preventDefault();
108
+ onToggle(e);
109
+ }
110
+ }
111
+ );
112
+
113
+ defineExpose({
114
+ /**
115
+ * @description trigger element
116
+ */
117
+ triggerRef
118
+ });
119
+ </script>
@@ -0,0 +1,56 @@
1
+ import type { Options, Placement } from '@popperjs/core';
2
+ import type { StyleValue } from 'vue';
3
+ import type { Measurable } from '../popper';
4
+
5
+ export type TooltipTriggerType = 'hover' | 'focus' | 'click' | 'contextmenu';
6
+
7
+ export interface ToolTipProps {
8
+ role?: 'dialog' | 'grid' | 'group' | 'listbox' | 'menu' | 'navigation' | 'tooltip' | 'tree';
9
+ showArrow?: boolean;
10
+ arrowOffset?: number;
11
+ virtualRef?: Measurable;
12
+ virtualTriggering?: boolean;
13
+ onMouseenter?: Function;
14
+ onMouseleave?: Function;
15
+ onClick?: Function;
16
+ onKeydown?: Function;
17
+ onFocus?: Function;
18
+ onBlur?: Function;
19
+ onContextmenu?: Function;
20
+ id?: string;
21
+ open?: boolean;
22
+ boundariesPadding?: number;
23
+ fallbackPlacements?: Placement[];
24
+ gpuAcceleration?: boolean;
25
+ offset?: number;
26
+ placement?: Placement;
27
+ popperOptions?: Partial<Options>;
28
+ strategy?: 'fixed' | 'absolute';
29
+ style?: StyleValue;
30
+ className?: ClassType;
31
+ effect?: 'light' | 'dark';
32
+ visible?: boolean;
33
+ enterable?: boolean;
34
+ pure?: boolean;
35
+ focusOnShow?: boolean;
36
+ trapping?: boolean;
37
+ popperClass?: ClassType;
38
+ popperStyle?: StyleValue;
39
+ referenceEl?: HTMLElement;
40
+ triggerTargetEl?: HTMLElement;
41
+ stopPopperMouseEvent?: boolean;
42
+ ariaLabel?: string;
43
+ zIndex?: number;
44
+ // ==
45
+ showAfter?: number;
46
+ hideAfter?: number;
47
+ appendTo?: HTMLElement | string;
48
+ content?: string;
49
+ rawContent?: boolean;
50
+ persistent?: boolean;
51
+ transition?: string;
52
+ teleported?: boolean;
53
+ disabled?: boolean;
54
+ trigger?: TooltipTriggerType;
55
+ triggerKeys?: string[];
56
+ }
@@ -0,0 +1,20 @@
1
+ import { isArray } from '@vri/utils';
2
+ import { createModelToggleComposable } from 'element-plus';
3
+ import type { TooltipTriggerType } from './types';
4
+
5
+ export type Arrayable<T> = T | T[];
6
+
7
+ export const isTriggerType = (trigger: Arrayable<TooltipTriggerType>, type: TooltipTriggerType) => {
8
+ if (isArray(trigger)) {
9
+ return trigger.includes(type);
10
+ }
11
+ return trigger === type;
12
+ };
13
+
14
+ export const whenTrigger = (trigger: any, type: TooltipTriggerType, handler: (e: Event) => void) => {
15
+ return (e: Event) => {
16
+ isTriggerType(trigger, type) && handler(e);
17
+ };
18
+ };
19
+
20
+ export const { useModelToggle: useTooltipModelToggle } = createModelToggleComposable('visible' as const);
@@ -0,0 +1,73 @@
1
+ <template>
2
+ <transition :name="ns.b()" v-on="on">
3
+ <slot />
4
+ </transition>
5
+ </template>
6
+ <script lang="ts" setup>
7
+ import { type RendererElement } from 'vue';
8
+ import { useNamespace } from '../../use';
9
+
10
+ const ns = /* hoist-static*/ useNamespace('collapse-transition');
11
+
12
+ defineOptions({
13
+ name: ns.b()
14
+ });
15
+
16
+ const on = {
17
+ beforeEnter(el: RendererElement) {
18
+ if (!el.dataset) el.dataset = {};
19
+
20
+ el.dataset.oldPaddingTop = el.style.paddingTop;
21
+ el.dataset.oldPaddingBottom = el.style.paddingBottom;
22
+
23
+ el.style.maxHeight = 0;
24
+ el.style.paddingTop = 0;
25
+ el.style.paddingBottom = 0;
26
+ },
27
+
28
+ enter(el: RendererElement) {
29
+ el.dataset.oldOverflow = el.style.overflow;
30
+ if (el.scrollHeight !== 0) {
31
+ el.style.maxHeight = `${el.scrollHeight}px`;
32
+ el.style.paddingTop = el.dataset.oldPaddingTop;
33
+ el.style.paddingBottom = el.dataset.oldPaddingBottom;
34
+ } else {
35
+ el.style.maxHeight = 0;
36
+ el.style.paddingTop = el.dataset.oldPaddingTop;
37
+ el.style.paddingBottom = el.dataset.oldPaddingBottom;
38
+ }
39
+
40
+ el.style.overflow = 'hidden';
41
+ },
42
+
43
+ afterEnter(el: RendererElement) {
44
+ el.style.maxHeight = '';
45
+ el.style.overflow = el.dataset.oldOverflow;
46
+ },
47
+
48
+ beforeLeave(el: RendererElement) {
49
+ if (!el.dataset) el.dataset = {};
50
+ el.dataset.oldPaddingTop = el.style.paddingTop;
51
+ el.dataset.oldPaddingBottom = el.style.paddingBottom;
52
+ el.dataset.oldOverflow = el.style.overflow;
53
+
54
+ el.style.maxHeight = `${el.scrollHeight}px`;
55
+ el.style.overflow = 'hidden';
56
+ },
57
+
58
+ leave(el: RendererElement) {
59
+ if (el.scrollHeight !== 0) {
60
+ el.style.maxHeight = 0;
61
+ el.style.paddingTop = 0;
62
+ el.style.paddingBottom = 0;
63
+ }
64
+ },
65
+
66
+ afterLeave(el: RendererElement) {
67
+ el.style.maxHeight = '';
68
+ el.style.overflow = el.dataset.oldOverflow;
69
+ el.style.paddingTop = el.dataset.oldPaddingTop;
70
+ el.style.paddingBottom = el.dataset.oldPaddingBottom;
71
+ }
72
+ };
73
+ </script>
@@ -0,0 +1,5 @@
1
+ import CollapseTransition from './collapse-transition.vue';
2
+
3
+ export {
4
+ CollapseTransition
5
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@vri/tsconfig/tsconfig.web.json",
3
+ "compilerOptions": {
4
+ "typeRoots": ["node_modules/@types", "types"],
5
+ "types": ["vite/client", "node", "unplugin-vue-macros/macros-global"]
6
+ },
7
+ "include": ["src", "types", "node_modules/@vri/types"]
8
+ }
@@ -0,0 +1 @@
1
+ export type ComponentSize = number | string | 'large' | 'small' | '';