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,231 @@
1
+ @import "@vri/styles/web";
2
+ @import "../../styles/vars";
3
+
4
+ @mixin pagination-button {
5
+ display: flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ font-size: getCssVar('pagination-font-size');
9
+ min-width: getCssVar('pagination-button-width');
10
+ height: getCssVar('pagination-button-height');
11
+ line-height: getCssVar('pagination-button-height');
12
+ color: getCssVar('pagination-button-color');
13
+ background: getCssVar('pagination-bg-color');
14
+ padding: 0 4px;
15
+ border: none;
16
+ border-radius: getCssVar('pagination-border-radius');
17
+ cursor: pointer;
18
+ text-align: center;
19
+ box-sizing: border-box;
20
+
21
+ .vri-icon {
22
+ color: inherit;
23
+ }
24
+
25
+ * {
26
+ pointer-events: none;
27
+ }
28
+
29
+ &:focus {
30
+ outline: none;
31
+ }
32
+
33
+ &:hover {
34
+ color: getCssVar('pagination-hover-color');
35
+ }
36
+
37
+ &.is-active {
38
+ color: getCssVar('pagination-hover-color');
39
+ cursor: default;
40
+ font-weight: bold;
41
+
42
+ &.is-disabled {
43
+ font-weight: bold;
44
+ //
45
+ //.vri-icon {
46
+ // color: getCssVar('text', 'secondary-color');
47
+ //}
48
+ }
49
+ }
50
+
51
+ &:disabled,
52
+ &.is-disabled {
53
+ color: getCssVar('pagination-button-disabled-color');
54
+ background-color: getCssVar('pagination-button-disabled-bg-color');
55
+ cursor: not-allowed;
56
+ }
57
+
58
+ &:focus-visible {
59
+ outline: 1px solid getCssVar('pagination-hover-color');
60
+ outline-offset: -1px;
61
+ }
62
+ }
63
+
64
+ @include set-root-css-vars('pagination', $pagination);
65
+
66
+ @include b(pagination) {
67
+
68
+ white-space: nowrap;
69
+ color: getCssVar('pagination-text-color');
70
+ font-size: getCssVar('pagination-font-size');
71
+ font-weight: normal;
72
+ display: flex;
73
+ align-items: center;
74
+
75
+ .#{$namespace}-input__inner {
76
+ text-align: center;
77
+ -moz-appearance: textfield;
78
+ }
79
+
80
+ .#{$namespace}-select .#{$namespace}-input {
81
+ width: 128px;
82
+ }
83
+
84
+ button {
85
+ @include pagination-button;
86
+ }
87
+
88
+ .btn-prev,
89
+ .btn-next {
90
+ .#{$namespace}-icon {
91
+ display: block;
92
+ font-size: 12px;
93
+ font-weight: bold;
94
+ width: inherit;
95
+ }
96
+ }
97
+
98
+ & > * {
99
+ @include when(first) {
100
+ margin-left: 0 !important;
101
+ }
102
+ @include when(last) {
103
+ margin-right: 0 !important;
104
+ }
105
+ }
106
+
107
+ .btn-prev {
108
+ margin-left: getCssVar('pagination-item-gap');
109
+ }
110
+
111
+ @include e(sizes) {
112
+ margin-left: getCssVar('pagination-item-gap');
113
+ font-weight: normal;
114
+ color: getCssVar('text', 'regular-color');
115
+ }
116
+
117
+ @include e(total) {
118
+ margin-left: getCssVar('pagination-item-gap');
119
+ font-weight: normal;
120
+ color: getCssVar('text', 'regular-color');
121
+
122
+ &[disabled='true'] {
123
+ color: getCssVar('text', 'placeholder-color');
124
+ }
125
+ }
126
+
127
+ @include e(jump) {
128
+ display: flex;
129
+ align-items: center;
130
+ margin-left: getCssVar('pagination-item-gap');
131
+ font-weight: normal;
132
+ color: getCssVar('text', 'regular-color');
133
+
134
+ &[disabled='true'] {
135
+ color: getCssVar('text', 'placeholder-color');
136
+ }
137
+
138
+ @include e(goto) {
139
+ margin-right: 8px;
140
+ }
141
+
142
+ @include e(editor) {
143
+ text-align: center;
144
+ box-sizing: border-box;
145
+
146
+ &.#{$namespace}-input {
147
+ width: 56px;
148
+ }
149
+
150
+ .#{$namespace}-input__inner::-webkit-inner-spin-button,
151
+ .#{$namespace}-input__inner::-webkit-outer-spin-button {
152
+ -webkit-appearance: none;
153
+ margin: 0;
154
+ }
155
+ }
156
+
157
+ @include e(classifier) {
158
+ margin-left: 8px;
159
+ }
160
+ }
161
+
162
+ @include e(rightwrapper) {
163
+ flex: 1;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: flex-end;
167
+ }
168
+
169
+ @include when(background) {
170
+ .btn-prev,
171
+ .btn-next,
172
+ .#{$namespace}-pager li {
173
+ margin: 0 4px;
174
+ background-color: getCssVar('pagination-button-bg-color');
175
+
176
+ &.is-active {
177
+ background-color: getCssVar('primary-color');
178
+ color: getCssVar('color-white');
179
+ }
180
+
181
+ &:disabled,
182
+ &.is-disabled {
183
+ color: getCssVar('text', 'placeholder-color');
184
+ background-color: getCssVar('disabled-bg-color');
185
+
186
+ &.is-active {
187
+ color: getCssVar('text', 'secondary-color');
188
+ background-color: getCssVar('fill-color', 'dark');
189
+ }
190
+ }
191
+ }
192
+
193
+ .btn-prev {
194
+ margin-left: getCssVar('pagination-item-gap');
195
+ }
196
+ }
197
+
198
+ @include m(small) {
199
+ .btn-prev,
200
+ .btn-next,
201
+ .#{$namespace}-pager li {
202
+ height: getCssVar('pagination-button-height-small');
203
+ line-height: getCssVar('pagination-button-height-small');
204
+ font-size: getCssVar('pagination-font-size-small');
205
+ min-width: getCssVar('pagination-button-width-small');
206
+ }
207
+
208
+ span:not([class*='suffix']),
209
+ button {
210
+ font-size: getCssVar('pagination-font-size-small');
211
+ }
212
+
213
+ .#{$namespace}-select .#{$namespace}-input {
214
+ width: 100px;
215
+ }
216
+ }
217
+ }
218
+
219
+ @include b(pager) {
220
+ user-select: none;
221
+ list-style: none;
222
+ font-size: 0;
223
+ padding: 0;
224
+ margin: 0;
225
+ display: flex;
226
+ align-items: center;
227
+
228
+ li {
229
+ @include pagination-button;
230
+ }
231
+ }
@@ -0,0 +1,5 @@
1
+ import Pagination from './pagination';
2
+
3
+ export {
4
+ Pagination
5
+ };
@@ -0,0 +1,363 @@
1
+ import { isNumber } from '@vri/utils';
2
+ import { computed, type ComputedRef, defineComponent, getCurrentInstance, h, type InjectionKey, provide, ref, watch, type WritableComputedRef } from 'vue';
3
+ import { useNamespace } from '../../use';
4
+
5
+ import Prev from './components/prev.vue';
6
+ import Next from './components/next.vue';
7
+ import Sizes from './components/sizes.vue';
8
+ import Jumper from './components/jumper.vue';
9
+ import Total from './components/total.vue';
10
+ import Pager from './components/pager.vue';
11
+
12
+ import type { VNode } from 'vue';
13
+ import { elPaginationKey } from './usePagination';
14
+ import './index.scss';
15
+
16
+ /**
17
+ * It it user's responsibility to guarantee that the value of props.total... is number
18
+ * (same as pageSize, defaultPageSize, currentPage, defaultCurrentPage, pageCount)
19
+ * Otherwise we can reasonable infer that the corresponding field is absent
20
+ */
21
+ const isAbsent = (v: unknown): v is undefined => typeof v !== 'number';
22
+
23
+ type LayoutKey = 'prev' | 'pager' | 'next' | 'jumper' | '->' | 'total' | 'sizes' | 'slot';
24
+
25
+ export const paginationEmits = {
26
+ 'update:current-page': (val: number) => isNumber(val),
27
+ 'update:page-size': (val: number) => isNumber(val),
28
+ 'size-change': (val: number) => isNumber(val),
29
+ 'current-change': (val: number) => isNumber(val),
30
+ 'prev-click': (val: number) => isNumber(val),
31
+ 'next-click': (val: number) => isNumber(val)
32
+ };
33
+ export type PaginationEmits = typeof paginationEmits;
34
+
35
+ const componentName = 'VriPagination';
36
+ export default defineComponent({
37
+ name: componentName,
38
+ props: {
39
+ /**
40
+ * @description total item count
41
+ */
42
+ total: Number,
43
+ /**
44
+ * @description options of item count per page
45
+ */
46
+ pageSize: Number,
47
+ /**
48
+ * @description default initial value of page size
49
+ */
50
+ defaultPageSize: Number,
51
+ /**
52
+ * @description current page number
53
+ */
54
+ currentPage: Number,
55
+ /**
56
+ * @description default initial value of current-page
57
+ */
58
+ defaultCurrentPage: Number,
59
+ /**
60
+ * @description total page count. Set either `total` or `page-count` and pages will be displayed; if you need `page-sizes`, `total` is required
61
+ */
62
+ pageCount: Number,
63
+ /**
64
+ * @description number of pagers. Pagination collapses when the total page count exceeds this value
65
+ */
66
+ pagerCount: {
67
+ type: Number,
68
+ validator: (value: unknown) => {
69
+ return isNumber(value) && Math.trunc(value) === value && value > 4 && value < 22 && value % 2 === 1;
70
+ },
71
+ default: 7
72
+ },
73
+ /**
74
+ * @description layout of Pagination, elements separated with a comma
75
+ */
76
+ layout: {
77
+ type: String,
78
+ default: (['prev', 'pager', 'next', 'jumper', '->', 'total'] as LayoutKey[]).join(', ')
79
+ },
80
+ /**
81
+ * @description item count of each page
82
+ */
83
+ pageSizes: {
84
+ type: Array,
85
+ default: [10, 20, 30, 40, 50, 100]
86
+ },
87
+ /**
88
+ * @description custom class name for the page size Select's dropdown
89
+ */
90
+ popperClass: {
91
+ type: String,
92
+ default: ''
93
+ },
94
+ /**
95
+ * @description text for the prev button
96
+ */
97
+ prevText: {
98
+ type: String,
99
+ default: ''
100
+ },
101
+ /**
102
+ * @description icon for the prev button, higher priority of `prev-text`
103
+ */
104
+ prevIcon: {
105
+ type: String,
106
+ default: () => 'ArrowLeft'
107
+ },
108
+ /**
109
+ * @description text for the next button
110
+ */
111
+ nextText: {
112
+ type: String,
113
+ default: ''
114
+ },
115
+ /**
116
+ * @description icon for the next button, higher priority of `next-text`
117
+ */
118
+ nextIcon: {
119
+ type: String,
120
+ default: () => 'ArrowRight'
121
+ },
122
+ /**
123
+ * @description whether to use small pagination
124
+ */
125
+ small: Boolean,
126
+ /**
127
+ * @description whether the buttons have a background color
128
+ */
129
+ background: Boolean,
130
+ /**
131
+ * @description whether Pagination is disabled
132
+ */
133
+ disabled: Boolean,
134
+ /**
135
+ * @description whether to hide when there's only one page
136
+ */
137
+ hideOnSinglePage: Boolean
138
+ },
139
+ emits: paginationEmits,
140
+ setup(props, { emit, slots }) {
141
+ const ns = useNamespace('pagination');
142
+ const vnodeProps = getCurrentInstance()!.vnode.props || {};
143
+ // we can find @xxx="xxx" props on `vnodeProps` to check if user bind corresponding events
144
+ const hasCurrentPageListener = 'onUpdate:currentPage' in vnodeProps || 'onUpdate:current-page' in vnodeProps || 'onCurrentChange' in vnodeProps;
145
+ const hasPageSizeListener = 'onUpdate:pageSize' in vnodeProps || 'onUpdate:page-size' in vnodeProps || 'onSizeChange' in vnodeProps;
146
+ const assertValidUsage = computed(() => {
147
+ // Users have to set either one, otherwise count of pages cannot be determined
148
+ if (isAbsent(props.total) && isAbsent(props.pageCount)) return false;
149
+ // <el-pagination ...otherProps :current-page="xxx" /> without corresponding listener is forbidden now
150
+ // Users have to use two way binding of `currentPage`
151
+ // If users just want to provide a default value, `defaultCurrentPage` is here for you
152
+ if (!isAbsent(props.currentPage) && !hasCurrentPageListener) return false;
153
+ // When you want to change sizes, things get more complex, detailed below
154
+ // Basically the most important value we need is page count
155
+ // either directly from props.pageCount
156
+ // or calculated from props.total
157
+ // we will take props.pageCount precedence over props.total
158
+ if (props.layout.includes('sizes')) {
159
+ if (!isAbsent(props.pageCount)) {
160
+ // if props.pageCount is assign by user, then user have to watch pageSize change
161
+ // and recalculate pageCount
162
+ if (!hasPageSizeListener) return false;
163
+ } else if (!isAbsent(props.total)) {
164
+ // Otherwise, we will see if user have props.pageSize defined
165
+ // If so, meaning user want to have pageSize controlled himself/herself from component
166
+ // Thus page size listener is required
167
+ // users are account for page size change
168
+ if (!isAbsent(props.pageSize)) {
169
+ if (!hasPageSizeListener) {
170
+ return false;
171
+ }
172
+ } else {
173
+ // (else block just for explaination)
174
+ // else page size is controlled by el-pagination internally
175
+ }
176
+ }
177
+ }
178
+ return true;
179
+ });
180
+
181
+ const innerPageSize = ref(isAbsent(props.defaultPageSize) ? 10 : props.defaultPageSize);
182
+ const innerCurrentPage = ref(isAbsent(props.defaultCurrentPage) ? 1 : props.defaultCurrentPage);
183
+
184
+ const pageSizeBridge = computed({
185
+ get() {
186
+ return isAbsent(props.pageSize) ? innerPageSize.value : props.pageSize;
187
+ },
188
+ set(v: number) {
189
+ if (isAbsent(props.pageSize)) {
190
+ innerPageSize.value = v;
191
+ }
192
+ if (hasPageSizeListener) {
193
+ emit('update:page-size', v);
194
+ emit('size-change', v);
195
+ }
196
+ }
197
+ });
198
+
199
+ const pageCountBridge = computed<number>(() => {
200
+ let pageCount = 0;
201
+ if (!isAbsent(props.pageCount)) {
202
+ pageCount = props.pageCount;
203
+ } else if (!isAbsent(props.total)) {
204
+ pageCount = Math.max(1, Math.ceil(props.total / pageSizeBridge.value));
205
+ }
206
+ return pageCount;
207
+ });
208
+
209
+ const currentPageBridge = computed<number>({
210
+ get() {
211
+ return isAbsent(props.currentPage) ? innerCurrentPage.value : props.currentPage;
212
+ },
213
+ set(v) {
214
+ let newCurrentPage = v;
215
+ if (v < 1) {
216
+ newCurrentPage = 1;
217
+ } else if (v > pageCountBridge.value) {
218
+ newCurrentPage = pageCountBridge.value;
219
+ }
220
+ if (isAbsent(props.currentPage)) {
221
+ innerCurrentPage.value = newCurrentPage;
222
+ }
223
+ if (hasCurrentPageListener) {
224
+ emit('update:current-page', newCurrentPage);
225
+ emit('current-change', newCurrentPage);
226
+ }
227
+ }
228
+ });
229
+
230
+ watch(pageCountBridge, (val) => {
231
+ if (currentPageBridge.value > val) currentPageBridge.value = val;
232
+ });
233
+
234
+ function handleCurrentChange(val: number) {
235
+ currentPageBridge.value = val;
236
+ }
237
+
238
+ function handleSizeChange(val: number) {
239
+ pageSizeBridge.value = val;
240
+ const newPageCount = pageCountBridge.value;
241
+ if (currentPageBridge.value > newPageCount) {
242
+ currentPageBridge.value = newPageCount;
243
+ }
244
+ }
245
+
246
+ function prev() {
247
+ if (props.disabled) return;
248
+ currentPageBridge.value -= 1;
249
+ emit('prev-click', currentPageBridge.value);
250
+ }
251
+
252
+ function next() {
253
+ if (props.disabled) return;
254
+ currentPageBridge.value += 1;
255
+ emit('next-click', currentPageBridge.value);
256
+ }
257
+
258
+ function addClass(element: any, cls: string) {
259
+ if (element) {
260
+ if (!element.props) {
261
+ element.props = {};
262
+ }
263
+ element.props.class = [element.props.class, cls].join(' ');
264
+ }
265
+ }
266
+
267
+ provide(elPaginationKey, {
268
+ pageCount: pageCountBridge,
269
+ disabled: computed(() => props.disabled),
270
+ currentPage: currentPageBridge,
271
+ changeEvent: handleCurrentChange,
272
+ handleSizeChange
273
+ });
274
+
275
+ return () => {
276
+ if (!assertValidUsage.value) {
277
+ // debugWarn(componentName, t('el.pagination.deprecationWarning'));
278
+ return null;
279
+ }
280
+ if (!props.layout) return null;
281
+ if (props.hideOnSinglePage && pageCountBridge.value <= 1) return null;
282
+ const rootChildren: Array<VNode | VNode[] | null> = [];
283
+ const rightWrapperChildren: Array<VNode | VNode[] | null> = [];
284
+ const rightWrapperRoot = h('div', { class: ns.e('rightwrapper') }, rightWrapperChildren);
285
+ const TEMPLATE_MAP: Record<Exclude<LayoutKey, '->'>, VNode | VNode[] | null> = {
286
+ prev: h(Prev, {
287
+ disabled: props.disabled,
288
+ currentPage: currentPageBridge.value,
289
+ prevText: props.prevText,
290
+ prevIcon: props.prevIcon,
291
+ onClick: prev
292
+ }),
293
+ jumper: h(Jumper, {
294
+ size: props.small ? 'small' : 'default'
295
+ }),
296
+ pager: h(Pager, {
297
+ currentPage: currentPageBridge.value,
298
+ pageCount: pageCountBridge.value,
299
+ pagerCount: props.pagerCount,
300
+ onChange: handleCurrentChange,
301
+ disabled: props.disabled
302
+ }),
303
+ next: h(Next, {
304
+ disabled: props.disabled,
305
+ currentPage: currentPageBridge.value,
306
+ pageCount: pageCountBridge.value,
307
+ nextText: props.nextText,
308
+ nextIcon: props.nextIcon,
309
+ onClick: next
310
+ }),
311
+ sizes: h(Sizes, {
312
+ pageSize: pageSizeBridge.value,
313
+ pageSizes: props.pageSizes,
314
+ popperClass: props.popperClass,
315
+ disabled: props.disabled,
316
+ size: props.small ? 'small' : 'default'
317
+ }),
318
+ slot: slots?.default?.() ?? null,
319
+ total: h(Total, { total: isAbsent(props.total) ? 0 : props.total })
320
+ };
321
+
322
+ const components = props.layout.split(',').map((item: string) => item.trim()) as LayoutKey[];
323
+
324
+ let haveRightWrapper = false;
325
+
326
+ components.forEach((c) => {
327
+ if (c === '->') {
328
+ haveRightWrapper = true;
329
+ return;
330
+ }
331
+ if (!haveRightWrapper) {
332
+ rootChildren.push(TEMPLATE_MAP[c]);
333
+ } else {
334
+ rightWrapperChildren.push(TEMPLATE_MAP[c]);
335
+ }
336
+ });
337
+
338
+ addClass(rootChildren[0], ns.is('first'));
339
+ addClass(rootChildren[rootChildren.length - 1], ns.is('last'));
340
+
341
+ if (haveRightWrapper && rightWrapperChildren.length > 0) {
342
+ addClass(rightWrapperChildren[0], ns.is('first'));
343
+ addClass(rightWrapperChildren[rightWrapperChildren.length - 1], ns.is('last'));
344
+ rootChildren.push(rightWrapperRoot);
345
+ }
346
+ return h(
347
+ 'div',
348
+ {
349
+ role: 'pagination',
350
+ 'aria-label': 'pagination',
351
+ class: [
352
+ ns.b(),
353
+ ns.is('background', props.background),
354
+ {
355
+ [ns.m('small')]: props.small
356
+ }
357
+ ]
358
+ },
359
+ rootChildren
360
+ );
361
+ };
362
+ }
363
+ });
@@ -0,0 +1,13 @@
1
+ import type { ComputedRef, InjectionKey, WritableComputedRef } from 'vue';
2
+ import { inject } from 'vue';
3
+ export interface ElPaginationContext {
4
+ currentPage?: WritableComputedRef<number>;
5
+ pageCount?: ComputedRef<number>;
6
+ disabled?: ComputedRef<boolean>;
7
+ changeEvent?: (val: number) => void;
8
+ handleSizeChange?: (val: number) => void;
9
+ }
10
+
11
+ export const elPaginationKey: InjectionKey<ElPaginationContext> = Symbol('elPaginationKey');
12
+
13
+ export const usePagination = () => inject(elPaginationKey, {});
@@ -0,0 +1,21 @@
1
+ import type { DirectiveBinding, ObjectDirective } from 'vue';
2
+ import type { PopoverInstance } from './popover';
3
+
4
+ const attachEvents = (el: HTMLElement, binding: DirectiveBinding) => {
5
+ const popperComponent: PopoverInstance = binding.arg || binding.value;
6
+ const popover = popperComponent?.popperRef;
7
+ if (popover) {
8
+ popover.triggerRef = el;
9
+ }
10
+ };
11
+
12
+ export default {
13
+ mounted(el, binding) {
14
+ attachEvents(el, binding);
15
+ },
16
+ updated(el, binding) {
17
+ attachEvents(el, binding);
18
+ }
19
+ } as ObjectDirective;
20
+
21
+ export const VPopover = 'popover';
@@ -0,0 +1,58 @@
1
+ @include b(popover) {
2
+ @include set-component-css-var('popover', $popover);
3
+
4
+ &.#{$namespace}-popper {
5
+ background: getCssVar('popover-bg-color');
6
+ min-width: 150px;
7
+ border-radius: getCssVar('popover-border-radius');
8
+ border: 1px solid getCssVar('popover-border-color');
9
+ padding: getCssVar('popover-padding');
10
+ z-index: getCssVar('index-popper');
11
+ color: getCssVar('text-color', 'regular');
12
+ line-height: 1.4;
13
+ text-align: justify;
14
+ font-size: getCssVar('popover-font-size');
15
+ box-shadow: getCssVar('box-shadow-light');
16
+ word-break: break-all;
17
+ box-sizing: border-box;
18
+
19
+ @include m(plain) {
20
+ padding: getCssVar('popover-padding-large');
21
+ }
22
+
23
+ @include e(title) {
24
+ color: getCssVar('popover-title-text-color');
25
+ font-size: getCssVar('popover-title-font-size');
26
+ line-height: 1;
27
+ margin-bottom: 12px;
28
+ }
29
+
30
+ @include e(reference) {
31
+ &:focus:not(.focusing),
32
+ &:focus:hover {
33
+ outline-width: 0;
34
+ }
35
+ }
36
+
37
+ @include when(dark) {
38
+ @include set-css-var-value(
39
+ ('popover', 'bg-color'),
40
+ var(#{getCssVarName('text-color', 'primary')})
41
+ );
42
+ @include set-css-var-value(
43
+ ('popover', 'border-color'),
44
+ var(#{getCssVarName('text-color', 'primary')})
45
+ );
46
+ @include set-css-var-value(
47
+ ('popover', 'title-text-color'),
48
+ var(#{getCssVarName('bg-color')})
49
+ );
50
+ color: getCssVar('bg-color');
51
+ }
52
+
53
+ &:focus:active,
54
+ &:focus {
55
+ outline-width: 0;
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,3 @@
1
+ import Popover from './index.vue';
2
+
3
+ export { Popover };