@varlet/cli 1.27.17-alpha.1656907860130 → 1.27.17

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