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,162 @@
1
+ <script lang="ts" setup>
2
+ import { EVENT_CODE } from '@vri/constants';
3
+ import { isObject } from '@vri/utils';
4
+ import { useResizeObserver, useTimeoutFn } from '@vueuse/core';
5
+ import { useEventListener } from '@vri/use';
6
+ import type { CSSProperties } from 'vue';
7
+ import { computed, onMounted, ref, type VNode, watch } from 'vue';
8
+ import { useNamespace } from '../../use';
9
+ import { getLastOffset } from './instance';
10
+ import Icon from '../icon/index.vue';
11
+ import type { MessageType } from './message';
12
+
13
+ interface MessageProps {
14
+ customClass?: string;
15
+ center?: boolean;
16
+ dangerouslyUseHTMLString?: boolean;
17
+ duration?: number;
18
+ icon?: string;
19
+ id?: string;
20
+ message?: string | VNode | (() => VNode);
21
+ onClose?: Function;
22
+ showClose?: boolean;
23
+ type?: MessageType;
24
+ offset?: number;
25
+ zIndex?: number;
26
+ grouping?: boolean;
27
+ repeatNum?: number;
28
+ }
29
+
30
+ const props = defineProps<MessageProps>();
31
+
32
+ defineEmits(['destroy']);
33
+
34
+ const ns = useNamespace('message');
35
+
36
+ // 消息框 ref
37
+ const messageRef = ref<HTMLDivElement>();
38
+ // 是否可见
39
+ const visible = ref(false);
40
+ const height = ref(0);
41
+
42
+ let stopTimer: (() => void) | undefined = undefined;
43
+
44
+ const iconCfgMap = new Map([
45
+ ['success', { icon: 'vi-fill-success' }],
46
+ ['error', { icon: 'vi-fill-error' }],
47
+ ['warning', { icon: 'vi-fill-warning' }]
48
+ ]);
49
+
50
+ const iconCfg = computed(() => {
51
+ const _iconCfg = props.icon ? isObject(props.icon) ? props.icon : { icon: props.icon } : '';
52
+
53
+ return _iconCfg || iconCfgMap.get(props.type) || '';
54
+ });
55
+
56
+ const typeClass = computed(() => {
57
+ const type = props.type;
58
+ return { [ns.bm('icon', type)]: type };
59
+ });
60
+
61
+ const lastOffset = computed(() => getLastOffset(props.id));
62
+ // 偏移量
63
+ const offset = computed(() => props.offset + lastOffset.value);
64
+ const bottom = computed((): number => height.value + offset.value);
65
+ const customStyle = computed<CSSProperties>(() => ({
66
+ top: `${offset.value}px`,
67
+ zIndex: props.zIndex
68
+ }));
69
+
70
+ function startTimer () {
71
+ if (props.duration === 0) return;
72
+ ({ stop: stopTimer } = useTimeoutFn(() => {
73
+ close();
74
+ }, props.duration));
75
+ }
76
+
77
+ function clearTimer () {
78
+ stopTimer?.();
79
+ }
80
+
81
+ function close () {
82
+ visible.value = false;
83
+ }
84
+
85
+ // 监听退出键关闭
86
+ function keydown ({ code }: KeyboardEvent) {
87
+ if (code === EVENT_CODE.esc) {
88
+ close();
89
+ }
90
+ }
91
+
92
+ onMounted(() => {
93
+ startTimer();
94
+ visible.value = true;
95
+ });
96
+
97
+ watch(
98
+ () => props.repeatNum,
99
+ () => {
100
+ clearTimer();
101
+ startTimer();
102
+ }
103
+ );
104
+
105
+ // 监听键盘事件
106
+ useEventListener(document, 'keydown', keydown);
107
+
108
+ // 监听 messageRef 消息框的大小变化
109
+ useResizeObserver(messageRef, () => {
110
+ height.value = messageRef.value!.getBoundingClientRect().height;
111
+ });
112
+
113
+ defineExpose({
114
+ visible,
115
+ bottom,
116
+ close
117
+ });
118
+ </script>
119
+
120
+ <template>
121
+ <transition
122
+ :name="ns.b('fade')"
123
+ @before-leave="onClose"
124
+ @after-leave="$emit('destroy')"
125
+ >
126
+ <div
127
+ v-show="visible"
128
+ :id="id"
129
+ ref="messageRef"
130
+ :class="[
131
+ ns.b(),
132
+ { [ns.m(type)]: type && !icon },
133
+ ns.is('center', center),
134
+ ns.is('closable', showClose),
135
+ customClass,
136
+ ]"
137
+ :style="customStyle"
138
+ role="alert"
139
+ @mouseenter="clearTimer"
140
+ @mouseleave="startTimer"
141
+ >
142
+ <div v-if="iconCfg" :class="[ns.e('icon'), typeClass]">
143
+ <icon v-bind="iconCfg" />
144
+ </div>
145
+ <slot>
146
+ <p v-if="!dangerouslyUseHTMLString" :class="ns.e('content')">
147
+ {{ message }}
148
+ </p>
149
+ <!-- Caution here, message could've been compromised, never use user's input as message -->
150
+ <p v-else :class="ns.e('content')" v-html="message" />
151
+ </slot>
152
+ <div v-if="showClose" :class="ns.e('closeBtn')" @click.stop="close">
153
+ <icon icon="vi-close"/>
154
+ </div>
155
+ </div>
156
+ </transition>
157
+ </template>
158
+
159
+
160
+ <style lang="scss">
161
+ @import "./message.scss";
162
+ </style>
@@ -0,0 +1,172 @@
1
+ import { createVNode, render } from 'vue';
2
+ import { isClient } from '@vueuse/core';
3
+ import { isElement, isFunction, isNumber, isString, isVNode } from '@vri/utils';
4
+ import { useZIndex } from '../../use';
5
+ import { debugWarn } from '../../utils';
6
+ import MessageConstructor from './message.vue';
7
+ import { messageDefaults, messageTypes } from './message';
8
+ import { instances } from './instance';
9
+ import { messageConfig } from '../config-provider/types';
10
+ import type { MessageContext } from './instance';
11
+ import type { AppContext } from 'vue';
12
+ import type { Message, MessageFn, MessageHandler, MessageParamsNormalized, MessageParams, MessageType } from './message';
13
+
14
+ let seed = 1;
15
+
16
+ // 获取最终处理后的 message 的参数
17
+ const normalizeOptions = (params?: MessageParams) => {
18
+ const options = !params || isString(params) || isVNode(params) || isFunction(params) ? { message: params } : params;
19
+
20
+ // 合并传入的数据与默认的值
21
+ const normalized = {
22
+ ...messageDefaults,
23
+ ...options
24
+ };
25
+
26
+ // appendTo 默认指定为 body
27
+ if (!normalized.appendTo) {
28
+ normalized.appendTo = document.body;
29
+ } else if (isString(normalized.appendTo)) {
30
+ let appendTo = document.querySelector<HTMLElement>(normalized.appendTo);
31
+ // 当外部传入了 appendTo 但是我们获取到的 appendTo 不是一个元素节点,抛出警告,然后继续默认指定为 body
32
+ if (!isElement(appendTo)) {
33
+ debugWarn('VriMessage', 'the appendTo option is not an HTMLElement. Falling back to document.body.');
34
+ appendTo = document.body;
35
+ }
36
+
37
+ normalized.appendTo = appendTo;
38
+ }
39
+
40
+ return normalized as MessageParamsNormalized;
41
+ };
42
+
43
+ // 关闭 message
44
+ const closeMessage = (instance: MessageContext) => {
45
+ const idx = instances.indexOf(instance);
46
+ if (idx === -1) return;
47
+
48
+ instances.splice(idx, 1);
49
+ const { handler } = instance;
50
+ handler.close();
51
+ };
52
+
53
+ /**
54
+ * @description 创建一个 message 实例
55
+ * @author wfd
56
+ * @date 2022/10/31 15:37
57
+ * @example
58
+ * @param {any} appendTo
59
+ * @param {Omit<, "appendTo">} options
60
+ * @param {AppContext | null} context
61
+ * @returns {MessageContext}
62
+ */
63
+ const createMessage = ({ appendTo, ...options }: MessageParamsNormalized, context?: AppContext | null): MessageContext => {
64
+ // z-index 的设置
65
+ const { nextZIndex } = useZIndex();
66
+ // 自定义 message 的 id
67
+ const id = `message_${seed++}`;
68
+ // 获取用户自定义的 onClose
69
+ const userOnClose = options.onClose;
70
+
71
+ const container = document.createElement('div');
72
+
73
+ const props = {
74
+ ...options,
75
+ zIndex: nextZIndex() + options.zIndex!,
76
+ id,
77
+ onClose: () => {
78
+ userOnClose?.();
79
+ closeMessage(instance);
80
+ },
81
+
82
+ // 清除 message element 防止内存泄漏
83
+ onDestroy: () => {
84
+ render(null, container);
85
+ }
86
+ };
87
+ // 创建一个虚拟节点,children 的用处是为了 message 可能是函数或者虚拟节点
88
+ const vnode = createVNode(MessageConstructor, props, isFunction(props.message) || isVNode(props.message) ? { default: isFunction(props.message) ? props.message : () => props.message } : null);
89
+
90
+ // 设置 context
91
+ vnode.appContext = context || message._context;
92
+ // 渲染虚拟dom
93
+ render(vnode, container);
94
+
95
+ // 将渲染好的 dom 添加到 appendTo 上,默认是添加到 body 上
96
+ appendTo.appendChild(container.firstElementChild!);
97
+
98
+ const vm = vnode.component!;
99
+
100
+ const handler: MessageHandler = {
101
+ // instead of calling the onClose function directly,
102
+ // setting this value so that we can have the full lifecycle
103
+ // for out component, so that all closing steps will not be skipped.
104
+ close: () => {
105
+ // 将 message 组件暴露出来的 visible 设置为 false
106
+ vm.exposed!.visible.value = false;
107
+ }
108
+ };
109
+
110
+ // 返回这个实例
111
+ const instance: MessageContext = {
112
+ id,
113
+ vnode,
114
+ vm,
115
+ handler,
116
+ props: (vnode.component as any).props
117
+ };
118
+
119
+ return instance;
120
+ };
121
+
122
+ // message 初始化相关
123
+ const message: MessageFn & Partial<Message> & { _context: AppContext | null } = (options = {}, context) => {
124
+ if (!isClient) return { close: () => undefined };
125
+
126
+ // 判断设置最大的 message 展示的数量
127
+ if (isNumber(messageConfig.max) && instances.length >= messageConfig.max) {
128
+ return { close: () => undefined };
129
+ }
130
+ // 获取最终处理后的 message 的参数
131
+ const normalized = normalizeOptions(options);
132
+
133
+ // 开启分组,message 实例存在
134
+ if (normalized.grouping && instances.length) {
135
+ // 找出当前实例中展示的 message 与现在 options 参数中 message 一致的 message 实例
136
+ const instance = instances.find(({ vnode: vm }) => vm.props?.message === normalized.message);
137
+ // repeatNum ++
138
+ if (instance) {
139
+ instance.props.repeatNum += 1;
140
+ instance.props.type = normalized.type;
141
+ return instance.handler;
142
+ }
143
+ }
144
+ // 创建一个 message 实例
145
+ const instance = createMessage(normalized, context);
146
+ // 将 message 实例 push 至数组中
147
+ instances.push(instance);
148
+
149
+ return instance.handler;
150
+ };
151
+
152
+ //
153
+ messageTypes.forEach((type) => {
154
+ message[type] = (options = {}, appContext) => {
155
+ const normalized = normalizeOptions(options);
156
+ return message({ ...normalized, type }, appContext);
157
+ };
158
+ });
159
+
160
+ // 关闭所有 message
161
+ export function closeAll(type?: MessageType): void {
162
+ for (const instance of instances) {
163
+ if (!type || type === instance.props.type) {
164
+ instance.handler.close();
165
+ }
166
+ }
167
+ }
168
+
169
+ message.closeAll = closeAll;
170
+ message._context = null;
171
+
172
+ export default message as Message;
@@ -0,0 +1,14 @@
1
+ @include b(overlay) {
2
+ #{& + '-root'} {
3
+ height: 0;
4
+ }
5
+ position: fixed;
6
+ top: 0;
7
+ right: 0;
8
+ bottom: 0;
9
+ left: 0;
10
+ z-index: 1;
11
+ height: 100%;
12
+ background-color: getCssVar('overlay-color', 'lighter');
13
+ overflow: auto;
14
+ }
@@ -0,0 +1,3 @@
1
+ import Overlay from './index.vue';
2
+
3
+ export { Overlay };
@@ -0,0 +1,117 @@
1
+ <script lang="ts" setup>
2
+ import { createVNode, useSlots, type CSSProperties, h, renderSlot } from 'vue';
3
+ import { useNamespace } from '../../use';
4
+ import { NOOP } from '@vue/shared';
5
+
6
+ enum PatchFlags {
7
+ TEXT = 1,
8
+ CLASS = 2,
9
+ STYLE = 4,
10
+ PROPS = 8,
11
+ FULL_PROPS = 16,
12
+ HYDRATE_EVENTS = 32,
13
+ STABLE_FRAGMENT = 64,
14
+ KEYED_FRAGMENT = 128,
15
+ UNKEYED_FRAGMENT = 256,
16
+ NEED_PATCH = 512,
17
+ DYNAMIC_SLOTS = 1024,
18
+ HOISTED = -1,
19
+ BAIL = -2
20
+ }
21
+
22
+ interface Props {
23
+ mask?: boolean;
24
+ onlyNode?: boolean
25
+ customMaskEvent?: boolean;
26
+ overlayClass?: any;
27
+ zIndex?: Numberish;
28
+ }
29
+
30
+ const useSameTarget = (handleClick?: (e: MouseEvent) => void) => {
31
+ if (!handleClick) {
32
+ return { onClick: NOOP, onMousedown: NOOP, onMouseup: NOOP };
33
+ }
34
+
35
+ let mousedownTarget = false;
36
+ let mouseupTarget = false;
37
+
38
+ const onClick = (e: MouseEvent) => {
39
+ // if and only if
40
+ if (mousedownTarget && mouseupTarget) {
41
+ handleClick(e);
42
+ }
43
+ mousedownTarget = mouseupTarget = false;
44
+ };
45
+
46
+ const onMousedown = (e: MouseEvent) => {
47
+ // marking current mousedown target.
48
+ mousedownTarget = e.target === e.currentTarget;
49
+ };
50
+ const onMouseup = (e: MouseEvent) => {
51
+ // marking current mouseup target.
52
+ mouseupTarget = e.target === e.currentTarget;
53
+ };
54
+
55
+ return { onClick, onMousedown, onMouseup };
56
+ };
57
+
58
+ const { mask, customMaskEvent, overlayClass, zIndex, onlyNode } = defineProps<Props>();
59
+
60
+ const ns = /* hoist-static*/ useNamespace('overlay');
61
+
62
+ defineOptions({
63
+ name: ns.b()
64
+ });
65
+
66
+ const emit = defineEmits(['click']);
67
+
68
+ const slots = useSlots();
69
+
70
+ const onMaskClick = (e: MouseEvent) => {
71
+ emit('click', e);
72
+ };
73
+
74
+ const { onClick, onMousedown, onMouseup } = useSameTarget(customMaskEvent ? undefined : onMaskClick);
75
+
76
+ defineRender(() => {
77
+ return mask
78
+ ? createVNode(
79
+ 'div',
80
+ {
81
+ class: [ns.b(), overlayClass],
82
+ style: {
83
+ zIndex: zIndex
84
+ },
85
+ onClick,
86
+ onMousedown,
87
+ onMouseup
88
+ },
89
+ [renderSlot(slots, 'default')],
90
+ PatchFlags.STYLE | PatchFlags.CLASS | PatchFlags.PROPS,
91
+ ['onClick', 'onMouseup', 'onMousedown']
92
+ )
93
+ : onlyNode ? h(
94
+ 'div',
95
+ {},
96
+ [renderSlot(slots, 'default')]
97
+ ) : h(
98
+ 'div',
99
+ {
100
+ class: overlayClass,
101
+ style: {
102
+ zIndex: zIndex,
103
+ position: 'fixed',
104
+ top: '0px',
105
+ right: '0px',
106
+ bottom: '0px',
107
+ left: '0px'
108
+ } as CSSProperties
109
+ },
110
+ [renderSlot(slots, 'default')]
111
+ );
112
+ });
113
+ </script>
114
+
115
+ <style lang="scss">
116
+ @import './index.scss';
117
+ </style>
@@ -0,0 +1 @@
1
+ export const COMP_TYPE = ['success', 'info', 'warning', 'danger', ''];
@@ -0,0 +1 @@
1
+ export * from './comp';
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './web';
2
+ export * from './common';
3
+ export * from './page';
@@ -0,0 +1 @@
1
+ export * from './page-wrapper';
@@ -0,0 +1,31 @@
1
+ $name: page-wrapper;
2
+ $page-wrpper: () !default;
3
+ $page-wrpper: map-merge((
4
+ 'text-color': white,
5
+ ), $page-wrpper);
6
+
7
+ @include set-root-css-vars($name, $page-wrpper);
8
+
9
+ @function getCompCssVar($value) {
10
+ @return getCssVar($name, $value);
11
+ }
12
+
13
+ @include b($name) {
14
+ height: 60px;
15
+
16
+ @include e(header) {
17
+ display: flex;
18
+ height: 100%;
19
+ padding-left: 20px;
20
+ align-items: center;
21
+ border-bottom: 8px solid #eee;
22
+
23
+ @include e(title) {
24
+ font-size: 20px;
25
+ }
26
+ }
27
+
28
+ @include e(content) {
29
+ padding: 20px 20px 0 20px;
30
+ }
31
+ }
@@ -0,0 +1,5 @@
1
+ import PageWrapper from './index.vue';
2
+
3
+ export {
4
+ PageWrapper
5
+ };
@@ -0,0 +1,31 @@
1
+ <script lang="ts" setup>
2
+ import { useNamespace } from '../../use';
3
+ import './index.scss';
4
+
5
+ interface Props {
6
+ title?: string;
7
+ }
8
+
9
+ const {
10
+ title
11
+ } = defineProps<Props>();
12
+
13
+ const ns = /* hoist-static*/ useNamespace('page-wrapper');
14
+
15
+ defineOptions({
16
+ name: ns.b()
17
+ });
18
+
19
+ const { getTitle } = useRouterHelper();
20
+ </script>
21
+
22
+ <template>
23
+ <div :class="ns.b()">
24
+ <div :class="ns.e('header')">
25
+ <span :class="ns.e('title')">{{ title || getTitle }}</span>
26
+ </div>
27
+ <div :class="ns.e('content')">
28
+ <slot />
29
+ </div>
30
+ </div>
31
+ </template>