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,161 @@
1
+ <template>
2
+ <tooltip
3
+ ref="tooltipRef"
4
+ v-bind="$attrs"
5
+ :trigger="trigger"
6
+ :placement="placement"
7
+ :disabled="disabled"
8
+ :visible="visible"
9
+ :transition="transition"
10
+ :popper-options="popperOptions"
11
+ :tabindex="tabindex"
12
+ :content="content"
13
+ :offset="offset"
14
+ :show-after="showAfter"
15
+ :hide-after="hideAfter"
16
+ :auto-close="autoClose"
17
+ :show-arrow="showArrow"
18
+ :aria-label="title"
19
+ :effect="effect"
20
+ :enterable="enterable"
21
+ :popper-class="kls"
22
+ :popper-style="style"
23
+ :teleported="teleported"
24
+ :persistent="persistent"
25
+ :gpu-acceleration="gpuAcceleration"
26
+ @before-show="beforeEnter"
27
+ @before-hide="beforeLeave"
28
+ @show="afterEnter"
29
+ @hide="afterLeave"
30
+ >
31
+ <template v-if="$slots.reference">
32
+ <slot name="reference" />
33
+ </template>
34
+
35
+ <template #content>
36
+ <div v-if="title" :class="ns.e('title')" role="title">
37
+ {{ title }}
38
+ </div>
39
+ <slot>
40
+ {{ content }}
41
+ </slot>
42
+ </template>
43
+ </tooltip>
44
+ </template>
45
+ <script lang="ts" setup>
46
+ import type { Options, Placement } from '@popperjs/core';
47
+ import { computed, ref, type StyleValue, unref } from 'vue';
48
+ import { addUnit } from '@vri/utils';
49
+ import { useNamespace } from '../../use';
50
+ import type { TooltipTriggerType } from '../tooltip/types';
51
+ import { Tooltip } from '../tooltip';
52
+
53
+ interface PopoverProps {
54
+ trigger?: TooltipTriggerType;
55
+ placement?: Placement;
56
+ disabled?: boolean;
57
+ visible?: boolean;
58
+ transition?: string;
59
+ popperOptions?: Partial<Options>;
60
+ tabindex?: number;
61
+ content?: string;
62
+ popperStyle?: StyleValue;
63
+ popperClass?: ClassType;
64
+ enterable?: boolean;
65
+ effect?: 'light' | 'dark';
66
+ teleported?: boolean;
67
+ title?: string;
68
+ width?: string | number;
69
+ offset?: number;
70
+ showAfter?: number;
71
+ hideAfter?: number;
72
+ autoClose?: number;
73
+ showArrow?: boolean;
74
+ persistent?: boolean;
75
+ }
76
+
77
+ const {
78
+ trigger = 'hover',
79
+ placement = 'bottom',
80
+ disabled,
81
+ visible = null,
82
+ transition = 'vri-fade-in-linear',
83
+ popperOptions,
84
+ tabindex = 0,
85
+ content,
86
+ popperStyle,
87
+ popperClass,
88
+ enterable = true,
89
+ effect = 'light',
90
+ teleported = true,
91
+ title,
92
+ width = 150,
93
+ offset,
94
+ showAfter = 0,
95
+ hideAfter = 200,
96
+ autoClose = 0,
97
+ showArrow = true,
98
+ persistent = true
99
+ } = defineProps<PopoverProps>();
100
+
101
+ const emit = defineEmits(['update:visible', 'before-enter', 'before-leave', 'after-enter', 'after-leave']);
102
+
103
+ const ns = /* hoist-static*/ useNamespace('popover');
104
+
105
+ defineOptions({
106
+ name: ns.b()
107
+ });
108
+
109
+ const tooltipRef = ref();
110
+ const popperRef = computed(() => {
111
+ return unref(tooltipRef)?.popperRef;
112
+ });
113
+
114
+ const style = computed(() => {
115
+ return [
116
+ {
117
+ width: addUnit(width)
118
+ },
119
+ popperStyle!
120
+ ];
121
+ });
122
+
123
+ const kls = computed(() => {
124
+ return [ns.b(), popperClass!, { [ns.m('plain')]: !!content }];
125
+ });
126
+
127
+ const gpuAcceleration = computed(() => {
128
+ return transition === `${ns.namespace.value}-fade-in-linear`;
129
+ });
130
+
131
+ const hide = () => {
132
+ tooltipRef.value?.hide();
133
+ };
134
+
135
+ const beforeEnter = () => {
136
+ emit('before-enter');
137
+ };
138
+ const beforeLeave = () => {
139
+ emit('before-leave');
140
+ };
141
+
142
+ const afterEnter = () => {
143
+ emit('after-enter');
144
+ };
145
+
146
+ const afterLeave = () => {
147
+ emit('update:visible', false);
148
+ emit('after-leave');
149
+ };
150
+
151
+ defineExpose({
152
+ /** @description popper ref */
153
+ popperRef,
154
+ /** @description hide popover */
155
+ hide
156
+ });
157
+ </script>
158
+
159
+ <style lang="scss">
160
+ @import './index.scss';
161
+ </style>
@@ -0,0 +1,26 @@
1
+ import type { Options, Placement } from '@popperjs/core';
2
+ import type { TooltipTriggerType } from '../tooltip/types';
3
+
4
+ export interface PopoverProps {
5
+ trigger?: TooltipTriggerType;
6
+ placement?: Placement;
7
+ disabled?: boolean;
8
+ visible?: boolean;
9
+ transition?: string;
10
+ popperOptions?: Partial<Options>;
11
+ tabindex?: number;
12
+ content?: string;
13
+ popperStyle?: StyleValue;
14
+ popperClass?: ClassType;
15
+ enterable?: boolean;
16
+ effect?: 'light' | 'dark';
17
+ teleported?: boolean;
18
+ title?: string;
19
+ width?: string | number;
20
+ offset?: number;
21
+ showAfter?: number;
22
+ hideAfter?: number;
23
+ autoClose?: number;
24
+ showArrow?: boolean;
25
+ persistent?: boolean;
26
+ }
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <span ref="arrowRef" :class="ns.e('arrow')" data-popper-arrow="" />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import { inject, onBeforeUnmount, watch } from 'vue';
7
+ import { useNamespace } from '../../use';
8
+ import { POPPER_CONTENT_INJECTION_KEY } from './tokens';
9
+
10
+ defineOptions({
11
+ name: 'VriPopperArrow',
12
+ inheritAttrs: false
13
+ });
14
+
15
+ interface Props {
16
+ arrowOffset?: number
17
+ }
18
+
19
+ const {
20
+ arrowOffset = 5
21
+ } = defineProps<Props>();
22
+
23
+ const ns = useNamespace('popper');
24
+ const { arrowOffset: _arrowOffset, arrowRef } = inject(
25
+ POPPER_CONTENT_INJECTION_KEY,
26
+ undefined
27
+ )!;
28
+
29
+ watch(
30
+ () => arrowOffset,
31
+ (val) => {
32
+ _arrowOffset.value = val;
33
+ }
34
+ );
35
+ onBeforeUnmount(() => {
36
+ arrowRef.value = undefined;
37
+ });
38
+
39
+ defineExpose({
40
+ /**
41
+ * @description Arrow element
42
+ */
43
+ arrowRef
44
+ });
45
+ </script>
@@ -0,0 +1,311 @@
1
+ <template>
2
+ <div ref="popperContentRef" :style="contentStyle" :class="contentClass" tabindex="-1"
3
+ @mouseenter="(e) => $emit('mouseenter', e)" @mouseleave="(e) => $emit('mouseleave', e)">
4
+ <focus-trap
5
+ :trapped="trapped"
6
+ :trap-on-focus-in="true"
7
+ :focus-trap-el="popperContentRef"
8
+ :focus-start-el="focusStartRef"
9
+ @focus-after-trapped="onFocusAfterTrapped"
10
+ @focus-after-released="onFocusAfterReleased"
11
+ @focusin="onFocusInTrap"
12
+ @focusout-prevented="onFocusoutPrevented"
13
+ @release-requested="onReleaseRequested"
14
+ >
15
+ <slot />
16
+ </focus-trap>
17
+ </div>
18
+ </template>
19
+
20
+ <script lang="ts" setup>
21
+ /* eslint-disable @typescript-eslint/no-unused-vars */
22
+ import {
23
+ computed, inject, onBeforeUnmount, onMounted, provide, ref, unref, watch,
24
+ getCurrentInstance,
25
+ type StyleValue
26
+ } from 'vue';
27
+ import { isNil } from 'lodash';
28
+ import { createPopper } from '@popperjs/core';
29
+ import { FocusTrap } from '../focus-trap';
30
+ import { useNamespace, useZIndex } from '../../use';
31
+ import { POPPER_CONTENT_INJECTION_KEY, POPPER_INJECTION_KEY } from './tokens';
32
+ import { isElement } from '@vri/utils';
33
+ import { buildPopperOptions, unwrapMeasurableEl } from './utils';
34
+ import type { Options, Placement } from '@popperjs/core';
35
+ import type { WatchStopHandle } from 'vue';
36
+ import type { CreatePopperInstanceParams } from './types';
37
+
38
+ defineOptions({
39
+ name: 'VriPopperContent'
40
+ });
41
+
42
+ interface Props {
43
+ boundariesPadding?: number;
44
+ fallbackPlacements?: Placement[];
45
+ gpuAcceleration?: boolean;
46
+ offset?: number;
47
+ placement?: Placement;
48
+ popperOptions?: Partial<Options>;
49
+ strategy?: 'fixed' | 'absolute';
50
+ id?: string;
51
+ style?: StyleValue;
52
+ className?: ClassType;
53
+ effect?: string;
54
+ visible?: boolean;
55
+ enterable?: boolean;
56
+ pure?: boolean;
57
+ focusOnShow?: boolean;
58
+ trapping?: boolean;
59
+ popperClass?: ClassType;
60
+ popperStyle?: StyleValue;
61
+ referenceEl?: HTMLElement;
62
+ triggerTargetEl?: HTMLElement;
63
+ stopPopperMouseEvent?: boolean;
64
+ ariaLabel?: string;
65
+ virtualTriggering?: boolean;
66
+ zIndex?: number;
67
+ }
68
+
69
+ const {
70
+ boundariesPadding = 0,
71
+ fallbackPlacements,
72
+ gpuAcceleration = true,
73
+ offset = 12,
74
+ placement = 'bottom',
75
+ popperOptions = {},
76
+ strategy = 'absolute',
77
+ id,
78
+ style,
79
+ className,
80
+ effect = 'dark',
81
+ visible,
82
+ enterable = true,
83
+ pure,
84
+ focusOnShow = false,
85
+ trapping = false,
86
+ popperClass,
87
+ popperStyle,
88
+ referenceEl,
89
+ triggerTargetEl,
90
+ stopPopperMouseEvent = true,
91
+ ariaLabel,
92
+ virtualTriggering,
93
+ zIndex
94
+ } = defineProps<Props>();
95
+
96
+ const emit = defineEmits(['mouseenter', 'mouseleave', 'focus', 'blur', 'close']);
97
+
98
+ const instance = getCurrentInstance()!;
99
+
100
+ const {
101
+ popperInstanceRef,
102
+ contentRef,
103
+ triggerRef,
104
+ role
105
+ } = inject(POPPER_INJECTION_KEY, undefined)!;
106
+ // const formItemContext = inject(formItemContextKey, undefined);
107
+ const { nextZIndex } = useZIndex();
108
+ const ns = useNamespace('popper');
109
+ const popperContentRef = ref<HTMLElement>();
110
+ const focusStartRef = ref<'container' | 'first' | HTMLElement>('first');
111
+ const arrowRef = ref<HTMLElement>();
112
+ const arrowOffset = ref<number>();
113
+
114
+ provide(POPPER_CONTENT_INJECTION_KEY, {
115
+ arrowRef,
116
+ arrowOffset
117
+ });
118
+
119
+ // if (
120
+ // formItemContext &&
121
+ // (formItemContext.addInputId || formItemContext.removeInputId)
122
+ // ) {
123
+ // // disallow auto-id from inside popper content
124
+ // provide(formItemContextKey, {
125
+ // ...formItemContext,
126
+ // addInputId: NOOP,
127
+ // removeInputId: NOOP
128
+ // });
129
+ // }
130
+
131
+ const contentZIndex = ref<number>(zIndex || nextZIndex());
132
+ const trapped = ref<boolean>(false);
133
+
134
+ let triggerTargetAriaStopWatch: WatchStopHandle | undefined = undefined;
135
+
136
+ const computedReference = computed(() => unwrapMeasurableEl(referenceEl) || unref(triggerRef));
137
+
138
+ const contentStyle = computed(() => [{ zIndex: unref(contentZIndex) }, popperStyle] as any);
139
+
140
+ const contentClass = computed(() => [ns.b(), ns.is('pure', pure), ns.is(effect), popperClass]);
141
+
142
+ const ariaModal = computed<string | undefined>(() => {
143
+ return role && role.value === 'dialog' ? 'false' : undefined;
144
+ });
145
+
146
+ const createPopperInstance = ({
147
+ referenceEl,
148
+ popperContentEl,
149
+ arrowEl
150
+ }: CreatePopperInstanceParams) => {
151
+ const options: any = buildPopperOptions(instance.props, {
152
+ arrowEl,
153
+ arrowOffset: unref(arrowOffset)
154
+ });
155
+
156
+ return createPopper(referenceEl, popperContentEl, options);
157
+ };
158
+
159
+ const updatePopper = (shouldUpdateZIndex = true) => {
160
+ unref(popperInstanceRef)?.update();
161
+ shouldUpdateZIndex && (contentZIndex.value = zIndex || nextZIndex());
162
+ };
163
+
164
+ const togglePopperAlive = () => {
165
+ const monitorable = { name: 'eventListeners', enabled: visible };
166
+ unref(popperInstanceRef)?.setOptions?.((options) => ({
167
+ ...options,
168
+ modifiers: [...(options.modifiers || []), monitorable]
169
+ }));
170
+ updatePopper(false);
171
+ if (visible && focusOnShow) {
172
+ trapped.value = true;
173
+ } else if (visible === false) {
174
+ trapped.value = false;
175
+ }
176
+ };
177
+
178
+ const onFocusAfterTrapped = () => {
179
+ emit('focus');
180
+ };
181
+
182
+ const onFocusAfterReleased = (event: CustomEvent) => {
183
+ if (event.detail?.focusReason !== 'pointer') {
184
+ focusStartRef.value = 'first';
185
+ emit('blur');
186
+ }
187
+ };
188
+
189
+ const onFocusInTrap = (event: FocusEvent) => {
190
+ if (visible && !trapped.value) {
191
+ if (event.target) {
192
+ focusStartRef.value = event.target as typeof focusStartRef.value;
193
+ }
194
+ trapped.value = true;
195
+ }
196
+ };
197
+
198
+ const onFocusoutPrevented = (event: CustomEvent) => {
199
+ if (!trapping) {
200
+ if (event.detail.focusReason === 'pointer') {
201
+ event.preventDefault();
202
+ }
203
+ trapped.value = false;
204
+ }
205
+ };
206
+
207
+ const onReleaseRequested = () => {
208
+ trapped.value = false;
209
+ emit('close');
210
+ };
211
+
212
+ onMounted(() => {
213
+ let updateHandle: WatchStopHandle;
214
+ watch(
215
+ computedReference,
216
+ (referenceEl) => {
217
+ updateHandle?.();
218
+ const popperInstance = unref(popperInstanceRef);
219
+ popperInstance?.destroy?.();
220
+ if (referenceEl) {
221
+ const popperContentEl = unref(popperContentRef)!;
222
+ contentRef.value = popperContentEl;
223
+
224
+ popperInstanceRef.value = createPopperInstance({
225
+ referenceEl,
226
+ popperContentEl,
227
+ arrowEl: unref(arrowRef)
228
+ });
229
+
230
+ updateHandle = watch(
231
+ () => referenceEl.getBoundingClientRect(),
232
+ () => updatePopper(),
233
+ {
234
+ immediate: true
235
+ }
236
+ );
237
+ } else {
238
+ popperInstanceRef.value = undefined;
239
+ }
240
+ },
241
+ {
242
+ immediate: true
243
+ }
244
+ );
245
+
246
+ watch(
247
+ () => triggerTargetEl,
248
+ (triggerTargetEl, prevTriggerTargetEl) => {
249
+ triggerTargetAriaStopWatch?.();
250
+ triggerTargetAriaStopWatch = undefined;
251
+
252
+ const el = unref(triggerTargetEl || popperContentRef.value);
253
+ const prevEl = unref(prevTriggerTargetEl || popperContentRef.value);
254
+
255
+ if (isElement(el)) {
256
+ triggerTargetAriaStopWatch = watch(
257
+ [role, () => ariaLabel, ariaModal, () => id],
258
+ (watches) => {
259
+ ['role', 'aria-label', 'aria-modal', 'id'].forEach((key, idx) => {
260
+ isNil(watches[idx]) ? el.removeAttribute(key) : el.setAttribute(key, watches[idx]!);
261
+ });
262
+ },
263
+ { immediate: true }
264
+ );
265
+ }
266
+ if (prevEl !== el && isElement(prevEl)) {
267
+ ['role', 'aria-label', 'aria-modal', 'id'].forEach((key) => {
268
+ prevEl.removeAttribute(key);
269
+ });
270
+ }
271
+ },
272
+ { immediate: true }
273
+ );
274
+
275
+ watch(() => visible, togglePopperAlive, { immediate: true });
276
+
277
+ watch(
278
+ () =>
279
+ buildPopperOptions(instance.props, {
280
+ arrowEl: unref(arrowRef),
281
+ arrowOffset: unref(arrowOffset)
282
+ }),
283
+ (option) => popperInstanceRef.value?.setOptions(option)
284
+ );
285
+ });
286
+
287
+ onBeforeUnmount(() => {
288
+ triggerTargetAriaStopWatch?.();
289
+ triggerTargetAriaStopWatch = undefined;
290
+ });
291
+
292
+ defineExpose({
293
+ /**
294
+ * @description popper content element
295
+ */
296
+ popperContentRef,
297
+ /**
298
+ * @description popperjs instance
299
+ */
300
+ popperInstanceRef,
301
+ /**
302
+ * @description method for updating popper
303
+ */
304
+ updatePopper,
305
+
306
+ /**
307
+ * @description content style
308
+ */
309
+ contentStyle
310
+ });
311
+ </script>
@@ -0,0 +1,108 @@
1
+ $name: popper;
2
+ $popper: () !default;
3
+ $popper: map-merge((
4
+ 'border-radius': var(#{getCssVarName('popover-border-radius')}, 4px),
5
+ ), $popper);
6
+
7
+ @include b(popper) {
8
+ @include set-component-css-var('popper', $popper);
9
+ }
10
+
11
+ @include b(popper) {
12
+ position: absolute;
13
+ border-radius: getCssVar('popper', 'border-radius');
14
+ padding: 5px 11px;
15
+ z-index: 2000;
16
+ font-size: 12px;
17
+ line-height: 20px;
18
+ min-width: 10px;
19
+ word-wrap: break-word;
20
+ visibility: visible;
21
+
22
+ $arrow-selector: #{& + '__arrow'};
23
+
24
+ @include when(dark) {
25
+ color: getCssVar('bg-color');
26
+ background: getCssVar('text-color', 'primary');
27
+ border: 1px solid getCssVar('text-color', 'primary');
28
+
29
+ #{$arrow-selector}::before {
30
+ border: 1px solid getCssVar('text-color', 'primary');
31
+ background: getCssVar('text-color', 'primary');
32
+ right: 0;
33
+ }
34
+ }
35
+
36
+ @include when(light) {
37
+ background: getCssVar('bg-color', 'overlay');
38
+ border: 1px solid getCssVar('border-color', 'light');
39
+
40
+ #{$arrow-selector}::before {
41
+ border: 1px solid getCssVar('border-color', 'light');
42
+ background: getCssVar('bg-color', 'overlay');
43
+ right: 0;
44
+ }
45
+ }
46
+
47
+ @include when(pure) {
48
+ padding: 0;
49
+ }
50
+
51
+ @include e(arrow) {
52
+ position: absolute;
53
+ width: 10px;
54
+ height: 10px;
55
+ z-index: -1;
56
+
57
+ &::before {
58
+ position: absolute;
59
+ width: 10px;
60
+ height: 10px;
61
+ z-index: -1;
62
+ content: ' ';
63
+ transform: rotate(45deg);
64
+ background: getCssVar('text-color', 'primary');
65
+ box-sizing: border-box;
66
+ }
67
+ }
68
+
69
+ $placements: (
70
+ 'top': 'bottom',
71
+ 'bottom': 'top',
72
+ 'left': 'right',
73
+ 'right': 'left',
74
+ );
75
+
76
+ @each $placement, $opposite in $placements {
77
+ &[data-popper-placement^='#{$placement}'] > #{$arrow-selector} {
78
+ #{$opposite}: -5px;
79
+
80
+ &::before {
81
+ @if $placement == top {
82
+ border-bottom-right-radius: 2px;
83
+ }
84
+ @if $placement == bottom {
85
+ border-top-left-radius: 2px;
86
+ }
87
+ @if $placement == left {
88
+ border-top-right-radius: 2px;
89
+ }
90
+ @if $placement == right {
91
+ border-bottom-left-radius: 2px;
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ @each $placement,
98
+ $adjacency
99
+ in ('top': 'left', 'bottom': 'right', 'left': 'bottom', 'right': 'top')
100
+ {
101
+ &[data-popper-placement^='#{$placement}'] {
102
+ #{$arrow-selector}::before {
103
+ border-#{$placement}-color: transparent !important;
104
+ border-#{$adjacency}-color: transparent !important;
105
+ }
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,11 @@
1
+ import Popper from './popper.vue';
2
+
3
+ import PopperArrow from './arrow.vue';
4
+ import PopperTrigger from './trigger.vue';
5
+ import PopperContent from './content.vue';
6
+
7
+ export { PopperArrow, PopperTrigger, PopperContent, Popper };
8
+
9
+ export * from './types';
10
+
11
+ export type { Placement, Options } from '@popperjs/core';