@varlet/cli 2.0.0-alpha.1663499244572 → 2.0.0-alpha.1663742071515

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 (231) 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 +67 -18
  6. package/lib/commands/changelog.d.ts +6 -6
  7. package/lib/commands/changelog.js +27 -26
  8. package/lib/commands/commitLint.d.ts +1 -1
  9. package/lib/commands/commitLint.js +21 -50
  10. package/lib/commands/compile.d.ts +7 -7
  11. package/lib/commands/compile.js +119 -43
  12. package/lib/commands/create.d.ts +8 -8
  13. package/lib/commands/create.js +181 -90
  14. package/lib/commands/dev.d.ts +5 -5
  15. package/lib/commands/dev.js +123 -44
  16. package/lib/commands/gen.d.ts +8 -8
  17. package/lib/commands/gen.js +140 -85
  18. package/lib/commands/jest.d.ts +8 -0
  19. package/lib/commands/jest.js +85 -0
  20. package/lib/commands/lint.d.ts +1 -1
  21. package/lib/commands/lint.js +123 -48
  22. package/lib/commands/preview.d.ts +1 -1
  23. package/lib/commands/preview.js +74 -23
  24. package/lib/commands/release.d.ts +5 -5
  25. package/lib/commands/release.js +270 -132
  26. package/lib/commands/test.d.ts +7 -7
  27. package/lib/commands/test.js +26 -26
  28. package/lib/commands/useVite.d.ts +1 -0
  29. package/lib/commands/useVite.js +70 -0
  30. package/lib/commands/vite.d.ts +3 -3
  31. package/lib/commands/vite.js +69 -20
  32. package/lib/compiler/compileModule.d.ts +5 -5
  33. package/lib/compiler/compileModule.js +190 -79
  34. package/lib/compiler/compileSFC.d.ts +2 -2
  35. package/lib/compiler/compileSFC.js +135 -86
  36. package/lib/compiler/compileScript.d.ts +17 -17
  37. package/lib/compiler/compileScript.js +194 -152
  38. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  39. package/lib/compiler/compileSiteEntry.js +237 -140
  40. package/lib/compiler/compileStyle.d.ts +11 -11
  41. package/lib/compiler/compileStyle.js +91 -43
  42. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  43. package/lib/compiler/compileTemplateHighlight.js +193 -145
  44. package/lib/compiler/compileTypes.d.ts +2 -2
  45. package/lib/compiler/compileTypes.js +85 -49
  46. package/lib/config/babel.config.d.ts +2 -2
  47. package/lib/config/babel.config.js +31 -30
  48. package/lib/config/babel.sfc.transform.d.ts +1 -1
  49. package/lib/config/babel.sfc.transform.js +18 -18
  50. package/lib/config/jest.config.d.ts +1 -0
  51. package/lib/config/jest.config.js +37 -0
  52. package/lib/config/jest.media.mock.d.ts +0 -0
  53. package/lib/config/jest.media.mock.js +2 -0
  54. package/lib/config/jest.style.mock.d.ts +0 -0
  55. package/lib/config/jest.style.mock.js +2 -0
  56. package/lib/config/varlet.config.d.ts +1 -1
  57. package/lib/config/varlet.config.js +24 -23
  58. package/lib/config/vite.config.d.ts +5 -5
  59. package/lib/config/vite.config.js +162 -157
  60. package/lib/config/vitest.config.d.ts +2 -2
  61. package/lib/config/vitest.config.js +28 -28
  62. package/lib/index.d.ts +2 -2
  63. package/lib/index.js +102 -84
  64. package/lib/shared/constant.d.ts +43 -44
  65. package/lib/shared/constant.js +50 -51
  66. package/lib/shared/fsUtils.d.ts +12 -12
  67. package/lib/shared/fsUtils.js +108 -61
  68. package/lib/shared/logger.d.ts +8 -8
  69. package/lib/shared/logger.js +23 -23
  70. package/package.json +11 -10
  71. package/preset.js +3 -3
  72. package/site/components/button/Button.vue +106 -106
  73. package/site/components/button/button.less +183 -183
  74. package/site/components/button/index.ts +10 -10
  75. package/site/components/button/props.ts +78 -78
  76. package/site/components/cell/Cell.vue +54 -54
  77. package/site/components/cell/cell.less +78 -78
  78. package/site/components/cell/index.ts +10 -10
  79. package/site/components/cell/props.ts +27 -27
  80. package/site/components/code-example/CodeExample.vue +137 -137
  81. package/site/components/code-example/codeExample.less +41 -41
  82. package/site/components/code-example/index.ts +10 -10
  83. package/site/components/context/index.ts +21 -21
  84. package/site/components/context/lock.ts +92 -92
  85. package/site/components/context/zIndex.ts +20 -20
  86. package/site/components/icon/Icon.vue +75 -75
  87. package/site/components/icon/icon.less +26 -26
  88. package/site/components/icon/index.ts +10 -10
  89. package/site/components/icon/props.ts +24 -24
  90. package/site/components/loading/Loading.vue +84 -84
  91. package/site/components/loading/index.ts +10 -10
  92. package/site/components/loading/loading.less +505 -505
  93. package/site/components/loading/props.ts +42 -42
  94. package/site/components/popup/Popup.tsx +102 -102
  95. package/site/components/popup/index.ts +10 -10
  96. package/site/components/popup/popup.less +125 -125
  97. package/site/components/popup/props.ts +63 -63
  98. package/site/components/progress/Progress.vue +112 -112
  99. package/site/components/progress/index.ts +10 -10
  100. package/site/components/progress/progress.less +101 -101
  101. package/site/components/progress/props.ts +55 -55
  102. package/site/components/ripple/index.ts +188 -188
  103. package/site/components/ripple/ripple.less +20 -20
  104. package/site/components/snackbar/Snackbar.vue +41 -41
  105. package/site/components/snackbar/core.vue +132 -132
  106. package/site/components/snackbar/index.tsx +270 -270
  107. package/site/components/snackbar/props.ts +97 -97
  108. package/site/components/snackbar/snackbar.less +135 -135
  109. package/site/components/styles/common.less +64 -64
  110. package/site/components/styles/elevation.less +126 -126
  111. package/site/components/styles/var.less +27 -27
  112. package/site/components/utils/components.ts +117 -117
  113. package/site/components/utils/elements.ts +102 -102
  114. package/site/index.html +49 -49
  115. package/site/mobile/App.vue +291 -291
  116. package/site/mobile/components/AppHome.vue +134 -134
  117. package/site/mobile/components/AppType.vue +22 -22
  118. package/site/mobile/components/app-bar/AppBar.vue +65 -65
  119. package/site/mobile/components/app-bar/appBar.less +57 -57
  120. package/site/mobile/components/app-bar/index.ts +10 -10
  121. package/site/mobile/components/app-bar/props.ts +25 -25
  122. package/site/mobile/main.ts +78 -78
  123. package/site/mobile.html +41 -41
  124. package/site/module.d.ts +5 -5
  125. package/site/pc/App.vue +43 -43
  126. package/site/pc/Layout.vue +423 -423
  127. package/site/pc/components/AnimationBox.vue +33 -33
  128. package/site/pc/components/AppHeader.vue +368 -368
  129. package/site/pc/components/AppMobile.vue +60 -60
  130. package/site/pc/components/AppSidebar.vue +143 -143
  131. package/site/pc/components/LogoAnimation.vue +117 -117
  132. package/site/pc/floating.ts +9 -9
  133. package/site/pc/main.ts +100 -100
  134. package/site/pc/pages/index/index.less +176 -176
  135. package/site/pc/pages/index/index.vue +130 -130
  136. package/site/pc/pages/index/locale/en-US.ts +1 -1
  137. package/site/pc/pages/index/locale/zh-CN.ts +1 -1
  138. package/site/tsconfig.json +11 -11
  139. package/site/useProgress.ts +72 -72
  140. package/site/utils.ts +165 -167
  141. package/template/create/__tests__/index.spec.ejs +8 -8
  142. package/template/create/example/index.ejs +15 -15
  143. package/template/create/example/locale/en-US.ts +3 -3
  144. package/template/create/example/locale/index.ts +23 -23
  145. package/template/create/example/locale/zh-CN.ts +3 -3
  146. package/template/create/index.ejs +12 -12
  147. package/template/create/less.ejs +3 -3
  148. package/template/create/props.ts +1 -1
  149. package/template/create/tsx.ejs +13 -13
  150. package/template/create/vue.ejs +17 -17
  151. package/template/generators/base/.prettierignore +9 -9
  152. package/template/generators/base/.prettierrc +5 -5
  153. package/template/generators/base/README.md +82 -82
  154. package/template/generators/base/babel.config.js +10 -10
  155. package/template/generators/base/public/highlight.css +1 -1
  156. package/template/generators/base/public/logo.svg +1 -1
  157. package/template/generators/base/shims/shims-md.d.ts +4 -4
  158. package/template/generators/base/shims/shims-vue.d.ts +6 -6
  159. package/template/generators/base/tsconfig.json +13 -13
  160. package/template/generators/config/default/base/docs/home.zh-CN.md +10 -10
  161. package/template/generators/config/default/base/package.json +105 -105
  162. package/template/generators/config/default/base/types/basicComponent.d.ts +7 -7
  163. package/template/generators/config/default/base/types/button.d.ts +12 -12
  164. package/template/generators/config/default/base/types/index.d.ts +6 -6
  165. package/template/generators/config/default/base/varlet.config.js +110 -110
  166. package/template/generators/config/default/sfc/src/button/Button.vue +30 -30
  167. package/template/generators/config/default/sfc/src/button/__tests__/index.spec.js +7 -7
  168. package/template/generators/config/default/sfc/src/button/button.less +14 -14
  169. package/template/generators/config/default/sfc/src/button/docs/zh-CN.md +47 -47
  170. package/template/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  171. package/template/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  172. package/template/generators/config/default/sfc/src/button/example/index.vue +13 -13
  173. package/template/generators/config/default/sfc/src/button/index.ts +10 -10
  174. package/template/generators/config/default/tsx/src/button/Button.tsx +29 -29
  175. package/template/generators/config/default/tsx/src/button/__tests__/index.spec.js +7 -7
  176. package/template/generators/config/default/tsx/src/button/button.less +14 -14
  177. package/template/generators/config/default/tsx/src/button/docs/zh-CN.md +47 -47
  178. package/template/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  179. package/template/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  180. package/template/generators/config/default/tsx/src/button/example/index.vue +13 -13
  181. package/template/generators/config/default/tsx/src/button/index.ts +10 -10
  182. package/template/generators/config/i18n/base/docs/home.en-US.md +11 -11
  183. package/template/generators/config/i18n/base/docs/home.zh-CN.md +10 -10
  184. package/template/generators/config/i18n/base/package.json +105 -105
  185. package/template/generators/config/i18n/base/types/basicComponent.d.ts +7 -7
  186. package/template/generators/config/i18n/base/types/button.d.ts +12 -12
  187. package/template/generators/config/i18n/base/types/index.d.ts +7 -7
  188. package/template/generators/config/i18n/base/types/locale.d.ts +24 -24
  189. package/template/generators/config/i18n/base/varlet.config.js +122 -122
  190. package/template/generators/config/i18n/sfc/src/button/Button.vue +36 -36
  191. package/template/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  192. package/template/generators/config/i18n/sfc/src/button/button.less +14 -14
  193. package/template/generators/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  194. package/template/generators/config/i18n/sfc/src/button/docs/zh-CN.md +34 -34
  195. package/template/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -11
  196. package/template/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -11
  197. package/template/generators/config/i18n/sfc/src/button/example/index.vue +13 -13
  198. package/template/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -5
  199. package/template/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  200. package/template/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -5
  201. package/template/generators/config/i18n/sfc/src/button/index.ts +10 -10
  202. package/template/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +51 -51
  203. package/template/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -26
  204. package/template/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  205. package/template/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  206. package/template/generators/config/i18n/sfc/src/locale/en-US.ts +7 -7
  207. package/template/generators/config/i18n/sfc/src/locale/index.ts +67 -67
  208. package/template/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -5
  209. package/template/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -7
  210. package/template/generators/config/i18n/tsx/src/button/Button.tsx +33 -33
  211. package/template/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  212. package/template/generators/config/i18n/tsx/src/button/button.less +14 -14
  213. package/template/generators/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  214. package/template/generators/config/i18n/tsx/src/button/docs/zh-CN.md +34 -34
  215. package/template/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -11
  216. package/template/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -11
  217. package/template/generators/config/i18n/tsx/src/button/example/index.vue +13 -13
  218. package/template/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -5
  219. package/template/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -23
  220. package/template/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -5
  221. package/template/generators/config/i18n/tsx/src/button/index.ts +10 -10
  222. package/template/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +51 -51
  223. package/template/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -26
  224. package/template/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  225. package/template/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  226. package/template/generators/config/i18n/tsx/src/locale/en-US.ts +7 -7
  227. package/template/generators/config/i18n/tsx/src/locale/index.ts +67 -67
  228. package/template/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -5
  229. package/template/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -7
  230. package/tsconfig.json +14 -15
  231. package/varlet.default.config.js +3 -3
@@ -1,270 +1,270 @@
1
- import VarSnackbarCore from './core.vue'
2
- import VarSnackbar from './Snackbar.vue'
3
- import context from '../context'
4
- import { reactive, TransitionGroup } from 'vue'
5
- import { mountInstance } from '../utils/components'
6
- import { isNumber, isPlainObject, isString, toNumber } from '@varlet/shared'
7
- import type { LoadingType, LoadingSize } from '../loading/props'
8
- import type { App, Component, TeleportProps } from 'vue'
9
-
10
- export type SnackbarType = 'success' | 'warning' | 'info' | 'error' | 'loading'
11
-
12
- export const SNACKBAR_TYPE: Array<SnackbarType> = ['loading', 'success', 'warning', 'info', 'error']
13
-
14
- interface SnackbarHandel {
15
- clear: () => void
16
- }
17
-
18
- interface SnackbarOptions {
19
- type?: SnackbarType
20
- content?: string
21
- position?: 'top' | 'center' | 'bottom'
22
- loadingType?: LoadingType
23
- loadingSize?: LoadingSize
24
- lockScroll?: boolean
25
- contentClass?: string
26
- duration?: number
27
- vertical?: boolean
28
- show?: boolean
29
- forbidClick?: boolean
30
- onOpen?: () => void
31
- onClose?: () => void
32
- onOpened?: () => void
33
- onClosed?: () => void
34
- // internal
35
- teleport?: TeleportProps['to']
36
- }
37
-
38
- interface UniqSnackbarOptions {
39
- id: number
40
- reactiveSnackOptions: SnackbarOptions
41
- _update?: string
42
- animationEnd?: boolean
43
- }
44
-
45
- interface Snackbar {
46
- (options: SnackbarOptions | string): SnackbarHandel
47
-
48
- install(app: App): void
49
-
50
- allowMultiple(bool: boolean): void
51
-
52
- success(options: SnackbarOptions | string): SnackbarHandel
53
-
54
- warning(options: SnackbarOptions | string): SnackbarHandel
55
-
56
- info(options: SnackbarOptions | string): SnackbarHandel
57
-
58
- error(options: SnackbarOptions | string): SnackbarHandel
59
-
60
- loading(options: SnackbarOptions | string): SnackbarHandel
61
-
62
- clear(): void
63
-
64
- Component: Component
65
- }
66
-
67
- let sid = 0
68
- let isMount = false
69
- let unmount: () => void
70
- let isAllowMultiple = false
71
- let uniqSnackbarOptions: Array<UniqSnackbarOptions> = reactive<UniqSnackbarOptions[]>([])
72
-
73
- const defaultOption: Partial<Record<keyof SnackbarOptions, any>> = {
74
- type: undefined,
75
- content: '',
76
- position: 'top',
77
- duration: 3000,
78
- vertical: false,
79
- contentClass: undefined,
80
- loadingType: 'circle',
81
- loadingSize: 'normal',
82
- lockScroll: false,
83
- teleport: 'body',
84
- forbidClick: false,
85
- onOpen: () => {},
86
- onOpened: () => {},
87
- onClose: () => {},
88
- onClosed: () => {},
89
- }
90
-
91
- const transitionGroupProps: any = {
92
- name: 'var-site-snackbar-fade',
93
- tag: 'div',
94
- class: 'var-site-transition-group',
95
- }
96
-
97
- const TransitionGroupHost = {
98
- setup() {
99
- return () => {
100
- const snackbarList = uniqSnackbarOptions.map(({ id, reactiveSnackOptions, _update }: UniqSnackbarOptions) => {
101
- const transitionGroupEl = document.querySelector('.var-site-transition-group')
102
- if (reactiveSnackOptions.forbidClick || reactiveSnackOptions.type === 'loading') {
103
- ;(transitionGroupEl as HTMLElement).classList.add('var-site-pointer-auto')
104
- } else {
105
- ;(transitionGroupEl as HTMLElement).classList.remove('var-site-pointer-auto')
106
- }
107
-
108
- if (isAllowMultiple) reactiveSnackOptions.position = 'top'
109
-
110
- const position = isAllowMultiple ? 'relative' : 'absolute' // avoid stylelint value-keyword-case error
111
-
112
- const style = {
113
- position,
114
- ...getTop(reactiveSnackOptions.position),
115
- }
116
-
117
- return (
118
- <VarSnackbarCore
119
- {...reactiveSnackOptions}
120
- key={id}
121
- style={style}
122
- data-id={id}
123
- _update={_update}
124
- v-model={[reactiveSnackOptions.show, 'show']}
125
- />
126
- )
127
- })
128
-
129
- const zindex = context.zIndex // avoid stylelint value-keyword-case error
130
-
131
- return (
132
- <TransitionGroup
133
- {...transitionGroupProps}
134
- style={{ zIndex: zindex }}
135
- onAfterEnter={opened}
136
- onAfterLeave={removeUniqOption}
137
- >
138
- {snackbarList}
139
- </TransitionGroup>
140
- )
141
- }
142
- },
143
- }
144
-
145
- const Snackbar: Snackbar = function (options: SnackbarOptions | string | number): SnackbarHandel {
146
- const snackOptions: SnackbarOptions = isString(options) || isNumber(options) ? { content: String(options) } : options
147
- const reactiveSnackOptions: SnackbarOptions = reactive<SnackbarOptions>({
148
- ...defaultOption,
149
- ...snackOptions,
150
- })
151
- reactiveSnackOptions.show = true
152
-
153
- if (!isMount) {
154
- isMount = true
155
- unmount = mountInstance(TransitionGroupHost).unmountInstance
156
- }
157
-
158
- const { length } = uniqSnackbarOptions
159
- const uniqSnackbarOptionItem: UniqSnackbarOptions = {
160
- id: sid++,
161
- reactiveSnackOptions,
162
- }
163
-
164
- if (length === 0 || isAllowMultiple) {
165
- addUniqOption(uniqSnackbarOptionItem)
166
- } else {
167
- const _update = `update-${sid}`
168
- updateUniqOption(reactiveSnackOptions, _update)
169
- }
170
-
171
- return {
172
- clear() {
173
- if (!isAllowMultiple && uniqSnackbarOptions.length) {
174
- uniqSnackbarOptions[0].reactiveSnackOptions.show = false
175
- } else {
176
- reactiveSnackOptions.show = false
177
- }
178
- },
179
- }
180
- } as Snackbar
181
-
182
- SNACKBAR_TYPE.forEach((type) => {
183
- Snackbar[type] = (options: SnackbarOptions | string): SnackbarHandel => {
184
- if (isPlainObject(options)) {
185
- options.type = type
186
- } else {
187
- options = {
188
- content: options,
189
- type,
190
- }
191
- }
192
- return Snackbar(options)
193
- }
194
- })
195
-
196
- Snackbar.install = function (app: App) {
197
- app.component(VarSnackbar.name, VarSnackbar)
198
- }
199
-
200
- Snackbar.allowMultiple = function (bool = false) {
201
- if (bool !== isAllowMultiple) {
202
- uniqSnackbarOptions.forEach((option: UniqSnackbarOptions) => {
203
- option.reactiveSnackOptions.show = false
204
- })
205
-
206
- isAllowMultiple = bool
207
- }
208
- }
209
-
210
- Snackbar.clear = function () {
211
- uniqSnackbarOptions.forEach((option: UniqSnackbarOptions) => {
212
- option.reactiveSnackOptions.show = false
213
- })
214
- }
215
-
216
- Snackbar.Component = VarSnackbar
217
-
218
- function opened(element: HTMLElement): void {
219
- const id = element.getAttribute('data-id')
220
- const option = uniqSnackbarOptions.find((option) => option.id === toNumber(id))
221
- if (option) option.reactiveSnackOptions.onOpened?.()
222
- }
223
-
224
- function removeUniqOption(element: HTMLElement): void {
225
- element.parentElement && element.parentElement.classList.remove('var-site-pointer-auto')
226
- const id = element.getAttribute('data-id')
227
-
228
- const option = uniqSnackbarOptions.find((option) => option.id === toNumber(id))
229
- if (option) {
230
- option.animationEnd = true
231
- option.reactiveSnackOptions.onClosed?.()
232
- }
233
-
234
- const isAllAnimationEnd = uniqSnackbarOptions.every((option) => option.animationEnd)
235
-
236
- if (isAllAnimationEnd) {
237
- unmount?.()
238
- uniqSnackbarOptions = reactive<UniqSnackbarOptions[]>([])
239
- isMount = false
240
- }
241
- }
242
-
243
- function addUniqOption(uniqSnackbarOptionItem: UniqSnackbarOptions) {
244
- uniqSnackbarOptions.push(uniqSnackbarOptionItem)
245
- }
246
-
247
- function updateUniqOption(reactiveSnackOptions: SnackbarOptions, _update: string) {
248
- const [firstOption] = uniqSnackbarOptions
249
-
250
- firstOption.reactiveSnackOptions = {
251
- ...firstOption.reactiveSnackOptions,
252
- ...reactiveSnackOptions,
253
- }
254
-
255
- firstOption._update = _update
256
- }
257
-
258
- function getTop(position = 'top') {
259
- if (position === 'bottom') return { [position]: '5%' }
260
-
261
- return { top: position === 'top' ? '5%' : '45%' }
262
- }
263
-
264
- VarSnackbar.install = function (app: App) {
265
- app.component(VarSnackbar.name, VarSnackbar)
266
- }
267
-
268
- export const _SnackbarComponent = VarSnackbar
269
-
270
- export default Snackbar
1
+ import VarSnackbarCore from './core.vue'
2
+ import VarSnackbar from './Snackbar.vue'
3
+ import context from '../context'
4
+ import { reactive, TransitionGroup } from 'vue'
5
+ import { mountInstance } from '../utils/components'
6
+ import { isNumber, isPlainObject, isString, toNumber } from '@varlet/shared'
7
+ import type { LoadingType, LoadingSize } from '../loading/props'
8
+ import type { App, Component, TeleportProps } from 'vue'
9
+
10
+ export type SnackbarType = 'success' | 'warning' | 'info' | 'error' | 'loading'
11
+
12
+ export const SNACKBAR_TYPE: Array<SnackbarType> = ['loading', 'success', 'warning', 'info', 'error']
13
+
14
+ interface SnackbarHandel {
15
+ clear: () => void
16
+ }
17
+
18
+ interface SnackbarOptions {
19
+ type?: SnackbarType
20
+ content?: string
21
+ position?: 'top' | 'center' | 'bottom'
22
+ loadingType?: LoadingType
23
+ loadingSize?: LoadingSize
24
+ lockScroll?: boolean
25
+ contentClass?: string
26
+ duration?: number
27
+ vertical?: boolean
28
+ show?: boolean
29
+ forbidClick?: boolean
30
+ onOpen?: () => void
31
+ onClose?: () => void
32
+ onOpened?: () => void
33
+ onClosed?: () => void
34
+ // internal
35
+ teleport?: TeleportProps['to']
36
+ }
37
+
38
+ interface UniqSnackbarOptions {
39
+ id: number
40
+ reactiveSnackOptions: SnackbarOptions
41
+ _update?: string
42
+ animationEnd?: boolean
43
+ }
44
+
45
+ interface Snackbar {
46
+ (options: SnackbarOptions | string): SnackbarHandel
47
+
48
+ install(app: App): void
49
+
50
+ allowMultiple(bool: boolean): void
51
+
52
+ success(options: SnackbarOptions | string): SnackbarHandel
53
+
54
+ warning(options: SnackbarOptions | string): SnackbarHandel
55
+
56
+ info(options: SnackbarOptions | string): SnackbarHandel
57
+
58
+ error(options: SnackbarOptions | string): SnackbarHandel
59
+
60
+ loading(options: SnackbarOptions | string): SnackbarHandel
61
+
62
+ clear(): void
63
+
64
+ Component: Component
65
+ }
66
+
67
+ let sid = 0
68
+ let isMount = false
69
+ let unmount: () => void
70
+ let isAllowMultiple = false
71
+ let uniqSnackbarOptions: Array<UniqSnackbarOptions> = reactive<UniqSnackbarOptions[]>([])
72
+
73
+ const defaultOption: Partial<Record<keyof SnackbarOptions, any>> = {
74
+ type: undefined,
75
+ content: '',
76
+ position: 'top',
77
+ duration: 3000,
78
+ vertical: false,
79
+ contentClass: undefined,
80
+ loadingType: 'circle',
81
+ loadingSize: 'normal',
82
+ lockScroll: false,
83
+ teleport: 'body',
84
+ forbidClick: false,
85
+ onOpen: () => {},
86
+ onOpened: () => {},
87
+ onClose: () => {},
88
+ onClosed: () => {},
89
+ }
90
+
91
+ const transitionGroupProps: any = {
92
+ name: 'var-site-snackbar-fade',
93
+ tag: 'div',
94
+ class: 'var-site-transition-group',
95
+ }
96
+
97
+ const TransitionGroupHost = {
98
+ setup() {
99
+ return () => {
100
+ const snackbarList = uniqSnackbarOptions.map(({ id, reactiveSnackOptions, _update }: UniqSnackbarOptions) => {
101
+ const transitionGroupEl = document.querySelector('.var-site-transition-group')
102
+ if (reactiveSnackOptions.forbidClick || reactiveSnackOptions.type === 'loading') {
103
+ ;(transitionGroupEl as HTMLElement).classList.add('var-site-pointer-auto')
104
+ } else {
105
+ ;(transitionGroupEl as HTMLElement).classList.remove('var-site-pointer-auto')
106
+ }
107
+
108
+ if (isAllowMultiple) reactiveSnackOptions.position = 'top'
109
+
110
+ const position = isAllowMultiple ? 'relative' : 'absolute' // avoid stylelint value-keyword-case error
111
+
112
+ const style = {
113
+ position,
114
+ ...getTop(reactiveSnackOptions.position),
115
+ }
116
+
117
+ return (
118
+ <VarSnackbarCore
119
+ {...reactiveSnackOptions}
120
+ key={id}
121
+ style={style}
122
+ data-id={id}
123
+ _update={_update}
124
+ v-model={[reactiveSnackOptions.show, 'show']}
125
+ />
126
+ )
127
+ })
128
+
129
+ const zindex = context.zIndex // avoid stylelint value-keyword-case error
130
+
131
+ return (
132
+ <TransitionGroup
133
+ {...transitionGroupProps}
134
+ style={{ zIndex: zindex }}
135
+ onAfterEnter={opened}
136
+ onAfterLeave={removeUniqOption}
137
+ >
138
+ {snackbarList}
139
+ </TransitionGroup>
140
+ )
141
+ }
142
+ },
143
+ }
144
+
145
+ const Snackbar: Snackbar = function (options: SnackbarOptions | string | number): SnackbarHandel {
146
+ const snackOptions: SnackbarOptions = isString(options) || isNumber(options) ? { content: String(options) } : options
147
+ const reactiveSnackOptions: SnackbarOptions = reactive<SnackbarOptions>({
148
+ ...defaultOption,
149
+ ...snackOptions,
150
+ })
151
+ reactiveSnackOptions.show = true
152
+
153
+ if (!isMount) {
154
+ isMount = true
155
+ unmount = mountInstance(TransitionGroupHost).unmountInstance
156
+ }
157
+
158
+ const { length } = uniqSnackbarOptions
159
+ const uniqSnackbarOptionItem: UniqSnackbarOptions = {
160
+ id: sid++,
161
+ reactiveSnackOptions,
162
+ }
163
+
164
+ if (length === 0 || isAllowMultiple) {
165
+ addUniqOption(uniqSnackbarOptionItem)
166
+ } else {
167
+ const _update = `update-${sid}`
168
+ updateUniqOption(reactiveSnackOptions, _update)
169
+ }
170
+
171
+ return {
172
+ clear() {
173
+ if (!isAllowMultiple && uniqSnackbarOptions.length) {
174
+ uniqSnackbarOptions[0].reactiveSnackOptions.show = false
175
+ } else {
176
+ reactiveSnackOptions.show = false
177
+ }
178
+ },
179
+ }
180
+ } as Snackbar
181
+
182
+ SNACKBAR_TYPE.forEach((type) => {
183
+ Snackbar[type] = (options: SnackbarOptions | string): SnackbarHandel => {
184
+ if (isPlainObject(options)) {
185
+ options.type = type
186
+ } else {
187
+ options = {
188
+ content: options,
189
+ type,
190
+ }
191
+ }
192
+ return Snackbar(options)
193
+ }
194
+ })
195
+
196
+ Snackbar.install = function (app: App) {
197
+ app.component(VarSnackbar.name, VarSnackbar)
198
+ }
199
+
200
+ Snackbar.allowMultiple = function (bool = false) {
201
+ if (bool !== isAllowMultiple) {
202
+ uniqSnackbarOptions.forEach((option: UniqSnackbarOptions) => {
203
+ option.reactiveSnackOptions.show = false
204
+ })
205
+
206
+ isAllowMultiple = bool
207
+ }
208
+ }
209
+
210
+ Snackbar.clear = function () {
211
+ uniqSnackbarOptions.forEach((option: UniqSnackbarOptions) => {
212
+ option.reactiveSnackOptions.show = false
213
+ })
214
+ }
215
+
216
+ Snackbar.Component = VarSnackbar
217
+
218
+ function opened(element: HTMLElement): void {
219
+ const id = element.getAttribute('data-id')
220
+ const option = uniqSnackbarOptions.find((option) => option.id === toNumber(id))
221
+ if (option) option.reactiveSnackOptions.onOpened?.()
222
+ }
223
+
224
+ function removeUniqOption(element: HTMLElement): void {
225
+ element.parentElement && element.parentElement.classList.remove('var-site-pointer-auto')
226
+ const id = element.getAttribute('data-id')
227
+
228
+ const option = uniqSnackbarOptions.find((option) => option.id === toNumber(id))
229
+ if (option) {
230
+ option.animationEnd = true
231
+ option.reactiveSnackOptions.onClosed?.()
232
+ }
233
+
234
+ const isAllAnimationEnd = uniqSnackbarOptions.every((option) => option.animationEnd)
235
+
236
+ if (isAllAnimationEnd) {
237
+ unmount?.()
238
+ uniqSnackbarOptions = reactive<UniqSnackbarOptions[]>([])
239
+ isMount = false
240
+ }
241
+ }
242
+
243
+ function addUniqOption(uniqSnackbarOptionItem: UniqSnackbarOptions) {
244
+ uniqSnackbarOptions.push(uniqSnackbarOptionItem)
245
+ }
246
+
247
+ function updateUniqOption(reactiveSnackOptions: SnackbarOptions, _update: string) {
248
+ const [firstOption] = uniqSnackbarOptions
249
+
250
+ firstOption.reactiveSnackOptions = {
251
+ ...firstOption.reactiveSnackOptions,
252
+ ...reactiveSnackOptions,
253
+ }
254
+
255
+ firstOption._update = _update
256
+ }
257
+
258
+ function getTop(position = 'top') {
259
+ if (position === 'bottom') return { [position]: '5%' }
260
+
261
+ return { top: position === 'top' ? '5%' : '45%' }
262
+ }
263
+
264
+ VarSnackbar.install = function (app: App) {
265
+ app.component(VarSnackbar.name, VarSnackbar)
266
+ }
267
+
268
+ export const _SnackbarComponent = VarSnackbar
269
+
270
+ export default Snackbar