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,336 @@
1
+ $name: menu;
2
+
3
+ @include set-root-css-vars($name, $menu);
4
+
5
+ @function getCompCssVar($value) {
6
+ @return getCssVar($name, $value);
7
+ }
8
+
9
+ @mixin menu-item {
10
+ display: flex;
11
+ align-items: center;
12
+ height: getCompCssVar('item-height');
13
+ line-height: getCompCssVar('item-height');
14
+ font-size: getCompCssVar('item-font-size');
15
+ color: getCompCssVar('text-color');
16
+ padding: 0 getCompCssVar('base-level-padding');
17
+ list-style: none;
18
+ cursor: pointer;
19
+ position: relative;
20
+ transition: border-color getCssVar('transition-duration'),
21
+ background-color getCssVar('transition-duration'),
22
+ color getCssVar('transition-duration');
23
+ box-sizing: border-box;
24
+ white-space: nowrap;
25
+
26
+ * {
27
+ vertical-align: bottom;
28
+ }
29
+
30
+ i {
31
+ margin-right: getCompCssVar('icon-mr');;
32
+ }
33
+
34
+ &:hover,
35
+ &:focus {
36
+ outline: none;
37
+ }
38
+
39
+ &:hover {
40
+ background-color: getCompCssVar('hover-bg-color');
41
+ }
42
+
43
+ @include when(disabled) {
44
+ opacity: 0.25;
45
+ cursor: not-allowed;
46
+ background: none !important;
47
+ }
48
+
49
+ span {
50
+ @include line-clamp(1);
51
+ word-break: break-all;
52
+ }
53
+ }
54
+
55
+ @include b(menu) {
56
+ border-right: solid 1px getCompCssVar('border-color');
57
+ list-style: none;
58
+ position: relative;
59
+ margin: 0;
60
+ padding-left: 0;
61
+ background-color: getCompCssVar('bg-color');
62
+ box-sizing: border-box;
63
+ @include m(vertical) {
64
+ &:not(.#{$namespace}-menu--collapse):not(.#{$namespace}-menu--popup-container) {
65
+ & .#{$namespace}-menu-item,
66
+ & .#{$namespace}-sub-menu__title,
67
+ & .#{$namespace}-menu-item-group__title {
68
+ //white-space: nowrap;
69
+ padding-left: calc(
70
+ #{getCompCssVar('base-level-padding')} + #{getCompCssVar('level')} *
71
+ #{getCompCssVar('level-padding')}
72
+ );
73
+ }
74
+ }
75
+ @include b(menu-item) {
76
+ white-space: initial;
77
+ }
78
+ }
79
+
80
+ @include m(horizontal) {
81
+ display: flex;
82
+ flex-wrap: nowrap;
83
+ border-bottom: getCompCssVar('border-bottom');
84
+ border-right: none;
85
+
86
+ & > .#{$namespace}-menu-item {
87
+ display: inline-flex;
88
+ justify-content: center;
89
+ align-items: center;
90
+
91
+ height: 100%;
92
+
93
+ margin: 0;
94
+ border-bottom: 2px solid transparent;
95
+ color: getCompCssVar('text-color');
96
+
97
+ a,
98
+ a:hover {
99
+ color: inherit;
100
+ }
101
+
102
+ &:not(.is-disabled):hover,
103
+ &:not(.is-disabled):focus {
104
+ background-color: #fff;
105
+ }
106
+ }
107
+ & > .#{$namespace}-sub-menu {
108
+ &:focus,
109
+ &:hover {
110
+ outline: none;
111
+ }
112
+
113
+ &:hover {
114
+ .#{$namespace}-sub-menu__title {
115
+ color: getCompCssVar('hover-text-color');
116
+ }
117
+ }
118
+
119
+ &.is-active {
120
+ .#{$namespace}-sub-menu__title {
121
+ border-bottom: 2px solid getCompCssVar('active-color');
122
+ color: getCompCssVar('active-color');
123
+
124
+ &:hover {
125
+ color: getCompCssVar('hover-text-color');
126
+ }
127
+ }
128
+ }
129
+
130
+ & .#{$namespace}-sub-menu__title {
131
+ height: 100%;
132
+ line-height: 100%;
133
+ border-bottom: 2px solid transparent;
134
+ color: getCompCssVar('text-color');
135
+
136
+ &:hover {
137
+ background-color: getCompCssVar('hover-bg-color');
138
+ }
139
+ }
140
+ }
141
+ & .#{$namespace}-menu {
142
+ & .#{$namespace}-menu-item,
143
+ & .#{$namespace}-sub-menu__title {
144
+ background-color: getCompCssVar('bg-color');
145
+ display: flex;
146
+ align-items: center;
147
+ height: getCompCssVar('horizontal-sub-item-height');
148
+ padding: 0 10px;
149
+ color: getCompCssVar('text-color');
150
+ }
151
+
152
+ & .#{$namespace}-sub-menu__title {
153
+ padding-right: 40px;
154
+ }
155
+
156
+ & .#{$namespace}-menu-item.is-active,
157
+ & .#{$namespace}-sub-menu.is-active > .#{$namespace}-sub-menu__title {
158
+ color: getCompCssVar('active-color');
159
+ }
160
+ }
161
+ & .#{$namespace}-menu-item:not(.is-disabled):hover {
162
+ outline: none;
163
+ color: getCompCssVar('hover-text-color');
164
+ background-color: getCompCssVar('hover-bg-color');
165
+ }
166
+ & .#{$namespace}-menu-item:not(.is-disabled):focus {
167
+ outline: none;
168
+ color: getCompCssVar('focus-text-color');
169
+ background-color: getCompCssVar('focus-bg-color');
170
+ }
171
+ & > .#{$namespace}-menu-item.is-active {
172
+ border-bottom: 2px solid getCompCssVar('active-color');
173
+ color: getCompCssVar('active-color');
174
+ }
175
+ }
176
+ @include m(collapse) {
177
+ width: calc(
178
+ #{getCompCssVar('icon-width')} + #{getCompCssVar('base-level-padding')} *
179
+ 2
180
+ );
181
+
182
+ > .#{$namespace}-menu-item,
183
+ > .#{$namespace}-sub-menu > .#{$namespace}-sub-menu__title,
184
+ > .#{$namespace}-menu-item-group > ul > .#{$namespace}-sub-menu > .#{$namespace}-sub-menu__title {
185
+ [class^='#{$namespace}-icon'] {
186
+ margin: 0;
187
+ vertical-align: middle;
188
+ width: getCompCssVar('icon-width');
189
+ text-align: center;
190
+ }
191
+
192
+ .#{$namespace}-sub-menu__icon-arrow {
193
+ display: none;
194
+ }
195
+
196
+ > span {
197
+ height: 0;
198
+ width: 0;
199
+ overflow: hidden;
200
+ visibility: hidden;
201
+ display: inline-block;
202
+ }
203
+ }
204
+
205
+ > .#{$namespace}-menu-item.is-active i {
206
+ color: inherit;
207
+ }
208
+
209
+ .#{$namespace}-menu .#{$namespace}-sub-menu {
210
+ min-width: 200px;
211
+ }
212
+ }
213
+ @include m(popup) {
214
+ z-index: 100;
215
+ min-width: 200px;
216
+ border: none;
217
+ padding: 5px 0;
218
+ box-shadow: getCssVar('box-shadow-light');
219
+
220
+ // Todo radius
221
+ border-radius: getCompCssVar('popup-border-radius');
222
+
223
+ }
224
+
225
+ .#{$namespace}-icon {
226
+ flex-shrink: 0;
227
+ }
228
+ }
229
+
230
+ @include b(menu-item) {
231
+ @include menu-item;
232
+
233
+ & [class^='#{$namespace}-icon'] {
234
+ margin-right: 5px;
235
+ width: getCompCssVar('icon-width');
236
+ text-align: center;
237
+ font-size: 18px;
238
+ vertical-align: middle;
239
+ }
240
+ @include when(active) {
241
+ color: getCompCssVar('active-color');
242
+ i {
243
+ color: inherit;
244
+ }
245
+ }
246
+ .#{$namespace}-menu-tooltip__trigger {
247
+ position: absolute;
248
+ left: 0;
249
+ top: 0;
250
+ height: 100%;
251
+ width: 100%;
252
+ display: inline-flex;
253
+ align-items: center;
254
+ box-sizing: border-box;
255
+ padding: 0 getCompCssVar('base-level-padding');
256
+ }
257
+ }
258
+
259
+ @include b(sub-menu) {
260
+ list-style: none;
261
+ margin: 0;
262
+ padding-left: 0;
263
+ background: getCompCssVar('sub-menu-bg-color');;
264
+
265
+ @include e(title) {
266
+ @include menu-item;
267
+
268
+ &:hover {
269
+ background-color: getCompCssVar('hover-bg-color');
270
+ }
271
+
272
+ @include e(text) {
273
+ padding-right: 30px;
274
+ }
275
+
276
+ }
277
+ & .#{$namespace}-menu {
278
+ border: none;
279
+ }
280
+ & .#{$namespace}-menu-item {
281
+ height: getCompCssVar('sub-item-height');
282
+ line-height: getCompCssVar('sub-item-height');
283
+ min-width: getCompCssVar('item-min-width');
284
+ }
285
+ @include e(hide-arrow) {
286
+ .#{$namespace}-sub-menu__icon-arrow {
287
+ display: none !important;
288
+ }
289
+ }
290
+ @include when(active) {
291
+ .#{$namespace}-sub-menu__title {
292
+ border-bottom-color: getCompCssVar('active-color');
293
+ }
294
+ }
295
+ @include when(disabled) {
296
+ .#{$namespace}-sub-menu__title,
297
+ .#{$namespace}-menu-item {
298
+ opacity: 0.25;
299
+ cursor: not-allowed;
300
+ background: none !important;
301
+ }
302
+ }
303
+ .#{$namespace}-icon {
304
+ vertical-align: middle;
305
+ margin-right: getCompCssVar('icon-mr');;
306
+ text-align: center;
307
+
308
+ &.#{$namespace}-sub-menu__icon-more {
309
+ margin-right: 0 !important;
310
+ }
311
+ }
312
+ .#{$namespace}-sub-menu__icon-arrow {
313
+ position: absolute;
314
+ right: getCompCssVar('base-level-padding');
315
+ transition: transform getCssVar('transition-duration');
316
+ color: inherit;
317
+ }
318
+ }
319
+
320
+ @include b(menu-item-group) {
321
+ > ul {
322
+ padding: 0;
323
+ }
324
+ @include e(title) {
325
+ padding: 7px 0 7px getCompCssVar('base-level-padding');
326
+ line-height: normal;
327
+ font-size: 12px;
328
+ color: getCssVar('text-color', 'secondary');
329
+ }
330
+ }
331
+
332
+ .horizontal-collapse-transition .#{$namespace}-sub-menu__title .#{$namespace}-sub-menu__icon-arrow {
333
+ transition: getCssVar('transition-duration-fast');
334
+ opacity: 0;
335
+ }
336
+
@@ -0,0 +1,8 @@
1
+ import Menu from './menu.vue';
2
+ import MenuItem from './menu-item.vue';
3
+ import MenuItemGroup from './menu-item-group.vue';
4
+ import SubMenu from './sub-menu.vue';
5
+
6
+ export * from './types';
7
+
8
+ export { Menu, MenuItem, MenuItemGroup, SubMenu };
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ import { defineComponent } from 'vue';
3
+ import { useNamespace } from '../../use';
4
+ import { addClass, hasClass, removeClass } from '@vri/utils';
5
+
6
+ import type { BaseTransitionProps, TransitionProps } from 'vue';
7
+
8
+ export default defineComponent({
9
+ setup() {
10
+ const ns = useNamespace('menu');
11
+ const listeners = {
12
+ onBeforeEnter: (el) => (el.style.opacity = '0.2'),
13
+ onEnter(el, done) {
14
+ addClass(el, `${ns.namespace.value}-opacity-transition`);
15
+ el.style.opacity = '1';
16
+ done();
17
+ },
18
+
19
+ onAfterEnter(el) {
20
+ removeClass(el, `${ns.namespace.value}-opacity-transition`);
21
+ el.style.opacity = '';
22
+ },
23
+
24
+ onBeforeLeave(el) {
25
+ if (!el.dataset) {
26
+ ;(el as any).dataset = {};
27
+ }
28
+
29
+ if (hasClass(el, ns.m('collapse'))) {
30
+ removeClass(el, ns.m('collapse'));
31
+ el.dataset.oldOverflow = el.style.overflow;
32
+ el.dataset.scrollWidth = el.clientWidth.toString();
33
+ addClass(el, ns.m('collapse'));
34
+ } else {
35
+ addClass(el, ns.m('collapse'));
36
+ el.dataset.oldOverflow = el.style.overflow;
37
+ el.dataset.scrollWidth = el.clientWidth.toString();
38
+ removeClass(el, ns.m('collapse'));
39
+ }
40
+
41
+ el.style.width = `${el.scrollWidth}px`;
42
+ el.style.overflow = 'hidden';
43
+ },
44
+
45
+ onLeave(el: HTMLElement) {
46
+ addClass(el, 'horizontal-collapse-transition');
47
+ el.style.width = `${el.dataset.scrollWidth}px`;
48
+ }
49
+ } as BaseTransitionProps<HTMLElement> as TransitionProps;
50
+
51
+ return {
52
+ listeners
53
+ };
54
+ }
55
+ });
56
+ </script>
57
+
58
+ <template>
59
+ <transition mode="out-in" v-bind="listeners">
60
+ <slot />
61
+ </transition>
62
+ </template>
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <li :class="ns.b()">
3
+ <div :class="ns.e('title')">
4
+ <template v-if="!$slots.title">{{ title }}</template>
5
+ <slot v-else name="title" />
6
+ </div>
7
+ <ul>
8
+ <slot />
9
+ </ul>
10
+ </li>
11
+ </template>
12
+
13
+ <script lang="ts" setup>
14
+ import { useNamespace } from '../../use';
15
+
16
+ interface Props {
17
+ title?: string
18
+ }
19
+
20
+ defineProps<Props>();
21
+
22
+ const ns = /* hoist-static*/ useNamespace('menu-item-group');
23
+
24
+ defineOptions({
25
+ name: ns.b()
26
+ });
27
+ </script>
@@ -0,0 +1,126 @@
1
+ <script lang="ts" setup>
2
+ import { renderTNode, singleAttrToObj, VNode } from '@vri/utils';
3
+ import { computed, getCurrentInstance, inject, onBeforeUnmount, onMounted, reactive } from 'vue';
4
+ import { throwError } from '../../utils';
5
+ import { useNamespace } from '../../use';
6
+ import { type RouteLocationRaw } from 'vue-router';
7
+ import useMenu from './use-menu';
8
+ import { Icon, type IconProps } from '../../common';
9
+ import { Divider, Tooltip } from '../../web';
10
+
11
+ import type { MenuItemRegistered, MenuProvider, SubMenuProvider } from './types';
12
+
13
+ interface Props {
14
+ /** 唯一标志 */
15
+ index?: string;
16
+ /** Vue Router 路径对象 */
17
+ route?: RouteLocationRaw;
18
+ /** 是否禁用 */
19
+ disabled?: boolean;
20
+ icon?: IconProps;
21
+ title?: string;
22
+ isAloneUse?: boolean;
23
+ divider?: boolean;
24
+ className?: string
25
+ reverse?: boolean
26
+ }
27
+
28
+ const { index, route, disabled, icon, isAloneUse, divider, className, reverse } = defineProps<Props>();
29
+
30
+ const ns = /* hoist-static*/ useNamespace('menu-item');
31
+
32
+ const emit = defineEmits(['click']);
33
+
34
+ defineOptions({
35
+ name: ns.b()
36
+ });
37
+
38
+ const instance = getCurrentInstance()!;
39
+
40
+ const nsMenu = useNamespace('menu');
41
+
42
+ const nsMenuItem = useNamespace('menu-item');
43
+
44
+ // 获取来自 menu.vue 中注入的数据
45
+ const rootMenu = !isAloneUse ? inject<MenuProvider>('rootMenu') : null;
46
+ if (!rootMenu && !isAloneUse) throwError(ns.b(), 'can not inject root menu');
47
+
48
+ // indexPath:当前 menu-item 对应的 index 和 vri-sub-menu 的 index,parentMenu 为 vri-sub-menu 组件
49
+ const { parentMenu, indexPath } = useMenu(
50
+ instance,
51
+ computed(() => index!)
52
+ );
53
+
54
+ // 注入来自 sub-menu 中的 provide 数据
55
+ const subMenu = !isAloneUse ? inject<SubMenuProvider>(`subMenu:${parentMenu.value.uid}`) : null;
56
+ if (!subMenu && !isAloneUse) throwError(ns.b(), 'can not inject sub menu');
57
+
58
+ // 当前是否为 active
59
+ const active = computed(() => index === rootMenu?.activeIndex);
60
+
61
+ const item: MenuItemRegistered = reactive({
62
+ index: index!,
63
+ indexPath,
64
+ active
65
+ });
66
+
67
+ // 点击具体菜单项
68
+ const handleClick = () => {
69
+ if (!disabled) {
70
+ rootMenu?.handleMenuItemClick({
71
+ index: index!,
72
+ indexPath: indexPath.value,
73
+ route: route
74
+ });
75
+ emit('click', item);
76
+ }
77
+ };
78
+
79
+ const _icon = computed(() => {
80
+ return singleAttrToObj(icon, 'icon') as IconProps;
81
+ });
82
+
83
+ const title = computed(() => {
84
+ return renderTNode(instance, 'title');
85
+ });
86
+
87
+ onMounted(() => {
88
+ if (!isAloneUse) {
89
+ // 触发 sub-menu,vue 中的 addSubMenu
90
+ subMenu?.addSubMenu(item);
91
+ // 触发 menu.vue 中的 addMenuItem 更新 items
92
+ rootMenu?.addMenuItem(item);
93
+ }
94
+ });
95
+
96
+ onBeforeUnmount(() => {
97
+ if (!isAloneUse) {
98
+ subMenu?.removeSubMenu(item);
99
+ rootMenu?.removeMenuItem(item);
100
+ }
101
+ });
102
+ </script>
103
+
104
+ <template>
105
+ <Divider v-if="reverse && divider" marginY="0" />
106
+ <li :class="[className, nsMenuItem.b(), nsMenuItem.is('active', isAloneUse ? false : active), nsMenuItem.is('disabled', disabled)]" role="menuitem" tabindex="-1" @click="handleClick">
107
+ <tooltip
108
+ v-if="parentMenu?.type?.name === 'vri-menu' && rootMenu?.props.collapse && $slots.title"
109
+ placement="right" :fallback-placements="['left']" persistent>
110
+ <template #content>
111
+ <slot name="title" />
112
+ </template>
113
+ <div :class="nsMenu.be('tooltip', 'trigger')">
114
+ <slot />
115
+ </div>
116
+ </tooltip>
117
+ <template v-else>
118
+ <slot v-if="$slots?.default"/>
119
+ <template v-else>
120
+ <Icon v-if="_icon?.icon" v-bind="_icon" />
121
+ <span :title="title"><v-node :content="title" /></span>
122
+ </template>
123
+ </template>
124
+ </li>
125
+ <Divider v-if="!reverse && divider" marginY="0" />
126
+ </template>