@varlet/cli 1.27.14 → 1.27.17-alpha.1656907860130

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 (211) hide show
  1. package/LICENCE +21 -21
  2. package/README.en-US.md +401 -401
  3. package/README.md +396 -396
  4. package/generators/base/.prettierignore +9 -9
  5. package/generators/base/.prettierrc +5 -5
  6. package/generators/base/README.md +82 -82
  7. package/generators/base/babel.config.js +10 -10
  8. package/generators/base/public/highlight.css +1 -1
  9. package/generators/base/public/logo.svg +1 -1
  10. package/generators/base/shims/shims-md.d.ts +4 -4
  11. package/generators/base/shims/shims-vue.d.ts +6 -6
  12. package/generators/base/tsconfig.json +13 -13
  13. package/generators/config/default/base/docs/home.zh-CN.md +10 -10
  14. package/generators/config/default/base/package.json +1 -0
  15. package/generators/config/default/base/types/basicComponent.d.ts +7 -7
  16. package/generators/config/default/base/types/button.d.ts +12 -12
  17. package/generators/config/default/base/types/index.d.ts +6 -6
  18. package/generators/config/default/base/varlet.config.js +110 -110
  19. package/generators/config/default/sfc/src/button/Button.vue +30 -30
  20. package/generators/config/default/sfc/src/button/__tests__/index.spec.js +7 -7
  21. package/generators/config/default/sfc/src/button/button.less +14 -14
  22. package/generators/config/default/sfc/src/button/docs/zh-CN.md +47 -47
  23. package/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  24. package/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  25. package/generators/config/default/sfc/src/button/example/index.vue +13 -13
  26. package/generators/config/default/sfc/src/button/index.ts +10 -10
  27. package/generators/config/default/tsx/src/button/Button.tsx +31 -31
  28. package/generators/config/default/tsx/src/button/__tests__/index.spec.js +7 -7
  29. package/generators/config/default/tsx/src/button/button.less +14 -14
  30. package/generators/config/default/tsx/src/button/docs/zh-CN.md +47 -47
  31. package/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  32. package/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  33. package/generators/config/default/tsx/src/button/example/index.vue +13 -13
  34. package/generators/config/default/tsx/src/button/index.ts +10 -10
  35. package/generators/config/i18n/base/docs/home.en-US.md +11 -11
  36. package/generators/config/i18n/base/docs/home.zh-CN.md +10 -10
  37. package/generators/config/i18n/base/package.json +1 -0
  38. package/generators/config/i18n/base/types/basicComponent.d.ts +7 -7
  39. package/generators/config/i18n/base/types/button.d.ts +12 -12
  40. package/generators/config/i18n/base/types/index.d.ts +7 -7
  41. package/generators/config/i18n/base/types/locale.d.ts +24 -24
  42. package/generators/config/i18n/base/varlet.config.js +122 -122
  43. package/generators/config/i18n/sfc/src/button/Button.vue +36 -36
  44. package/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  45. package/generators/config/i18n/sfc/src/button/button.less +14 -14
  46. package/generators/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  47. package/generators/config/i18n/sfc/src/button/docs/zh-CN.md +34 -34
  48. package/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -11
  49. package/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -11
  50. package/generators/config/i18n/sfc/src/button/example/index.vue +13 -13
  51. package/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -5
  52. package/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  53. package/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -5
  54. package/generators/config/i18n/sfc/src/button/index.ts +10 -10
  55. package/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +51 -51
  56. package/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -26
  57. package/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  58. package/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  59. package/generators/config/i18n/sfc/src/locale/en-US.ts +7 -7
  60. package/generators/config/i18n/sfc/src/locale/index.ts +67 -67
  61. package/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -5
  62. package/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -7
  63. package/generators/config/i18n/tsx/src/button/Button.tsx +35 -35
  64. package/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  65. package/generators/config/i18n/tsx/src/button/button.less +14 -14
  66. package/generators/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  67. package/generators/config/i18n/tsx/src/button/docs/zh-CN.md +34 -34
  68. package/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -11
  69. package/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -11
  70. package/generators/config/i18n/tsx/src/button/example/index.vue +13 -13
  71. package/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -5
  72. package/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -23
  73. package/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -5
  74. package/generators/config/i18n/tsx/src/button/index.ts +10 -10
  75. package/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +51 -51
  76. package/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -26
  77. package/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  78. package/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  79. package/generators/config/i18n/tsx/src/locale/en-US.ts +7 -7
  80. package/generators/config/i18n/tsx/src/locale/index.ts +67 -67
  81. package/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -5
  82. package/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -7
  83. package/lib/commands/build.d.ts +1 -1
  84. package/lib/commands/build.js +67 -67
  85. package/lib/commands/changelog.d.ts +6 -6
  86. package/lib/commands/changelog.js +27 -27
  87. package/lib/commands/commitLint.d.ts +1 -1
  88. package/lib/commands/commitLint.js +21 -21
  89. package/lib/commands/compile.d.ts +5 -5
  90. package/lib/commands/compile.js +119 -119
  91. package/lib/commands/create.d.ts +3 -3
  92. package/lib/commands/create.js +132 -132
  93. package/lib/commands/dev.d.ts +3 -3
  94. package/lib/commands/dev.js +123 -123
  95. package/lib/commands/gen.d.ts +1 -1
  96. package/lib/commands/gen.js +112 -112
  97. package/lib/commands/jest.d.ts +8 -8
  98. package/lib/commands/jest.js +81 -81
  99. package/lib/commands/lint.d.ts +1 -1
  100. package/lib/commands/lint.js +123 -123
  101. package/lib/commands/preview.d.ts +1 -1
  102. package/lib/commands/preview.js +74 -74
  103. package/lib/commands/release.d.ts +3 -3
  104. package/lib/commands/release.js +267 -269
  105. package/lib/compiler/compileModule.d.ts +5 -5
  106. package/lib/compiler/compileModule.js +186 -186
  107. package/lib/compiler/compileSFC.d.ts +2 -2
  108. package/lib/compiler/compileSFC.js +132 -132
  109. package/lib/compiler/compileScript.d.ts +17 -17
  110. package/lib/compiler/compileScript.js +202 -201
  111. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  112. package/lib/compiler/compileSiteEntry.js +237 -237
  113. package/lib/compiler/compileStyle.d.ts +11 -11
  114. package/lib/compiler/compileStyle.js +101 -101
  115. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  116. package/lib/compiler/compileTemplateHighlight.js +193 -193
  117. package/lib/compiler/compileTypes.d.ts +2 -2
  118. package/lib/compiler/compileTypes.js +88 -88
  119. package/lib/config/babel.config.d.ts +2 -2
  120. package/lib/config/babel.config.js +31 -31
  121. package/lib/config/babel.sfc.transform.d.ts +1 -1
  122. package/lib/config/babel.sfc.transform.js +18 -18
  123. package/lib/config/jest.config.d.ts +1 -1
  124. package/lib/config/jest.config.js +36 -36
  125. package/lib/config/jest.media.mock.js +2 -2
  126. package/lib/config/jest.style.mock.js +2 -2
  127. package/lib/config/varlet.config.d.ts +1 -1
  128. package/lib/config/varlet.config.js +24 -24
  129. package/lib/config/vite.config.d.ts +5 -5
  130. package/lib/config/vite.config.js +162 -162
  131. package/lib/index.d.ts +2 -2
  132. package/lib/index.js +83 -83
  133. package/lib/shared/constant.d.ts +43 -43
  134. package/lib/shared/constant.js +50 -50
  135. package/lib/shared/fsUtils.d.ts +12 -16
  136. package/lib/shared/fsUtils.js +108 -116
  137. package/lib/shared/logger.d.ts +7 -7
  138. package/lib/shared/logger.js +20 -20
  139. package/package.json +7 -8
  140. package/preset.js +3 -3
  141. package/site/components/button/Button.vue +84 -84
  142. package/site/components/button/button.less +183 -183
  143. package/site/components/button/index.ts +10 -10
  144. package/site/components/button/props.ts +70 -70
  145. package/site/components/cell/Cell.vue +42 -42
  146. package/site/components/cell/cell.less +74 -74
  147. package/site/components/cell/index.ts +10 -10
  148. package/site/components/cell/props.ts +27 -27
  149. package/site/components/code-example/CodeExample.vue +143 -143
  150. package/site/components/code-example/codeExample.less +41 -41
  151. package/site/components/code-example/index.ts +10 -10
  152. package/site/components/context/index.ts +17 -17
  153. package/site/components/context/lock.ts +103 -103
  154. package/site/components/context/zIndex.ts +20 -20
  155. package/site/components/icon/Icon.vue +68 -68
  156. package/site/components/icon/icon.less +26 -26
  157. package/site/components/icon/index.ts +10 -10
  158. package/site/components/icon/props.ts +24 -24
  159. package/site/components/loading/Loading.vue +55 -55
  160. package/site/components/loading/index.ts +10 -10
  161. package/site/components/loading/loading.less +420 -420
  162. package/site/components/loading/props.ts +37 -37
  163. package/site/components/progress/Progress.vue +108 -108
  164. package/site/components/progress/index.ts +10 -10
  165. package/site/components/progress/progress.less +98 -98
  166. package/site/components/progress/props.ts +55 -55
  167. package/site/components/ripple/index.ts +167 -167
  168. package/site/components/ripple/ripple.less +17 -17
  169. package/site/components/snackbar/Snackbar.vue +38 -38
  170. package/site/components/snackbar/core.vue +117 -117
  171. package/site/components/snackbar/index.tsx +270 -270
  172. package/site/components/snackbar/props.ts +94 -94
  173. package/site/components/snackbar/snackbar.less +135 -135
  174. package/site/components/styles/common.less +64 -64
  175. package/site/components/styles/elevation.less +126 -126
  176. package/site/components/styles/var.less +27 -27
  177. package/site/components/utils/components.ts +69 -69
  178. package/site/components/utils/elements.ts +85 -85
  179. package/site/index.html +49 -49
  180. package/site/mobile/App.vue +291 -291
  181. package/site/mobile/components/AppHome.vue +134 -134
  182. package/site/mobile/components/AppType.vue +22 -22
  183. package/site/mobile/components/app-bar/AppBar.vue +69 -69
  184. package/site/mobile/components/app-bar/appBar.less +56 -56
  185. package/site/mobile/components/app-bar/index.ts +10 -10
  186. package/site/mobile/components/app-bar/props.ts +25 -25
  187. package/site/mobile/components/styles/common.less +64 -64
  188. package/site/mobile/components/styles/elevation.less +126 -126
  189. package/site/mobile/components/styles/var.less +27 -27
  190. package/site/mobile/main.ts +74 -74
  191. package/site/mobile.html +41 -41
  192. package/site/module.d.ts +5 -5
  193. package/site/pc/App.vue +43 -43
  194. package/site/pc/Layout.vue +397 -397
  195. package/site/pc/components/AnimationBox.vue +45 -45
  196. package/site/pc/components/AppHeader.vue +355 -355
  197. package/site/pc/components/AppMobile.vue +54 -54
  198. package/site/pc/components/AppSidebar.vue +134 -134
  199. package/site/pc/components/LogoAnimation.vue +119 -119
  200. package/site/pc/floating.ts +9 -9
  201. package/site/pc/main.ts +94 -94
  202. package/site/pc/pages/index/index.less +194 -194
  203. package/site/pc/pages/index/index.vue +128 -125
  204. package/site/pc/pages/index/locale/en-US.ts +3 -5
  205. package/site/pc/pages/index/locale/zh-CN.ts +3 -5
  206. package/site/tsconfig.json +11 -11
  207. package/site/useProgress.ts +75 -75
  208. package/site/utils.ts +153 -162
  209. package/tsconfig.json +14 -14
  210. package/varlet.default.config.js +151 -145
  211. package/site/components/utils/shared.ts +0 -29
@@ -1,270 +1,270 @@
1
- import VarSiteSnackbarCore from './core.vue'
2
- import VarSiteSnackbar from './Snackbar.vue'
3
- import context from '../context'
4
- import { reactive, TransitionGroup } from 'vue'
5
- import { mountInstance } from '../utils/components'
6
- import { isPlainObject, toNumber } from '../utils/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: function() {
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
- <VarSiteSnackbarCore
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): SnackbarHandel {
146
- const snackOptions: SnackbarOptions = isPlainObject(options) ? options : { content: 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(VarSiteSnackbar.name, VarSiteSnackbar)
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 = VarSiteSnackbar
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
- VarSiteSnackbar.install = function (app: App) {
265
- app.component(VarSiteSnackbar.name, VarSiteSnackbar)
266
- }
267
-
268
- export const _SnackbarComponent = VarSiteSnackbar
269
-
270
- export default Snackbar
1
+ import VarSiteSnackbarCore from './core.vue'
2
+ import VarSiteSnackbar from './Snackbar.vue'
3
+ import context from '../context'
4
+ import { reactive, TransitionGroup } from 'vue'
5
+ import { mountInstance } from '../utils/components'
6
+ import { isPlainObject, 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: function() {
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
+ <VarSiteSnackbarCore
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): SnackbarHandel {
146
+ const snackOptions: SnackbarOptions = isPlainObject(options) ? options : { content: 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(VarSiteSnackbar.name, VarSiteSnackbar)
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 = VarSiteSnackbar
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
+ VarSiteSnackbar.install = function (app: App) {
265
+ app.component(VarSiteSnackbar.name, VarSiteSnackbar)
266
+ }
267
+
268
+ export const _SnackbarComponent = VarSiteSnackbar
269
+
270
+ export default Snackbar