@varlet/cli 1.27.20 → 2.0.0-alpha.1663499244572

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 (232) hide show
  1. package/LICENCE +21 -21
  2. package/README.en-US.md +401 -401
  3. package/README.md +396 -396
  4. package/lib/commands/build.d.ts +1 -1
  5. package/lib/commands/build.js +18 -67
  6. package/lib/commands/changelog.d.ts +6 -6
  7. package/lib/commands/changelog.js +26 -27
  8. package/lib/commands/commitLint.d.ts +1 -1
  9. package/lib/commands/commitLint.js +50 -21
  10. package/lib/commands/compile.d.ts +7 -5
  11. package/lib/commands/compile.js +43 -119
  12. package/lib/commands/create.d.ts +8 -3
  13. package/lib/commands/create.js +90 -132
  14. package/lib/commands/dev.d.ts +5 -3
  15. package/lib/commands/dev.js +44 -123
  16. package/lib/commands/gen.d.ts +8 -1
  17. package/lib/commands/gen.js +85 -112
  18. package/lib/commands/lint.d.ts +1 -1
  19. package/lib/commands/lint.js +48 -123
  20. package/lib/commands/preview.d.ts +1 -1
  21. package/lib/commands/preview.js +23 -74
  22. package/lib/commands/release.d.ts +5 -3
  23. package/lib/commands/release.js +132 -270
  24. package/lib/commands/test.d.ts +7 -0
  25. package/lib/commands/test.js +26 -0
  26. package/lib/commands/vite.d.ts +3 -0
  27. package/lib/commands/vite.js +20 -0
  28. package/lib/compiler/compileModule.d.ts +5 -5
  29. package/lib/compiler/compileModule.js +79 -186
  30. package/lib/compiler/compileSFC.d.ts +2 -2
  31. package/lib/compiler/compileSFC.js +86 -132
  32. package/lib/compiler/compileScript.d.ts +17 -17
  33. package/lib/compiler/compileScript.js +152 -202
  34. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  35. package/lib/compiler/compileSiteEntry.js +140 -237
  36. package/lib/compiler/compileStyle.d.ts +11 -11
  37. package/lib/compiler/compileStyle.js +43 -101
  38. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  39. package/lib/compiler/compileTemplateHighlight.js +145 -193
  40. package/lib/compiler/compileTypes.d.ts +2 -2
  41. package/lib/compiler/compileTypes.js +49 -88
  42. package/lib/config/babel.config.d.ts +2 -2
  43. package/lib/config/babel.config.js +30 -31
  44. package/lib/config/babel.sfc.transform.d.ts +1 -1
  45. package/lib/config/babel.sfc.transform.js +18 -18
  46. package/lib/config/varlet.config.d.ts +1 -1
  47. package/lib/config/varlet.config.js +23 -24
  48. package/lib/config/vite.config.d.ts +5 -5
  49. package/lib/config/vite.config.js +157 -162
  50. package/lib/config/vitest.config.d.ts +2 -0
  51. package/lib/config/vitest.config.js +28 -0
  52. package/lib/index.d.ts +2 -2
  53. package/lib/index.js +84 -83
  54. package/lib/shared/constant.d.ts +44 -43
  55. package/lib/shared/constant.js +51 -50
  56. package/lib/shared/fsUtils.d.ts +12 -12
  57. package/lib/shared/fsUtils.js +61 -108
  58. package/lib/shared/logger.d.ts +8 -7
  59. package/lib/shared/logger.js +23 -20
  60. package/package.json +20 -17
  61. package/preset.js +3 -3
  62. package/site/components/button/Button.vue +106 -84
  63. package/site/components/button/button.less +183 -183
  64. package/site/components/button/index.ts +10 -10
  65. package/site/components/button/props.ts +78 -70
  66. package/site/components/cell/Cell.vue +54 -42
  67. package/site/components/cell/cell.less +78 -74
  68. package/site/components/cell/index.ts +10 -10
  69. package/site/components/cell/props.ts +27 -27
  70. package/site/components/code-example/CodeExample.vue +137 -143
  71. package/site/components/code-example/codeExample.less +41 -41
  72. package/site/components/code-example/index.ts +10 -10
  73. package/site/components/context/index.ts +21 -17
  74. package/site/components/context/lock.ts +92 -103
  75. package/site/components/context/zIndex.ts +20 -20
  76. package/site/components/icon/Icon.vue +75 -68
  77. package/site/components/icon/icon.less +26 -26
  78. package/site/components/icon/index.ts +10 -10
  79. package/site/components/icon/props.ts +24 -24
  80. package/site/components/loading/Loading.vue +84 -55
  81. package/site/components/loading/index.ts +10 -10
  82. package/site/components/loading/loading.less +505 -420
  83. package/site/components/loading/props.ts +42 -37
  84. package/site/components/popup/Popup.tsx +102 -0
  85. package/site/components/popup/index.ts +10 -0
  86. package/site/components/popup/popup.less +125 -0
  87. package/site/components/popup/props.ts +63 -0
  88. package/site/components/progress/Progress.vue +112 -108
  89. package/site/components/progress/index.ts +10 -10
  90. package/site/components/progress/progress.less +101 -98
  91. package/site/components/progress/props.ts +55 -55
  92. package/site/components/ripple/index.ts +188 -167
  93. package/site/components/ripple/ripple.less +20 -17
  94. package/site/components/snackbar/Snackbar.vue +41 -38
  95. package/site/components/snackbar/core.vue +132 -117
  96. package/site/components/snackbar/index.tsx +270 -270
  97. package/site/components/snackbar/props.ts +97 -94
  98. package/site/components/snackbar/snackbar.less +135 -135
  99. package/site/components/styles/common.less +64 -64
  100. package/site/components/styles/elevation.less +126 -126
  101. package/site/components/styles/var.less +27 -27
  102. package/site/components/utils/components.ts +117 -69
  103. package/site/components/utils/elements.ts +102 -85
  104. package/site/index.html +49 -49
  105. package/site/mobile/App.vue +291 -291
  106. package/site/mobile/components/AppHome.vue +134 -134
  107. package/site/mobile/components/AppType.vue +22 -22
  108. package/site/mobile/components/app-bar/AppBar.vue +65 -69
  109. package/site/mobile/components/app-bar/appBar.less +57 -56
  110. package/site/mobile/components/app-bar/index.ts +10 -10
  111. package/site/mobile/components/app-bar/props.ts +25 -25
  112. package/site/mobile/main.ts +78 -74
  113. package/site/mobile.html +41 -41
  114. package/site/module.d.ts +5 -5
  115. package/site/pc/App.vue +43 -43
  116. package/site/pc/Layout.vue +423 -397
  117. package/site/pc/components/AnimationBox.vue +33 -45
  118. package/site/pc/components/AppHeader.vue +368 -355
  119. package/site/pc/components/AppMobile.vue +60 -54
  120. package/site/pc/components/AppSidebar.vue +143 -134
  121. package/site/pc/components/LogoAnimation.vue +117 -119
  122. package/site/pc/floating.ts +9 -9
  123. package/site/pc/main.ts +100 -94
  124. package/site/pc/pages/index/index.less +176 -231
  125. package/site/pc/pages/index/index.vue +130 -145
  126. package/site/pc/pages/index/locale/en-US.ts +1 -5
  127. package/site/pc/pages/index/locale/zh-CN.ts +1 -5
  128. package/site/tsconfig.json +11 -11
  129. package/site/useProgress.ts +72 -75
  130. package/site/utils.ts +167 -153
  131. package/template/create/__tests__/index.spec.ejs +8 -0
  132. package/{lib/config/jest.media.mock.d.ts → template/create/docs/en-US.md} +0 -0
  133. package/{lib/config/jest.style.mock.d.ts → template/create/docs/zh-CN.md} +0 -0
  134. package/template/create/example/index.ejs +15 -0
  135. package/template/create/example/locale/en-US.ts +3 -0
  136. package/{generators/config/i18n/tsx/src/button → template/create}/example/locale/index.ts +23 -23
  137. package/template/create/example/locale/zh-CN.ts +3 -0
  138. package/template/create/index.ejs +12 -0
  139. package/template/create/less.ejs +3 -0
  140. package/template/create/props.ts +1 -0
  141. package/template/create/tsx.ejs +13 -0
  142. package/template/create/vue.ejs +17 -0
  143. package/{generators → template/generators}/base/.prettierignore +9 -9
  144. package/{generators → template/generators}/base/.prettierrc +5 -5
  145. package/{generators → template/generators}/base/README.md +82 -82
  146. package/{generators → template/generators}/base/babel.config.js +10 -10
  147. package/{generators → template/generators}/base/public/highlight.css +1 -1
  148. package/{generators → template/generators}/base/public/logo.svg +1 -1
  149. package/{generators → template/generators}/base/shims/shims-md.d.ts +4 -4
  150. package/{generators → template/generators}/base/shims/shims-vue.d.ts +6 -6
  151. package/{generators → template/generators}/base/tsconfig.json +13 -13
  152. package/{generators → template/generators}/config/default/base/docs/home.zh-CN.md +10 -10
  153. package/{generators → template/generators}/config/default/base/package.json +105 -105
  154. package/{generators/config/i18n → template/generators/config/default}/base/types/basicComponent.d.ts +7 -7
  155. package/{generators/config/i18n → template/generators/config/default}/base/types/button.d.ts +12 -12
  156. package/{generators → template/generators}/config/default/base/types/index.d.ts +6 -6
  157. package/{generators → template/generators}/config/default/base/varlet.config.js +110 -110
  158. package/{generators → template/generators}/config/default/sfc/src/button/Button.vue +30 -30
  159. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/__tests__/index.spec.js +7 -7
  160. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/button.less +14 -14
  161. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/docs/zh-CN.md +47 -47
  162. package/{generators → template/generators}/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  163. package/{generators → template/generators}/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  164. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/example/index.vue +13 -13
  165. package/{generators → template/generators}/config/default/sfc/src/button/index.ts +10 -10
  166. package/{generators → template/generators}/config/default/tsx/src/button/Button.tsx +29 -31
  167. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/__tests__/index.spec.js +7 -7
  168. package/{generators/config/i18n → template/generators/config/default}/tsx/src/button/button.less +14 -14
  169. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/docs/zh-CN.md +47 -47
  170. package/{generators → template/generators}/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  171. package/{generators → template/generators}/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  172. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/example/index.vue +13 -13
  173. package/{generators → template/generators}/config/default/tsx/src/button/index.ts +10 -10
  174. package/{generators → template/generators}/config/i18n/base/docs/home.en-US.md +11 -11
  175. package/{generators → template/generators}/config/i18n/base/docs/home.zh-CN.md +10 -10
  176. package/{generators → template/generators}/config/i18n/base/package.json +105 -105
  177. package/{generators/config/default → template/generators/config/i18n}/base/types/basicComponent.d.ts +7 -7
  178. package/{generators/config/default → template/generators/config/i18n}/base/types/button.d.ts +12 -12
  179. package/{generators → template/generators}/config/i18n/base/types/index.d.ts +7 -7
  180. package/{generators → template/generators}/config/i18n/base/types/locale.d.ts +24 -24
  181. package/{generators → template/generators}/config/i18n/base/varlet.config.js +122 -122
  182. package/{generators → template/generators}/config/i18n/sfc/src/button/Button.vue +36 -36
  183. package/{generators → template/generators}/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  184. package/{generators → template/generators}/config/i18n/sfc/src/button/button.less +14 -14
  185. package/{generators → template/generators}/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  186. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/docs/zh-CN.md +34 -34
  187. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/BasicUse.vue +11 -11
  188. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/ModifyColor.vue +11 -11
  189. package/{generators → template/generators}/config/i18n/sfc/src/button/example/index.vue +13 -13
  190. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/locale/en-US.ts +5 -5
  191. package/{generators → template/generators}/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  192. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/locale/zh-CN.ts +5 -5
  193. package/{generators → template/generators}/config/i18n/sfc/src/button/index.ts +10 -10
  194. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/__tests__/index.spec.js +51 -51
  195. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/docs/en-US.md +26 -26
  196. package/{generators → template/generators}/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  197. package/{generators → template/generators}/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  198. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/en-US.ts +7 -7
  199. package/{generators → template/generators}/config/i18n/sfc/src/locale/index.ts +67 -67
  200. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/zh-CN.d.ts +5 -5
  201. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/zh-CN.ts +7 -7
  202. package/{generators → template/generators}/config/i18n/tsx/src/button/Button.tsx +33 -35
  203. package/{generators → template/generators}/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  204. package/{generators/config/default/sfc → template/generators/config/i18n/tsx}/src/button/button.less +14 -14
  205. package/{generators → template/generators}/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  206. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/docs/zh-CN.md +34 -34
  207. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/BasicUse.vue +11 -11
  208. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/ModifyColor.vue +11 -11
  209. package/{generators → template/generators}/config/i18n/tsx/src/button/example/index.vue +13 -13
  210. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/locale/en-US.ts +5 -5
  211. package/template/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -0
  212. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/locale/zh-CN.ts +5 -5
  213. package/{generators → template/generators}/config/i18n/tsx/src/button/index.ts +10 -10
  214. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/__tests__/index.spec.js +51 -51
  215. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/docs/en-US.md +26 -26
  216. package/{generators → template/generators}/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  217. package/{generators → template/generators}/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  218. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/en-US.ts +7 -7
  219. package/{generators → template/generators}/config/i18n/tsx/src/locale/index.ts +67 -67
  220. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/zh-CN.d.ts +5 -5
  221. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/zh-CN.ts +7 -7
  222. package/tsconfig.json +15 -14
  223. package/varlet.default.config.js +137 -15
  224. package/lib/commands/jest.d.ts +0 -8
  225. package/lib/commands/jest.js +0 -81
  226. package/lib/config/jest.config.d.ts +0 -1
  227. package/lib/config/jest.config.js +0 -36
  228. package/lib/config/jest.media.mock.js +0 -2
  229. package/lib/config/jest.style.mock.js +0 -2
  230. package/site/mobile/components/styles/common.less +0 -64
  231. package/site/mobile/components/styles/elevation.less +0 -126
  232. package/site/mobile/components/styles/var.less +0 -27
@@ -1,98 +1,101 @@
1
- @site-progress-font-size: var(--site-font-size-sm);
2
- @site-progress-ripple-color: #fff;
3
- @site-progress-track-color: #d8d8d8;
4
- @site-progress-background: var(--site-color-primary);
5
-
6
- :root {
7
- --site-progress-font-size: @site-progress-font-size;
8
- --site-progress-ripple-color: @site-progress-ripple-color;
9
- --site-progress-track-color: @site-progress-track-color;
10
- --site-progress-background: @site-progress-background;
11
- }
12
-
13
- .var-site-progress {
14
- position: relative;
15
- font-size: var(--site-progress-font-size);
16
-
17
- &-linear {
18
- display: flex;
19
- align-items: center;
20
-
21
- &__block {
22
- flex: 1;
23
- position: relative;
24
- overflow: hidden;
25
- }
26
-
27
- &__background,
28
- &__certain {
29
- width: 100%;
30
- height: 100%;
31
- }
32
-
33
- &__ripple {
34
- &::after {
35
- position: absolute;
36
- width: 0;
37
- background-color: var(--site-progress-ripple-color);
38
- height: 100%;
39
- opacity: 0;
40
- animation: ripple 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
41
- content: '';
42
- }
43
- }
44
-
45
- &__background {
46
- background-color: var(--site-progress-track-color);
47
- }
48
-
49
- &__certain {
50
- position: absolute;
51
- background-color: var(--site-progress-background);
52
- top: 0;
53
- left: 0;
54
- transition: all 0.2s, background-color 0.8s;
55
- }
56
-
57
- &__label {
58
- margin-left: 8px;
59
- flex: 0;
60
- }
61
-
62
- @keyframes ripple {
63
- 0% {
64
- width: 0;
65
- opacity: 0.1;
66
- }
67
- 20% {
68
- width: 0;
69
- opacity: 0.5;
70
- }
71
- 80% {
72
- width: 100%;
73
- opacity: 0;
74
- }
75
- }
76
- }
77
-
78
- &-circle {
79
- position: relative;
80
-
81
- &__background {
82
- stroke: var(--site-progress-track-color);
83
- }
84
-
85
- &__certain {
86
- transition: all 0.2s;
87
- stroke: var(--site-progress-background);
88
- position: absolute;
89
- }
90
-
91
- &__label {
92
- position: absolute;
93
- left: 50%;
94
- top: 50%;
95
- transform: translate(-50%, -50%);
96
- }
97
- }
98
- }
1
+ @site-progress-font-size: var(--site-font-size-sm);
2
+ @site-progress-ripple-color: #fff;
3
+ @site-progress-track-color: #d8d8d8;
4
+ @site-progress-background: var(--color-primary);
5
+
6
+ :root {
7
+ --site-progress-font-size: @site-progress-font-size;
8
+ --site-progress-ripple-color: @site-progress-ripple-color;
9
+ --site-progress-track-color: @site-progress-track-color;
10
+ --site-progress-background: @site-progress-background;
11
+ }
12
+
13
+ .var-site-progress {
14
+ position: relative;
15
+ font-size: var(--site-progress-font-size);
16
+
17
+ &__linear {
18
+ display: flex;
19
+ align-items: center;
20
+
21
+ &-block {
22
+ flex: 1;
23
+ position: relative;
24
+ overflow: hidden;
25
+ height: 4px;
26
+ }
27
+
28
+ &-background,
29
+ &-certain {
30
+ width: 100%;
31
+ height: 100%;
32
+ }
33
+
34
+ &-ripple {
35
+ &::after {
36
+ position: absolute;
37
+ width: 0;
38
+ background-color: var(--site-progress-ripple-color);
39
+ height: 100%;
40
+ opacity: 0;
41
+ animation: ripple 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
42
+ content: '';
43
+ }
44
+ }
45
+
46
+ &-background {
47
+ background-color: var(--site-progress-track-color);
48
+ }
49
+
50
+ &-certain {
51
+ position: absolute;
52
+ background-color: var(--site-progress-background);
53
+ top: 0;
54
+ left: 0;
55
+ transition: all 0.2s, background-color 0.8s;
56
+ }
57
+
58
+ &-label {
59
+ margin-left: 8px;
60
+ flex: 0;
61
+ }
62
+
63
+ @keyframes ripple {
64
+ 0% {
65
+ width: 0;
66
+ opacity: 0.1;
67
+ }
68
+ 20% {
69
+ width: 0;
70
+ opacity: 0.5;
71
+ }
72
+ 80% {
73
+ width: 100%;
74
+ opacity: 0;
75
+ }
76
+ }
77
+ }
78
+
79
+ &__circle {
80
+ position: relative;
81
+ width: 40px;
82
+ height: 40px;
83
+
84
+ &-background {
85
+ stroke: var(--site-progress-track-color);
86
+ }
87
+
88
+ &-certain {
89
+ transition: all 0.2s;
90
+ stroke: var(--site-progress-background);
91
+ position: absolute;
92
+ }
93
+
94
+ &-label {
95
+ position: absolute;
96
+ left: 50%;
97
+ top: 50%;
98
+ transform: translate(-50%, -50%);
99
+ }
100
+ }
101
+ }
@@ -1,55 +1,55 @@
1
- function modeValidator(mode: string): boolean {
2
- return ['linear', 'circle'].includes(mode)
3
- }
4
-
5
- export const props = {
6
- // progress 模式
7
- mode: {
8
- type: String,
9
- default: 'linear',
10
- validator: modeValidator,
11
- },
12
- // progress 线宽
13
- lineWidth: {
14
- type: [Number, String],
15
- default: 4,
16
- },
17
- // progress 颜色
18
- color: {
19
- type: String,
20
- },
21
- // progress 轨道颜色
22
- trackColor: {
23
- type: String,
24
- },
25
- // 是否添加水波纹效果
26
- ripple: {
27
- type: Boolean,
28
- default: false,
29
- },
30
- // progress 值
31
- value: {
32
- type: [Number, String],
33
- default: 0,
34
- },
35
- // 是否显示label
36
- label: {
37
- type: Boolean,
38
- default: false,
39
- },
40
- // circle 的尺寸
41
- size: {
42
- type: Number,
43
- default: 40,
44
- },
45
- // circle的原点
46
- rotate: {
47
- type: Number,
48
- default: 0,
49
- },
50
- // 是否显示 circle 轨道
51
- track: {
52
- type: Boolean,
53
- default: true,
54
- },
55
- }
1
+ function modeValidator(mode: string): boolean {
2
+ return ['linear', 'circle'].includes(mode)
3
+ }
4
+
5
+ export const props = {
6
+ // progress 模式
7
+ mode: {
8
+ type: String,
9
+ default: 'linear',
10
+ validator: modeValidator,
11
+ },
12
+ // progress 线宽
13
+ lineWidth: {
14
+ type: [Number, String],
15
+ default: 4,
16
+ },
17
+ // progress 颜色
18
+ color: {
19
+ type: String,
20
+ },
21
+ // progress 轨道颜色
22
+ trackColor: {
23
+ type: String,
24
+ },
25
+ // 是否添加水波纹效果
26
+ ripple: {
27
+ type: Boolean,
28
+ default: false,
29
+ },
30
+ // progress 值
31
+ value: {
32
+ type: [Number, String],
33
+ default: 0,
34
+ },
35
+ // 是否显示label
36
+ label: {
37
+ type: Boolean,
38
+ default: false,
39
+ },
40
+ // circle 的尺寸
41
+ size: {
42
+ type: [Number, String],
43
+ default: 40,
44
+ },
45
+ // circle的原点
46
+ rotate: {
47
+ type: Number,
48
+ default: 0,
49
+ },
50
+ // 是否显示 circle 轨道
51
+ track: {
52
+ type: Boolean,
53
+ default: true,
54
+ },
55
+ }
@@ -1,167 +1,188 @@
1
- import context from '../context'
2
- import './ripple.less'
3
- import '../styles/common.less'
4
- import type { Directive, Plugin, App } from 'vue'
5
- import type { DirectiveBinding } from '@vue/runtime-core'
6
-
7
- interface RippleStyles {
8
- x: number
9
- y: number
10
- centerX: number
11
- centerY: number
12
- size: number
13
- }
14
-
15
- interface RippleOptions {
16
- removeRipple: any
17
- touchmoveForbid: boolean
18
- color?: string
19
- disabled?: boolean
20
- tasker?: number | null
21
- }
22
-
23
- interface RippleHTMLElement extends HTMLElement {
24
- _ripple?: RippleOptions
25
- }
26
-
27
- const ANIMATION_DURATION = 250
28
-
29
- function setStyles(element: RippleHTMLElement) {
30
- const { zIndex, position } = window.getComputedStyle(element)
31
-
32
- element.style.overflow = 'hidden'
33
- element.style.overflowX = 'hidden'
34
- element.style.overflowY = 'hidden'
35
- position === 'static' && (element.style.position = 'relative')
36
- zIndex === 'auto' && (element.style.zIndex = '1')
37
- }
38
-
39
- function computeRippleStyles(element: RippleHTMLElement, event: TouchEvent): RippleStyles {
40
- const { top, left }: DOMRect = element.getBoundingClientRect()
41
- const { clientWidth, clientHeight } = element
42
-
43
- const radius: number = Math.sqrt(clientWidth ** 2 + clientHeight ** 2) / 2
44
- const size: number = radius * 2
45
-
46
- const localX: number = event.touches[0].clientX - left
47
- const localY: number = event.touches[0].clientY - top
48
-
49
- const centerX: number = (clientWidth - radius * 2) / 2
50
- const centerY: number = (clientHeight - radius * 2) / 2
51
-
52
- const x: number = localX - radius
53
- const y: number = localY - radius
54
-
55
- return { x, y, centerX, centerY, size }
56
- }
57
-
58
- function createRipple(this: RippleHTMLElement, event: TouchEvent) {
59
- const _ripple = this._ripple as RippleOptions
60
- _ripple.removeRipple()
61
-
62
- if (_ripple.disabled || _ripple.tasker) {
63
- return
64
- }
65
-
66
- const task = () => {
67
- _ripple.tasker = null
68
-
69
- const { x, y, centerX, centerY, size }: RippleStyles = computeRippleStyles(this, event)
70
- const ripple: RippleHTMLElement = document.createElement('div')
71
- ripple.classList.add('var-site-ripple')
72
- ripple.style.opacity = `0`
73
- ripple.style.transform = `translate(${x}px, ${y}px) scale3d(.3, .3, .3)`
74
- ripple.style.width = `${size}px`
75
- ripple.style.height = `${size}px`
76
- ripple.style.backgroundColor = _ripple.color ?? 'currentColor'
77
- ripple.dataset.createdAt = String(performance.now())
78
-
79
- setStyles(this)
80
-
81
- this.appendChild(ripple)
82
-
83
- window.setTimeout(() => {
84
- ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)`
85
- ripple.style.opacity = `.25`
86
- }, 20)
87
- }
88
-
89
- _ripple.tasker = window.setTimeout(task, 60)
90
- }
91
-
92
- function removeRipple(this: RippleHTMLElement) {
93
- const _ripple = this._ripple as RippleOptions
94
-
95
- const task = () => {
96
- const ripples: NodeListOf<RippleHTMLElement> = this.querySelectorAll('.var-site-ripple')
97
- if (!ripples.length) {
98
- return
99
- }
100
-
101
- const lastRipple: RippleHTMLElement = ripples[ripples.length - 1]
102
- const delay: number = ANIMATION_DURATION - performance.now() + Number(lastRipple.dataset.createdAt)
103
-
104
- setTimeout(() => {
105
- lastRipple.style.opacity = `0`
106
-
107
- setTimeout(() => lastRipple.parentNode?.removeChild(lastRipple), ANIMATION_DURATION)
108
- }, delay)
109
- }
110
-
111
- _ripple.tasker ? setTimeout(task, 60) : task()
112
- }
113
-
114
- function forbidRippleTask(this: RippleHTMLElement) {
115
- const _ripple = this._ripple as RippleOptions
116
- if (!_ripple.touchmoveForbid) {
117
- return
118
- }
119
-
120
- _ripple.tasker && window.clearTimeout(_ripple.tasker)
121
- _ripple.tasker = null
122
- }
123
-
124
- function mounted(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {
125
- el._ripple = {
126
- tasker: null,
127
- ...(binding.value ?? {}),
128
- touchmoveForbid: binding.value?.touchmoveForbid ?? context.touchmoveForbid,
129
- removeRipple: removeRipple.bind(el),
130
- }
131
-
132
- el.addEventListener('touchstart', createRipple, { passive: true })
133
- el.addEventListener('touchmove', forbidRippleTask, { passive: true })
134
- el.addEventListener('dragstart', removeRipple, { passive: true })
135
- document.addEventListener('touchend', el._ripple.removeRipple, { passive: true })
136
- document.addEventListener('touchcancel', el._ripple.removeRipple, { passive: true })
137
- }
138
-
139
- function unmounted(el: RippleHTMLElement) {
140
- el.removeEventListener('touchstart', createRipple)
141
- el.removeEventListener('touchmove', forbidRippleTask)
142
- el.removeEventListener('dragstart', removeRipple)
143
- document.removeEventListener('touchend', el._ripple!.removeRipple)
144
- document.removeEventListener('touchcancel', el._ripple!.removeRipple)
145
- }
146
-
147
- function updated(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {
148
- el._ripple = {
149
- ...el._ripple,
150
- ...(binding.value ?? {}),
151
- touchmoveForbid: binding.value?.touchmoveForbid ?? context.touchmoveForbid,
152
- tasker: null,
153
- }
154
- }
155
-
156
- const Ripple: Directive & Plugin = {
157
- mounted,
158
- unmounted,
159
- updated,
160
- install(app: App) {
161
- app.directive('ripple', this)
162
- },
163
- }
164
-
165
- export const _RippleComponent = Ripple
166
-
167
- export default Ripple
1
+ import context from '../context'
2
+ import './ripple.less'
3
+ import '../styles/common.less'
4
+ import { supportTouch } from '../utils/elements'
5
+ import { createNamespace } from '../utils/components'
6
+ import type { Directive, Plugin, App } from 'vue'
7
+ import type { DirectiveBinding } from '@vue/runtime-core'
8
+
9
+ const { n } = createNamespace('ripple')
10
+
11
+ interface RippleStyles {
12
+ x: number
13
+ y: number
14
+ centerX: number
15
+ centerY: number
16
+ size: number
17
+ }
18
+
19
+ interface RippleOptions {
20
+ removeRipple: any
21
+ touchmoveForbid: boolean
22
+ color?: string
23
+ disabled?: boolean
24
+ tasker?: number | null
25
+ }
26
+
27
+ interface RippleHTMLElement extends HTMLElement {
28
+ _ripple?: RippleOptions
29
+ }
30
+
31
+ const ANIMATION_DURATION = 250
32
+
33
+ function setStyles(element: RippleHTMLElement) {
34
+ const { zIndex, position } = window.getComputedStyle(element)
35
+
36
+ element.style.overflow = 'hidden'
37
+ element.style.overflowX = 'hidden'
38
+ element.style.overflowY = 'hidden'
39
+ position === 'static' && (element.style.position = 'relative')
40
+ zIndex === 'auto' && (element.style.zIndex = '1')
41
+ }
42
+
43
+ function computeRippleStyles(element: RippleHTMLElement, event: TouchEvent): RippleStyles {
44
+ const { top, left }: DOMRect = element.getBoundingClientRect()
45
+ const { clientWidth, clientHeight } = element
46
+
47
+ const radius: number = Math.sqrt(clientWidth ** 2 + clientHeight ** 2) / 2
48
+ const size: number = radius * 2
49
+
50
+ const localX: number = event.touches[0].clientX - left
51
+ const localY: number = event.touches[0].clientY - top
52
+
53
+ const centerX: number = (clientWidth - radius * 2) / 2
54
+ const centerY: number = (clientHeight - radius * 2) / 2
55
+
56
+ const x: number = localX - radius
57
+ const y: number = localY - radius
58
+
59
+ return { x, y, centerX, centerY, size }
60
+ }
61
+
62
+ function createRipple(this: RippleHTMLElement, event: TouchEvent) {
63
+ const _ripple = this._ripple as RippleOptions
64
+ _ripple.removeRipple()
65
+
66
+ if (_ripple.disabled || _ripple.tasker) {
67
+ return
68
+ }
69
+
70
+ const task = () => {
71
+ _ripple.tasker = null
72
+
73
+ const { x, y, centerX, centerY, size }: RippleStyles = computeRippleStyles(this, event)
74
+ const ripple: RippleHTMLElement = document.createElement('div')
75
+ ripple.classList.add(n())
76
+ ripple.style.opacity = `0`
77
+ ripple.style.transform = `translate(${x}px, ${y}px) scale3d(.3, .3, .3)`
78
+ ripple.style.width = `${size}px`
79
+ ripple.style.height = `${size}px`
80
+ _ripple.color && (ripple.style.backgroundColor = _ripple.color)
81
+ ripple.dataset.createdAt = String(performance.now())
82
+
83
+ setStyles(this)
84
+
85
+ this.appendChild(ripple)
86
+
87
+ window.setTimeout(() => {
88
+ ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)`
89
+ ripple.style.opacity = `.25`
90
+ }, 20)
91
+ }
92
+
93
+ _ripple.tasker = window.setTimeout(task, 60)
94
+ }
95
+
96
+ function removeRipple(this: RippleHTMLElement) {
97
+ const _ripple = this._ripple as RippleOptions
98
+
99
+ const task = () => {
100
+ const ripples: NodeListOf<RippleHTMLElement> = this.querySelectorAll(`.${n()}`)
101
+ if (!ripples.length) {
102
+ return
103
+ }
104
+
105
+ const lastRipple: RippleHTMLElement = ripples[ripples.length - 1]
106
+ const delay: number = ANIMATION_DURATION - performance.now() + Number(lastRipple.dataset.createdAt)
107
+
108
+ setTimeout(() => {
109
+ lastRipple.style.opacity = `0`
110
+
111
+ setTimeout(() => lastRipple.parentNode?.removeChild(lastRipple), ANIMATION_DURATION)
112
+ }, delay)
113
+ }
114
+
115
+ _ripple.tasker ? setTimeout(task, 60) : task()
116
+ }
117
+
118
+ function forbidRippleTask(this: RippleHTMLElement) {
119
+ const _ripple = this._ripple as RippleOptions
120
+
121
+ if (!supportTouch()) {
122
+ return
123
+ }
124
+
125
+ if (!_ripple.touchmoveForbid) {
126
+ return
127
+ }
128
+
129
+ _ripple.tasker && window.clearTimeout(_ripple.tasker)
130
+ _ripple.tasker = null
131
+ }
132
+
133
+ function mounted(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {
134
+ el._ripple = {
135
+ tasker: null,
136
+ ...(binding.value ?? {}),
137
+ touchmoveForbid: binding.value?.touchmoveForbid ?? context.touchmoveForbid,
138
+ removeRipple: removeRipple.bind(el),
139
+ }
140
+
141
+ el.addEventListener('touchstart', createRipple, { passive: true })
142
+ el.addEventListener('touchmove', forbidRippleTask, { passive: true })
143
+ el.addEventListener('dragstart', removeRipple, { passive: true })
144
+ document.addEventListener('touchend', el._ripple.removeRipple, { passive: true })
145
+ document.addEventListener('touchcancel', el._ripple.removeRipple, { passive: true })
146
+ }
147
+
148
+ function unmounted(el: RippleHTMLElement) {
149
+ el.removeEventListener('touchstart', createRipple)
150
+ el.removeEventListener('touchmove', forbidRippleTask)
151
+ el.removeEventListener('dragstart', removeRipple)
152
+ document.removeEventListener('touchend', el._ripple!.removeRipple)
153
+ document.removeEventListener('touchcancel', el._ripple!.removeRipple)
154
+ }
155
+
156
+ function updated(el: RippleHTMLElement, binding: DirectiveBinding<RippleOptions>) {
157
+ const newBinding = {
158
+ touchmoveForbid: binding.value?.touchmoveForbid ?? context.touchmoveForbid,
159
+ color: binding.value?.color,
160
+ disabled: binding.value?.disabled,
161
+ }
162
+
163
+ const diff =
164
+ newBinding.touchmoveForbid !== el._ripple?.touchmoveForbid ||
165
+ newBinding.color !== el._ripple?.color ||
166
+ newBinding.disabled !== el._ripple?.disabled
167
+
168
+ if (diff) {
169
+ el._ripple = {
170
+ tasker: newBinding.disabled ? null : el._ripple?.tasker,
171
+ removeRipple: el._ripple?.removeRipple,
172
+ ...newBinding,
173
+ }
174
+ }
175
+ }
176
+
177
+ const Ripple: Directive & Plugin = {
178
+ mounted,
179
+ unmounted,
180
+ updated,
181
+ install(app: App) {
182
+ app.directive('ripple', this)
183
+ },
184
+ }
185
+
186
+ export const _RippleComponent = Ripple
187
+
188
+ export default Ripple